MediaWiki:Gadget-Twinkle.js

MediaWiki系统消息页面
/**
 * SPDX-License-Identifier: CC-BY-SA-4.0
 * _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
 *
 * @base {@link https://git.qiuwen.net.cn/Mirror/xiplus-twinkle}
 * @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/Twinkle}
 * @license CC-BY-SA-4.0 {@link https://www.qiuwenbaike.cn/wiki/H:CC-BY-SA-4.0}
 */
/**
 * +------------------------------------------------------------+
 * |            === WARNING: GLOBAL GADGET FILE ===             |
 * +------------------------------------------------------------+
 * |       All changes should be made in the repository,        |
 * |                otherwise they will be lost.                |
 * +------------------------------------------------------------+
 * |        Changes to this page may affect many users.         |
 * | Please discuss changes by opening an issue before editing. |
 * +------------------------------------------------------------+
 */
/* <nowiki> */

(() => {

"use strict";

// dist/Twinkle/Twinkle.js
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }
  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}
function _asyncToGenerator(fn) {
  return function() {
    var self = this, args = arguments;
    return new Promise(function(resolve, reject) {
      var gen = fn.apply(self, args);
      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }
      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }
      _next(void 0);
    });
  };
}
function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
  if (!it) {
    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it)
        o = it;
      var i = 0;
      var F = function() {
      };
      return { s: F, n: function() {
        if (i >= o.length)
          return { done: true };
        return { done: false, value: o[i++] };
      }, e: function(e) {
        throw e;
      }, f: F };
    }
    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }
  var normalCompletion = true, didErr = false, err;
  return { s: function() {
    it = it.call(o);
  }, n: function() {
    var step = it.next();
    normalCompletion = step.done;
    return step;
  }, e: function(e) {
    didErr = true;
    err = e;
  }, f: function() {
    try {
      if (!normalCompletion && it.return != null)
        it.return();
    } finally {
      if (didErr)
        throw err;
    }
  } };
}
function _unsupportedIterableToArray(o, minLen) {
  if (!o)
    return;
  if (typeof o === "string")
    return _arrayLikeToArray(o, minLen);
  var n = Object.prototype.toString.call(o).slice(8, -1);
  if (n === "Object" && o.constructor)
    n = o.constructor.name;
  if (n === "Map" || n === "Set")
    return Array.from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
    return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length)
    len = arr.length;
  for (var i = 0, arr2 = new Array(len); i < len; i++)
    arr2[i] = arr[i];
  return arr2;
}
var __getOwnPropNames = Object.getOwnPropertyNames;
var __esm = (fn, res) => function __init() {
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
//! src/Twinkle/modules/twinkle.js
var twinkle_exports = {};
var init_twinkle = __esm({
  "src/Twinkle/modules/twinkle.js"() {
    "use strict";
    /*! Twinkle.js - twinkle.js */
    (function twinkle($, _window) {
      const $body = $("body");
      const Twinkle2 = {};
      (_window = window).Twinkle || (_window.Twinkle = Twinkle2);
      if (!Morebits.userIsInGroup("autoconfirmed") && !Morebits.userIsInGroup("confirmed")) {
        console.warn("[Twinkle] 非确认用户或自动确认用户,Twinkle不会运行。");
        return;
      }
      Twinkle2.changeTags = "Twinkle";
      Twinkle2.summaryAd = "([[H:TW|Twinkle]])";
      Twinkle2.hatnoteRegex = "(?:Short[ _]description)|(?:Rellink|Hatnote|HAT)|(?:Main|[细細][节節]|Main[ _]articles|主[条條]目|Hurricane[ _]main|[条條]目|主|[頁页]面|主[頁页]面|主[頁页]|主[題题]目|Main[ _]article|AP)|(?:Wrongtitle|Correct[ _]title)|(?:主条目消歧义|主條目消歧義|消歧义链接|消歧義鏈接|消歧義連結|消连|消連|消歧义连结|DisambLink|Noteref|Dablink)|(?:Distinguish|不是|Not|提示|混淆|分別|分别|區別|区别|本条目的主题不是|本條目的主題不是|本条目主题不是|本條目主題不是|条目主题不是|條目主題不是|主题不是|主題不是|Confused|区分|區分|Confusion|Confuse|RedirectNOT|Misspelling)|(?:Distinguish2|SelfDistinguish|Not2|不是2)|(?:For)|(?:Details|Further|See|另见|另見|More|相關條目|相关条目|Detail|见|見|更多资料|更多資料|Further[ _]information|更多资讯|更多資訊|More[ _]information|更多信息)|(?:Selfref)|(?:About|Otheruses4|关于|關於)|(?:Other[ _]uses|Otheruse|条目消歧义|條目消歧義|他用|Otheruses)|(?:Other[ _]uses list|Otheruselist|主條目消歧義列表|主条目消歧义列表|Otheruseslist|Aboutlist|About[ _]list|Otheruses[ _]list)|(?:Redirect|重定向至此|Redirects[ _]here|Redirect[ _]to)|(?:Redirect2|主條目消歧義2|主条目消歧义2|Redir|重定向至此2)|(?:Redirect3)|(?:Redirect4)|(?:Redirect-distinguish)|(?:Redirect-synonym)|(?:Redirect-multi)|(?:See[ _]Wiktionary|Seewikt)|(?:Seealso|参看|參看|See[ _]also|参见|參見|Also)|(?:See[ _]also2|Seealso2|不轉換參見|不转换参见)|(?:Other[ _]places)|(?:Contrast|對比|对比)";
      Twinkle2.initCallbacks = [];
      Twinkle2.addInitCallback = (func, name) => {
        Twinkle2.initCallbacks[Twinkle2.initCallbacks.length] = {
          func,
          name
        };
      };
      Twinkle2.defaultConfig = {};
      Twinkle2.defaultConfig = {
        // General
        userTalkPageMode: "tab",
        dialogLargeFont: false,
        disabledModules: Morebits.userIsSysop ? [] : ["block"],
        // default to disable block for non-sysop, if enable manually, they can only use it to tag userpage
        disabledSysopModules: [],
        // ARV
        spiWatchReport: "yes",
        // Block
        defaultToBlock64: false,
        defaultToPartialBlocks: false,
        blankTalkpageOnIndefBlock: false,
        watchBlockNotices: "yes",
        customBlockReasonList: [],
        // Fluff (revert and rollback)
        openTalkPage: [],
        openTalkPageOnAutoRevert: false,
        rollbackInPlace: false,
        markRevertedPagesAsMinor: ["vand"],
        watchRevertedPages: ["norm", "vand", "torev"],
        watchRevertedExpiry: "yes",
        offerReasonOnNormalRevert: true,
        confirmOnFluff: false,
        showRollbackLinks: ["diff", "others"],
        customRevertSummary: [],
        // DI (twinkleimage)
        notifyUserOnDeli: true,
        deliWatchPage: "default",
        deliWatchUser: "default",
        // Protect
        watchRequestedPages: "yes",
        watchPPTaggedPages: "default",
        watchProtectedPages: "default",
        // CSD
        speedySelectionStyle: "buttonClick",
        watchSpeedyPages: ["g1", "g3", "g4", "g7", "g8"],
        watchSpeedyExpiry: "yes",
        markSpeedyPagesAsPatrolled: false,
        watchSpeedyUser: "1 month",
        // these next two should probably be identical by default
        notifyUserOnSpeedyDeletionNomination: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "r1", "r2", "f1", "f2", "f3", "f4", "f5", "o1", "o2", "o3"],
        warnUserOnSpeedyDelete: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "r1", "r2", "f1", "f2", "f3", "f4", "f5", "o1", "o2", "o3"],
        promptForSpeedyDeletionSummary: [],
        openUserTalkPageOnSpeedyDelete: [],
        deleteTalkPageOnDelete: true,
        deleteRedirectsOnDelete: true,
        deleteSysopDefaultToDelete: false,
        speedyWindowHeight: 500,
        speedyWindowWidth: 800,
        logSpeedyNominations: true,
        speedyLogPageName: "CSD日志",
        noLogOnSpeedyNomination: ["o1"],
        enlargeG7Input: false,
        // Unlink
        unlinkNamespaces: ["0", "6", "10", "118"],
        // Warn
        defaultWarningGroup: "1",
        combinedSingletMenus: false,
        watchWarnings: "yes",
        oldSelect: false,
        customWarningList: [],
        autoMenuAfterRollback: false,
        // XfD
        logXfdNominations: true,
        xfdLogPageName: "XfD日志",
        noLogOnXfdNomination: [],
        xfdWatchDiscussion: "default",
        xfdWatchPage: "default",
        xfdWatchUser: "default",
        markXfdPagesAsPatrolled: true,
        FwdCsdToXfd: Morebits.userIsSysop,
        afdDefaultCategory: "delete",
        afdFameDefaultReason: "没有足够的可靠来源证明此条目符合[[Qiuwen:收录标准|收录标准]]",
        afdSubstubDefaultReason: "过期小小作品",
        XfdClose: Morebits.userIsSysop ? "all" : "hide",
        // Copyvio
        copyvioWatchPage: "yes",
        copyvioWatchUser: "yes",
        markCopyvioPagesAsPatrolled: true,
        // Hidden preferences
        autolevelStaleDays: 3,
        revertMaxRevisions: 50,
        // intentionally limited
        batchMax: 5e3,
        batchChunks: 50,
        configPage: "Help:Twinkle/参数设置",
        projectNamespaceName: mw.config.get("wgFormattedNamespaces")[4],
        sandboxPage: "Qiuwen:沙盒",
        // Deprecated options, as a fallback for add-on scripts/modules
        summaryAd: "([[H:TW|Twinkle]])",
        deletionSummaryAd: "([[H:TW|Twinkle]])",
        protectionSummaryAd: "([[H:TW|Twinkle]])",
        blockSummaryAd: "([[H:TW|Twinkle]])",
        // Tag
        groupByDefault: true,
        watchTaggedPages: "yes",
        watchMergeDiscussions: "yes",
        markTaggedPagesAsMinor: false,
        markTaggedPagesAsPatrolled: true,
        tagArticleSortOrder: "cat",
        customTagList: [],
        customFileTagList: [],
        customRedirectTagList: [],
        // Stub
        watchStubbedPages: false,
        markStubbedPagesAsMinor: false,
        markStubbedPagesAsPatrolled: true,
        stubArticleSortOrder: "cat",
        customStubList: [],
        // Talkback
        markTalkbackAsMinor: true,
        insertTalkbackSignature: true,
        // always sign talkback templates
        talkbackHeading: window.wgULS("回复通告", "回覆通告"),
        mailHeading: window.wgULS("您有新邮件!", "您有新郵件!")
      };
      switch (mw.config.get("skin")) {
        case "vector":
        case "vector-2022":
          Twinkle2.defaultConfig.portletArea = "right-navigation";
          Twinkle2.defaultConfig.portletId = "p-twinkle";
          Twinkle2.defaultConfig.portletName = "TW";
          Twinkle2.defaultConfig.portletType = "menu";
          Twinkle2.defaultConfig.portletNext = "p-search";
          break;
        case "gongbi":
          Twinkle2.defaultConfig.portletArea = $body.find("#page-tools .sidebar-inner").length > 0 ? "#page-tools .sidebar-inner" : "#page-more .sidebar-inner";
          Twinkle2.defaultConfig.portletId = "p-twinkle";
          Twinkle2.defaultConfig.portletName = "Twinkle";
          Twinkle2.defaultConfig.portletType = null;
          Twinkle2.defaultConfig.portletNext = $body.find("#page-tools .sidebar-inner").length > 0 ? "page-more" : null;
          break;
        case "citizen":
          Twinkle2.defaultConfig.portletArea = "#page-actions-more__card";
          Twinkle2.defaultConfig.portletId = "p-twinkle";
          Twinkle2.defaultConfig.portletName = "Twinkle";
          Twinkle2.defaultConfig.portletType = "nav";
          Twinkle2.defaultConfig.portletNext = "p-tb";
          break;
        default:
          Twinkle2.defaultConfig.portletArea = null;
          Twinkle2.defaultConfig.portletId = "p-cactions";
          Twinkle2.defaultConfig.portletName = null;
          Twinkle2.defaultConfig.portletType = null;
          Twinkle2.defaultConfig.portletNext = null;
      }
      Twinkle2.getPref = (name) => {
        if (typeof Twinkle2.prefs === "object" && Twinkle2.prefs[name] !== void 0) {
          return Twinkle2.prefs[name];
        }
        if (typeof window.TwinkleConfig === "object" && window.TwinkleConfig[name] !== void 0) {
          return window.TwinkleConfig[name];
        }
        return Twinkle2.defaultConfig[name];
      };
      Twinkle2.addPortlet = (navigation, id, text, type, nextnodeid) => {
        const root = document.querySelector(/^(?:#|\.)/.test(navigation) ? navigation : "#".concat(navigation));
        if (!root) {
          return null;
        }
        const item = document.querySelector("#".concat(id));
        if (item) {
          if (item.parentNode && item.parentNode === root) {
            return item;
          }
          return null;
        }
        let nextnode;
        if (nextnodeid) {
          nextnode = document.querySelector("#".concat(nextnodeid));
        }
        const skin = mw.config.get("skin");
        if (skin !== "vector" && skin !== "vector-2022" || navigation !== "left-navigation" && navigation !== "right-navigation") {
          type = null;
        }
        let outerNavClass;
        let innerDivClass;
        switch (skin) {
          case "vector":
          case "vector-2022":
            if (navigation !== "portal" && navigation !== "left-navigation" && navigation !== "right-navigation") {
              navigation = "mw-panel";
            }
            outerNavClass = "mw-portlet vector-menu";
            if (navigation === "mw-panel") {
              outerNavClass += " vector-menu-portal";
            } else if (type === "menu") {
              outerNavClass += " vector-menu-dropdown vector-dropdown vector-menu-dropdown-noicon";
            } else {
              outerNavClass += " vector-menu-tabs";
            }
            innerDivClass = "vector-menu-content vector-dropdown-content";
            break;
          case "gongbi":
            outerNavClass = "mw-portlet";
            innerDivClass = "mw-portlet-body";
            break;
          case "citizen":
            outerNavClass = "mw-portlet";
            innerDivClass = "mw-portlet-twinkle";
            break;
          default:
            navigation = "column-one";
            outerNavClass = "portlet";
            break;
        }
        let outerNav;
        let heading;
        if (skin === "vector-2022") {
          outerNav = document.createElement("div");
          heading = document.createElement("label");
        } else {
          outerNav = document.createElement("nav");
          heading = document.createElement("h3");
        }
        outerNav.setAttribute("aria-labelledby", "".concat(id, "-label"));
        outerNav.className = "".concat(outerNavClass, " emptyPortlet");
        outerNav.id = id;
        if (nextnode && nextnode.parentNode === root) {
          root.insertBefore(outerNav, nextnode);
        } else {
          root.appendChild(outerNav);
        }
        heading.id = "".concat(id, "-label");
        const ul = document.createElement("ul");
        if (skin === "vector" || skin === "vector-2022") {
          heading.setAttribute("for", "".concat(id, "-dropdown-checkbox"));
          ul.className = "vector-menu-content-list";
          heading.className = "vector-menu-heading vector-dropdown-label";
          if (outerNavClass.includes("vector-menu-dropdown")) {
            const chkbox = document.createElement("input");
            chkbox.id = "".concat(id, "-dropdown-checkbox");
            chkbox.className = "vector-menu-checkbox vector-dropdown-checkbox";
            chkbox.setAttribute("type", "checkbox");
            chkbox.setAttribute("aria-labelledby", "".concat(id, "-label"));
            outerNav.appendChild(chkbox);
            const span = document.createElement("span");
            span.appendChild(document.createTextNode(text));
            heading.appendChild(span);
            const a = document.createElement("a");
            a.href = "#";
            $(a).on("click", (e) => {
              e.preventDefault();
            });
            heading.appendChild(a);
          }
        } else {
          heading.appendChild(document.createTextNode(text));
        }
        outerNav.appendChild(heading);
        if (innerDivClass) {
          const innerDiv = document.createElement("div");
          innerDiv.className = innerDivClass;
          innerDiv.appendChild(ul);
          outerNav.appendChild(innerDiv);
        } else {
          outerNav.appendChild(ul);
        }
        return outerNav;
      };
      Twinkle2.addPortletLink = (task, text, id, tooltip) => {
        if (Twinkle2.getPref("portletArea") !== null) {
          Twinkle2.addPortlet(Twinkle2.getPref("portletArea"), Twinkle2.getPref("portletId"), Twinkle2.getPref("portletName"), Twinkle2.getPref("portletType"), Twinkle2.getPref("portletNext"));
        }
        const link = mw.util.addPortletLink(Twinkle2.getPref("portletId"), typeof task === "string" ? task : "#", text, id, tooltip);
        $body.find(".client-js .skin-vector #p-cactions").css("margin-right", "initial");
        if (typeof task === "function") {
          $(link).find("a").on("click", (ev) => {
            task();
            ev.preventDefault();
          });
        }
        if ($.collapsibleTabs) {
          $.collapsibleTabs.handleResize();
        }
        return link;
      };
      const scripturl = mw.util.getUrl("User:".concat(mw.config.get("wgUserName"), "/twinkleoptions.js"), {
        action: "raw",
        ctype: "text/javascript",
        happy: "yes"
      });
      Twinkle2.prefs || (Twinkle2.prefs = {});
      mw.loader.getScript(scripturl).fail(() => {
        void mw.notify(window.wgULS("未能加载您的Twinkle参数设置", "未能載入您的Twinkle偏好設定"), {
          type: "error",
          tag: "twinkle"
        });
      }).always(() => {
        $(Twinkle2.load);
      });
      Twinkle2.load = () => {
        let activeSpecialPageList = ["Block", "Contributions", "AbuseLog", "Recentchanges", "Recentchangeslinked"];
        if (Morebits.userIsSysop) {
          activeSpecialPageList = [...activeSpecialPageList, "DeletedContributions", "Prefixindex", "BrokenRedirects"];
        }
        if (mw.config.get("wgNamespaceNumber") === -1 && !activeSpecialPageList.includes(mw.config.get("wgCanonicalSpecialPageName"))) {
          return;
        }
        if (window.top !== window.self) {
          return;
        }
        Twinkle2.userAgent = "Twinkle/1.1";
        Morebits.wiki.api.setApiUserAgent(Twinkle2.userAgent);
        Twinkle2.disabledModules = [...Twinkle2.getPref("disabledModules"), ...Twinkle2.getPref("disabledSysopModules")];
        Twinkle2.addInitCallback = (func, name) => {
          if (!name || !Twinkle2.disabledModules.includes(name)) {
            func();
          }
        };
        var _iterator = _createForOfIteratorHelper(Twinkle2.initCallbacks), _step;
        try {
          for (_iterator.s(); !(_step = _iterator.n()).done; ) {
            const module2 = _step.value;
            Twinkle2.addInitCallback(module2.func, module2.name);
          }
        } catch (err) {
          _iterator.e(err);
        } finally {
          _iterator.f();
        }
        if (Twinkle2.getPref("dialogLargeFont")) {
          mw.util.addCSS(".morebits-dialog-content,.morebits-dialog-footerlinks{font-size:100%!important}.morebits-dialog input,.morebits-dialog select,.morebits-dialog-content button{font-size:inherit !important}");
        }
        const isVector = ["vector", "vector-2022"].includes(mw.config.get("skin"));
        if (isVector && Twinkle2.getPref("portletType") === "menu" && $body.find("#p-twinkle").length === 0) {
          $body.find("#p-cactions").css("margin-right", "initial");
        }
      };
      Twinkle2.sortByNamespace = (first, second) => {
        return first.ns - second.ns || (first.title > second.title ? 1 : -1);
      };
      Twinkle2.generateBatchPageLinks = (checkbox) => {
        const $checkbox = $(checkbox);
        const link = Morebits.htmlNode("a", $checkbox.val());
        link.setAttribute("class", "tw-batchpage-link");
        link.setAttribute("href", mw.util.getUrl($checkbox.val()));
        link.setAttribute("target", "_blank");
        link.setAttribute("rel", "noopener noreferrer");
        $checkbox.next().prepend([link, " "]);
      };
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklearv.js
var twinklearv_exports = {};
var init_twinklearv = __esm({
  "src/Twinkle/modules/twinklearv.js"() {
    "use strict";
    /*! Twinkle.js - twinklearv.js */
    (function twinklearv($) {
      const $body = $("body");
      Twinkle.arv = () => {
        const username = mw.config.get("wgRelevantUserName");
        if (!username) {
          return;
        }
        const isIP = mw.util.isIPAddress(username);
        const title = isIP ? window.wgULS("报告IP给管理员", "報告IP給管理員") : window.wgULS("报告用户给管理人员", "報告使用者給管理人員");
        Twinkle.addPortletLink(() => {
          Twinkle.arv.callback(username, isIP);
        }, window.wgULS("告状", "告狀"), "tw-arv", title);
      };
      Twinkle.arv.callback = (uid, isIP) => {
        if (uid === mw.config.get("wgUserName")) {
          void mw.notify(window.wgULS("你不想报告你自己,对吧?", "你不想報告你自己,對吧?"), {
            type: "warn",
            tag: "twinklearv"
          });
          return;
        }
        const Window = new Morebits.simpleWindow(600, 500);
        Window.setTitle(window.wgULS("报告用户给管理人员", "報告使用者給管理人員"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("告状设置", "告狀設定"), "H:TW/PREF#arv");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW#告狀");
        const form = new Morebits.quickForm(Twinkle.arv.callback.evaluate);
        const categories = form.append({
          type: "select",
          name: "category",
          label: window.wgULS("选择报告类型:", "選擇報告類別:"),
          event: Twinkle.arv.callback.changeCategory
        });
        categories.append({
          type: "option",
          label: window.wgULS("破坏(QW:VIP)", "破壞(QW:VIP)"),
          value: "aiv"
        });
        categories.append({
          type: "option",
          label: window.wgULS("编辑争议(QW:EWIP)", "編輯爭議(QW:EWIP)"),
          value: "ewip"
        });
        categories.append({
          type: "option",
          label: window.wgULS("用户名(QW:UAA)", "使用者名稱(QW:UAA)"),
          value: "username",
          disabled: mw.util.isIPAddress(uid)
        });
        categories.append({
          type: "option",
          label: window.wgULS("傀儡调查(QW:SPI)", "傀儡調查(QW:SPI)"),
          value: "spi",
          disabled: mw.util.isIPAddress(uid)
        });
        form.append({
          type: "div",
          label: "",
          style: "color: #f00",
          id: "twinkle-arv-blockwarning"
        });
        form.append({
          type: "field",
          label: "Work area",
          name: "work_area"
        });
        form.append({
          type: "submit",
          label: "提交"
        });
        form.append({
          type: "hidden",
          name: "uid",
          value: uid
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        const query = {
          action: "query",
          list: "blocks",
          bkprop: "range|flags",
          format: "json"
        };
        if (isIP) {
          query.bkip = uid;
        } else {
          query.bkusers = uid;
        }
        new Morebits.wiki.api(window.wgULS("检查用户的封禁状态", "檢查使用者的封鎖狀態"), query, (apiobj) => {
          const blocklist = apiobj.getResponse().query.blocks;
          if (blocklist.length) {
            const [block] = blocklist;
            let message = (isIP ? window.wgULS("此IP地址", "此IP位址") : window.wgULS("此账号", "此賬號")) + window.wgULS("已经被", "已經被") + (block.partial ? "部分" : "");
            message += block.rangestart === (block.rangeend ? "段" : "") + window.wgULS("封禁。", "封鎖。");
            if (block.partial) {
              $body.find("#twinkle-arv-blockwarning").css("color", "black");
            }
            $body.find("#twinkle-arv-blockwarning").text(message);
          }
        }).post();
        const evt = document.createEvent("Event");
        evt.initEvent("change", true, true);
        result.category.dispatchEvent(evt);
      };
      Twinkle.arv.lta_list = [{
        value: "",
        label: window.wgULS("请选择", "請選擇")
      }];
      Twinkle.arv.callback.sockmaster_changed = (e) => {
        Twinkle.arv.callback.set_sockmaster(e.target.value);
      };
      Twinkle.arv.callback.set_sockmaster = (sockmaster) => {
        $body.find("code.tw-arv-sockmaster").text("{{".concat("subst:", "Socksuspectnotice|1=".concat(sockmaster, "}}")));
      };
      Twinkle.arv.callback.changeCategory = (e) => {
        const value_ = e.target.value;
        const root_ = e.target.form;
        const [old_area] = Morebits.quickForm.getElements(root_, "work_area");
        let work_area = null;
        const previewlink = document.createElement("a");
        previewlink.style.cursor = "pointer";
        previewlink.textContent = window.wgULS("预览", "預覽");
        $(previewlink).on("click", () => {
          Twinkle.arv.callback.preview(root_);
        });
        switch (value_) {
          case "ewip":
            work_area = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("报告编辑争议", "報告編輯爭議"),
              name: "work_area"
            });
            work_area.append({
              type: "dyninput",
              name: "page",
              label: window.wgULS("相关页面:", "相關頁面:"),
              sublabel: window.wgULS("页面:", "頁面:"),
              tooltip: window.wgULS("如不希望让报告链接到页面,请留空", "如不希望讓報告連結到頁面,請留空"),
              min: 1,
              max: 10
            });
            work_area.append({
              type: "textarea",
              name: "reason",
              label: window.wgULS("评论:", "評論:")
            });
            work_area.append({
              type: "div",
              id: "arvpreview",
              label: [previewlink]
            });
            work_area.append({
              type: "div",
              id: "twinklearv-previewbox",
              style: "display: none"
            });
            work_area = work_area.render();
            old_area.parentNode.replaceChild(work_area, old_area);
            break;
          case "username":
            work_area = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("报告不当用户名", "報告不當使用者名稱"),
              name: "work_area"
            });
            work_area.append({
              type: "header",
              label: window.wgULS("不当用户名类型", "不當使用者名稱類別"),
              tooltip: window.wgULS("求闻百科不允许使用带有误导性、宣传性、侮辱性或破坏性的用户名。此外,使用域名及邮箱地址的用户名亦被禁止。这些准则俱应应用至用户名及签名。在其他语言中不当的用户名或通过错拼、替代、暗示、拆字或任何间接方法达成的非妥当用户名同样视为违规。", "求聞百科不允許使用帶有誤導性、宣傳性、侮辱性或破壞性的使用者名稱。此外,使用域名及電子信箱位址的使用者名稱亦被禁止。這些準則俱應應用至使用者名稱及簽名。在其他語言中不當的使用者名稱或通過錯拼、替代、暗示、拆字或任何間接方法達成的非妥當使用者名稱同樣視為違規。")
            });
            work_area.append({
              type: "checkbox",
              name: "arvtype",
              list: [{
                label: window.wgULS("误导性用户名", "誤導性使用者名稱"),
                value: window.wgULS("误导性", "誤導性"),
                tooltip: window.wgULS("误导性用户名隐含着与贡献者相关或误导他人的事情。例如︰不实观点、暗示账号拥有特定权限或暗示该账号并非由一人拥有而是由一个组群、一个项目或一个集体运作。", "誤導性使用者名稱隱含著與貢獻者相關或誤導他人的事情。例如︰不實觀點、暗示賬號擁有特定權限或暗示該賬號並非由一人擁有而是由一個群組、一個計畫或一個集體運作。")
              }, {
                label: window.wgULS("宣传性用户名", "宣傳性使用者名稱"),
                value: window.wgULS("宣传性", "宣傳性"),
                tooltip: window.wgULS("宣传性用户名会于求闻百科上起推销一个组群或一间公司的作用。", "宣傳性使用者名稱會於求聞百科上起推銷一個群組或一間公司的作用。")
              }, {
                label: window.wgULS("暗示并非由一人拥有", "暗示並非由一人擁有"),
                value: "shared",
                tooltip: window.wgULS("每个账号只可以代表个人(容许一些例外情况),所有与他人分享账号的行为(包括分享账号密码)均被禁止。", "每個賬號只可以代表個人(容許一些例外情況),所有與他人分享賬號的行為(包括分享賬號密碼)均被禁止。")
              }, {
                label: window.wgULS("侮辱性用户名", "侮辱性使用者名稱"),
                value: "侮辱性",
                tooltip: window.wgULS("侮辱性用户名令协调编辑变得困难,甚至无可能。", "侮辱性使用者名稱令協調編輯變得困難,甚至無可能。")
              }, {
                label: window.wgULS("破坏性用户名", "破壞性使用者名稱"),
                value: window.wgULS("破坏性", "破壞性"),
                tooltip: window.wgULS("破坏性用户名包括人身攻击、伪冒他人或其他一切有着清晰可见的破坏求闻百科意图的用户名。", "破壞性使用者名稱包括人身攻擊、偽冒他人或其他一切有著清晰可見的破壞求聞百科意圖的使用者名稱。")
              }]
            });
            work_area.append({
              type: "checkbox",
              list: [{
                label: window.wgULS("在页面上隐藏用户名(需监督的用户名请勿于站内报告,勾选此项并不构成能在站内报告的理由)", "在頁面上隱藏使用者名稱(需監督的使用者名稱請勿於站內報告,勾選此項並不構成能在站內報告的理由)"),
                tooltip: window.wgULS("若用户名不当请勾选此项,注意:请考虑私下联系管理员处理。", "若使用者名稱不當請勾選此項,注意:請考慮私下聯絡管理員處理。"),
                name: "hidename",
                value: "hidename"
              }],
              style: "font-weight: bold;"
            });
            work_area.append({
              type: "textarea",
              name: "reason",
              label: window.wgULS("评论:", "評論:")
            });
            work_area.append({
              type: "div",
              id: "arvpreview",
              label: [previewlink]
            });
            work_area.append({
              type: "div",
              id: "twinklearv-previewbox",
              style: "display: none"
            });
            work_area = work_area.render();
            old_area.parentNode.replaceChild(work_area, old_area);
            break;
          case "spi":
            work_area = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("发起傀儡调查", "發起傀儡調查"),
              name: "work_area"
            });
            work_area.append({
              type: "input",
              name: "sockmaster",
              tooltip: window.wgULS("主账号的用户名(不含User:前缀)", "主賬號的使用者名稱(不含User:字首)"),
              value: root_.uid.value,
              event: Twinkle.arv.callback.sockmaster_changed
            });
            work_area.append({
              type: "div",
              id: "twinklearv-spinoticebox",
              style: "display: none"
            });
            work_area.append({
              type: "dyninput",
              name: "sockpuppet",
              label: "傀儡",
              sublabel: "傀儡:",
              tooltip: window.wgULS("傀儡的用户名(不含User:前缀)", "傀儡的使用者名稱(不含User:字首)"),
              min: 2,
              max: 9
            });
            work_area.append({
              type: "textarea",
              label: window.wgULS("证据:", "證據:"),
              name: "reason",
              tooltip: window.wgULS("输入能够用来体现这些用户可能滥用多重账号的证据,这通常包括茶馆发言、页面历史或其他有关的信息。请避免在此处提供非与傀儡或滥用多重账号相关的其他讨论。", "輸入能夠用來體現這些使用者可能濫用多重賬號的證據,這通常包括茶館發言、頁面歷史或其他有關的資訊。請避免在此處提供非與傀儡或濫用多重賬號相關的其他討論。")
            });
            work_area.append({
              type: "checkbox",
              list: [{
                label: window.wgULS("请求用户查核", "請求使用者查核"),
                name: "checkuser",
                tooltip: window.wgULS("用户查核是一种用于获取傀儡指控相关技术证据的工具,若没有正当理由则不会使用,您必须在证据字段充分解释为什么需要使用该工具。用户查核不会用于公开连接用户账号使用的IP地址。", "使用者查核是一種用於獲取傀儡指控相關技術證據的工具,若沒有正當理由則不會使用,您必須在證據欄位充分解釋為什麼需要使用該工具。使用者查核不會用於公開連接使用者賬號使用的IP位址。")
              }]
            });
            work_area.append({
              type: "div",
              id: "arvpreview",
              label: [previewlink]
            });
            work_area.append({
              type: "div",
              id: "twinklearv-previewbox",
              style: "display: none"
            });
            work_area.append({
              type: "div",
              label: [window.wgULS("请使用常识决定是否以", "請使用常識決定是否以"), $("<code>").addClass("tw-arv-sockmaster").css("margin", "2px;")[0], window.wgULS("通知用户。这不是必须的,对于涉及新用户的报告而言,通知他们能让报告显得更公平,但是许多情况下(如长期破坏者)通知更可能适得其反。", "通知使用者。這不是必須的,對於涉及新使用者的報告而言,通知他們能讓報告顯得更公平,但是許多情況下(如長期破壞者)通知更可能適得其反。")]
            });
            work_area = work_area.render();
            $("input:text[name=sockpuppet]", work_area).first().val(root_.uid.value);
            old_area.parentNode.replaceChild(work_area, old_area);
            root_.spinoticepreviewer = new Morebits.wiki.preview($(work_area).find("#twinklearv-spinoticebox").last()[0]);
            Twinkle.arv.callback.set_sockmaster(root_.uid.value);
            break;
          default:
            work_area = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("报告用户破坏", "報告使用者破壞"),
              name: "work_area"
            });
            work_area.append({
              type: "div",
              label: window.wgULS("提报傀儡应优先发送至傀儡调查,除非相关的账号有高频率、涉及多个页面等紧急严重的破坏行为。", "提報傀儡應優先發送至傀儡調查,除非相關的賬號有高頻率、涉及多個頁面等緊急嚴重的破壞行為。")
            });
            work_area.append({
              type: "input",
              name: "page",
              label: window.wgULS("相关页面:", "相關頁面:"),
              tooltip: window.wgULS("如不希望让报告链接到页面,请留空", "如不希望讓報告連結到頁面,請留空"),
              value: mw.util.getParamValue("vanarticle") || "",
              event: (event) => {
                const {
                  value
                } = event.target;
                const root = event.target.form;
                if (value === "") {
                  root.badid.disabled = true;
                  root.goodid.disabled = true;
                } else {
                  root.badid.disabled = false;
                  root.goodid.disabled = root.badid.value === "";
                }
              }
            });
            work_area.append({
              type: "input",
              name: "badid",
              label: window.wgULS("受到破坏的修订版本:", "受到破壞的修訂版本:"),
              tooltip: window.wgULS("留空以略过差异", "留空以略過差異"),
              value: mw.util.getParamValue("vanarticlerevid") || "",
              disabled: !mw.util.getParamValue("vanarticle"),
              event: (event) => {
                const {
                  value
                } = event.target;
                const root = event.target.form;
                root.goodid.disabled = value === "";
              }
            });
            work_area.append({
              type: "input",
              name: "goodid",
              label: window.wgULS("破坏前的修订版本:", "破壞前的修訂版本:"),
              tooltip: window.wgULS("留空以略过差异的较早版本", "留空以略過差異的較早版本"),
              value: mw.util.getParamValue("vanarticlegoodrevid") || "",
              disabled: !mw.util.getParamValue("vanarticle") || mw.util.getParamValue("vanarticlerevid")
            });
            work_area.append({
              type: "checkbox",
              name: "arvtype",
              list: [{
                label: window.wgULS("已发出最后警告", "已發出最後警告"),
                value: "final"
              }, {
                label: window.wgULS("封禁过期后随即破坏", "封鎖過期後隨即破壞"),
                value: "postblock"
              }, {
                label: window.wgULS("显而易见的纯破坏用户", "顯而易見的純破壞使用者"),
                value: "vandalonly",
                disabled: mw.util.isIPAddress(root_.uid.value)
              }, {
                label: window.wgULS("显而易见的spambot或失窃账号", "顯而易見的spambot或失竊賬號"),
                value: "spambot"
              }, {
                label: window.wgULS("仅用来散发广告宣传的用户", "僅用來散發廣告宣傳的使用者"),
                value: "promoonly",
                disabled: mw.util.isIPAddress(root_.uid.value)
              }]
            });
            if (!mw.util.isIPAddress(mw.config.get("wgRelevantUserName"))) {
              work_area.append({
                type: "checkbox",
                list: [{
                  label: window.wgULS("在页面上及编辑摘要隐藏用户名", "在頁面上及編輯摘要隱藏使用者名稱"),
                  tooltip: window.wgULS("若用户名不当请勾选此项,注意:请考虑私下联系管理员处理。", "若使用者名稱不當請勾選此項,注意:請考慮私下聯絡管理員處理。"),
                  name: "hidename",
                  value: "hidename"
                }]
              });
            }
            work_area.append({
              type: "textarea",
              name: "reason",
              label: window.wgULS("评论:", "評論:")
            });
            work_area.append({
              type: "div",
              id: "arvpreview",
              label: [previewlink]
            });
            work_area.append({
              type: "div",
              id: "twinklearv-previewbox",
              style: "display: none"
            });
            work_area = work_area.render();
            old_area.parentNode.replaceChild(work_area, old_area);
            break;
        }
        root_.previewer = new Morebits.wiki.preview($(work_area).find("#twinklearv-previewbox").last()[0]);
      };
      Twinkle.arv.callback.preview = (form) => {
        const reason = Twinkle.arv.callback.getReportWikitext(form);
        if (reason === void 0) {
          return;
        }
        const input = Morebits.quickForm.getInputData(form);
        let title;
        switch (input.category) {
          case "vip":
            title = "Qiuwen_talk:报告当前破坏";
            break;
          case "ewip":
            title = "Qiuwen_talk:管理员告示板";
            break;
          case "username":
            title = "Qiuwen_talk:管理员告示板";
            break;
          case "spi":
            title = "Qiuwen_talk:管理员告示板";
            break;
          default:
            title = mw.config.get("wgPageName");
            break;
        }
        form.previewer.beginRender("__NOTOC__".concat(reason[0]), title);
      };
      Twinkle.arv.callback.getReportWikitext = (form) => {
        const input = Morebits.quickForm.getInputData(form);
        let reason = "";
        let comment = "";
        const {
          uid
        } = input;
        const checkTitle = (title, revid) => {
          if (/https?:\/\//.test(title)) {
            void mw.notify(window.wgULS("页面名称不能使用网址。", "頁面名稱不能使用網址。"), {
              type: "warn",
              tag: "twinklearv"
            });
            return false;
          }
          let page_;
          try {
            page_ = new mw.Title(title);
          } catch {
            void mw.notify("".concat(window.wgULS("“", "「") + title + window.wgULS("”不是一个有效的页面名称,如要使用差异链接请放在“评论”", "」不是一個有效的頁面名稱,如要使用差異連結請放在「評論」") + (revid ? window.wgULS(",或正确输入“修订版本”", ",或正確輸入「修訂版本」") : ""), "。"), {
              type: "warn",
              tag: "twinklearv"
            });
            return false;
          }
          if (page_.namespace === -1) {
            void mw.notify("".concat(window.wgULS("“", "「") + title + window.wgULS("”属于特殊页面,如要使用差异链接请放在“评论”", "」屬於特殊頁面,如要使用差異連結請放在「評論」") + (revid ? window.wgULS(",或正确输入“修订版本”", ",或正確輸入「修訂版本」") : ""), "。"), {
              type: "warn",
              tag: "twinklearv"
            });
            return false;
          }
          return page_;
        };
        let page;
        switch (input.category) {
          case "ewip": {
            if (input.reason === "") {
              void mw.notify(window.wgULS("您必须指定理由", "您必須指定理由"), {
                type: "warn",
                tag: "twinklearv"
              });
              return;
            }
            reason += "== 编辑战举报(".concat(uid, ") ==\n");
            reason += "* '''{{vandal|".concat(/[=]/.test(uid) ? "1=" : "").concat(uid, "}}'''\n");
            const pages = $("input:text[name=page]", form).map((o, e) => {
              return $(e).val() || null;
            });
            var _iterator2 = _createForOfIteratorHelper(pages), _step2;
            try {
              for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) {
                const page_ = _step2.value;
                page = checkTitle(page_, false);
                if (!page) {
                  return;
                }
                comment += "* {{pagelinks|".concat(page.getPrefixedText().includes("=") ? "1=" : "").concat(page.getPrefixedText(), "}}\n");
              }
            } catch (err) {
              _iterator2.e(err);
            } finally {
              _iterator2.f();
            }
            input.reason = input.reason.replace(/\n\n+/g, "\n");
            input.reason = input.reason.replace(/\r?\n/g, "\n*:");
            comment += "* ".concat(input.reason, "\n");
            comment = comment.trim();
            comment = Morebits.string.appendPunctuation(comment);
            reason += "".concat(comment, "\n* 提报人:~~").concat("~~\n* 处理:");
            break;
          }
          case "username": {
            let types = input.arvtype.map(Morebits.string.toLowerCaseFirstChar);
            const hasShared = types.includes("shared");
            if (hasShared) {
              types.splice(types.indexOf("shared"), 1);
            }
            if (types.includes("侮辱性") && !confirm(window.wgULS("警告:严重的侮辱性用户名和针对特定个人的侮辱性用户名不应在公开页面报告,而是应当私下联系监督员处理。是否继续?", "警告:嚴重的侮辱性使用者名稱和針對特定個人的侮辱性使用者名稱不應在公開頁面報告,而是應當私下聯絡監督員處理。是否繼續?"))) {
              return;
            }
            if (types.length <= 2) {
              types = types.join("和");
            } else {
              types = [types.slice(0, -1).join("、"), types.slice(-1)].join("和");
            }
            comment += "*{{user-uaa|1=".concat(uid);
            if (input.hidename) {
              comment += "|hidename=1";
            }
            comment += "}} &ndash; ";
            if (types.length) {
              comment += types + window.wgULS("用户名", "使用者名稱");
            }
            if (types.length && hasShared) {
              comment += ",";
            }
            if (hasShared) {
              comment += window.wgULS("暗示该账号并非由一人拥有", "暗示該賬號並非由一人擁有");
            }
            if (types.length || hasShared) {
              comment += "。";
            }
            if (input.reason) {
              comment += Morebits.string.toUpperCaseFirstChar(input.reason);
            }
            comment = Morebits.string.appendPunctuation(comment);
            comment += "--~~".concat("~~");
            comment = comment.replace(/\r?\n/g, "\n*:");
            reason = "== 不当用户名报告(".concat(input.hidename ? window.wgULS("已隐藏用户名", "已隱藏使用者名稱") : uid, ") ==\n");
            reason += comment;
            break;
          }
          case "spi": {
            if (!input.reason) {
              void mw.notify(window.wgULS("请输入证据。", "請輸入證據。"), {
                type: "warn",
                tag: "twinklearv"
              });
              return;
            }
            const sockpuppets = Morebits.array.uniq([...$("input:text[name=sockpuppet]", form)].map((o) => {
              return $(o).val().trim() || null;
            }));
            if (!sockpuppets[0]) {
              void mw.notify(window.wgULS("您没有指定任何傀儡。", "您沒有指定任何傀儡。"), {
                type: "warn",
                tag: "twinklearv"
              });
              return;
            }
            comment += "{{".concat("subst:", "SPI report|");
            if (!sockpuppets.includes(input.sockmaster)) {
              comment += "1={{".concat("subst:", "#ifexist:{{", "subst:", "FULLPAGENAME}}||".concat(input.sockmaster, "}}|"));
            }
            comment += "".concat(sockpuppets.map((sock, index) => {
              return "".concat(index + 2, "=").concat(sock);
            }).join("|"), "\n|evidence=").concat(Morebits.string.appendPunctuation(input.reason), "\n");
            if (input.checkuser) {
              comment += "|checkuser=yes";
            }
            comment += "}}";
            reason = comment;
            break;
          }
          default: {
            if (!input.arvtype.length && input.reason === "") {
              void mw.notify(window.wgULS("您必须指定理由", "您必須指定理由"), {
                type: "warn",
                tag: "twinklearv"
              });
              return;
            }
            reason += "== ".concat(input.hidename ? window.wgULS("已隐藏用户名", "已隱藏使用者名稱") : uid, " ==\n");
            reason += "* '''{{vandal|".concat(/[=]/.test(uid) ? "1=" : "").concat(uid);
            if (input.hidename) {
              reason += "|hidename=1";
            }
            reason += "}}'''\n";
            const types = input.arvtype.map((v) => {
              switch (v) {
                case "final":
                  return "已发出最后警告";
                case "postblock":
                  return "封禁过期后随即破坏";
                case "spambot":
                  return "显而易见的spambot或失窃账号";
                case "vandalonly":
                  return "显而易见的纯破坏用户";
                case "promoonly":
                  return "仅用来散发广告宣传的用户";
                default:
                  return "未知理由";
              }
            }).join(",");
            if (input.page !== "") {
              page = checkTitle(input.page, true);
              if (!page) {
                return;
              }
              comment += "* {{pagelinks|".concat(page.getPrefixedText().includes("=") ? "1=" : "").concat(page.getPrefixedText(), "}}");
              if (input.badid) {
                var _input$goodid;
                comment += "({{diff|".concat(page.getPrefixedText(), "|").concat(input.badid, "|").concat((_input$goodid = input.goodid) !== null && _input$goodid !== void 0 ? _input$goodid : "", "|diff}})");
              }
              comment += "\n";
            }
            if (types) {
              comment += "* ".concat(types);
            }
            if (input.reason !== "") {
              input.reason = input.reason.replace(/\n\n+/g, "\n");
              input.reason = input.reason.replace(/\r?\n/g, "\n*:");
              comment += (types ? "。" : "* ") + input.reason;
            }
            comment = comment.trim();
            comment = Morebits.string.appendPunctuation(comment);
            reason += "".concat(comment, "\n* 发现人:~~").concat("~~\n* 处理:");
            break;
          }
        }
        return [reason, comment];
      };
      Twinkle.arv.callback.evaluate = (e) => {
        const form = e.target;
        const input = Morebits.quickForm.getInputData(form);
        const {
          uid
        } = input;
        let reason;
        let summary;
        switch (input.category) {
          case "ewip": {
            reason = Twinkle.arv.callback.getReportWikitext(form);
            if (reason === void 0) {
              return;
            }
            summary = "".concat(window.wgULS("报告", "報告"), "[[Special:Contribs/").concat(uid, "|").concat(uid, "]]");
            Morebits.simpleWindow.setButtonsEnabled(false);
            Morebits.status.init(form);
            Morebits.wiki.actionCompleted.redirect = "Qiuwen_talk:管理员告示板";
            Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
            const ewipPage = new Morebits.wiki.page("Qiuwen_talk:管理员告示板", window.wgULS("处理EWIP请求", "處理EWIP請求"));
            ewipPage.setFollowRedirect(true);
            ewipPage.load(() => {
              const text = ewipPage.getPageText();
              const $ewipLink = '<a rel="noopener" target="_blank" href="/wiki/QW:EWIP">QW:EWIP</a>';
              if (new RegExp("===\\s*\\{\\{\\s*(?:[Vv]andal)\\s*\\|\\s*(?:1=)?\\s*".concat(Morebits.string.escapeRegExp(uid), "\\s*\\}\\}\\s*===")).test(text)) {
                ewipPage.getStatusElement().error(window.wgULS("报告已存在,将不会加入新的", "報告已存在,將不會加入新的"));
                Morebits.status.printUserText(reason[1], window.wgULS("您输入的评论已在下方提供,您可以将其加入到", "您輸入的評論已在下方提供,您可以將其加入到") + $ewipLink + window.wgULS("已存在的小节中:", "已存在的小節中:"));
                return;
              }
              ewipPage.setPageSection(0);
              ewipPage.getStatusElement().status(window.wgULS("加入新报告…", "加入新報告…"));
              ewipPage.setEditSummary(summary);
              ewipPage.setChangeTags(Twinkle.changeTags);
              ewipPage.setAppendText("\n".concat(reason[0]));
              ewipPage.append();
            });
            break;
          }
          case "username": {
            reason = Twinkle.arv.callback.getReportWikitext(form);
            Morebits.simpleWindow.setButtonsEnabled(false);
            Morebits.status.init(form);
            Morebits.wiki.actionCompleted.redirect = "Qiuwen_talk:管理员告示板";
            Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
            const uaaPage = new Morebits.wiki.page("Qiuwen_talk:管理员告示板", window.wgULS("处理UAA请求", "處理UAA請求"));
            uaaPage.setFollowRedirect(true);
            uaaPage.load(() => {
              const text = uaaPage.getPageText();
              if (new RegExp("\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?".concat(Morebits.string.escapeRegExp(uid), "\\s*(\\||\\})")).test(text)) {
                uaaPage.getStatusElement().error(window.wgULS("用户已被列入。", "使用者已被列入。"));
                const $uaaLink = '<a rel="noopener" target="_blank" href="/wiki/QW:UAA">QW:UAA</a>';
                Morebits.status.printUserText(reason[1], window.wgULS("您输入的评论已在下方提供,您可以将其手工加入", "您輸入的評論已在下方提供,您可以將其手工加入") + $uaaLink + window.wgULS("上该用户的报告中:", "上該使用者的報告中:"));
                return;
              }
              uaaPage.getStatusElement().status(window.wgULS("加入新报告…", "加入新報告…"));
              uaaPage.setEditSummary(window.wgULS("新提报", "新提報"));
              uaaPage.setChangeTags(Twinkle.changeTags);
              uaaPage.setAppendText("\n\n".concat(reason[0]));
              uaaPage.append();
            });
            break;
          }
          case "spi": {
            reason = Twinkle.arv.callback.getReportWikitext(form);
            Morebits.simpleWindow.setButtonsEnabled(false);
            Morebits.status.init(form);
            const reportpage = "Qiuwen_talk:管理员告示板";
            Morebits.wiki.actionCompleted.redirect = reportpage;
            Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
            const spiPage = new Morebits.wiki.page(reportpage, window.wgULS("抓取讨论页面", "抓取討論頁面"));
            spiPage.setFollowRedirect(true);
            spiPage.setEditSummary(window.wgULS("加入新提报", "加入新提報"));
            spiPage.setChangeTags(Twinkle.changeTags);
            spiPage.setAppendText(reason[0]);
            spiPage.setWatchlist(Twinkle.getPref("spiWatchReport"));
            spiPage.append();
            break;
          }
          default: {
            reason = Twinkle.arv.callback.getReportWikitext(form);
            if (reason === void 0) {
              return;
            }
            summary = "".concat(window.wgULS("报告", "報告"), "[[Special:Contribs/").concat(uid, "|").concat(uid, "]]");
            if (input.hidename) {
              summary = window.wgULS("报告一名用户", "報告一名使用者");
            }
            Morebits.simpleWindow.setButtonsEnabled(false);
            Morebits.status.init(form);
            Morebits.wiki.actionCompleted.redirect = "Qiuwen_talk:报告当前破坏";
            Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
            const aivPage = new Morebits.wiki.page("Qiuwen_talk:报告当前破坏", window.wgULS("处理VIP请求", "處理VIP請求"));
            aivPage.setFollowRedirect(true);
            aivPage.load(() => {
              const text = aivPage.getPageText();
              const $aivLink = '<a rel="noopener" target="_blank" href="/wiki/QW:VIP">QW:VIP</a>';
              if (new RegExp("===\\s*\\{\\{\\s*(?:[Vv]andal)\\s*\\|\\s*(?:1=)?\\s*".concat(Morebits.string.escapeRegExp(uid), "\\s*\\}\\}\\s*===")).test(text)) {
                aivPage.getStatusElement().error(window.wgULS("报告已存在,将不会加入新的", "報告已存在,將不會加入新的"));
                Morebits.status.printUserText(reason[1], window.wgULS("您输入的评论已在下方提供,您可以将其加入到", "您輸入的評論已在下方提供,您可以將其加入到") + $aivLink + window.wgULS("已存在的小节中:", "已存在的小節中:"));
                return;
              }
              aivPage.setPageSection(0);
              aivPage.getStatusElement().status(window.wgULS("加入新报告…", "加入新報告…"));
              aivPage.setEditSummary(summary);
              aivPage.setChangeTags(Twinkle.changeTags);
              aivPage.setAppendText("\n".concat(reason[0]));
              aivPage.append();
            });
            break;
          }
        }
      };
      Twinkle.addInitCallback(Twinkle.arv, "arv");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklewarn.js
var twinklewarn_exports = {};
var init_twinklewarn = __esm({
  "src/Twinkle/modules/twinklewarn.js"() {
    "use strict";
    /*! Twinkle.js - twinklewarn.js */
    (function twinklewarn($) {
      const $body = $("body");
      const relevantUserName = mw.config.get("wgRelevantUserName");
      Twinkle.warn = () => {
        if (relevantUserName) {
          Twinkle.addPortletLink(Twinkle.warn.callback, "警告", "tw-warn", window.wgULS("警告或提醒用户", "警告或提醒使用者"));
          if (Twinkle.getPref("autoMenuAfterRollback") && mw.config.get("wgNamespaceNumber") === 3 && mw.util.getParamValue("vanarticle") && !mw.util.getParamValue("noautowarn")) {
            Twinkle.warn.callback();
          }
        }
        if (mw.config.get("wgAction") === "rollback") {
          const $vandalTalkLink = $body.find("#mw-rollback-success").find(".mw-usertoollinks a").first();
          if ($vandalTalkLink.length) {
            Twinkle.warn.makeVandalTalkLink($vandalTalkLink, Morebits.pageNameNorm);
            $vandalTalkLink.css("font-weight", "bold");
          }
        }
        if (mw.config.get("wgCanonicalSpecialPageName") === "AbuseLog" && mw.config.get("wgAbuseFilterVariables") !== null) {
          const afTalkLink = $body.find(".mw-usertoollinks-talk").first();
          if (afTalkLink.length) {
            Twinkle.warn.makeVandalTalkLink(afTalkLink, mw.config.get("wgAbuseFilterVariables").page_prefixedtitle);
            afTalkLink.css("font-weight", "bold");
          }
        }
      };
      Twinkle.warn.makeVandalTalkLink = ($vandalTalkLink, pagename) => {
        $vandalTalkLink.wrapInner($("<span>").attr("title", window.wgULS("如果合适,您可以用Twinkle在该用户讨论页上做出警告。", "如果合適,您可以用Twinkle在該使用者討論頁上做出警告。")));
        const extraParam = "vanarticle=".concat(mw.util.rawurlencode(pagename));
        const href = $vandalTalkLink.attr("href");
        if (href.includes("?")) {
          $vandalTalkLink.attr("href", "".concat(href, "&").concat(extraParam));
        } else {
          $vandalTalkLink.attr("href", "".concat(href, "?").concat(extraParam));
        }
      };
      Twinkle.warn.dialog = null;
      Twinkle.warn.callback = () => {
        if (relevantUserName === mw.config.get("wgUserName") && !confirm(window.wgULS("您将要警告自己!您确定要继续吗?", "您將要警告自己!您確定要繼續嗎?"))) {
          return;
        }
        Twinkle.warn.dialog = new Morebits.simpleWindow(600, 440);
        const {
          dialog
        } = Twinkle.warn;
        dialog.setTitle(window.wgULS("警告、提醒用户", "警告、提醒使用者"));
        dialog.setScriptName("Twinkle");
        dialog.addFooterLink(window.wgULS("警告设置", "警告設定"), "H:TW/PREF#warn");
        dialog.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#warn");
        const form = new Morebits.quickForm(Twinkle.warn.callback.evaluate);
        const main_select = form.append({
          type: "field",
          label: window.wgULS("选择要发送的警告或提醒类型", "選擇要傳送的警告或提醒類別"),
          tooltip: window.wgULS("首先选择一组,再选择具体的警告模板。", "首先選擇一組,再選擇具體的警告模板。")
        });
        const main_group = main_select.append({
          type: "select",
          name: "main_group",
          tooltip: window.wgULS("您可在Twinkle参数设置中设置默认选择的选项", "您可在Twinkle偏好設定中設定預設選擇的選項"),
          event: Twinkle.warn.callback.change_category
        });
        const defaultGroup = Number.parseInt(Twinkle.getPref("defaultWarningGroup"), 6);
        main_group.append({
          type: "option",
          label: window.wgULS("自动选择层级", "自動選擇層級"),
          value: "autolevel",
          selected: defaultGroup === 7
        });
        main_group.append({
          type: "option",
          label: "1:提醒",
          value: "level1",
          selected: defaultGroup === 1
        });
        main_group.append({
          type: "option",
          label: "2:警告",
          value: "level2",
          selected: defaultGroup === 2
        });
        if (Twinkle.getPref("combinedSingletMenus")) {
          main_group.append({
            type: "option",
            label: window.wgULS("单层级消息", "單層級訊息"),
            value: "singlecombined",
            selected: defaultGroup === 3 || defaultGroup === 4
          });
        } else {
          main_group.append({
            type: "option",
            label: window.wgULS("单层级提醒", "單層級提醒"),
            value: "singlenotice",
            selected: defaultGroup === 3
          });
          main_group.append({
            type: "option",
            label: window.wgULS("单层级警告", "單層級警告"),
            value: "singlewarn",
            selected: defaultGroup === 4
          });
        }
        if (Twinkle.getPref("customWarningList").length) {
          main_group.append({
            type: "option",
            label: window.wgULS("自定义警告", "自訂警告"),
            value: "custom",
            selected: defaultGroup === 5
          });
        }
        main_group.append({
          type: "option",
          label: "所有警告模板",
          value: "kitchensink",
          selected: defaultGroup === 6
        });
        main_select.append({
          type: "select",
          name: "sub_group",
          event: Twinkle.warn.callback.change_subcategory
        });
        form.append({
          type: "input",
          name: "article",
          label: window.wgULS("页面链接", "頁面連結"),
          value: mw.util.getParamValue("vanarticle") || "",
          size: 50,
          tooltip: window.wgULS("给模板中加入一页面链接,可留空。", "給模板中加入一頁面連結,可留空。"),
          placeholder: window.wgULS("仅限一个,勿使用网址、[[ ]],可使用Special:Diff", "僅限一個,勿使用網址、[[ ]],可使用Special:Diff")
        });
        form.append({
          type: "div",
          label: "",
          style: "color: #f00",
          id: "twinkle-warn-warning-messages"
        });
        const more = form.append({
          type: "field",
          name: "reasonGroup",
          label: window.wgULS("警告信息", "警告資訊")
        });
        more.append({
          type: "textarea",
          label: window.wgULS("可选信息:", "可選資訊:"),
          name: "reason",
          tooltip: window.wgULS("理由或是附加信息", "理由或是附加資訊")
        });
        const previewlink = document.createElement("a");
        $(previewlink).on("click", () => {
          Twinkle.warn.callbacks.preview(result);
        });
        previewlink.style.cursor = "pointer";
        previewlink.textContent = window.wgULS("预览", "預覽");
        more.append({
          type: "div",
          id: "warningpreview",
          label: [previewlink]
        });
        more.append({
          type: "div",
          id: "twinklewarn-previewbox",
          style: "display: none"
        });
        more.append({
          type: "submit",
          label: "提交"
        });
        const result = form.render();
        dialog.setContent(result);
        dialog.display();
        result.main_group.root = result;
        result.previewer = new Morebits.wiki.preview($(result).find("div#twinklewarn-previewbox").last()[0]);
        let message = "";
        let query = {};
        const vanrevid = mw.util.getParamValue("vanarticlerevid");
        if (vanrevid) {
          if (!mw.util.getParamValue("noautowarn") && mw.util.getParamValue("vanarticle")) {
            query = {
              action: "query",
              titles: mw.util.getParamValue("vanarticle"),
              prop: "revisions",
              rvstartid: vanrevid,
              rvlimit: 2,
              rvdir: "newer",
              rvprop: "user"
            };
            new Morebits.wiki.api(window.wgULS("检查您是否成功回退该页面", "檢查您是否成功回退該頁面"), query, (apiobj) => {
              const revertUser = $(apiobj.getResponse()).find("revisions rev")[1].getAttribute("user");
              if (revertUser && revertUser !== mw.config.get("wgUserName")) {
                message += window.wgULS("其他人回退了该页面,并可能已经警告该用户。", "其他人回退了該頁面,並可能已經警告該使用者。");
                $body.find("#twinkle-warn-warning-messages").text("警告:".concat(message));
              }
            }).post();
          }
          const checkStale = (vantimestamp_) => {
            const revDate = new Morebits.date(vantimestamp_);
            if (vantimestamp_ && revDate.isValid() && revDate.add(24, "hours").isBefore(/* @__PURE__ */ new Date())) {
              message += window.wgULS("这笔编辑是在24小时前做出的,现在警告可能已过时。", "這筆編輯是在24小時前做出的,現在警告可能已過時。");
              $body.find("#twinkle-warn-warning-messages").text("警告:".concat(message));
            }
          };
          let vantimestamp = mw.util.getParamValue("vantimestamp");
          if (vantimestamp) {
            checkStale(vantimestamp);
          } else {
            query = {
              action: "query",
              prop: "revisions",
              rvprop: "timestamp",
              revids: vanrevid
            };
            new Morebits.wiki.api(window.wgULS("获取版本时间戳", "取得版本時間戳"), query, (apiobj) => {
              vantimestamp = $(apiobj.getResponse()).find("revisions rev").attr("timestamp");
              checkStale(vantimestamp);
            }).post();
          }
        }
        const init = () => {
          const evt = document.createEvent("Event");
          evt.initEvent("change", true, true);
          result.main_group.dispatchEvent(evt);
        };
        init();
      };
      Twinkle.warn.messages = {
        levels: [{
          category: window.wgULS("不同类型的非建设编辑", "不同類別的非建設編輯"),
          list: {
            "uw-copyright": {
              level1: {
                label: window.wgULS("侵犯著作权", "侵犯版權"),
                summary: window.wgULS("注意:侵犯著作权", "注意:侵犯版權")
              },
              level2: {
                label: window.wgULS("多次侵犯著作权", "多次侵犯版權"),
                summary: window.wgULS("警告:多次侵犯著作权", "警告:多次侵犯版權")
              }
            },
            "uw-crystal": {
              level1: {
                label: window.wgULS("加入臆测或未确认的消息", "加入臆測或未確認的訊息"),
                summary: window.wgULS("注意:加入臆测或未确认的消息", "注意:加入臆測或未確認的訊息")
              },
              level2: {
                label: window.wgULS("多次加入臆测或未确认的消息", "多次加入臆測或未確認的訊息"),
                summary: window.wgULS("警告:多次加入臆测或未确认的消息", "警告:多次加入臆測或未確認的訊息")
              }
            },
            "uw-delete": {
              level1: {
                label: window.wgULS("不恰当地移除页面内容、模板或资料", "不恰當地移除頁面內容、模板或資料"),
                summary: window.wgULS("注意:不恰当地移除页面内容、模板或资料", "注意:不恰當地移除頁面內容、模板或資料")
              },
              level2: {
                label: window.wgULS("不恰当地移除页面内容、模板或资料", "不恰當地移除頁面內容、模板或資料"),
                summary: window.wgULS("警告:不恰当地移除页面内容、模板或资料", "警告:不恰當地移除頁面內容、模板或資料")
              }
            },
            "uw-image": {
              level1: {
                label: window.wgULS("在页面中加入不当图片", "在頁面中加入不當圖片"),
                summary: window.wgULS("注意:在页面中加入不当图片", "注意:在頁面中加入不當圖片")
              },
              level2: {
                label: window.wgULS("在页面中加入不当图片", "在頁面中加入不當圖片"),
                summary: window.wgULS("警告:在页面中加入不当图片", "警告:在頁面中加入不當圖片")
              }
            },
            "uw-newpage": {
              level1: {
                label: window.wgULS("创建不当页面", "建立不當頁面"),
                summary: window.wgULS("注意:创建不当页面", "注意:建立不當頁面")
              },
              level2: {
                label: window.wgULS("创建不当页面", "建立不當頁面"),
                summary: window.wgULS("警告:创建不当页面", "警告:建立不當頁面")
              }
            },
            "uw-nor": {
              level1: {
                label: window.wgULS("在条目中加入原创研究", "在條目中加入原創研究"),
                summary: window.wgULS("注意:在条目中加入原创研究", "注意:在條目中加入原創研究")
              },
              level2: {
                label: window.wgULS("在条目中加入原创研究", "在條目中加入原創研究"),
                summary: window.wgULS("警告:在条目中加入原创研究", "警告:在條目中加入原創研究")
              }
            },
            "uw-opov": {
              level1: {
                label: window.wgULS("违反客观原则", "違反客觀原則"),
                summary: window.wgULS("注意:违反客观原则", "注意:違反客觀原則")
              },
              level2: {
                label: window.wgULS("违反客观原则", "違反客觀原則"),
                summary: window.wgULS("警告:违反客观原则", "警告:違反客觀原則")
              }
            },
            "uw-redirect": {
              level1: {
                label: window.wgULS("创建破坏性的重定向", "建立破壞性的重定向"),
                summary: window.wgULS("注意:创建破坏性的重定向", "注意:建立破壞性的重定向")
              },
              level2: {
                label: window.wgULS("创建恶意重定向", "建立惡意重定向"),
                summary: window.wgULS("警告:创建恶意重定向", "警告:建立惡意重定向")
              }
            },
            "uw-upload": {
              level1: {
                label: window.wgULS("上传不当图像", "上傳不當圖像"),
                summary: window.wgULS("注意:上传不当图像", "注意:上傳不當圖像")
              },
              level2: {
                label: window.wgULS("上传不当图像", "上傳不當圖像"),
                summary: window.wgULS("警告:上传不当图像", "警告:上傳不當圖像")
              }
            },
            "uw-vandalism": {
              level1: {
                label: window.wgULS("明显的破坏", "明顯的破壞"),
                summary: window.wgULS("注意:明显破坏", "注意:明顯破壞")
              },
              level2: {
                label: window.wgULS("明显的破坏", "明顯的破壞"),
                summary: window.wgULS("警告:明显破坏", "警告:明顯破壞")
              }
            },
            "uw-tdel": {
              level1: {
                label: window.wgULS("在问题仍未解决的情况下移除维护性模板", "在問題仍未解決的情況下移除維護性模板"),
                summary: window.wgULS("注意:移除维护性模板", "注意:移除維護性模板")
              },
              level2: {
                label: window.wgULS("在问题仍未解决的情况下移除维护性模板", "在問題仍未解決的情況下移除維護性模板"),
                summary: window.wgULS("警告:移除维护性模板", "警告:移除維護性模板")
              }
            }
          }
        }, {
          category: window.wgULS("增加广告", "增加廣告"),
          list: {
            "uw-spam": {
              level1: {
                label: window.wgULS("增加不合适的外部链接", "增加不合適的外部連結"),
                summary: window.wgULS("注意:增加不合适的外部链接", "注意:增加不合適的外部連結")
              },
              level2: {
                label: window.wgULS("增加垃圾链接", "增加垃圾連結"),
                summary: window.wgULS("警告:增加垃圾链接", "警告:增加垃圾連結")
              }
            },
            "uw-advert": {
              level1: {
                label: window.wgULS("利用求闻百科来发布广告或推广", "利用求聞百科來發布廣告或推廣"),
                summary: window.wgULS("注意:利用求闻百科来发布广告或推广", "注意:利用求聞百科來發布廣告或推廣")
              },
              level2: {
                label: window.wgULS("利用求闻百科来发布广告或推广", "利用求聞百科來發布廣告或推廣"),
                summary: window.wgULS("警告:利用求闻百科来发布广告或推广", "警告:利用求聞百科來發布廣告或推廣")
              }
            }
          }
        }, {
          category: window.wgULS("加插不实、诽谤文字", "加插不實、誹謗文字"),
          list: {
            "uw-biog": {
              level1: {
                label: window.wgULS("在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容"),
                summary: window.wgULS("注意:在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "注意:在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容")
              },
              level2: {
                label: window.wgULS("在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容"),
                summary: window.wgULS("警告:在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "警告:在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容")
              }
            },
            "uw-error": {
              level1: {
                label: window.wgULS("故意加入不实内容", "故意加入不實內容"),
                summary: window.wgULS("注意:故意加入不实内容", "注意:故意加入不實內容")
              },
              level2: {
                label: window.wgULS("故意加入不实内容", "故意加入不實內容"),
                summary: window.wgULS("警告:故意加入不实内容", "警告:故意加入不實內容")
              }
            },
            "uw-unsourced": {
              level1: {
                label: window.wgULS("加入没有可靠来源佐证的内容", "加入沒有可靠來源佐證的內容"),
                summary: window.wgULS("注意:加入没有可靠来源佐证的内容", "注意:加入沒有可靠來源佐證的內容")
              },
              level2: {
                label: window.wgULS("加入没有可靠来源佐证的内容", "加入沒有可靠來源佐證的內容"),
                summary: window.wgULS("警告:加入没有可靠来源佐证的内容", "警告:加入沒有可靠來源佐證的內容")
              }
            }
          }
        }, {
          category: window.wgULS("翻译品质", "翻譯品質"),
          list: {
            "uw-roughtranslation": {
              level1: {
                label: window.wgULS("您翻译的质量有待改善", "您翻譯的質量有待改善"),
                summary: window.wgULS("注意:您翻译的质量有待改善", "注意:您翻譯的質量有待改善")
              },
              level2: {
                label: window.wgULS("粗劣翻译", "粗劣翻譯"),
                summary: window.wgULS("警告:粗劣翻译", "警告:粗劣翻譯")
              }
            }
          }
        }, {
          category: window.wgULS("非能接受且违反方针的单方面行为或操作", "非能接受且違反方針的單方面行為或操作"),
          list: {
            "uw-afd": {
              level1: {
                label: window.wgULS("移除{{afd}}(页面存废讨论)模板", "移除{{afd}}(頁面存廢討論)模板"),
                summary: window.wgULS("注意:移除{{afd}}(页面存废讨论)模板", "注意:移除{{afd}}(頁面存廢討論)模板")
              },
              level2: {
                label: window.wgULS("移除{{afd}}(页面存废讨论)模板", "移除{{afd}}(頁面存廢討論)模板"),
                summary: window.wgULS("警告:移除{{afd}}(页面存废讨论)模板", "警告:移除{{afd}}(頁面存廢討論)模板")
              }
            },
            "uw-mos": {
              level1: {
                label: window.wgULS("不恰当的条目格式、日期、语言等", "不恰當的條目格式、日期、語言等"),
                summary: window.wgULS("注意:不恰当的条目格式、日期、语言等", "注意:不恰當的條目格式、日期、語言等")
              },
              level2: {
                label: window.wgULS("不恰当的条目格式、日期、语言等", "不恰當的條目格式、日期、語言等"),
                summary: window.wgULS("警告:不恰当的条目格式、日期、语言等", "警告:不恰當的條目格式、日期、語言等")
              }
            },
            "uw-move": {
              level1: {
                label: window.wgULS("无故移动条目/新名称不符合命名规范", "無故移動條目/新名稱不符合命名規範"),
                summary: window.wgULS("注意:不恰当地移动页面", "注意:不恰當地移動頁面")
              },
              level2: {
                label: window.wgULS("把页面移动到不恰当、违反命名常规或违反共识的标题", "把頁面移動到不恰當、違反命名常規或違反共識的標題"),
                summary: window.wgULS("警告:不恰当地移动页面", "警告:不恰當地移動頁面")
              }
            },
            "uw-speedy": {
              level1: {
                label: window.wgULS("移除{{delete}}(快速删除)模板", "移除{{delete}}(快速刪除)模板"),
                summary: window.wgULS("注意:移除{{delete}}(快速删除)模板", "注意:移除{{delete}}(快速刪除)模板")
              },
              level2: {
                label: window.wgULS("移除{{delete}}(快速删除)模板", "移除{{delete}}(快速刪除)模板"),
                summary: window.wgULS("警告:移除{{delete}}(快速删除)模板", "警告:移除{{delete}}(快速刪除)模板")
              }
            },
            "uw-talkpage": {
              level1: {
                label: window.wgULS("违反讨论页规范", "違反討論頁規範"),
                summary: window.wgULS("注意:违反讨论页规范", "注意:違反討論頁規範")
              },
              level2: {
                label: window.wgULS("违反讨论页规范", "違反討論頁規範"),
                summary: window.wgULS("警告:违反讨论页规范", "警告:違反討論頁規範")
              }
            },
            "uw-tpv": {
              level1: {
                label: "修改他人留言",
                summary: "注意:修改他人留言"
              },
              level2: {
                label: "修改他人留言",
                summary: "警告:修改他人留言"
              }
            }
          }
        }, {
          category: window.wgULS("对其他用户和条目的态度", "對其他用戶和條目的態度"),
          list: {
            "uw-illegal": {
              level1: {
                label: window.wgULS("加入不符合中国价值观的内容", "加入不符合中國價值觀的內容"),
                summary: window.wgULS("注意:加入不符合中国价值观的内容", "注意:加入不符合中國價值觀的內容")
              },
              level2: {
                label: window.wgULS("加入不符合中国价值观的内容", "加入不符合中國價值觀的內容"),
                summary: window.wgULS("警告:加入不符合中国价值观的内容", "警告:加入不符合中國價值觀的內容")
              }
            },
            "uw-own": {
              level1: {
                label: window.wgULS("主张条目所有权", "主張條目所有權"),
                summary: window.wgULS("注意:主张条目所有权", "注意:主張條目所有權")
              },
              level2: {
                label: window.wgULS("主张条目的所有权", "主張條目的所有權"),
                summary: window.wgULS("警告:主张条目的所有权", "警告:主張條目的所有權")
              }
            },
            "uw-socialmedia": {
              level1: {
                label: window.wgULS("将求闻百科当作社交媒体使用", "將求聞百科當作社交媒體使用"),
                summary: window.wgULS("注意:将求闻百科当作社交媒体使用", "注意:將求聞百科當作社交媒體使用")
              },
              level2: {
                label: window.wgULS("将求闻百科当作社交媒体使用", "將求聞百科當作社交媒體使用"),
                summary: window.wgULS("警告:将求闻百科当作社交媒体使用", "警告:將求聞百科當作社交媒體使用")
              }
            }
          }
        }],
        singlenotice: {
          "uw-2redirect": {
            label: window.wgULS("在移动页面后应该修复双重重定向", "在移動頁面後應該修復雙重重定向"),
            summary: window.wgULS("注意:在移动页面后应该修复双重重定向", "注意:在移動頁面後應該修復雙重重定向")
          },
          "uw-aiv": {
            label: window.wgULS("举报事项并不是破坏行为", "舉報事項並不是破壞行为"),
            summary: window.wgULS("注意:不恰当地举报破坏", "注意:不恰當地舉報破壞")
          },
          "uw-articlesig": {
            label: window.wgULS("在条目中签名", "在條目中簽名"),
            summary: window.wgULS("注意:在条目中签名", "注意:在條目中簽名")
          },
          "uw-autobiography": {
            label: window.wgULS("创建自传", "建立自傳"),
            summary: window.wgULS("注意:创建自传", "注意:建立自傳")
          },
          "uw-badcat": {
            label: window.wgULS("加入错误的页面分类", "加入錯誤的頁面分類"),
            summary: window.wgULS("注意:加入错误的页面分类", "注意:加入錯誤的頁面分類")
          },
          "uw-bite": {
            label: window.wgULS("伤害新手", "傷害新手"),
            summary: window.wgULS("注意:伤害新手", "注意:傷害新手")
          },
          "uw-chinese": {
            label: window.wgULS("请使用标准汉语沟通", "請使用標準漢語溝通"),
            summary: window.wgULS("注意:请使用标准汉语沟通", "注意:請使用標準漢語溝通")
          },
          "uw-cpmove": {
            label: window.wgULS("剪贴移动", "剪貼移動"),
            summary: window.wgULS("注意:剪贴移动", "注意:剪貼移動")
          },
          "uw-dab": {
            label: window.wgULS("消歧义页格式错误", "消歧義頁格式錯誤"),
            summary: window.wgULS("注意:消歧义页格式错误", "注意:消歧義頁格式錯誤")
          },
          "uw-newpage-draft": {
            label: window.wgULS("最近创建的页面被移动到草稿", "最近建立的頁面被移動到草稿"),
            summary: window.wgULS("注意:最近创建的页面被移动到草稿", "注意:最近建立的頁面被移動到草稿")
          },
          "uw-selfrevert": {
            label: window.wgULS("感谢您自行回退自己的测试,以后不要再这样做了", "感謝您自行回退自己的測試,以後不要再這樣做了"),
            summary: window.wgULS("注意:回退个人的测试", "注意:回退個人的測試")
          },
          "uw-substub": {
            label: window.wgULS("创建小小作品", "建立小小作品"),
            summary: window.wgULS("警告:创建小小作品", "警告:建立小小作品")
          },
          "uw-talkinarticle": {
            label: window.wgULS("在条目页中留下意见", "在條目頁中留下意見"),
            summary: window.wgULS("注意:在条目页中留下意见", "注意:在條目頁中留下意見")
          },
          "uw-unsigned": {
            label: window.wgULS("没有在讨论页上签名", "沒有在討論頁上簽名"),
            summary: window.wgULS("注意:没有在讨论页上签名", "注意:沒有在討論頁上簽名")
          },
          "uw-wrongcsd": {
            label: window.wgULS("快速删除理由不当", "快速刪除理由不當"),
            summary: window.wgULS("注意:快速删除理由不当", "注意:快速刪除理由不當")
          },
          "uw-wrongsummary": {
            label: window.wgULS("在编辑摘要制造不适当的内容", "在編輯摘要製造不適當的內容"),
            summary: window.wgULS("警告:在编辑摘要制造不适当的内容", "警告:在編輯摘要製造不適當的內容")
          }
        },
        singlewarn: {
          "uw-3rr": {
            label: window.wgULS("用户潜在违反回退不过三原则的可能性", "用戶潛在違反回退不過三原則的可能性"),
            summary: window.wgULS("警告:用户潜在违反回退不过三原则的可能性", "警告:用戶潛在違反回退不過三原則的可能性")
          },
          "uw-attack": {
            label: window.wgULS("人身攻击", "人身攻擊"),
            summary: window.wgULS("警告:人身攻击", "警告:人身攻擊"),
            suppressArticleInSummary: true
          },
          "uw-coi": {
            label: window.wgULS("利益冲突", "利益衝突"),
            summary: window.wgULS("注意:利益冲突", "注意:利益衝突")
          },
          "uw-fakesource": {
            label: window.wgULS("虚构数据源或引文", "虛構資料來源或引文"),
            summary: window.wgULS("警告:虚构数据源或引文", "警告:虛構資料來源或引文")
          },
          "uw-pinfo": {
            label: window.wgULS("张贴他人隐私", "張貼他人隱私"),
            summary: window.wgULS("警告:张贴他人隐私", "警告:張貼他人隱私")
          }
        }
      };
      Twinkle.warn.prev_article = null;
      Twinkle.warn.prev_reason = null;
      Twinkle.warn.talkpageObj = null;
      Twinkle.warn.callback.change_category = function change_category(e) {
        const {
          value
        } = e.target;
        const {
          sub_group
        } = e.target.root;
        sub_group.main_group = value;
        let old_subvalue = sub_group.value;
        let old_subvalue_re;
        if (old_subvalue) {
          if (value === "kitchensink") {
            old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue));
          } else {
            old_subvalue = old_subvalue.replace(/\d*(im)?$/, "");
            old_subvalue_re = new RegExp("".concat(mw.util.escapeRegExp(old_subvalue), "(\\d*?)$"));
          }
        }
        while (sub_group.hasChildNodes()) {
          sub_group.removeChild(sub_group.firstChild);
        }
        let selected = false;
        const createEntries = (contents, container, wrapInOptgroup, val = value) => {
          const level = val.replace(/^\D+/g, "");
          if (wrapInOptgroup && $.client.profile().platform === "iphone") {
            let wrapperOptgroup = new Morebits.quickForm.element({
              type: "optgroup",
              label: "可用模板"
            });
            wrapperOptgroup = wrapperOptgroup.render();
            container.appendChild(wrapperOptgroup);
            container = wrapperOptgroup;
          }
          for (var _i2 = 0, _Object$entries = Object.entries(contents); _i2 < _Object$entries.length; _i2++) {
            const [itemKey, itemProperties] = _Object$entries[_i2];
            if (!!level && !itemProperties[val]) {
              return;
            }
            const key = typeof itemKey === "string" ? itemKey : itemProperties.value;
            const template = key + level;
            const elem = new Morebits.quickForm.element({
              type: "option",
              label: "{{".concat(template, "}}: ").concat(level ? itemProperties[val].label : itemProperties.label),
              value: template
            });
            if (!selected && old_subvalue && old_subvalue_re.test(template)) {
              elem.data.selected = true;
              selected = true;
            }
            const elemRendered = container.appendChild(elem.render());
            $(elemRendered).data("messageData", itemProperties);
          }
        };
        switch (value) {
          case "singlenotice":
          case "singlewarn":
            createEntries(Twinkle.warn.messages[value], sub_group, true);
            break;
          case "singlecombined": {
            const unSortedSinglets = {
              ...Twinkle.warn.messages.singlenotice,
              ...Twinkle.warn.messages.singlewarn
            };
            const sortedSingletMessages = {};
            var _iterator3 = _createForOfIteratorHelper(Object.keys(unSortedSinglets).sort()), _step3;
            try {
              for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) {
                const key = _step3.value;
                sortedSingletMessages[key] = unSortedSinglets[key];
              }
            } catch (err) {
              _iterator3.e(err);
            } finally {
              _iterator3.f();
            }
            createEntries(sortedSingletMessages, sub_group, true);
            break;
          }
          case "custom":
            createEntries(Twinkle.getPref("customWarningList"), sub_group, true);
            break;
          case "kitchensink":
            for (var _i3 = 0, _arr = ["level1", "level2"]; _i3 < _arr.length; _i3++) {
              const lvl = _arr[_i3];
              var _iterator4 = _createForOfIteratorHelper(Twinkle.warn.messages.levels), _step4;
              try {
                for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) {
                  const levelGroup = _step4.value;
                  createEntries(levelGroup.list, sub_group, true, lvl);
                }
              } catch (err) {
                _iterator4.e(err);
              } finally {
                _iterator4.f();
              }
            }
            createEntries(Twinkle.warn.messages.singlenotice, sub_group, true);
            createEntries(Twinkle.warn.messages.singlewarn, sub_group, true);
            createEntries(Twinkle.getPref("customWarningList"), sub_group, true);
            break;
          case "level1":
          case "level2":
            var _iterator5 = _createForOfIteratorHelper(Twinkle.warn.messages.levels), _step5;
            try {
              for (_iterator5.s(); !(_step5 = _iterator5.n()).done; ) {
                const levelGroup = _step5.value;
                let optgroup = new Morebits.quickForm.element({
                  type: "optgroup",
                  label: levelGroup.category
                });
                optgroup = optgroup.render();
                sub_group.appendChild(optgroup);
                createEntries(levelGroup.list, optgroup, false);
              }
            } catch (err) {
              _iterator5.e(err);
            } finally {
              _iterator5.f();
            }
            break;
          case "autolevel": {
            const autolevelProc = () => {
              const wikitext = Twinkle.warn.talkpageObj.getPageText();
              const [latest] = Twinkle.warn.callbacks.dateProcessing(wikitext);
              const params = {
                sub_group: old_subvalue,
                article: e.target.root.article.value
              };
              const lvl = "level".concat(Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest)[1]);
              var _iterator6 = _createForOfIteratorHelper(Twinkle.warn.messages.levels), _step6;
              try {
                for (_iterator6.s(); !(_step6 = _iterator6.n()).done; ) {
                  const levelGroup = _step6.value;
                  let optgroup = new Morebits.quickForm.element({
                    type: "optgroup",
                    label: levelGroup.category
                  });
                  optgroup = optgroup.render();
                  sub_group.appendChild(optgroup);
                  createEntries(levelGroup.list, optgroup, false, lvl);
                }
              } catch (err) {
                _iterator6.e(err);
              } finally {
                _iterator6.f();
              }
              Twinkle.warn.callback.postCategoryCleanup(e);
            };
            if (Twinkle.warn.talkpageObj) {
              autolevelProc();
            } else {
              const usertalk_page = new Morebits.wiki.page("User_talk:".concat(relevantUserName), window.wgULS("加载上次警告", "載入上次警告"));
              usertalk_page.setFollowRedirect(true, false);
              usertalk_page.load((pageobj) => {
                Twinkle.warn.talkpageObj = pageobj;
                autolevelProc();
              }, () => {
                const $noTalkPageNode = $("<strong>").attr("id", "twinkle-warn-autolevel-message").css("color", "#f00").text(window.wgULS("无法加载用户讨论页,这可能是因为它是跨命名空间重定向,自动选择警告级别将不会运作。", "無法載入使用者討論頁,這可能是因為它是跨命名空間重新導向,自動選擇警告級別將不會運作。"));
                $noTalkPageNode.insertBefore($body.find("#twinkle-warn-warning-messages"));
                e.target.root.previewer.closePreview();
              });
            }
            break;
          }
          default:
            void mw.notify(window.wgULS("twinklewarn:未知的警告组", "twinklewarn:未知的警告組"), {
              type: "warn",
              tag: "twinklewarn"
            });
            break;
        }
        if (value !== "autolevel") {
          $body.find("#twinkle-warn-autolevel-message").remove();
          Twinkle.warn.callback.postCategoryCleanup(e);
        }
      };
      Twinkle.warn.callback.postCategoryCleanup = (e) => {
        Morebits.quickForm.setElementTooltipVisibility(e.target.root.article, true);
        Morebits.quickForm.resetElementLabel(e.target.root.article);
        Twinkle.warn.callback.change_subcategory(e);
        if (!Twinkle.getPref("oldSelect")) {
          $body.find("select[name=sub_group]").select2({
            width: "100%",
            matcher: Morebits.select2.matchers.optgroupFull,
            templateResult: Morebits.select2.highlightSearchMatches,
            language: {
              searching: Morebits.select2.queryInterceptor
            }
          }).change(Twinkle.warn.callback.change_subcategory);
          $body.find(".select2-selection").on("keydown", Morebits.select2.autoStart).trigger("focus");
          mw.util.addCSS(
            /* Increase height;
             * Reduce padding;
             * Adjust font size.
             * */
            ".select2-container .select2-dropdown .select2-results>.select2-results__options{max-height:350px}.select2-results .select2-results__group,.select2-results .select2-results__option{padding-top:1px;padding-bottom:1px}.select2-container .select2-dropdown .select2-results,.select2-container .selection .select2-selection__rendered{font-size:13px}"
          );
        }
      };
      Twinkle.warn.callback.change_subcategory = (e) => {
        const main_group = e.target.form.main_group.value;
        const {
          value
        } = e.target.form.sub_group;
        const notLinkedArticle = {
          "uw-bite": window.wgULS("被“咬到”的用户(不含User:) ", "被「咬到」的使用者(不含User:) "),
          "uw-aiv": window.wgULS("可选输入被警告的用户名(不含User:) ", "可選輸入被警告的使用者名稱(不含User:) ")
        };
        if (["singlenotice", "singlewarn", "singlecombined", "kitchensink"].includes(main_group)) {
          if (notLinkedArticle[value]) {
            if (Twinkle.warn.prev_article === null) {
              Twinkle.warn.prev_article = e.target.form.article.value;
            }
            e.target.form.article.notArticle = true;
            e.target.form.article.value = "";
            Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);
            Morebits.quickForm.overrideElementLabel(e.target.form.article, notLinkedArticle[value]);
          } else if (e.target.form.article.notArticle) {
            if (Twinkle.warn.prev_article !== null) {
              e.target.form.article.value = Twinkle.warn.prev_article;
              Twinkle.warn.prev_article = null;
            }
            e.target.form.article.notArticle = false;
            Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, true);
            Morebits.quickForm.resetElementLabel(e.target.form.article);
          }
        }
        $body.find("#tw-warn-red-notice").remove();
      };
      Twinkle.warn.callbacks = {
        getWarningWikitext: (templateName, article, reason, isCustom, noSign) => {
          let text = "{{".concat("subst:", templateName);
          if (article) {
            text += "|1=".concat(article);
          }
          if (reason) {
            text += "|2=".concat(reason);
          }
          text += "|subst=".concat("subst:");
          if (!noSign) {
            text += "|sig=~~".concat("~~");
          }
          text += "}}";
          return text;
        },
        showPreview: (form, templatename) => {
          const input = Morebits.quickForm.getInputData(form);
          templatename || (templatename = input.sub_group);
          const linkedarticle = input.article;
          const templatetext = Twinkle.warn.callbacks.getWarningWikitext(templatename, linkedarticle, input.reason, input.main_group === "custom");
          form.previewer.beginRender(templatetext, "User_talk:".concat(relevantUserName));
        },
        // Just a pass-through unless the autolevel option was selected
        preview: (form) => {
          if (form.main_group.value === "autolevel") {
            const usertalk_page = new Morebits.wiki.page("User_talk:".concat(relevantUserName), window.wgULS("加载上次警告", "載入上次警告"));
            usertalk_page.setFollowRedirect(true, false);
            usertalk_page.load((pageobj) => {
              Twinkle.warn.talkpageObj = pageobj;
              const wikitext = pageobj.getPageText();
              const [latest] = Twinkle.warn.callbacks.dateProcessing(wikitext);
              const params = {
                sub_group: form.sub_group.value,
                article: form.article.value,
                messageData: $(form.sub_group).find('option[value="'.concat($(form.sub_group).val(), '"]')).data("messageData")
              };
              const [template] = Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest);
              Twinkle.warn.callbacks.showPreview(form, template);
              if (form.sub_group.value !== template) {
                const evt = document.createEvent("Event");
                evt.initEvent("change", true, true);
                form.main_group.dispatchEvent(evt);
              }
            });
          } else {
            Twinkle.warn.callbacks.showPreview(form);
          }
        },
        /**
         * Used in the main and autolevel loops to determine when to warn
         * about excessively recent, stale, or identical warnings.
         *
         * @param {string} wikitext  The text of a user's talk page, from getPageText()
         * @returns {Object[]} - Array of objects: latest contains most recent
         * warning and date; history lists all prior warnings
         */
        dateProcessing: (wikitext) => {
          const history_re = /<!--\s?Template:([uU]w-.*?)\s?-->.*?(\d{4})年(\d{1,2})月(\d{1,2})日 \([日一二三四五六]\) (\d{1,2}):(\d{1,2}) \(CST\)/g;
          const history = {};
          const latest = {
            date: new Morebits.date(0),
            type: ""
          };
          let current;
          while ((current = history_re.exec(wikitext)) !== null) {
            const [, template] = current;
            const current_date = new Morebits.date("".concat(current[2], "-").concat(current[3], "-").concat(current[4], " ").concat(current[5], ":").concat(current[6], " (CST)"));
            if (!(template in history) || history[template].isBefore(current_date)) {
              history[template] = current_date;
            }
            if (!latest.date.isAfter(current_date)) {
              latest.date = current_date;
              latest.type = template;
            }
          }
          return [latest, history];
        },
        /**
         * Main loop for deciding what the level should increment to. Most of
         * this is really just error catching and updating the subsequent data.
         * May produce up to two notices in a twinkle-warn-autolevel-messages div
         *
         * @param {string} wikitext  The text of a user's talk page, from getPageText() (required)
         * @param {Object} params  Params object: sub_group is the template (required);
         * article is the user-provided article (form.article) used to link ARV on recent level2 warnings;
         * messageData is only necessary if getting the full template, as it's
         * used to ensure a valid template of that level exists
         * @param {Object} latest  First element of the array returned from
         * dateProcessing. Provided here rather than processed within to avoid
         * repeated call to dateProcessing
         * @param {(Date|Morebits.date)} date  Date from which staleness is determined
         * @param {Morebits.status} statelem  Status element, only used for handling error in final execution
         *
         * @returns {Array} - Array that contains the full template and just the warning level
         */
        autolevelParseWikitext: (wikitext, params, latest, date, statelem) => {
          let level;
          if (/\d?$/.test(latest.type)) {
            level = Number.parseInt(latest.type.replace(/.*(\d)?$/, "$1"), 10);
          } else if (latest.type) {
            level = 1;
          }
          const $autolevelMessage = $("<div>").attr("id", "twinkle-warn-autolevel-message");
          if (Number.isNaN(level)) {
            level = 1;
          } else if (level > 2 || level < 1) {
            const message = window.wgULS("无法解析上次的警告层级,请手动选择一个警告层级。", "無法解析上次的警告層級,請手動選擇一個警告層級。");
            if (statelem) {
              statelem.error(message);
            } else {
              void mw.notify(message, {
                type: "warn",
                tag: "twinklewarn"
              });
            }
            return;
          } else {
            date || (date = /* @__PURE__ */ new Date());
            const autoTimeout = new Morebits.date(latest.date.getTime()).add(Number.parseInt(Twinkle.getPref("autolevelStaleDays"), 10), "day");
            if (autoTimeout.isAfter(date)) {
              if (level === 2) {
                level = 2;
                if (!statelem) {
                  const $link = $("<a>").attr("href", "#").text(window.wgULS("单击此处打开告状工具", "點擊此處打開告狀工具")).css("font-weight", "bold").on("click", () => {
                    Morebits.wiki.actionCompleted.redirect = null;
                    Twinkle.warn.dialog.close();
                    Twinkle.arv.callback(relevantUserName);
                    $body.find("input[name=page]").val(params.article);
                    $body.find("input[value=final]").prop("checked", true);
                  });
                  const statusNode = $("<div>").css("color", "#f00").text(relevantUserName + window.wgULS("最后收到了一个层级2警告(", "最後收到了一個層級2警告(") + latest.type + window.wgULS("),所以将其报告给管理人员会比较好;", "),所以將其報告給管理人員會比較好;"));
                  statusNode.append($link[0]);
                  $autolevelMessage.append(statusNode);
                }
              } else {
                level += 1;
              }
            } else {
              level = 1;
            }
          }
          $autolevelMessage.prepend($("<div>".concat(window.wgULS("将发送", "將發送"), '<span style="font-weight: bold;">').concat(window.wgULS("层级", "層級")).concat(level, "</span>警告模板。</div>")));
          $body.find("#twinkle-warn-autolevel-message").remove();
          $autolevelMessage.insertAfter($body.find("#twinkle-warn-warning-messages"));
          let template = params.sub_group.replace(/(.*)\d$/, "$1");
          if (params.messageData && !params.messageData["level".concat(level)]) {
            template = "uw-generic";
          }
          template += level;
          return [template, level];
        },
        main: (pageobj) => {
          const text = pageobj.getPageText();
          const statelem = pageobj.getStatusElement();
          const params = pageobj.getCallbackParameters();
          let {
            messageData
          } = params;
          const warningHistory = Twinkle.warn.callbacks.dateProcessing(text);
          const [latest, history] = warningHistory;
          const now = new Morebits.date(pageobj.getLoadTime());
          Twinkle.warn.talkpageObj = pageobj;
          if (params.main_group === "autolevel") {
            const templateAndLevel = Twinkle.warn.callbacks.autolevelParseWikitext(text, params, latest, now, statelem);
            if (params.sub_group !== templateAndLevel[0] && !confirm(window.wgULS("将发送给用户{{", "將發送給使用者{{") + templateAndLevel[0] + window.wgULS("}}模板,好吗?", "}}模板,好嗎?"))) {
              statelem.error(window.wgULS("用户取消", "使用者取消"));
              return;
            }
            [params.sub_group] = templateAndLevel;
            messageData = params.messageData["level".concat(templateAndLevel[1])];
          } else if (params.sub_group in history && new Morebits.date(history[params.sub_group]).add(1, "day").isAfter(now) && !confirm(window.wgULS("近24小时内一个同样的 ", "近24小時內一個同樣的 ") + params.sub_group + window.wgULS(" 模板已被发出。\n是否继续?", " 模板已被發出。\n是否繼續?"))) {
            statelem.error(window.wgULS("用户取消", "使用者取消"));
            return;
          }
          latest.date.add(1, "minute");
          if (latest.date.isAfter(now) && !confirm(window.wgULS("近1分钟内 ", "近1分鐘內 ") + latest.type + window.wgULS(" 模板已被发出。\n是否继续?", " 模板已被發出。\n是否繼續?"))) {
            statelem.error(window.wgULS("用户取消", "使用者取消"));
            return;
          }
          const customProcess = (template) => {
            [template] = template.split("|");
            let prefix;
            switch (template.slice(-1)) {
              case "1":
                prefix = "注意";
                break;
              case "2":
                prefix = "警告";
                break;
              default:
                prefix = "提醒";
                break;
            }
            return "".concat(prefix, ":").concat(Morebits.string.toUpperCaseFirstChar(messageData.label));
          };
          let summary;
          if (params.main_group === "custom") {
            summary = customProcess(params.sub_group);
          } else {
            if (params.main_group === "kitchensink" && !/^D+$/.test(params.sub_group)) {
              let sub = params.sub_group.slice(-1);
              if (sub === "m") {
                sub = params.sub_group.slice(-3);
              }
              if (/\d/.test(sub)) {
                params.main_group = "level".concat(sub);
              }
            }
            summary = messageData.summary || messageData[params.main_group] && messageData[params.main_group].summary;
            if (!summary) {
              summary = customProcess(params.sub_group);
            }
            if (messageData.suppressArticleInSummary !== true && params.article) {
              if (params.sub_group === "uw-aiv") {
                summary += "(".concat(window.wgULS("对于", "對於"), "[[User:").concat(params.article, "]])");
              } else if (params.sub_group === "uw-bite") {
                summary += ",".concat(window.wgULS("于", "於"), "[[User talk:").concat(params.article, "]]");
              } else {
                summary += "".concat(window.wgULS(",于[[", ",於[[") + params.article, "]]");
              }
            }
          }
          pageobj.setEditSummary(summary);
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setWatchlist(Twinkle.getPref("watchWarnings"));
          const warningText = Twinkle.warn.callbacks.getWarningWikitext(params.sub_group, params.article, params.reason, params.main_group === "custom");
          let sectionExists = false;
          let sectionNumber = 0;
          if (!messageData.heading && text.length) {
            const sections = text.match(/^(==*).+\1/gm);
            if (sections && sections.length !== 0) {
              const dateHeaderRegex = now.monthHeaderRegex();
              sectionNumber = 0;
              sectionExists = sections.reverse().some((sec, idx) => {
                return /^(==)[^=].+\1/m.test(sec) && dateHeaderRegex.test(sec) && typeof (sectionNumber = sections.length - 1 - idx) === "number";
              });
            }
          }
          if (sectionExists) {
            pageobj.setPageSection(sectionNumber + 1);
            pageobj.setAppendText("\n\n".concat(warningText));
            pageobj.append();
          } else {
            if (messageData.heading) {
              pageobj.setNewSectionTitle(messageData.heading);
            } else {
              Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("未找到当月的二级标题,将创建新的", "未找到當月的二級標題,將建立新的"));
              pageobj.setNewSectionTitle(now.monthHeader(0));
            }
            pageobj.setNewSectionText(warningText);
            pageobj.newSection();
          }
        }
      };
      Twinkle.warn.callback.evaluate = (e) => {
        const userTalkPage = "User_talk:".concat(relevantUserName);
        const params = Morebits.quickForm.getInputData(e.target);
        if (params.article) {
          if (/https?:\/\//.test(params.article)) {
            void mw.notify(window.wgULS("“页面链接”不能使用网址。", "「頁面連結」不能使用網址。"), {
              type: "warn",
              tag: "warn"
            });
            return;
          }
          try {
            const article = new mw.Title(params.article);
            params.article = article.getPrefixedText();
            if (article.getFragment()) {
              params.article += "#".concat(article.getFragment());
            }
          } catch {
            alert(window.wgULS("“页面链接”不合法,仅能输入一个页面名称,勿使用网址、[[ ]],可使用Special:Diff。", "「頁面連結」不合法,僅能輸入一個頁面名稱,勿使用網址、[[ ]],可使用Special:Diff。"));
            return;
          }
        }
        const $selectedEl = $(e.target.sub_group).find('option[value="'.concat($(e.target.sub_group).val(), '"]'));
        params.messageData = $selectedEl.data("messageData");
        if (params.messageData === void 0) {
          void mw.notify(window.wgULS("请选择警告模板。", "請選擇警告模板。"), {
            type: "warn",
            tag: "warn"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(e.target);
        Morebits.wiki.actionCompleted.redirect = userTalkPage;
        Morebits.wiki.actionCompleted.notice = window.wgULS("警告完成,将在几秒后刷新", "警告完成,將在幾秒後重新整理");
        const qiuwen_page = new Morebits.wiki.page(userTalkPage, window.wgULS("用户讨论页修改", "使用者討論頁修改"));
        qiuwen_page.setCallbackParameters(params);
        qiuwen_page.setFollowRedirect(true, false);
        qiuwen_page.load(Twinkle.warn.callbacks.main);
      };
      Twinkle.addInitCallback(Twinkle.warn, "warn");
    })(jQuery);
  }
});
//! src/Twinkle/modules/api.ts
var import_ext_gadget;
var api;
var init_api = __esm({
  "src/Twinkle/modules/api.ts"() {
    "use strict";
    import_ext_gadget = require("ext.gadget.Util");
    api = (0, import_ext_gadget.initMwApi)("morebits.js; Twinkle/1.1");
  }
});
//! src/Twinkle/modules/twinkleblock.js
var twinkleblock_exports = {};
var import_ext_gadget2;
var init_twinkleblock = __esm({
  "src/Twinkle/modules/twinkleblock.js"() {
    "use strict";
    init_api();
    import_ext_gadget2 = require("ext.gadget.Util");
    /*! Twinkle.js - twinkleblock.js */
    (function twinkleblock($) {
      const $body = $("body");
      let relevantUserName;
      let blockedUserName;
      const menuFormattedNamespaces = {
        ...mw.config.get("wgFormattedNamespaces")
      };
      menuFormattedNamespaces[0] = window.wgULS("(条目)", "(條目)");
      const blockActionText = {
        block: window.wgULS("封禁", "封鎖"),
        reblock: window.wgULS("重新封禁", "重新封鎖"),
        unblock: window.wgULS("解除封禁", "解除封鎖")
      };
      Twinkle.block = () => {
        relevantUserName = mw.config.get("wgRelevantUserName");
        if ((Morebits.userIsSysop || !mw.util.isIPAddress(relevantUserName, true)) && relevantUserName && (!Morebits.ip.isRange(relevantUserName) || Morebits.ip.validCIDR(relevantUserName))) {
          Twinkle.addPortletLink(Twinkle.block.callback, window.wgULS("封禁", "封鎖"), "tw-block", window.wgULS("封禁相关用户", "封鎖相關使用者"));
        }
      };
      Twinkle.block.callback = () => {
        if (relevantUserName === mw.config.get("wgUserName") && !confirm(window.wgULS("您即将对自己执行封禁相关操作!确认要继续吗?", "您即將對自己執行封鎖相關操作!確認要繼續嗎?"))) {
          return;
        }
        Twinkle.block.currentBlockInfo = void 0;
        Twinkle.block.field_block_options = {};
        Twinkle.block.field_template_options = {};
        const Window = new Morebits.simpleWindow(650, 530);
        Window.setTitle(window.wgULS("封禁或向", "封鎖或向") + relevantUserName + window.wgULS("发出封禁模板", "發出封鎖模板"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("封禁方针", "封鎖方針"), "QW:BLOCK");
        Window.addFooterLink(window.wgULS("封禁设置", "封鎖設定"), "H:TW/PREF#block");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#block");
        const form = new Morebits.quickForm(Twinkle.block.callback.evaluate);
        const actionfield = form.append({
          type: "field",
          label: window.wgULS("操作类型", "操作類別")
        });
        actionfield.append({
          type: "checkbox",
          name: "actiontype",
          event: Twinkle.block.callback.change_action,
          list: [{
            label: window.wgULS("封禁用户", "封鎖使用者"),
            value: "block",
            tooltip: window.wgULS("用选择的选项全站封禁相关用户,若未勾选部分封禁则为全站封禁。", "用選擇的選項全站封鎖相關使用者,若未勾選部分封鎖則為全站封鎖。"),
            hidden: !Morebits.userIsSysop,
            checked: Morebits.userIsSysop
          }, {
            label: window.wgULS("部分封禁", "部分封鎖"),
            value: "partial",
            tooltip: window.wgULS("启用部分封禁及部分封禁模板。", "啟用部分封鎖及部分封鎖模板。"),
            hidden: !Morebits.userIsSysop,
            checked: Twinkle.getPref("defaultToPartialBlocks")
            // Overridden if already blocked
          }, {
            label: window.wgULS("加入封禁模板到用户讨论页", "加入封鎖模板到使用者討論頁"),
            value: "template",
            tooltip: window.wgULS("若执行封禁的管理员忘记发出封禁模板,或你封禁了用户而没有给其发出模板,则你可以用此来发出合适的模板。勾选部分封禁以使用部分封禁模板。", "若執行封鎖的管理員忘記發出封鎖模板,或你封鎖了使用者而沒有給其發出模板,則你可以用此來發出合適的模板。勾選部分封鎖以使用部分封鎖模板。"),
            // Disallow when viewing the block dialog on an IP range
            hidden: !Morebits.userIsSysop,
            checked: Morebits.userIsSysop && !Morebits.ip.isRange(relevantUserName),
            disabled: Morebits.ip.isRange(relevantUserName)
          }, {
            label: window.wgULS("标记用户页", "標記使用者頁面"),
            value: "tag",
            tooltip: window.wgULS("将用户页替换成相关的标记模板,仅限永久封禁使用。", "將使用者頁面替換成相關的標記模板,僅限永久封鎖使用。"),
            hidden: true,
            checked: !Morebits.userIsSysop
          }, {
            label: window.wgULS("保护用户页", "保護使用者頁面"),
            value: "protect",
            tooltip: window.wgULS("全保护用户页,仅限永久封禁使用。", "全保護使用者頁面,僅限永久封鎖使用。"),
            hidden: true
          }, {
            label: window.wgULS("解除封禁用户", "解除封鎖使用者"),
            value: "unblock",
            tooltip: window.wgULS("解除封禁相关用户。", "解除封鎖相關使用者。"),
            hidden: !Morebits.userIsSysop
          }]
        });
        const sixtyFour = Morebits.ip.get64(mw.config.get("wgRelevantUserName"));
        if (sixtyFour && sixtyFour !== mw.config.get("wgRelevantUserName")) {
          const block64field = form.append({
            type: "field",
            label: window.wgULS("转换为/64段封禁", "轉換為/64段封鎖"),
            name: "field_64"
          });
          block64field.append({
            type: "div",
            style: "margin-bottom: 0.5em",
            label: [wgULS("直接封禁/64段有益无害。", "直接封鎖/64段有益無害。")]
          });
          block64field.append({
            type: "checkbox",
            name: "block64",
            event: Twinkle.block.callback.change_block64,
            list: [{
              checked: Twinkle.getPref("defaultToBlock64"),
              label: window.wgULS("改成封禁/64", "改成封鎖/64"),
              value: "block64",
              tooltip: Morebits.ip.isRange(mw.config.get("wgRelevantUserName")) ? window.wgULS("将不会发送模板通知。", "將不會發送模板通知。") : window.wgULS("任何模板将会发送给原始IP:", "任何模板將會發送給原始IP:") + mw.config.get("wgRelevantUserName")
            }]
          });
        }
        form.append({
          type: "field",
          label: window.wgULS("默认", "預設"),
          name: "field_preset"
        });
        form.append({
          type: "field",
          label: window.wgULS("模板选项", "模板選項"),
          name: "field_template_options"
        });
        form.append({
          type: "field",
          label: window.wgULS("封禁选项", "封鎖選項"),
          name: "field_block_options"
        });
        form.append({
          type: "field",
          label: window.wgULS("标记用户页", "標記使用者頁面"),
          name: "field_tag_options"
        });
        form.append({
          type: "field",
          label: window.wgULS("解除封禁选项", "解除封鎖選項"),
          name: "field_unblock_options"
        });
        form.append({
          type: "submit",
          label: "提交"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        result.root = result;
        Twinkle.block.fetchUserInfo(() => {
          if (Twinkle.block.isRegistered) {
            const $form = $(result);
            Morebits.quickForm.setElementVisibility($form.find("[name=actiontype][value=tag]").parent(), true);
            if (Morebits.userIsSysop) {
              Morebits.quickForm.setElementVisibility($form.find("[name=actiontype][value=protect]").parent(), true);
            }
          }
          if (blockedUserName === relevantUserName) {
            $(result).find("[name=actiontype][value=partial]").prop("checked", Twinkle.block.currentBlockInfo.partial === "");
          }
          Twinkle.block.transformBlockPresets();
          const evt = document.createEvent("Event");
          evt.initEvent("change", true, true);
          if (result.block64 && result.block64.checked) {
            result.block64.dispatchEvent(evt);
          } else {
            result.actiontype[0].dispatchEvent(evt);
          }
        });
      };
      Twinkle.block.fetchedData = {};
      Twinkle.block.processUserInfo = (data, fn) => {
        let [blockinfo] = data.query.blocks;
        const [userinfo] = data.query.users;
        if (data.query.blocks.length > 1 && blockinfo.user !== relevantUserName) {
          [, blockinfo] = data.query.blocks;
        }
        Twinkle.block.fetchedData[userinfo.name] = data;
        Twinkle.block.isRegistered = !!userinfo.userid;
        if (Twinkle.block.isRegistered) {
          Twinkle.block.userIsBot = !!userinfo.groupmemberships && userinfo.groupmemberships.map((e) => {
            return e.group;
          }).includes("bot");
        } else {
          Twinkle.block.userIsBot = false;
        }
        if (blockinfo) {
          blockinfo.disabletalk = blockinfo.allowusertalk === void 0;
          blockinfo.hardblock = blockinfo.anononly === void 0;
        }
        Twinkle.block.currentBlockInfo = blockinfo;
        blockedUserName = Twinkle.block.currentBlockInfo && Twinkle.block.currentBlockInfo.user;
        Twinkle.block.hasBlockLog = !!data.query.logevents.length;
        Twinkle.block.blockLog = Twinkle.block.hasBlockLog && data.query.logevents;
        Twinkle.block.blockLogId = Twinkle.block.hasBlockLog ? data.query.logevents[0].logid : false;
        if (typeof fn === "function") {
          return fn();
        }
      };
      Twinkle.block.fetchUserInfo = (fn) => {
        const query = {
          format: "json",
          action: "query",
          list: "blocks|users|logevents",
          letype: "block",
          lelimit: 2,
          letitle: "User:".concat(relevantUserName),
          bkprop: "expiry|reason|flags|restrictions|range|user",
          ususers: relevantUserName
        };
        if (mw.util.isIPAddress(relevantUserName, true)) {
          query.bkip = relevantUserName;
        } else {
          query.bkusers = relevantUserName;
          query.usprop = "groupmemberships";
        }
        void api.get(query).then((data) => {
          Twinkle.block.processUserInfo(data, fn);
        }, (error) => {
          Morebits.status.init($body.find('div[name="currentblock"] span').last()[0]);
          Morebits.status.warn(window.wgULS("抓取用户信息出错", "抓取使用者資訊出錯"), error);
        });
      };
      Twinkle.block.callback.saveFieldset = (fieldset) => {
        Twinkle.block[$(fieldset).prop("name")] = {};
        var _iterator7 = _createForOfIteratorHelper($(fieldset).serializeArray()), _step7;
        try {
          for (_iterator7.s(); !(_step7 = _iterator7.n()).done; ) {
            const el = _step7.value;
            Twinkle.block[$(fieldset).prop("name")][el.name] = el.value;
          }
        } catch (err) {
          _iterator7.e(err);
        } finally {
          _iterator7.f();
        }
      };
      Twinkle.block.callback.change_block64 = (e) => {
        const $form = $(e.target.form);
        const $block64 = $form.find("[name=block64]");
        const priorName = relevantUserName;
        if ($block64.is(":checked")) {
          relevantUserName = Morebits.ip.get64(mw.config.get("wgRelevantUserName"));
        } else {
          relevantUserName = mw.config.get("wgRelevantUserName");
        }
        const originalIsRange = Morebits.ip.isRange(mw.config.get("wgRelevantUserName"));
        $form.find("[name=actiontype][value=template]").prop("disabled", originalIsRange).prop("checked", !originalIsRange);
        const regenerateForm = () => {
          const titleBar = document.querySelector(".ui-dialog-title").firstChild.nextSibling;
          titleBar.nodeValue = titleBar.nodeValue.replace(priorName, relevantUserName);
          $form.find("[name=actiontype][value=partial]").prop("checked", Twinkle.getPref("defaultToPartialBlocks"));
          if (blockedUserName === relevantUserName) {
            $form.find("[name=actiontype][value=partial]").prop("checked", Twinkle.block.currentBlockInfo.partial === "");
          }
          Twinkle.block.callback.change_action(e);
        };
        if (Twinkle.block.fetchedData[relevantUserName]) {
          Twinkle.block.processUserInfo(Twinkle.block.fetchedData[relevantUserName], regenerateForm);
        } else {
          Twinkle.block.fetchUserInfo(regenerateForm);
        }
      };
      Twinkle.block.callback.change_action = (e) => {
        let field_preset;
        let field_template_options;
        let field_block_options;
        let field_tag_options;
        let field_unblock_options;
        const $form = $(e.target.form);
        const $block = $form.find("[name=actiontype][value=block]");
        let blockBox = $block.is(":checked");
        const $template = $form.find("[name=actiontype][value=template]");
        let templateBox = $template.is(":checked");
        const $tag = $form.find("[name=actiontype][value=tag]");
        const tagBox = $tag.is(":checked");
        const $protect = $form.find("[name=actiontype][value=protect]");
        const $partial = $form.find("[name=actiontype][value=partial]");
        const partialBox = $partial.is(":checked");
        const $unblock = $form.find("[name=actiontype][value=unblock]");
        const unblockBox = $unblock.is(":checked");
        let blockGroup = partialBox ? Twinkle.block.blockGroupsPartial : Twinkle.block.blockGroups;
        if (e.target.value === "unblock") {
          if (!Twinkle.block.currentBlockInfo) {
            $unblock.prop("checked", false);
            void mw.notify(window.wgULS("用户没有被封禁", "使用者沒有被封鎖"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          }
          $block.prop("checked", false);
          blockBox = false;
          $template.prop("checked", false);
          templateBox = false;
          $tag.prop("checked", false);
          $protect.prop("checked", false);
          $partial.prop("checked", false);
        } else {
          $unblock.prop("checked", false);
        }
        $partial.prop("disabled", !blockBox && !templateBox);
        const prior = {
          label: window.wgULS("当前封禁", "目前封鎖")
        };
        if (blockedUserName === relevantUserName) {
          Twinkle.block.blockPresetsInfo.prior = Twinkle.block.currentBlockInfo;
          prior.list = [{
            label: window.wgULS("当前封禁设置", "目前封鎖設定"),
            value: "prior",
            selected: true
          }];
          if (!blockGroup.some((bg) => {
            return bg.label === prior.label;
          })) {
            blockGroup[blockGroup.length] = prior;
          }
          if (partialBox) {
            Twinkle.block.blockPresetsInfo.prior.templateName = Morebits.string.isInfinity(Twinkle.block.currentBlockInfo.expiry) ? "uw-pblockindef" : "uw-pblock";
          } else if (Twinkle.block.isRegistered) {
            Twinkle.block.blockPresetsInfo.prior.templateName = Morebits.string.isInfinity(Twinkle.block.currentBlockInfo.expiry) ? "uw-blockindef" : "uw-block";
          } else {
            Twinkle.block.blockPresetsInfo.prior.templateName = "uw-ablock";
          }
        } else {
          blockGroup = blockGroup.filter((bg) => {
            return bg.label !== prior.label;
          });
        }
        Twinkle.block.callback.saveFieldset($body.find("[name=field_block_options]"));
        Twinkle.block.callback.saveFieldset($body.find("[name=field_template_options]"));
        Twinkle.block.callback.saveFieldset($body.find("[name=field_tag_options]"));
        Twinkle.block.callback.saveFieldset($body.find("[name=field_unblock_options]"));
        if (blockBox) {
          field_preset = new Morebits.quickForm.element({
            type: "field",
            label: window.wgULS("默认", "預設"),
            name: "field_preset"
          });
          field_preset.append({
            type: "select",
            name: "preset",
            label: window.wgULS("选择默认:", "選擇預設:"),
            event: Twinkle.block.callback.change_preset,
            list: Twinkle.block.callback.filtered_block_groups(blockGroup)
          });
          field_block_options = new Morebits.quickForm.element({
            type: "field",
            label: window.wgULS("封禁选项", "封鎖選項"),
            name: "field_block_options"
          });
          field_block_options.append({
            type: "div",
            name: "currentblock",
            label: " "
          });
          field_block_options.append({
            type: "div",
            name: "hasblocklog",
            label: " "
          });
          field_block_options.append({
            type: "select",
            name: "expiry_preset",
            label: window.wgULS("过期时间:", "過期時間:"),
            event: Twinkle.block.callback.change_expiry,
            list: [{
              label: window.wgULS("自定义", "自訂"),
              value: "custom",
              selected: true
            }, {
              label: window.wgULS("无限期", "無限期"),
              value: "infinity"
            }, {
              label: window.wgULS("3小时", "3小時"),
              value: "3 hours"
            }, {
              label: window.wgULS("12小时", "12小時"),
              value: "12 hours"
            }, {
              label: "1天",
              value: "1 day"
            }, {
              label: window.wgULS("31小时", "31小時"),
              value: "31 hours"
            }, {
              label: "2天",
              value: "2 days"
            }, {
              label: "3天",
              value: "3 days"
            }, {
              label: window.wgULS("1周", "1週"),
              value: "1 week"
            }, {
              label: window.wgULS("2周", "2週"),
              value: "2 weeks"
            }, {
              label: window.wgULS("1个月", "1個月"),
              value: "1 month"
            }, {
              label: window.wgULS("3个月", "3個月"),
              value: "3 months"
            }, {
              label: window.wgULS("6个月", "6個月"),
              value: "6 months"
            }, {
              label: "1年",
              value: "1 year"
            }, {
              label: "2年",
              value: "2 years"
            }, {
              label: "3年",
              value: "3 years"
            }]
          });
          field_block_options.append({
            type: "input",
            name: "expiry",
            label: window.wgULS("自定义过期时间", "自訂過期時間"),
            tooltip: window.wgULS("您可以使用相对时间,如“1 minute”或“19 days”;或绝对时间,“yyyymmddhhmm”(如“200602011405”是2006年2月1日14:05 UTC。)", "您可以使用相對時間,如「1 minute」或「19 days」;或絕對時間,「yyyymmddhhmm」(如「200602011405」是2006年2月1日14:05 UTC。)"),
            value: Twinkle.block.field_block_options.expiry || Twinkle.block.field_template_options.template_expiry
          });
          if (partialBox) {
            field_block_options.append({
              type: "select",
              multiple: true,
              name: "pagerestrictions",
              label: window.wgULS("页面封禁", "頁面封鎖"),
              value: "",
              tooltip: window.wgULS("最多10个页面。", "最多10個頁面。")
            });
            const ns = field_block_options.append({
              type: "select",
              multiple: true,
              name: "namespacerestrictions",
              label: window.wgULS("命名空间封禁", "命名空間封鎖"),
              value: "",
              tooltip: window.wgULS("指定封禁的命名空间。", "指定封鎖的命名空間。")
            });
            for (var _i4 = 0, _Object$entries2 = Object.entries(menuFormattedNamespaces); _i4 < _Object$entries2.length; _i4++) {
              const [number, name] = _Object$entries2[_i4];
              if (number >= 0 && number < 830) {
                ns.append({
                  type: "option",
                  label: name,
                  value: number
                });
              }
            }
          }
          const blockoptions = [{
            checked: Twinkle.block.field_block_options.nocreate,
            label: window.wgULS("禁止创建账号", "禁止建立賬號"),
            name: "nocreate",
            value: "1"
          }, {
            checked: Twinkle.block.field_block_options.noemail,
            label: window.wgULS("电子邮件停用", "電子郵件停用"),
            name: "noemail",
            value: "1"
          }, {
            checked: Twinkle.block.field_block_options.disabletalk,
            label: window.wgULS("不能编辑自己的讨论页", "不能編輯自己的討論頁"),
            name: "disabletalk",
            value: "1",
            tooltip: partialBox ? window.wgULS("若使用部分封禁,不应选择此项,除非您也想要禁止编辑用户讨论页。", "若使用部分封鎖,不應選擇此項,除非您也想要禁止編輯使用者討論頁。") : ""
          }];
          if (Twinkle.block.isRegistered) {
            blockoptions[blockoptions.length] = {
              checked: Twinkle.block.field_block_options.autoblock,
              label: window.wgULS("自动封禁", "自動封鎖"),
              name: "autoblock",
              value: "1"
            };
          } else {
            blockoptions[blockoptions.length] = {
              checked: Twinkle.block.field_block_options.hardblock,
              label: window.wgULS("阻止登录用户使用该IP地址编辑", "阻止登入使用者使用該IP位址編輯"),
              name: "hardblock",
              value: "1"
            };
          }
          blockoptions[blockoptions.length] = ({
            checked: Twinkle.block.field_block_options.watchuser,
            label: window.wgULS("监视该用户的用户页和讨论页", "監視該使用者的使用者頁面和討論頁"),
            name: "watchuser",
            value: "1"
          }, {
            checked: true,
            label: window.wgULS("标记当前的破坏中的请求", "標記當前的破壞中的請求"),
            name: "closevip",
            value: "1"
          });
          field_block_options.append({
            type: "checkbox",
            name: "blockoptions",
            list: blockoptions
          });
          field_block_options.append({
            type: "textarea",
            label: window.wgULS("理由(用于封禁日志):", "理由(用於封鎖日誌):"),
            name: "reason",
            tooltip: window.wgULS("请考虑在默认的消息中加入有用的详细信息。", "請考慮在預設的訊息中加入有用的詳細資訊。"),
            value: Twinkle.block.field_block_options.reason
          });
          field_block_options.append({
            type: "div",
            name: "filerlog_label",
            label: window.wgULS("参见:", "參見:"),
            style: "display:inline-block;font-style:normal !important",
            tooltip: window.wgULS("在封禁理由中标清特殊情况以供其他管理员参考", "在封鎖理由中標清特殊情況以供其他管理員參考")
          });
          field_block_options.append({
            type: "checkbox",
            name: "filter_see_also",
            event: Twinkle.block.callback.toggle_see_alsos,
            style: "display:inline-block; margin-right:5px",
            list: [{
              label: window.wgULS("过滤器日志", "過濾器日誌"),
              checked: false,
              value: window.wgULS("过滤器日志", "過濾器日誌")
            }]
          });
          field_block_options.append({
            type: "checkbox",
            name: "deleted_see_also",
            event: Twinkle.block.callback.toggle_see_alsos,
            style: "display:inline-block; margin-right:5px",
            list: [{
              label: window.wgULS("已删除的编辑", "已刪除的編輯"),
              checked: false,
              value: window.wgULS("已删除的编辑", "已刪除的編輯")
            }]
          });
          field_block_options.append({
            type: "checkbox",
            name: "filter_see_also",
            event: Twinkle.block.callback.toggle_see_alsos,
            style: "display:inline-block; margin-right:5px",
            list: [{
              label: window.wgULS("用户讨论页", "使用者討論頁"),
              checked: false,
              value: window.wgULS("用户讨论页", "使用者討論頁")
            }]
          });
          field_block_options.append({
            type: "checkbox",
            name: "filter_see_also",
            event: Twinkle.block.callback.toggle_see_alsos,
            style: "display:inline-block; margin-right:5px",
            list: [{
              label: window.wgULS("过去的封禁记录", "過去的封鎖記錄"),
              checked: false,
              value: window.wgULS("过去的封禁记录", "過去的封鎖記錄")
            }]
          });
          if (blockedUserName === relevantUserName) {
            field_block_options.append({
              type: "hidden",
              name: "reblock",
              value: "1"
            });
          }
        }
        if (templateBox) {
          field_template_options = new Morebits.quickForm.element({
            type: "field",
            label: window.wgULS("模板选项", "模板選項"),
            name: "field_template_options"
          });
          field_template_options.append({
            type: "select",
            name: "template",
            label: window.wgULS("选择讨论页模板:", "選擇討論頁模板:"),
            event: Twinkle.block.callback.change_template,
            list: Twinkle.block.callback.filtered_block_groups(blockGroup, true),
            value: Twinkle.block.field_template_options.template
          });
          field_template_options.append({
            type: "input",
            name: "article",
            label: window.wgULS("链接页面", "連結頁面"),
            value: "",
            tooltip: window.wgULS("可以随通知链接页面,例如破坏的目标。没有条目需要链接则请留空。", "可以隨通知連結頁面,例如破壞的目標。沒有條目需要連結則請留空。")
          });
          field_template_options.append({
            type: "input",
            name: "area",
            label: window.wgULS("封禁范围", "封鎖範圍"),
            value: "",
            tooltip: window.wgULS("阻止用户编辑的页面或命名空间的可选说明。", "阻止使用者編輯的頁面或命名空間的可選說明。")
          });
          if (!blockBox) {
            field_template_options.append({
              type: "input",
              name: "template_expiry",
              label: "封禁期限:",
              value: "",
              tooltip: window.wgULS("封禁时长,如24小时、2周、无限期等。", "封鎖時長,如24小時、2週、無限期等。")
            });
          }
          field_template_options.append({
            type: "input",
            name: "block_reason",
            label: window.wgULS("“由于……您已被封禁”", "「由於……您已被封鎖」"),
            tooltip: window.wgULS("可选的理由,用于替换默认理由。只在常规封禁模板中有效。", "可選的理由,用於替換預設理由。只在常規封鎖模板中有效。"),
            value: Twinkle.block.field_template_options.block_reason,
            size: 60
          });
          if (blockBox) {
            field_template_options.append({
              type: "checkbox",
              name: "blank_duration",
              list: [{
                label: window.wgULS("不在模板中包含封禁期限", "不在模板中包含封鎖期限"),
                checked: Twinkle.block.field_template_options.blank_duration,
                tooltip: window.wgULS("模板将会显示“一段时间”而不是具体时长", "模板將會顯示「一段時間」而不是具體時長")
              }]
            });
          } else {
            field_template_options.append({
              type: "checkbox",
              list: [{
                label: window.wgULS("不能编辑自己的讨论页", "不能編輯自己的討論頁"),
                name: "notalk",
                checked: Twinkle.block.field_template_options.notalk,
                tooltip: window.wgULS("用此在封禁模板中指明该用户编辑讨论页的权限已被移除", "用此在封鎖模板中指明該使用者編輯討論頁的權限已被移除")
              }, {
                label: window.wgULS("不能发送电子邮件", "不能傳送電子郵件"),
                name: "noemail_template",
                checked: Twinkle.block.field_template_options.noemail_template,
                tooltip: window.wgULS("用此在封禁模板中指明该用户发送电子邮件的权限已被移除", "用此在封鎖模板中指明該使用者傳送電子郵件的權限已被移除")
              }, {
                label: window.wgULS("不能创建账号", "不能建立賬號"),
                name: "nocreate_template",
                checked: Twinkle.block.field_template_options.nocreate_template,
                tooltip: window.wgULS("用此在封禁模板中指明该用户创建账号的权限已被移除", "用此在封鎖模板中指明該使用者建立賬號的權限已被移除")
              }]
            });
          }
          const $previewlink = $("<a>").attr("id", "twinkleblock-preview-link").text(window.wgULS("预览", "預覽"));
          $previewlink.off("click").on("click", () => {
            Twinkle.block.callback.preview($form[0]);
          });
          $previewlink.css({
            cursor: "pointer"
          });
          field_template_options.append({
            type: "div",
            id: "blockpreview",
            label: [$previewlink[0]]
          });
          field_template_options.append({
            type: "div",
            id: "twinkleblock-previewbox",
            style: "display: none"
          });
        }
        if (tagBox) {
          field_tag_options = new Morebits.quickForm.element({
            type: "field",
            label: window.wgULS("标记用户页", "標記使用者頁面"),
            name: "field_tag_options"
          });
          field_tag_options.append({
            type: "checkbox",
            name: "tag",
            label: window.wgULS("选择用户页模板:", "選擇使用者頁面模板:"),
            list: [{
              label: "{{Blocked user}}:".concat(window.wgULS("一般永久封禁", "一般永久封鎖")),
              value: "Blocked user"
            }, {
              label: "{{Sockpuppet}}:".concat(window.wgULS("傀儡账号", "傀儡賬號")),
              value: "Sockpuppet",
              subgroup: [{
                name: "sppUsername",
                type: "input",
                label: window.wgULS("主账号用户名:", "主賬號使用者名稱:")
              }, {
                name: "sppType",
                type: "select",
                label: window.wgULS("状态:", "狀態:"),
                list: [{
                  type: "option",
                  value: "blocked",
                  label: "blocked - ".concat(window.wgULS("仅依行为证据认定", "僅依行為證據認定")),
                  selected: true
                }, {
                  type: "option",
                  value: "proven",
                  label: "proven - ".concat(window.wgULS("经傀儡调查确认", "經傀儡調查確認"))
                }, {
                  type: "option",
                  value: "confirmed",
                  label: "confirmed - ".concat(window.wgULS("经查核确认", "經查核確認"))
                }]
              }, {
                name: "sppEvidence",
                type: "input",
                label: window.wgULS("根据……确定:", "根據……確定:"),
                tooltip: window.wgULS("纯文字或是带[[]]的链接,例如:[[Special:固定链接/xxxxxxxx|用户查核]]", "純文字或是帶[[]]的連結,例如:[[Special:固定链接/xxxxxxxx|用戶查核]]")
              }]
            }, {
              label: "{{Sockpuppeteer|blocked}}:".concat(window.wgULS("傀儡主账号", "傀儡主賬號")),
              value: "Sockpuppeteer",
              subgroup: [{
                type: "checkbox",
                list: [{
                  name: "spmChecked",
                  value: "spmChecked",
                  label: window.wgULS("经用户查核确认", "經使用者查核確認")
                }]
              }, {
                name: "spmEvidence",
                type: "input",
                label: window.wgULS("额外理由:", "額外理由:")
              }]
            }]
          });
        }
        if (unblockBox) {
          field_unblock_options = new Morebits.quickForm.element({
            type: "field",
            label: window.wgULS("解除封禁选项", "解除封鎖選項"),
            name: "field_unblock_options"
          });
          field_unblock_options.append({
            type: "textarea",
            label: window.wgULS("理由(用于封禁日志):", "理由(用於封鎖日誌):"),
            name: "reason",
            value: Twinkle.block.field_unblock_options.reason
          });
        }
        let oldfield;
        if (field_preset) {
          [oldfield] = $form.find('fieldset[name="field_preset"]');
          oldfield.parentNode.replaceChild(field_preset.render(), oldfield);
        } else {
          $form.find('fieldset[name="field_preset"]').hide();
        }
        if (field_block_options) {
          [oldfield] = $form.find('fieldset[name="field_block_options"]');
          oldfield.parentNode.replaceChild(field_block_options.render(), oldfield);
          $form.find('fieldset[name="field_64"]').show();
          $form.find("[name=pagerestrictions]").select2({
            width: "100%",
            placeholder: window.wgULS("输入要阻止用户编辑的页面", "輸入要阻止使用者編輯的頁面"),
            language: {
              errorLoading: () => {
                return window.wgULS("搜索词汇不完整或无效", "搜尋詞彙不完整或無效");
              }
            },
            maximumSelectionLength: 10,
            minimumInputLength: 1,
            ajax: {
              url: mw.util.wikiScript("api"),
              dataType: "json",
              delay: 100,
              data: (params) => {
                const title = mw.Title.newFromText(params.term);
                if (!title) {
                  return;
                }
                return {
                  action: "query",
                  format: "json",
                  list: "allpages",
                  apfrom: title.title,
                  apnamespace: title.namespace,
                  aplimit: "10"
                };
              },
              processResults: (data) => {
                return {
                  results: data.query.allpages.map((page) => {
                    const title = mw.Title.newFromText(page.title, page.ns).toText();
                    return {
                      id: title,
                      text: title
                    };
                  })
                };
              }
            },
            templateSelection: (choice) => {
              return $("<a>").text(choice.text).attr({
                href: mw.util.getUrl(choice.text),
                target: "_blank",
                rel: "noopener noreferrer"
              });
            }
          });
          $form.find("[name=namespacerestrictions]").select2({
            width: "100%",
            matcher: Morebits.select2.matchers.wordBeginning,
            language: {
              searching: Morebits.select2.queryInterceptor
            },
            templateResult: Morebits.select2.highlightSearchMatches,
            placeholder: window.wgULS("选择要禁止用户编辑的命名空间", "選擇要禁止使用者編輯的命名空間")
          });
          mw.util.addCSS(
            /* Reduce padding;
             * Adjust font size;
             * Remove black border;
             * Make the tiny cross larger
             */
            ".select2-results .select2-results__option{padding-top:1px;padding-bottom:1px}.select2-container .select2-dropdown .select2-results,.select2-container .selection .select2-selection__rendered{font-size:13px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #aaa}.select2-selection__choice__remove{font-size:125%}"
          );
        } else {
          $form.find('fieldset[name="field_block_options"]').hide();
          $form.find('fieldset[name="field_64"]').hide();
          $form.find("[name=pagerestrictions]").val(null).trigger("change");
          $form.find("[name=namespacerestrictions]").val(null).trigger("change");
        }
        if (field_template_options) {
          [oldfield] = $form.find('fieldset[name="field_template_options"]');
          oldfield.parentNode.replaceChild(field_template_options.render(), oldfield);
          e.target.form.root.previewer = new Morebits.wiki.preview($(e.target.form.root).find("#twinkleblock-previewbox").last()[0]);
        } else {
          $form.find('fieldset[name="field_template_options"]').hide();
        }
        if (field_tag_options) {
          [oldfield] = $form.find('fieldset[name="field_tag_options"]');
          oldfield.parentNode.replaceChild(field_tag_options.render(), oldfield);
        } else {
          $form.find('fieldset[name="field_tag_options"]').hide();
        }
        if (field_unblock_options) {
          [oldfield] = $form.find('fieldset[name="field_unblock_options"]');
          oldfield.parentNode.replaceChild(field_unblock_options.render(), oldfield);
        } else {
          $form.find('fieldset[name="field_unblock_options"]').hide();
        }
        if (Twinkle.block.currentBlockInfo) {
          const sameUser = blockedUserName === relevantUserName;
          Morebits.status.init($body.find('div[name="currentblock"] span').last()[0]);
          let statusStr = "".concat(relevantUserName, "已被").concat(Twinkle.block.currentBlockInfo.partial === "" ? window.wgULS("部分封禁", "部分封鎖") : window.wgULS("全站封禁", "全站封鎖"));
          if (Twinkle.block.currentBlockInfo.rangestart !== Twinkle.block.currentBlockInfo.rangeend) {
            if (sameUser) {
              statusStr += window.wgULS("(段封禁)", "(段封鎖)");
            } else {
              const $rangeblockloglink = $("<span>").append($('<a rel="noopener" target="_blank" href="'.concat(mw.util.getUrl("Special:Log", {
                action: "view",
                page: blockedUserName,
                type: "block"
              }), '">').concat(Morebits.ip.get64(relevantUserName) === blockedUserName ? "/64" : blockedUserName, "</a>)")));
              statusStr += window.wgULS("(位于", "(位於") + $rangeblockloglink.html() + window.wgULS("段封禁内)", "段封鎖內)");
            }
          }
          if (Twinkle.block.currentBlockInfo.expiry === "infinity") {
            statusStr += window.wgULS("(无限期)", "(無限期)");
          } else if (new Morebits.date(Twinkle.block.currentBlockInfo.expiry).isValid()) {
            statusStr += "".concat(window.wgULS("(终止于", "(終止於") + new Morebits.date(Twinkle.block.currentBlockInfo.expiry).calendar("utc"), ")");
          }
          let infoStr = window.wgULS("此表单将", "此表單將");
          if (sameUser) {
            infoStr += window.wgULS("更改封禁", "變更封鎖");
            if (Twinkle.block.currentBlockInfo.partial === void 0 && partialBox) {
              infoStr += window.wgULS("为部分封禁", "為部分封鎖");
            } else if (Twinkle.block.currentBlockInfo.partial === "" && !partialBox) {
              infoStr += window.wgULS("为全站封禁", "為全站封鎖");
            }
            infoStr += "。";
          } else {
            infoStr += window.wgULS("加上额外的", "加上額外的") + (partialBox ? "部分" : "") + window.wgULS("封禁。", "封鎖。");
          }
          Morebits.status.warn(statusStr, infoStr);
          Twinkle.block.callback.update_form(e, Twinkle.block.currentBlockInfo);
        }
        if (Twinkle.block.hasBlockLog) {
          const blockloginfo = [];
          const $blockloglink = $("<span>").append($('<a rel="noopener" target="_blank" href="'.concat(mw.util.getUrl("Special:Log", {
            action: "view",
            page: relevantUserName,
            type: "block"
          }), '">').concat(window.wgULS("封禁日志", "封鎖日誌"), "</a>)")));
          if (Twinkle.block.currentBlockInfo) {
            blockloginfo[blockloginfo.length] = window.wgULS("封禁详情", "封鎖詳情");
          } else {
            const [lastBlockAction] = Twinkle.block.blockLog;
            const blockAction = lastBlockAction.action === "unblock" ? Twinkle.block.blockLog[1] : lastBlockAction;
            blockloginfo[blockloginfo.length] = ("此".concat(Morebits.ip.isRange(relevantUserName) ? window.wgULS("IP范围", "IP範圍") : window.wgULS("用户", "使用者"), "曾在"), $("<b>").text(new Morebits.date(blockAction.timestamp).calendar("utc"))[0], "被".concat(blockAction.user).concat(window.wgULS("封禁", "封鎖")), $("<b>").text(Morebits.string.formatTime(blockAction.params.duration))[0]);
            if (lastBlockAction.action === "unblock") {
              blockloginfo[blockloginfo.length] = ",".concat(new Morebits.date(lastBlockAction.timestamp).calendar("utc"), "解封");
            } else {
              blockloginfo[blockloginfo.length] = ",".concat(new Morebits.date(blockAction.params.expiry).calendar("utc")).concat(window.wgULS("过期", "過期"));
            }
          }
          Morebits.status.init($body.find('div[name="hasblocklog"] span').last()[0]);
          Morebits.status.warn(blockloginfo, $blockloglink[0]);
        }
        if (blockBox) {
          Twinkle.block.callback.change_preset(e);
        } else if (templateBox) {
          Twinkle.block.callback.change_template(e);
        }
      };
      Twinkle.block.blockPresetsInfo = {
        // uw-prefixed
        "uw-block": {
          autoblock: true,
          expiry: "1 day",
          forRegisteredOnly: true,
          nocreate: true,
          pageParam: true,
          reasonParam: true,
          summary: window.wgULS("封禁通知", "封鎖通知"),
          suppressArticleInSummary: true
        },
        "uw-blockindef": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          pageParam: true,
          reasonParam: true,
          summary: window.wgULS("封禁通知", "封鎖通知"),
          suppressArticleInSummary: true
        },
        "uw-blocknotalk": {
          disabletalk: true,
          pageParam: true,
          reasonParam: true,
          summary: window.wgULS("封禁通知:禁止编辑讨论页", "封鎖通知:禁止編輯討論頁"),
          suppressArticleInSummary: true
        },
        "uw-3block": {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("违反[[QW:3RR|回退不过三原则]]", "違反[[QW:3RR|回退不過三原則]]"),
          summary: window.wgULS("封禁通知:违反[[QW:3RR|回退不过三原则]]", "封鎖通知:違反[[QW:3RR|回退不過三原則]]")
        },
        "uw-adblock": {
          autoblock: true,
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("散发[[QW:SOAP|散发广告或宣传]]", "散發[[QW:SOAP|散發廣告或宣傳]]"),
          summary: window.wgULS("封禁通知:散发[[QW:SOAP|散发广告或宣传]]", "封鎖通知:散發[[QW:SOAP|散發廣告或宣傳]]")
        },
        "uw-attackblock": {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          reason: window.wgULS("[[QW:CIV|行为无礼]]或[[QW:NPA|人身攻击]]", "[[QW:CIV|行為無禮]]或[[QW:NPA|人身攻擊]]"),
          summary: window.wgULS("封禁通知:[[QW:CIV|行为无礼]]或[[QW:NPA|人身攻击]]", "封鎖通知:[[QW:CIV|行為無禮]]或[[QW:NPA|人身攻擊]]")
        },
        "uw-copyrightblock": {
          autoblock: true,
          expiry: "infinity",
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("持续[[QW:COPYVIO|侵犯著作权]]", "持續[[QW:COPYVIO|侵犯著作權]]"),
          summary: window.wgULS("封禁通知:持续[[QW:COPYVIO|侵犯著作权]]", "封鎖通知:持續[[QW:COPYVIO|侵犯著作權]]"),
          templateName: "uw-blockindef"
        },
        "uw-dblock": {
          autoblock: true,
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("持续[[QW:VAN|删除内容]]", "持續[[QW:VAN|刪除內容]]"),
          summary: window.wgULS("封禁通知:持续[[QW:VAN|删除内容]]", "封鎖通知:持續[[QW:VAN|刪除內容]]")
        },
        "uw-hblock": {
          autoblock: true,
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("[[QW:骚扰|骚扰]]其他用户", "[[QW:騷擾|騷擾]]其他使用者"),
          summary: window.wgULS("封禁通知:[[QW:骚扰|骚扰]]其他用户", "封鎖通知:[[QW:騷擾|騷擾]]其他使用者")
        },
        "uw-vblock": {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("[[QW:VAN|破坏]]", "[[QW:VAN|破壞]]"),
          summary: window.wgULS("封禁通知:[[QW:VAN|破坏]]", "封鎖通知:[[QW:VAN|破壞]]")
        },
        "uw-illegalblock": {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("持续加入不符合中国价值观的非法内容", "持續加入不符合中國價值觀的非法內容"),
          summary: window.wgULS("封禁通知:持续加入不符合中国价值观的非法内容", "封鎖通知:持續加入不符合中國價值觀的非法內容")
        },
        "uw-sockblock": {
          autoblock: true,
          expiry: "1 week",
          forRegisteredOnly: true,
          nocreate: true,
          reason: window.wgULS("滥用[[QW:SOCK|多个账号]]", "濫用[[QW:SOCK|多個賬號]]"),
          summary: window.wgULS("封禁通知:滥用[[QW:SOCK|多个账号]]", "封鎖通知:濫用[[QW:SOCK|多個賬號]]"),
          templateName: "uw-block"
        },
        // uw-u-prefixed
        "uw-ublock": {
          expiry: "infinity",
          forRegisteredOnly: true,
          reason: "{{uw-ublock}}<!-- ".concat(window.wgULS("不当用户名、软封禁", "不當使用者名稱"), " -->"),
          summary: window.wgULS("封禁通知:您的用户名违反[[QW:U|用户名方针]]", "封鎖通知:您的使用者名稱違反[[QW:U|使用者名稱方針]]")
        },
        "uw-ublock-illegal": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          reason: "{{uw-ublock-illegal}}<!-- ".concat(window.wgULS("不合规的用户名", "不合規的使用者名稱"), " -->"),
          summary: window.wgULS("封禁通知:您的用户名违反[[QW:U|用户名方针]]", "封鎖通知:您的使用者名稱違反[[QW:U|使用者名稱方針]]")
        },
        "uw-ublock-suggestive": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          reason: "{{uw-ublock-suggestive}}<!-- ".concat(window.wgULS("误导、混淆性用户名", "誤導、混淆性使用者名稱"), " -->"),
          summary: window.wgULS("封禁通知:您的用户名违反[[QW:U|用户名方针]]", "封鎖通知:您的使用者名稱違反[[QW:U|使用者名稱方針]]")
        },
        "uw-ublock-spam": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          reason: "{{uw-ublock-spam}}<!-- ".concat(window.wgULS("宣传性用户名或宣传性编辑", "宣傳性使用者名稱或宣傳性編輯"), " -->"),
          summary: window.wgULS("封禁通知:您的用户名违反[[QW:U|用户名方针]]", "封鎖通知:您的使用者名稱違反[[QW:U|使用者名稱方針]]")
        },
        // other block templates
        "range block": {
          expiry: "1 week",
          reason: "{{range block}}",
          nocreate: true,
          nonstandard: true,
          forAnonOnly: true,
          sig: "~~".concat("~~")
        },
        "blocked proxy": {
          expiry: "2 years",
          forAnonOnly: true,
          nocreate: true,
          nonstandard: true,
          hardblock: true,
          reason: "{{blocked proxy}}",
          sig: null
        },
        checkuserblock: {
          expiry: "1 week",
          forAnonOnly: true,
          nocreate: true,
          nonstandard: true,
          reason: "{{checkuserblock}}",
          sig: "~~".concat("~~")
        },
        "checkuserblock-account": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          nonstandard: true,
          reason: "{{checkuserblock-account}}",
          sig: "~~".concat("~~")
        },
        "school block": {
          expiry: "1 week",
          forAnonOnly: true,
          nocreate: true,
          nonstandard: true,
          reason: "{{school block}}",
          sig: "~~".concat("~~")
        },
        "Bot block message": {
          expiry: "infinity",
          forRegisteredOnly: true,
          reason: window.wgULS("机器人故障", "機器人故障"),
          summary: window.wgULS("封禁通知:机器人故障", "封鎖通知:機器人故障"),
          sig: "~~".concat("~~")
        },
        // other block reasons
        bioblock: {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("违反生者传记方针", "違反生者傳記方針"),
          summary: window.wgULS("封禁通知:违反生者传记方针", "封鎖通知:違反生者傳記方針"),
          templateName: "uw-vblock"
        },
        ucblock: {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("屡次增加没有[[QW:RS|可靠来源]]的资料", "屢次增加沒有[[QW:RS|可靠來源]]的資料"),
          summary: window.wgULS("封禁通知:屡次增加没有[[QW:RS|可靠来源]]的资料", "封鎖通知:屢次增加沒有[[QW:RS|可靠來源]]的資料"),
          templateName: "uw-block"
        },
        npblock: {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          pageParam: true,
          reason: window.wgULS("在条目中增加无意义文字", "在條目中增加無意義文字"),
          summary: window.wgULS("封禁通知:在条目中增加无意义文字", "封鎖通知:在條目中增加無意義文字"),
          templateName: "uw-vblock"
        },
        "point-block": {
          autoblock: true,
          expiry: "1 day",
          nocreate: true,
          pageParam: true,
          reasonParam: true,
          reason: window.wgULS("持续打制度擦边球", "持續打制度擦邊球"),
          summary: window.wgULS("封禁通知:持续打制度擦边球", "封鎖通知:持續打制度擦邊球"),
          templateName: "uw-block"
        },
        "sock-contribs": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          reasonParam: true,
          reason: window.wgULS("确认为[[QW:SOCK|傀儡]]或真人傀儡 - 根据用户贡献确定", "確認為[[QW:SOCK|傀儡]]或真人傀儡 - 根據使用者貢獻確定"),
          summary: window.wgULS("封禁通知:确认为[[QW:SOCK|傀儡]]或真人傀儡", "封鎖通知:確認為[[QW:SOCK|傀儡]]或真人傀儡"),
          templateName: "uw-blockindef"
        },
        "sock-cu": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          reasonParam: true,
          reason: window.wgULS("确认为[[QW:SOCK|傀儡]]或真人傀儡 - 用户查核确认", "確認為[[QW:SOCK|傀儡]]或真人傀儡 - 使用者查核確認"),
          summary: window.wgULS("封禁通知:确认为[[QW:SOCK|傀儡]]或真人傀儡", "封鎖通知:確認為[[QW:SOCK|傀儡]]或真人傀儡"),
          templateName: "uw-blockindef"
        },
        "uw-ublock-attack": {
          autoblock: true,
          expiry: "infinity",
          forRegisteredOnly: true,
          nocreate: true,
          reason: "{{uw-ublock-attack}}<!-- ".concat(window.wgULS("攻击性用户名", "攻擊性使用者名稱"), " -->"),
          summary: window.wgULS("封禁通知:攻击性用户名", "封鎖通知:攻擊性使用者名稱")
        },
        // Begin partial block templates, accessed in Twinkle.block.blockGroupsPartial
        "uw-pblock": {
          autoblock: true,
          expiry: "1 day",
          nocreate: false,
          pageParam: false,
          reasonParam: true,
          summary: window.wgULS("封禁通知:您已被禁止编辑求闻百科的部分区域", "封鎖通知:您已被禁止編輯求聞百科的部分區域")
        },
        "uw-pblockindef": {
          autoblock: true,
          expiry: "infinity",
          nocreate: false,
          pageParam: false,
          reasonParam: true,
          summary: window.wgULS("封禁通知:您已被永久禁止编辑求闻百科的部分区域", "封鎖通知:您已被永久禁止編輯求聞百科的部分區域")
        }
      };
      Twinkle.block.transformBlockPresets = () => {
        var _iterator8 = _createForOfIteratorHelper(Twinkle.getPref("customBlockReasonList")), _step8;
        try {
          for (_iterator8.s(); !(_step8 = _iterator8.n()).done; ) {
            const item = _step8.value;
            const newKey = "".concat(item.value, "|").concat(item.label);
            Twinkle.block.blockPresetsInfo[newKey] = {
              autoblock: true,
              nocreate: true,
              ...Twinkle.block.blockPresetsInfo[item.value],
              reason: item.label,
              templateName: item.value
            };
            if (Twinkle.block.blockPresetsInfo[item.value] === void 0) {
              Twinkle.block.blockPresetsInfo[item.value] = {
                pageParam: true,
                reasonParam: true,
                custom: true
              };
            }
          }
        } catch (err) {
          _iterator8.e(err);
        } finally {
          _iterator8.f();
        }
        for (var _i5 = 0, _Object$entries3 = Object.entries(Twinkle.block.blockPresetsInfo); _i5 < _Object$entries3.length; _i5++) {
          const [preset, settings] = _Object$entries3[_i5];
          settings.summary || (settings.summary = settings.reason);
          settings.sig = settings.sig === void 0 ? "yes" : settings.sig;
          settings.indefinite || (settings.indefinite = Morebits.string.isInfinity(settings.expiry));
          if (!Twinkle.block.isRegistered && settings.indefinite) {
            settings.expiry = "1 day";
          } else {
            settings.expiry || (settings.expiry = "1 day");
          }
          Twinkle.block.blockPresetsInfo[preset] = settings;
        }
      };
      Twinkle.block.blockGroups = [{
        label: window.wgULS("普通封禁", "普通封鎖"),
        list: [
          {
            label: window.wgULS("通用封禁(自定义理由)", "通用封鎖(自訂理由)"),
            value: "uw-block"
          },
          {
            label: window.wgULS("无限期封禁(自定义理由)", "無限期封鎖(自訂理由)"),
            value: "uw-blockindef"
          },
          {
            label: window.wgULS("禁止编辑讨论页", "禁止編輯討論頁"),
            value: "uw-blocknotalk",
            meta: true
          },
          {
            label: window.wgULS("违反回退不过三原则", "違反回退不過三原則"),
            value: "uw-3block"
          },
          {
            label: window.wgULS("散发广告或宣传", "散發廣告或宣傳"),
            value: "uw-adblock"
          },
          {
            label: window.wgULS("行为无礼或人身攻击", "行為無禮或人身攻擊"),
            value: "uw-attackblock"
          },
          {
            label: window.wgULS("多次加入侵犯著作权的内容", "多次加入侵犯著作權的內容"),
            value: "uw-copyrightblock"
          },
          {
            label: window.wgULS("无故删除内容", "無故刪除內容"),
            value: "uw-dblock"
          },
          {
            label: window.wgULS("骚扰用户", "騷擾使用者"),
            value: "uw-hblock"
          },
          {
            label: window.wgULS("破坏", "破壞"),
            value: "uw-vblock",
            selected: true
          },
          {
            label: window.wgULS("持续加入不符合中国价值观的非法内容", "持續加入不符合中國價值觀的非法內容"),
            value: "uw-illegalblock"
          },
          {
            label: window.wgULS("滥用多个账号", "濫用多個賬號"),
            value: "uw-sockblock"
          },
          // other block reasons
          {
            label: window.wgULS("违反生者传记方针", "違反生者傳記方針"),
            value: "bioblock"
          },
          {
            label: window.wgULS("屡次增加没有可靠来源的资料", "屢次增加沒有可靠來源的資料"),
            value: "ucblock"
          },
          {
            label: window.wgULS("在条目中增加无意义文字", "在條目中增加無意義文字"),
            value: "npblock"
          },
          {
            label: window.wgULS("持续打制度擦边球", "持續打制度擦邊球"),
            value: "point-block"
          },
          {
            label: window.wgULS("确认为傀儡或真人傀儡(根据用户贡献确定)", "確認為傀儡或真人傀儡(根據使用者貢獻確定)"),
            value: "sock-contribs"
          },
          {
            label: window.wgULS("确认为傀儡或真人傀儡(用户查核确认)", "確認為傀儡或真人傀儡(使用者查核確認)"),
            value: "sock-cu"
          },
          {
            label: window.wgULS("机器人发生故障并必须紧急停止", "機器人發生故障並必須緊急停止"),
            value: "Bot block message"
          }
        ]
      }, {
        custom: true,
        label: window.wgULS("自定义封禁理由", "自訂封鎖理由")
      }, {
        label: window.wgULS("用户名封禁", "使用者名稱封鎖"),
        list: [{
          label: window.wgULS("违反用户名方针", "違反使用者名稱方針"),
          value: "uw-ublock"
        }, {
          label: window.wgULS("不合规的用户名", "不合規的使用者名稱"),
          value: "uw-ublock-illegal"
        }, {
          label: window.wgULS("宣传性用户名", "宣傳性使用者名稱"),
          value: "uw-ublock-spam"
        }, {
          label: window.wgULS("攻击性用户名", "攻擊性使用者名稱"),
          value: "uw-ublock-attack"
        }, {
          label: window.wgULS("混淆性或误导性用户名", "混淆性或誤導性使用者名稱"),
          value: "uw-ublock-suggestive"
        }]
      }, {
        label: "其他模板",
        list: [{
          label: "range block",
          value: "range block",
          forAnonOnly: true
        }, {
          label: "school block",
          value: "school block",
          forAnonOnly: true
        }, {
          label: "blocked proxy",
          value: "blocked proxy",
          forAnonOnly: true
        }, {
          label: window.wgULS("用户查核封禁(主用户)", "使用者查核封鎖(主使用者)"),
          value: "checkuserblock",
          forAnonOnly: true
        }, {
          label: window.wgULS("用户查核封禁(子用户)", "使用者查核封鎖(子使用者)"),
          value: "checkuserblock-account",
          forRegisteredOnly: true
        }]
      }];
      Twinkle.block.blockGroupsPartial = [{
        label: window.wgULS("常见部分封禁理由", "常見部分封鎖理由"),
        list: [{
          label: window.wgULS("通用部分封禁(自定义理由)", "通用部分封鎖(自訂理由)"),
          value: "uw-pblock",
          selected: true
        }, {
          label: window.wgULS("无限期部分封禁(自定义理由)", "無限期部分封鎖(自訂理由)"),
          value: "uw-pblockindef"
        }]
      }];
      Twinkle.block.callback.filtered_block_groups = (group, show_template) => {
        return $.map(group, (blockGroup) => {
          if (blockGroup.custom) {
            if (show_template) {
              let templates = $.map(Twinkle.getPref("customBlockReasonList"), (item) => {
                if (Twinkle.block.blockPresetsInfo[item.value].custom) {
                  return item.value;
                }
              });
              templates = Morebits.array.uniq(templates);
              blockGroup.list = $.map(templates, (template) => {
                return {
                  label: window.wgULS("自定义模板", "自訂模板"),
                  value: template
                };
              });
            } else {
              blockGroup.list = $.map(Twinkle.getPref("customBlockReasonList"), (item) => {
                return {
                  label: item.label,
                  value: "".concat(item.value, "|").concat(item.label)
                };
              });
            }
          }
          const list = $.map(blockGroup.list, (blockPreset) => {
            if (!show_template && blockPreset.meta) {
              return;
            }
            switch (blockPreset.value) {
              case "range block":
                if (!Morebits.ip.isRange(relevantUserName)) {
                  return;
                }
                blockPreset.selected = !Morebits.ip.get64(relevantUserName);
                break;
              default:
                break;
            }
            const blockSettings = Twinkle.block.blockPresetsInfo[blockPreset.value];
            let registrationRestrict;
            if (blockSettings.forRegisteredOnly) {
              registrationRestrict = Twinkle.block.isRegistered;
            } else if (blockSettings.forAnonOnly) {
              registrationRestrict = !Twinkle.block.isRegistered;
            } else {
              registrationRestrict = true;
            }
            if (!(blockSettings.templateName && show_template) && registrationRestrict) {
              const templateName = blockSettings.templateName || blockPreset.value;
              return {
                label: (show_template ? "{{".concat(templateName, "}}: ") : "") + blockPreset.label,
                value: blockPreset.value,
                data: [{
                  name: "template-name",
                  value: templateName
                }],
                selected: !!blockPreset.selected,
                disabled: !!blockPreset.disabled
              };
            }
          });
          if (list.length) {
            return {
              label: blockGroup.label,
              list
            };
          }
        });
      };
      Twinkle.block.callback.change_preset = (e) => {
        const {
          form
        } = e.target;
        const key = form.preset.value;
        if (!key) {
          return;
        }
        Twinkle.block.callback.update_form(e, Twinkle.block.blockPresetsInfo[key]);
        if (form.template) {
          form.template.value = Twinkle.block.blockPresetsInfo[key].templateName || key;
          Twinkle.block.callback.change_template(e);
        }
      };
      Twinkle.block.callback.change_expiry = (e) => {
        const {
          expiry
        } = e.target.form;
        if (e.target.value === "custom") {
          Morebits.quickForm.setElementVisibility(expiry.parentNode, true);
        } else {
          Morebits.quickForm.setElementVisibility(expiry.parentNode, false);
          expiry.value = e.target.value;
        }
      };
      Twinkle.block.seeAlsos = [];
      Twinkle.block.callback.toggle_see_alsos = function() {
        const reason = this.form.reason.value.replace(new RegExp("(<!-- )(参见|參見)".concat(Twinkle.block.seeAlsos.join("、"), "( -->)")), "");
        Twinkle.block.seeAlsos = Twinkle.block.seeAlsos.filter((el) => {
          return el !== this.value;
        });
        if (this.checked) {
          Twinkle.block.seeAlsos[Twinkle.block.seeAlsos.length] = this.value;
        }
        const seeAlsoMessage = Twinkle.block.seeAlsos.join("、");
        if (Twinkle.block.seeAlsos.length) {
          this.form.reason.value = "".concat(reason, "<!-- ").concat(window.wgULS("参见", "參見")).concat(seeAlsoMessage, " -->");
        } else {
          this.form.reason.value = reason;
        }
      };
      Twinkle.block.callback.update_form = (e, data) => {
        const {
          form
        } = e.target;
        let {
          expiry
        } = data;
        if (!data.useInitialOptions) {
          if (Date.parse(expiry)) {
            expiry = new Date(expiry).toGMTString();
            form.expiry_preset.value = "custom";
          } else {
            form.expiry_preset.value = data.expiry || "custom";
          }
          form.expiry.value = expiry;
          if (form.expiry_preset.value === "custom") {
            Morebits.quickForm.setElementVisibility(form.expiry.parentNode, true);
          } else {
            Morebits.quickForm.setElementVisibility(form.expiry.parentNode, false);
          }
        }
        data.disabletalk = data.disabletalk === void 0 ? false : data.disabletalk;
        data.hardblock = data.hardblock === void 0 ? false : data.hardblock;
        if (Twinkle.block.userIsBot || /bot\b/i.test(relevantUserName)) {
          data.autoblock = false;
        }
        $(form).find("[name=field_block_options]").find(":checkbox").each((_i, el) => {
          if (data.useInitialOptions && data[el.name] === void 0) {
            return;
          }
          if (el.name === "closevip") {
            return;
          }
          const check = data[el.name] === "" || !!data[el.name];
          $(el).prop("checked", check);
        });
        if (data.prependReason && data.reason) {
          form.reason.value = "".concat(data.reason, ";").concat(form.reason.value);
        } else {
          form.reason.value = data.reason || "";
        }
        if (form.pagerestrictions) {
          const $pageSelect = $(form).find("[name=pagerestrictions]");
          const $namespaceSelect = $(form).find("[name=namespacerestrictions]");
          if (!data.useInitialOptions) {
            $pageSelect.val(null).trigger("change");
            $namespaceSelect.val(null).trigger("change");
          }
          if (data.restrictions) {
            if (data.restrictions.pages && !$pageSelect.val().length) {
              const pages = data.restrictions.pages.map((pr) => {
                return pr.title;
              });
              var _iterator9 = _createForOfIteratorHelper(pages), _step9;
              try {
                for (_iterator9.s(); !(_step9 = _iterator9.n()).done; ) {
                  const page = _step9.value;
                  if (!$pageSelect.find("option[value='".concat($.escapeSelector(page), "']")).length) {
                    const newOption = new Option(page, page, true, true);
                    $pageSelect.append(newOption);
                  }
                }
              } catch (err) {
                _iterator9.e(err);
              } finally {
                _iterator9.f();
              }
              $pageSelect.val([...$pageSelect.val(), ...(0, import_ext_gadget2.generateArray)(pages)]).trigger("change");
            }
            if (data.restrictions.namespaces) {
              $namespaceSelect.val([...$namespaceSelect.val(), ...(0, import_ext_gadget2.generateArray)(data.restrictions.namespaces)]).trigger("change");
            }
          }
        }
      };
      Twinkle.block.callback.change_template = (e) => {
        const {
          form
        } = e.target;
        const {
          value
        } = form.template;
        const settings = Twinkle.block.blockPresetsInfo[value];
        const blockBox = $(form).find("[name=actiontype][value=block]").is(":checked");
        const partialBox = $(form).find("[name=actiontype][value=partial]").is(":checked");
        const templateBox = $(form).find("[name=actiontype][value=template]").is(":checked");
        if (!blockBox) {
          if (settings.indefinite || settings.nonstandard) {
            if (Twinkle.block.prev_template_expiry === null) {
              Twinkle.block.prev_template_expiry = form.template_expiry.value || "";
            }
            form.template_expiry.parentNode.style.display = "none";
            form.template_expiry.value = "infinity";
          } else if (form.template_expiry.parentNode.style.display === "none") {
            if (Twinkle.block.prev_template_expiry !== null) {
              form.template_expiry.value = Twinkle.block.prev_template_expiry;
              Twinkle.block.prev_template_expiry = null;
            }
            form.template_expiry.parentNode.style.display = "block";
          }
          if (Twinkle.block.prev_template_expiry) {
            form.expiry.value = Twinkle.block.prev_template_expiry;
          }
          Morebits.quickForm.setElementVisibility(form.notalk.parentNode, !settings.nonstandard);
          Morebits.quickForm.setElementVisibility(form.noemail_template.parentNode, partialBox);
          Morebits.quickForm.setElementVisibility(form.nocreate_template.parentNode, partialBox);
        } else if (templateBox) {
          Morebits.quickForm.setElementVisibility(form.blank_duration.parentNode, !settings.indefinite && !settings.nonstandard);
        }
        Morebits.quickForm.setElementVisibility(form.article.parentNode, settings && !!settings.pageParam);
        Morebits.quickForm.setElementVisibility(form.block_reason.parentNode, settings && !!settings.reasonParam);
        if (settings.reasonParam) {
          form.block_reason.value = Twinkle.block.blockPresetsInfo[form.preset.value].reason || "";
        } else {
          form.block_reason.value = "";
        }
        Morebits.quickForm.setElementVisibility(form.area.parentNode, partialBox && !blockBox);
        form.root.previewer.closePreview();
      };
      Twinkle.block.prev_template_expiry = null;
      Twinkle.block.callback.preview = (form) => {
        const params = {
          article: form.article.value,
          blank_duration: form.blank_duration ? form.blank_duration.checked : false,
          disabletalk: form.disabletalk.checked || (form.notalk ? form.notalk.checked : false),
          expiry: form.template_expiry ? form.template_expiry.value : form.expiry.value,
          hardblock: Twinkle.block.isRegistered ? form.autoblock.checked : form.hardblock.checked,
          indefinite: Morebits.string.isInfinity(form.template_expiry ? form.template_expiry.value : form.expiry.value),
          reason: form.block_reason.value,
          template: form.template.value,
          partial: $(form).find("[name=actiontype][value=partial]").is(":checked"),
          pagerestrictions: $(form.pagerestrictions).val() || [],
          namespacerestrictions: $(form.namespacerestrictions).val() || [],
          noemail: form.noemail.checked || (form.noemail_template ? form.noemail_template.checked : false),
          nocreate: form.nocreate.checked || (form.nocreate_template ? form.nocreate_template.checked : false),
          area: form.area.value
        };
        const templateText = Twinkle.block.callback.getBlockNoticeWikitext(params);
        form.previewer.beginRender(templateText, "User_talk:".concat(relevantUserName, "/Wikitext"));
      };
      Twinkle.block.callback.evaluate = (e) => {
        var _templateoptions;
        const params = Morebits.quickForm.getInputData(e.target);
        const $form = $(e.target);
        const toBlock = $form.find("[name=actiontype][value=block]").is(":checked");
        const toWarn = $form.find("[name=actiontype][value=template]").is(":checked");
        const toPartial = $form.find("[name=actiontype][value=partial]").is(":checked");
        const toTag = $form.find("[name=actiontype][value=tag]").is(":checked");
        const toProtect = $form.find("[name=actiontype][value=protect]").is(":checked");
        const toUnblock = $form.find("[name=actiontype][value=unblock]").is(":checked");
        let blockoptions = {};
        let templateoptions = {};
        let unblockoptions = {};
        Twinkle.block.callback.saveFieldset($form.find("[name=field_block_options]"));
        Twinkle.block.callback.saveFieldset($form.find("[name=field_template_options]"));
        Twinkle.block.callback.saveFieldset($form.find("[name=field_tag_options]"));
        Twinkle.block.callback.saveFieldset($form.find("[name=field_unblock_options]"));
        blockoptions = Twinkle.block.field_block_options;
        unblockoptions = Twinkle.block.field_unblock_options;
        const toClosevip = !!blockoptions.closevip;
        templateoptions = Twinkle.block.field_template_options;
        templateoptions.disabletalk = !!(templateoptions.disabletalk || blockoptions.disabletalk);
        templateoptions.hardblock = !!blockoptions.hardblock;
        delete blockoptions.expiry_preset;
        delete blockoptions.closevip;
        if (toPartial) {
          blockoptions.partial = true;
          templateoptions.partial = true;
        }
        templateoptions.pagerestrictions = $form.find("[name=pagerestrictions]").val() || [];
        templateoptions.namespacerestrictions = $form.find("[name=namespacerestrictions]").val() || [];
        blockoptions.pagerestrictions = templateoptions.pagerestrictions.join("|");
        blockoptions.namespacerestrictions = templateoptions.namespacerestrictions.join("|");
        (_templateoptions = templateoptions).summary || (_templateoptions.summary = blockoptions.reason);
        templateoptions.expiry = templateoptions.template_expiry || blockoptions.expiry;
        templateoptions.preset = toBlock ? params.preset : null;
        const checkIncompatible = (conflicts, extra) => {
          const count = conflicts.reduce((sum, tag) => {
            return sum += params.tag.includes(tag);
          }, 0);
          if (count > 1) {
            let message = "".concat(window.wgULS("请在以下标签中择一使用", "請在以下標籤中擇一使用"), ":{{").concat(conflicts.join("}}、{{"), "}}。");
            message += extra || "";
            void mw.notify(message, {
              type: "warn",
              tag: "twinkleblock"
            });
            return true;
          }
        };
        if (toTag) {
          if (params.tag.length === 0) {
            void mw.notify(window.wgULS("请至少选择一个用户页标记!", "請至少選擇一個使用者頁面標記!"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          }
          if (checkIncompatible(["Blocked user", "Sockpuppet"], window.wgULS("{{Sockpuppet}}已涵盖{{Blocked user}}的功能。", "{{Sockpuppet}}已涵蓋{{Blocked user}}的功能。"))) {
            return;
          }
          if (checkIncompatible(["Blocked user", "Sockpuppeteer"], window.wgULS("{{Sockpuppeteer}}已涵盖{{Blocked user}}的功能。", "{{Sockpuppeteer}}已涵蓋{{Blocked user}}的功能。"))) {
            return;
          }
          if (checkIncompatible(["Sockpuppet", "Sockpuppeteer"], window.wgULS("请从主账号和分身账号中选择一个。", "請從主賬號和分身賬號中選擇一個。"))) {
            return;
          }
          if (params.tag.includes("Sockpuppet") && params.sppUsername.trim() === "") {
            void mw.notify(window.wgULS("请提供傀儡账号的主账号用户名!", "請提供傀儡賬號的主賬號使用者名稱!"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          }
        }
        if (toBlock) {
          if (blockoptions.partial) {
            if (blockoptions.disabletalk && !blockoptions.namespacerestrictions.includes("3")) {
              void mw.notify(window.wgULS("部分封禁无法阻止编辑自己的讨论页,除非也封禁了User talk命名空间!", "部分封鎖無法阻止編輯自己的討論頁,除非也封鎖了User talk命名空間!"), {
                type: "warn",
                tag: "twinkleblock"
              });
              return;
            }
            if (!blockoptions.namespacerestrictions && !blockoptions.pagerestrictions) {
              if (!blockoptions.noemail && !blockoptions.nocreate) {
                void mw.notify(window.wgULS("没有选择页面或命名空间,也没有停用电子邮件或禁止创建账号;请选择至少一个选项以应用部分封禁!", "沒有選擇頁面或命名空間,也沒有停用電子郵件或禁止建立賬號;請選擇至少一個選項以應用部分封鎖!"), {
                  type: "warn",
                  tag: "twinkleblock"
                });
                return;
              } else if (!confirm(window.wgULS("您将要进行封禁,但没有阻止任何页面或命名空间的编辑,确定要继续?", "您將要進行封鎖,但沒有阻止任何頁面或命名空間的編輯,確定要繼續?"))) {
                return;
              }
            }
          }
          if (!blockoptions.expiry) {
            void mw.notify(window.wgULS("请提供过期时间!", "請提供過期時間!"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          } else if (Morebits.string.isInfinity(blockoptions.expiry) && !Twinkle.block.isRegistered) {
            void mw.notify(window.wgULS("禁止无限期封禁IP地址!", "禁止無限期封鎖IP位址!"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          }
          if (!blockoptions.reason) {
            void mw.notify(window.wgULS("请提供封禁理由!", "請提供封鎖理由!"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          }
          Morebits.simpleWindow.setButtonsEnabled(false);
          Morebits.status.init(e.target);
          const statusElement = new Morebits.status(window.wgULS("执行封禁", "執行封鎖"));
          blockoptions.action = "block";
          blockoptions.user = relevantUserName;
          blockoptions.anononly = blockoptions.hardblock ? void 0 : true;
          blockoptions.allowusertalk = blockoptions.disabletalk ? void 0 : true;
          const query = {
            format: "json",
            action: "query",
            list: "blocks|logevents",
            letype: "block",
            lelimit: 1,
            letitle: "User:".concat(blockoptions.user)
          };
          if (mw.util.isIPAddress(blockoptions.user, true)) {
            query.bkip = blockoptions.user;
          } else {
            query.bkusers = blockoptions.user;
            query.list += "|users";
            query.usprop = "groups";
            query.ususers = blockoptions.user;
            query.meta = "tokens";
            query.type = "userrights";
          }
          void api.get(query).then((data) => {
            let [block] = data.query.blocks;
            if (data.query.blocks.length > 1 && block.user !== relevantUserName) {
              [, block] = data.query.blocks;
            }
            const [logevents] = data.query.logevents;
            const user = data.query.users ? data.query.users[0] : null;
            const logid = data.query.logevents.length ? logevents.logid : false;
            if (logid !== Twinkle.block.blockLogId || !!block !== !!Twinkle.block.currentBlockInfo) {
              let message = blockoptions.user + window.wgULS("的封禁状态已被修改。", "的封鎖狀態已被修改。");
              if (block) {
                message += window.wgULS("新状态:", "新狀態:");
              } else {
                message += window.wgULS("最新日志:", "最新日誌:");
              }
              let logExpiry = "";
              if (logevents.params.duration) {
                if (logevents.params.duration === "infinity") {
                  logExpiry = window.wgULS("无限期", "無限期");
                } else {
                  const expiryDate = new Morebits.date(logevents.params.expiry);
                  logExpiry += (expiryDate.isBefore(/* @__PURE__ */ new Date()) ? window.wgULS("过期于", "過期於") : "直到") + expiryDate.calendar();
                }
              } else {
                logExpiry = "於".concat(new Morebits.date(logevents.timestamp).calendar());
              }
              message += "由".concat(logevents.user).concat(window.wgULS("以“", "以「")).concat(logevents.comment).concat(window.wgULS("”", "」")).concat(blockActionText[logevents.action]).concat(logExpiry).concat(window.wgULS(",你想要以你的设置更改封禁吗?", ",你想要以你的設定變更封鎖嗎?"));
              if (!confirm(message)) {
                Morebits.status.info(window.wgULS("执行封禁", "執行封鎖"), window.wgULS("用户取消操作", "使用者取消操作"));
                return;
              }
              blockoptions.reblock = 1;
            }
            const groupsCanBeRemoved = ["autoreviewer", "confirmed", "rnrsverify-exempt", "massmessage-sender", "patroller", "templateeditor", "transwiki"];
            let groupsToBeRemoved = [];
            if (user && Morebits.string.isInfinity(blockoptions.expiry)) {
              groupsToBeRemoved = user.groups.filter((group) => {
                return groupsCanBeRemoved.includes(group);
              });
            }
            blockoptions.tags = Twinkle.changeTags;
            blockoptions.token = mw.user.tokens.get("csrfToken");
            const mbApi = new Morebits.wiki.api(window.wgULS("执行封禁", "執行封鎖"), blockoptions, () => {
              statusElement.info("完成");
              if (toWarn) {
                Twinkle.block.callback.issue_template(templateoptions);
              }
              if (toClosevip) {
                const vipPage = new Morebits.wiki.page("Qiuwen_talk:报告当前破坏", window.wgULS("关闭请求", "關閉請求"));
                vipPage.setFollowRedirect(true);
                vipPage.setCallbackParameters(blockoptions);
                vipPage.load(Twinkle.block.callback.closeRequest);
              }
              if (groupsToBeRemoved.length > 0) {
                const rightStatusElement = new Morebits.status(window.wgULS("移除权限", "移除權限"));
                if (confirm(window.wgULS("该用户有以下权限:", "該使用者有以下權限:") + groupsToBeRemoved.join("、") + window.wgULS(",您是否想要同时移除这些权限?", ",您是否想要同時移除這些權限?"))) {
                  const revokeOptions = {
                    action: "userrights",
                    user: blockoptions.user,
                    remove: groupsToBeRemoved.join("|"),
                    reason: window.wgULS("用户已被无限期封禁", "使用者已被無限期封鎖"),
                    token: data.query.tokens.userrightstoken,
                    tags: Twinkle.changeTags
                  };
                  const mrApi = new Morebits.wiki.api(window.wgULS("移除权限", "移除權限"), revokeOptions, () => {
                    rightStatusElement.info("已移除".concat(groupsToBeRemoved.join("、")));
                  });
                  mrApi.post();
                } else {
                  rightStatusElement.error(window.wgULS("用户取消操作。", "使用者取消操作。"));
                }
              }
            });
            mbApi.post();
          });
        } else if (toWarn) {
          Morebits.simpleWindow.setButtonsEnabled(false);
          Morebits.status.init(e.target);
          Twinkle.block.callback.issue_template(templateoptions);
        }
        if (toTag || toProtect) {
          Morebits.simpleWindow.setButtonsEnabled(false);
          Morebits.status.init(e.target);
          const userPage = "User:".concat(mw.config.get("wgRelevantUserName"));
          const qiuwen_page = new Morebits.wiki.page(userPage, window.wgULS("标记或保护用户页", "標記或保護使用者頁面"));
          qiuwen_page.setCallbackParameters(params);
          qiuwen_page.load(Twinkle.block.callback.taguserpage);
        }
        if (toUnblock) {
          if (!unblockoptions.reason) {
            void mw.notify(window.wgULS("请提供解除封禁理由!", "請提供解除封鎖理由!"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          }
          Morebits.simpleWindow.setButtonsEnabled(false);
          Morebits.status.init(e.target);
          const unblockStatusElement = new Morebits.status(window.wgULS("执行解除封禁", "執行解除封鎖"));
          unblockoptions.action = "unblock";
          unblockoptions.user = mw.config.get("wgRelevantUserName");
          unblockoptions.tags = Twinkle.changeTags;
          unblockoptions.token = mw.user.tokens.get("csrfToken");
          const unblockMbApi = new Morebits.wiki.api(window.wgULS("执行解除封禁", "執行解除封鎖"), unblockoptions, () => {
            unblockStatusElement.info("完成");
          });
          unblockMbApi.post();
        }
        if (!toBlock && !toWarn && !toTag && !toProtect && !toUnblock) {
          void mw.notify(window.wgULS("请给Twinkle点事做!", "請給Twinkle點事做!"), {
            type: "warn",
            tag: "twinkleblock"
          });
        }
      };
      Twinkle.block.callback.taguserpage = (pageobj) => {
        const params = pageobj.getCallbackParameters();
        const statelem = pageobj.getStatusElement();
        if (params.actiontype.includes("tag")) {
          const tags = [];
          var _iterator10 = _createForOfIteratorHelper(params.tag), _step10;
          try {
            for (_iterator10.s(); !(_step10 = _iterator10.n()).done; ) {
              const tag = _step10.value;
              let tagtext = "{{".concat(tag);
              switch (tag) {
                case "Blocked user":
                  break;
                case "Sockpuppet":
                  tagtext += "\n| 1 = ".concat(params.sppUsername.trim());
                  tagtext += "\n| 2 = ".concat(params.sppType.trim());
                  if (params.sppEvidence.trim()) {
                    tagtext += "\n| evidence = ".concat(params.sppEvidence.trim());
                  }
                  tagtext += "\n| locked = no";
                  tagtext += "\n| notblocked = no";
                  tagtext += "\n";
                  break;
                case "Sockpuppeteer":
                  tagtext += "\n| 1 = blocked";
                  tagtext += "\n| checked = ".concat(params.spmChecked ? "yes" : "");
                  if (params.spmEvidence.trim()) {
                    tagtext += "\n| evidence = ".concat(params.spmEvidence.trim());
                  }
                  tagtext += "\n";
                  break;
                default:
                  void mw.notify(window.wgULS("未知的用户页模板!", "未知的使用者頁面模板!"), {
                    type: "warn",
                    tag: "twinkleblock"
                  });
                  continue;
              }
              tagtext += "}}";
              tags[tags.length] = tagtext;
            }
          } catch (err) {
            _iterator10.e(err);
          } finally {
            _iterator10.f();
          }
          const text = tags.join("\n");
          pageobj.setPageText(text);
          pageobj.setEditSummary(window.wgULS("标记被永久封禁的用户页", "標記被永久封鎖的使用者頁面"));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.save(() => {
            Morebits.status.info(window.wgULS("标记用户页", "標記使用者頁面"), "完成");
            statelem.status(window.wgULS("正在保护页面", "正在保護頁面"));
            pageobj.load(Twinkle.block.callback.protectuserpage);
          });
        } else {
          Twinkle.block.callback.protectuserpage(pageobj);
        }
      };
      Twinkle.block.callback.protectuserpage = (pageobj) => {
        const params = pageobj.getCallbackParameters();
        const statelem = pageobj.getStatusElement();
        if (params.actiontype.includes("protect")) {
          if (pageobj.exists()) {
            pageobj.setEditProtection("sysop", "indefinite");
            pageobj.setMoveProtection("sysop", "indefinite");
          } else {
            pageobj.setCreateProtection("sysop", "indefinite");
          }
          pageobj.setEditSummary(window.wgULS("被永久封禁的用户页", "被永久封鎖的使用者頁面"));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.protect(() => {
            Morebits.status.info(window.wgULS("保护用户页", "保護使用者頁面"), pageobj.exists() ? window.wgULS("已全保护", "已全保護") : window.wgULS("已白纸保护", "已白紙保護"));
            statelem.info("全部完成");
          });
        } else {
          statelem.info("全部完成");
        }
      };
      Twinkle.block.callback.issue_template = (formData) => {
        const userTalkPage = "User_talk:".concat(mw.config.get("wgRelevantUserName"));
        const params = {
          ...formData,
          messageData: Twinkle.block.blockPresetsInfo[formData.template],
          usertalk_summary: Twinkle.block.blockPresetsInfo[formData.preset || formData.template].summary,
          reason: Twinkle.block.field_template_options.block_reason,
          disabletalk: Twinkle.block.field_template_options.notalk,
          noemail: Twinkle.block.field_template_options.noemail_template,
          nocreate: Twinkle.block.field_template_options.nocreate_template
        };
        Morebits.wiki.actionCompleted.redirect = userTalkPage;
        Morebits.wiki.actionCompleted.notice = window.wgULS("完成,将在几秒后加载用户讨论页", "完成,將在幾秒後載入使用者討論頁");
        const qiuwen_page = new Morebits.wiki.page(userTalkPage, window.wgULS("用户讨论页修改", "使用者討論頁修改"));
        qiuwen_page.setCallbackParameters(params);
        qiuwen_page.load(Twinkle.block.callback.main);
      };
      Twinkle.block.callback.closeRequest = (vipPage) => {
        const params = vipPage.getCallbackParameters();
        let text = vipPage.getPageText();
        const statusElement = vipPage.getStatusElement();
        const userName = mw.config.get("wgRelevantUserName");
        const expiryText = Morebits.string.formatTime(params.expiry);
        const comment = "{{Blocked|".concat(Morebits.string.isInfinity(params.expiry) ? "indef" : expiryText, "}}。");
        const requestList = text.split(/(?=\n===.+===\s*\n)/);
        let found = false;
        let hidename = false;
        const vipRe = new RegExp("{{\\s*[Vv]andal\\s*\\|\\s*(1\\s*=\\s*)?".concat(Morebits.pageNameRegex(userName), "\\s*(\\|\\s*hidename\\s*=[^|]+)?}}"), "m");
        var _iterator11 = _createForOfIteratorHelper(requestList), _step11;
        try {
          for (_iterator11.s(); !(_step11 = _iterator11.n()).done; ) {
            let request = _step11.value;
            if (vipRe.exec(request)) {
              hidename = /\|\s*hidename\s*=[^|]+/.test(request);
              request = request.trimEnd();
              let newText = request.replace(/^(\*\s*处理:)[ \t]*(<!-- 非管理員僅可標記已執行的封禁,針對提報的意見請放在下一行 -->)?[ \t]*$/m, "$1".concat(comment, "--~~").concat("~~"));
              if (request === newText) {
                newText = "".concat(request, "\n* 处理:").concat(comment, "--~~").concat("~~");
              }
              request = "".concat(newText, "\n");
              found = true;
              break;
            }
          }
        } catch (err) {
          _iterator11.e(err);
        } finally {
          _iterator11.f();
        }
        if (!found) {
          statusElement.warn(window.wgULS("没有找到相关的请求", "沒有找到相關的請求"));
          return;
        }
        text = requestList.join("");
        let summary;
        if (hidename) {
          summary = window.wgULS("标记为已处理", "標記為已處理");
        } else {
          summary = "/* ".concat(userName, " */ ");
          if (Morebits.string.isInfinity(params.expiry)) {
            summary += window.wgULS("不限期封禁", "不限期封鎖");
          } else {
            summary += window.wgULS("封禁", "封鎖") + expiryText;
          }
        }
        vipPage.setEditSummary(summary);
        vipPage.setChangeTags(Twinkle.changeTags);
        vipPage.setPageText(text);
        vipPage.save();
      };
      Twinkle.block.callback.getBlockNoticeWikitext = (params) => {
        let text = "{{";
        const settings = Twinkle.block.blockPresetsInfo[params.template];
        if (settings.nonstandard) {
          text += params.template;
        } else {
          text += "subst:".concat(params.template);
          if (params.article && settings.pageParam) {
            text += "|page=".concat(params.article);
          }
          if (!/te?mp|^\s*$|min/.exec(params.expiry)) {
            if (params.indefinite) {
              text += "|indef=yes";
            } else if (!params.blank_duration) {
              text += "|time=".concat(Morebits.string.formatTime(params.expiry));
            }
          }
          if (!Twinkle.block.isRegistered && !params.hardblock) {
            text += "|anon=yes";
          }
          if (params.reason) {
            text += "|reason=".concat(params.reason);
          }
          if (params.disabletalk) {
            text += "|notalk=yes";
          }
          if (params.partial) {
            if (params.pagerestrictions.length || params.namespacerestrictions.length) {
              const makeSentence = (array) => {
                if (array.length < 3) {
                  return array.join("和");
                }
                const last = array.pop();
                return "".concat(array.join("、"), "和").concat(last);
              };
              text += "|area=某些";
              if (params.pagerestrictions.length) {
                text += "頁面(".concat(makeSentence(params.pagerestrictions.map((p) => {
                  return "[[:".concat(p, "]]");
                })));
                text += params.namespacerestrictions.length ? ")和某些" : ")";
              }
              if (params.namespacerestrictions.length) {
                const namespaceNames = params.namespacerestrictions.map((id) => {
                  return menuFormattedNamespaces[id];
                });
                text += "".concat(window.wgULS("[[Help:命名空间|命名空间]](", "[[Help:命名空間|命名空間]](") + makeSentence(namespaceNames), ")");
              }
            } else if (params.area) {
              text += "|area=".concat(params.area);
            } else {
              if (params.noemail) {
                text += "|email=yes";
              }
              if (params.nocreate) {
                text += "|accountcreate=yes";
              }
            }
          }
        }
        if (settings.sig) {
          text += "|sig=".concat(settings.sig);
        }
        return "".concat(text, "}}");
      };
      Twinkle.block.callback.main = (pageobj) => {
        const params = pageobj.getCallbackParameters();
        const date = new Morebits.date(pageobj.getLoadTime());
        const {
          messageData
        } = params;
        let text;
        params.indefinite = Morebits.string.isInfinity(params.expiry);
        if (Twinkle.getPref("blankTalkpageOnIndefBlock") && params.template !== "uw-lblock" && params.indefinite) {
          Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("根据参数设置清空讨论页并为日期创建新2级标题", "根據偏好設定清空討論頁並為日期建立新2級標題"));
          text = "".concat(date.monthHeader(), "\n");
        } else {
          text = pageobj.getPageText();
          const dateHeaderRegex = date.monthHeaderRegex();
          let dateHeaderRegexLast;
          let dateHeaderRegexResult;
          while ((dateHeaderRegexLast = dateHeaderRegex.exec(text)) !== null) {
            dateHeaderRegexResult = dateHeaderRegexLast;
          }
          const lastHeaderIndex = text.lastIndexOf("\n==") + 1;
          if (text.length > 0) {
            text += "\n\n";
          }
          if (!dateHeaderRegexResult || dateHeaderRegexResult.index !== lastHeaderIndex) {
            Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("未找到当月的二级标题,将创建新的", "未找到當月的二級標題,將建立新的"));
            text += "".concat(date.monthHeader(), "\n");
          }
        }
        params.expiry = params.template_expiry === void 0 ? params.expiry : params.template_expiry;
        text += Twinkle.block.callback.getBlockNoticeWikitext(params);
        let summary = params.usertalk_summary;
        if (messageData.suppressArticleInSummary !== true && params.article) {
          summary += "".concat(window.wgULS(",于", ",於"), "[[:").concat(params.article, "]]");
        }
        pageobj.setPageText(text);
        pageobj.setEditSummary(summary);
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setWatchlist(Twinkle.getPref("watchBlockNotices"));
        pageobj.save();
      };
      Twinkle.addInitCallback(Twinkle.block, "block");
    })(jQuery);
  }
});
//! src/Twinkle/modules/friendlytalkback.js
var friendlytalkback_exports = {};
var init_friendlytalkback = __esm({
  "src/Twinkle/modules/friendlytalkback.js"() {
    "use strict";
    /*! Twinkle.js - friendlytalkback.js */
    (function friendlytalkback($) {
      const $body = $("body");
      Twinkle.talkback = () => {
        if (!mw.config.get("wgRelevantUserName")) {
          return;
        }
        Twinkle.addPortletLink(Twinkle.talkback.callback, "通告", "friendly-talkback", window.wgULS("回复通告", "回覆通告"));
      };
      Twinkle.talkback.callback = () => {
        if (mw.config.get("wgRelevantUserName") === mw.config.get("wgUserName") && !confirm(window.wgULS("您寂寞到了要自己回复自己的程度么?", "您寂寞到了要自己回覆自己的程度麼?"))) {
          return;
        }
        const Window = new Morebits.simpleWindow(600, 350);
        Window.setTitle(window.wgULS("回复通告", "回覆通告"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("关于{{talkback}}", "關於{{talkback}}"), "Template:Talkback");
        Window.addFooterLink(window.wgULS("通告设置", "通告設定"), "H:TW/PREF#talkback");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#talkback");
        const form = new Morebits.quickForm(Twinkle.talkback.evaluate);
        form.append({
          type: "radio",
          name: "tbtarget",
          list: [{
            label: window.wgULS("回复:我的讨论页", "回覆:我的討論頁"),
            value: "mytalk",
            checked: "true"
          }, {
            label: window.wgULS("回复:其他用户的讨论页", "回覆:其他使用者的討論頁"),
            value: "usertalk"
          }, {
            label: window.wgULS("回复:其它页面", "回覆:其它頁面"),
            value: "other"
          }, {
            label: window.wgULS("邀请讨论", "邀請討論"),
            value: "see"
          }, {
            label: "通告板通知",
            value: "notice"
          }, {
            label: window.wgULS("“有新邮件”", "「有新郵件」"),
            value: "mail"
          }],
          event: Twinkle.talkback.changeTarget
        });
        form.append({
          type: "field",
          label: "工作区",
          name: "work_area"
        });
        const previewlink = document.createElement("a");
        $(previewlink).on("click", () => {
          Twinkle.talkback.preview(result);
        });
        previewlink.style.cursor = "pointer";
        previewlink.textContent = window.wgULS("预览", "預覽");
        form.append({
          type: "div",
          id: "talkbackpreview",
          label: [previewlink]
        });
        form.append({
          type: "div",
          id: "friendlytalkback-previewbox",
          style: "display: none"
        });
        form.append({
          type: "submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        result.previewer = new Morebits.wiki.preview($(result).find("div#friendlytalkback-previewbox").last()[0]);
        const evt = document.createEvent("Event");
        evt.initEvent("change", true, true);
        result.tbtarget[0].dispatchEvent(evt);
        const query = {
          action: "query",
          prop: "extlinks",
          titles: "User talk:".concat(mw.config.get("wgRelevantUserName")),
          elquery: "userjs.invalid/noTalkback",
          ellimit: "1"
        };
        const qiuwen_api = new Morebits.wiki.api(window.wgULS("抓取退出通告信息", "抓取退出通告資訊"), query, Twinkle.talkback.callback.optoutStatus);
        qiuwen_api.post();
      };
      Twinkle.talkback.optout = "";
      Twinkle.talkback.callback.optoutStatus = (apiobj) => {
        const $el = $(apiobj.getXML()).find("el");
        if ($el.length) {
          Twinkle.talkback.optout = mw.config.get("wgRelevantUserName") + window.wgULS("不希望收到回复通告", "不希望收到回覆通告");
          const url = $el.text();
          const reason = mw.util.getParamValue("reason", url);
          Twinkle.talkback.optout += reason ? ":".concat(Morebits.string.appendPunctuation(reason)) : "。";
        }
        $body.find("#twinkle-talkback-optout-message").text(Twinkle.talkback.optout);
      };
      let prev_page = "";
      let prev_section = "";
      let prev_message = "";
      Twinkle.talkback.changeTarget = (e) => {
        const value = e.target.values;
        const root = e.target.form;
        const [old_area] = Morebits.quickForm.getElements(root, "work_area");
        if (root.section) {
          prev_section = root.section.value;
        }
        if (root.message) {
          prev_message = root.message.value;
        }
        if (root.page) {
          prev_page = root.page.value;
        }
        let work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("回复通告信息", "回覆通告資訊"),
          name: "work_area"
        });
        root.previewer.closePreview();
        switch (value) {
          case "usertalk":
            work_area.append({
              type: "div",
              label: "",
              style: "color: #f00",
              id: "twinkle-talkback-optout-message"
            });
            work_area.append({
              type: "input",
              name: "page",
              label: window.wgULS("用户(必填)", "使用者(必填)"),
              tooltip: window.wgULS("您留言页面的用户名,必填。", "您留言頁面的使用者名稱,必填。"),
              value: prev_page,
              required: true
            });
            work_area.append({
              type: "input",
              name: "section",
              label: window.wgULS("章节(可选)", "章節(可選)"),
              tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
              value: prev_section
            });
            break;
          case "notice": {
            const noticeboard = work_area.append({
              type: "select",
              name: "noticeboard",
              label: "通告板:"
            });
            for (var _i6 = 0, _Object$entries4 = Object.entries(Twinkle.talkback.noticeboards); _i6 < _Object$entries4.length; _i6++) {
              const [nbname, data] = _Object$entries4[_i6];
              noticeboard.append({
                type: "option",
                label: data.label,
                value: nbname,
                selected: !!data.defaultSelected
              });
            }
            work_area.append({
              type: "input",
              name: "section",
              label: window.wgULS("章节(可选)", "章節(可選)"),
              tooltip: window.wgULS("章节标题,留空则不会产生章节链接。", "章節標題,留空則不會產生章節連結。"),
              value: prev_section
            });
            break;
          }
          case "other":
            work_area.append({
              type: "div",
              label: "",
              style: "color: #f00",
              id: "twinkle-talkback-optout-message"
            });
            work_area.append({
              type: "input",
              name: "page",
              label: window.wgULS("完整页面名", "完整頁面名"),
              tooltip: window.wgULS("您留下消息的完整页面名,例如“Qiuwen_talk:首页”。", "您留下訊息的完整頁面名,例如「Qiuwen_talk:首頁」。"),
              value: prev_page,
              required: true
            });
            work_area.append({
              type: "input",
              name: "section",
              label: window.wgULS("章节(可选)", "章節(可選)"),
              tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
              value: prev_section
            });
            break;
          case "mail":
            work_area.append({
              type: "input",
              name: "section",
              label: window.wgULS("电子邮件主题(可选)", "電子郵件主題(可選)"),
              tooltip: window.wgULS("您发出的电子邮件的主题。", "您發出的電子郵件的主題。")
            });
            break;
          case "see":
            work_area.append({
              type: "input",
              name: "page",
              label: window.wgULS("完整页面名", "完整頁面名"),
              tooltip: window.wgULS("您留下消息的完整页面名,例如“Qiuwen_talk:首页”。", "您留下訊息的完整頁面名,例如「Qiuwen_talk:首頁」。"),
              value: prev_page,
              required: true
            });
            work_area.append({
              type: "input",
              name: "section",
              label: window.wgULS("章节(可选)", "章節(可選)"),
              tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
              value: prev_section
            });
            break;
          default:
            work_area.append({
              type: "div",
              label: "",
              style: "color: #f00",
              id: "twinkle-talkback-optout-message"
            });
            work_area.append({
              type: "input",
              name: "section",
              label: window.wgULS("章节(可选)", "章節(可選)"),
              tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
              value: prev_section
            });
            break;
        }
        if (value !== "notice") {
          work_area.append({
            type: "textarea",
            label: window.wgULS("附加信息(可选):", "附加資訊(可選):"),
            name: "message",
            tooltip: window.wgULS("会在回复通告模板下出现的消息,您的签名会被加在最后。", "會在回覆通告模板下出現的訊息,您的簽名會被加在最後。")
          });
        }
        work_area = work_area.render();
        root.replaceChild(work_area, old_area);
        if (root.message) {
          root.message.value = prev_message;
        }
        $body.find("#twinkle-talkback-optout-message").text(Twinkle.talkback.optout);
      };
      Twinkle.talkback.noticeboards = {
        affp: {
          label: "QW:AF/FP(".concat(window.wgULS("过滤器处理/报告", "過濾器處理/報告"), ")"),
          title: window.wgULS("过滤器错误报告有新回应", "過濾器錯誤報告有新回應"),
          content: "".concat(window.wgULS("您的[[Qiuwen_talk:过滤器处理/报告|过滤器错误报告]]已有回应,请前往查看。", "您的[[Qiuwen_talk:过滤器处理/报告|過濾器錯誤報告]]已有回應,請前往查看。"), "--~~").concat("~~"),
          editSummary: window.wgULS("有关[[Qiuwen_talk:过滤器处理/报告|过滤器错误报告]]的通知", "有關[[Qiuwen_talk:过滤器处理/报告|過濾器錯誤報告]]的通知"),
          defaultSelected: true
        },
        sbl: {
          label: "Spam-blacklist",
          title: window.wgULS("垃圾链接黑名单请求有新回应", "垃圾連結黑名單請求有新回應"),
          content: "".concat(window.wgULS("您的[[Qiuwen_talk:管理员告示板|垃圾链接黑名单请求]]已有回应,请前往查看。", "您的[[Qiuwen_talk:管理员告示板|垃圾連結黑名單請求]]已有回應,請前往查看。"), "--~~").concat("~~"),
          editSummary: window.wgULS("有关[[Qiuwen_talk:管理员告示板|垃圾链接黑名单请求]]的通知", "有關[[Qiuwen_talk:管理员告示板|垃圾連結黑名單請求]]的通知")
        },
        shl: {
          label: "Spam-whitelist",
          title: window.wgULS("垃圾链接白名单请求有新回应", "垃圾連結白名單請求有新回應"),
          content: "".concat(window.wgULS("您的[[Qiuwen_talk:管理员告示板|垃圾链接白名单请求]]已有回应,请前往查看。", "您的[[Qiuwen_talk:管理员告示板|垃圾連結白名單請求]]已有回應,請前往查看。"), "--~~").concat("~~"),
          editSummary: window.wgULS("有关[[Qiuwen_talk:管理员告示板|垃圾链接白名单请求]]的通知", "有關[[Qiuwen_talk:管理员告示板|垃圾連結白名單請求]]的通知")
        }
      };
      Twinkle.talkback.evaluate = (e) => {
        const form = e.target;
        const [tbtarget] = form.getChecked("tbtarget");
        let page;
        let message;
        const section = form.section.value;
        let editSummary;
        if (tbtarget === "notice") {
          page = form.noticeboard.value;
          ({
            editSummary
          } = Twinkle.talkback.noticeboards[page]);
        } else {
          page = form.page ? form.page.value : mw.config.get("wgUserName");
          if (form.message) {
            message = form.message.value.trim();
          }
          if (tbtarget === "mail") {
            editSummary = window.wgULS("通知:有新邮件", "通知:有新郵件");
          } else if (tbtarget === "see") {
            editSummary = "".concat(window.wgULS("请看看", "請看看"), "[[:").concat(page).concat(section ? "#".concat(section) : "", "]]").concat(window.wgULS("上的讨论", "上的討論"));
          } else {
            editSummary = "".concat(window.wgULS("回复通告", "回覆通告"), "([[:");
            if (tbtarget !== "other" && !new RegExp("^\\s*".concat(Morebits.namespaceRegex(3), ":"), "i").test(page)) {
              editSummary += "User talk:";
            }
            editSummary += "".concat(page + (section ? "#".concat(section) : ""), "]])");
          }
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        const fullUserTalkPageName = "".concat(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").user_talk], ":").concat(mw.config.get("wgRelevantUserName"));
        Morebits.wiki.actionCompleted.redirect = fullUserTalkPageName;
        Morebits.wiki.actionCompleted.notice = window.wgULS("回复通告完成,将在几秒内刷新页面", "回覆通告完成,將在幾秒內重新整理頁面");
        const text = "\n\n".concat(Twinkle.talkback.getNoticeWikitext(tbtarget, page, section, message)[0]);
        const talkpage = new Morebits.wiki.page(fullUserTalkPageName, window.wgULS("加入回复通告", "加入回覆通告"));
        talkpage.setEditSummary(editSummary);
        talkpage.setChangeTags(Twinkle.changeTags);
        talkpage.setAppendText(text);
        talkpage.setCreateOption("recreate");
        talkpage.setMinorEdit(Twinkle.getPref("markTalkbackAsMinor"));
        talkpage.setFollowRedirect(true);
        talkpage.append();
      };
      Twinkle.talkback.preview = (form) => {
        const [tbtarget] = form.getChecked("tbtarget");
        const section = form.section.value;
        let page;
        let message;
        if (tbtarget === "notice") {
          page = form.noticeboard.value;
        } else {
          page = form.page ? form.page.value : mw.config.get("wgUserName");
          if (form.message) {
            message = form.message.value.trim();
          }
        }
        const [noticetext] = Twinkle.talkback.getNoticeWikitext(tbtarget, page, section, message);
        form.previewer.beginRender(noticetext, "User_talk:".concat(mw.config.get("wgRelevantUserName")));
      };
      Twinkle.talkback.getNoticeWikitext = (tbtarget, page, section, message) => {
        let text;
        let title;
        let content;
        if (tbtarget === "notice") {
          ({
            title
          } = Twinkle.talkback.noticeboards[page]);
          content = Morebits.string.safeReplace(Twinkle.talkback.noticeboards[page].content, "$SECTION", section);
          text = "== ".concat(title, " ==\n").concat(content);
        } else if (tbtarget === "see") {
          title = page + window.wgULS("的相关讨论", "的相關討論");
          content = "{{".concat("subst:", "Please see|location=".concat(page).concat(section ? "#".concat(section) : "", "|more=").concat(message.trim(), "}}"));
          text = "{{".concat("subst:", "Please see|location=".concat(page).concat(section ? "#".concat(section) : "", "|more=").concat(message.trim(), "}}"));
        } else {
          text = "==";
          if (tbtarget === "mail") {
            title = Twinkle.getPref("mailHeading");
            content = "{{You've got mail|subject=".concat(section, "|ts=~~").concat("~", "~~}}");
            text += "".concat(Twinkle.getPref("mailHeading"), "==\n{{You've got mail|subject=").concat(section);
          } else {
            title = Twinkle.getPref("talkbackHeading").replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1");
            content = "{{talkback|".concat(page).concat(section ? "|".concat(section) : "");
            text += "".concat(Twinkle.getPref("talkbackHeading").replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1"), "==\n{{talkback|").concat(page).concat(section ? "|".concat(section) : "");
          }
          content += "|ts=~~".concat("~", "~~}}");
          text += "|ts=~~".concat("~", "~~}}");
          if (message) {
            content += "\n".concat(message);
            text += "\n".concat(message, "  ~~").concat("~~");
          } else if (Twinkle.getPref("insertTalkbackSignature")) {
            text += "\n~~".concat("~~");
          }
        }
        return [text, title, content];
      };
      Twinkle.addInitCallback(Twinkle.talkback, "talkback");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklespeedy.js
var twinklespeedy_exports = {};
var import_ext_gadget3;
var init_twinklespeedy = __esm({
  "src/Twinkle/modules/twinklespeedy.js"() {
    "use strict";
    import_ext_gadget3 = require("ext.gadget.Util");
    /*! Twinkle.js - twinklespeedy.js */
    (function twinklespeedy($) {
      const $body = $("body");
      Twinkle.speedy = () => {
        if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId")) {
          return;
        }
        Twinkle.addPortletLink(Twinkle.speedy.callback, window.wgULS("速删", "速刪"), "tw-csd", Morebits.userIsSysop ? window.wgULS("快速删除", "快速刪除") : window.wgULS("请求快速删除", "請求快速刪除"));
      };
      Twinkle.speedy.callback = () => {
        Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
      };
      Twinkle.speedy.dialog = null;
      Twinkle.speedy.hasCSD = !!document.querySelector("#delete-reason");
      Twinkle.speedy.mode = {
        sysopSingleSubmit: 1,
        // radio buttons, no subgroups, submit when "Submit" button is clicked
        sysopRadioClick: 2,
        // radio buttons, no subgroups, submit when a radio button is clicked
        sysopMultipleSubmit: 3,
        // check boxes, subgroups, "Submit" button already present
        sysopMultipleRadioClick: 4,
        // check boxes, subgroups, need to add a "Submit" button
        userMultipleSubmit: 5,
        // check boxes, subgroups, "Submit" button already pressent
        userMultipleRadioClick: 6,
        // check boxes, subgroups, need to add a "Submit" button
        userSingleSubmit: 7,
        // radio buttons, subgroups, submit when "Submit" button is clicked
        userSingleRadioClick: 8,
        // radio buttons, subgroups, submit when a radio button is clicked
        // are we in "delete page" mode?
        // (sysops can access both "delete page" [sysop] and "tag page only" [user] modes)
        isSysop: (mode) => {
          return mode === Twinkle.speedy.mode.sysopSingleSubmit || mode === Twinkle.speedy.mode.sysopMultipleSubmit || mode === Twinkle.speedy.mode.sysopRadioClick || mode === Twinkle.speedy.mode.sysopMultipleRadioClick;
        },
        // do we have a "Submit" button once the form is created?
        hasSubmitButton: (mode) => {
          return mode === Twinkle.speedy.mode.sysopSingleSubmit || mode === Twinkle.speedy.mode.sysopMultipleSubmit || mode === Twinkle.speedy.mode.sysopMultipleRadioClick || mode === Twinkle.speedy.mode.userMultipleSubmit || mode === Twinkle.speedy.mode.userMultipleRadioClick || mode === Twinkle.speedy.mode.userSingleSubmit;
        },
        // is db-multiple the outcome here?
        isMultiple: (mode) => {
          return mode === Twinkle.speedy.mode.userMultipleSubmit || mode === Twinkle.speedy.mode.sysopMultipleSubmit || mode === Twinkle.speedy.mode.userMultipleRadioClick || mode === Twinkle.speedy.mode.sysopMultipleRadioClick;
        }
      };
      Twinkle.speedy.initDialog = (callbackfunc) => {
        Twinkle.speedy.dialog = new Morebits.simpleWindow(Twinkle.getPref("speedyWindowWidth"), Twinkle.getPref("speedyWindowHeight"));
        const {
          dialog
        } = Twinkle.speedy;
        dialog.setTitle(window.wgULS("选择快速删除理由", "選擇快速刪除理由"));
        dialog.setScriptName("Twinkle");
        dialog.addFooterLink(window.wgULS("快速删除方针", "快速刪除方針"), "QW:CSD");
        dialog.addFooterLink(window.wgULS("速删设置", "速刪設定"), "H:TW/PREF#speedy");
        dialog.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#speedy");
        const form = new Morebits.quickForm(callbackfunc, Twinkle.getPref("speedySelectionStyle") === "radioClick" ? "change" : null);
        if (Morebits.userIsSysop) {
          form.append({
            type: "checkbox",
            list: [{
              label: window.wgULS("只标记,不删除", "只標記,不刪除"),
              value: "tag_only",
              name: "tag_only",
              tooltip: window.wgULS("若您只想标记此页面而不是将其删除", "若您只想標記此頁面而不是將其刪除"),
              checked: !(Twinkle.speedy.hasCSD || Twinkle.getPref("deleteSysopDefaultToDelete")),
              event: (event) => {
                const cForm = event.target.form;
                const cChecked = event.target.checked;
                if (cForm.talkpage) {
                  cForm.talkpage.disabled = cChecked;
                  cForm.talkpage.checked = !cChecked && Twinkle.getPref("deleteTalkPageOnDelete");
                }
                cForm.redirects.disabled = cChecked;
                cForm.redirects.checked = !cChecked;
                cForm.delmultiple.disabled = cChecked;
                cForm.delmultiple.checked = false;
                cForm.openusertalk.disabled = cChecked;
                cForm.openusertalk.checked = false;
                cForm.notify.disabled = !cChecked;
                cForm.notify.checked = cChecked;
                cForm.multiple.disabled = !cChecked;
                cForm.multiple.checked = false;
                cForm.salting.checked = false;
                Twinkle.speedy.callback.modeChanged(cForm);
                event.stopPropagation();
              }
            }]
          });
          const deleteOptions = form.append({
            type: "div",
            name: "delete_options"
          });
          deleteOptions.append({
            type: "header",
            label: window.wgULS("删除相关选项", "刪除相關選項")
          });
          if (mw.config.get("wgNamespaceNumber") % 2 === 0 && mw.config.get("wgNamespaceNumber") !== 2) {
            deleteOptions.append({
              type: "checkbox",
              list: [{
                label: window.wgULS("删除讨论页", "刪除討論頁"),
                value: "talkpage",
                name: "talkpage",
                tooltip: window.wgULS("删除时附带删除此页面的讨论页。", "刪除時附帶刪除此頁面的討論頁。"),
                checked: Twinkle.getPref("deleteTalkPageOnDelete"),
                event: (event) => {
                  event.stopPropagation();
                }
              }]
            });
          }
          deleteOptions.append({
            type: "checkbox",
            list: [{
              label: window.wgULS("删除重定向", "刪除重新導向"),
              value: "redirects",
              name: "redirects",
              tooltip: window.wgULS("删除到此页的重定向。", "刪除到此頁的重新導向。"),
              checked: Twinkle.getPref("deleteRedirectsOnDelete"),
              event: (event) => {
                event.stopPropagation();
              }
            }]
          });
          deleteOptions.append({
            type: "checkbox",
            list: [{
              label: window.wgULS("应用多个理由删除", "應用多個理由刪除"),
              value: "delmultiple",
              name: "delmultiple",
              tooltip: window.wgULS("您可选择应用于该页的多个理由。", "您可選擇應用於該頁的多個理由。"),
              event: (event) => {
                Twinkle.speedy.callback.modeChanged(event.target.form);
                event.stopPropagation();
              }
            }]
          });
          deleteOptions.append({
            type: "checkbox",
            list: [{
              label: window.wgULS("开启用户讨论页", "開啟使用者討論頁"),
              value: "openusertalk",
              name: "openusertalk",
              tooltip: window.wgULS("此项的默认值为您的开启讨论页设置。在您选择应用多条理由删除时此项将保持不变。", "此項的預設值為您的開啟討論頁設定。在您選擇應用多條理由刪除時此項將保持不變。"),
              checked: false
            }]
          });
        }
        const tagOptions = form.append({
          type: "div",
          name: "tag_options"
        });
        if (Morebits.userIsSysop) {
          tagOptions.append({
            type: "header",
            label: window.wgULS("标记相关选项", "標記相關選項")
          });
        }
        tagOptions.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("如可能,通知创建者", "如可能,通知建立者"),
            value: "notify",
            name: "notify",
            tooltip: window.wgULS("一个通知模板将会被加入创建者的讨论页,若您启用了该理据的通知。", "一個通知模板將會被加入建立者的討論頁,若您啟用了該理據的通知。"),
            checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref("deleteSysopDefaultToDelete")),
            event: (event) => {
              event.stopPropagation();
            }
          }, {
            label: window.wgULS("清空页面", "清空頁面"),
            value: "blank",
            name: "blank",
            tooltip: window.wgULS("在标记模板前,先清空页面,适用于严重破坏或负面生者传记等。", "在標記模板前,先清空頁面,適用於嚴重破壞或負面生者傳記等。")
          }, {
            label: window.wgULS("同时标记以请求白纸保护", "同時標記以請求白紙保護"),
            value: "salting",
            name: "salting",
            tooltip: window.wgULS("选取后,快速删除模板后将附带 {{salt}} 标签,以请求执行删除的管理员进行白纸保护,仅在页面创建3次以上才选择此项。", "選取後,快速刪除模板後將附帶 {{salt}} 標籤,以請求執行刪除的管理員進行白紙保護,僅在頁面建立3次以上才選擇此項。")
          }, {
            label: window.wgULS("应用多个理由", "應用多個理由"),
            value: "multiple",
            name: "multiple",
            tooltip: window.wgULS("您可选择应用于该页的多个理由。", "您可選擇應用於該頁的多個理由。"),
            event: (event) => {
              Twinkle.speedy.callback.modeChanged(event.target.form);
              event.stopPropagation();
            }
          }]
        });
        form.append({
          type: "div",
          id: "prior-deletion-count"
        });
        form.append({
          type: "div",
          name: "work_area",
          label: window.wgULS("初始化CSD模块失败,请重试,或将这报告给Twinkle开发者。", "初始化CSD模組失敗,請重試,或將這報告給Twinkle開發者。")
        });
        if (Twinkle.getPref("speedySelectionStyle") !== "radioClick") {
          form.append({
            type: "submit",
            className: "tw-speedy-submit"
          });
        }
        const result = form.render();
        dialog.setContent(result);
        dialog.display();
        Twinkle.speedy.callback.modeChanged(result);
        Twinkle.speedy.callback.priorDeletionCount();
      };
      Twinkle.speedy.callback.getMode = (form) => {
        let mode = Twinkle.speedy.mode.userSingleSubmit;
        if (form.tag_only && !form.tag_only.checked) {
          if (form.delmultiple.checked) {
            mode = Twinkle.speedy.mode.sysopMultipleSubmit;
          } else {
            mode = Twinkle.speedy.mode.sysopSingleSubmit;
          }
        } else if (form.multiple.checked) {
          mode = Twinkle.speedy.mode.userMultipleSubmit;
        } else {
          mode = Twinkle.speedy.mode.userSingleSubmit;
        }
        if (Twinkle.getPref("speedySelectionStyle") === "radioClick") {
          mode++;
        }
        return mode;
      };
      Twinkle.speedy.callback.modeChanged = (form) => {
        const namespace = mw.config.get("wgNamespaceNumber");
        const mode = Twinkle.speedy.callback.getMode(form);
        const isSysopMode = Twinkle.speedy.mode.isSysop(mode);
        if (isSysopMode) {
          $body.find("[name=delete_options]").show();
          $body.find("[name=tag_options]").hide();
          $body.find("button.tw-speedy-submit").text(window.wgULS("删除页面", "刪除頁面"));
        } else {
          $body.find("[name=delete_options]").hide();
          $body.find("[name=tag_options]").show();
          $body.find("button.tw-speedy-submit").text(window.wgULS("标记页面", "標記頁面"));
        }
        const work_area = new Morebits.quickForm.element({
          type: "div",
          name: "work_area"
        });
        if (mode === Twinkle.speedy.mode.userMultipleRadioClick || mode === Twinkle.speedy.mode.sysopMultipleRadioClick) {
          const evaluateType = Twinkle.speedy.mode.isSysop(mode) ? "evaluateSysop" : "evaluateUser";
          work_area.append({
            type: "div",
            label: window.wgULS("当选择完成后,单击:", "當選擇完成後,點擊:")
          });
          work_area.append({
            type: "button",
            name: "submit-multiple",
            label: isSysopMode ? window.wgULS("删除页面", "刪除頁面") : window.wgULS("标记页面", "標記頁面"),
            event: (event) => {
              Twinkle.speedy.callback[evaluateType](event);
              event.stopPropagation();
            }
          });
        }
        const radioOrCheckbox = Twinkle.speedy.mode.isMultiple(mode) ? "checkbox" : "radio";
        if (isSysopMode && !Twinkle.speedy.mode.isMultiple(mode)) {
          work_area.append({
            type: "header",
            label: window.wgULS("自定义理由", "自訂理由")
          });
          work_area.append({
            type: radioOrCheckbox,
            name: "csd",
            list: Twinkle.speedy.generateCsdList(Twinkle.speedy.customRationale, mode)
          });
        }
        switch (namespace) {
          case 0:
            work_area.append({
              type: "header",
              label: window.wgULS("条目", "條目")
            });
            work_area.append({
              type: radioOrCheckbox,
              name: "csd",
              list: Twinkle.speedy.generateCsdList(Twinkle.speedy.articleList, mode)
            });
            break;
          case 2:
            work_area.append({
              type: "header",
              label: window.wgULS("用户页", "使用者頁面")
            });
            work_area.append({
              type: radioOrCheckbox,
              name: "csd",
              list: Twinkle.speedy.generateCsdList(Twinkle.speedy.userList, mode)
            });
            break;
          case 3:
            if (mw.util.isIPAddress(mw.config.get("wgRelevantUserName"))) {
              work_area.append({
                type: "header",
                label: window.wgULS("用户讨论页", "使用者討論頁")
              });
              work_area.append({
                type: radioOrCheckbox,
                name: "csd",
                list: Twinkle.speedy.generateCsdList(Twinkle.speedy.usertalkList, mode)
              });
            }
            break;
          case 6:
            work_area.append({
              type: "header",
              label: window.wgULS("文件", "檔案")
            });
            work_area.append({
              type: radioOrCheckbox,
              name: "csd",
              list: Twinkle.speedy.generateCsdList(Twinkle.speedy.fileList, mode)
            });
            if (!Twinkle.speedy.mode.isSysop(mode)) {
              work_area.append({
                type: "div",
                label: window.wgULS("标记CSD F1、F3、F5,请使用Twinkle的“图权”功能。", "標記CSD F1、F3、F5,請使用Twinkle的「圖權」功能。")
              });
            }
            break;
          case 14:
            work_area.append({
              type: "header",
              label: window.wgULS("分类", "分類")
            });
            work_area.append({
              type: radioOrCheckbox,
              name: "csd",
              list: Twinkle.speedy.generateCsdList(Twinkle.speedy.categoryList, mode)
            });
            break;
          case 118:
            work_area.append({
              type: "header",
              label: "草稿"
            });
            work_area.append({
              type: radioOrCheckbox,
              name: "csd",
              list: Twinkle.speedy.generateCsdList(Twinkle.speedy.draftList, mode)
            });
            break;
          case (namespace % 2 === 1 && namespace !== 3):
            work_area.append({
              type: "header",
              label: window.wgULS("讨论页", "討論頁")
            });
            work_area.append({
              type: radioOrCheckbox,
              name: "csd",
              list: Twinkle.speedy.generateCsdList(Twinkle.speedy.talkList, mode)
            });
            break;
          default:
            break;
        }
        let generalCriteria = Twinkle.speedy.generalList;
        if (!Twinkle.speedy.mode.isSysop(mode)) {
          generalCriteria = [...Twinkle.speedy.customRationale, ...(0, import_ext_gadget3.generateArray)(generalCriteria)];
        }
        work_area.append({
          type: "header",
          label: window.wgULS("常规", "常規")
        });
        work_area.append({
          type: radioOrCheckbox,
          name: "csd",
          list: Twinkle.speedy.generateCsdList(generalCriteria, mode)
        });
        if (!Twinkle.speedy.mode.isSysop(mode)) {
          work_area.append({
            type: "div",
            label: window.wgULS("提报侵权页面,请使用Twinkle的“侵权”功能。", "提報侵權頁面,請使用Twinkle的「侵權」功能。")
          });
        }
        if (mw.config.get("wgIsRedirect") || Morebits.userIsSysop) {
          work_area.append({
            type: "header",
            label: "重定向"
          });
          work_area.append({
            type: radioOrCheckbox,
            name: "csd",
            list: Twinkle.speedy.generateCsdList(Twinkle.speedy.redirectList, mode)
          });
        }
        const [old_area] = Morebits.quickForm.getElements(form, "work_area");
        form.replaceChild(work_area.render(), old_area);
        if (isSysopMode && Twinkle.speedy.hasCSD) {
          const [customOption] = $body.find("input[name=csd][value=reason]");
          if (customOption) {
            if (Twinkle.getPref("speedySelectionStyle") !== "radioClick") {
              customOption.click();
              customOption.parentNode.appendChild(customOption.subgroup);
            }
            customOption.subgroup.querySelector("input").value = decodeURIComponent($body.find("#delete-reason").text()).replace(/\+/g, " ");
          }
        }
        if (document.querySelector('input[value="g7"]') && Twinkle.getPref("enlargeG7Input")) {
          document.querySelector('input[value="g7"]').style = "height: 2em; width: 2em; height: -moz-initial; width: -moz-initial; -moz-transform: scale(2); -o-transform: scale(2);";
          document.querySelector('input[value="g7"]').labels[0].style = "font-size: 1.5em; line-height: 1.5em;";
        }
        if (!isSysopMode && mw.config.get("wgPageContentModel") !== "wikitext") {
          $body.find("[name=tag_options]").hide();
          $body.find("[name=work_area]").empty();
          const message = [window.wgULS("Twinkle不支持在页面内容模型为", "Twinkle不支援在頁面內容模型為"), mw.config.get("wgPageContentModel"), window.wgULS("的页面上挂上快速删除模板,请参见", "的頁面上掛上快速刪除模板,請參見"), $("<a>").attr({
            target: "_blank",
            rel: "noopener noreferrer",
            href: mw.util.getUrl("QW:SPECIALSD")
          }).text(window.wgULS("手动放置模板时的注意事项", "手動放置模板時的注意事項"))[0], "。"];
          $body.find("[name=work_area]").append(message);
          Morebits.simpleWindow.setButtonsEnabled(false);
        } else {
          Morebits.simpleWindow.setButtonsEnabled(true);
        }
      };
      Twinkle.speedy.callback.priorDeletionCount = () => {
        const query = {
          action: "query",
          format: "json",
          list: "logevents",
          letype: "delete",
          leaction: "delete/delete",
          // Just pure page deletion, no redirect overwrites or revdel
          letitle: mw.config.get("wgPageName"),
          leprop: "",
          // We're just counting we don't actually care about the entries
          lelimit: 5
          // A little bit goes a long way
        };
        new Morebits.wiki.api(window.wgULS("检查之前的删除", "檢查之前的刪除"), query, (apiobj) => {
          const response = apiobj.getResponse();
          const delCount = response.query.logevents.length;
          if (delCount) {
            let message = window.wgULS("被删除", "被刪除");
            if (response.continue) {
              message += window.wgULS("超过", "超過");
            }
            message += "".concat(delCount, "次");
            if (delCount >= 3) {
              $body.find("#prior-deletion-count").css("color", "#ff0000");
            }
            const link = Morebits.htmlNode("a", window.wgULS("(日志)", "(日誌)"));
            link.setAttribute("href", mw.util.getUrl("Special:Log", {
              page: mw.config.get("wgPageName")
            }));
            link.setAttribute("target", "_blank");
            link.setAttribute("rel", "noopener noreferrer");
            $body.find("#prior-deletion-count").text(message);
            $body.find("#prior-deletion-count").append(link);
          }
        }).post();
      };
      Twinkle.speedy.generateCsdList = (list, mode) => {
        const isSysopMode = Twinkle.speedy.mode.isSysop(mode);
        const multiple = Twinkle.speedy.mode.isMultiple(mode);
        const hasSubmitButton = Twinkle.speedy.mode.hasSubmitButton(mode);
        const openSubgroupHandler = (e) => {
          $(e.target.form).find("input").prop("disabled", true);
          $(e.target.form).children().css("color", "gray");
          $(e.target).parent().css("color", "black").find("input").prop("disabled", false);
          $(e.target).parent().find("input:text")[0].focus();
          e.stopPropagation();
        };
        const submitSubgroupHandler = (e) => {
          const evaluateType = Twinkle.speedy.mode.isSysop(mode) ? "evaluateSysop" : "evaluateUser";
          Twinkle.speedy.callback[evaluateType](e);
          e.stopPropagation();
        };
        return Array.prototype.map.call(list, (critElement) => {
          const criterion = {
            ...critElement
          };
          if (multiple) {
            if (criterion.hideWhenMultiple) {
              return null;
            }
            if (criterion.hideSubgroupWhenMultiple) {
              criterion.subgroup = null;
            }
          } else {
            if (criterion.hideWhenSingle) {
              return null;
            }
            if (criterion.hideSubgroupWhenSingle) {
              criterion.subgroup = null;
            }
          }
          if (isSysopMode) {
            if (criterion.hideWhenSysop) {
              return null;
            }
            if (criterion.hideSubgroupWhenSysop) {
              criterion.subgroup = null;
            }
          } else {
            if (criterion.hideWhenUser) {
              return null;
            }
            if (criterion.hideSubgroupWhenUser) {
              criterion.subgroup = null;
            }
          }
          if (mw.config.get("wgIsRedirect") && criterion.hideWhenRedirect) {
            return null;
          }
          if (criterion.showInNamespaces && !criterion.showInNamespaces.includes(mw.config.get("wgNamespaceNumber"))) {
            return null;
          } else if (criterion.hideInNamespaces && criterion.hideInNamespaces.includes(mw.config.get("wgNamespaceNumber"))) {
            return null;
          }
          if (criterion.subgroup && !hasSubmitButton) {
            criterion.subgroup = (0, import_ext_gadget3.generateArray)(criterion.subgroup, {
              type: "button",
              name: "submit",
              label: isSysopMode ? window.wgULS("删除页面", "刪除頁面") : window.wgULS("标记页面", "標記頁面"),
              event: submitSubgroupHandler
            });
            criterion.event = openSubgroupHandler;
          }
          if (isSysopMode) {
            const originalEvent = criterion.event;
            criterion.event = (e) => {
              if (multiple) {
                return originalEvent(e);
              }
              const normalizedCriterion = Twinkle.speedy.normalizeHash[e.target.value];
              $body.find("[name=openusertalk]").prop("checked", Twinkle.getPref("openUserTalkPageOnSpeedyDelete").includes(normalizedCriterion));
              if (originalEvent) {
                return originalEvent(e);
              }
            };
          }
          return criterion;
        });
      };
      Twinkle.speedy.customRationale = [{
        label: "自定义理由".concat(Morebits.userIsSysop ? "(自定义删除理由)" : ""),
        value: "reason",
        tooltip: "该页至少应该符合一条快速删除的标准,并且您必须在理由中提到。",
        subgroup: {
          name: "reason_1",
          type: "input",
          label: "理由:",
          size: 60
        }
      }];
      Twinkle.speedy.fileList = [{
        label: "F1:明显不符合本站著作权方针的文件",
        value: "f1",
        tooltip: "包括以下情况:1.上传后3天内仍然来源不明、著作权不明的文件。2.上传者宣称拥有,而在其他来源找到的文件。3.文件宣称由某作者依据某自由著作权协议发布,但找不到该自由协议的声明。4.其他明显侵权的文件,可附加侵权理由。"
      }, {
        label: "F2:重复且不再被使用的文件",
        value: "f2",
        tooltip: "包括以下情况:与现有文件完全相同(或与现有文件内容一致但尺寸较小),且没有客观需要(如某些场合需使用小尺寸图片)的文件。或是被更加清晰的文件、SVG格式文件所取代的文件。请提报者确定文件没有任何页面使用后再提报删除,并附注对应质量更好的文件名。",
        subgroup: {
          name: "f2_filename",
          type: "input",
          label: "新文件名:",
          tooltip: "可不含“File:”前缀。"
        }
      }];
      Twinkle.speedy.articleList = [{
        label: "A1:内容空泛或完全没有内容。",
        value: "a1",
        tooltip: "条目的内容笼统,或甚至根本没有提及条目主体,使条目不能用以区分其他事物;或条目只包括外部链接、参见、参考来源、分类、模板,而没有文字描述。消歧义页、重定向页不适用此条。请注意有些用户可能会多次保存,若此类页面的最后一次编辑时间超过24小时,则可提请快速删除。"
      }, {
        label: "A2:与其他条目或其历史版本重复,且不适合作为其重定向。",
        value: "a2",
        tooltip: "条目创建时的内容,与其他现有条目(或其历史版本)内容完全相同或非常相似,且名称不适合作为后者的重定向。不包括拆分、合并、重组后产生的条目。如有疑虑,可转交删除讨论。若后创建的条目名称可作为重定向,可直接改为重定向;若先创建的条目宜作为后创建条目的重定向,请提请移动请求。",
        subgroup: {
          name: "a2_pagename",
          type: "input",
          label: "现有条目名:",
          tooltip: "不自动加上链接,若需要请自行加上[[]]。",
          size: 60
        }
      }, {
        label: "A3:非现代汉语或翻译拙劣的条目",
        value: "a3",
        tooltip: "条目内容绝大部分非现代汉语,包括未翻译的外语、方言及文言文;或翻译质量低下,以至于难以理解或出现较多错误。"
      }];
      Twinkle.speedy.categoryList = [{
        label: "O2:空分类。",
        value: "o2",
        tooltip: "没有收录任何页面、文件、子分类的分类。Category:请勿删除的分类中的分类不适用。"
      }];
      Twinkle.speedy.draftList = [{
        label: "O3:废弃草稿。",
        value: "o3",
        tooltip: "草稿名字空间内六个月内无编辑的页面。"
      }];
      Twinkle.speedy.userList = [{
        label: "O1:用户请求删除自己的用户页。",
        value: "o1",
        tooltip: "管理员需查看编辑历史,确认该页面不是从其他名字空间移动而来。"
      }];
      Twinkle.speedy.generalList = [{
        label: "G1:明显违反法律法规或违背公序良俗的页面",
        value: "g1",
        tooltip: "明显违反服务器所在地的法律法规及有关规定,或突破社会公序良俗底线,按照中华人民共和国互联网管理规定应予删除的页面。"
      }, {
        label: "G2:没有实际内容的页面",
        value: "g2",
        tooltip: "仅包括无意义字符串而没有实际内容的页面。由用户本人创建的用户页、用户讨论页,及专为测试提供的沙盒,不适用此准则。"
      }, {
        label: "G3:纯粹破坏",
        value: "g3",
        tooltip: "包括但不限于明显的恶作剧、错误信息、人身攻击等,以及清理移动破坏时留下的重定向。若收到或发现严重的人身攻击与诋毁,管理员及其他用户应通知监督员进行监督隐藏。"
      }, {
        label: "G4:重新创建已被删除的页面",
        value: "g4",
        tooltip: "若现有页面与曾在删除讨论(含页面存废讨论、文件存废讨论和侵权审核,不含快速删除)中被删除内容相同或非常相似,且现有内容仍然适用删除讨论中的结论,无论标题是否相同,都适用本标准。若现有页面标题与已删版本不一致,则提请速删者应一并注明已删版本的页面名;若该页面之前被快速删除,请以相同理由重新提请速删。若现有内容不适用删除讨论中的结论,应重新提出删除讨论。",
        subgroup: [{
          name: "g4_pagename",
          type: "input",
          label: "已删版此页面名:",
          size: 60
        }],
        hideSubgroupWhenMultiple: true
      }, {
        label: "G5:因技术原因删除页面",
        value: "g5",
        tooltip: "包括以下情形:因移动请求而删除页面;以覆盖删除重定向;删除无用的MediaWiki页面,及其他技术团队或界面管理员认为有必要执行的快速删除情形。"
      }, {
        label: "G6:原作者提请删除或清空页面,且页面原作者仅有一人",
        value: "g6",
        tooltip: "页面原作者持合理理由提出的快速删除;或页面原作者(实际贡献者)清空页面,其他用户提交的快速删除。页面原作者(实际贡献者)仅一人时满足本准则。若页面实际贡献者多于一人,请持合理理由提交删除讨论。后一情形不包括用户页、用户讨论页,且应在页面最后一次编辑6小时后提出。被导入的页面,导入者视为原作者。",
        subgroup: {
          name: "g6_rationale",
          type: "input",
          label: "删除原因:",
          size: 60
        },
        hideSubgroupWhenSysop: true
      }, {
        label: "G7:明显的广告宣传",
        value: "g7",
        tooltip: "应用于明显的广告宣传,或只有相关人物、组织等事物联系方法(包括但不限于电话、地址、电子邮箱、即时通讯软件联系方式(如QQ号、微信号)、社交媒体链接)。若宣传语气不明显,建议转交删除讨论。"
      }, {
        label: "G8:未列明可靠来源且语调负面的生者传记",
        value: "g8",
        tooltip: "本情况下有的页面严重侵犯他人名誉权,有时可能侵犯隐私权,可能需要提请监督。"
      }, {
        label: "G9:孤立页面",
        value: "g9",
        tooltip: "包括以下几种类型:1.没有对应文件的文件页面;2.没有对应母页面的子页面(用户页子页面除外);3.指向不存在页面的重定向;4.没有对应内容页面的讨论页(讨论页存档、用户讨论页,以及在主页面挂有{{CSD Placeholder}}模板的讨论页除外);5.不存在注册用户的用户页及用户页子页面(随用户更名产生的用户页重定向除外)。请在删除时注意有无将内容移至他处的必要。"
      }];
      Twinkle.speedy.redirectList = [{
        label: "R1:不能发挥实际作用的重定向。",
        value: "r1",
        tooltip: "包括以下情况:1.指向本身或循环的重定向,如A→B→C→……→A或A→A(繁简重定向不适用此项);2.格式错误的重定向,包括标题仅为繁体、繁简混用、消歧义使用的括弧或空格错误、间隔号使用错误(因类推简化字未收录至《通用规范汉字表》导致的繁简混杂情形,或系统无法自动进行繁简处理的情形,则不适用)。若重定向页面标题,与合乎命名常规的目标页面标题之间,仅存在繁简字体的区别,而不存在词语用法区别,则不保留该重定向。因系统无法自动繁简转换而必须保留的重定向页面除外。对于其他未列出的情况,若用户认为该重定向无法发挥实际作用,且依据常识没有任何争议,可凭合理理由提请速删,由管理员判断。指向不存在页面的重定向,适用G5准则。",
        subgroup: {
          name: "r1_type",
          type: "select",
          label: "适用类型:",
          list: [{
            label: "请选择",
            value: ""
          }, {
            label: "指向本身或循环的重定向",
            value: "指向本身或循环的重定向。"
          }, {
            label: "标题繁简混用",
            value: "标题繁简混用。"
          }, {
            label: "消歧义使用的括号或空格错误",
            value: "消歧义使用的括号或空格错误。"
          }, {
            label: "间隔号使用错误",
            value: "间隔号使用错误。"
          }, {
            label: "其他理由(请勾选上方“应用多个理由”,并填写自定义理由)",
            value: ""
          }]
        }
      }, {
        label: "R2:名称与导向目标代表事物不一致或不完全一致的重定向。",
        value: "r2",
        tooltip: "包括但不限于以下情况:1.由任何非条目页面(除用户页)导向条目页的重定向,以及由条目页导向任何非条目页面的重定向。2.明显笔误的重定向,如出现不常见的错别字等。(别称重定向不适用此项。若含错别字或有笔误的重定向使用频率高,此类重定向有助于帮助用户寻找到正确的页面,不适用此标准。有争议的此类重定向宜提交删除讨论。)3.明显与导向目标所涵盖的主题无关,或比导向目标所涵盖的主题更广泛的重定向。(若不明显,可改为提交删除讨论。)",
        subgroup: {
          name: "r2_type",
          type: "select",
          label: "适用类型:",
          list: [{
            label: "请选择",
            value: ""
          }, {
            label: "由非条目页面(除用户页)导向条目页的重定向",
            value: "由非条目页面(除用户页)导向条目页的重定向。"
          }, {
            label: "由条目页导向非条目页面的重定向",
            value: "由条目页导向任何非条目页面的重定向。"
          }, {
            label: "明显笔误的重定向",
            value: "明显笔误的重定向。"
          }, {
            label: "与导向目标无关或比其范围更广泛的重定向",
            value: "与导向目标无关或比其范围更广泛的重定向。"
          }, {
            label: "其他理由(请勾选上方“应用多个理由”,并填写自定义理由)",
            value: ""
          }]
        }
      }];
      Twinkle.speedy.normalizeHash = {
        reason: "db",
        multiple: "multiple",
        "multiple-finish": "multiple-finish",
        g1: "g1",
        g2: "g2",
        g3: "g3",
        g4: "g4",
        g5: "g5",
        g6: "g6",
        g7: "g7",
        g8: "g8",
        g9: "g9",
        a1: "a1",
        a2: "a2",
        a3: "a3",
        r1: "r1",
        r2: "r2",
        f1: "f1",
        f2: "f2",
        f3: "f3",
        f4: "f4",
        f5: "f5",
        o1: "o1",
        o2: "o2",
        o3: "o3"
      };
      Twinkle.speedy.callbacks = {
        getTemplateCodeAndParams: (params) => {
          let code;
          let parameters;
          let i;
          if (params.normalizeds.length > 1) {
            code = "{{delete";
            params.utparams = {};
            var _iterator12 = _createForOfIteratorHelper(params.normalizeds.entries()), _step12;
            try {
              for (_iterator12.s(); !(_step12 = _iterator12.n()).done; ) {
                const [index, norm] = _step12.value;
                if (norm !== "db") {
                  code += "|".concat(norm.toUpperCase());
                }
                parameters = params.templateParams[index] || [];
                for (const i_ in parameters) {
                  if (typeof parameters[i_] === "string") {
                    code += "|".concat(parameters[i_]);
                  }
                }
                params.utparams = {
                  ...params.utparams,
                  ...Twinkle.speedy.getUserTalkParameters(norm, parameters)
                };
              }
            } catch (err) {
              _iterator12.e(err);
            } finally {
              _iterator12.f();
            }
            code += "}}";
          } else {
            parameters = params.templateParams[0] || [];
            code = "{{delete";
            if (params.values[0] !== "reason") {
              code += "|".concat(params.values[0]);
            }
            for (i in parameters) {
              if (typeof parameters[i] === "string") {
                code += "|".concat(parameters[i]);
              }
            }
            code += "}}";
            params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
          }
          return [code, params.utparams];
        },
        parseWikitext: (title, wikitext, callback) => {
          const query = {
            action: "parse",
            prop: "text",
            pst: "true",
            text: wikitext,
            contentmodel: "wikitext",
            title
          };
          const statusIndicator = new Morebits.status(window.wgULS("构造删除理由", "構造刪除理由"));
          const api2 = new Morebits.wiki.api(window.wgULS("解析删除模板", "解析刪除模板"), query, (apiObj) => {
            const reason = decodeURIComponent($(apiObj.getXML().querySelector("text").childNodes[0].nodeValue).find("#delete-reason").text().replace(/\+/g, " "));
            if (reason) {
              statusIndicator.info("完成");
            } else {
              statusIndicator.warn(window.wgULS("未能从删除模板生成删除理由", "未能從刪除模板生成刪除理由"));
            }
            callback(reason);
          }, statusIndicator);
          api2.post();
        },
        sysop: {
          main: (params) => {
            let reason;
            if (!params.normalizeds.length && params.normalizeds[0] === "db") {
              reason = prompt(window.wgULS("输入删除理由:", "輸入刪除理由:"), "");
              Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
            } else {
              const [code] = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
              Twinkle.speedy.callbacks.parseWikitext(mw.config.get("wgPageName"), code, (deleteReason) => {
                if (params.promptForSummary) {
                  deleteReason = prompt(window.wgULS("输入删除理由,或单击确定以接受自动生成的:", "輸入刪除理由,或點擊確定以接受自動生成的:"), deleteReason);
                }
                Twinkle.speedy.callbacks.sysop.deletePage(deleteReason, params);
              });
            }
          },
          deletePage: (reason, params) => {
            const thispage = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("删除页面", "刪除頁面"));
            if (reason === null) {
              return Morebits.status.error(window.wgULS("询问理由", "詢問理由"), window.wgULS("用户取消操作。", "使用者取消操作。"));
            } else if (!reason || !reason.trim()) {
              return Morebits.status.error(window.wgULS("询问理由", "詢問理由"), window.wgULS("你不给我理由…我就…不管了…", "你不給我理由…我就…不管了…"));
            }
            const deleteMain = () => {
              thispage.setEditSummary(reason);
              thispage.setChangeTags(Twinkle.changeTags);
              thispage.setWatchlist(params.watch);
              thispage.deletePage(() => {
                thispage.getStatusElement().info("完成");
                Twinkle.speedy.callbacks.sysop.deleteTalk(params);
              });
            };
            if (params.openUserTalk) {
              thispage.setCallbackParameters(params);
              thispage.lookupCreation(() => {
                Twinkle.speedy.callbacks.sysop.openUserTalkPage(thispage);
                deleteMain();
              });
            } else {
              deleteMain();
            }
          },
          deleteTalk: (params) => {
            if (params.deleteTalkPage && params.normalized !== "o1" && !document.querySelector("#ca-talk").classList.contains("new")) {
              const talkpage = new Morebits.wiki.page("".concat(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceNumber") + 1], ":").concat(mw.config.get("wgTitle")), window.wgULS("删除讨论页", "刪除討論頁"));
              talkpage.setEditSummary("[[QW:CSD#G9|G9]]: 孤立页面:已删除页面“".concat(Morebits.pageNameNorm, "”的讨论页"));
              talkpage.setChangeTags(Twinkle.changeTags);
              talkpage.deletePage();
              setTimeout(() => {
                Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
              }, 1800);
            } else {
              Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
            }
          },
          deleteRedirects: (params) => {
            if (params.deleteRedirects) {
              const query = {
                action: "query",
                titles: mw.config.get("wgPageName"),
                prop: "redirects",
                rdlimit: 5e3
                // 500 is max for normal users, 5000 for bots and sysops
              };
              const qiuwen_api = new Morebits.wiki.api(window.wgULS("获取重定向列表…", "取得重新導向列表…"), query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain, new Morebits.status(window.wgULS("删除重定向", "刪除重新導向")));
              qiuwen_api.params = params;
              qiuwen_api.post();
            }
            let $link;
            let $bigtext;
            if (params.normalized === "g7") {
              $link = $("<a>").attr("href", "#").text(window.wgULS("单击这里施行保护", "點擊這裡施行保護")).css({
                "font-size": "125%",
                "font-weight": "bold"
              }).on("click", () => {
                Morebits.wiki.actionCompleted.redirect = null;
                Twinkle.speedy.dialog.close();
                mw.config.set("wgArticleId", 0);
                Twinkle.protect.callback();
              });
              $bigtext = $("<span>").css({
                "font-size": "125%",
                "font-weight": "bold"
              }).text(window.wgULS("白纸保护该页", "白紙保護該頁"));
              Morebits.status.info($bigtext[0], $link[0]);
            }
            if (mw.config.get("wgNamespaceNumber") === 6) {
              $link = $("<a>").attr("href", "#").text(window.wgULS("单击这里前往取消链入工具", "點擊這裡前往取消連入工具")).css({
                "font-weight": "bold"
              }).on("click", () => {
                Morebits.wiki.actionCompleted.redirect = null;
                Twinkle.speedy.dialog.close();
                Twinkle.unlink.callback("".concat(window.wgULS("取消对已删除文件 ", "取消對已刪除檔案 ") + Morebits.pageNameNorm, " 的使用"));
              });
              $bigtext = $("<span>").css({
                "font-weight": "bold"
              }).text(window.wgULS("取消对已删除文件的使用", "取消對已刪除檔案的使用"));
              Morebits.status.info($bigtext[0], $link[0]);
            } else {
              $link = $("<a>").attr("href", "#").text(window.wgULS("单击这里前往取消链入工具", "點擊這裡前往取消連入工具")).css({
                "font-weight": "bold"
              }).on("click", () => {
                Morebits.wiki.actionCompleted.redirect = null;
                Twinkle.speedy.dialog.close();
                Twinkle.unlink.callback(window.wgULS("取消对已删除页面 ", "取消對已刪除頁面 ") + Morebits.pageNameNorm + window.wgULS(" 的链接", " 的連結"));
              });
              $bigtext = $("<span>").text(window.wgULS("取消对已删除页面的链接", "取消對已刪除頁面的連結")).css({
                "font-weight": "bold"
              });
              Morebits.status.info($bigtext[0], $link[0]);
            }
            $link = $("<a>").attr("href", mw.util.getUrl("Special:RandomInCategory/快速删除候选")).text(window.wgULS("单击前往下一个快速删除候选", "點擊前往下一個快速刪除候選"));
            Morebits.status.info("工具", $link[0]);
          },
          openUserTalkPage: (pageobj) => {
            pageobj.getStatusElement().unlink();
            const user = pageobj.getCreator();
            const params = pageobj.getCallbackParameters();
            const query = {
              action: "edit",
              preview: "yes",
              vanarticle: Morebits.pageNameNorm
            };
            const title = "User talk:".concat(user);
            if (params.normalized === "db" || Twinkle.getPref("promptForSpeedyDeletionSummary").includes(params.normalized)) {
              const $link = $("<a>").attr({
                href: mw.util.getUrl(title, query),
                target: "_blank",
                rel: "noopener noreferrer"
              }).css({
                "font-size": "125%",
                "font-weight": "bold"
              }).text(window.wgULS("点此打开User talk:", "點此打開User talk:") + user);
              const $bigtext = $("<span>").css({
                "font-size": "125%",
                "font-weight": "bold"
              }).text(window.wgULS("通知页面创建者", "通知頁面建立者"));
              Morebits.status.info($bigtext[0], $link[0]);
            } else {
              const statusIndicator = new Morebits.status(window.wgULS("打开用户", "打開使用者") + user + window.wgULS("的讨论页编辑窗口", "的討論頁編輯視窗"), window.wgULS("打开中…", "打開中…"));
              switch (Twinkle.getPref("userTalkPageMode")) {
                case "tab":
                  window.open(mw.util.getUrl(title, query), "_blank", "noopener,noreferrer");
                  break;
                case "blank":
                  window.open(mw.util.getUrl(title, query), "_blank", "noopener,noreferrer,location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
                  break;
                default:
                  window.open(mw.util.getUrl(title, query), window.name === "twinklewarnwindow" ? "_blank" : "twinklewarnwindow", window.name === "twinklewarnwindow" ? "noopener,noreferrer," : "location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
                  break;
              }
              statusIndicator.info("完成");
            }
          },
          deleteRedirectsMain: (apiobj) => {
            const xmlDoc = apiobj.getXML();
            const $snapshot = $(xmlDoc).find("redirects rd");
            const total = $snapshot.length;
            const statusIndicator = apiobj.statelem;
            if (!total) {
              statusIndicator.info(window.wgULS("未发现重定向", "未發現重新導向"));
              return;
            }
            statusIndicator.status("0%");
            let current = 0;
            const onsuccess = (apiobjInner) => {
              const now = "".concat(Number.parseInt(100 * ++current / total, 10), "%");
              statusIndicator.update(now);
              apiobjInner.statelem.unlink();
              if (current >= total) {
                statusIndicator.info("".concat(now, "(完成)"));
                Morebits.wiki.removeCheckpoint();
              }
            };
            Morebits.wiki.addCheckpoint();
            $snapshot.each((_key, value) => {
              const title = $(value).attr("title");
              const page = new Morebits.wiki.page(title, "".concat(window.wgULS('删除重定向 "', '刪除重新導向 "') + title, '"'));
              page.setEditSummary("[[QW:CSD#G9|G9]]: 孤立页面:重定向到已删除页面“".concat(Morebits.pageNameNorm, "”"));
              page.setChangeTags(Twinkle.changeTags);
              page.deletePage(onsuccess);
            });
          }
        },
        user: {
          main: (pageobj) => {
            const statelem = pageobj.getStatusElement();
            if (!pageobj.exists()) {
              statelem.error(window.wgULS("页面不存在,可能已被删除", "頁面不存在,可能已被刪除"));
              return;
            }
            let text = pageobj.getPageText();
            const params = pageobj.getCallbackParameters();
            statelem.status(window.wgULS("检查页面已有标记…", "檢查頁面已有標記…"));
            const textNoSd = text.replace(/\{\{\s*(db(-\w*)?|d|delete|deletebecause|speedy|csd|速刪|速删|快删|快刪)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
            if (text !== textNoSd && !confirm(window.wgULS("在页面上找到快速删除模板,要移除并加入新的吗?", "在頁面上找到快速刪除模板,要移除並加入新的嗎?"))) {
              statelem.error(window.wgULS("快速删除模板已被置于页面中。", "快速刪除模板已被置於頁面中。"));
              return;
            }
            text = textNoSd;
            const copyvio = /(?:\{\{\s*(copyvio|侵权|侵權)[^{}]*?\}\})/i.exec(text);
            if (copyvio && !confirm(window.wgULS("著作权验证模板已被置于页面中,您是否仍想加入一个快速删除模板?", "著作權驗證模板已被置於頁面中,您是否仍想加入一個快速刪除模板?"))) {
              statelem.error(window.wgULS("页面中已有著作权验证模板。", "頁面中已有著作權驗證模板。"));
              return;
            }
            const xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec(text);
            if (xfd && !confirm(window.wgULS("删除相关模板{{", "刪除相關模板{{") + xfd[1] + window.wgULS("}}已被置于页面中,您是否仍想加入一个快速删除模板?", "}}已被置於頁面中,您是否仍想加入一個快速刪除模板?"))) {
              statelem.error(window.wgULS("页面已被提交至存废讨论。", "頁面已被提交至存廢討論。"));
              return;
            }
            const buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
            let [code] = buildData;
            [, params.utparams] = buildData;
            const thispage = new Morebits.wiki.page(mw.config.get("wgPageName"));
            if (Twinkle.getPref("markSpeedyPagesAsPatrolled")) {
              thispage.patrol();
            }
            if (mw.config.get("wgNamespaceNumber") === 10) {
              code = "<noinclude>".concat(code, "</noinclude>");
            }
            text = text.replace(/\{\{\s*([Nn]ew unreviewed article|[Uu]nreviewed|[Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
            if (mw.config.get("wgNamespaceNumber") === 6) {
              text = text.replace(/\{\{(mtc|(copy |move )?to ?(share|commons)|move to (qiuwen share|wikimedia commons)|copy to (qiuwen share|wikimedia commons))[^}]*\}\}/gi, "");
            }
            if (params.requestsalt) {
              code = "{{salt}}\n".concat(code);
            }
            let editsummary;
            if (params.normalizeds.length > 1) {
              editsummary = window.wgULS("请求快速删除(", "請求快速刪除(");
              var _iterator13 = _createForOfIteratorHelper(params.normalizeds), _step13;
              try {
                for (_iterator13.s(); !(_step13 = _iterator13.n()).done; ) {
                  const norm = _step13.value;
                  if (norm !== "db") {
                    editsummary += "[[QW:CSD#".concat(norm.toUpperCase(), "|CSD ").concat(norm.toUpperCase(), "]]、");
                  }
                }
              } catch (err) {
                _iterator13.e(err);
              } finally {
                _iterator13.f();
              }
              editsummary = editsummary.slice(0, Math.max(0, editsummary.length - 1));
              editsummary += ")";
            } else if (params.normalizeds[0] === "db") {
              editsummary = window.wgULS("请求[[QW:CSD|快速删除]]:", "請求[[QW:CSD|快速刪除]]:") + params.templateParams[0]["1"];
            } else {
              editsummary = "".concat(window.wgULS("请求快速删除", "請求快速刪除"), "([[QW:CSD#").concat(params.normalizeds[0].toUpperCase(), "|CSD ").concat(params.normalizeds[0].toUpperCase(), "]])");
            }
            if (params.blank) {
              text = code;
            } else {
              const qiuwen_page = new Morebits.wikitext.page(text);
              text = qiuwen_page.insertAfterTemplates("".concat(code, "\n"), Twinkle.hatnoteRegex).getText();
            }
            pageobj.setPageText(text);
            pageobj.setEditSummary(editsummary);
            pageobj.setChangeTags(Twinkle.changeTags);
            pageobj.setWatchlist(params.watch);
            pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
          },
          tagComplete: (pageobj) => {
            const params = pageobj.getCallbackParameters();
            if (params.usertalk) {
              const callback = (pageObj) => {
                let initialContrib = pageObj.getCreator();
                if (initialContrib === mw.config.get("wgUserName")) {
                  Morebits.status.warn("您(".concat(initialContrib).concat(window.wgULS(")创建了该页,跳过通知", ")建立了該頁,跳過通知")));
                  initialContrib = null;
                } else if (initialContrib === mw.config.get("wgTitle") && mw.config.get("wgNamespaceNumber") === 3) {
                  Morebits.status.warn(window.wgULS("通知页面创建者:用户创建了自己的讨论页", "通知頁面建立者:使用者建立了自己的討論頁"));
                  initialContrib = null;
                } else if (initialContrib === "A2093064-bot" && params.normalizeds[0] === "g15") {
                  Morebits.status.warn(window.wgULS("通知页面创建者:由机器人创建,跳过通知", "通知頁面建立者:由機器人建立,跳過通知"));
                  initialContrib = null;
                } else {
                  const talkPageName = "User talk:".concat(initialContrib);
                  const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + initialContrib, ")"));
                  let notifytext;
                  notifytext = "\n{{".concat("subst:", "db-notice|target=".concat(Morebits.pageNameNorm));
                  notifytext += "|nowelcome=yes'}}--~~".concat("~~");
                  let editsummary = "通知:";
                  if (params.normalizeds.includes("g3")) {
                    editsummary += "一攻击性页面";
                  } else {
                    editsummary += "页面[[".concat(Morebits.pageNameNorm, "]]");
                  }
                  editsummary += "快速删除提名";
                  usertalkpage.setAppendText(notifytext);
                  usertalkpage.setEditSummary(editsummary);
                  usertalkpage.setChangeTags(Twinkle.changeTags);
                  usertalkpage.setCreateOption("recreate");
                  usertalkpage.setFollowRedirect(true, false);
                  usertalkpage.append();
                }
                if (params.lognomination) {
                  Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
                }
              };
              const thispage = new Morebits.wiki.page(Morebits.pageNameNorm);
              thispage.lookupCreation(callback);
            } else if (params.lognomination) {
              Twinkle.speedy.callbacks.user.addToLog(params, null);
            }
          },
          // note: this code is also invoked from twinkleimage
          // the params used are:
          //   for CSD: params.values, params.normalizeds  (note: normalizeds is an array)
          //   for DI: params.fromDI = true, params.templatename, params.normalized  (note: normalized is a string)
          addToLog: (params, initialContrib) => {
            const usl = new Morebits.userspaceLogger(Twinkle.getPref("speedyLogPageName"));
            usl.initialText = "这是该用户使用[[H:TW|Twinkle]]的速删模块做出的[[QW:CSD|快速删除]]提名列表。\n\n若您不再想保留此日志,请在[[".concat(Twinkle.getPref("configPage"), "|参数设置]]中关掉,并使用[[QW:CSD#O1|CSD O1]]提交快速删除。").concat(Morebits.userIsSysop ? "\n\n此日志并不记录用Twinkle直接执行的删除。" : "");
            let appendText = "# [[:".concat(Morebits.pageNameNorm, "]]:");
            if (params.fromDI) {
              appendText += "图版[[QW:CSD#".concat(params.normalized.toUpperCase(), "|CSD ").concat(params.normalized.toUpperCase(), "]]({{tl|").concat(params.templatename, "}})");
            } else if (params.normalizeds.length > 1) {
              appendText += "多个理由(";
              var _iterator14 = _createForOfIteratorHelper(params.normalizeds), _step14;
              try {
                for (_iterator14.s(); !(_step14 = _iterator14.n()).done; ) {
                  const norm = _step14.value;
                  appendText += "[[QW:CSD#".concat(norm.toUpperCase(), "|").concat(norm.toUpperCase(), "]]、");
                }
              } catch (err) {
                _iterator14.e(err);
              } finally {
                _iterator14.f();
              }
              appendText = appendText.slice(0, Math.max(0, appendText.length - 1));
              appendText += ")";
            } else if (params.normalizeds[0] === "db") {
              appendText += "自定义理由";
            } else {
              appendText += "[[QW:CSD#".concat(params.normalizeds[0].toUpperCase(), "|CSD ").concat(params.normalizeds[0].toUpperCase(), "]]");
            }
            if (params.requestsalt) {
              appendText += window.wgULS(";请求白纸保护", ";請求白紙保護");
            }
            if (initialContrib) {
              appendText += ";通知{{user|".concat(initialContrib, "}}");
            }
            appendText += " ~~".concat("~", "~~\n");
            usl.changeTags = Twinkle.changeTags;
            usl.log(appendText, window.wgULS("记录对[[", "記錄對[[") + Morebits.pageNameNorm + window.wgULS("]]的快速删除提名", "]]的快速刪除提名"));
          }
        }
      };
      Twinkle.speedy.getParameters = (form, values) => {
        let parameters = [];
        var _iterator15 = _createForOfIteratorHelper(values), _step15;
        try {
          for (_iterator15.s(); !(_step15 = _iterator15.n()).done; ) {
            const value = _step15.value;
            const currentParams = [];
            let redimage;
            switch (value) {
              case "reason":
                if (form["csd.reason_1"]) {
                  const dbrationale = form["csd.reason_1"].value;
                  if (!dbrationale || !dbrationale.trim()) {
                    void mw.notify(window.wgULS("自定义理由:请指定理由。", "自訂理由:請指定理由。"), {
                      type: "warn",
                      tag: "twinklespeedy"
                    });
                    parameters = null;
                    false;
                    continue;
                  }
                  currentParams["1"] = dbrationale;
                }
                break;
              case "a2":
                if (form["csd.a2_pagename"]) {
                  const otherpage = form["csd.a2_pagename"].value;
                  if (!otherpage || !otherpage.trim()) {
                    void mw.notify(window.wgULS("CSD A2:请提供现有条目的名称。", "CSD A2:請提供現有條目的名稱。"), {
                      type: "warn",
                      tag: "twinklespeedy"
                    });
                    parameters = null;
                    false;
                    continue;
                  }
                  currentParams.pagename = otherpage;
                }
                break;
              case "g4":
                if (form["csd.g4_pagename"]) {
                  const pagename = form["csd.g4_pagename"].value;
                  if (!pagename || !pagename.trim()) {
                    void mw.notify(window.wgULS("CSD G4:请提供页面名称。", "CSD G4:請提供頁面名稱。"), {
                      type: "warn",
                      tag: "twinklespeedy"
                    });
                    parameters = null;
                    false;
                    continue;
                  }
                  currentParams.pagename = pagename;
                }
                break;
              case "f2":
                if (form["csd.f2_filename"]) {
                  redimage = form["csd.f2_filename"].value;
                  if (!redimage || !redimage.trim()) {
                    void mw.notify(window.wgULS("CSD F2:请提供另一文件的名称。", "CSD F2:請提供另一檔案的名稱。"), {
                      type: "warn",
                      tag: "twinklespeedy"
                    });
                    parameters = null;
                    false;
                    continue;
                  }
                  currentParams.filename = redimage.replace(new RegExp("^\\s*".concat(Morebits.namespaceRegex(6), ":"), "i"), "");
                }
                break;
              case "r1":
                if (form["csd.r1_type"]) {
                  const redirtype = form["csd.r1_type"].value;
                  if (!redirtype) {
                    void mw.notify(window.wgULS("CSD R1:请选择适用类型。", "CSD R1:請選擇適用類別。"), {
                      type: "warn",
                      tag: "twinklespeedy"
                    });
                    parameters = null;
                    false;
                    continue;
                  }
                  currentParams["1"] = redirtype;
                }
                break;
              case "r2":
                if (form["csd.r2_type"]) {
                  const redirtype = form["csd.r2_type"].value;
                  if (!redirtype) {
                    void mw.notify(window.wgULS("CSD R2:请选择适用类型。", "CSD R2:請選擇適用類別。"), {
                      type: "warn",
                      tag: "twinklespeedy"
                    });
                    parameters = null;
                    false;
                    continue;
                  }
                  currentParams["1"] = redirtype;
                }
                break;
              default:
                break;
            }
            parameters[parameters.length] = currentParams;
          }
        } catch (err) {
          _iterator15.e(err);
        } finally {
          _iterator15.f();
        }
        return parameters;
      };
      Twinkle.speedy.getUserTalkParameters = (normalized) => {
        const utparams = [];
        switch (normalized) {
          default:
            break;
        }
        return utparams;
      };
      Twinkle.speedy.resolveCsdValues = (e) => {
        var _e$target$form;
        const values = ((_e$target$form = e.target.form) !== null && _e$target$form !== void 0 ? _e$target$form : e.target).getChecked("csd");
        if (values.length === 0) {
          void mw.notify(window.wgULS("请选择一个理据!", "請選擇一個理據!"), {
            type: "warn",
            tag: "twinklespeedy"
          });
          return null;
        }
        return values;
      };
      Twinkle.speedy.callback.evaluateSysop = (e) => {
        var _e$target$form2;
        const form = (_e$target$form2 = e.target.form) !== null && _e$target$form2 !== void 0 ? _e$target$form2 : e.target;
        if (e.target.type === "checkbox" || e.target.type === "text" || e.target.type === "select") {
          return;
        }
        const {
          tag_only
        } = form;
        if (tag_only && tag_only.checked) {
          Twinkle.speedy.callback.evaluateUser(e);
          return;
        }
        const values = Twinkle.speedy.resolveCsdValues(e);
        if (!values) {
          return;
        }
        const normalizeds = values.map((value) => {
          return Twinkle.speedy.normalizeHash[value];
        });
        let watchPage;
        let promptForSummary;
        var _iterator16 = _createForOfIteratorHelper(normalizeds), _step16;
        try {
          for (_iterator16.s(); !(_step16 = _iterator16.n()).done; ) {
            const norm = _step16.value;
            if (Twinkle.getPref("watchSpeedyPages").includes(norm)) {
              watchPage = Twinkle.getPref("watchSpeedyExpiry");
            }
            if (Twinkle.getPref("promptForSpeedyDeletionSummary").includes(norm)) {
              promptForSummary = true;
            }
          }
        } catch (err) {
          _iterator16.e(err);
        } finally {
          _iterator16.f();
        }
        const params = {
          values,
          normalizeds,
          watch: watchPage,
          deleteTalkPage: form.talkpage && form.talkpage.checked,
          deleteRedirects: form.redirects.checked,
          openUserTalk: form.openusertalk.checked,
          promptForSummary,
          templateParams: Twinkle.speedy.getParameters(form, values)
        };
        if (!params.templateParams) {
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Twinkle.speedy.callbacks.sysop.main(params);
      };
      Twinkle.speedy.callback.evaluateUser = (e) => {
        var _e$target$form3;
        const form = (_e$target$form3 = e.target.form) !== null && _e$target$form3 !== void 0 ? _e$target$form3 : e.target;
        if (e.target.type === "checkbox" || e.target.type === "text" || e.target.type === "select") {
          return;
        }
        const values = Twinkle.speedy.resolveCsdValues(e);
        if (!values) {
          return;
        }
        const normalizeds = [];
        var _iterator17 = _createForOfIteratorHelper(values), _step17;
        try {
          for (_iterator17.s(); !(_step17 = _iterator17.n()).done; ) {
            const value = _step17.value;
            const norm = Twinkle.speedy.normalizeHash[value];
            normalizeds[normalizeds.length] = norm;
          }
        } catch (err) {
          _iterator17.e(err);
        } finally {
          _iterator17.f();
        }
        let watchPage = false;
        for (var _i7 = 0, _normalizeds = normalizeds; _i7 < _normalizeds.length; _i7++) {
          const norm = _normalizeds[_i7];
          if (Twinkle.getPref("watchSpeedyPages").includes(norm)) {
            watchPage = Twinkle.getPref("watchSpeedyExpiry");
            false;
            continue;
          }
        }
        let notifyuser = false;
        if (form.notify.checked) {
          var _iterator18 = _createForOfIteratorHelper(normalizeds), _step18;
          try {
            for (_iterator18.s(); !(_step18 = _iterator18.n()).done; ) {
              const norm = _step18.value;
              if (Twinkle.getPref("notifyUserOnSpeedyDeletionNomination").includes(norm)) {
                notifyuser = true;
                false;
                continue;
              }
            }
          } catch (err) {
            _iterator18.e(err);
          } finally {
            _iterator18.f();
          }
        }
        let csdlog = false;
        if (Twinkle.getPref("logSpeedyNominations")) {
          var _iterator19 = _createForOfIteratorHelper(normalizeds), _step19;
          try {
            for (_iterator19.s(); !(_step19 = _iterator19.n()).done; ) {
              const norm = _step19.value;
              if (!Twinkle.getPref("noLogOnSpeedyNomination").includes(norm)) {
                csdlog = true;
                false;
                continue;
              }
            }
          } catch (err) {
            _iterator19.e(err);
          } finally {
            _iterator19.f();
          }
        }
        const params = {
          values,
          normalizeds,
          watch: watchPage,
          usertalk: notifyuser,
          lognomination: csdlog,
          blank: form.blank.checked,
          requestsalt: form.salting.checked,
          templateParams: Twinkle.speedy.getParameters(form, values)
        };
        if (!params.templateParams) {
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
        Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成", "標記完成");
        const qiuwen_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("标记页面", "標記頁面"));
        qiuwen_page.setCallbackParameters(params);
        qiuwen_page.load(Twinkle.speedy.callbacks.user.main);
      };
      Twinkle.addInitCallback(Twinkle.speedy, "speedy");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklecopyvio.js
var twinklecopyvio_exports = {};
var init_twinklecopyvio = __esm({
  "src/Twinkle/modules/twinklecopyvio.js"() {
    "use strict";
    /*! Twinkle.js - twinklecopyvio.js */
    (function twinklecopyvio() {
      Twinkle.copyvio = () => {
        if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId") || mw.config.get("wgNamespaceNumber") === 6 && (document.querySelector("#mw-sharedupload") || !document.querySelector("#mw-imagepage-section-filehistory") && !Morebits.isPageRedirect())) {
          return;
        }
        Twinkle.addPortletLink(Twinkle.copyvio.callback, window.wgULS("侵权", "侵權"), "tw-copyvio", window.wgULS("提报侵权页面", "提報侵權頁面"), "");
      };
      Twinkle.copyvio.callback = () => {
        const Window = new Morebits.simpleWindow(600, 350);
        Window.setTitle(window.wgULS("提报侵权页面", "提報侵權頁面"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("侵权设置", "侵權設定"), "H:TW/PREF#copyvio");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#copyvio");
        const form = new Morebits.quickForm(Twinkle.copyvio.callback.evaluate);
        form.append({
          type: "textarea",
          label: window.wgULS("侵权来源:", "侵權來源:"),
          name: "source"
        });
        form.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("CSD G4: 曾经根据侵权审核删除后又重新创建的内容", "CSD G4: 曾經根據侵權審核刪除後又重新建立的內容"),
            value: "g4",
            name: "g4",
            tooltip: window.wgULS("同时以G4准则提报快速删除", "同時以G4準則提報快速刪除"),
            subgroup: [{
              name: "g4_pagename",
              type: "input",
              label: window.wgULS("前次删除的页面名称", "前次刪除的頁面名稱"),
              tooltip: window.wgULS("选填,若前次删除的页面名称不同,请提供", "選填,若前次刪除的頁面名稱不同,請提供")
            }]
          }, {
            label: window.wgULS("通知页面创建者", "通知頁面建立者"),
            value: "notify",
            name: "notify",
            tooltip: window.wgULS("在页面创建者讨论页上放置一通知模板。", "在頁面建立者討論頁上放置一通知模板。"),
            checked: true
          }]
        });
        form.append({
          type: "submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
      };
      Twinkle.copyvio.callbacks = {
        tryTagging: (pageobj) => {
          const text = pageobj.getPageText();
          if (text.includes("{{Copyvio|")) {
            Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("页面已经标记侵权,请人工确认是否已经提报。", "頁面已經標記侵權,請人工確認是否已經提報。"));
          } else {
            Twinkle.copyvio.callbacks.taggingArticle(pageobj);
            const qiuwen_page = new Morebits.wiki.page(mw.config.get("wgPageName"));
            qiuwen_page.setCallbackParameters(pageobj.getCallbackParameters());
            qiuwen_page.lookupCreation(Twinkle.copyvio.callbacks.main);
          }
        },
        main: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          const initialContrib = pageobj.getCreator();
          const qiuwen_page = new Morebits.wiki.page(params.logpage, window.wgULS("加入侵权记录项", "加入侵權記錄項"));
          qiuwen_page.setFollowRedirect(true);
          qiuwen_page.setCallbackParameters(params);
          qiuwen_page.load(Twinkle.copyvio.callbacks.copyvioList);
          if (params.notify) {
            const usertalkpage = new Morebits.wiki.page("User talk:".concat(initialContrib), "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + initialContrib, ")"));
            const notifytext = "\n{{".concat("subst:", "CopyvioNotice|".concat(mw.config.get("wgPageName"), "}}"));
            usertalkpage.setAppendText(notifytext);
            usertalkpage.setEditSummary(window.wgULS("通知:页面[[", "通知:頁面[[") + mw.config.get("wgPageName") + window.wgULS("]]疑似侵犯著作权", "]]疑似侵犯版權"));
            usertalkpage.setChangeTags(Twinkle.changeTags);
            usertalkpage.setCreateOption("recreate");
            usertalkpage.setWatchlist(Twinkle.getPref("copyvioWatchUser"));
            usertalkpage.setFollowRedirect(true, false);
            usertalkpage.append();
          }
        },
        taggingArticle: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          const revisionId = mw.config.get("wgRevisionId") || mw.config.get("wgDiffNewId") || mw.config.get("wgCurRevisionId");
          let tag = "{{".concat("subst:", "Copyvio/auto|url=".concat(params.source.replace(/http/g, "&#104;ttp").replace(/\n+/g, "\n").replace(/^\s*([^*])/gm, "* $1").replace(/^\* $/m, ""), "|OldRevision=").concat(revisionId, "}}"));
          const text = pageobj.getPageText();
          const oldcsd = text.match(/\{\{\s*(db(-\w*)?|d|delete)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}/i);
          if (oldcsd && confirm(window.wgULS("在页面上找到快速删除模板,要保留吗?\n\n当页面同时侵犯著作权又符合快速删除标准时,应该优先走快速删除程序。\n单击“确认”以保留快速删除模板,若您认为快速删除理由不合,单击“取消”以移除快速删除模板。", "在頁面上找到快速刪除模板,要保留嗎?\n\n當頁面同時侵犯版權又符合快速刪除標準時,應該優先走快速刪除程序。\n點擊「確認」以保留快速刪除模板,若您認為快速刪除理由不合,點擊「取消」以移除快速刪除模板。"))) {
            tag = "".concat(oldcsd[0], "\n").concat(tag);
          }
          if (params.g4) {
            let speedyTag = "{{delete";
            speedyTag += "|g4";
            if (params.g4_pagename) {
              speedyTag += "|".concat(params.g4_pagename, "|c1=[[Special:Undelete/").concat(params.g4_pagename, "]]");
            } else {
              speedyTag += "|c1=[[Special:Undelete/".concat(mw.config.get("wgPageName"), "]]");
            }
            speedyTag += "}}";
            tag = "".concat(speedyTag, "\n").concat(tag);
          }
          pageobj.setPageText(tag);
          pageobj.setEditSummary(window.wgULS("此页面疑似侵犯著作权", "此頁面疑似侵犯版權"));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setWatchlist(Twinkle.getPref("copyvioWatchPage"));
          pageobj.save();
          if (Twinkle.getPref("markCopyvioPagesAsPatrolled")) {
            pageobj.patrol();
          }
        },
        copyvioList: (pageobj) => {
          const text = pageobj.getPageText();
          let output = "";
          const date = /* @__PURE__ */ new Date();
          const dateHeaderRegex = new RegExp("^==+\\s*".concat(date.getUTCMonth() + 1, "月").concat(date.getUTCDate(), "日\\s*==+"), "mg");
          if (!dateHeaderRegex.exec(text)) {
            output = "\n\n==".concat(date.getUTCMonth() + 1, "月").concat(date.getUTCDate(), "日==");
          }
          output += "\n{{".concat("subst:", "CopyvioVFDRecord|".concat(mw.config.get("wgPageName"), "}}"));
          pageobj.setAppendText(output);
          pageobj.setEditSummary("加入[[".concat(mw.config.get("wgPageName"), "]]"));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setCreateOption("recreate");
          pageobj.append();
        }
      };
      Twinkle.copyvio.callback.evaluate = (e) => {
        const params = Morebits.quickForm.getInputData(e.target);
        if (!params.source.trim()) {
          void mw.notify(window.wgULS("请指定侵权来源", "請指定侵權來源"), {
            type: "warn",
            tag: "twinklecopyvio"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(e.target);
        params.logpage = "Qiuwen_talk:侵权提报";
        Morebits.wiki.addCheckpoint();
        Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
        Morebits.wiki.actionCompleted.notice = window.wgULS("提报完成,将在几秒内刷新页面", "提報完成,將在幾秒內重新整理頁面");
        const qiuwen_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入侵权模板到页面", "加入侵權模板到頁面"));
        qiuwen_page.setCallbackParameters(params);
        qiuwen_page.load(Twinkle.copyvio.callbacks.tryTagging);
        Morebits.wiki.removeCheckpoint();
      };
      Twinkle.addInitCallback(Twinkle.copyvio, "copyvio");
    })();
  }
});
//! src/Twinkle/modules/twinklexfd.js
var twinklexfd_exports = {};
var init_twinklexfd = __esm({
  "src/Twinkle/modules/twinklexfd.js"() {
    "use strict";
    /*! Twinkle.js - twinklexfd.js */
    (function twinklexfd() {
      Twinkle.xfd = () => {
        if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId") || mw.config.get("wgNamespaceNumber") === 6 && (document.querySelector("#mw-sharedupload") || !document.querySelector("#mw-imagepage-section-filehistory") && !Morebits.isPageRedirect())) {
          return;
        }
        Twinkle.addPortletLink(Twinkle.xfd.callback, window.wgULS("提删", "提刪"), "tw-xfd", window.wgULS("提交删除讨论", "提交刪除討論"));
      };
      Twinkle.xfd.currentRationale = null;
      Twinkle.xfd.printRationale = () => {
        if (Twinkle.xfd.currentRationale) {
          Morebits.status.printUserText(Twinkle.xfd.currentRationale, window.wgULS("您的理由已在下方提供,若您想重新提交,请将其复制到一新窗口中:", "您的理由已在下方提供,若您想重新提交,請將其複製到一新視窗中:"));
          Twinkle.xfd.currentRationale = null;
        }
      };
      Twinkle.xfd.callback = () => {
        const Window = new Morebits.simpleWindow(600, 350);
        Window.setTitle(window.wgULS("提交存废讨论", "提交存廢討論"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("提删设置", "提刪設定"), "H:TW/PREF#xfd");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#xfd");
        const form = new Morebits.quickForm(Twinkle.xfd.callback.evaluate);
        const categories = form.append({
          type: "select",
          name: "category",
          label: window.wgULS("提交类型:", "提交類別:"),
          event: Twinkle.xfd.callback.change_category
        });
        categories.append({
          type: "option",
          label: window.wgULS("页面存废讨论", "頁面存廢討論"),
          selected: mw.config.get("wgNamespaceNumber") === 0,
          value: "afd"
        });
        categories.append({
          type: "option",
          label: window.wgULS("文件存废讨论", "檔案存廢討論"),
          selected: mw.config.get("wgNamespaceNumber") === 6,
          value: "ffd"
        });
        form.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("如可能,通知页面创建者", "如可能,通知頁面建立者"),
            value: "notify",
            name: "notify",
            tooltip: window.wgULS("在页面创建者讨论页上放置一通知模板。", "在頁面建立者討論頁上放置一通知模板。"),
            checked: true
          }]
        });
        form.append({
          type: "field",
          label: "工作区",
          name: "work_area"
        });
        form.append({
          type: "submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        const evt = document.createEvent("Event");
        evt.initEvent("change", true, true);
        result.category.dispatchEvent(evt);
      };
      Twinkle.xfd.callback.change_category = (e) => {
        const {
          value
        } = e.target;
        const {
          form
        } = e.target;
        const [old_area] = Morebits.quickForm.getElements(e.target.form, "work_area");
        let work_area = null;
        const oldreasontextbox = form.querySelector("textarea");
        let oldreason = oldreasontextbox ? oldreasontextbox.value : "";
        const appendReasonBox = (xfd_cat) => {
          switch (xfd_cat) {
            case "fwdcsd":
              oldreason = decodeURIComponent(document.querySelector("#delete-reason").textContent).replace(/\+/g, " ");
              break;
            case "fame":
              oldreason = Twinkle.getPref("afdFameDefaultReason");
              break;
            case "substub":
              oldreason = Twinkle.getPref("afdSubstubDefaultReason");
              break;
            default:
              break;
          }
          work_area.append({
            type: "textarea",
            name: "xfdreason",
            label: window.wgULS("提删理由:", "提刪理由:"),
            value: oldreason,
            tooltip: window.wgULS("您可以使用wikitext,Twinkle将自动为您加入签名。若您使用批量提删功能,存废讨论页只会使用第一次提交的理由,但之后您仍需提供以用于删除通告模板的参数。", "您可以使用wikitext,Twinkle將自動為您加入簽名。若您使用批次提刪功能,存廢討論頁只會使用第一次提交的理由,但之後您仍需提供以用於刪除通告模板的參數。"),
            placeholder: window.wgULS("此值亦显示于页面的删除通告模板内,故务必提供此值,避免使用“同上”等用语。", "此值亦顯示於頁面的刪除通告模板內,故務必提供此值,避免使用「同上」等用語。")
          });
        };
        switch (value) {
          case "afd": {
            work_area = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("页面存废讨论", "頁面存廢討論"),
              name: "work_area"
            });
            work_area.append({
              type: "checkbox",
              list: [{
                label: "使用&lt;noinclude&gt;包裹模板",
                value: "noinclude",
                name: "noinclude",
                checked: mw.config.get("wgNamespaceNumber") === 10 && mw.config.get("wgPageContentModel") !== "Scribunto",
                // Template namespace
                tooltip: window.wgULS("使其不会在被包含时出现。", "使其不會在被包含時出現。"),
                disabled: mw.config.get("wgPageContentModel") === "Scribunto"
              }]
            });
            const afd_category = work_area.append({
              type: "select",
              name: "xfdcat",
              label: window.wgULS("选择提删类型:", "選擇提刪類別:"),
              event: Twinkle.xfd.callback.change_afd_category
            });
            let afd_cat = "delete";
            if (Twinkle.getPref("afdDefaultCategory") === "same") {
              if (localStorage.Twinkle_afdCategory === void 0) {
                localStorage.Twinkle_afdCategory = "delete";
              } else {
                afd_cat = localStorage.Twinkle_afdCategory;
              }
            }
            afd_category.append({
              type: "option",
              label: window.wgULS("删除", "刪除"),
              value: "delete",
              selected: afd_cat === "delete"
            });
            afd_category.append({
              type: "option",
              label: window.wgULS("合并", "合併"),
              value: "merge",
              selected: afd_cat === "merge"
            });
            if (Twinkle.getPref("FwdCsdToXfd")) {
              afd_category.append({
                type: "option",
                label: window.wgULS("转交自快速删除候选", "轉交自快速刪除候選"),
                value: "fwdcsd",
                selected: afd_cat === "fwdcsd"
              });
            }
            afd_category.append({
              type: "option",
              label: window.wgULS("批量关注度提删", "批次關注度提刪"),
              value: "fame",
              selected: afd_cat === "fame"
            });
            afd_category.append({
              type: "option",
              label: window.wgULS("批量小小作品提删", "批次小小作品提刪"),
              value: "substub",
              selected: afd_cat === "substub"
            });
            afd_category.append({
              type: "option",
              label: window.wgULS("批量其他提删", "批次其他提刪"),
              value: "batch",
              selected: afd_cat === "batch"
            });
            work_area.append({
              type: "input",
              name: "mergeinto",
              label: window.wgULS("合并到:", "合併到:"),
              hidden: true
            });
            appendReasonBox(afd_cat);
            work_area.append({
              type: "textarea",
              name: "fwdcsdreason",
              label: window.wgULS("转交理由:", "轉交理由:"),
              tooltip: window.wgULS("您可以使用wikitext,Twinkle将自动为您加入签名。", "您可以使用wikitext,Twinkle將自動為您加入簽名。"),
              hidden: true
            });
            work_area = work_area.render();
            old_area.parentNode.replaceChild(work_area, old_area);
            const evt = document.createEvent("Event");
            evt.initEvent("change", true, true);
            form.xfdcat.dispatchEvent(evt);
            break;
          }
          case "ffd":
            work_area = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("文件存废讨论", "檔案存廢討論"),
              name: "work_area"
            });
            appendReasonBox("ffd");
            work_area = work_area.render();
            old_area.parentNode.replaceChild(work_area, old_area);
            break;
          default:
            work_area = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("未定义", "未定義"),
              name: "work_area"
            });
            work_area = work_area.render();
            old_area.parentNode.replaceChild(work_area, old_area);
            break;
        }
        form.notify.checked = true;
        form.notify.disabled = false;
      };
      Twinkle.xfd.callback.change_afd_category = (e) => {
        switch (e.target.value) {
          case "merge":
            e.target.form.mergeinto.parentElement.removeAttribute("hidden");
            e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
            e.target.form.mergeinto.previousElementSibling.innerHTML = window.wgULS("合并到:", "合併到:");
            break;
          case "fwdcsd":
            e.target.form.mergeinto.parentElement.removeAttribute("hidden");
            e.target.form.fwdcsdreason.parentElement.removeAttribute("hidden");
            e.target.form.mergeinto.previousElementSibling.innerHTML = "提交人:";
            e.target.form.xfdreason.value = decodeURIComponent(document.querySelector("#delete-reason").textContent).replace(/\+/g, " ");
            break;
          case "fame":
            e.target.form.mergeinto.parentElement.setAttribute("hidden", "");
            e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
            e.target.form.xfdreason.value = Twinkle.getPref("afdFameDefaultReason");
            break;
          case "substub":
            e.target.form.mergeinto.parentElement.setAttribute("hidden", "");
            e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
            e.target.form.xfdreason.value = Twinkle.getPref("afdSubstubDefaultReason");
            break;
          default:
            e.target.form.mergeinto.parentElement.setAttribute("hidden", "");
            e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
        }
        if (Twinkle.getPref("afdDefaultCategory") === "same") {
          localStorage.Twinkle_afdCategory = e.target.value;
        }
      };
      Twinkle.xfd.callbacks = {
        afd: {
          main: (tagging_page) => {
            const params = tagging_page.getCallbackParameters();
            Twinkle.xfd.callbacks.afd.taggingArticle(tagging_page);
            const discussion_page = new Morebits.wiki.page(params.logpage, window.wgULS("加入讨论到当日列表", "加入討論到當日列表"));
            discussion_page.setFollowRedirect(true);
            discussion_page.setCallbackParameters(params);
            discussion_page.load(Twinkle.xfd.callbacks.afd.todaysList);
            if (params.notify) {
              if (params.creator === mw.config.get("wgUserName")) {
                Morebits.status.warn("".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"), window.wgULS("您创建了该页,跳过通知", "您建立了該頁,跳過通知"));
                params.creator = null;
              } else {
                const talkPageName = "User talk:".concat(params.creator);
                const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"));
                const notifytext = "\n{{".concat("subst:").concat("AFDNote|".concat(Morebits.pageNameNorm, "}}--~~"), "~~");
                usertalkpage.setAppendText(notifytext);
                usertalkpage.setEditSummary("通知:页面[[".concat(Morebits.pageNameNorm, "]]存废讨论提名"));
                usertalkpage.setChangeTags(Twinkle.changeTags);
                usertalkpage.setCreateOption("recreate");
                usertalkpage.setWatchlist(Twinkle.getPref("xfdWatchUser"));
                usertalkpage.setFollowRedirect(true, false);
                usertalkpage.append();
              }
              if (params.lognomination) {
                Twinkle.xfd.callbacks.addToLog(params, params.creator);
              }
            } else if (params.lognomination) {
              Twinkle.xfd.callbacks.addToLog(params, null);
            }
          },
          taggingArticle: (pageobj) => {
            let text = pageobj.getPageText();
            const params = pageobj.getCallbackParameters();
            let tag = "{{vfd|".concat(Morebits.string.formatReasonText(params.xfdreason));
            if (Morebits.isPageRedirect()) {
              tag += "|r";
            }
            tag += "|date={{".concat("subst:", "#time:Y/m/d}}}}");
            if (params.noinclude) {
              tag = "<noinclude>".concat(tag, "</noinclude>");
              if (text.indexOf("{|") === 0) {
                tag += "\n";
              }
            } else {
              tag += "\n";
            }
            const textNoSd = text.replace(/\{\{\s*(db(-\w*)?|d|delete|(?:hang|hold)[- ]?on)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
            if (text !== textNoSd && confirm(window.wgULS("在页面上找到快速删除模板,要移除吗?", "在頁面上找到快速刪除模板,要移除嗎?"))) {
              text = textNoSd;
            }
            const textNoNotMandarin = text.replace(/\{\{\s*(NotMandarin|Notchinese|非中文|非現代漢語|非现代汉语|非現代標準漢語|非现代标准汉语)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
            if (text !== textNoNotMandarin && confirm(window.wgULS("在页面上找到非现代标准汉语模板,要移除吗?", "在頁面上找到非現代標準漢語模板,要移除嗎?"))) {
              text = textNoNotMandarin;
            }
            const textNoAfc = text.replace(/{{\s*AFC submission\s*\|\s*\|[^}]*?}}\s*/gi, "");
            if (text !== textNoAfc && confirm(window.wgULS("在页面上找到AFC提交模板,要移除吗?", "在頁面上找到AFC提交模板,要移除嗎?"))) {
              text = textNoAfc;
            }
            if (Twinkle.getPref("markXfdPagesAsPatrolled")) {
              pageobj.patrol();
            }
            const qiuwen_page = new Morebits.wikitext.page(text);
            text = qiuwen_page.insertAfterTemplates(tag, Twinkle.hatnoteRegex).getText();
            pageobj.setPageText(text);
            pageobj.setEditSummary("".concat(window.wgULS("页面存废讨论:[[", "頁面存廢討論:[[") + params.logpage, "#").concat(Morebits.pageNameNorm, "]]"));
            pageobj.setChangeTags(Twinkle.changeTags);
            pageobj.setWatchlist(Twinkle.getPref("xfdWatchPage"));
            pageobj.save();
          },
          todaysList: (pageobj) => {
            let text = pageobj.getPageText();
            const params = pageobj.getCallbackParameters();
            let type = "";
            let to = "";
            switch (params.xfdcat) {
              case "fwdcsd":
              case "merge":
                to = params.mergeinto;
              default:
                type = params.xfdcat;
                break;
            }
            let append = true;
            switch (type) {
              case "fame":
              case "substub":
              case "batch": {
                const commentText = "<!-- Twinkle: User:".concat(mw.config.get("wgUserName"), " 的 ").concat(type, " 提删插入点,请勿更改或移除此行,除非不再于此页面提删 -->");
                let newText = "===[[:".concat(Morebits.pageNameNorm, "]]===");
                if (type === "fame") {
                  newText += "\n{{Findsources|".concat(Morebits.pageNameNorm, "}}");
                }
                if (text.includes(commentText)) {
                  text = text.replace(commentText, "".concat(newText, "\n\n").concat(commentText));
                  pageobj.setPageText(text);
                  append = false;
                } else {
                  const safesubst = "safesubst";
                  const appendText = "\n{{".concat(safesubst).concat(":SafeAfdHead}}\n".concat({
                    fame: '== 30天后仍挂有{{tl|notability}}模板的条目 ==\n<span style="font-size: smaller;">(已挂[[Template:notability|不符收录标准模板]]30天)</span>',
                    substub: '== 30天后仍挂有{{tl|substub}}模板的条目 ==\n<span style="font-size: smaller;">(已挂[[Template:substub|小小条目模板]]30天)</span>',
                    batch: "== 批量提删 =="
                  }[type], "\n").concat(newText, "\n\n").concat(commentText, "\n----\n:建议:删除前述页面;理由:").concat(Morebits.string.formatReasonText(params.xfdreason), "\n提报以上").concat({
                    fame: "<u>不符合收录标准</u>条目",
                    substub: "<u>长度过短</u>条目",
                    batch: "页面"
                  }[type], '的求闻编者及时间:<br id="no-new-title">~~').concat("~~"));
                  pageobj.setAppendText(appendText);
                }
                break;
              }
              default:
                pageobj.setAppendText("\n{{".concat("subst:", "DRItem|Type=".concat(type, "|DRarticles=").concat(Morebits.pageNameNorm, "|Reason=").concat(Morebits.string.formatReasonText(params.xfdreason)).concat(params.fwdcsdreason.trim() === "" ? "" : "<br>\n转交理由:".concat(params.fwdcsdreason), "|To=").concat(to, "}}~~").concat("~~")));
                break;
            }
            pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
            pageobj.setChangeTags(Twinkle.changeTags);
            pageobj.setWatchlist(Twinkle.getPref("xfdWatchDiscussion"));
            pageobj.setCreateOption("recreate");
            if (append) {
              pageobj.append();
            } else {
              pageobj.save();
            }
            Twinkle.xfd.currentRationale = null;
          },
          lookupCreation: (target_page) => {
            target_page.getStatusElement().info("完成");
            const params = target_page.getCallbackParameters();
            params.creator = target_page.getCreator();
            const tagging_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入存废讨论模板到页面", "加入存廢討論模板到頁面"));
            tagging_page.setFollowRedirect(false);
            tagging_page.setCallbackParameters(params);
            tagging_page.load(Twinkle.xfd.callbacks.afd.tryTagging);
          },
          tryTagging: (tagging_page) => {
            const statelem = tagging_page.getStatusElement();
            if (!tagging_page.exists()) {
              statelem.error(window.wgULS("页面不存在,可能已被删除", "頁面不存在,可能已被刪除"));
              return;
            }
            const text = tagging_page.getPageText();
            const xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec(text);
            if (xfd && !confirm(window.wgULS("删除相关模板{{", "刪除相關模板{{") + xfd[1] + window.wgULS("}}已被置于页面中,您是否仍想继续提报?", "}}已被置於頁面中,您是否仍想繼續提報?"))) {
              statelem.error(window.wgULS("页面已被提交至存废讨论。", "頁面已被提交至存廢討論。"));
              return;
            }
            const copyvio = /(?:\{\{\s*(copyvio)[^{}]*?\}\})/i.exec(text);
            if (copyvio) {
              statelem.error(window.wgULS("页面中已有著作权验证模板。", "頁面中已有著作權驗證模板。"));
              return;
            }
            Twinkle.xfd.callbacks.afd.main(tagging_page);
          }
        },
        ffd: {
          main: (tagging_page) => {
            const params = tagging_page.getCallbackParameters();
            Twinkle.xfd.callbacks.ffd.taggingImage(tagging_page);
            const qiuwen_page = new Morebits.wiki.page(params.logpage, window.wgULS("加入讨论到当日列表", "加入討論到當日列表"));
            qiuwen_page.setFollowRedirect(true);
            qiuwen_page.setCallbackParameters(params);
            qiuwen_page.load(Twinkle.xfd.callbacks.ffd.todaysList);
            if (params.notify) {
              if (params.creator === mw.config.get("wgUserName")) {
                Morebits.status.warn("".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"), window.wgULS("您创建了该页,跳过通知", "您建立了該頁,跳過通知"));
                return;
              }
              const talkPageName = "User talk:".concat(params.creator);
              const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"));
              const notifytext = "\n{{".concat("subst:", "idw|File:".concat(mw.config.get("wgTitle"), "}}"), "--~~", "~~");
              usertalkpage.setAppendText(notifytext);
              usertalkpage.setEditSummary("通知:文件[[".concat(Morebits.pageNameNorm, "]]存废讨论提名"));
              usertalkpage.setChangeTags(Twinkle.changeTags);
              usertalkpage.setCreateOption("recreate");
              usertalkpage.setWatchlist(Twinkle.getPref("xfdWatchUser"));
              usertalkpage.setFollowRedirect(true, false);
              usertalkpage.append();
              if (params.lognomination) {
                Twinkle.xfd.callbacks.addToLog(params, params.creator);
              }
            } else if (params.lognomination) {
              Twinkle.xfd.callbacks.addToLog(params, null);
            }
          },
          taggingImage: (pageobj) => {
            const text = pageobj.getPageText();
            const params = pageobj.getCallbackParameters();
            pageobj.setPageText("{{ifd|".concat(Morebits.string.formatReasonText(params.xfdreason), "|date={{").concat("subst:", "#time:c}}}}\n".concat(text)));
            pageobj.setEditSummary("".concat(window.wgULS("文件存废讨论:[[", "檔案存廢討論:[[") + params.logpage, "#").concat(Morebits.pageNameNorm, "]]"));
            pageobj.setChangeTags(Twinkle.changeTags);
            pageobj.setWatchlist(Twinkle.getPref("xfdWatchPage"));
            pageobj.setCreateOption("recreate");
            pageobj.save();
          },
          todaysList: (pageobj) => {
            const params = pageobj.getCallbackParameters();
            pageobj.setAppendText("\n{{".concat("subst:", "IfdItem|Filename=".concat(mw.config.get("wgTitle"), "|Uploader=").concat(params.creator, "|Reason=").concat(Morebits.string.formatReasonText(params.xfdreason), "}}--~~").concat("~~")));
            pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
            pageobj.setChangeTags(Twinkle.changeTags);
            pageobj.setWatchlist(Twinkle.getPref("xfdWatchDiscussion"));
            pageobj.setCreateOption("recreate");
            pageobj.append(() => {
              Twinkle.xfd.currentRationale = null;
            });
          },
          lookupCreation: (target_page) => {
            target_page.getStatusElement().info("完成");
            const params = target_page.getCallbackParameters();
            params.creator = target_page.getCreator();
            const tagging_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入存废讨论模板到文件描述页", "加入存廢討論模板到檔案描述頁"));
            tagging_page.setFollowRedirect(false);
            tagging_page.setCallbackParameters(params);
            tagging_page.load(Twinkle.xfd.callbacks.ffd.tryTagging);
          },
          tryTagging: (tagging_page) => {
            const statelem = tagging_page.getStatusElement();
            if (!tagging_page.exists()) {
              statelem.error(window.wgULS("页面不存在,可能已被删除", "頁面不存在,可能已被刪除"));
              return;
            }
            const text = tagging_page.getPageText();
            const xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec(text);
            if (xfd && !confirm(window.wgULS("删除相关模板{{", "刪除相關模板{{") + xfd[1] + window.wgULS("}}已被置于页面中,您是否仍想继续提报?", "}}已被置於頁面中,您是否仍想繼續提報?"))) {
              statelem.error(window.wgULS("页面已被提交至存废讨论。", "頁面已被提交至存廢討論。"));
              return;
            }
            Twinkle.xfd.callbacks.ffd.main(tagging_page);
          }
        },
        addToLog: (params, initialContrib) => {
          const editsummary = window.wgULS("记录对[[", "記錄對[[") + Morebits.pageNameNorm + window.wgULS("]]的存废讨论提名", "]]的存廢討論提名");
          const usl = new Morebits.userspaceLogger(Twinkle.getPref("xfdLogPageName"));
          usl.initialText = window.wgULS("这是该用户使用[[H:TW|Twinkle]]的提删模块做出的[[QW:XFD|存废讨论]]提名列表。\n\n若您不再想保留此日志,请在[[".concat(Twinkle.getPref("configPage"), "|参数设置]]中关掉,并使用[[QW:CSD#O1|CSD O1]]提交快速删除。"), "這是該使用者使用[[H:TW|Twinkle]]的提刪模塊做出的[[QW:XFD|存廢討論]]提名列表。\n\n若您不再想保留此日誌,請在[[".concat(Twinkle.getPref("configPage"), "|偏好設定]]中關掉,並使用[[QW:CSD#O1|CSD O1]]提交快速刪除。"));
          let xfdCatName;
          switch (params.xfdcat) {
            case "delete":
              xfdCatName = window.wgULS("删除", "刪除");
              break;
            case "merge":
              xfdCatName = window.wgULS("合并到", "合併到");
              break;
            case "fwdcsd":
              xfdCatName = window.wgULS("转交自快速删除候选", "轉交自快速刪除候選");
              break;
            case "fame":
              xfdCatName = window.wgULS("批量关注度提删", "批次關注度提刪");
              break;
            case "substub":
              xfdCatName = window.wgULS("批量小小作品提删", "批次小小作品提刪");
              break;
            case "batch":
              xfdCatName = window.wgULS("批量其他提删", "批次其他提刪");
              break;
            default:
              xfdCatName = window.wgULS("文件存废讨论", "檔案存廢討論");
              break;
          }
          let appendText = "# [[:".concat(Morebits.pageNameNorm, "]]");
          if (mw.config.get("wgNamespaceNumber") === 6) {
            appendText += "([{{fullurl:Special:Log|page=".concat(mw.util.wikiUrlencode(mw.config.get("wgPageName")), "}} ").concat(window.wgULS("日志", "日誌"), "])");
          }
          appendText += ":".concat(xfdCatName);
          if (params.xfdcat === "merge") {
            appendText += "[[:".concat(params.mergeinto, "]]");
          }
          appendText += "。";
          if (params.xfdreason) {
            appendText += "'''".concat(params.xfdcat === "fwdcsd" ? window.wgULS("原删除理据", "原刪除理據") : window.wgULS("理据", "理據"), "''':").concat(Morebits.string.formatReasonForLog(params.xfdreason));
            appendText = Morebits.string.appendPunctuation(appendText);
          }
          if (params.fwdcsdreason) {
            appendText += "'''".concat(params.xfdcat === "fwdcsd" ? window.wgULS("转交理据", "轉交理據") : window.wgULS("理据", "理據"), "''':").concat(Morebits.string.formatReasonForLog(params.fwdcsdreason));
            appendText = Morebits.string.appendPunctuation(appendText);
          }
          if (initialContrib) {
            appendText += ";通知{{user|".concat(initialContrib, "}}");
          }
          appendText += " ~~".concat("~~", "~\n");
          usl.changeTags = Twinkle.changeTags;
          usl.log(appendText, editsummary);
        }
      };
      Twinkle.xfd.callback.evaluate = (e) => {
        const params = Morebits.quickForm.getInputData(e.target);
        if (params.xfdcat === "merge" && params.mergeinto.trim() === "") {
          void mw.notify(window.wgULS("请提供合并目标!", "請提供合併目標!"), {
            type: "warn",
            tag: "twinklexfd"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(e.target);
        Twinkle.xfd.currentRationale = params.xfdreason;
        Morebits.status.onError(Twinkle.xfd.printRationale);
        if (!params.category) {
          Morebits.status.error("错误", "未定义的动作");
          return;
        }
        let target_page;
        const date = new Morebits.date();
        switch (params.category) {
          case "afd":
            params.logpage = "Qiuwen_talk:存废讨论/记录/".concat(date.format("YYYY/MM/DD", "utc"));
            params.lognomination = Twinkle.getPref("logXfdNominations") && !Twinkle.getPref("noLogOnXfdNomination").includes(params.xfdcat);
            Morebits.wiki.addCheckpoint();
            Morebits.wiki.actionCompleted.redirect = params.logpage;
            Morebits.wiki.actionCompleted.notice = window.wgULS("提名完成,重定向到讨论页", "提名完成,重新導向到討論頁");
            target_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("获取页面创建信息", "取得頁面建立資訊"));
            target_page.setCallbackParameters(params);
            if (mw.config.get("wgPageContentModel") === "wikitext") {
              target_page.setLookupNonRedirectCreator(true);
            }
            target_page.lookupCreation(Twinkle.xfd.callbacks.afd.lookupCreation);
            Morebits.wiki.removeCheckpoint();
            break;
          case "ffd": {
            params.logpage = "Qiuwen_talk:存废讨论/记录/".concat(date.format("YYYY/MM/DD", "utc"));
            params.lognomination = Twinkle.getPref("logXfdNominations") && !Twinkle.getPref("noLogOnXfdNomination").includes("ffd");
            Morebits.wiki.addCheckpoint();
            Morebits.wiki.actionCompleted.redirect = params.logpage;
            Morebits.wiki.actionCompleted.notice = window.wgULS("提名完成,重定向到讨论页", "提名完成,重新導向到討論頁");
            const qiuwen_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("获取页面创建信息", "取得頁面建立資訊"));
            qiuwen_page.setCallbackParameters(params);
            qiuwen_page.setLookupNonRedirectCreator(true);
            qiuwen_page.lookupCreation(Twinkle.xfd.callbacks.ffd.lookupCreation);
            Morebits.wiki.removeCheckpoint();
            break;
          }
          default:
            void mw.notify("twinklexfd:未定义的类别", {
              type: "warn",
              tag: "twinklexfd"
            });
            break;
        }
      };
      Twinkle.addInitCallback(Twinkle.xfd, "xfd");
    })();
  }
});
//! src/Twinkle/modules/twinkleimage.js
var twinkleimage_exports = {};
var init_twinkleimage = __esm({
  "src/Twinkle/modules/twinkleimage.js"() {
    "use strict";
    /*! Twinkle.js - twinkleimage.js */
    (function twinkleimage() {
      Twinkle.image = () => {
        if (mw.config.get("wgNamespaceNumber") === 6 && !document.querySelector("#mw-sharedupload") && document.querySelector("#mw-imagepage-section-filehistory")) {
          Twinkle.addPortletLink(Twinkle.image.callback, window.wgULS("图权", "圖權"), "tw-di", window.wgULS("提交文件快速删除", "提交檔案快速刪除"));
        }
      };
      Twinkle.image.callback = () => {
        const Window = new Morebits.simpleWindow(600, 330);
        Window.setTitle(window.wgULS("文件快速删除候选", "檔案快速刪除候選"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("快速删除方针", "快速刪除方針"), "QW:CSD");
        Window.addFooterLink(window.wgULS("图权设置", "圖權設定"), "H:TW/PREF#image");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#image");
        const form = new Morebits.quickForm(Twinkle.image.callback.evaluate);
        form.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("通知上传者", "通知上傳者"),
            value: "notify",
            name: "notify",
            tooltip: window.wgULS("若您在标记同一用户的很多文件,请取消此复选框以避免发送过多消息。CSD F5永远不会通知。", "若您在標記同一使用者的很多檔案,請取消此核取方塊以避免發送過多訊息。CSD F5永遠不會通知。"),
            checked: Twinkle.getPref("notifyUserOnDeli")
          }]
        });
        const field = form.append({
          type: "field",
          label: window.wgULS("需要的动作", "需要的動作")
        });
        field.append({
          type: "radio",
          name: "type",
          list: [{
            label: window.wgULS("明显侵权之文件(CSD F1)", "明顯侵權之檔案(CSD F1)"),
            value: "no permission",
            tooltip: window.wgULS("上传者宣称拥有,而在其他来源找到的文件,或从侵权的来源获取的文件。", "上傳者宣稱擁有,而在其他來源找到的檔案,或從侵權的來源取得的檔案。"),
            subgroup: {
              name: "f1_source",
              type: "textarea",
              label: window.wgULS("侵权来源:", "侵權來源:")
            }
          }, {
            label: window.wgULS("来源不明(CSD F3)", "來源不明(CSD F3)"),
            value: "no source",
            checked: true,
            tooltip: window.wgULS("本文件并未注明原始出处", "本檔案並未註明原始出處")
          }, {
            label: window.wgULS("未知著作权或著作权无法被查证(CSD F3)", "未知著作權或著作權無法被查證(CSD F3)"),
            value: "no license",
            tooltip: window.wgULS("本文件缺少著作权信息,或声称的著作权信息无法被查证", "本檔案缺少著作權資訊,或聲稱的著作權資訊無法被查證")
          }, {
            label: window.wgULS("来源不明且未知著作权或著作权无法被查证(CSD F3)", "來源不明且未知著作權或著作權無法被查證(CSD F3)"),
            value: "no source no license",
            tooltip: window.wgULS("本文件并未注明原始出处,且本文件缺少著作权信息或声称的著作权信息无法被查证", "本檔案並未註明原始出處,且本檔案缺少著作權資訊或聲稱的著作權資訊無法被查證")
          }, {
            label: window.wgULS("可被替代的非自由著作权文件(CSD F4)", "可被替代的非自由著作權檔案(CSD F4)"),
            value: "replaceable fair use",
            tooltip: window.wgULS("文件仅用于描述、识别或评论文件中展示的事物,或仅用作插图,且满足以下四个条件之一。若给出了其他合理使用依据,不适用本条。如对文件的可替代性存在争议,应交文件存废讨论处理。本条也不适用于正在或曾经由文件存废讨论处理过的文件。", "檔案僅用於描述、辨識或評論檔案中展示的事物,或僅用作插圖,且滿足以下四個條件之一。若給出了其他合理使用依據,不適用本條。如對檔案的可替代性存在爭議,應交檔案存廢討論處理。本條也不適用於正在或曾經由檔案存廢討論處理過的檔案。"),
            subgroup: {
              name: "f4_type",
              type: "select",
              label: window.wgULS("适用类型:", "適用類別:"),
              style: "width: 85%;",
              list: [{
                type: "option",
                label: window.wgULS("请选择", "請選擇"),
                value: ""
              }, {
                type: "option",
                label: window.wgULS("有其他自由著作权文件展示相同的事物", "有其他自由著作權檔案展示相同的事物"),
                value: "1"
              }, {
                type: "option",
                label: window.wgULS("文件描述的是在世或假定在世人物、仍然存在的建筑、室外雕塑或仍然在售的商品,且预计自行拍摄的照片不受他人著作权保护", "檔案描述的是在世或假定在世人物、仍然存在的建築、室外雕塑或仍然在售的商品,且預計自行拍攝的相片不受他人著作權保護"),
                value: "2"
              }, {
                type: "option",
                label: window.wgULS("文件为可自行绘制的地图或图表", "檔案為可自行繪製的地圖或圖表"),
                value: "3"
              }, {
                type: "option",
                label: window.wgULS("文件来自商业图片机构(如Getty)", "檔案來自商業圖片機構(如Getty)"),
                value: "4"
              }]
            }
          }, {
            label: window.wgULS("没有被条目使用的非自由著作权文件(CSD F5)", "沒有被條目使用的非自由著作權檔案(CSD F5)"),
            value: "orphaned fair use",
            tooltip: window.wgULS("本文件为非自由著作权且没有被条目使用", "本檔案為非自由著作權且沒有被條目使用")
          }, {
            label: window.wgULS("没有填写任何合理使用依据的非自由著作权文件(CSD F5)", "沒有填寫任何合理使用依據的非自由著作權檔案(CSD F5)"),
            value: "no fair use rationale",
            tooltip: window.wgULS("不适用于有争议但完整的合理使用依据。若非自由著作权文件只有部分条目的使用依据,但同时被使用于未提供合理使用依据的条目,则本方针也不适用。", "不適用於有爭議但完整的合理使用依據。若非自由著作權檔案只有部分條目的使用依據,但同時被使用於未提供合理使用依據的條目,則本方針也不適用。")
          }]
        });
        form.append({
          type: "submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        const evt = document.createEvent("Event");
        evt.initEvent("change", true, true);
        result.type[0].dispatchEvent(evt);
      };
      Twinkle.image.callback.evaluate = (event) => {
        let type;
        let notify = event.target.notify.checked;
        const types = event.target.type;
        var _iterator20 = _createForOfIteratorHelper(types), _step20;
        try {
          for (_iterator20.s(); !(_step20 = _iterator20.n()).done; ) {
            const type_ = _step20.value;
            if (type_.checked) {
              type = type_.values;
              break;
            }
          }
        } catch (err) {
          _iterator20.e(err);
        } finally {
          _iterator20.f();
        }
        let csdcrit;
        switch (type) {
          case "no source":
            csdcrit = "f3";
            break;
          case "no license":
            csdcrit = "f3";
            break;
          case "no source no license":
            csdcrit = "f3";
            break;
          case "orphaned fair use":
            csdcrit = "f5";
            notify = false;
            break;
          case "no permission":
            csdcrit = "f1";
            break;
          case "no fair use rationale":
            csdcrit = "f5";
            break;
          case "replaceable fair use":
            csdcrit = "f4";
            break;
          default:
            throw new Error("Twinkle.image.callback.evaluate:未知条款");
        }
        const lognomination = Twinkle.getPref("logSpeedyNominations") && !Twinkle.getPref("noLogOnSpeedyNomination").includes(csdcrit.toLowerCase());
        const templatename = type;
        const params = {
          type,
          templatename,
          normalized: csdcrit,
          lognomination
        };
        if (csdcrit === "f1") {
          params.f1_source = event.target["type.f1_source"].value;
        }
        if (csdcrit === "f4") {
          const f4_type = event.target["type.f4_type"].value;
          if (!f4_type) {
            void mw.notify(window.wgULS("CSD F4:请选择适用类型。", "CSD F4:請選擇適用類別。"), {
              type: "warn",
              tag: "twinkleimage"
            });
            return false;
          }
          params.f4_type = f4_type;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(event.target);
        Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
        Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成", "標記完成");
        const qiuwen_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入删除标记", "加入刪除標記"));
        qiuwen_page.setCallbackParameters(params);
        qiuwen_page.load(Twinkle.image.callbacks.taggingImage);
        if (notify) {
          qiuwen_page.lookupCreation(Twinkle.image.callbacks.userNotification);
        } else {
          if (lognomination) {
            params.fromDI = true;
            Twinkle.speedy.callbacks.user.addToLog(params, null);
          }
          if (type !== "orphaned fair use") {
            const noteData = document.createElement("pre");
            noteData.appendChild(document.createTextNode("{{".concat("subst:", "Uploadvionotice|".concat(Morebits.pageNameNorm, "}}--~~"), "~~")));
            Morebits.status.info("提示", window.wgULS(["这些内容应贴进上传者对话页:", document.createElement("br"), noteData], ["這些內容應貼進上傳者討論頁:", document.createElement("br"), noteData]));
          }
        }
      };
      Twinkle.image.callbacks = {
        taggingImage: (pageobj) => {
          let text = pageobj.getPageText();
          const params = pageobj.getCallbackParameters();
          text = text.replace(/\{\{(mtc|(copy |move )?to ?(share|commons)|move to (qiuwen share|wikimedia commons)|copy to (qiuwen share|wikimedia commons))[^}]*\}\}/gi, "");
          if (params.type !== "orphaned fair use") {
            const qiuwen_page = new Morebits.wiki.page("Qiuwen_talk:存废讨论/文件快速删除提报", window.wgULS("加入快速删除记录项", "加入快速刪除記錄項"));
            qiuwen_page.setFollowRedirect(true);
            qiuwen_page.setCallbackParameters(params);
            qiuwen_page.load(Twinkle.image.callbacks.imageList);
          }
          let tag = "";
          switch (params.type) {
            case "orphaned fair use":
              tag = "{{".concat("subst:", "orphaned fair use}}\n");
              break;
            case "no permission":
              tag = "{{".concat("subst:", "".concat(params.templatename, "/auto|1=").concat(params.f1_source.replace(/http/g, "&#104;ttp").replace(/\n+/g, "\n").replace(/^\s*([^*])/gm, "* $1").replace(/^\* $/m, ""), "}}\n"));
              break;
            case "replaceable fair use":
              tag = "{{".concat("subst:", "".concat(params.templatename, "/auto|1=").concat(params.f4_type, "}}\n"));
              break;
            default:
              tag = "{{".concat("subst:", "".concat(params.templatename, "/auto}}\n"));
              break;
          }
          const textNoSd = text.replace(/\{\{\s*(db(-\w*)?|d|delete|(?:hang|hold)[- ]?on)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
          if (text !== textNoSd && confirm(window.wgULS("在页面上找到快速删除模板,要移除吗?", "在頁面上找到快速刪除模板,要移除嗎?"))) {
            text = textNoSd;
          }
          pageobj.setPageText(tag + text);
          let editSummary = window.wgULS("请求快速删除(", "請求快速刪除(");
          editSummary += "[[QW:CSD#".concat(params.normalized.toUpperCase(), "|CSD ").concat(params.normalized.toUpperCase(), "]]");
          editSummary += ")";
          pageobj.setEditSummary(editSummary);
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setWatchlist(Twinkle.getPref("deliWatchPage"));
          pageobj.setCreateOption("nocreate");
          pageobj.save();
        },
        userNotification: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          const initialContrib = pageobj.getCreator();
          if (initialContrib === mw.config.get("wgUserName")) {
            pageobj.getStatusElement().warn("您(".concat(initialContrib, ")").concat(window.wgULS("创建了该页,跳过通知", "建立了該頁,跳過通知")));
          } else {
            const talkPageName = "User talk:".concat(initialContrib);
            const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知上传者", "通知上傳者"), "(").concat(initialContrib, ")"));
            const notifytext = "\n{{".concat("subst:", "Di-".concat(params.templatename, "-notice|1=").concat(Morebits.pageNameNorm, "}}--~~"), "~~");
            usertalkpage.setAppendText(notifytext);
            usertalkpage.setEditSummary(window.wgULS("通知:文件[[", "通知:檔案[[") + Morebits.pageNameNorm + window.wgULS("]]快速删除提名", "]]快速刪除提名"));
            usertalkpage.setChangeTags(Twinkle.changeTags);
            usertalkpage.setCreateOption("recreate");
            usertalkpage.setWatchlist(Twinkle.getPref("deliWatchUser"));
            usertalkpage.setFollowRedirect(true, false);
            usertalkpage.append();
          }
          if (params.lognomination) {
            params.fromDI = true;
            Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
          }
        },
        imageList: (pageobj) => {
          const text = pageobj.getPageText();
          pageobj.setPageText("".concat(text, "\n* [[:").concat(Morebits.pageNameNorm, "]]--~~").concat("~~"));
          pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setCreateOption("recreate");
          pageobj.save();
        }
      };
      Twinkle.addInitCallback(Twinkle.image, "image");
    })();
  }
});
//! src/Twinkle/modules/twinkleprotect.js
var twinkleprotect_exports = {};
var init_twinkleprotect = __esm({
  "src/Twinkle/modules/twinkleprotect.js"() {
    "use strict";
    init_api();
    /*! Twinkle.js - twinkleprotect.js */
    (function twinkleprotect($) {
      const $body = $("body");
      Twinkle.protect = () => {
        if (mw.config.get("wgNamespaceNumber") < 0 || mw.config.get("wgNamespaceNumber") === 8) {
          return;
        }
        Twinkle.addPortletLink(Twinkle.protect.callback, window.wgULS("保护", "保護"), "tw-rpp", Morebits.userIsSysop ? window.wgULS("保护页面", "保護頁面") : window.wgULS("请求保护页面", "請求保護頁面"));
      };
      Twinkle.protect.callback = () => {
        const Window = new Morebits.simpleWindow(620, 530);
        Window.setTitle(Morebits.userIsSysop ? window.wgULS("施行或请求保护页面", "施行或請求保護頁面") : window.wgULS("请求保护页面", "請求保護頁面"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("保护方针", "保護方針"), "QW:PROT");
        Window.addFooterLink(window.wgULS("保护设置", "保護設定"), "H:TW/PREF#protect");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#protect");
        const form = new Morebits.quickForm(Twinkle.protect.callback.evaluate);
        const actionfield = form.append({
          type: "field",
          label: window.wgULS("操作类型", "操作類別")
        });
        if (Morebits.userIsSysop) {
          actionfield.append({
            type: "radio",
            name: "actiontype",
            event: Twinkle.protect.callback.changeAction,
            list: [{
              label: window.wgULS("保护页面", "保護頁面"),
              value: "protect",
              checked: true
            }]
          });
        }
        actionfield.append({
          type: "radio",
          name: "actiontype",
          event: Twinkle.protect.callback.changeAction,
          list: [{
            label: window.wgULS("请求保护页面", "請求保護頁面"),
            value: "request",
            tooltip: window.wgULS("若您想在QW:RFPP请求保护此页", "若您想在QW:RFPP請求保護此頁") + (Morebits.userIsSysop ? "而不是自行完成。" : "。"),
            checked: !Morebits.userIsSysop
          }, {
            label: window.wgULS("用保护模板标记此页", "用保護模板標記此頁"),
            value: "tag",
            tooltip: window.wgULS("可以用此为页面加上合适的保护模板。", "可以用此為頁面加上合適的保護模板。"),
            disabled: mw.config.get("wgArticleId") === 0 || mw.config.get("wgPageContentModel") === "Scribunto"
          }]
        });
        form.append({
          type: "field",
          label: window.wgULS("默认", "預設"),
          name: "field_preset"
        });
        form.append({
          type: "field",
          label: "1",
          name: "field1"
        });
        form.append({
          type: "field",
          label: "2",
          name: "field2"
        });
        form.append({
          type: "submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        const evt = document.createEvent("Event");
        evt.initEvent("change", true, true);
        result.actiontype[0].dispatchEvent(evt);
        Twinkle.protect.fetchProtectionLevel();
      };
      const isTemplate = mw.config.get("wgNamespaceNumber") === 10 || mw.config.get("wgNamespaceNumber") === 828;
      Twinkle.protect.currentProtectionLevels = {};
      Twinkle.protect.previousProtectionLevels = {};
      Twinkle.protect.fetchProtectionLevel = () => {
        const params = {
          format: "json",
          indexpageids: true,
          action: "query",
          list: "logevents",
          letype: "protect",
          letitle: mw.config.get("wgPageName"),
          prop: "info",
          inprop: "protection|watched",
          titles: mw.config.get("wgPageName")
        };
        void api.get(params).then((protectData) => {
          const [pageid] = protectData.query.pageids;
          const page = protectData.query.pages[pageid];
          const current = {};
          const previous = {};
          Twinkle.protect.watched = page.watchlistexpiry || page.watched === "";
          var _iterator21 = _createForOfIteratorHelper(page.protection), _step21;
          try {
            for (_iterator21.s(); !(_step21 = _iterator21.n()).done; ) {
              const protection = _step21.value;
              if (protection.type !== "aft") {
                current[protection.type] = {
                  level: protection.level,
                  expiry: protection.expiry,
                  cascade: protection.cascade === ""
                };
              }
            }
          } catch (err) {
            _iterator21.e(err);
          } finally {
            _iterator21.f();
          }
          if (protectData.query.logevents.length >= 1 && protectData.query.logevents[0].action !== "unprotect") {
            [Twinkle.protect.previousProtectionLog] = protectData.query.logevents;
          } else if (protectData.query.logevents.length >= 2) {
            [, Twinkle.protect.previousProtectionLog] = protectData.query.logevents;
          }
          if (Twinkle.protect.previousProtectionLog) {
            var _iterator22 = _createForOfIteratorHelper(Twinkle.protect.previousProtectionLog.params.details), _step22;
            try {
              for (_iterator22.s(); !(_step22 = _iterator22.n()).done; ) {
                const protection = _step22.value;
                if (protection.type !== "aft") {
                  previous[protection.type] = {
                    level: protection.level,
                    expiry: protection.expiry,
                    cascade: protection.cascade === ""
                  };
                }
              }
            } catch (err) {
              _iterator22.e(err);
            } finally {
              _iterator22.f();
            }
          }
          Twinkle.protect.hasProtectLog = !!protectData.query.logevents.length;
          Twinkle.protect.currentProtectionLevels = current;
          Twinkle.protect.previousProtectionLevels = previous;
          Twinkle.protect.callback.showLogAndCurrentProtectInfo();
        });
      };
      Twinkle.protect.callback.showLogAndCurrentProtectInfo = () => {
        const currentlyProtected = Object.keys(Twinkle.protect.currentProtectionLevels).length !== 0;
        if (Twinkle.protect.hasProtectLog || Twinkle.protect.hasStableLog) {
          const $linkMarkup = $("<span>");
          if (Twinkle.protect.hasProtectLog) {
            $linkMarkup.append($('<a rel="noopener" target="_blank" href="'.concat(mw.util.getUrl("Special:Log", {
              action: "view",
              page: mw.config.get("wgPageName"),
              type: "protect"
            }), '">').concat(window.wgULS("保护日志", "保護日誌"), "</a>")), Twinkle.protect.hasStableLog ? $("<span>").html(" &bull; ") : null);
          }
          Morebits.status.init($body.find('div[name="hasprotectlog"] span')[0]);
          Morebits.status.warn(currentlyProtected ? window.wgULS("先前保护", "先前保護") : [window.wgULS("此页面曾在", "此頁面曾在"), $("<b>".concat(new Morebits.date(Twinkle.protect.previousProtectionLog.timestamp).calendar("utc"), "</b>"))[0], "被".concat(Twinkle.protect.previousProtectionLog.user).concat(window.wgULS("保护", "保護"), ":"), ...Twinkle.protect.formatProtectionDescription(Twinkle.protect.previousProtectionLevels)], $linkMarkup[0]);
        }
        Morebits.status.init($body.find('div[name="currentprot"] span')[0]);
        let protectionNode = [];
        let statusLevel = "info";
        protectionNode = Twinkle.protect.formatProtectionDescription(Twinkle.protect.currentProtectionLevels);
        if (currentlyProtected) {
          statusLevel = "warn";
        }
        Morebits.status[statusLevel](window.wgULS("当前保护等级", "目前保護等級"), protectionNode);
      };
      Twinkle.protect.callback.changeAction = (e) => {
        let field_preset;
        let field1;
        let field2;
        switch (e.target.values) {
          case "protect":
            field_preset = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("默认", "預設"),
              name: "field_preset"
            });
            field_preset.append({
              type: "select",
              name: "category",
              label: window.wgULS("选择默认:", "選擇預設:"),
              event: Twinkle.protect.callback.changePreset,
              list: mw.config.get("wgArticleId") ? Twinkle.protect.protectionTypesAdmin : Twinkle.protect.protectionTypesCreate
            });
            field2 = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("保护选项", "保護選項"),
              name: "field2"
            });
            field2.append({
              type: "div",
              name: "currentprot",
              label: " "
            });
            field2.append({
              type: "div",
              name: "hasprotectlog",
              label: " "
            });
            if (mw.config.get("wgArticleId")) {
              field2.append({
                type: "checkbox",
                event: Twinkle.protect.formevents.editmodify,
                list: [{
                  label: window.wgULS("修改编辑权限", "修改編輯權限"),
                  name: "editmodify",
                  tooltip: window.wgULS("若此项关闭,编辑权限将不会修改。", "若此項關閉,編輯權限將不會修改。"),
                  checked: true
                }]
              });
              field2.append({
                type: "select",
                name: "editlevel",
                label: window.wgULS("编辑权限:", "編輯權限:"),
                event: Twinkle.protect.formevents.editlevel,
                list: Twinkle.protect.protectionLevels.filter(
                  // Filter TE outside of templates and modules
                  (level) => {
                    return isTemplate || level.value !== "templateeditor";
                  }
                )
              });
              field2.append({
                type: "select",
                name: "editexpiry",
                label: window.wgULS("终止时间:", "終止時間:"),
                event: (event) => {
                  if (event.target.value === "custom") {
                    Twinkle.protect.doCustomExpiry(event.target);
                  }
                  $("input[name=small]", $(event.target).closest("form"))[0].checked = event.target.selectedIndex >= 4;
                },
                // default expiry selection (2 days) is conditionally set in Twinkle.protect.callback.changePreset
                list: Twinkle.protect.protectionLengths
              });
              field2.append({
                type: "checkbox",
                event: Twinkle.protect.formevents.movemodify,
                list: [{
                  label: window.wgULS("修改移动权限", "修改移動權限"),
                  name: "movemodify",
                  tooltip: window.wgULS("若此项被关闭,移动权限将不被修改。", "若此項被關閉,移動權限將不被修改。"),
                  checked: true
                }]
              });
              field2.append({
                type: "select",
                name: "movelevel",
                label: window.wgULS("移动权限:", "移動權限:"),
                event: Twinkle.protect.formevents.movelevel,
                list: Twinkle.protect.protectionLevels.filter(
                  // Autoconfirmed is required for a move, redundant
                  (level) => {
                    return level.value !== "autoconfirmed" && (isTemplate || level.value !== "templateeditor");
                  }
                )
              });
              field2.append({
                type: "select",
                name: "moveexpiry",
                label: window.wgULS("终止时间:", "終止時間:"),
                event: (event) => {
                  if (event.target.value === "custom") {
                    Twinkle.protect.doCustomExpiry(event.target);
                  }
                },
                // default expiry selection (2 days) is conditionally set in Twinkle.protect.callback.changePreset
                list: Twinkle.protect.protectionLengths
              });
            } else {
              field2.append({
                type: "select",
                name: "createlevel",
                label: window.wgULS("创建权限:", "建立權限:"),
                event: Twinkle.protect.formevents.createlevel,
                list: Twinkle.protect.protectionLevels.filter(
                  // Filter TE always, and autoconfirmed in mainspace
                  (level) => {
                    return level.value !== "templateeditor";
                  }
                )
              });
              field2.append({
                type: "select",
                name: "createexpiry",
                label: window.wgULS("终止时间:", "終止時間:"),
                event: (event) => {
                  if (event.target.value === "custom") {
                    Twinkle.protect.doCustomExpiry(event.target);
                  }
                },
                // default expiry selection (indefinite) is conditionally set in Twinkle.protect.callback.changePreset
                list: Twinkle.protect.protectionLengths
              });
            }
            field2.append({
              type: "checkbox",
              list: [{
                name: "close",
                label: window.wgULS("标记请求保护页面中的请求", "標記請求保護頁面中的請求"),
                checked: true
              }]
            });
            field2.append({
              type: "textarea",
              name: "protectReason",
              label: window.wgULS("理由(保护日志):", "理由(保護日誌):")
            });
            if (!mw.config.get("wgArticleId") || mw.config.get("wgPageContentModel") === "Scribunto") {
              break;
            }
          case "tag":
            field1 = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("标记选项", "標記選項"),
              name: "field1"
            });
            field1.append({
              type: "div",
              name: "currentprot",
              label: " "
            });
            field1.append({
              type: "div",
              name: "hasprotectlog",
              label: " "
            });
            field1.append({
              type: "select",
              name: "tagtype",
              label: window.wgULS("选择保护模板:", "選擇保護模板:"),
              list: Twinkle.protect.protectionTags,
              event: Twinkle.protect.formevents.tagtype
            });
            field1.append({
              type: "checkbox",
              list: [{
                name: "small",
                label: window.wgULS("使用图标(small=yes)", "使用圖示(small=yes)"),
                tooltip: window.wgULS("将给模板加上|small=yes参数,显示成右上角的一把挂锁。", "將給模板加上|small=yes參數,顯示成右上角的一把掛鎖。")
              }, {
                name: "noinclude",
                label: window.wgULS("用&lt;noinclude&gt;包裹保护模板", "用&lt;noinclude&gt;包裹保護模板"),
                tooltip: window.wgULS("将保护模板包裹在&lt;noinclude&gt;中", "將保護模板包裹在&lt;noinclude&gt;中"),
                checked: mw.config.get("wgNamespaceNumber") === 10
              }, {
                name: "showexpiry",
                label: window.wgULS("在模板显示到期时间", "在模板顯示到期時間"),
                tooltip: window.wgULS("将给模板加上|expiry参数", "將給模板加上|expiry參數"),
                checked: true,
                hidden: e.target.values === "tag"
              }]
            });
            break;
          case "request":
            field_preset = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("保护类型", "保護類別"),
              name: "field_preset"
            });
            field_preset.append({
              type: "select",
              name: "category",
              label: window.wgULS("类型和理由:", "類別和理由:"),
              event: Twinkle.protect.callback.changePreset,
              list: mw.config.get("wgArticleId") ? Twinkle.protect.protectionTypes : Twinkle.protect.protectionTypesCreate
            });
            field1 = new Morebits.quickForm.element({
              type: "field",
              label: window.wgULS("选项", "選項"),
              name: "field1"
            });
            field1.append({
              type: "div",
              name: "currentprot",
              label: " "
            });
            field1.append({
              type: "div",
              name: "hasprotectlog",
              label: " "
            });
            field1.append({
              type: "select",
              name: "expiry",
              label: window.wgULS("时长:", "時長:"),
              list: [{
                label: "",
                selected: true,
                value: ""
              }, {
                label: window.wgULS("临时", "臨時"),
                value: "temporary"
              }, {
                label: "永久",
                value: "infinity"
              }]
            });
            field1.append({
              type: "textarea",
              name: "reason",
              label: "理由:"
            });
            break;
          default:
            void mw.notify(window.wgULS("这玩意儿被海豚吃掉了!", "這玩意兒被海豚吃掉了!"), {
              type: "warn",
              tag: "twinkleprotect"
            });
            break;
        }
        let oldfield;
        if (field_preset) {
          [oldfield] = $(e.target.form).find('fieldset[name="field_preset"]');
          oldfield.parentNode.replaceChild(field_preset.render(), oldfield);
        } else {
          $(e.target.form).find('fieldset[name="field_preset"]').css("display", "none");
        }
        if (field1) {
          [oldfield] = $(e.target.form).find('fieldset[name="field1"]');
          oldfield.parentNode.replaceChild(field1.render(), oldfield);
        } else {
          $(e.target.form).find('fieldset[name="field1"]').css("display", "none");
        }
        if (field2) {
          [oldfield] = $(e.target.form).find('fieldset[name="field2"]');
          oldfield.parentNode.replaceChild(field2.render(), oldfield);
        } else {
          $(e.target.form).find('fieldset[name="field2"]').css("display", "none");
        }
        if (e.target.values === "protect") {
          const evt = document.createEvent("Event");
          evt.initEvent("change", true, true);
          e.target.form.category.dispatchEvent(evt);
          $(e.target.form).find('fieldset[name="field2"] select').parent().css({
            display: "inline-block",
            marginRight: "0.5em"
          });
        }
        Twinkle.protect.callback.showLogAndCurrentProtectInfo();
      };
      Twinkle.protect.formevents = {
        editmodify: (e) => {
          e.target.form.editlevel.disabled = !e.target.checked;
          e.target.form.editexpiry.disabled = !e.target.checked || e.target.form.editlevel.value === "all";
          e.target.form.editlevel.style.color = e.target.checked ? "" : "transparent";
          e.target.form.editexpiry.style.color = e.target.checked ? "" : "transparent";
        },
        editlevel: (e) => {
          e.target.form.editexpiry.disabled = e.target.value === "all";
        },
        movemodify: (e) => {
          if (e.target.form.movelevel.disabled && !e.target.form.editlevel.disabled) {
            e.target.form.movelevel.value = e.target.form.editlevel.value;
            e.target.form.moveexpiry.value = e.target.form.editexpiry.value;
          } else if (e.target.form.editlevel.disabled) {
            e.target.form.movelevel.value = "sysop";
            e.target.form.moveexpiry.value = "infinity";
          }
          e.target.form.movelevel.disabled = !e.target.checked;
          e.target.form.moveexpiry.disabled = !e.target.checked || e.target.form.movelevel.value === "all";
          e.target.form.movelevel.style.color = e.target.checked ? "" : "transparent";
          e.target.form.moveexpiry.style.color = e.target.checked ? "" : "transparent";
        },
        movelevel: (e) => {
          e.target.form.moveexpiry.disabled = e.target.value === "all";
        },
        createlevel: (e) => {
          e.target.form.createexpiry.disabled = e.target.value === "all";
        },
        tagtype: (e) => {
          e.target.form.small.disabled = e.target.value === "none" || e.target.value === "noop";
          e.target.form.noinclude.disabled = e.target.value === "none" || e.target.value === "noop";
          e.target.form.showexpiry.disabled = e.target.value === "none" || e.target.value === "noop";
        }
      };
      Twinkle.protect.doCustomExpiry = (target) => {
        const custom = prompt(window.wgULS("输入自定义终止时间。\n您可以使用相对时间,如“1 minute”或“19 days”,或绝对时间“yyyymmddhhmm”(如“200602011405”是2006年02月01日14:05(UTC))", "輸入自訂終止時間。\n您可以使用相對時間,如「1 minute」或「19 days」,或絕對時間「yyyymmddhhmm」(如「200602011405」是2006年02月01日14:05(UTC))"), "");
        if (custom) {
          const option = document.createElement("option");
          option.setAttribute("value", custom);
          option.textContent = custom;
          target.appendChild(option);
          target.value = custom;
        } else {
          target.selectedIndex = 0;
        }
      };
      Twinkle.protect.protectionLevels = [{
        label: "全部",
        value: "all"
      }, {
        label: window.wgULS("仅允许自动确认用户", "僅允許自動確認使用者"),
        value: "autoconfirmed"
      }, {
        label: window.wgULS("仅模板编辑员和管理员", "僅模板編輯員和管理員"),
        value: "templateeditor"
      }, {
        label: window.wgULS("仅管理员", "僅管理員"),
        value: "sysop",
        selected: true
      }, {
        label: window.wgULS("仅允许资深用户", "僅允許資深用戶"),
        value: "revisionprotected"
      }, {
        label: window.wgULS("仅允许裁决委员", "僅允許裁決委員"),
        value: "officialprotected"
      }];
      Twinkle.protect.protectionLengths = [{
        label: "1天",
        value: "1 day"
      }, {
        label: "3天",
        value: "3 days"
      }, {
        label: window.wgULS("1周", "1週"),
        value: "1 week"
      }, {
        label: window.wgULS("2周", "2週"),
        value: "2 weeks"
      }, {
        label: window.wgULS("1个月", "1個月"),
        value: "1 month"
      }, {
        label: window.wgULS("3个月", "3個月"),
        value: "3 months"
      }, {
        label: window.wgULS("6个月", "6個月"),
        value: "6 months"
      }, {
        label: "1年",
        value: "1 year"
      }, {
        label: window.wgULS("无限期", "無限期"),
        value: "infinity"
      }, {
        label: window.wgULS("自定义……", "自訂……"),
        value: "custom"
      }];
      Twinkle.protect.protectionTypesAdmin = [{
        label: window.wgULS("解除保护", "解除保護"),
        value: "unprotect"
      }, {
        label: window.wgULS("全保护", "全保護"),
        list: [{
          label: window.wgULS("常规(全)", "常規(全)"),
          value: "pp-protected"
        }, {
          label: window.wgULS("争议、编辑战(全)", "爭議、編輯戰(全)"),
          value: "pp-dispute"
        }]
      }, {
        label: window.wgULS("模板保护", "模板保護"),
        list: [{
          label: window.wgULS("高风险模板(模板)", "高風險模板(模板)"),
          value: "pp-template"
        }]
      }, {
        label: window.wgULS("半保护", "半保護"),
        list: [{
          label: window.wgULS("常规(半)", "常規(半)"),
          value: "pp-semi-protected"
        }, {
          label: window.wgULS("持续破坏(半)", "持續破壞(半)"),
          value: "pp-semi-vandalism"
        }, {
          label: window.wgULS("违反生者传记方针(半)", "違反生者傳記方針(半)"),
          value: "pp-semi-blp"
        }, {
          label: window.wgULS("傀儡破坏(半)", "傀儡破壞(半)"),
          value: "pp-semi-sock"
        }, {
          label: window.wgULS("高风险模板(半)", "高風險模板(半)"),
          value: "pp-semi-template"
        }, {
          label: window.wgULS("被封禁用户滥用讨论页(半)", "被封禁使用者濫用討論頁(半)"),
          value: "pp-semi-usertalk"
        }]
      }, {
        label: window.wgULS("移动保护", "移動保護"),
        list: [{
          label: window.wgULS("常规(移动)", "常規(移動)"),
          value: "pp-move"
        }, {
          label: window.wgULS("争议、移动战(移动)", "爭議、移動戰(移動)"),
          value: "pp-move-dispute"
        }, {
          label: window.wgULS("移动破坏(移动)", "移動破壞(移動)"),
          value: "pp-move-vandalism"
        }, {
          label: window.wgULS("高风险页面(移动)", "高風險頁面(移動)"),
          value: "pp-move-indef"
        }]
      }].filter(({
        label
      }) => {
        return isTemplate || label !== "模板保护" && label !== "模板保護";
      });
      Twinkle.protect.protectionTypesCreateOnly = [{
        label: window.wgULS("白纸保护", "白紙保護"),
        list: [{
          label: window.wgULS("常规(白纸)", "常規(白紙)"),
          value: "pp-create"
        }, {
          label: window.wgULS("多次重复创建(白纸)", "多次重複建立(白紙)"),
          value: "pp-create-repeat"
        }, {
          label: window.wgULS("持续破坏(白纸)", "持續破壞(白紙)"),
          value: "pp-create-vandalism"
        }, {
          label: window.wgULS("已封禁用户的用户页(白纸)", "已封禁使用者的使用者頁(白紙)"),
          value: "pp-create-userpage"
        }]
      }];
      Twinkle.protect.protectionTypes = [...Twinkle.protect.protectionTypesAdmin, ...Twinkle.protect.protectionTypesCreateOnly];
      Twinkle.protect.protectionTypesCreate = [{
        label: "解除保护",
        value: "unprotect"
      }, ...Twinkle.protect.protectionTypesCreateOnly];
      Twinkle.protect.protectionPresetsInfo = {
        "pp-protected": {
          edit: "sysop",
          move: "sysop",
          reason: null
        },
        "pp-dispute": {
          edit: "sysop",
          move: "sysop",
          reason: window.wgULS("编辑战", "編輯戰")
        },
        "pp-template": {
          edit: "templateeditor",
          move: "templateeditor",
          expiry: "infinity",
          reason: window.wgULS("[[QW:HRT|高风险模板]]", "[[QW:HRT|高風險模板]]"),
          template: "noop"
        },
        "pp-vandalism": {
          edit: "sysop",
          move: "sysop",
          reason: window.wgULS("被自动确认用户破坏", "被自動確認使用者破壞")
        },
        "pp-sock": {
          edit: "sysop",
          move: "sysop",
          reason: window.wgULS("持续的傀儡破坏", "持續的傀儡破壞")
        },
        "pp-semi-vandalism": {
          edit: "autoconfirmed",
          reason: window.wgULS("被新用户破坏", "被新使用者破壞"),
          template: "pp-vandalism"
        },
        "pp-semi-blp": {
          edit: "autoconfirmed",
          reason: window.wgULS("新用户违反生者传记方针", "新使用者違反生者傳記方針")
        },
        "pp-semi-usertalk": {
          edit: "autoconfirmed",
          reason: window.wgULS("被封禁用户滥用其讨论页", "被封禁使用者濫用其討論頁")
        },
        "pp-semi-template": {
          // removed for now
          edit: "autoconfirmed",
          expiry: "infinity",
          reason: window.wgULS("[[QW:HRT|高风险模板]]", "[[QW:HRT|高風險模板]]"),
          template: "noop"
        },
        "pp-semi-sock": {
          edit: "autoconfirmed",
          reason: window.wgULS("持续的傀儡破坏", "持續的傀儡破壞"),
          template: "pp-sock"
        },
        "pp-semi-protected": {
          edit: "autoconfirmed",
          reason: null,
          template: "pp-protected"
        },
        "pp-move": {
          move: "sysop",
          reason: null
        },
        "pp-move-dispute": {
          move: "sysop",
          reason: window.wgULS("页面移动战", "頁面移動戰")
        },
        "pp-move-vandalism": {
          move: "sysop",
          reason: window.wgULS("移动破坏", "移動破壞")
        },
        "pp-move-indef": {
          move: "sysop",
          expiry: "infinity",
          reason: window.wgULS("高风险页面", "高風險頁面")
        },
        unprotect: {
          edit: "all",
          move: "all",
          create: "all",
          reason: null,
          template: "none"
        },
        "pp-create": {
          create: "autoconfirmed",
          reason: null
        },
        "pp-create-repeat": {
          create: "autoconfirmed",
          reason: window.wgULS("多次重复创建", "多次重複建立")
        },
        "pp-create-vandalism": {
          create: "autoconfirmed",
          reason: window.wgULS("被新用户破坏", "被新使用者破壞")
        },
        "pp-create-userpage": {
          create: "sysop",
          expiry: "infinity",
          reason: window.wgULS("被永久封禁的用户页", "被永久封禁的使用者頁面")
        }
      };
      Twinkle.protect.protectionTags = [{
        label: window.wgULS("无(移除现有模板)", "無(移除現有模板)"),
        value: "none"
      }, {
        label: window.wgULS("无(不移除现有模板)", "無(不移除現有模板)"),
        value: "noop"
      }, {
        label: "通用模板",
        list: [{
          label: "{{pp-dispute}}: ".concat(window.wgULS("争议", "爭議")),
          value: "pp-dispute"
        }, {
          label: "{{pp-vandalism}}: ".concat(window.wgULS("破坏", "破壞")),
          value: "pp-vandalism",
          selected: true
        }, {
          label: "{{pp-sock}}: 傀儡",
          value: "pp-sock"
        }, {
          label: "{{pp-template}}: ".concat(window.wgULS("高风险模板", "高風險模板")),
          value: "pp-template"
        }, {
          label: "{{pp-protected}}: ".concat(window.wgULS("常规", "常規")),
          value: "pp-protected"
        }]
      }, {
        label: window.wgULS("半保护模板", "半保護模板"),
        list: [{
          label: "{{pp-semi-usertalk}}: ".concat(window.wgULS("封禁的用户", "封禁的使用者")),
          value: "pp-semi-usertalk"
        }, {
          label: "{{pp-semi-blp}}: ".concat(window.wgULS("生者传记", "生者傳記")),
          value: "pp-semi-blp"
        }, {
          label: "{{pp-semi-indef}}: ".concat(window.wgULS("长期", "長期")),
          value: "pp-semi-indef"
        }]
      }, {
        label: window.wgULS("移动保护模板", "移動保護模板"),
        list: [{
          label: "{{pp-move-dispute}}: ".concat(window.wgULS("争议", "爭議")),
          value: "pp-move-dispute"
        }, {
          label: "{{pp-move-vandalism}}: ".concat(window.wgULS("破坏", "破壞")),
          value: "pp-move-vandalism"
        }, {
          label: "{{pp-move-indef}}: ".concat(window.wgULS("长期", "長期")),
          value: "pp-move-indef"
        }, {
          label: "{{pp-move}}: ".concat(window.wgULS("常规", "常規")),
          value: "pp-move"
        }]
      }];
      Twinkle.protect.callback.changePreset = (e) => {
        const {
          form
        } = e.target;
        const actiontypes = form.actiontype;
        let actiontype;
        var _iterator23 = _createForOfIteratorHelper(actiontypes), _step23;
        try {
          for (_iterator23.s(); !(_step23 = _iterator23.n()).done; ) {
            const action_type_value = _step23.value;
            if (!action_type_value.checked) {
              continue;
            }
            actiontype = action_type_value.values;
            break;
          }
        } catch (err) {
          _iterator23.e(err);
        } finally {
          _iterator23.f();
        }
        if (actiontype === "protect") {
          const item = Twinkle.protect.protectionPresetsInfo[form.category.value];
          if (mw.config.get("wgArticleId")) {
            if (item.edit) {
              form.editmodify.checked = true;
              Twinkle.protect.formevents.editmodify({
                target: form.editmodify
              });
              form.editlevel.value = item.edit;
              Twinkle.protect.formevents.editlevel({
                target: form.editlevel
              });
            } else {
              form.editmodify.checked = false;
              Twinkle.protect.formevents.editmodify({
                target: form.editmodify
              });
            }
            if (item.move) {
              form.movemodify.checked = true;
              Twinkle.protect.formevents.movemodify({
                target: form.movemodify
              });
              form.movelevel.value = item.move;
              Twinkle.protect.formevents.movelevel({
                target: form.movelevel
              });
            } else {
              form.movemodify.checked = false;
              Twinkle.protect.formevents.movemodify({
                target: form.movemodify
              });
            }
            form.editexpiry.value = item.expiry || "1 week";
            form.moveexpiry.value = item.expiry || "1 week";
          } else {
            if (item.create) {
              form.createlevel.value = item.create;
              Twinkle.protect.formevents.createlevel({
                target: form.createlevel
              });
              form.createexpiry.value = item.createexpiry || "1 week";
            }
            form.createexpiry.value = item.expiry || "1 week";
          }
          const reasonField = actiontype === "protect" ? form.protectReason : form.reason;
          if (item.reason) {
            reasonField.value = item.reason;
          } else {
            reasonField.value = "";
          }
          if (mw.config.get("wgArticleId") && mw.config.get("wgPageContentModel") !== "Scribunto") {
            if (form.category.value === "unprotect") {
              form.tagtype.value = "none";
            } else {
              var _item$template;
              form.tagtype.value = (_item$template = item.template) !== null && _item$template !== void 0 ? _item$template : form.category.value;
            }
            Twinkle.protect.formevents.tagtype({
              target: form.tagtype
            });
            if (/template/.test(form.category.value)) {
              form.noinclude.checked = true;
            } else if (mw.config.get("wgNamespaceNumber") !== 10) {
              form.noinclude.checked = false;
            }
          }
        } else if (form.category.value === "unprotect") {
          form.expiry.value = "";
          form.expiry.disabled = true;
        } else {
          form.expiry.value = "";
          form.expiry.disabled = false;
        }
      };
      Twinkle.protect.callback.evaluate = (e) => {
        const form = e.target;
        const input = Morebits.quickForm.getInputData(form);
        let tagparams;
        if (input.actiontype === "tag" || input.actiontype === "protect" && mw.config.get("wgArticleId") && mw.config.get("wgPageContentModel") !== "Scribunto") {
          tagparams = {
            tag: input.tagtype,
            reason: (input.tagtype === "pp-protected" || input.tagtype === "pp-semi-protected" || input.tagtype === "pp-move") && input.protectReason ? input.protectReason : null,
            showexpiry: input.actiontype === "protect" ? input.showexpiry : null,
            small: input.small,
            noinclude: input.noinclude
          };
          if (input.actiontype === "protect") {
            if (input.editmodify) {
              tagparams.expiry = input.editexpiry;
            } else if (input.movemodify) {
              tagparams.expiry = input.moveexpiry;
            }
          }
        }
        const closeparams = {};
        if (input.close) {
          if (input.category === "unprotect") {
            closeparams.type = "unprotect";
          } else if (mw.config.get("wgArticleId")) {
            if (input.editmodify) {
              switch (input.editlevel) {
                case "officialprotected":
                  closeparams.type = "officialprotected";
                  closeparams.expiry = input.editexpiry;
                  break;
                case "revisionprotected":
                  closeparams.type = "revisionprotected";
                  closeparams.expiry = input.editexpiry;
                  break;
                case "sysop":
                  closeparams.type = "full";
                  closeparams.expiry = input.editexpiry;
                  break;
                case "templateeditor":
                  closeparams.type = "temp";
                  closeparams.expiry = input.editexpiry;
                  break;
                case "autoconfirmed":
                  closeparams.type = "semi";
                  closeparams.expiry = input.editexpiry;
                  break;
              }
            } else if (input.movemodify && ["officialprotected", "revisionprotected", "sysop", "templateeditor"].includes(input.movelevel)) {
              closeparams.type = "move";
              closeparams.expiry = input.moveexpiry;
            }
          } else if (input.createlevel !== "all") {
            closeparams.type = "salt";
            closeparams.expiry = input.createexpiry;
          }
        }
        switch (input.actiontype) {
          case "protect": {
            Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
            Morebits.wiki.actionCompleted.notice = window.wgULS("保护完成", "保護完成");
            let statusInited = false;
            let thispage;
            const allDone = () => {
              if (thispage) {
                thispage.getStatusElement().info("完成");
              }
              if (tagparams) {
                Twinkle.protect.callbacks.taggingPageInitial(tagparams);
              }
              if (closeparams && closeparams.type) {
                const rppPage = new Morebits.wiki.page("Qiuwen_talk:页面保护请求", window.wgULS("关闭请求", "關閉請求"));
                rppPage.setFollowRedirect(true);
                rppPage.setCallbackParameters(closeparams);
                rppPage.load(Twinkle.protect.callbacks.closeRequest);
              }
            };
            const protectIt = (next) => {
              thispage = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("保护页面", "保護頁面"));
              if (mw.config.get("wgArticleId")) {
                if (input.editmodify) {
                  thispage.setEditProtection(input.editlevel, input.editexpiry);
                }
                if (input.movemodify) {
                  if (input.movelevel) {
                    thispage.setMoveProtection(input.movelevel, input.moveexpiry);
                  } else {
                    void mw.notify(window.wgULS("您需要选择保护层级!", "您需要選擇保護層級!"), {
                      type: "warn",
                      tag: "twinkleprotect"
                    });
                    return;
                  }
                }
                thispage.setWatchlist(Twinkle.getPref("watchProtectedPages"));
              } else {
                thispage.setCreateProtection(input.createlevel, input.createexpiry);
                thispage.setWatchlist(false);
              }
              if (input.protectReason) {
                thispage.setEditSummary(input.protectReason);
                thispage.setChangeTags(Twinkle.changeTags);
              } else {
                void mw.notify(window.wgULS("您必须输入保护理由,这将被记录在保护日志中。", "您必須輸入保護理由,這將被記錄在保護日誌中。"), {
                  type: "warn",
                  tag: "twinkleprotect"
                });
                return;
              }
              if (!statusInited) {
                Morebits.simpleWindow.setButtonsEnabled(false);
                Morebits.status.init(form);
                statusInited = true;
              }
              thispage.setChangeTags(Twinkle.changeTags);
              thispage.protect(next);
            };
            if (input.editmodify || input.movemodify || !mw.config.get("wgArticleId")) {
              protectIt(allDone);
            } else {
              void mw.notify(window.wgULS("请告诉Twinkle要做什么!\n若您只是想标记该页,请选择上面的“用保护模板标记此页”选项。", "請告訴Twinkle要做什麼!\n若您只是想標記該頁,請選擇上面的「用保護模板標記此頁」選項。"), {
                type: "warn",
                tag: "twinkleprotect"
              });
            }
            break;
          }
          case "tag":
            Morebits.simpleWindow.setButtonsEnabled(false);
            Morebits.status.init(form);
            Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
            Morebits.wiki.actionCompleted.followRedirect = false;
            Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成", "標記完成");
            Twinkle.protect.callbacks.taggingPageInitial(tagparams);
            break;
          case "request": {
            let typename;
            let typereason;
            switch (input.category) {
              case "pp-dispute":
              case "pp-protected":
                typename = window.wgULS("全保护", "全保護");
                break;
              case "pp-template":
                typename = window.wgULS("模板保护", "模板保護");
                break;
              case "pp-vandalism":
              case "pp-semi-disruptive":
              case "pp-semi-unsourced":
              case "pp-semi-vandalism":
              case "pp-semi-usertalk":
              case "pp-semi-template":
              case "pp-semi-sock":
              case "pp-semi-blp":
              case "pp-semi-protected":
                typename = window.wgULS("半保护", "半保護");
                break;
              case "pp-move":
              case "pp-move-dispute":
              case "pp-move-indef":
              case "pp-move-vandalism":
                typename = window.wgULS("移动保护", "移動保護");
                break;
              case "pp-create":
              case "pp-create-offensive":
              case "pp-create-blp":
              case "pp-create-salt":
              case "pp-create-userpage":
              case "pp-create-repeat":
              case "pp-create-vandalism":
                typename = window.wgULS("白纸保护", "白紙保護");
                break;
              default:
                typename = window.wgULS("解除保护", "解除保護");
                break;
            }
            switch (input.category) {
              case "pp-dispute":
                typereason = window.wgULS("争议、编辑战", "爭議、編輯戰");
                break;
              case "pp-vandalism":
              case "pp-semi-vandalism":
              case "pp-create-vandalism":
                typereason = window.wgULS("持续破坏", "持續破壞");
                break;
              case "pp-template":
              case "pp-semi-template":
                typereason = window.wgULS("高风险模板", "高風險模板");
                break;
              case "pp-create-userpage":
                typereason = window.wgULS("被永久封禁的用户页", "被永久封鎖的使用者頁面");
                break;
              case "pp-semi-usertalk":
                typereason = window.wgULS("已封禁用户的讨论页", "已封鎖使用者的討論頁");
                break;
              case "pp-semi-sock":
                typereason = window.wgULS("傀儡破坏", "傀儡破壞");
                break;
              case "pp-semi-blp":
                typereason = window.wgULS("违反生者传记方针", "違反生者傳記方針");
                break;
              case "pp-move-dispute":
                typereason = window.wgULS("争议、移动战", "爭議、移動戰");
                break;
              case "pp-move-vandalism":
                typereason = window.wgULS("移动破坏", "移動破壞");
                break;
              case "pp-move-indef":
                typereason = window.wgULS("高风险页面", "高風險頁面");
                break;
              case "pp-create-repeat":
                typereason = window.wgULS("多次重复创建", "多次重複建立");
                break;
              default:
                typereason = "";
                break;
            }
            let reason = typereason;
            if (input.reason !== "") {
              if (typereason !== "") {
                reason += ":";
              }
              reason += input.reason;
            }
            if (reason !== "") {
              reason = Morebits.string.appendPunctuation(reason);
            }
            const rppparams = {
              reason,
              typename,
              category: input.category,
              expiry: input.expiry
            };
            Morebits.simpleWindow.setButtonsEnabled(false);
            Morebits.status.init(form);
            const rppName = "Qiuwen_talk:页面保护请求";
            Morebits.wiki.actionCompleted.redirect = rppName;
            Morebits.wiki.actionCompleted.notice = window.wgULS("提名完成,重定向到讨论页", "提名完成,重新導向到討論頁");
            const rppPage = new Morebits.wiki.page(rppName, window.wgULS("请求保护页面", "請求保護頁面"));
            rppPage.setFollowRedirect(true);
            rppPage.setCallbackParameters(rppparams);
            rppPage.load(Twinkle.protect.callbacks.fileRequest);
            break;
          }
          default:
            void mw.notify("twinkleprotect: 未知操作类型", {
              type: "warn",
              tag: "twinkleprotect"
            });
            break;
        }
      };
      Twinkle.protect.callbacks = {
        taggingPageInitial: (tagparams) => {
          if (tagparams.tag === "noop") {
            Morebits.status.info(window.wgULS("应用保护模板", "應用保護模板"), window.wgULS("没什么要做的", "沒什麼要做的"));
            return;
          }
          const pageName = mw.config.get("wgPageName");
          const protectedPage = new Morebits.wiki.page(pageName, window.wgULS("标记页面", "標記頁面"));
          protectedPage.setCallbackParameters(tagparams);
          protectedPage.load(Twinkle.protect.callbacks.taggingPage);
        },
        getTaggedPage: (params, text) => {
          let tag;
          let summary;
          const oldtag_re = /(?:<noinclude>)?[ \t]*\{\{\s*(pp-[^{}]*?|protected|(?:t|v|s|p-|usertalk-v|usertalk-s|sb|move)protected(?:2)?|protected template|privacy protection)\s*?\}\}\s*(?:<\/noinclude>)?\s*/gi;
          const re_result = oldtag_re.exec(text);
          if (re_result && (params.tag === "none" || confirm(window.wgULS("在页面上找到{{", "在頁面上找到{{") + re_result[1] + window.wgULS("}}\n单击确定以移除,或单击取消以取消操作。", "}}\n點擊確定以移除,或點擊取消以取消操作。")))) {
            text = text.replace(oldtag_re, "");
          }
          if (params.tag === "none") {
            summary = window.wgULS("移除保护模板", "移除保護模板");
          } else {
            ({
              tag
            } = params);
            if (params.reason) {
              tag += "|reason=".concat(params.reason);
            }
            if (params.showexpiry && params.expiry && !Morebits.string.isInfinity(params.expiry)) {
              tag += "|expiry={{".concat("subst:", "#time:c|".concat(params.expiry, "}}"));
            }
            if (params.small) {
              tag += "|small=yes";
            }
            if (/^\s*#(?:redirect|重定向|重新導向)/i.test(text)) {
              if (text.match(/{{(?:Redirect[ _]category shell|Rcat[ _]shell|This[ _]is a redirect|多种类型重定向|多種類型重定向|多種類型重新導向|多种类型重新导向|R0|其他重定向|RCS|Redirect[ _]shell)/i)) {
                Morebits.status.info("已存在Redirect category shell", window.wgULS("没什么可做的", "沒什麼可做的"));
                return;
              }
              text = text.replace(/#(?:redirect|重定向|重新導向) ?(\[\[.*?\]\])(.*)/i, "#REDIRECT $1$2\n\n{{".concat(tag, "}}"));
            } else {
              if (params.noinclude) {
                tag = "<noinclude>{{".concat(tag, "}}</noinclude>");
                if (text.indexOf("{|") === 0) {
                  tag += "\n";
                }
              } else {
                tag = "{{".concat(tag, "}}\n");
              }
              const qiuwen_page = new Morebits.wikitext.page(text);
              text = qiuwen_page.insertAfterTemplates(tag, Twinkle.hatnoteRegex).getText();
            }
            summary = "加入{{".concat(params.tag, "}}");
          }
          return {
            text,
            summary
          };
        },
        taggingPage: (protectedPage) => {
          const params = protectedPage.getCallbackParameters();
          const text = protectedPage.getPageText();
          const newVersion = Twinkle.protect.callbacks.getTaggedPage(params, text);
          if (newVersion === void 0) {
            protectedPage.getStatusElement().info("完成");
            return;
          }
          protectedPage.setEditSummary(newVersion.summary);
          protectedPage.setChangeTags(Twinkle.changeTags);
          protectedPage.setWatchlist(Twinkle.getPref("watchPPTaggedPages"));
          protectedPage.setPageText(newVersion.text);
          protectedPage.setCreateOption("nocreate");
          protectedPage.suppressProtectWarning();
          protectedPage.save();
        },
        fileRequest: (rppPage) => {
          const params = rppPage.getCallbackParameters();
          let text = rppPage.getPageText();
          const statusElement = rppPage.getStatusElement();
          const rppRe = new RegExp("===\\s*(\\[\\[)?\\s*:?\\s*".concat(Morebits.string.escapeRegExp(Morebits.pageNameNorm), "\\s*(\\]\\])?\\s*==="), "m");
          const tag = rppRe.exec(text);
          const rppLink = document.createElement("a");
          rppLink.setAttribute("href", mw.util.getUrl(rppPage.getPageName()));
          rppLink.appendChild(document.createTextNode(rppPage.getPageName()));
          if (tag) {
            statusElement.error([rppLink, window.wgULS("已有对此页面的保护提名,取消操作。", "已有對此頁面的保護提名,取消操作。")]);
            return;
          }
          let newtag = "=== [[:".concat(Morebits.pageNameNorm, "]] ===\n");
          if (new RegExp("^".concat(mw.util.escapeRegExp(newtag).replace(/\s+/g, "\\s*")), "m").test(text)) {
            statusElement.error([rppLink, window.wgULS("已有对此页面的保护提名,取消操作。", "已有對此頁面的保護提名,取消操作。")]);
            return;
          }
          let words;
          switch (params.expiry) {
            case "temporary":
              words = window.wgULS("临时", "臨時");
              break;
            case "infinity":
              words = "永久";
              break;
            default:
              words = "";
              break;
          }
          words += params.typename;
          newtag += '* <span style="font-size: 90%">'.concat(window.wgULS("当前保护状态", "目前保護狀態"), ":{{protection status|").concat(/[=]/.test(Morebits.pageNameNorm) ? "1=" : "").concat(Morebits.pageNameNorm, "}}</span>\n");
          newtag += "".concat(window.wgULS("请求", "請求") + Morebits.string.toUpperCaseFirstChar(words) + (params.reason === "" ? "。" : ":".concat(Morebits.string.formatReasonText(params.reason))), "--~~").concat("~~");
          let reg;
          if (params.category === "unprotect") {
            reg = /(==\s*请求解除保护\s*==)/;
          } else {
            reg = /({{\s*\/header\s*}})/;
          }
          const originalTextLength = text.length;
          text = text.replace(reg, "$1\n".concat(newtag, "\n"));
          if (text.length === originalTextLength) {
            const linknode = document.createElement("a");
            linknode.setAttribute("href", mw.util.getUrl("Help:Twinkle/修复RFPP"));
            linknode.appendChild(document.createTextNode(window.wgULS("如何修复RFPP", "如何修復RFPP")));
            statusElement.error([window.wgULS("无法在QW:RFPP上找到相关定位点标记,要修复此问题,请参见", "無法在QW:RFPP上找到相關定位點標記,要修復此問題,請參見"), linknode, "。"]);
            return;
          }
          statusElement.status("加入新提名…");
          rppPage.setEditSummary("/* ".concat(Morebits.pageNameNorm, " */ ").concat(window.wgULS("请求对", "請求對"), "[[").concat(Morebits.pageNameNorm, "]]").concat(params.typename));
          rppPage.setChangeTags(Twinkle.changeTags);
          rppPage.setPageText(text);
          rppPage.setCreateOption("recreate");
          rppPage.save(() => {
            const watchPref = Twinkle.getPref("watchRequestedPages");
            const watch = watchPref !== "no" && (watchPref !== "default" || !!Number.parseInt(mw.user.options.get("watchdefault"), 10));
            if (watch) {
              const watch_query = {
                action: "watch",
                titles: mw.config.get("wgPageName"),
                token: mw.user.tokens.get("watchToken")
              };
              if (Twinkle.protect.watched !== true && watchPref !== "default" && watchPref !== "yes") {
                watch_query.expiry = watchPref;
              }
              new Morebits.wiki.api(window.wgULS("将请求保护的页面加入到监视列表", "將請求保護的頁面加入到監視清單"), watch_query).post();
            }
          });
        },
        closeRequest: (rppPage) => {
          const params = rppPage.getCallbackParameters();
          let text = rppPage.getPageText();
          const statusElement = rppPage.getStatusElement();
          const sections = text.split(/(?=\n==\s*请求解除保护\s*==)/);
          if (sections.length !== 2) {
            const linknode2 = document.createElement("a");
            linknode2.setAttribute("href", mw.util.getUrl("Help:Twinkle/修复RFPP"));
            linknode2.appendChild(document.createTextNode("如何修复RFPP"));
            statusElement.error([window.wgULS("无法在QW:RFPP上找到相关定位点标记,要修复此问题,请参见", "無法在QW:RFPP上找到相關定位點標記,要修復此問題,請參見"), linknode2, "。"]);
            return;
          }
          let sectionText;
          let expiryText = "";
          if (params.type === "unprotect") {
            [, sectionText] = sections;
          } else {
            [sectionText] = sections;
            expiryText = Morebits.string.formatTime(params.expiry);
          }
          const requestList = sectionText.split(/(?=\n===.+===\s*\n)/);
          let found = false;
          const rppRe = new RegExp("===\\s*(\\[\\[)?\\s*:?\\s*".concat(Morebits.pageNameRegex(Morebits.pageNameNorm), "\\s*(\\]\\])?\\s*==="), "m");
          var _iterator24 = _createForOfIteratorHelper(requestList), _step24;
          try {
            for (_iterator24.s(); !(_step24 = _iterator24.n()).done; ) {
              let request = _step24.value;
              if (rppRe.exec(request)) {
                request = request.trimEnd();
                if (params.type === "unprotect") {
                  request += "\n: {{RFPP|isun}}。--~~".concat("~~\n");
                } else {
                  request += "\n: {{RFPP|".concat(params.type, "|").concat(Morebits.string.isInfinity(params.expiry) ? "infinity" : expiryText, "}}。--~~").concat("~~\n");
                }
                found = true;
                break;
              }
            }
          } catch (err) {
            _iterator24.e(err);
          } finally {
            _iterator24.f();
          }
          if (!found) {
            statusElement.warn(window.wgULS("没有找到相关的请求", "沒有找到相關的請求"));
            return;
          }
          if (params.type === "unprotect") {
            text = sections[0] + requestList.join("");
          } else {
            text = requestList.join("") + sections[1];
          }
          let summary = "";
          if (params.type === "unprotect") {
            [, sectionText] = sections;
          } else {
            [sectionText] = sections;
          }
          switch (params.type) {
            case "semi":
              summary = window.wgULS("半保护", "半保護");
              break;
            case "temp":
              summary = window.wgULS("模板保护", "模板保護");
              break;
            case "ecp":
              summary = window.wgULS("延伸确认保护", "延伸確認保護");
              break;
            case "full":
              summary = window.wgULS("全保护", "全保護");
              break;
            case "revisionprotected":
              summary = window.wgULS("版本保护", "版本保護");
              break;
            case "officialprotected":
              summary = window.wgULS("裁委会保护", "裁委會保護");
              break;
            case "move":
              summary = window.wgULS("移动保护", "移動保護");
              break;
            case "salt":
              summary = window.wgULS("白纸保护", "白紙保護");
              break;
            case "unprotect":
              summary = window.wgULS("解除保护", "解除保護");
              break;
            default:
              statusElement.warn(window.wgULS("未知保护类型", "未知保護類別"));
              return;
          }
          if (Morebits.string.isInfinity(params.expiry)) {
            summary = expiryText + summary;
          } else {
            summary += expiryText;
          }
          rppPage.setEditSummary("/* ".concat(Morebits.pageNameNorm, " */ ").concat(summary));
          rppPage.setChangeTags(Twinkle.changeTags);
          rppPage.setPageText(text);
          rppPage.save();
        }
      };
      Twinkle.protect.formatProtectionDescription = (protectionLevels) => {
        const protectionNode = [];
        if (Object.keys(protectionLevels).length === 0) {
          [protectionNode[protectionNode.length]] = $("<b>").text(window.wgULS("无保护", "無保護"));
        } else {
          for (var _i8 = 0, _Object$entries5 = Object.entries(protectionLevels); _i8 < _Object$entries5.length; _i8++) {
            const [type, settings] = _Object$entries5[_i8];
            let label;
            switch (type) {
              case "edit":
                label = window.wgULS("编辑", "編輯");
                break;
              case "move":
                label = window.wgULS("移动", "移動");
                break;
              case "create":
                label = window.wgULS("创建", "建立");
                break;
              case "upload":
                label = window.wgULS("上传", "上傳");
                break;
              default:
                label = type;
                break;
            }
            let level;
            switch (settings.level) {
              case "officialprotected":
                level = window.wgULS("仅允许裁决委员", "僅允許裁決委員");
                break;
              case "revisionprotected":
                level = window.wgULS("仅允许资深用户", "僅允許資深用戶");
                break;
              case "autoconfirmed":
                level = window.wgULS("仅允许自动确认用户", "僅允許自動確認使用者");
                break;
              case "templateeditor":
                level = window.wgULS("仅模板编辑员和管理员", "僅模板編輯員和管理員");
                break;
              case "sysop":
                level = window.wgULS("仅管理员", "僅管理員");
                break;
              default:
                ({
                  level
                } = settings);
                break;
            }
            [protectionNode[protectionNode.length]] = $("<b>").text("".concat(label, ":").concat(level));
            if (Morebits.string.isInfinity(settings.expiry)) {
              protectionNode[protectionNode.length] = window.wgULS("(无限期)", "(無限期)");
            } else {
              protectionNode[protectionNode.length] = "".concat(window.wgULS("(过期:", "(過期:") + new Morebits.date(settings.expiry).calendar("utc"), ")");
            }
            if (settings.cascade) {
              protectionNode[protectionNode.length] = window.wgULS("(连锁)", "(連鎖)");
            }
          }
        }
        return protectionNode;
      };
      Twinkle.addInitCallback(Twinkle.protect, "protect");
    })(jQuery);
  }
});
//! src/Twinkle/modules/friendlytag.js
var friendlytag_exports = {};
var init_friendlytag = __esm({
  "src/Twinkle/modules/friendlytag.js"() {
    "use strict";
    /*! Twinkle.js - friendlytag.js */
    (function friendlytag($) {
      const $body = $("body");
      Twinkle.tag = () => {
        if (Morebits.isPageRedirect()) {
          Twinkle.tag.mode = window.wgULS("重定向", "重新導向");
          Twinkle.tag.modeEn = "redirect";
          Twinkle.addPortletLink(Twinkle.tag.callback, window.wgULS("标记", "標記"), "friendly-tag", window.wgULS("标记重定向", "標記重新導向"));
        } else if (mw.config.get("wgNamespaceNumber") === 6 && !document.querySelector("#mw-sharedupload") && document.querySelector("#mw-imagepage-section-filehistory")) {
          Twinkle.tag.mode = window.wgULS("文件", "檔案");
          Twinkle.tag.modeEn = "file";
          Twinkle.addPortletLink(Twinkle.tag.callback, window.wgULS("标记", "標記"), "friendly-tag", window.wgULS("标记文件", "標記檔案"));
        } else if ([0, 118].includes(mw.config.get("wgNamespaceNumber")) && mw.config.get("wgCurRevisionId") || Morebits.pageNameNorm === Twinkle.getPref("sandboxPage")) {
          Twinkle.tag.mode = window.wgULS("条目", "條目");
          Twinkle.tag.modeEn = "article";
          Twinkle.tag.canRemove = mw.config.get("wgCurRevisionId") === mw.config.get("wgRevisionId") && // Disabled on latest diff because the diff slider could be used to slide
          // away from the latest diff without causing the script to reload
          !mw.config.get("wgDiffNewId");
          Twinkle.addPortletLink(Twinkle.tag.callback, window.wgULS("标记", "標記"), "friendly-tag", window.wgULS("标记条目", "標記條目"));
        }
      };
      Twinkle.tag.checkedTags = [];
      Twinkle.tag.callback = () => {
        const Window = new Morebits.simpleWindow(630, Twinkle.tag.modeEn === "article" ? 500 : 400);
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("标记设置", "標記設定"), "H:TW/PREF#tag");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#tag");
        const form = new Morebits.quickForm(Twinkle.tag.callback.evaluate);
        form.append({
          type: "input",
          label: window.wgULS("筛选标记列表:", "篩選標記列表:"),
          name: "quickfilter",
          size: "30",
          event: function event() {
            $allCheckboxDivs.find(".search-hit").each((_i, e) => {
              const label_element = e.parentElement;
              label_element.innerHTML = label_element.textContent;
            });
            if (this.value) {
              $allCheckboxDivs.hide();
              $allHeaders.hide();
              const searchString = this.value;
              const searchRegex = new RegExp(mw.util.escapeRegExp(searchString), "i");
              $allCheckboxDivs.find("label").each((_index, element) => {
                const label_text = element.textContent;
                const searchHit = searchRegex.exec(label_text);
                if (searchHit) {
                  const range = document.createRange();
                  const [textnode] = element.childNodes;
                  range.selectNodeContents(textnode);
                  range.setStart(textnode, searchHit.index);
                  range.setEnd(textnode, searchHit.index + searchString.length);
                  const [underline_span] = $("<span>").addClass("search-hit").css("text-decoration", "underline");
                  range.surroundContents(underline_span);
                  element.parentElement.style.display = "block";
                }
              });
            } else {
              $allCheckboxDivs.show();
              $allHeaders.show();
            }
          }
        });
        switch (Twinkle.tag.modeEn) {
          case "article":
            Window.setTitle(window.wgULS("条目维护标记", "條目維護標記"));
            Twinkle.tag.article.flatObject = {};
            var _iterator25 = _createForOfIteratorHelper(Twinkle.tag.article.tagList), _step25;
            try {
              for (_iterator25.s(); !(_step25 = _iterator25.n()).done; ) {
                const group = _step25.value;
                var _iterator26 = _createForOfIteratorHelper(group.value), _step26;
                try {
                  for (_iterator26.s(); !(_step26 = _iterator26.n()).done; ) {
                    const subgroup = _step26.value;
                    if (subgroup.value) {
                      var _iterator27 = _createForOfIteratorHelper(subgroup.value), _step27;
                      try {
                        for (_iterator27.s(); !(_step27 = _iterator27.n()).done; ) {
                          const item = _step27.value;
                          Twinkle.tag.article.flatObject[item.tag] = {
                            description: item.description,
                            excludeMI: !!item.excludeMI
                          };
                        }
                      } catch (err) {
                        _iterator27.e(err);
                      } finally {
                        _iterator27.f();
                      }
                    } else {
                      Twinkle.tag.article.flatObject[subgroup.tag] = {
                        description: subgroup.description,
                        excludeMI: !!subgroup.excludeMI
                      };
                    }
                  }
                } catch (err) {
                  _iterator26.e(err);
                } finally {
                  _iterator26.f();
                }
              }
            } catch (err) {
              _iterator25.e(err);
            } finally {
              _iterator25.f();
            }
            form.append({
              type: "select",
              name: "sortorder",
              label: window.wgULS("查看列表:", "檢視列表:"),
              tooltip: window.wgULS("您可以在Twinkle参数设置(H:TW/PREF)中更改此项。", "您可以在Twinkle偏好設定(H:TW/PREF)中更改此項。"),
              event: Twinkle.tag.updateSortOrder,
              list: [{
                type: "option",
                value: "cat",
                label: window.wgULS("按类型", "按類別"),
                selected: Twinkle.getPref("tagArticleSortOrder") === "cat"
              }, {
                type: "option",
                value: "alpha",
                label: "按字母",
                selected: Twinkle.getPref("tagArticleSortOrder") === "alpha"
              }]
            });
            if (!Twinkle.tag.canRemove) {
              const divElement = document.createElement("div");
              divElement.innerHTML = window.wgULS("要移除现有维护标记,请从当前条目版本中打开“标记”菜单", "要移除現有維護標記,請從目前條目版本中打開「標記」選單");
              form.append({
                type: "div",
                name: "untagnotice",
                label: divElement
              });
            }
            form.append({
              type: "div",
              id: "tagWorkArea",
              className: "morebits-scrollbox",
              style: "max-height: 28em"
            });
            form.append({
              type: "checkbox",
              list: [{
                label: window.wgULS("如可能,合并入{{multiple issues}}", "如可能,合併入{{multiple issues}}"),
                value: "group",
                name: "group",
                tooltip: window.wgULS("若加入{{multiple issues}}支持的三个以上的模板,所有支持的模板都会被合并入{{multiple issues}}模板中。", "若加入{{multiple issues}}支援的三個以上的模板,所有支援的模板都會被合併入{{multiple issues}}模板中。"),
                checked: Twinkle.getPref("groupByDefault")
              }]
            });
            form.append({
              type: "input",
              label: "理由:",
              name: "reason",
              tooltip: window.wgULS("附加于编辑摘要的可选理由,例如指出条目内容的哪些部分有问题或移除模板的理由,但若理由很长则应该发表在讨论页。", "附加於編輯摘要的可選理由,例如指出條目內容的哪些部分有問題或移除模板的理由,但若理由很長則應該發表在討論頁。"),
              size: "80"
            });
            break;
          case "file":
            Window.setTitle(window.wgULS("文件维护标记", "檔案維護標記"));
            var _iterator28 = _createForOfIteratorHelper(Twinkle.tag.fileList), _step28;
            try {
              for (_iterator28.s(); !(_step28 = _iterator28.n()).done; ) {
                const group = _step28.value;
                if (group.buildFilename) {
                  var _iterator29 = _createForOfIteratorHelper(group.value), _step29;
                  try {
                    for (_iterator29.s(); !(_step29 = _iterator29.n()).done; ) {
                      const el = _step29.value;
                      el.subgroup = {
                        type: "input",
                        label: window.wgULS("替换的文件:", "替換的檔案:"),
                        tooltip: window.wgULS("输入替换此文件的文件名称(必填)", "輸入替換此檔案的檔案名稱(必填)"),
                        name: "".concat(el.value.replace(/ /g, "_"), "File")
                      };
                    }
                  } catch (err) {
                    _iterator29.e(err);
                  } finally {
                    _iterator29.f();
                  }
                }
                form.append({
                  type: "header",
                  label: group.key
                });
                form.append({
                  type: "checkbox",
                  name: "tags",
                  list: group.value
                });
              }
            } catch (err) {
              _iterator28.e(err);
            } finally {
              _iterator28.f();
            }
            if (Twinkle.getPref("customFileTagList").length) {
              form.append({
                type: "header",
                label: window.wgULS("自定义模板", "自訂模板")
              });
              form.append({
                type: "checkbox",
                name: "tags",
                list: Twinkle.getPref("customFileTagList")
              });
            }
            break;
          case "redirect": {
            Window.setTitle(window.wgULS("重定向标记", "重新導向標記"));
            const i = 1;
            var _iterator30 = _createForOfIteratorHelper(Twinkle.tag.redirectList), _step30;
            try {
              for (_iterator30.s(); !(_step30 = _iterator30.n()).done; ) {
                const group = _step30.value;
                form.append({
                  type: "header",
                  id: "tagHeader".concat(i),
                  label: group.key
                });
                form.append({
                  type: "checkbox",
                  name: "tags",
                  list: group.value.map((item) => {
                    return {
                      value: item.tag,
                      label: "{{".concat(item.tag, "}}:").concat(item.description),
                      subgroup: item.subgroup
                    };
                  })
                });
              }
            } catch (err) {
              _iterator30.e(err);
            } finally {
              _iterator30.f();
            }
            if (Twinkle.getPref("customRedirectTagList").length) {
              form.append({
                type: "header",
                label: window.wgULS("自定义模板", "自訂模板")
              });
              form.append({
                type: "checkbox",
                name: "tags",
                list: Twinkle.getPref("customRedirectTagList")
              });
            }
            break;
          }
          default:
            void mw.notify("Twinkle.tag:未知模式 ".concat(Twinkle.tag.mode), {
              type: "warn",
              tag: "friendlytag"
            });
            break;
        }
        if (document.querySelectorAll(".patrollink").length) {
          form.append({
            type: "checkbox",
            list: [{
              label: window.wgULS("标记页面为已巡查", "標記頁面為已巡查"),
              value: "patrol",
              name: "patrol",
              checked: Twinkle.getPref("markTaggedPagesAsPatrolled")
            }]
          });
        }
        form.append({
          type: "submit",
          className: "tw-tag-submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        $allCheckboxDivs = $(result).find("[name$=tags]").parent();
        $allHeaders = $(result).find("h5");
        result.quickfilter.focus();
        result.quickfilter.autocomplete = "off";
        result.quickfilter.addEventListener("keypress", (e) => {
          if (e.key === "Enter") {
            e.preventDefault();
            return false;
          }
        });
        if (Twinkle.tag.modeEn === "article") {
          Twinkle.tag.alreadyPresentTags = [];
          if (Twinkle.tag.canRemove) {
            $body.find(".mw-parser-output").children().each((_i, e) => {
              if (e.tagName === "H2") {
                return false;
              }
              if (e.className.indexOf("box-") === 0) {
                if (e.classList[0] === "box-问题条目") {
                  $(e).find(".ambox").each((_index, element) => {
                    if (element.classList[0].indexOf("box-") === 0) {
                      const boxTag = element.classList[0].slice("box-".length).replace(/_/g, " ");
                      Twinkle.tag.alreadyPresentTags[Twinkle.tag.alreadyPresentTags.length] = boxTag;
                    }
                  });
                  return true;
                }
                const tag = e.classList[0].slice("box-".length).replace(/_/g, " ");
                Twinkle.tag.alreadyPresentTags[Twinkle.tag.alreadyPresentTags.length] = tag;
              }
            });
            if ($body.find(".box-Uncategorized").length) {
              Twinkle.tag.alreadyPresentTags[Twinkle.tag.alreadyPresentTags.length] = "Uncategorized";
            }
            if ($body.find(".box-Improve_categories").length) {
              Twinkle.tag.alreadyPresentTags[Twinkle.tag.alreadyPresentTags.length] = "Improve categories";
            }
          }
          const statusNode = document.createElement("span");
          statusNode.style.fontSize = "90%";
          statusNode.id = "tw-tag-status";
          Twinkle.tag.status = {
            // initial state; defined like this because these need to be available for reference
            // in the click event handler
            numAdded: 0,
            numRemoved: 0
          };
          $body.find("button.tw-tag-submit").after(statusNode);
          const evt = document.createEvent("Event");
          evt.initEvent("change", true, true);
          result.sortorder.dispatchEvent(evt);
        } else {
          var _iterator31 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "tags")), _step31;
          try {
            for (_iterator31.s(); !(_step31 = _iterator31.n()).done; ) {
              const checkbox = _step31.value;
              generateLinks(checkbox);
            }
          } catch (err) {
            _iterator31.e(err);
          } finally {
            _iterator31.f();
          }
        }
      };
      let $allCheckboxDivs;
      let $allHeaders;
      Twinkle.tag.updateSortOrder = (e) => {
        const {
          form
        } = e.target;
        const sortorder = e.target.value;
        Twinkle.tag.checkedTags = form.getChecked("tags");
        const container = new Morebits.quickForm.element({
          type: "fragment"
        });
        const makeCheckbox = (tag, description) => {
          const checkbox = {
            value: tag,
            label: "{{".concat(tag, "}}: ").concat(description)
          };
          if (Twinkle.tag.checkedTags.includes(tag)) {
            checkbox.checked = true;
          }
          switch (tag) {
            case "Expert needed":
              checkbox.subgroup = [{
                name: "expert",
                type: "input",
                label: window.wgULS("哪个领域的专家(必填):", "哪個領域的專家(必填):"),
                tooltip: window.wgULS("必填,可参考 Category:需要专业人士关注的页面 使用现存的分类。", "必填,可參考 Category:需要專業人士關注的頁面 使用現存的分類。")
              }, {
                name: "expert2",
                type: "input",
                label: window.wgULS("哪个领域的专家:", "哪個領域的專家:"),
                tooltip: window.wgULS("可选,可参考 Category:需要专业人士关注的页面 使用现存的分类。", "可選,可參考 Category:需要專業人士關注的頁面 使用現存的分類。")
              }, {
                name: "expert3",
                type: "input",
                label: window.wgULS("哪个领域的专家:", "哪個領域的專家:"),
                tooltip: window.wgULS("可选,可参考 Category:需要专业人士关注的页面 使用现存的分类。", "可選,可參考 Category:需要專業人士關注的頁面 使用現存的分類。")
              }];
              break;
            case "Merge":
            case "Merge from":
            case "Merge to": {
              let otherTagName = "Merge";
              switch (tag) {
                case "Merge from":
                  otherTagName = "Merge to";
                  break;
                case "Merge to":
                  otherTagName = "Merge from";
                  break;
              }
              checkbox.subgroup = [{
                name: "mergeTarget",
                type: "input",
                label: window.wgULS("其他条目:", "其他條目:"),
                tooltip: window.wgULS("如指定多个条目,请用管道符分隔:条目甲|条目乙", "如指定多個條目,請用管道符分隔:條目甲|條目乙")
              }, {
                type: "checkbox",
                list: [{
                  name: "mergeTagOther",
                  label: "用{{".concat(otherTagName).concat(window.wgULS("}}标记其他条目", "}}標記其他條目")),
                  checked: true,
                  tooltip: window.wgULS("仅在只输入了一个条目名时可用", "僅在只輸入了一個條目名時可用")
                }]
              }];
              if (mw.config.get("wgNamespaceNumber") === 0) {
                checkbox.subgroup[checkbox.subgroup.length] = {
                  name: "mergeReason",
                  type: "textarea",
                  label: window.wgULS("合并理由(会被贴上".concat(tag === "Merge to" ? "其他" : "这", "条目的讨论页):"), "合併理由(會被貼上".concat(tag === "Merge to" ? "其他" : "這", "條目的討論頁):")),
                  tooltip: window.wgULS("可选,但强烈推荐。如不需要请留空。仅在只输入了一个条目名时可用。", "可選,但強烈推薦。如不需要請留空。僅在只輸入了一個條目名時可用。")
                };
              }
              break;
            }
            case "Missing information":
              checkbox.subgroup = {
                name: "missingInformation",
                type: "input",
                label: window.wgULS("缺少的内容(必填):", "缺少的內容(必填):"),
                tooltip: window.wgULS("必填,显示为“缺少有关……的信息。”", "必填,顯示為「缺少有關……的資訊。」")
              };
              break;
            case "Notability":
              checkbox.subgroup = {
                name: "notability",
                type: "select",
                list: [{
                  label: "{{Notability}}:".concat(window.wgULS("通用的关注度指引", "通用的關注度指引")),
                  value: "none"
                }, {
                  label: "{{Notability|Astro}}:".concat(window.wgULS("天体", "天體")),
                  value: "Astro"
                }, {
                  label: "{{Notability|Biographies}}:".concat(window.wgULS("人物传记", "人物傳記")),
                  value: "Biographies"
                }, {
                  label: "{{Notability|Book}}:".concat(window.wgULS("书籍", "書籍")),
                  value: "Book"
                }, {
                  label: "{{Notability|Cyclone}}:".concat(window.wgULS("气旋", "氣旋")),
                  value: "Cyclone"
                }, {
                  label: "{{Notability|Fiction}}:".concat(window.wgULS("虚构事物", "虛構事物")),
                  value: "Fiction"
                }, {
                  label: "{{Notability|Geographic}}:".concat(window.wgULS("地理特征", "地理特徵")),
                  value: "Geographic"
                }, {
                  label: "{{Notability|Geometry}}:".concat(window.wgULS("几何图形", "幾何圖形")),
                  value: "Geometry"
                }, {
                  label: "{{Notability|Invention}}:".concat(window.wgULS("发明、研究", "發明、研究")),
                  value: "Invention"
                }, {
                  label: "{{Notability|Music}}:".concat(window.wgULS("音乐", "音樂")),
                  value: "Music"
                }, {
                  label: "{{Notability|Numbers}}:".concat(window.wgULS("数字", "數字")),
                  value: "Numbers"
                }, {
                  label: "{{Notability|Organizations}}:".concat(window.wgULS("组织", "組織")),
                  value: "Organizations"
                }, {
                  label: "{{Notability|Property}}:".concat(window.wgULS("性质表", "性質表")),
                  value: "Property"
                }, {
                  label: "{{Notability|Traffic}}:交通",
                  value: "Traffic"
                }, {
                  label: "{{Notability|Web}}:".concat(window.wgULS("网站、网络内容", "網站、網路內容"), "(非正式指引)"),
                  value: "Web"
                }]
              };
              break;
            case "Requested move":
              checkbox.subgroup = [{
                name: "moveTarget",
                type: "input",
                label: window.wgULS("新名称:", "新名稱:")
              }, {
                name: "moveReason",
                type: "textarea",
                label: window.wgULS("移动理由(会被粘贴该条目的讨论页):", "移動理由(會被貼上該條目的討論頁):"),
                tooltip: window.wgULS("可选,但强烈推荐。如不需要请留空。", "可選,但強烈推薦。如不需要請留空。")
              }];
              break;
            case "Split":
              checkbox.subgroup = [{
                name: "target1",
                type: "input",
                label: window.wgULS("页面名1:", "頁面名1:"),
                tooltip: window.wgULS("可选。", "可選。")
              }, {
                name: "target2",
                type: "input",
                label: window.wgULS("页面名2:", "頁面名2:"),
                tooltip: window.wgULS("可选。", "可選。")
              }, {
                name: "target3",
                type: "input",
                label: window.wgULS("页面名3:", "頁面名3:"),
                tooltip: window.wgULS("可选。", "可選。")
              }];
              break;
            case "Cleanup":
              checkbox.subgroup = [{
                name: "cleanupReason",
                type: "input",
                label: "需要清理的理由",
                tooltip: window.wgULS("可选,但强烈推荐。如不需要请留空。", "可選,但強烈推薦。如不需要請留空。")
              }];
              break;
            default:
              break;
          }
          return checkbox;
        };
        const makeCheckboxesForAlreadyPresentTags = () => {
          container.append({
            type: "header",
            id: "tagHeader0",
            label: window.wgULS("已放置的维护标记", "已放置的維護標記")
          });
          const subdiv = container.append({
            type: "div",
            id: "tagSubdiv0"
          });
          const checkboxes = [];
          const unCheckedTags = e.target.form.getUnchecked("existingTags");
          var _iterator32 = _createForOfIteratorHelper(Twinkle.tag.alreadyPresentTags), _step32;
          try {
            for (_iterator32.s(); !(_step32 = _iterator32.n()).done; ) {
              const tag = _step32.value;
              const checkbox = {
                value: tag,
                label: "{{".concat(tag, "}}").concat(Twinkle.tag.article.flatObject[tag] ? ": ".concat(Twinkle.tag.article.flatObject[tag].description) : ""),
                checked: !unCheckedTags.includes(tag)
              };
              checkboxes[checkboxes.length] = checkbox;
            }
          } catch (err) {
            _iterator32.e(err);
          } finally {
            _iterator32.f();
          }
          subdiv.append({
            type: "checkbox",
            name: "existingTags",
            list: checkboxes
          });
        };
        if (sortorder === "cat") {
          const doCategoryCheckboxes = (subdiv, subgroup) => {
            const checkboxes = [];
            var _iterator33 = _createForOfIteratorHelper(subgroup), _step33;
            try {
              for (_iterator33.s(); !(_step33 = _iterator33.n()).done; ) {
                const item = _step33.value;
                if (!Twinkle.tag.alreadyPresentTags.includes(item.tag)) {
                  checkboxes[checkboxes.length] = makeCheckbox(item.tag, item.description);
                }
              }
            } catch (err) {
              _iterator33.e(err);
            } finally {
              _iterator33.f();
            }
            subdiv.append({
              type: "checkbox",
              name: "tags",
              list: checkboxes
            });
          };
          if (Twinkle.tag.alreadyPresentTags.length > 0) {
            makeCheckboxesForAlreadyPresentTags();
          }
          let i = 1;
          var _iterator34 = _createForOfIteratorHelper(Twinkle.tag.article.tagList), _step34;
          try {
            for (_iterator34.s(); !(_step34 = _iterator34.n()).done; ) {
              const group = _step34.value;
              container.append({
                type: "header",
                id: "tagHeader".concat(i),
                label: group.key
              });
              const subdiv = container.append({
                type: "div",
                id: "tagSubdiv".concat(i++)
              });
              if (group.value[0].tag) {
                doCategoryCheckboxes(subdiv, group.value);
              } else {
                var _iterator35 = _createForOfIteratorHelper(group.value), _step35;
                try {
                  for (_iterator35.s(); !(_step35 = _iterator35.n()).done; ) {
                    const subgroup = _step35.value;
                    subdiv.append({
                      type: "div",
                      label: [Morebits.htmlNode("b", subgroup.key)]
                    });
                    doCategoryCheckboxes(subdiv, subgroup.value);
                  }
                } catch (err) {
                  _iterator35.e(err);
                } finally {
                  _iterator35.f();
                }
              }
            }
          } catch (err) {
            _iterator34.e(err);
          } finally {
            _iterator34.f();
          }
        } else {
          var _Twinkle$tag$article;
          if (Twinkle.tag.alreadyPresentTags.length > 0) {
            makeCheckboxesForAlreadyPresentTags();
            container.append({
              type: "header",
              id: "tagHeader1",
              label: window.wgULS("可用的维护标记", "可用的維護標記")
            });
          }
          (_Twinkle$tag$article = Twinkle.tag.article).alphabeticalList || (_Twinkle$tag$article.alphabeticalList = Object.keys(Twinkle.tag.article.flatObject).sort());
          const checkboxes = [];
          var _iterator36 = _createForOfIteratorHelper(Twinkle.tag.article.alphabeticalList), _step36;
          try {
            for (_iterator36.s(); !(_step36 = _iterator36.n()).done; ) {
              const tag = _step36.value;
              if (!Twinkle.tag.alreadyPresentTags.includes(tag)) {
                checkboxes[checkboxes.length] = makeCheckbox(tag, Twinkle.tag.article.flatObject[tag].description);
              }
            }
          } catch (err) {
            _iterator36.e(err);
          } finally {
            _iterator36.f();
          }
          container.append({
            type: "checkbox",
            name: "tags",
            list: checkboxes
          });
        }
        if (Twinkle.getPref("customTagList").length) {
          container.append({
            type: "header",
            label: window.wgULS("自定义模板", "自訂模板")
          });
          container.append({
            type: "checkbox",
            name: "tags",
            list: Twinkle.getPref("customTagList").map((el) => {
              el.checked = Twinkle.tag.checkedTags.includes(el.value);
              return el;
            })
          });
        }
        const $workarea = $(form).find("#tagWorkArea");
        const rendered = container.render();
        $workarea.empty().append(rendered);
        $allCheckboxDivs = $workarea.find("[name=tags], [name=existingTags]").parent();
        $allHeaders = $workarea.find("h5, .quickformDescription");
        form.quickfilter.value = "";
        form.quickfilter.focus();
        $workarea.find("h5").css({
          "font-size": "110%"
        });
        $workarea.find("h5:not(:first-child)").css({
          "margin-top": "1em"
        });
        $workarea.find("div").filter(":has(span.quickformDescription)").css({
          "margin-top": "0.4em"
        });
        var _iterator37 = _createForOfIteratorHelper(Morebits.quickForm.getElements(form, "existingTags")), _step37;
        try {
          for (_iterator37.s(); !(_step37 = _iterator37.n()).done; ) {
            const checkbox = _step37.value;
            generateLinks(checkbox);
          }
        } catch (err) {
          _iterator37.e(err);
        } finally {
          _iterator37.f();
        }
        var _iterator38 = _createForOfIteratorHelper(Morebits.quickForm.getElements(form, "tags")), _step38;
        try {
          for (_iterator38.s(); !(_step38 = _iterator38.n()).done; ) {
            const checkbox = _step38.value;
            generateLinks(checkbox);
          }
        } catch (err) {
          _iterator38.e(err);
        } finally {
          _iterator38.f();
        }
        const statusNode = document.querySelector("#tw-tag-status");
        $body.find("[name=tags], [name=existingTags]").on("click", function() {
          if (this.name === "tags") {
            Twinkle.tag.status.numAdded += this.checked ? 1 : -1;
          } else if (this.name === "existingTags") {
            Twinkle.tag.status.numRemoved += this.checked ? -1 : 1;
          }
          const firstPart = "加入".concat(Twinkle.tag.status.numAdded).concat(window.wgULS("个标记", "個標記"));
          const secondPart = "移除".concat(Twinkle.tag.status.numRemoved).concat(window.wgULS("个标记", "個標記"));
          statusNode.textContent = (Twinkle.tag.status.numAdded ? "  ".concat(firstPart) : "") + (Twinkle.tag.status.numRemoved ? (Twinkle.tag.status.numAdded ? ";" : "  ") + secondPart : "");
        });
      };
      const generateLinks = (checkbox) => {
        const link = Morebits.htmlNode("a", ">");
        link.setAttribute("class", "tag-template-link");
        const tagname = checkbox.values;
        link.setAttribute("href", mw.util.getUrl((tagname.includes(":") ? "" : "Template:") + (tagname.includes("|") ? tagname.slice(0, tagname.indexOf("|")) : tagname)));
        link.setAttribute("target", "_blank");
        link.setAttribute("rel", "noopener noreferrer");
        $(checkbox).parent().append([" ", link]);
      };
      Twinkle.tag.article = {};
      Twinkle.tag.article.tagList = [{
        key: window.wgULS("清理和维护模板", "清理和維護模板"),
        value: [{
          key: window.wgULS("常规清理", "常規清理"),
          value: [{
            tag: "Cleanup",
            description: window.wgULS("可能需要进行清理,以符合求闻百科的质量标准", "可能需要進行清理,以符合求聞百科的質量標準")
          }, {
            tag: "Cleanup rewrite",
            description: window.wgULS("不符合求闻百科的质量标准,需要完全重写", "不符合求聞百科的質量標準,需要完全重寫")
          }, {
            tag: "Cleanup-jargon",
            description: window.wgULS("包含过多行话或专业术语,可能需要简化或提出进一步解释", "包含過多行話或專業術語,可能需要簡化或提出進一步解釋")
          }, {
            tag: "Copy edit",
            description: window.wgULS("需要编修,以确保文法、用词、语气、格式、标点等使用恰当", "需要編修,以確保文法、用詞、語氣、格式、標點等使用恰當")
          }]
        }, {
          key: window.wgULS("可能多余的内容", "可能多餘的內容"),
          value: [{
            tag: "Copypaste",
            description: window.wgULS("内容可能是从某个来源处拷贝后粘贴", "內容可能是從某個來源處拷貝後貼上")
          }, {
            tag: "External links",
            description: window.wgULS("使用外部链接的方式可能不符合求闻百科的方针", "使用外部連結的方式可能不符合求聞百科的方針")
          }, {
            tag: "Non-free",
            description: window.wgULS("可能过多或不当地使用了受著作权保护的文字、图像或多媒体文件", "可能過多或不當地使用了受版權保護的文字、圖像或多媒體檔案")
          }]
        }, {
          key: window.wgULS("结构和导言", "結構和導言"),
          value: [{
            tag: "Lead too long",
            description: window.wgULS("导言部分也许过于冗长", "導言部分也許過於冗長")
          }, {
            tag: "Lead too short",
            description: window.wgULS("导言部分也许不足以概括其内容", "導言部分也許不足以概括其內容")
          }, {
            tag: "Very long",
            description: window.wgULS("可能过于冗长", "可能過於冗長")
          }]
        }, {
          key: window.wgULS("虚构作品相关清理", "虛構作品相關清理"),
          value: [{
            tag: "In-universe",
            description: window.wgULS("使用小说故事内的观点描述一个虚构事物", "使用小說故事內的觀點描述一個虛構事物")
          }, {
            tag: "Long plot",
            description: window.wgULS("可能包含过于详细的剧情摘要", "可能包含過於詳細的劇情摘要")
          }]
        }]
      }, {
        key: window.wgULS("常规条目问题", "常規條目問題"),
        value: [{
          key: "重要性和知名度",
          value: [{
            tag: "Notability",
            description: window.wgULS("可能不符合通用关注度指引", "可能不符合通用關注度指引"),
            excludeMI: true
          }, {
            tag: "Notability Unreferenced",
            description: window.wgULS("可能具备关注度,但需要来源加以彰显", "可能具備關注度,但需要來源加以彰顯")
          }]
        }, {
          key: window.wgULS("写作风格", "寫作風格"),
          value: [{
            tag: "Advert",
            description: window.wgULS("类似广告或宣传性内容", "類似廣告或宣傳性內容")
          }, {
            tag: "Fanpov",
            description: window.wgULS("类似爱好者网页", "類似愛好者網頁")
          }, {
            tag: "How-to",
            description: window.wgULS("包含指南或教学内容", "包含指南或教學內容")
          }, {
            tag: "Inappropriate person",
            description: window.wgULS("使用不适当的第一人称和第二人称", "使用不適當的第一人稱和第二人稱")
          }, {
            tag: "Newsrelease",
            description: window.wgULS("阅读起来像是新闻稿及包含过度的宣传性语调", "閱讀起來像是新聞稿及包含過度的宣傳性語調")
          }, {
            tag: "Prose",
            description: window.wgULS("使用了日期或时间列表式记述,需要改写为连贯的叙述性文字", "使用了日期或時間列表式記述,需要改寫為連貫的敘述性文字")
          }, {
            tag: "Review",
            description: window.wgULS("阅读起来类似评论,需要清理", "閱讀起來類似評論,需要清理")
          }, {
            tag: "Tone",
            description: window.wgULS("语调或风格可能不适合百科全书的写作方式", "語調或風格可能不適合百科全書的寫作方式")
          }]
        }, {
          key: window.wgULS("内容", "內容"),
          value: [
            {
              tag: "Missing information",
              description: "缺少必要的信息"
            },
            // these three have a subgroup with several options
            {
              tag: "Substub",
              description: window.wgULS("过于短小", "過於短小"),
              excludeMI: true
            },
            {
              tag: "Unencyclopedic",
              description: window.wgULS("可能不适合写入百科全书", "可能不適合寫入百科全書")
            }
          ]
        }, {
          key: window.wgULS("信息和细节", "資訊和細節"),
          value: [{
            tag: "Expert needed",
            description: window.wgULS("需要精通或熟悉本主题的专业人士(专家)参与及协助编辑", "需要精通或熟悉本主題的專業人士(專家)參與及協助編輯")
          }, {
            tag: "Overly detailed",
            description: window.wgULS("包含太多过度细节内容", "包含太多過度細節內容")
          }, {
            tag: "Trivia",
            description: window.wgULS("应避免有陈列杂项、琐碎资料的部分", "應避免有陳列雜項、瑣碎資料的部分")
          }]
        }, {
          key: window.wgULS("时间性", "時間性"),
          value: [{
            tag: "Current",
            description: window.wgULS("记述新闻动态", "記述新聞動態"),
            excludeMI: true
          }, {
            tag: "Update",
            description: window.wgULS("当前条目或章节需要更新", "當前條目或章節需要更新")
          }]
        }, {
          key: window.wgULS("客观性和事实准确性", "客觀性和事實準確性"),
          value: [{
            tag: "Autobiography",
            description: window.wgULS("类似一篇自传,或内容主要由条目描述的当事人或组织撰写、编辑", "類似一篇自傳,或內容主要由條目描述的當事人或組織撰寫、編輯")
          }, {
            tag: "COI",
            description: window.wgULS("主要贡献者与本条目所宣扬的内容可能存在利益冲突", "主要貢獻者與本條目所宣揚的內容可能存在利益衝突")
          }, {
            tag: "Disputed",
            description: window.wgULS("内容疑欠准确,有待查证", "內容疑欠準確,有待查證")
          }, {
            tag: "Globalize",
            description: window.wgULS("仅具有一部分地区的信息或观点", "僅具有一部分地區的資訊或觀點")
          }, {
            tag: "Hoax",
            description: window.wgULS("真实性被质疑", "真實性被質疑")
          }, {
            tag: "POV",
            description: window.wgULS("客观性有争议。内容、语调可能带有明显的个人观点或地方色彩", "客觀性有爭議。內容、語調可能帶有明顯的個人觀點或地方色彩")
          }, {
            tag: "Self-contradictory",
            description: window.wgULS("内容自相矛盾", "內容自相矛盾")
          }, {
            tag: "Weasel",
            description: window.wgULS("语义模棱两可而损及其客观性或准确性", "語意模棱兩可而損及其客觀性或準確性")
          }]
        }, {
          key: window.wgULS("可供查证和来源", "可供查證和來源"),
          value: [{
            tag: "BLPdispute",
            description: window.wgULS("可能违反了求闻百科关于生者传记的方针", "可能違反了求聞百科關於生者傳記的方針")
          }, {
            tag: "BLPsources",
            description: window.wgULS("生者传记需要补充更多可供查证的来源", "生者傳記需要補充更多可供查證的來源")
          }, {
            tag: "BLP unsourced",
            description: window.wgULS("生者传记没有列出任何参考或来源", "生者傳記沒有列出任何參考或來源")
          }, {
            tag: "Citecheck",
            description: window.wgULS("可能包含不适用或被曲解的引用资料,部分内容的准确性无法被证实", "可能包含不適用或被曲解的引用資料,部分內容的準確性無法被證實")
          }, {
            tag: "More footnotes needed",
            description: window.wgULS("因为文内引用不足,部分字句的来源仍然不明", "因為文內引用不足,部分字句的來源仍然不明")
          }, {
            tag: "No footnotes",
            description: window.wgULS("因为没有内文引用而来源仍然不明", "因為沒有內文引用而來源仍然不明")
          }, {
            tag: "Onesource",
            description: window.wgULS("极大或完全地依赖于某个单一的来源", "極大或完全地依賴於某個單一的來源")
          }, {
            tag: "Original research",
            description: window.wgULS("可能包含原创研究或未查证内容", "可能包含原創研究或未查證內容")
          }, {
            tag: "Primarysources",
            description: window.wgULS("依赖第一手来源", "依賴第一手來源")
          }, {
            tag: "Refimprove",
            description: window.wgULS("需要补充更多来源", "需要補充更多來源")
          }, {
            tag: "Unreferenced",
            description: window.wgULS("没有列出任何参考或来源", "沒有列出任何參考或來源")
          }]
        }]
      }, {
        key: window.wgULS("具体内容问题", "具體內容問題"),
        value: [{
          key: window.wgULS("语言", "語言"),
          value: [{
            tag: "NotMandarin",
            description: window.wgULS("包含过多不是现代标准汉语的内容", "包含過多不是現代標準漢語的內容"),
            excludeMI: true
          }, {
            tag: "Rough translation",
            description: window.wgULS("翻译品质不佳", "翻譯品質不佳")
          }]
        }, {
          key: window.wgULS("链接", "連結"),
          value: [{
            tag: "Dead end",
            description: window.wgULS("需要加上内部链接以构筑百科全书的链接网络", "需要加上內部連結以構築百科全書的連結網絡")
          }, {
            tag: "Orphan",
            description: window.wgULS("没有或只有很少链入页面", "沒有或只有很少連入頁面")
          }, {
            tag: "Overlinked",
            description: window.wgULS("含有过多、重复、或不必要的内部链接", "含有過多、重複、或不必要的內部連結")
          }, {
            tag: "Underlinked",
            description: window.wgULS("需要更多内部链接以构筑百科全书的链接网络", "需要更多內部連結以構築百科全書的連結網絡")
          }]
        }, {
          key: window.wgULS("参考技术", "參考技術"),
          value: [{
            tag: "Citation style",
            description: window.wgULS("引用需要进行清理", "引用需要進行清理")
          }]
        }, {
          key: window.wgULS("分类", "分類"),
          value: [{
            tag: "Improve categories",
            description: window.wgULS("需要更多页面分类", "需要更多頁面分類"),
            excludeMI: true
          }, {
            tag: "Uncategorized",
            description: window.wgULS("缺少页面分类", "缺少頁面分類"),
            excludeMI: true
          }]
        }]
      }, {
        key: window.wgULS("合并、拆分、移动", "合併、拆分、移動"),
        value: [{
          tag: "Merge from",
          description: window.wgULS("建议将页面并入此页面", "建議將頁面併入此頁面"),
          excludeMI: true
        }, {
          tag: "Merge to",
          description: window.wgULS("建议将此页面并入页面", "建議將此頁面併入頁面"),
          excludeMI: true
        }, {
          tag: "Merge",
          description: window.wgULS("建议此页面与页面合并", "建議此頁面與頁面合併"),
          excludeMI: true
        }, {
          tag: "Requested move",
          description: window.wgULS("建议将此页面移动到新名称", "建議將此頁面移動到新名稱"),
          excludeMI: true
        }, {
          tag: "Split",
          description: window.wgULS("建议将此页面分割为多个页面", "建議將此頁面分割為多個頁面"),
          excludeMI: true
        }]
      }];
      Twinkle.tag.redirectList = [{
        key: "常用模板",
        value: [{
          tag: window.wgULS("合并重定向", "合併重定向"),
          description: window.wgULS("保持页面题名至相应主条目,令页面内容在合并后仍能保存其编辑历史", "保持頁面題名至相應主條目,令頁面內容在合併後仍能儲存其編輯歷史")
        }, {
          tag: window.wgULS("简繁重定向", "簡繁重定向"),
          description: window.wgULS("引导简体至繁体,或繁体至简体", "引導簡體至繁體,或繁體至簡體")
        }, {
          tag: window.wgULS("关注度重定向", "關注度重定向"),
          description: window.wgULS("缺乏关注度的子主题向有关注度的母主题的重定向", "缺乏關注度的子主題向有關注度的母主題的重定向")
        }, {
          tag: "模板重定向",
          description: window.wgULS("指向模板的重定向页面", "指向模板的重定向頁面")
        }, {
          tag: window.wgULS("别名重定向", "別名重定向"),
          description: window.wgULS("标题的其他名称、笔名、绰号、同义字等", "標題的其他名稱、筆名、綽號、同義字等")
        }, {
          tag: window.wgULS("译名重定向", "譯名重定向"),
          description: window.wgULS("人物、作品等各项事物的其他翻译名称", "人物、作品等各項事物的其他翻譯名稱")
        }, {
          tag: window.wgULS("缩写重定向", "縮寫重定向"),
          description: window.wgULS("标题缩写", "標題縮寫")
        }, {
          tag: window.wgULS("拼写重定向", "拼寫重定向"),
          description: window.wgULS("标题的其他不同拼写", "標題的其他不同拼寫")
        }, {
          tag: window.wgULS("错字重定向", "錯字重定向"),
          description: window.wgULS("纠正标题的常见错误拼写或误植", "糾正標題的常見錯誤拼寫或誤植")
        }, {
          tag: window.wgULS("旧名重定向", "舊名重定向"),
          description: window.wgULS("将事物早前的名称引导至更改后的主题", "將事物早前的名稱引導至更改後的主題")
        }, {
          tag: "全名重定向",
          description: window.wgULS("标题的完整或更完整名称", "標題的完整或更完整名稱")
        }, {
          tag: "短名重定向",
          description: window.wgULS("完整标题名称或人物全名的部分、不完整的名称或简称", "完整標題名稱或人物全名的部分、不完整的名稱或簡稱")
        }, {
          tag: "姓氏重定向",
          description: "人物姓氏"
        }, {
          tag: "名字重定向",
          description: "人物人名"
        }, {
          tag: "本名重定向",
          description: "人物本名"
        }, {
          tag: "非中文重定向",
          description: window.wgULS("非中文标题", "非中文標題"),
          subgroup: [{
            name: "altLangFrom",
            type: "input",
            label: "本重新導向的語言(可選)",
            tooltip: "輸入重新導向名稱所使用語言的ISO 639代碼,例如en代表英語,代碼可參見 Template:ISO_639_name"
          }]
        }, {
          tag: "日文重定向",
          description: window.wgULS("日语名称", "日語名稱")
        }]
      }, {
        key: "偶用模板",
        value: [{
          tag: "角色重定向",
          description: window.wgULS("电视剧、电影、书籍等作品的角色", "電視劇、電影、書籍等作品的角色")
        }, {
          tag: window.wgULS("章节重定向", "章節重定向"),
          description: window.wgULS("导向至较高密度组织的页面", "導向至較高密度組織的頁面")
        }, {
          tag: "列表重定向",
          description: window.wgULS("导向至低密度的列表", "導向至低密度的列表")
        }, {
          tag: "可能性重定向",
          description: window.wgULS("导向至当前提供内容更为详尽的目标页面", "導向至當前提供內容更為詳盡的目標頁面")
        }, {
          tag: window.wgULS("关联字重定向", "關聯字重定向"),
          description: window.wgULS("标题名称关联字", "標題名稱關聯字")
        }, {
          tag: window.wgULS("条目请求重定向", "條目請求重定向"),
          description: window.wgULS("需要独立条目的页面", "需要獨立條目的頁面"),
          subgroup: [{
            name: "reqArticleLang",
            type: "input",
            label: "外語語言代碼:",
            tooltip: "使用ISO 639代碼,可參見 Template:ISO_639_name"
          }, {
            name: "reqArticleTitle",
            type: "input",
            label: "外語頁面名稱:",
            size: 60
          }]
        }, {
          tag: window.wgULS("快捷方式重定向", "捷徑重定向"),
          description: window.wgULS("求闻百科快捷方式", "求聞百科快捷方式")
        }]
      }, {
        key: window.wgULS("鲜用模板", "鮮用模板"),
        value: [{
          tag: window.wgULS("词组重定向", "詞組重定向"),
          description: window.wgULS("将词组/词组/成语指向切题的条目及恰当章节", "將詞組/詞組/成語指向切題的條目及恰當章節")
        }, {
          tag: window.wgULS("消歧义页重定向", "消歧義頁重定向"),
          description: window.wgULS("指向消歧义页", "指向消歧義頁")
        }, {
          tag: "域名重定向",
          description: window.wgULS("域名", "網域名稱")
        }, {
          tag: "年代重定向",
          description: window.wgULS("于年份条目导向至年代条目", "於年份條目導向至年代條目")
        }, {
          tag: window.wgULS("用户框模板重定向", "用戶框模板重定向"),
          description: window.wgULS("用户框模板", "用戶框模板")
        }, {
          tag: "重定向模板用重定向",
          description: window.wgULS("导向至重定向模板", "導向至重定向模板")
        }, {
          tag: "EXIF重定向",
          description: window.wgULS("JPEG图像文件包含EXIF信息", "JPEG圖檔包含EXIF資訊")
        }]
      }];
      Twinkle.tag.fileList = [{
        key: window.wgULS("著作权和来源问题标签", "著作權和來源問題標籤"),
        value: [{
          label: "{{Non-free reduce}}:".concat(window.wgULS("非低分辨率的合理使用图像(或过长的音频剪辑等)", "非低解析度的合理使用圖像(或過長的音頻剪輯等)")),
          value: "Non-free reduce"
        }]
      }, {
        key: window.wgULS("清理标签", "清理標籤"),
        value: [{
          label: "{{Watermark}}:".concat(window.wgULS("图像包含了水印", "圖像包含了浮水印")),
          value: "Watermark"
        }, {
          label: "{{Rename media}}:".concat(window.wgULS("文件应该根据文件名称指引被重命名", "檔案應該根據檔案名稱指引被重新命名")),
          value: "Rename media",
          subgroup: [{
            type: "input",
            name: "renamemediaNewname",
            label: window.wgULS("新名称:", "新名稱:"),
            tooltip: window.wgULS("输入图像的新名称(可选)", "輸入圖像的新名稱(可選)")
          }, {
            type: "input",
            name: "renamemediaReason",
            label: "原因:",
            tooltip: window.wgULS("输入重命名的原因(可选)", "輸入重新命名的原因(可選)")
          }]
        }, {
          label: "{{Should be SVG}}:".concat(window.wgULS("PNG、GIF、JPEG文件应该重制成矢量图形", "PNG、GIF、JPEG檔案應該重製成向量圖形")),
          value: "Should be SVG"
        }]
      }, {
        key: window.wgULS("文件取代标签", "檔案取代標籤"),
        value: [{
          label: "{{Obsolete}}:".concat(window.wgULS("有新版本可用的过时文件", "有新版本可用的過時檔案")),
          value: "Obsolete"
        }, {
          label: "{{Vector version available}}:".concat(window.wgULS("有矢量图形可用的非矢量图形文件", "有向量圖形可用的非向量圖形檔案")),
          value: "Vector version available"
        }],
        buildFilename: true
      }];
      Twinkle.tag.callbacks = {
        article: (pageobj) => {
          let pageText = pageobj.getPageText().replace(/\{\{\s*([Nn]ew unreviewed article|[Uu]nreviewed|[Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
          const params = pageobj.getCallbackParameters();
          const postRemoval = () => {
            if (params.tagsToRemove.length) {
              pageText = pageText.replace(/\{\{(multiple ?issues|article ?issues|mi|ai|issues|多個問題|多个问题|問題條目|问题条目|數個問題|数个问题)\s*\|\s*\}\}\n?/im, "");
              pageText = pageText.replace(/\{\{(?:multiple ?issues|article ?issues|mi|ai|issues|多個問題|多个问题|問題條目|问题条目|數個問題|数个问题)\s*\|\s*(\{\{(?:\{\{[^{}]*\}\}|[^{}])+\}\})\s*\}\}/im, "$1");
            }
            const makeSentence = (array) => {
              if (array.length < 3) {
                return array.join("和");
              }
              const last = array.pop();
              return "".concat(array.join("、"), "和").concat(last);
            };
            const makeTemplateLink = (tag) => {
              let text = "{{[[";
              if (tag.includes("|")) {
                tag = tag.slice(0, tag.indexOf("|"));
              }
              text += tag.includes(":") ? tag : "Template:".concat(tag, "|").concat(tag);
              return "".concat(text, "]]}}");
            };
            let summaryText;
            const addedTags = params.tags.map(makeTemplateLink);
            const removedTags = params.tagsToRemove.map(makeTemplateLink);
            if (addedTags.length) {
              summaryText = "加入".concat(makeSentence(addedTags));
              summaryText += removedTags.length ? "並移除".concat(makeSentence(removedTags)) : "";
            } else {
              summaryText = "移除".concat(makeSentence(removedTags));
            }
            summaryText += window.wgULS("标记", "標記");
            if (params.reason) {
              summaryText += ":".concat(params.reason);
            }
            if (summaryText.length > 499) {
              summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, "$1");
            }
            pageobj.setPageText(pageText);
            pageobj.setEditSummary(summaryText);
            pageobj.setChangeTags(Twinkle.changeTags);
            pageobj.setWatchlist(Twinkle.getPref("watchTaggedPages"));
            pageobj.setMinorEdit(Twinkle.getPref("markTaggedPagesAsMinor"));
            pageobj.setCreateOption("nocreate");
            pageobj.save(() => {
              if (params.mergeReason) {
                const talkpage = new Morebits.wiki.page("Talk:".concat(params.discussArticle), window.wgULS("将理由贴进讨论页", "將理由貼進討論頁"));
                talkpage.setNewSectionText("".concat(params.mergeReason.trim(), " ~~").concat("~~"));
                talkpage.setNewSectionTitle("请求与[[".concat(params.nonDiscussArticle, "]]合并"));
                talkpage.setChangeTags(Twinkle.changeTags);
                talkpage.setWatchlist(Twinkle.getPref("watchMergeDiscussions"));
                talkpage.setCreateOption("recreate");
                talkpage.newSection();
              }
              if (params.mergeTagOther) {
                let otherTagName = "Merge";
                if (params.mergeTag === "Merge from") {
                  otherTagName = "Merge to";
                } else if (params.mergeTag === "Merge to") {
                  otherTagName = "Merge from";
                }
                const newParams = {
                  tags: [otherTagName],
                  tagsToRemove: [],
                  tagsToRemain: [],
                  mergeTarget: Morebits.pageNameNorm,
                  discussArticle: params.discussArticle,
                  talkDiscussionTitle: params.talkDiscussionTitle,
                  talkDiscussionTitleLinked: params.talkDiscussionTitleLinked
                };
                const otherpage = new Morebits.wiki.page(params.mergeTarget, "".concat(window.wgULS("标记其他页面(", "標記其他頁面(") + params.mergeTarget, ")"));
                otherpage.setCallbackParameters(newParams);
                otherpage.load(Twinkle.tag.callbacks.article);
              }
              if (params.moveReason) {
                let moveTalkpageText = "\n\n{{".concat("subst:", "RM|1=".concat(params.moveReason.trim()));
                if (params.moveTarget) {
                  moveTalkpageText += "|2=".concat(params.moveTarget);
                }
                moveTalkpageText += "}}";
                const moveTalkpage = new Morebits.wiki.page("Talk:".concat(params.discussArticle), window.wgULS("将理由贴进讨论页", "將理由貼進討論頁"));
                moveTalkpage.setAppendText(moveTalkpageText);
                moveTalkpage.setEditSummary(window.wgULS("请求移动", "請求移動") + (params.moveTarget ? "至[[".concat(params.moveTarget, "]]") : ""));
                moveTalkpage.setChangeTags(Twinkle.changeTags);
                moveTalkpage.setCreateOption("recreate");
                moveTalkpage.append();
              }
            });
            if (params.patrol) {
              pageobj.patrol();
            }
          };
          const removeTags = () => {
            if (params.tagsToRemove.length === 0) {
              postRemoval();
              return;
            }
            Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("移除取消选择的已存在标记", "移除取消選擇的已存在標記"));
            const getRedirectsFor = [];
            var _iterator39 = _createForOfIteratorHelper(params.tagsToRemove), _step39;
            try {
              for (_iterator39.s(); !(_step39 = _iterator39.n()).done; ) {
                const tag = _step39.value;
                const tag_re = new RegExp("\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|[^}]+)?\\}\\}\\n?"));
                if (tag_re.test(pageText)) {
                  pageText = pageText.replace(tag_re, "");
                } else {
                  getRedirectsFor[getRedirectsFor.length] = "Template:".concat(tag);
                }
              }
            } catch (err) {
              _iterator39.e(err);
            } finally {
              _iterator39.f();
            }
            if (!getRedirectsFor.length) {
              postRemoval();
              return;
            }
            const api2 = new Morebits.wiki.api(window.wgULS("获取模板重定向", "取得模板重新導向"), {
              action: "query",
              prop: "linkshere",
              titles: getRedirectsFor.join("|"),
              redirects: 1,
              lhnamespace: "10",
              lhshow: "redirect",
              lhlimit: "max"
              // 500 is max for normal users, 5000 for bots and sysops
            }, (apiobj) => {
              $(apiobj.responseXML).find("page").each((_idx, page) => {
                let removed = false;
                $(page).find("lh").each((_index, element) => {
                  const tag = $(element).attr("title").slice(9);
                  const tag_re = new RegExp("\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?\\}\\}\\n?"));
                  if (tag_re.test(pageText)) {
                    pageText = pageText.replace(tag_re, "");
                    removed = true;
                    return false;
                  }
                });
                if (!removed) {
                  Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("无法在页面上找到{{", "無法在頁面上找到{{") + $(page).attr("title").slice(9) + window.wgULS("}}……跳过", "}}……跳過"));
                }
              });
              postRemoval();
            });
            api2.post();
          };
          if (!params.tags.length) {
            removeTags();
            return;
          }
          let tagRe;
          let tagText = "";
          let tags = [];
          const groupableTags = [];
          const groupableExistingTags = [];
          const addTag = (tagName) => {
            let currentTag = "";
            if (tagName === "Uncategorized" || tagName === "Improve categories") {
              pageText += "\n\n{{".concat(tagName, "|time={{").concat("subst:", "#time:c}}}}");
            } else {
              currentTag += "{{".concat(tagName);
              switch (tagName) {
                case "Expert needed":
                  currentTag += "|subject=".concat(params.expert);
                  if (params.expert2) {
                    currentTag += "|subject2=".concat(params.expert2);
                  }
                  if (params.expert3) {
                    currentTag += "|subject3=".concat(params.expert3);
                  }
                  break;
                case "Merge":
                case "Merge to":
                case "Merge from":
                  if (params.mergeTarget) {
                    params.mergeTarget = Morebits.string.toUpperCaseFirstChar(params.mergeTarget.replace(/_/g, " "));
                    currentTag += "|".concat(params.mergeTarget);
                    if (mw.config.get("wgNamespaceNumber") === 0 && (params.mergeReason || params.discussArticle)) {
                      if (!params.discussArticle) {
                        params.discussArticle = tagName === "Merge to" ? params.mergeTarget : mw.config.get("wgTitle");
                        params.nonDiscussArticle = tagName === "Merge to" ? mw.config.get("wgTitle") : params.mergeTarget;
                        params.talkDiscussionTitle = window.wgULS("请求与", "請求與") + params.nonDiscussArticle + window.wgULS("合并", "合併");
                      }
                      currentTag += "|discuss=Talk:".concat(params.discussArticle, "#").concat(params.talkDiscussionTitle);
                    }
                  }
                  break;
                case "Missing information":
                  currentTag += "|1=".concat(params.missingInformation);
                  break;
                case "Notability":
                  if (params.notability !== "none") {
                    currentTag += "|3=".concat(params.notability);
                  }
                  break;
                case "Requested move":
                  if (params.moveTarget) {
                    params.moveTarget = Morebits.string.toUpperCaseFirstChar(params.moveTarget.replace(/_/g, " "));
                    params.discussArticle = mw.config.get("wgTitle");
                    currentTag += "|".concat(params.moveTarget);
                  }
                  break;
                case "Split":
                  if (params.target1) {
                    currentTag += "|1=".concat(params.target1);
                  }
                  if (params.target2) {
                    currentTag += "|2=".concat(params.target2);
                  }
                  if (params.target3) {
                    currentTag += "|3=".concat(params.target3);
                  }
                  break;
                case "Cleanup":
                  if (params.cleanupReason) {
                    currentTag += "|reason=".concat(params.cleanupReason);
                  }
                  break;
                default:
                  break;
              }
              currentTag += "|time={{".concat("subst:", "#time:c}}}}\n");
              tagText += currentTag;
            }
          };
          const addUngroupedTags = () => {
            for (var _i9 = 0, _tags = tags; _i9 < _tags.length; _i9++) {
              const tag = _tags[_i9];
              addTag(tag);
            }
            const qiuwen_page = new Morebits.wikitext.page(pageText);
            const templatesAfter = (
              // Protection templates
              // CSD
              // AfD
              "".concat(Twinkle.hatnoteRegex, "pp|pp-.*?|(?:Delete|Db-reason|D|Deletebecause|Db|速删|速刪|Speedy|SD|快删|快刪|CSD)|[rsaiftcmv]fd|vfd-(?:b|q|s|source|v|wikt)|(?:移动到维基|移動到維基)(?:教科书|教科書|语录|語錄|文库|文庫|导游|導遊|词典|詞典)")
            );
            pageText = qiuwen_page.insertAfterTemplates(tagText, templatesAfter).getText();
            removeTags();
          };
          var _iterator40 = _createForOfIteratorHelper(params.tags), _step40;
          try {
            for (_iterator40.s(); !(_step40 = _iterator40.n()).done; ) {
              const tag = _step40.value;
              tagRe = new RegExp("\\{\\{".concat(tag, "(\\||\\}\\})"), "im");
              if (Twinkle.tag.canRemove || !tagRe.exec(pageText)) {
                if (tag === "Notability" && (mw.config.get("wgNamespaceNumber") === 0 || confirm(window.wgULS("该页面不是条目,您仍要提报到关注度提报吗?", "該頁面不是條目,您仍要提報到關注度提報嗎?")))) {
                  const qiuwen_page = new Morebits.wiki.page("Qiuwen_talk:存废讨论/关注度提报", window.wgULS("加入关注度记录项", "加入關注度記錄項"));
                  qiuwen_page.setFollowRedirect(true);
                  qiuwen_page.setCallbackParameters(params);
                  qiuwen_page.load(Twinkle.tag.callbacks.notabilityList);
                }
                if (Twinkle.tag.article.flatObject[tag] && !Twinkle.tag.article.flatObject[tag].excludeMI) {
                  groupableTags[groupableTags.length] = tag;
                } else {
                  tags[tags.length] = tag;
                }
              } else if (tag === "Merge from") {
                tags[tags.length] = tag;
              } else {
                Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("在页面上找到{{", "在頁面上找到{{") + tag + window.wgULS("}}……跳过", "}}……跳過"));
                if (["Merge", "Merge to"].includes(tag)) {
                  params.mergeTarget = null;
                  params.mergeReason = null;
                  params.mergeTagOther = null;
                }
              }
            }
          } catch (err) {
            _iterator40.e(err);
          } finally {
            _iterator40.f();
          }
          var _iterator41 = _createForOfIteratorHelper(params.tagsToRemain), _step41;
          try {
            for (_iterator41.s(); !(_step41 = _iterator41.n()).done; ) {
              const tag = _step41.value;
              if (Twinkle.tag.article.flatObject[tag] && !Twinkle.tag.article.flatObject[tag].excludeMI) {
                groupableExistingTags[groupableExistingTags.length] = tag;
              }
            }
          } catch (err) {
            _iterator41.e(err);
          } finally {
            _iterator41.f();
          }
          const miTest = /\{\{(multiple ?issues|article ?issues|mi|ai|issues|多個問題|多个问题|問題條目|问题条目|數個問題|数个问题)\s*\|[^}]+\{/im.exec(pageText);
          if (miTest && groupableTags.length > 0) {
            Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("加入支持的标记入已存在的{{multiple issues}}", "加入支援的標記入已存在的{{multiple issues}}"));
            tagText = "";
            var _iterator42 = _createForOfIteratorHelper(groupableTags), _step42;
            try {
              for (_iterator42.s(); !(_step42 = _iterator42.n()).done; ) {
                const tag = _step42.value;
                addTag(tag);
              }
            } catch (err) {
              _iterator42.e(err);
            } finally {
              _iterator42.f();
            }
            const miRegex = new RegExp("(\\{\\{\\s*".concat(miTest[1], "\\s*(?:\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?)\\}\\}\\s*"), "im");
            pageText = pageText.replace(miRegex, "$1".concat(tagText, "}}\n"));
            tagText = "";
            addUngroupedTags();
          } else if (params.group && !miTest && groupableExistingTags.length + groupableTags.length >= 2) {
            Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("加入支持的标记入{{multiple issues}}", "加入支援的標記入{{multiple issues}}"));
            tagText += "{{Multiple issues|\n";
            const addNewTagsToMI = () => {
              var _iterator43 = _createForOfIteratorHelper(groupableTags), _step43;
              try {
                for (_iterator43.s(); !(_step43 = _iterator43.n()).done; ) {
                  const tag = _step43.value;
                  addTag(tag);
                }
              } catch (err) {
                _iterator43.e(err);
              } finally {
                _iterator43.f();
              }
              tagText += "}}\n";
              addUngroupedTags();
            };
            const getRedirectsFor = [];
            var _iterator44 = _createForOfIteratorHelper(groupableExistingTags), _step44;
            try {
              for (_iterator44.s(); !(_step44 = _iterator44.n()).done; ) {
                const tag = _step44.value;
                const tag_re = new RegExp("(\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|[^}]+)?\\}\\}\\n?)"));
                if (tag_re.test(pageText)) {
                  tagText += tag_re.exec(pageText)[1];
                  pageText = pageText.replace(tag_re, "");
                } else {
                  getRedirectsFor[getRedirectsFor.length] = "Template:".concat(tag);
                }
              }
            } catch (err) {
              _iterator44.e(err);
            } finally {
              _iterator44.f();
            }
            if (!getRedirectsFor.length) {
              addNewTagsToMI();
              return;
            }
            const api2 = new Morebits.wiki.api(window.wgULS("获取模板重定向", "取得模板重新導向"), {
              action: "query",
              prop: "linkshere",
              titles: getRedirectsFor.join("|"),
              redirects: 1,
              lhnamespace: "10",
              lhshow: "redirect",
              lhlimit: "max"
              // 500 is max for normal users, 5000 for bots and sysops
            }, (apiobj) => {
              $(apiobj.responseXML).find("page").each((_idx, page) => {
                let found = false;
                $(page).find("lh").each((_index, element) => {
                  const tag = $(element).attr("title").slice(9);
                  const tag_re = new RegExp("(\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|[^}]*)?\\}\\}\\n?)"));
                  if (tag_re.test(pageText)) {
                    tagText += tag_re.exec(pageText)[1];
                    pageText = pageText.replace(tag_re, "");
                    found = true;
                    return false;
                  }
                });
                if (!found) {
                  Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("无法在页面上找到{{", "無法在頁面上找到{{") + $(page).attr("title").slice(9) + window.wgULS("}}……跳过", "}}……跳過"));
                }
              });
              addNewTagsToMI();
            });
            api2.post();
          } else {
            tags = [...tags, ...groupableTags];
            addUngroupedTags();
          }
        },
        notabilityList: (pageobj) => {
          pageobj.setAppendText("\n{{".concat("subst:", "Fameitem|title=".concat(Morebits.pageNameNorm, "}}")));
          pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setCreateOption("recreate");
          pageobj.append();
        },
        redirect: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          let pageText = pageobj.getPageText();
          let tagRe;
          let tagText = "";
          let summaryText = "加入";
          const tags = [];
          let i;
          for (i = 0; i < params.tags.length; i++) {
            tagRe = new RegExp("(\\{\\{".concat(params.tags[i], "(\\||\\}\\}))"), "im");
            if (tagRe.exec(pageText)) {
              Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("在重定向上找到{{", "在重新導向上找到{{") + params.tags[i] + window.wgULS("}}……跳过", "}}……跳過"));
            } else {
              tags[tags.length] = params.tags[i];
            }
          }
          const addTag = (tagName, tagIndex) => {
            tagText += "\n{{".concat(tagName);
            if (tagName === "非中文重定向") {
              if (params.altLangFrom) {
                tagText += "|1=".concat(params.altLangFrom);
              }
            } else if ((tagName === "条目请求重定向" || tagName === "條目請求重定向") && params.reqArticleLang && params.reqArticleTitle) {
              tagText += "|1=".concat(params.reqArticleLang);
              tagText += "|2=".concat(params.reqArticleTitle);
            }
            tagText += "}}";
            if (tagIndex > 0) {
              if (tagIndex === tags.length - 1) {
                summaryText += "和";
              } else if (tagIndex < tags.length - 1) {
                summaryText += "、";
              }
            }
            summaryText += "{{[[:".concat(tagName.includes(":") ? tagName : "Template:".concat(tagName, "|").concat(tagName), "]]}}");
          };
          if (!tags.length) {
            Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("没有标签可供标记", "沒有標籤可供標記"));
          }
          tags.sort();
          for (var _i10 = 0, _tags2 = tags; _i10 < _tags2.length; _i10++) {
            const tag = _tags2[_i10];
            addTag(tag);
          }
          if (pageText.match(/{{(?:redr|this is a redirect|r(?:edirect)?(?:.?cat.*)?[ _]?sh)/i)) {
            const oldTags = pageText.match(/(\s*{{[A-Za-z\s]+\|(?:\s*1=)?)((?:[^|{}]|{{[^}]+}})+)(}})\s*/i);
            pageText = pageText.replace(oldTags[0], oldTags[1] + tagText + oldTags[2] + oldTags[3]);
          } else {
            const pageTags = pageText.match(/\s*{{.+?重定向.*?}}/gim);
            let oldPageTags = "";
            if (pageTags) {
              var _iterator45 = _createForOfIteratorHelper(pageTags), _step45;
              try {
                for (_iterator45.s(); !(_step45 = _iterator45.n()).done; ) {
                  let pageTag = _step45.value;
                  const pageRe = new RegExp(Morebits.string.escapeRegExp(pageTag), "img");
                  pageText = pageText.replace(pageRe, "");
                  pageTag = pageTag.trim();
                  oldPageTags += "\n".concat(pageTag);
                }
              } catch (err) {
                _iterator45.e(err);
              } finally {
                _iterator45.f();
              }
            }
            pageText += "\n{{Redirect category shell|".concat(tagText).concat(oldPageTags, "\n}}");
          }
          summaryText += (tags.length > 0 ? window.wgULS("标记", "標記") : "{{Redirect category shell}}") + window.wgULS("到重定向", "到重新導向");
          if (summaryText.length > 499) {
            summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, "$1");
          }
          pageobj.setPageText(pageText);
          pageobj.setEditSummary(summaryText);
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setWatchlist(Twinkle.getPref("watchTaggedPages"));
          pageobj.setMinorEdit(Twinkle.getPref("markTaggedPagesAsMinor"));
          pageobj.setCreateOption("nocreate");
          pageobj.save();
          if (params.patrol) {
            pageobj.patrol();
          }
        },
        file: (pageobj) => {
          let text = pageobj.getPageText();
          const params = pageobj.getCallbackParameters();
          let summary = "加入";
          if (params.tags.length) {
            let tagtext = "";
            let currentTag;
            var _iterator46 = _createForOfIteratorHelper(params.tags), _step46;
            try {
              for (_iterator46.s(); !(_step46 = _iterator46.n()).done; ) {
                const tag = _step46.value;
                if (["Keep local", "Now Qiuwen Share", "Do not move to Qiuwen Share"].includes(tag)) {
                  text = text.replace(/{{(mtc|(copy |move )?to ?share|move to qiuwen share|copy to qiuwen share)[^}]*}}/gi, "");
                }
                if (tag === "Vector version available") {
                  text = text.replace(/\{\{((convert to |convertto|should be |shouldbe|to)?svg|badpng|vectorize)[^}]*\}\}/gi, "");
                }
                currentTag = tag;
                switch (tag) {
                  case "Now Commons":
                    currentTag = "subst:".concat(currentTag);
                    if (params.nowcommonsName !== "") {
                      currentTag += "|1=".concat(params.nowcommonsName);
                    }
                    break;
                  case "Keep local":
                    if (params.keeplocalName !== "") {
                      currentTag += "|1=".concat(params.keeplocalName);
                    }
                    if (params.keeplocalReason !== "") {
                      currentTag += "|reason=".concat(params.keeplocalReason);
                    }
                    break;
                  case "Rename media":
                    if (params.renamemediaNewname !== "") {
                      currentTag += "|1=".concat(params.renamemediaNewname);
                    }
                    if (params.renamemediaReason !== "") {
                      currentTag += "|2=".concat(params.renamemediaReason);
                    }
                    break;
                  case "Vector version available":
                  case "Obsolete":
                    currentTag += "|1=".concat(params["".concat(tag.replace(/ /g, "_"), "File")]);
                    break;
                  case "Do not move to Commons":
                    currentTag += "|reason=".concat(params.DoNotMoveToCommons_reason);
                    break;
                  case "Copy to Wikimedia Commons":
                    currentTag += "|human=".concat(mw.config.get("wgUserName"));
                    break;
                  default:
                    break;
                }
                currentTag = "{{".concat(currentTag, "}}\n");
                tagtext += currentTag;
                summary += "{{".concat(tag, "}}、");
              }
            } catch (err) {
              _iterator46.e(err);
            } finally {
              _iterator46.f();
            }
            if (!tagtext) {
              pageobj.getStatusElement().warn(window.wgULS("用户取消操作,没什么要做的", "使用者取消操作,沒什麼要做的"));
              return;
            }
            text = tagtext + text;
          }
          pageobj.setPageText(text);
          pageobj.setEditSummary(summary.slice(0, Math.max(0, summary.length - 1)));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setWatchlist(Twinkle.getPref("watchTaggedPages"));
          pageobj.setMinorEdit(Twinkle.getPref("markTaggedPagesAsMinor"));
          pageobj.setCreateOption("nocreate");
          pageobj.save();
          if (params.patrol) {
            pageobj.patrol();
          }
        }
      };
      Twinkle.tag.callback.evaluate = (e) => {
        const form = e.target;
        const params = Morebits.quickForm.getInputData(form);
        const checkIncompatible = (conflicts, extra) => {
          const count = conflicts.reduce((sum, tag) => {
            return sum += params.tags.includes(tag);
          }, 0);
          if (count > 1) {
            let message = "".concat(window.wgULS("请在以下标签中择一使用", "請在以下標籤中擇一使用"), ":{{").concat(conflicts.join("}}、{{"), "}}。");
            message += extra || "";
            void mw.notify(message, {
              type: "warn",
              tag: "friendlytag"
            });
            return true;
          }
        };
        const checkParameter = (tag, parameter, description = "理由") => {
          if (params.tags.includes(tag) && params[parameter].trim() === "") {
            void mw.notify("".concat(window.wgULS("您必须指定", "您必須指定"), "{{").concat(tag, "}}的").concat(description, "。"), {
              type: "warn",
              tag: "friendlytag"
            });
            return true;
          }
        };
        switch (Twinkle.tag.modeEn) {
          case "article":
            params.tagsToRemove = form.getUnchecked("existingTags");
            params.tagsToRemain = params.existingTags || [];
            if (params.tags.includes("Merge") || params.tags.includes("Merge from") || params.tags.includes("Merge to")) {
              if (checkIncompatible(["Merge", "Merge from", "Merge to"], window.wgULS("若需要多次合并,请使用{{Merge}}并用管道符分隔条目名(但在这种情形中Twinkle不能自动标记其他条目)。", "若需要多次合併,請使用{{Merge}}並用管道符分隔條目名(但在這種情形中Twinkle不能自動標記其他條目)。"))) {
                return;
              }
              if (!params.mergeTarget) {
                void mw.notify(window.wgULS("请指定使用于merge模板中的另一个页面标题。", "請指定使用於merge模板中的另一個頁面標題。"), {
                  type: "warn",
                  tag: "friendlytag"
                });
                return;
              }
              if ((params.mergeTagOther || params.mergeReason) && params.mergeTarget.includes("|")) {
                void mw.notify(window.wgULS("当前还不支持在一次合并中标记多个条目,与开启关于多个条目的讨论。请不要勾选“标记其他条目”并清空“理由”框后再提交。", "目前還不支援在一次合併中標記多個條目,與開啟關於多個條目的討論。請不要勾選「標記其他條目」並清空「理由」框後再提交。"), {
                  type: "warn",
                  tag: "friendlytag"
                });
                return;
              }
            }
            if (checkParameter("Missing information", "missingInformation", window.wgULS("缺少的内容", "缺少的內容"))) {
              return;
            }
            if (checkParameter("Expert needed", "expert", window.wgULS("专家领域", "專家領域"))) {
              return;
            }
            break;
          case "file":
            if (checkParameter("Obsolete", "ObsoleteFile", window.wgULS("替换的文件名称", "替換的檔案名稱")) || checkParameter("Vector version available", "Vector_version_availableFile", window.wgULS("替换的文件名称", "替換的檔案名稱"))) {
              return;
            }
            if (checkParameter("Do not move to Commons", "DoNotMoveToCommons_reason")) {
              return;
            }
            break;
          case "redirect":
            break;
          default:
            void mw.notify("Twinkle.tag:未知模式 ".concat(Twinkle.tag.mode), {
              type: "warn",
              tag: "friendlytag"
            });
            break;
        }
        if (params.tags.length === 0 && (Twinkle.tag.modeEn !== "article" || params.tagsToRemove.length === 0)) {
          void mw.notify(window.wgULS("必须选择至少一个标记!", "必須選擇至少一個標記!"), {
            type: "warn",
            tag: "friendlytag"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Morebits.wiki.actionCompleted.redirect = Morebits.pageNameNorm;
        Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成,将在几秒内刷新页面", "標記完成,將在幾秒內重新整理頁面");
        if (Twinkle.tag.modeEn === "redirect") {
          Morebits.wiki.actionCompleted.followRedirect = false;
        }
        const qiuwen_page = new Morebits.wiki.page(Morebits.pageNameNorm, window.wgULS("正在标记", "正在標記") + Twinkle.tag.mode);
        qiuwen_page.setCallbackParameters(params);
        qiuwen_page.load(Twinkle.tag.callbacks[Twinkle.tag.modeEn]);
      };
      Twinkle.addInitCallback(Twinkle.tag, "tag");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklestub.js
var twinklestub_exports = {};
var import_ext_gadget4;
var init_twinklestub = __esm({
  "src/Twinkle/modules/twinklestub.js"() {
    "use strict";
    import_ext_gadget4 = require("ext.gadget.Util");
    /*! Twinkle.js - twinklestub.js */
    (function twinklestub($) {
      Twinkle.stub = () => {
        if (Morebits.isPageRedirect()) {
        } else if ([0, 118].includes(mw.config.get("wgNamespaceNumber")) && mw.config.get("wgCurRevisionId") || Morebits.pageNameNorm === Twinkle.getPref("sandboxPage")) {
          Twinkle.stub.mode = "条目";
          Twinkle.addPortletLink(Twinkle.stub.callback, "小作品", "friendly-tag", "标记小作品");
        }
      };
      Twinkle.stub.callback = () => {
        if (Morebits.isPageRedirect()) {
        } else if ((mw.config.get("wgNamespaceNumber") === 0 || mw.config.get("wgNamespaceNumber") === 118) && mw.config.get("wgCurRevisionId") || Morebits.pageNameNorm === Twinkle.getPref("sandboxPage")) {
          Twinkle.stub.mode = window.wgULS("条目", "條目");
          Twinkle.addPortletLink(Twinkle.stub.callback, "小作品", "friendly-tag", window.wgULS("标记小作品", "標記小作品"));
        }
      };
      Twinkle.stub.callback = () => {
        const Window = new Morebits.simpleWindow(630, Twinkle.stub.mode === "article" ? 450 : 400);
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("小作品說明", "小作品说明"), "QW:小作品");
        Window.addFooterLink(window.wgULS("小作品设置", "小作品設定"), "H:TW/PREF#stub");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#stub");
        const form = new Morebits.quickForm(Twinkle.stub.callback.evaluate);
        if (document.querySelectorAll(".patrollink").length) {
          form.append({
            type: "checkbox",
            list: [{
              label: window.wgULS("标记页面为已巡查", "標記頁面為已巡查"),
              value: "patrolPage",
              name: "patrolPage",
              checked: Twinkle.getPref("markStubbedPagesAsPatrolled")
            }]
          });
        }
        switch (Twinkle.stub.mode) {
          case "條目":
          case "条目":
            Window.setTitle(window.wgULS("条目小作品标记", "條目小作品標記"));
            form.append({
              type: "select",
              name: "sortorder",
              label: window.wgULS("查看列表:", "檢視列表:"),
              tooltip: window.wgULS("您可以在Twinkle参数设置(H:TW/PREF)中更改此项。", "您可以在Twinkle偏好設定(H:TW/PREF)中更改此項。"),
              event: Twinkle.stub.updateSortOrder,
              list: [{
                type: "option",
                value: "cat",
                label: window.wgULS("按类型", "按類別"),
                selected: Twinkle.getPref("stubArticleSortOrder") === "cat"
              }, {
                type: "option",
                value: "alpha",
                label: "按字母",
                selected: Twinkle.getPref("stubArticleSortOrder") === "alpha"
              }]
            });
            form.append({
              type: "div",
              id: "tagWorkArea"
            });
            break;
          default:
            void mw.notify("Twinkle.stub:未知模式 ".concat(Twinkle.stub.mode), {
              type: "warn",
              tag: "twinklestub"
            });
            break;
        }
        form.append({
          type: "submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        if (["条目", "條目"].includes(Twinkle.stub.mode)) {
          const evt = document.createEvent("Event");
          evt.initEvent("change", true, true);
          result.sortorder.dispatchEvent(evt);
        }
      };
      Twinkle.stub.checkedTags = [];
      Twinkle.stub.updateSortOrder = (e) => {
        const sortorder = e.target.value;
        Twinkle.stub.checkedTags = e.target.form.getChecked("articleTags");
        if (!Twinkle.stub.checkedTags) {
          Twinkle.stub.checkedTags = [];
        }
        const container = new Morebits.quickForm.element({
          type: "fragment"
        });
        const makeCheckbox = (tag, description) => {
          const checkbox = {
            value: tag,
            label: "{{".concat(tag, "}}: ").concat(description)
          };
          if (Twinkle.stub.checkedTags.includes(tag)) {
            checkbox.checked = true;
          }
          return checkbox;
        };
        if (Twinkle.getPref("customStubList").length) {
          container.append({
            type: "header",
            label: window.wgULS("自定义模板", "自訂模板")
          });
          const customcheckboxes = [];
          var _iterator47 = _createForOfIteratorHelper(Twinkle.getPref("customStubList")), _step47;
          try {
            for (_iterator47.s(); !(_step47 = _iterator47.n()).done; ) {
              const item = _step47.value;
              customcheckboxes[customcheckboxes.length] = makeCheckbox(item.value, item.label);
            }
          } catch (err) {
            _iterator47.e(err);
          } finally {
            _iterator47.f();
          }
          container.append({
            type: "checkbox",
            name: "articleTags",
            list: customcheckboxes
          });
        }
        if (sortorder === "cat") {
          const doCategoryCheckboxes = (subdiv, array) => {
            const checkboxes = [];
            var _iterator48 = _createForOfIteratorHelper(array), _step48;
            try {
              for (_iterator48.s(); !(_step48 = _iterator48.n()).done; ) {
                const tag = _step48.value;
                const description = Twinkle.stub.article.tags[tag];
                checkboxes[checkboxes.length] = makeCheckbox(tag, description);
              }
            } catch (err) {
              _iterator48.e(err);
            } finally {
              _iterator48.f();
            }
            subdiv.append({
              type: "checkbox",
              name: "articleTags",
              list: checkboxes
            });
          };
          let i = 0;
          for (var _i11 = 0, _Object$entries6 = Object.entries(Twinkle.stub.article.tagCategories); _i11 < _Object$entries6.length; _i11++) {
            const [title, content] = _Object$entries6[_i11];
            const titleName = Twinkle.stub.article.tagCategoriesHeader[title];
            container.append({
              type: "header",
              id: "tagHeader".concat(i),
              label: titleName
            });
            const subdiv = container.append({
              type: "div",
              id: "tagSubdiv".concat(i++)
            });
            if (Array.isArray(content)) {
              doCategoryCheckboxes(subdiv, content);
            } else {
              for (var _i12 = 0, _Object$entries7 = Object.entries(content); _i12 < _Object$entries7.length; _i12++) {
                const [subtitle, subcontent] = _Object$entries7[_i12];
                subdiv.append({
                  type: "div",
                  label: [Morebits.htmlNode("b", subtitle)]
                });
                doCategoryCheckboxes(subdiv, subcontent);
              }
            }
          }
        } else {
          const checkboxes = [];
          for (var _i13 = 0, _Object$entries8 = Object.entries(Twinkle.stub.article.tags); _i13 < _Object$entries8.length; _i13++) {
            const [tag, description] = _Object$entries8[_i13];
            checkboxes[checkboxes.length] = makeCheckbox(tag, description);
          }
          container.append({
            type: "checkbox",
            name: "articleTags",
            list: checkboxes
          });
        }
        const $workarea = $(e.target.form).find("div#tagWorkArea");
        const rendered = container.render();
        $workarea.empty().append(rendered);
        $workarea.find("h5").css({
          "font-size": "110%"
        });
        $workarea.find("h5:not(:first-child)").css({
          "margin-top": "1em"
        });
        $workarea.find("div").filter(":has(span.quickformDescription)").css({
          "margin-top": "0.4em"
        });
        var _iterator49 = _createForOfIteratorHelper(Morebits.quickForm.getElements(e.target.form, "articleTags")), _step49;
        try {
          for (_iterator49.s(); !(_step49 = _iterator49.n()).done; ) {
            const checkbox = _step49.value;
            const $checkbox = $(checkbox);
            const link = Morebits.htmlNode("a", ">");
            link.setAttribute("class", "tag-template-link");
            link.setAttribute("href", mw.util.getUrl("Template:".concat(Morebits.string.toUpperCaseFirstChar(checkbox.values))));
            link.setAttribute("target", "_blank");
            link.setAttribute("rel", "noopener noreferrer");
            $checkbox.parent().append([" ", link]);
          }
        } catch (err) {
          _iterator49.e(err);
        } finally {
          _iterator49.f();
        }
      };
      Twinkle.stub.article = {};
      Twinkle.stub.article.tags = {
        "actor-stub": "演员",
        "asia-stub": "亚洲",
        "bio-stub": "人物",
        "biology-stub": "生物学",
        "chem-stub": "化学",
        "europe-stub": "欧洲",
        "expand list": "未完成列表",
        "food-stub": "食物",
        "france-geo-stub": "法国地理",
        "geo-stub": "地理位置",
        "hist-stub": "历史或历史学",
        "JP-stub": "日本",
        "lit-stub": "文学",
        "math-stub": "数学",
        "med-stub": "医学",
        "mil-stub": "军事",
        "movie-stub": "电影",
        "music-stub": "音乐",
        "physics-stub": "物理学",
        "politic-stub": "政治",
        "religion-stub": "宗教",
        "science-stub": "科学",
        "sport-stub": "体育",
        stub: "通用小作品",
        "switzerland-stub": "瑞士",
        "tech-stub": "科技",
        "transp-stub": "交通",
        "TV-stub": "电视",
        "UK-stub": "英国",
        "US-bio-stub": "美国人物",
        "US-geo-stub": "美国地理",
        "US-stub": "美国",
        "weather-stub": "天气和特别的天气事件"
      };
      Twinkle.stub.article.tagCategoriesHeader = {
        general: "通用模板",
        geo: "国家和地理",
        others: "杂项",
        bio: "人物",
        science: "科学",
        sport: "体育",
        tech: "技术",
        art: "艺术"
      };
      Twinkle.stub.article.tagCategories = {
        general: ["stub", "expand list"],
        geo: ["asia-stub", "europe-stub", "france-geo-stub", "geo-stub", "JP-stub", "switzerland-stub", "UK-stub", "US-bio-stub", "US-geo-stub", "US-stub"],
        others: ["food-stub", "hist-stub", "mil-stub", "politic-stub", "religion-stub", "transp-stub"],
        bio: ["actor-stub", "bio-stub", "US-bio-stub"],
        science: ["biology-stub", "chem-stub", "math-stub", "med-stub", "physics-stub", "science-stub", "weather-stub"],
        sport: ["sport-stub"],
        tech: ["tech-stub"],
        art: ["actor-stub", "lit-stub", "movie-stub", "music-stub", "TV-stub"]
      };
      Twinkle.stub.callbacks = {
        main: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          let tagRe;
          let summaryText = "加入";
          let tags = [];
          const groupableTags = [];
          let i;
          let pageText = pageobj.getPageText();
          for (i = 0; i < params.tags.length; i++) {
            tagRe = new RegExp("(\\{\\{".concat(params.tags[i], "(\\||\\}\\}))"), "im");
            if (tagRe.exec(pageText)) {
              Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("在页面上找到{{".concat(params.tags[i], "}}……跳过"), "在頁面上找到{{".concat(params.tags[i], "}}……跳過")));
            } else {
              tags = [...tags, ...(0, import_ext_gadget4.generateArray)(params.tags[i])];
            }
          }
          tags = [...tags, ...groupableTags];
          tags.sort();
          const totalTags = tags.length;
          const addTag = (tagName, tagIndex) => {
            pageText += "\n{{".concat(tagName, "}}");
            if (tagIndex > 0) {
              if (tagIndex === totalTags - 1) {
                summaryText += "和";
              } else if (tagIndex < totalTags - 1) {
                summaryText += "、";
              }
            }
            summaryText += "{{[[";
            summaryText += tagName.includes(":") ? tagName : "Template:".concat(tagName, "|").concat(tagName);
            summaryText += "]]}}";
          };
          for (var _i14 = 0, _tags3 = tags; _i14 < _tags3.length; _i14++) {
            const tag = _tags3[_i14];
            addTag(tag);
          }
          summaryText += window.wgULS("标记到", "標記到") + Twinkle.stub.mode;
          pageobj.setPageText(pageText);
          pageobj.setEditSummary(summaryText);
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setWatchlist(Twinkle.getPref("watchStubbedPages"));
          pageobj.setMinorEdit(Twinkle.getPref("markStubbedPagesAsMinor"));
          pageobj.setCreateOption("nocreate");
          pageobj.save();
          if (params.patrol) {
            pageobj.patrol();
          }
        }
      };
      Twinkle.stub.callback.evaluate = (e) => {
        const form = e.target;
        const params = {};
        if (form.patrolPage) {
          params.patrol = form.patrolPage.checked;
        }
        switch (Twinkle.stub.mode) {
          case "條目":
          case "条目":
            params.tags = form.getChecked("articleTags");
            params.group = false;
            break;
          default:
            void mw.notify("Twinkle.stub:未知模式 ".concat(Twinkle.stub.mode), {
              type: "warn",
              tag: "twinklestub"
            });
            break;
        }
        if (!params.tags.length) {
          void mw.notify("必须选择至少一个标记!", {
            type: "warn",
            tag: "twinklestub"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
        Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成,将在几秒内刷新页面", "標記完成,將在幾秒內重新整理頁面");
        if (Twinkle.stub.mode === "重定向") {
          Morebits.wiki.actionCompleted.followRedirect = false;
        }
        const qiuwen_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("正在标记", "正在標記") + Twinkle.stub.mode);
        qiuwen_page.setCallbackParameters(params);
        switch (Twinkle.stub.mode) {
          case "條目":
          case "条目":
          case "重定向":
            qiuwen_page.load(Twinkle.stub.callbacks.main);
            return;
          case "文件":
          case "檔案":
            qiuwen_page.load(Twinkle.stub.callbacks.file);
            break;
          default:
            void mw.notify("Twinkle.stub:未知模式 ".concat(Twinkle.stub.mode), {
              type: "warn",
              tag: "twinklestub"
            });
            break;
        }
      };
      Twinkle.addInitCallback(Twinkle.stub, "stub");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklediff.js
var twinklediff_exports = {};
var init_twinklediff = __esm({
  "src/Twinkle/modules/twinklediff.js"() {
    "use strict";
    /*! Twinkle.js - twinklediff.js */
    (function twinklediff($) {
      Twinkle.diff = () => {
        if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId")) {
          return;
        }
        Twinkle.addPortletLink(mw.util.getUrl(mw.config.get("wgPageName"), {
          diff: "cur",
          oldid: "prev"
        }), window.wgULS("最后", "最後"), "tw-lastdiff", window.wgULS("显示最后修改", "顯示最後修改"));
        if (mw.config.get("wgDiffNewId")) {
          Twinkle.addPortletLink(() => {
            Twinkle.diff.evaluate(false);
          }, "自上", "tw-since", window.wgULS("显示与上一修订版本间的差异", "顯示與上一修訂版本間的差異"));
          Twinkle.addPortletLink(() => {
            Twinkle.diff.evaluate(true);
          }, "自我", "tw-sincemine", window.wgULS("显示与我做出的修订版本的差异", "顯示與我做出的修訂版本的差異"));
          Twinkle.addPortletLink(mw.util.getUrl(mw.config.get("wgPageName"), {
            diff: "cur",
            oldid: mw.config.get("wgDiffNewId")
          }), window.wgULS("当前", "目前"), "tw-curdiff", window.wgULS("显示与当前版本间的差异", "顯示與目前版本間的差異"));
        }
      };
      Twinkle.diff.evaluate = (me) => {
        let user;
        if (me) {
          user = mw.config.get("wgUserName");
        } else {
          const node = document.querySelector("#mw-diff-ntitle2");
          if (!node) {
            return;
          }
          user = $(node).find("a").first().text();
        }
        const query = {
          prop: "revisions",
          action: "query",
          titles: mw.config.get("wgPageName"),
          rvlimit: 1,
          rvprop: ["ids", "user"],
          rvstartid: mw.config.get("wgCurRevisionId") - 1,
          rvuser: user
        };
        Morebits.status.init(document.querySelector("#mw-content-text"));
        const qiuwen_api = new Morebits.wiki.api(window.wgULS("抓取最初贡献者信息", "抓取最初貢獻者資訊"), query, Twinkle.diff.callbacks.main);
        qiuwen_api.params = {
          user
        };
        qiuwen_api.post();
      };
      Twinkle.diff.callbacks = {
        main: (self) => {
          const xmlDoc = self.responseXML;
          const revid = $(xmlDoc).find("rev").attr("revid");
          if (!revid) {
            self.statelem.error(window.wgULS("未找到合适的早期版本,或 ", "未找到合適的早期版本,或 ") + self.params.user + window.wgULS(" 是唯一贡献者。取消。", " 是唯一貢獻者。取消。"));
            return;
          }
          location = mw.util.getUrl(mw.config.get("wgPageName"), {
            diff: mw.config.get("wgCurRevisionId"),
            oldid: revid
          });
        }
      };
      Twinkle.addInitCallback(Twinkle.diff, "diff");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinkleunlink.js
var twinkleunlink_exports = {};
var init_twinkleunlink = __esm({
  "src/Twinkle/modules/twinkleunlink.js"() {
    "use strict";
    /*! Twinkle.js - twinkleunlink.js */
    (function twinkleunlink($) {
      Twinkle.unlink = () => {
        if (mw.config.get("wgNamespaceNumber") < 0 || mw.config.get("wgPageName") === Twinkle.getPref("sandboxPage") || !Morebits.userIsSysop) {
          return;
        }
        Twinkle.addPortletLink(Twinkle.unlink.callback, window.wgULS("消链", "消連"), "tw-unlink", window.wgULS("取消到本页的链接", "取消到本頁的連結"));
      };
      Twinkle.unlink.callback = (presetReason) => {
        const fileSpace = mw.config.get("wgNamespaceNumber") === 6;
        const Window = new Morebits.simpleWindow(600, 440);
        Window.setTitle(window.wgULS("取消链入", "取消連入") + (fileSpace ? window.wgULS("和模板、文件使用", "和模板、檔案使用") : ""));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("链入设置", "連入設定"), "H:TW/PREF#unlink");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#unlink");
        const form = new Morebits.quickForm(Twinkle.unlink.callback.evaluate);
        const linkTextBefore = Morebits.htmlNode("code", "[[".concat(fileSpace ? ":" : "").concat(Morebits.pageNameNorm).concat(window.wgULS("|链接文字]]", "|連結文字]]")));
        const linkTextAfter = Morebits.htmlNode("code", window.wgULS("链接文字", "連結文字"));
        const linkPlainBefore = Morebits.htmlNode("code", "[[".concat(Morebits.pageNameNorm, "]]"));
        const linkTemplateBefore = Morebits.htmlNode("code", "{{".concat(mw.config.get("wgTitle"), "}}"));
        let linkPlainAfter;
        if (fileSpace) {
          linkPlainAfter = Morebits.htmlNode("code", "<!-- [[".concat(Morebits.pageNameNorm, "]] -->"));
        } else {
          linkPlainAfter = Morebits.htmlNode("code", Morebits.pageNameNorm);
        }
        for (var _i15 = 0, _arr2 = [linkTextBefore, linkTextAfter, linkPlainBefore, linkPlainAfter, linkTemplateBefore]; _i15 < _arr2.length; _i15++) {
          const node = _arr2[_i15];
          node.style.fontFamily = "monospace";
          node.style.fontStyle = "normal";
        }
        form.append({
          type: "div",
          style: "margin-bottom: 0.5em; font-style: normal",
          label: ["".concat(window.wgULS("这个工具可以取消所有指向该页的链接(“链入”)", "這個工具可以取消所有指向該頁的連結(「連入」)") + (fileSpace ? window.wgULS(",或通过加入<!-- -->注释标记隐藏所有对此文件的使用", ",或透過加入<!-- -->注釋標記隱藏所有對此檔案的使用") : ""), "。例如:"), linkTextBefore, window.wgULS("将会变成", "將會變成"), linkTextAfter, ",", linkPlainBefore, window.wgULS("将会变成", "將會變成"), linkPlainAfter, ",", linkTemplateBefore, window.wgULS("将会被移除", "將會被移除"), window.wgULS("。请小心使用。", "。請小心使用。")]
        });
        form.append({
          type: "input",
          name: "reason",
          label: "理由:",
          value: presetReason || "",
          size: 60
        });
        const query = {
          action: "query",
          list: "backlinks",
          bltitle: mw.config.get("wgPageName"),
          bllimit: "max",
          // 500 is max for normal users, 5000 for bots and sysops
          blnamespace: Twinkle.getPref("unlinkNamespaces"),
          rawcontinue: true,
          format: "json"
        };
        if (fileSpace) {
          query.list += "|imageusage";
          query.iutitle = query.bltitle;
          query.iulimit = query.bllimit;
          query.iunamespace = query.blnamespace;
        } else {
          query.blfilterredir = "nonredirects";
        }
        const qiuwen_api = new Morebits.wiki.api(window.wgULS("抓取链入", "抓取連入"), query, Twinkle.unlink.callbacks.display.backlinks);
        qiuwen_api.params = {
          form,
          Window,
          image: fileSpace
        };
        qiuwen_api.post();
        const root = document.createElement("div");
        root.style.padding = "15px";
        Morebits.status.init(root);
        qiuwen_api.statelem.status(window.wgULS("加载中……", "載入中……"));
        Window.setContent(root);
        Window.display();
      };
      Twinkle.unlink.callback.evaluate = (event) => {
        const form = event.target;
        const input = Morebits.quickForm.getInputData(form);
        if (!input.reason) {
          void mw.notify(window.wgULS("您必须指定取消链入的理由。", "您必須指定取消連入的理由。"), {
            type: "warn",
            tag: "twinkleunlink"
          });
          return;
        }
        input.backlinks || (input.backlinks = []);
        input.imageusage || (input.imageusage = []);
        const pages = Morebits.array.uniq([...input.backlinks, ...input.imageusage]);
        if (!pages.length) {
          void mw.notify(window.wgULS("您必须至少选择一个要取消链入的页面。", "您必須至少選擇一個要取消連入的頁面。"), {
            type: "warn",
            tag: "twinkleunlink"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        const unlinker = new Morebits.batchOperation("取消".concat(input.backlinks.length ? window.wgULS("链入", "連入") + (input.imageusage.length ? window.wgULS("与文件使用", "與檔案使用") : "") : window.wgULS("文件使用", "檔案使用")));
        unlinker.setOption("preserveIndividualStatusLines", true);
        unlinker.setPageList(pages);
        const params = {
          reason: input.reason,
          unlinker
        };
        unlinker.run((pageName) => {
          const qiuwen_page = new Morebits.wiki.page(pageName, window.wgULS("在页面“", "在頁面「") + pageName + window.wgULS("”中取消链入", "」中取消連入"));
          qiuwen_page.setBotEdit(true);
          qiuwen_page.setCallbackParameters({
            doBacklinks: input.backlinks.includes(pageName),
            doImageusage: input.imageusage.includes(pageName),
            ...params
          });
          qiuwen_page.load(Twinkle.unlink.callbacks.unlinkBacklinks);
        });
      };
      Twinkle.unlink.callbacks = {
        display: {
          backlinks: (apiobj) => {
            const response = apiobj.getResponse();
            let havecontent = false;
            let list;
            let namespaces;
            let i;
            if (apiobj.params.image) {
              const imageusage = response.query.imageusage.sort(Twinkle.sortByNamespace);
              list = [];
              for (i = 0; i < imageusage.length; ++i) {
                list[list.length] = {
                  label: "",
                  value: imageusage[i].title,
                  checked: true
                };
              }
              if (list.length) {
                apiobj.params.form.append({
                  type: "header",
                  label: window.wgULS("文件使用", "檔案使用")
                });
                namespaces = [];
                var _iterator50 = _createForOfIteratorHelper(Twinkle.getPref("unlinkNamespaces")), _step50;
                try {
                  for (_iterator50.s(); !(_step50 = _iterator50.n()).done; ) {
                    const v = _step50.value;
                    namespaces[namespaces.length] = v === "0" ? window.wgULS("(条目)", "(條目)") : mw.config.get("wgFormattedNamespaces")[v];
                  }
                } catch (err) {
                  _iterator50.e(err);
                } finally {
                  _iterator50.f();
                }
                apiobj.params.form.append({
                  type: "div",
                  label: window.wgULS("已选择的命名空间:", "已選擇的命名空間:") + namespaces.join("、"),
                  tooltip: window.wgULS("您可在Twinkle参数设置中更改相关选项,请参见[[H:TW/PREF]]", "您可在Twinkle偏好設定中更改相關選項,請參見[[H:TW/PREF]]")
                });
                if (response["query-continue"] && response["query-continue"].imageusage) {
                  apiobj.params.form.append({
                    type: "div",
                    label: window.wgULS("显示前", "顯示前") + mw.language.convertNumber(list.length) + window.wgULS("个文件使用。", "個檔案使用。")
                  });
                }
                apiobj.params.form.append({
                  type: "button",
                  label: window.wgULS("全选", "全選"),
                  event: (e) => {
                    $(Morebits.quickForm.getElements(e.target.form, "imageusage")).prop("checked", true);
                  }
                });
                apiobj.params.form.append({
                  type: "button",
                  label: window.wgULS("全不选", "全不選"),
                  event: (e) => {
                    $(Morebits.quickForm.getElements(e.target.form, "imageusage")).prop("checked", false);
                  }
                });
                apiobj.params.form.append({
                  type: "checkbox",
                  name: "imageusage",
                  shiftClickSupport: true,
                  list
                });
                havecontent = true;
              } else {
                apiobj.params.form.append({
                  type: "div",
                  label: window.wgULS("未找到文件使用。", "未找到檔案使用。")
                });
              }
            }
            const backlinks = response.query.backlinks.sort(Twinkle.sortByNamespace);
            if (backlinks.length > 0) {
              list = [];
              for (i = 0; i < backlinks.length; ++i) {
                list[list.length] = {
                  label: "",
                  value: backlinks[i].title,
                  checked: true
                };
              }
              apiobj.params.form.append({
                type: "header",
                label: window.wgULS("链入", "連入")
              });
              namespaces = [];
              var _iterator51 = _createForOfIteratorHelper(Twinkle.getPref("unlinkNamespaces")), _step51;
              try {
                for (_iterator51.s(); !(_step51 = _iterator51.n()).done; ) {
                  const v = _step51.value;
                  namespaces[namespaces.length] = v === "0" ? window.wgULS("(条目)", "(條目)") : mw.config.get("wgFormattedNamespaces")[v];
                }
              } catch (err) {
                _iterator51.e(err);
              } finally {
                _iterator51.f();
              }
              apiobj.params.form.append({
                type: "div",
                label: window.wgULS("已选择的命名空间:", "已選擇的命名空間:") + namespaces.join("、"),
                tooltip: window.wgULS("您可在Twinkle参数设置中更改相关选项,请参见[[H:TW/PREF]]", "您可在Twinkle偏好設定中更改相關選項,請參見[[H:TW/PREF]]")
              });
              if (response["query-continue"] && response["query-continue"].backlinks) {
                apiobj.params.form.append({
                  type: "div",
                  label: window.wgULS("显示前", "顯示前") + mw.language.convertNumber(list.length) + window.wgULS("个链入。", "個連入。")
                });
              }
              apiobj.params.form.append({
                type: "button",
                label: window.wgULS("全选", "全選"),
                event: (e) => {
                  $(Morebits.quickForm.getElements(e.target.form, "backlinks")).prop("checked", true);
                }
              });
              apiobj.params.form.append({
                type: "button",
                label: window.wgULS("全不选", "全不選"),
                event: (e) => {
                  $(Morebits.quickForm.getElements(e.target.form, "backlinks")).prop("checked", false);
                }
              });
              apiobj.params.form.append({
                type: "checkbox",
                name: "backlinks",
                shiftClickSupport: true,
                list
              });
              havecontent = true;
            } else {
              apiobj.params.form.append({
                type: "div",
                label: window.wgULS("未找到链入。", "未找到連入。")
              });
            }
            if (havecontent) {
              apiobj.params.form.append({
                type: "submit"
              });
            }
            const result = apiobj.params.form.render();
            apiobj.params.Window.setContent(result);
            var _iterator52 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "backlinks")), _step52;
            try {
              for (_iterator52.s(); !(_step52 = _iterator52.n()).done; ) {
                const link = _step52.value;
                Twinkle.generateBatchPageLinks(link);
              }
            } catch (err) {
              _iterator52.e(err);
            } finally {
              _iterator52.f();
            }
            var _iterator53 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "imageusage")), _step53;
            try {
              for (_iterator53.s(); !(_step53 = _iterator53.n()).done; ) {
                const link = _step53.value;
                Twinkle.generateBatchPageLinks(link);
              }
            } catch (err) {
              _iterator53.e(err);
            } finally {
              _iterator53.f();
            }
          }
        },
        unlinkBacklinks: (pageobj) => {
          let oldtext = pageobj.getPageText();
          const params = pageobj.getCallbackParameters();
          const qiuwen_page = new Morebits.wikitext.page(oldtext);
          let summaryText = "";
          let warningString = false;
          let text;
          if (params.doImageusage) {
            text = qiuwen_page.commentOutImage(mw.config.get("wgTitle"), window.wgULS("注释", "注釋")).getText();
            if (text === oldtext) {
              warningString = window.wgULS("文件使用", "檔案使用");
            } else {
              summaryText = window.wgULS("注释文件使用", "注釋檔案使用");
              oldtext = text;
            }
          }
          if (params.doBacklinks) {
            text = qiuwen_page.removeLink(Morebits.pageNameNorm).getText();
            text = qiuwen_page.removeTemplate(mw.config.get("wgTitle")).getText();
            if (text === oldtext) {
              warningString = warningString ? window.wgULS("取消链入或文件使用", "取消連入或檔案使用") : window.wgULS("取消链入", "取消連入");
            } else {
              summaryText = (summaryText ? "".concat(summaryText, " / ") : "") + window.wgULS("取消链结到", "取消連結到");
              oldtext = text;
            }
          }
          if (warningString) {
            pageobj.getStatusElement().error("".concat(window.wgULS("未能在页面上找到", "未能在頁面上找到") + warningString, "。"));
            params.unlinker.workerFailure(pageobj);
            return;
          }
          pageobj.setPageText(text);
          pageobj.setEditSummary(summaryText + window.wgULS("“", "「") + Morebits.pageNameNorm + window.wgULS("”:", "」:") + params.reason);
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setCreateOption("nocreate");
          pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
        }
      };
      Twinkle.addInitCallback(Twinkle.unlink, "unlink");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklefluff.js
var twinklefluff_exports = {};
var init_twinklefluff = __esm({
  "src/Twinkle/modules/twinklefluff.js"() {
    "use strict";
    /*! Twinkle.js - twinklefluff.js */
    (function twinklefluff($) {
      const $body = $("body");
      Twinkle.fluff = () => {
        if (mw.config.get("wgIsProbablyEditable")) {
          if (mw.config.get("wgDiffNewId") || mw.config.get("wgDiffOldId")) {
            mw.hook("wikipage.diff").add(() => {
              Twinkle.fluff.addLinks.diff();
            });
          } else if (mw.config.get("wgAction") === "view" && mw.config.get("wgRevisionId") && mw.config.get("wgCurRevisionId") !== mw.config.get("wgRevisionId")) {
            Twinkle.fluff.addLinks.oldid();
          } else if (mw.config.get("wgAction") === "history") {
            Twinkle.fluff.addLinks.history();
          }
        } else if (mw.config.get("wgNamespaceNumber") === -1) {
          Twinkle.fluff.skipTalk = !Twinkle.getPref("openTalkPageOnAutoRevert");
          Twinkle.fluff.rollbackInPlace = Twinkle.getPref("rollbackInPlace");
          if (mw.config.get("wgCanonicalSpecialPageName") === "Contributions") {
            Twinkle.fluff.addLinks.contributions();
          } else if (mw.config.get("wgCanonicalSpecialPageName") === "Recentchanges" || mw.config.get("wgCanonicalSpecialPageName") === "Recentchangeslinked") {
            mw.hook("wikipage.content").add((item) => {
              if (item.is("div")) {
                Twinkle.fluff.addLinks.recentchanges();
              }
            });
          }
        }
      };
      Twinkle.fluff.trustedBots = [];
      Twinkle.fluff.skipTalk = null;
      Twinkle.fluff.rollbackInPlace = null;
      Twinkle.fluff.hiddenName = window.wgULS("已隐藏的用户", "已隱藏的使用者");
      Twinkle.fluff.linkBuilder = {
        spanTag: (color, content) => {
          const span = document.createElement("span");
          span.style.color = color;
          span.appendChild(document.createTextNode(content));
          return span;
        },
        buildLink: (color, text) => {
          const link = document.createElement("a");
          link.appendChild(Twinkle.fluff.linkBuilder.spanTag("Black", "["));
          link.appendChild(Twinkle.fluff.linkBuilder.spanTag(color, text));
          link.appendChild(Twinkle.fluff.linkBuilder.spanTag("Black", "]"));
          link.href = "#";
          return link;
        },
        /**
         * @param {string} [vandal=null] - Username of the editor being reverted
         * Provide a falsey value if the username is hidden, defaults to null
         * @param {boolean} inline - True to create two links in a span, false
         * to create three links in a div (optional)
         * @param {number|string} [rev=wgCurRevisionId] - Revision ID being reverted (optional)
         * @param {string} [page=wgPageName] - Page being reverted (optional)
         * @return {HTMLElement} revNode
         */
        rollbackLinks: (vandal, inline, rev, page) => {
          vandal || (vandal = null);
          const elem = inline ? "span" : "div";
          const revNode = document.createElement(elem);
          rev = Number.parseInt(rev, 10);
          if (rev) {
            revNode.setAttribute("id", "tw-revert".concat(rev));
          } else {
            revNode.setAttribute("id", "tw-revert");
          }
          const normNode = document.createElement("strong");
          const vandNode = document.createElement("strong");
          const normLink = Twinkle.fluff.linkBuilder.buildLink("SteelBlue", "回退");
          const vandLink = Twinkle.fluff.linkBuilder.buildLink("Red", window.wgULS("破坏", "破壞"));
          $(normLink).on("click", (e) => {
            e.preventDefault();
            Twinkle.fluff.revert("norm", vandal, rev, page);
            Twinkle.fluff.disableLinks(revNode);
          });
          $(vandLink).on("click", (e) => {
            e.preventDefault();
            Twinkle.fluff.revert("vand", vandal, rev, page);
            Twinkle.fluff.disableLinks(revNode);
          });
          vandNode.appendChild(vandLink);
          normNode.appendChild(normLink);
          const separator = inline ? " " : " || ";
          revNode.appendChild(normNode);
          revNode.appendChild(document.createTextNode(separator));
          revNode.appendChild(vandNode);
          return revNode;
        },
        // Build [restore this revision] links
        restoreThisRevisionLink: (revisionRef, inline) => {
          revisionRef = typeof revisionRef === "number" ? revisionRef : mw.config.get(revisionRef);
          const elem = inline ? "span" : "div";
          const revertToRevisionNode = document.createElement(elem);
          revertToRevisionNode.setAttribute("id", "tw-revert-to-".concat(revisionRef));
          revertToRevisionNode.style.fontWeight = "bold";
          const revertToRevisionLink = Twinkle.fluff.linkBuilder.buildLink("SaddleBrown", window.wgULS("恢复此版本", "恢復此版本"));
          $(revertToRevisionLink).on("click", (e) => {
            e.preventDefault();
            Twinkle.fluff.revertToRevision(revisionRef);
          });
          if (inline) {
            revertToRevisionNode.appendChild(document.createTextNode(" "));
          }
          revertToRevisionNode.appendChild(revertToRevisionLink);
          return revertToRevisionNode;
        }
      };
      Twinkle.fluff.addLinks = {
        contributions: () => {
          const isRange = !!$body.find("#sp-contributions-footer-anon-range")[0];
          if (mw.config.exists("wgRelevantUserName") || isRange) {
            let username = mw.config.get("wgRelevantUserName");
            if (Twinkle.getPref("showRollbackLinks").includes("contribs") || mw.config.get("wgUserName") !== username && Twinkle.getPref("showRollbackLinks").includes("others") || mw.config.get("wgUserName") === username && Twinkle.getPref("showRollbackLinks").includes("mine")) {
              const $list = $body.find("#mw-content-text").find("ul li:has(span.mw-uctop):has(.mw-changeslist-diff)");
              $list.each((_key, current) => {
                const page = $(current).find(".mw-contributions-title").text();
                if (isRange) {
                  username = $(current).find(".mw-userlink:not(.history-deleted)").text();
                }
                current.appendChild(Twinkle.fluff.linkBuilder.rollbackLinks(username, true, current.dataset.mwRevid, page));
              });
            }
          }
        },
        recentchanges: () => {
          if (mw.config.get("wgCanonicalSpecialPageName") === "Recentchanges" && Twinkle.getPref("showRollbackLinks").includes("recentchanges") || mw.config.get("wgCanonicalSpecialPageName") === "Recentchangeslinked" && Twinkle.getPref("showRollbackLinks").includes("recentchangeslinked")) {
            let $list = $body.find(".mw-changeslist .mw-changeslist-last.mw-changeslist-src-mw-edit");
            $list = $list.not(".mw-rcfilters-ui-highlights-enhanced-toplevel").find(".mw-changeslist-line-inner, td.mw-enhanced-rc-nested");
            $list.each((_key, current) => {
              const vandal = $(current).find(".mw-userlink:not(.history-deleted)").text();
              const href = $(current).find(".mw-changeslist-diff").attr("href");
              const rev = mw.util.getParamValue("diff", href);
              const page = current.dataset.targetPage;
              current.appendChild(Twinkle.fluff.linkBuilder.rollbackLinks(vandal, true, rev, page));
            });
          }
        },
        history: () => {
          if (Twinkle.getPref("showRollbackLinks").includes("history")) {
            const histList = $body.find("#pagehistory li").toArray();
            if (!$body.find("a.mw-firstlink").length) {
              const first = histList.shift();
              const vandal = $(first).find(".mw-userlink:not(.history-deleted)").text();
              var _iterator54 = _createForOfIteratorHelper(histList), _step54;
              try {
                for (_iterator54.s(); !(_step54 = _iterator54.n()).done; ) {
                  const item = _step54.value;
                  if ($(item).find(".mw-userlink").text() !== vandal) {
                    first.appendChild(Twinkle.fluff.linkBuilder.rollbackLinks(vandal, true));
                    break;
                  }
                }
              } catch (err) {
                _iterator54.e(err);
              } finally {
                _iterator54.f();
              }
            }
            var _iterator55 = _createForOfIteratorHelper(histList), _step55;
            try {
              for (_iterator55.s(); !(_step55 = _iterator55.n()).done; ) {
                const rev = _step55.value;
                const {
                  href
                } = rev.querySelector(".mw-changeslist-date");
                const oldid = Number.parseInt(mw.util.getParamValue("oldid", href), 10);
                if (!Number.isNaN(oldid)) {
                  rev.appendChild(Twinkle.fluff.linkBuilder.restoreThisRevisionLink(oldid, true));
                }
              }
            } catch (err) {
              _iterator55.e(err);
            } finally {
              _iterator55.f();
            }
          }
        },
        diff: () => {
          const warnFromTalk = (xtitle) => {
            const talkLink = $("#mw-diff-".concat(xtitle, "2 .mw-usertoollinks a")).first();
            if (talkLink.length) {
              let extraParams = "vanarticle=".concat(mw.util.rawurlencode(Morebits.pageNameNorm), "&noautowarn=true");
              extraParams += "&vanarticlerevid=";
              extraParams += xtitle === "otitle" ? mw.config.get("wgDiffOldId") : mw.config.get("wgDiffNewId");
              const href = talkLink.attr("href");
              if (href.includes("?")) {
                talkLink.attr("href", "".concat(href, "&").concat(extraParams));
              } else {
                talkLink.attr("href", "".concat(href, "?").concat(extraParams));
              }
            }
          };
          warnFromTalk("otitle");
          if (mw.config.get("wgDiffOldId") && mw.config.get("wgDiffOldId") !== mw.config.get("wgDiffNewId")) {
            const oldTitle = document.querySelector("#mw-diff-otitle1").parentNode;
            const revertToRevision = Twinkle.fluff.linkBuilder.restoreThisRevisionLink("wgDiffOldId");
            oldTitle.insertBefore(revertToRevision, oldTitle.firstChild);
            if (Twinkle.getPref("customRevertSummary").length > 0) {
              revertToRevision.appendChild(document.createTextNode(" || "));
              const revertsummary = new Morebits.quickForm.element({
                type: "select",
                name: "revertsummary"
              });
              revertsummary.append({
                type: "option",
                label: window.wgULS("选择回退理由", "選擇回退理由"),
                value: ""
              });
              $(Twinkle.getPref("customRevertSummary")).each((_, e) => {
                revertsummary.append({
                  type: "option",
                  label: e.label,
                  value: e.value
                });
              });
              revertToRevision.appendChild(revertsummary.render().childNodes[0]);
            }
          }
          warnFromTalk("ntitle");
          if (document.querySelector("#differences-nextlink")) {
            const newTitle = document.querySelector("#mw-diff-ntitle1").parentNode;
            newTitle.insertBefore(Twinkle.fluff.linkBuilder.restoreThisRevisionLink("wgDiffNewId"), newTitle.firstChild);
          } else if (Twinkle.getPref("showRollbackLinks").includes("diff") && mw.config.get("wgDiffOldId") && (mw.config.get("wgDiffOldId") !== mw.config.get("wgDiffNewId") || document.querySelector("#differences-prevlink"))) {
            const vandal = $body.find("#mw-diff-ntitle2").find(".mw-userlink")[0].text;
            const ntitle = document.querySelector("#mw-diff-ntitle1").parentNode;
            ntitle.insertBefore(Twinkle.fluff.linkBuilder.rollbackLinks(vandal), ntitle.firstChild);
          }
        },
        oldid: () => {
          const title = document.querySelector("#mw-revision-info").parentNode;
          title.insertBefore(Twinkle.fluff.linkBuilder.restoreThisRevisionLink("wgRevisionId"), title.firstChild);
        }
      };
      Twinkle.fluff.disableLinks = (parentNode) => {
        $(parentNode).children().each((_i, node) => {
          node.innerHTML = node.textContent;
          $(node).css("font-weight", "normal").css("color", "darkgray");
        });
      };
      Twinkle.fluff.revert = (type, vandal, rev, page) => {
        if (mw.util.isIPv6Address(vandal)) {
          vandal = Morebits.sanitizeIPv6(vandal);
        }
        const pagename = page || mw.config.get("wgPageName");
        const revid = rev || mw.config.get("wgCurRevisionId");
        let summary = "";
        if (document.getElementsByName("revertsummary")[0] !== void 0) {
          summary = document.getElementsByName("revertsummary")[0].value;
        }
        if (Twinkle.fluff.rollbackInPlace) {
          const notifyStatus = document.createElement("span");
          void mw.notify(notifyStatus, {
            autoHide: false,
            title: "回退".concat(page),
            tag: "twinklefluff_".concat(rev)
            // Shouldn't be necessary given disableLink
          });
          Morebits.status.init(notifyStatus);
        } else {
          Morebits.status.init(document.querySelector("#mw-content-text"));
          $body.find("#catlinks").remove();
        }
        const params = {
          type,
          user: vandal,
          userHidden: !vandal,
          pagename,
          revid,
          summary
        };
        const query = {
          action: "query",
          prop: ["info", "revisions"],
          titles: pagename,
          intestactions: "edit",
          rvlimit: Twinkle.getPref("revertMaxRevisions"),
          rvprop: ["ids", "timestamp", "user"],
          curtimestamp: "",
          meta: "tokens",
          type: "csrf"
        };
        const qiuwen_api = new Morebits.wiki.api(window.wgULS("抓取较早修订版本信息", "抓取較早修訂版本資訊"), query, Twinkle.fluff.callbacks.main);
        qiuwen_api.params = params;
        qiuwen_api.post();
      };
      Twinkle.fluff.revertToRevision = (oldrev) => {
        let summary = "";
        if (document.getElementsByName("revertsummary")[0] !== void 0) {
          summary = document.getElementsByName("revertsummary")[0].value;
        }
        Morebits.status.init(document.querySelector("#mw-content-text"));
        const query = {
          action: "query",
          prop: ["info", "revisions"],
          titles: mw.config.get("wgPageName"),
          rvlimit: 1,
          rvstartid: oldrev,
          rvprop: ["ids", "user"],
          format: "xml",
          curtimestamp: "",
          meta: "tokens",
          type: "csrf"
        };
        const qiuwen_api = new Morebits.wiki.api(window.wgULS("抓取较早修订版本信息", "抓取較早修訂版本資訊"), query, Twinkle.fluff.callbacks.toRevision);
        qiuwen_api.params = {
          rev: oldrev,
          summary
        };
        qiuwen_api.post();
      };
      Twinkle.fluff.callbacks = {
        toRevision: (apiobj) => {
          const xmlDoc = apiobj.responseXML;
          const lastrevid = Number.parseInt($(xmlDoc).find("page").attr("lastrevid"), 10);
          const touched = $(xmlDoc).find("page").attr("touched");
          const loadtimestamp = $(xmlDoc).find("api").attr("curtimestamp");
          const csrftoken = $(xmlDoc).find("tokens").attr("csrftoken");
          const revertToRevID = Number.parseInt($(xmlDoc).find("rev").attr("revid"), 10);
          const revertToUser = $(xmlDoc).find("rev").attr("user");
          const revertToUserHidden = typeof $(xmlDoc).find("rev").attr("userhidden") === "string";
          if (revertToRevID !== apiobj.params.rev) {
            apiobj.statelem.error(window.wgULS("抓取到的修订版本与请求的修订版本不符,取消。", "抓取到的修訂版本與請求的修訂版本不符,取消。"));
            return;
          }
          const optional_summary = prompt("".concat(window.wgULS("请输入回退理由:", "請輸入回退理由:"), "                                "), apiobj.params.summary);
          if (optional_summary === null) {
            apiobj.statelem.error(window.wgULS("由用户取消。", "由使用者取消。"));
            return;
          }
          const summary = Twinkle.fluff.formatSummary(window.wgULS("回退到由$USER做出的修订版本", "回退到由$USER做出的修訂版本") + revertToRevID, revertToUserHidden ? null : revertToUser, optional_summary);
          const query = {
            action: "edit",
            title: mw.config.get("wgPageName"),
            summary,
            tags: Twinkle.changeTags,
            token: csrftoken,
            undo: lastrevid,
            undoafter: revertToRevID,
            basetimestamp: touched,
            starttimestamp: loadtimestamp,
            minor: Twinkle.getPref("markRevertedPagesAsMinor").includes("torev") ? true : void 0,
            bot: true
          };
          if (Twinkle.getPref("watchRevertedPages").includes("torev")) {
            const watchOrExpiry = Twinkle.getPref("watchRevertedExpiry");
            if (!watchOrExpiry || watchOrExpiry === "no") {
              query.watchlist = "nochange";
            } else if (watchOrExpiry === "default" || watchOrExpiry === "preferences") {
              query.watchlist = "preferences";
            } else {
              query.watchlist = "watch";
              if (typeof watchOrExpiry === "string" && watchOrExpiry !== "yes") {
                query.watchlistexpiry = watchOrExpiry;
              }
            }
          }
          Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
          Morebits.wiki.actionCompleted.notice = "回退完成";
          const qiuwen_api = new Morebits.wiki.api(window.wgULS("保存回退内容", "儲存回退內容"), query, Twinkle.fluff.callbacks.complete, apiobj.statelem);
          qiuwen_api.params = apiobj.params;
          qiuwen_api.post();
        },
        main: (apiobj) => {
          const xmlDoc = apiobj.responseXML;
          if ($(xmlDoc).find("actions").attr("edit") === void 0) {
            apiobj.statelem.error("Unable to edit the page, it's probably protected.");
            return;
          }
          const lastrevid = Number.parseInt($(xmlDoc).find("page").attr("lastrevid"), 10);
          const touched = $(xmlDoc).find("page").attr("touched");
          const loadtimestamp = $(xmlDoc).find("api").attr("curtimestamp");
          const csrftoken = $(xmlDoc).find("tokens").attr("csrftoken");
          const revs = $(xmlDoc).find("rev");
          const {
            statelem
          } = apiobj;
          const {
            params
          } = apiobj;
          if (revs.length < 1) {
            statelem.error(window.wgULS("没有其它修订版本,无法回退", "沒有其它修訂版本,無法回退"));
            return;
          }
          const [top] = revs;
          const lastuser = top.getAttribute("user");
          if (lastrevid < params.revid) {
            Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS(["从服务器获取的最新修订版本ID ", Morebits.htmlNode("strong", lastrevid), " 小于目前所显示的修订版本ID。这可能意味着当前修订版本已被删除、服务器延迟、或抓取到了坏掉的信息。取消。"], ["從伺服器取得的最新修訂版本ID ", Morebits.htmlNode("strong", lastrevid), " 小於目前所顯示的修訂版本ID。這可能意味著當前修訂版本已被刪除、伺服器延遲、或擷取到了壞掉的資訊。取消。"]));
            return;
          }
          let userNorm = params.user || Twinkle.fluff.hiddenName;
          let index = 1;
          if (params.revid === lastrevid) {
            params.user = lastuser;
            userNorm = params.user || Twinkle.fluff.hiddenName;
          } else {
            Morebits.status.warn("警告", window.wgULS(["最新修订版本 ", Morebits.htmlNode("strong", lastrevid), " 与我们的修订版本 ", Morebits.htmlNode("strong", params.revid), "不同"], ["最新修訂版本 ", Morebits.htmlNode("strong", lastrevid), " 與我們的修訂版本 ", Morebits.htmlNode("strong", params.revid), " 不同"]));
            if (lastuser === params.user) {
              switch (params.type) {
                case "vand":
                  Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("最新修订版本由 ", "最新修訂版本由 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 做出,因我们假定破坏,继续回退操作。", " 做出,因我們假定破壞,繼續回退操作。")]);
                  break;
                default:
                  Morebits.status.warn("提示", [window.wgULS("最新修订版本由 ", "最新修訂版本由 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 做出,但我们还是不回退了。", " 做出,但我們還是不回退了。")]);
                  return;
              }
            } else if (params.type === "vand" && // Okay to test on user since it will either fail or sysop will correctly access it
            // Besides, none of the trusted bots are going to be revdel'd
            Twinkle.fluff.trustedBots.includes(top.getAttribute("user")) && revs.length > 1 && revs[1].getAttribute("revid") === params.revid) {
              Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS(["最新修订版本由 ", Morebits.htmlNode("strong", lastuser), ",一个可信的机器人做出,但之前的版本被认为是破坏,继续回退操作。"], ["最新修訂版本由 ", Morebits.htmlNode("strong", lastuser), ",一個可信的機器人做出,但之前的版本被認為是破壞,繼續回退操作。"]));
              index = 2;
            } else {
              Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS(["最新修订版本由 ", Morebits.htmlNode("strong", lastuser), " 做出,所以这个修订版本可能已经被回退了,取消回退操作。"], ["最新修訂版本由 ", Morebits.htmlNode("strong", lastuser), " 做出,所以這個修訂版本可能已經被回退了,取消回退操作。"]));
              return;
            }
          }
          if (Twinkle.fluff.trustedBots.includes(params.user)) {
            switch (params.type) {
              case "vand":
                Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("将对 ", "將對 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 执行破坏回退,这是一个可信的机器人,我们假定您要回退前一个修订版本。", " 執行破壞回退,這是一個可信的機器人,我們假定您要回退前一個修訂版本。")]);
                index = 2;
                params.user = revs[1].getAttribute("user");
                params.userHidden = revs[1].getAttribute("userhidden") === "";
                break;
              default: {
                const cont = confirm(window.wgULS("选择了常规回退,但最新修改是由一个可信的机器人(", "選擇了常規回退,但最新修改是由一個可信的機器人(") + userNorm + window.wgULS(")做出的。确定以回退前一个修订版本,取消以回退机器人的修改", ")做出的。確定以回退前一個修訂版本,取消以回退機器人的修改"));
                if (cont) {
                  Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("将对 ", "將對 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 执行常规回退,这是一个可信的机器人,基于确认,我们将回退前一个修订版本。", " 執行常規回退,這是一個可信的機器人,基於確認,我們將回退前一個修訂版本。")]);
                  index = 2;
                  params.user = revs[1].getAttribute("user");
                  params.userHidden = revs[1].getAttribute("userhidden") === "";
                  userNorm = params.user || Twinkle.fluff.hiddenName;
                } else {
                  Morebits.status.warn("提示", [window.wgULS("将对 ", "將對 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 执行常规回退,这是一个可信的机器人,基于确认,我们仍将回退这个修订版本。", " 執行常規回退,這是一個可信的機器人,基於確認,我們仍將回退這個修訂版本。")]);
                }
                break;
              }
            }
          }
          let found = false;
          let count = 0;
          for (let i = index; i < revs.length; ++i) {
            ++count;
            if (revs[i].getAttribute("user") !== params.user) {
              found = i;
              break;
            }
          }
          if (!found) {
            statelem.error([window.wgULS("未找到之前的修订版本,可能 ", "未找到之前的修訂版本,可能 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 是唯一贡献者,或这个用户连续做出了超过 ", " 是唯一貢獻者,或這個用戶連續做出了超過 ") + mw.language.convertNumber(Twinkle.getPref("revertMaxRevisions")) + window.wgULS(" 次编辑。", " 次編輯。")]);
            return;
          }
          if (!count) {
            Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("我们将要回退0个修订版本,这没有意义,所以取消回退操作。可能是因为这个修订版本已经被回退,但修订版本ID仍是一样的。", "我們將要回退0個修訂版本,這沒有意義,所以取消回退操作。可能是因為這個修訂版本已經被回退,但修訂版本ID仍是一樣的。"));
            return;
          }
          const good_revision = revs[found];
          let userHasAlreadyConfirmedAction = false;
          if (params.type !== "vand" && count > 1) {
            if (!confirm(userNorm + window.wgULS(" 连续做出了 ", " 連續做出了 ") + mw.language.convertNumber(count) + window.wgULS(" 次编辑,是否要全部回退?", " 次編輯,是否要全部回退?"))) {
              Morebits.status.info("提示", window.wgULS("用户取消操作", "使用者取消操作"));
              return;
            }
            userHasAlreadyConfirmedAction = true;
          }
          params.count = count;
          params.goodid = good_revision.getAttribute("revid");
          params.gooduser = good_revision.getAttribute("user");
          params.gooduserHidden = good_revision.getAttribute("userhidden") === "";
          statelem.status([Morebits.htmlNode("strong", mw.language.convertNumber(count)), window.wgULS(" 个修订版本之前由 ", " 個修訂版本之前由 "), Morebits.htmlNode("strong", params.gooduserHidden ? Twinkle.fluff.hiddenName : params.gooduser), window.wgULS(" 做出的修订版本 ", " 做出的修訂版本 "), Morebits.htmlNode("strong", params.goodid)]);
          let summary;
          let extra_summary;
          switch (params.type) {
            case "vand":
              summary = Twinkle.fluff.formatSummary("回退$USER做出的".concat(params.count).concat(window.wgULS("次编辑,到由", "次編輯,到由")).concat(params.gooduserHidden ? Twinkle.fluff.hiddenName : params.gooduser).concat(window.wgULS("做出的最后修订版本 ", "做出的最後修訂版本 ")), params.userHidden ? null : params.user);
              break;
            default:
              if (Twinkle.getPref("offerReasonOnNormalRevert")) {
                extra_summary = prompt("".concat(window.wgULS("可选的编辑摘要:", "可選的編輯摘要:"), "                              "), params.summary);
                if (extra_summary === null) {
                  statelem.error(window.wgULS("用户取消操作。", "使用者取消操作。"));
                  return;
                }
                userHasAlreadyConfirmedAction = true;
              }
              summary = Twinkle.fluff.formatSummary("回退$USER做出的".concat(params.count).concat(window.wgULS("次编辑", "次編輯")), params.userHidden ? null : params.user, extra_summary);
              break;
          }
          if (Twinkle.getPref("confirmOnFluff") && !userHasAlreadyConfirmedAction && !confirm(window.wgULS("回退页面:您确定吗?", "回退頁面:您確定嗎?"))) {
            statelem.error(window.wgULS("用户取消操作。", "使用者取消操作。"));
            return;
          }
          if (!Twinkle.fluff.skipTalk && Twinkle.getPref("openTalkPage").includes(params.type) && !params.userHidden && mw.config.get("wgUserName") !== params.user) {
            params.notifyUser = true;
            params.vantimestamp = top.getAttribute("timestamp");
          }
          const query = {
            action: "edit",
            title: params.pagename,
            summary,
            tags: Twinkle.changeTags,
            token: csrftoken,
            undo: lastrevid,
            undoafter: params.goodid,
            basetimestamp: touched,
            starttimestamp: loadtimestamp,
            minor: Twinkle.getPref("markRevertedPagesAsMinor").includes(params.type) ? true : void 0,
            bot: true
          };
          if (Twinkle.getPref("watchRevertedPages").includes(params.type)) {
            const watchOrExpiry = Twinkle.getPref("watchRevertedExpiry");
            if (!watchOrExpiry || watchOrExpiry === "no") {
              query.watchlist = "nochange";
            } else if (watchOrExpiry === "default" || watchOrExpiry === "preferences") {
              query.watchlist = "preferences";
            } else {
              query.watchlist = "watch";
              if (typeof watchOrExpiry === "string" && watchOrExpiry !== "yes") {
                query.watchlistexpiry = watchOrExpiry;
              }
            }
          }
          if (!Twinkle.fluff.rollbackInPlace) {
            Morebits.wiki.actionCompleted.redirect = params.pagename;
          }
          Morebits.wiki.actionCompleted.notice = "回退完成";
          const qiuwen_api = new Morebits.wiki.api(window.wgULS("保存回退内容", "儲存回退內容"), query, Twinkle.fluff.callbacks.complete, statelem);
          qiuwen_api.params = params;
          qiuwen_api.post();
        },
        complete: (apiobj) => {
          const xml = apiobj.getXML();
          const $edit = $(xml).find("edit");
          if ($(xml).find("captcha").length > 0) {
            apiobj.statelem.error(window.wgULS("不能回退,因服务器要求您输入验证码。", "不能回退,因伺服器要求您輸入驗證碼。"));
          } else if ($edit.attr("nochange") === "") {
            apiobj.statelem.error(window.wgULS("要回退到的版本与当前版本相同,没什么要做的", "要回退到的版本與目前版本相同,沒什麼要做的"));
          } else {
            apiobj.statelem.info("完成");
            const {
              params
            } = apiobj;
            if (params.notifyUser && !params.userHidden) {
              Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("开启用户 ", "開啟使用者 "), Morebits.htmlNode("strong", params.user), window.wgULS(" 的讨论页", " 的討論頁")]);
              const windowQuery = {
                title: "User talk:".concat(params.user),
                action: "edit",
                preview: "yes",
                vanarticle: params.pagename.replace(/_/g, " "),
                vanarticlerevid: params.revid,
                vantimestamp: params.vantimestamp,
                vanarticlegoodrevid: params.goodid,
                type: params.type,
                count: params.count
              };
              switch (Twinkle.getPref("userTalkPageMode")) {
                case "tab":
                  window.open(mw.util.getUrl("", windowQuery), "_blank", "noopener,noreferrer");
                  break;
                case "blank":
                  window.open(mw.util.getUrl("", windowQuery), "_blank", "noopener,noreferrer,location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
                  break;
                default:
                  window.open(mw.util.getUrl("", windowQuery), window.name === "twinklewarnwindow" ? "_blank" : "twinklewarnwindow", window.name === "twinklewarnwindow" ? "noopener,noreferrer," : "location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
                  break;
              }
            }
          }
        }
      };
      Twinkle.fluff.formatSummary = (builtInString, userName, customString) => {
        let result = builtInString;
        if (customString) {
          result += ":".concat(Morebits.string.toUpperCaseFirstChar(customString));
        }
        if (/\$USER/.test(builtInString)) {
          if (userName) {
            const resultLen = unescape(encodeURIComponent(result.replace("$USER", ""))).length;
            const contribsLink = "[[Special:Contributions/".concat(userName, "|").concat(userName, "]]");
            const contribsLen = unescape(encodeURIComponent(contribsLink)).length;
            if (resultLen + contribsLen <= 499) {
              const talkLink = "([[User talk:".concat(userName).concat(window.wgULS("|讨论]])", "|討論]])"));
              if (resultLen + contribsLen + unescape(encodeURIComponent(talkLink)).length <= 499) {
                result = Morebits.string.safeReplace(result, "$USER", contribsLink + talkLink);
              } else {
                result = Morebits.string.safeReplace(result, "$USER", contribsLink);
              }
            } else {
              result = Morebits.string.safeReplace(result, "$USER", userName);
            }
          } else {
            result = Morebits.string.safeReplace(result, "$USER", Twinkle.fluff.hiddenName);
          }
        }
        return result;
      };
      Twinkle.addInitCallback(Twinkle.fluff, "fluff");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklebatchdelete.js
var twinklebatchdelete_exports = {};
var init_twinklebatchdelete = __esm({
  "src/Twinkle/modules/twinklebatchdelete.js"() {
    "use strict";
    /*! Twinkle.js - twinklebatchdelete.js */
    (function twinklebatchdelete($) {
      const $body = $("body");
      Twinkle.batchdelete = () => {
        if (Morebits.userIsSysop && (mw.config.get("wgCurRevisionId") && mw.config.get("wgNamespaceNumber") > 0 || mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex" || mw.config.get("wgCanonicalSpecialPageName") === "BrokenRedirects")) {
          Twinkle.addPortletLink(Twinkle.batchdelete.callback, window.wgULS("批删", "批刪"), "tw-batch", window.wgULS("删除此分类或页面中的所有链接", "刪除此分類或頁面中的所有連結"));
        }
      };
      Twinkle.batchdelete.unlinkCache = {};
      let subpagesLoaded;
      Twinkle.batchdelete.callback = () => {
        subpagesLoaded = false;
        const Window = new Morebits.simpleWindow(600, 400);
        Window.setTitle(window.wgULS("批量删除", "批次刪除"));
        Window.setScriptName("Twinkle");
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#batchdelete");
        const form = new Morebits.quickForm(Twinkle.batchdelete.callback.evaluate);
        form.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("删除页面", "刪除頁面"),
            name: "delete_page",
            value: "delete",
            checked: true,
            subgroup: {
              type: "checkbox",
              list: [{
                label: window.wgULS("删除关联的讨论页(用户讨论页除外)", "刪除關聯的討論頁(使用者討論頁除外)"),
                name: "delete_talk",
                value: "delete_talk",
                checked: true
              }, {
                label: window.wgULS("删除到已删页面的重定向页", "刪除到已刪頁面的重新導向頁面"),
                name: "delete_redirects",
                value: "delete_redirects",
                checked: true
              }, {
                label: window.wgULS("删除已删页面的子页面", "刪除已刪頁面的子頁面"),
                name: "delete_subpages",
                value: "delete_subpages",
                checked: false,
                event: Twinkle.batchdelete.callback.toggleSubpages,
                subgroup: {
                  type: "checkbox",
                  list: [{
                    label: window.wgULS("删除已删子页面的讨论页", "刪除已刪子頁面的討論頁"),
                    name: "delete_subpage_talks",
                    value: "delete_subpage_talks"
                  }, {
                    label: window.wgULS("删除到已删子页面的重定向页", "刪除到已刪子頁面的重新導向頁面"),
                    name: "delete_subpage_redirects",
                    value: "delete_subpage_redirects"
                  }, {
                    label: window.wgULS("取消所有已删页面的链入(仅处理条目命名空间)", "取消所有已刪頁面的連入(僅處理條目命名空間)"),
                    name: "unlink_subpages",
                    value: "unlink_subpages"
                  }]
                }
              }]
            }
          }, {
            label: window.wgULS("取消链入(仅处理条目命名空间)", "取消連入(僅處理條目命名空間)"),
            name: "unlink_page",
            value: "unlink",
            checked: false
          }, {
            label: window.wgULS("移除文件使用(所有命名空间)", "移除檔案使用(所有命名空間)"),
            name: "unlink_file",
            value: "unlink_file",
            checked: true
          }]
        });
        form.append({
          type: "select",
          name: "common_reason",
          label: "常用理由:",
          style: "width: 85%;",
          list: Twinkle.batchdelete.deletereasonlist,
          event: Twinkle.batchdelete.callback.change_common_reason
        });
        form.append({
          name: "reason",
          type: "input",
          label: "理由:",
          size: 75
        });
        const query = {
          action: "query",
          prop: "revisions|info|imageinfo",
          inprop: "protection",
          rvprop: "size|user"
        };
        if (mw.config.get("wgNamespaceNumber") === 14) {
          query.generator = "categorymembers";
          query.gcmtitle = mw.config.get("wgPageName");
          query.gcmlimit = Twinkle.getPref("batchMax");
        } else if (mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex") {
          query.generator = "allpages";
          query.gaplimit = Twinkle.getPref("batchMax");
          if (mw.util.getParamValue("prefix")) {
            query.gapnamespace = mw.util.getParamValue("namespace");
            query.gapprefix = mw.util.getParamValue("prefix");
          } else {
            let pathSplit = decodeURIComponent(location.pathname).split("/");
            if (pathSplit.length < 3 || pathSplit[2] !== "Special:前缀索引") {
              return;
            }
            const titleSplit = pathSplit[3].split(":");
            query.gapnamespace = mw.config.get("wgNamespaceIds")[titleSplit[0].toLowerCase()];
            if (titleSplit.length < 2 || query.gapnamespace === void 0) {
              query.gapnamespace = 0;
              query.gapprefix = pathSplit.splice(3).join("/");
            } else {
              pathSplit = pathSplit.splice(4);
              pathSplit.splice(0, 0, titleSplit.splice(1).join(":"));
              query.gapprefix = pathSplit.join("/");
            }
          }
        } else if (mw.config.get("wgCanonicalSpecialPageName") === "BrokenRedirects") {
          query.generator = "querypage";
          query.gqppage = "BrokenRedirects";
          query.gqplimit = Twinkle.getPref("batchMax");
        } else {
          query.generator = "links";
          query.titles = mw.config.get("wgPageName");
          query.gpllimit = Twinkle.getPref("batchMax");
        }
        const statusdiv = document.createElement("div");
        statusdiv.style.padding = "15px";
        Window.setContent(statusdiv);
        Morebits.status.init(statusdiv);
        Window.display();
        Twinkle.batchdelete.pages = {};
        const statelem = new Morebits.status(window.wgULS("抓取页面列表", "抓取頁面列表"));
        const qiuwen_api = new Morebits.wiki.api(window.wgULS("加载中…", "載入中…"), query, (apiobj) => {
          const xml = apiobj.responseXML;
          const $pages = $(xml).find("page").filter(":not([missing])");
          $pages.each((_index, page) => {
            const $page = $(page);
            const ns = $page.attr("ns");
            const title = $page.attr("title");
            const isRedir = $page.attr("redirect") === "";
            const $editprot = $page.find('pr[type="edit"][level="sysop"]');
            const isProtected = $editprot.length > 0;
            const size = $page.find("rev").attr("size");
            const metadata = [];
            if (isRedir) {
              metadata[metadata.length] = window.wgULS("重定向", "重新導向");
            }
            if (isProtected) {
              metadata[metadata.length] = window.wgULS("全保护,", "全保護,") + ($editprot.attr("expiry") === "infinity" ? window.wgULS("无限期", "無限期") : "".concat(new Morebits.date($editprot.attr("expiry")).calendar("utc"), " (UTC)")) + window.wgULS("过期", "過期");
            }
            if (ns === "6") {
              metadata[metadata.length] = (window.wgULS("上传者:", "上傳者:") + $page.find("ii").attr("user"), window.wgULS("最后编辑:", "最後編輯:") + $page.find("rev").attr("user"));
            } else {
              metadata[metadata.length] = mw.language.convertNumber(size) + window.wgULS("字节", "位元組");
            }
            Twinkle.batchdelete.pages[title] = {
              label: title + (metadata.length ? "(".concat(metadata.join(","), ")") : ""),
              value: title,
              checked: true,
              style: isProtected ? "color: #f00" : ""
            };
          });
          const form_ = apiobj.params.form;
          form_.append({
            type: "header",
            label: window.wgULS("待删除页面", "待刪除頁面")
          });
          form_.append({
            type: "button",
            label: window.wgULS("全选", "全選"),
            event: () => {
              $(result).find("input[name=pages]:not(:checked)").each((_, e) => {
                e.click();
              });
              $body.find('input[name="pages.subpages"]').prop("checked", true);
            }
          });
          form_.append({
            type: "button",
            label: window.wgULS("全不选", "全不選"),
            event: () => {
              $(result).find("input[name=pages]:checked").each((_, e) => {
                e.click();
              });
            }
          });
          form_.append({
            type: "checkbox",
            name: "pages",
            id: "tw-dbatch-pages",
            shiftClickSupport: true,
            list: Object.values(Twinkle.batchdelete.pages).map((e) => {
              return e;
            })
          });
          form_.append({
            type: "submit"
          });
          const result = form_.render();
          apiobj.params.Window.setContent(result);
          var _iterator56 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "pages")), _step56;
          try {
            for (_iterator56.s(); !(_step56 = _iterator56.n()).done; ) {
              const checkbox = _step56.value;
              generateArrowLinks(checkbox);
            }
          } catch (err) {
            _iterator56.e(err);
          } finally {
            _iterator56.f();
          }
        }, statelem);
        qiuwen_api.params = {
          form,
          Window
        };
        qiuwen_api.post();
      };
      const generateArrowLinks = (checkbox) => {
        const link = Morebits.htmlNode("a", " >");
        link.setAttribute("class", "tw-dbatch-page-link");
        link.setAttribute("href", mw.util.getUrl(checkbox.value));
        link.setAttribute("target", "_blank");
        link.setAttribute("rel", "noopener noreferrer");
        checkbox.nextElementSibling.append(link);
      };
      Twinkle.batchdelete.generateNewPageList = (form) => {
        const elements = form.elements.pages;
        if (elements instanceof NodeList) {
          var _iterator57 = _createForOfIteratorHelper(elements), _step57;
          try {
            for (_iterator57.s(); !(_step57 = _iterator57.n()).done; ) {
              const element = _step57.value;
              Twinkle.batchdelete.pages[element.value].checked = element.checked;
            }
          } catch (err) {
            _iterator57.e(err);
          } finally {
            _iterator57.f();
          }
        } else if (elements instanceof HTMLInputElement) {
          Twinkle.batchdelete.pages[elements.value].checked = elements.checked;
        }
        return new Morebits.quickForm.element({
          type: "checkbox",
          name: "pages",
          id: "tw-dbatch-pages",
          shiftClickSupport: true,
          list: Object.values(Twinkle.batchdelete.pages).map((e) => {
            return e;
          })
        }).render();
      };
      Twinkle.batchdelete.deletereasonlist = [{
        label: window.wgULS("请选择", "請選擇"),
        value: ""
      }, {
        label: window.wgULS("G6:原作者提请删除或清空页面,且页面原作者仅有一人", "G6:原作者提請刪除或清空頁面,且頁面原作者僅有一人"),
        value: window.wgULS("[[QW:CSD#G6|G6]]:原作者提请删除或清空页面,且页面原作者仅有一人", "[[QW:CSD#G6|G6]]:原作者提請刪除或清空頁面,且頁面原作者僅有一人")
      }, {
        label: window.wgULS("G9:孤立页面,比如没有主页面的讨论页、指向空页面的重定向等", "G9:孤立頁面,比如沒有主頁面的討論頁、指向空頁面的重新導向等"),
        value: window.wgULS("[[QW:CSD#G9|G9]]:孤立页面", "[[QW:CSD#G9|G9]]:孤立頁面")
      }, {
        label: window.wgULS("R1:不能发挥实际作用的重定向。", "R1:不能發揮實際作用的重定向。"),
        value: window.wgULS("[[QW:CSD#R1|R1]]:不能发挥实际作用的重定向。", "[[QW:CSD#R1|R1]]:不能發揮實際作用的重定向。")
      }, {
        label: window.wgULS("R2:名称与导向目标代表事物不一致或不完全一致的重定向。", "R2:名稱與導向目標代表事物不一致或不完全一致的重定向。"),
        value: window.wgULS("[[QW:CSD#R2|R2]]:名称与导向目标代表事物不一致或不完全一致的重定向。", "[[QW:CSD#R2|R2]]:名稱與導向目標代表事物不一致或不完全一致的重定向。")
      }, {
        label: window.wgULS("F4:可被替代的合理使用文件", "F4:可被替代的合理使用檔案"),
        value: window.wgULS("[[QW:CSD#F4|F4]]:可被替代的合理使用文件", "[[QW:CSD#F4|F4]]:可被替代的合理使用檔案")
      }, {
        label: window.wgULS("F5:没有被条目使用的非自由著作权文件、没有填写任何合理使用依据的非自由著作权文件", "F5:沒有被條目使用的非自由版權檔案、沒有填寫任何合理使用依據的非自由版權檔案"),
        value: window.wgULS("[[QW:CSD#F5|F5]]:没有被条目使用的非自由著作权文件、没有填写任何合理使用依据的非自由著作权文件", "[[QW:CSD#F5|F5]]:沒有被條目使用的非自由版權檔案、沒有填寫任何合理使用依據的非自由版權檔案")
      }, {
        label: window.wgULS("O1:用户请求删除自己的用户页或其子页面", "O1:使用者請求刪除自己的使用者頁面或其子頁面"),
        value: window.wgULS("[[QW:CSD#O1|O1]]:用户请求删除自己的[[Help:用户页|用户页]]或其子页面。", "[[QW:CSD#O1|O1]]:使用者請求刪除自己的[[Help:用户页|使用者頁面]]或其子頁面。")
      }, {
        label: window.wgULS("O2:空的分类(没有条目也没有子分类)", "O2:空的分類(沒有條目也沒有子分類)"),
        value: window.wgULS("[[QW:CSD#O2|O2]]:空的分类(没有条目也没有子分类)。", "[[QW:CSD#O2|O2]]:空的分類(沒有條目也沒有子分類)。")
      }, {
        label: window.wgULS("O3:废弃草稿", "O3:廢棄草稿"),
        value: window.wgULS("[[QW:CSD#O3|O3]]:废弃草稿。", "[[QW:CSD#O3|O3]]:廢棄草稿。")
      }];
      Twinkle.batchdelete.callback.change_common_reason = (e) => {
        if (e.target.form.reason.value !== "") {
          e.target.form.reason.value = Morebits.string.appendPunctuation(e.target.form.reason.value);
        }
        e.target.form.reason.value += e.target.value;
        e.target.value = "";
      };
      Twinkle.batchdelete.callback.toggleSubpages = (e) => {
        const {
          form
        } = e.target;
        let newPageList;
        if (e.target.checked) {
          form.delete_subpage_redirects.checked = form.delete_redirects.checked;
          form.delete_subpage_talks.checked = form.delete_talk.checked;
          form.unlink_subpages.checked = form.unlink_page.checked;
          if (subpagesLoaded) {
            var _iterator58 = _createForOfIteratorHelper(Twinkle.batchdelete.pages), _step58;
            try {
              for (_iterator58.s(); !(_step58 = _iterator58.n()).done; ) {
                const el = _step58.value;
                if (el.subgroup === null && el.subgroup_) {
                  el.subgroup = el.subgroup_;
                }
              }
            } catch (err) {
              _iterator58.e(err);
            } finally {
              _iterator58.f();
            }
            newPageList = Twinkle.batchdelete.generateNewPageList(form);
            $body.find("#tw-dbatch-pages").replaceWith(newPageList);
            var _iterator59 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages")), _step59;
            try {
              for (_iterator59.s(); !(_step59 = _iterator59.n()).done; ) {
                const checkbox = _step59.value;
                generateArrowLinks(checkbox);
              }
            } catch (err) {
              _iterator59.e(err);
            } finally {
              _iterator59.f();
            }
            var _iterator60 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages.subpages")), _step60;
            try {
              for (_iterator60.s(); !(_step60 = _iterator60.n()).done; ) {
                const checkbox = _step60.value;
                generateArrowLinks(checkbox);
              }
            } catch (err) {
              _iterator60.e(err);
            } finally {
              _iterator60.f();
            }
            return;
          }
          const loadingText = '<strong id="dbatch-subpage-loading">'.concat(window.wgULS("加载中...", "載入中..."), "</strong>");
          $(e.target).after(loadingText);
          const pages = $(form.pages).map((_i, el) => {
            return el.value;
          }).get();
          const subpageLister = new Morebits.batchOperation();
          subpageLister.setOption("chunkSize", Twinkle.getPref("batchChunks"));
          subpageLister.setPageList(pages);
          subpageLister.run((pageName) => {
            const pageTitle = mw.Title.newFromText(pageName);
            if ([0, 6, 8].includes(pageTitle.namespace)) {
              subpageLister.workerSuccess();
              return;
            }
            const qiuwen_api = new Morebits.wiki.api(window.wgULS("正在获取 ", "正在取得 ") + pageName + window.wgULS(" 的子页面", " 的子頁面"), {
              action: "query",
              prop: "revisions|info|imageinfo",
              generator: "allpages",
              rvprop: "size",
              inprop: "protection",
              gapprefix: "".concat(pageTitle.title, "/"),
              gapnamespace: pageTitle.namespace,
              gaplimit: "max",
              pageNameFull: pageName
              // Not used by API, but added for access in onSuccess()
            }, (apiobj) => {
              const xml = apiobj.responseXML;
              const $pages = $(xml).find("page");
              const subpageList = [];
              $pages.each((_index, page) => {
                const $page = $(page);
                const ns = $page.attr("ns");
                const title = $page.attr("title");
                const isRedir = $page.attr("redirect") === "";
                const $editprot = $page.find('pr[type="edit"][level="sysop"]');
                const isProtected = $editprot.length > 0;
                const size = $page.find("rev").attr("size");
                const metadata = [];
                if (isRedir) {
                  metadata[metadata.length] = "redirect";
                }
                if (isProtected) {
                  metadata[metadata.length] = window.wgULS("全保护,", "全保護,") + ($editprot.attr("expiry") === "infinity" ? window.wgULS("无限期", "無限期") : "".concat(new Morebits.date($editprot.attr("expiry")).calendar("utc"), " (UTC)")) + window.wgULS("过期", "過期");
                }
                if (ns === "6") {
                  metadata[metadata.length] = (window.wgULS("上传者:", "上傳者:") + $page.find("ii").attr("user"), window.wgULS("最后编辑:", "最後編輯:") + $page.find("rev").attr("user"));
                } else {
                  metadata[metadata.length] = mw.language.convertNumber(size) + window.wgULS("字节", "位元組");
                }
                subpageList[subpageList.length] = {
                  label: title + (metadata.length ? " (".concat(metadata.join("; "), ")") : ""),
                  value: title,
                  checked: true,
                  style: isProtected ? "color: #f00" : ""
                };
              });
              if (subpageList.length) {
                const pageName_ = apiobj.query.pageNameFull;
                Twinkle.batchdelete.pages[pageName_].subgroup = {
                  type: "checkbox",
                  name: "subpages",
                  className: "dbatch-subpages",
                  shiftClickSupport: true,
                  list: subpageList
                };
              }
              subpageLister.workerSuccess();
            }, null, () => {
              subpageLister.workerFailure();
            });
            qiuwen_api.post();
          }, () => {
            newPageList = Twinkle.batchdelete.generateNewPageList(form);
            $body.find("#tw-dbatch-pages").replaceWith(newPageList);
            var _iterator61 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages")), _step61;
            try {
              for (_iterator61.s(); !(_step61 = _iterator61.n()).done; ) {
                const checkbox = _step61.value;
                generateArrowLinks(checkbox);
              }
            } catch (err) {
              _iterator61.e(err);
            } finally {
              _iterator61.f();
            }
            var _iterator62 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages.subpages")), _step62;
            try {
              for (_iterator62.s(); !(_step62 = _iterator62.n()).done; ) {
                const checkbox = _step62.value;
                generateArrowLinks(checkbox);
              }
            } catch (err) {
              _iterator62.e(err);
            } finally {
              _iterator62.f();
            }
            subpagesLoaded = true;
            $body.find("#dbatch-subpage-loading").remove();
          });
        } else if (!e.target.checked) {
          var _iterator63 = _createForOfIteratorHelper(Twinkle.batchdelete.pages), _step63;
          try {
            for (_iterator63.s(); !(_step63 = _iterator63.n()).done; ) {
              const el = _step63.value;
              if (el.subgroup) {
                el.subgroup_ = el.subgroup;
                el.subgroup = null;
              }
            }
          } catch (err) {
            _iterator63.e(err);
          } finally {
            _iterator63.f();
          }
          newPageList = Twinkle.batchdelete.generateNewPageList(form);
          $body.find("#tw-dbatch-pages").replaceWith(newPageList);
          var _iterator64 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages")), _step64;
          try {
            for (_iterator64.s(); !(_step64 = _iterator64.n()).done; ) {
              const checkbox = _step64.value;
              generateArrowLinks(checkbox);
            }
          } catch (err) {
            _iterator64.e(err);
          } finally {
            _iterator64.f();
          }
        }
      };
      Twinkle.batchdelete.callback.evaluate = (event) => {
        Morebits.wiki.actionCompleted.notice = window.wgULS("批量删除已完成", "批次刪除已完成");
        const form = event.target;
        const numProtected = $(Morebits.quickForm.getElements(form, "pages")).filter((_index, element) => {
          return element.checked && element.nextElementSibling.style.color === "red";
        }).length;
        if (numProtected > 0 && !confirm(window.wgULS("您正要删除 ", "您正要刪除 ") + mw.language.convertNumber(numProtected) + window.wgULS(" 个全保护页面,您确定吗?", " 個全保護頁面,您確定嗎?"))) {
          return;
        }
        const pages = form.getChecked("pages");
        const subpages = form.getChecked("pages.subpages");
        const reason = form.reason.value;
        const delete_page = form.delete_page.checked;
        let delete_talk;
        let delete_redirects;
        let delete_subpages;
        let delete_subpage_redirects;
        let delete_subpage_talks;
        let unlink_subpages;
        if (delete_page) {
          delete_talk = form.delete_talk.checked;
          delete_redirects = form.delete_redirects.checked;
          delete_subpages = form.delete_subpages.checked;
          if (delete_subpages) {
            delete_subpage_redirects = form.delete_subpage_redirects.checked;
            delete_subpage_talks = form.delete_subpage_talks.checked;
            unlink_subpages = form.unlink_subpages.checked;
          }
        }
        const unlink_page = form.unlink_page.checked;
        const unlink_file = form.unlink_file.checked;
        if (!reason) {
          void mw.notify(window.wgULS("您需要给出一个理由", "您需要給出一個理由"), {
            type: "warn",
            tag: "twinklebatchdelete"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        if (!pages) {
          Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("没有要删除的内容,中止", "沒有要刪除的內容,中止"));
          return;
        }
        const pageDeleter = new Morebits.batchOperation(delete_page ? window.wgULS("正在删除页面", "正在刪除頁面") : window.wgULS("正在启动要求的任务", "正在啟動要求的任務"));
        pageDeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
        pageDeleter.setOption("preserveIndividualStatusLines", delete_page);
        pageDeleter.setPageList(pages);
        pageDeleter.run((pageName) => {
          const params = {
            page: pageName,
            delete_page,
            delete_talk,
            delete_redirects,
            unlink_page,
            unlink_file: unlink_file && new RegExp("^".concat(Morebits.namespaceRegex(6), ":"), "i").test(pageName),
            reason,
            pageDeleter
          };
          const qiuwen_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除页面 ", "正在刪除頁面 ") + pageName);
          qiuwen_page.setCallbackParameters(params);
          if (delete_page) {
            qiuwen_page.setEditSummary("".concat(reason, "(批量)"));
            qiuwen_page.setChangeTags(Twinkle.changeTags);
            qiuwen_page.suppressProtectWarning();
            qiuwen_page.deletePage(Twinkle.batchdelete.callbacks.doExtras, pageDeleter.workerFailure);
          } else {
            Twinkle.batchdelete.callbacks.doExtras(qiuwen_page);
          }
        }, () => {
          if (delete_subpages) {
            const subpageDeleter = new Morebits.batchOperation(window.wgULS("正在删除子页面", "正在刪除子頁面"));
            subpageDeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
            subpageDeleter.setOption("preserveIndividualStatusLines", true);
            subpageDeleter.setPageList(subpages);
            subpageDeleter.run((pageName) => {
              const params = {
                page: pageName,
                delete_page: true,
                delete_talk: delete_subpage_talks,
                delete_redirects: delete_subpage_redirects,
                unlink_page: unlink_subpages,
                unlink_file: false,
                reason,
                pageDeleter: subpageDeleter
              };
              const qiuwen_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除子页面 ", "正在刪除子頁面 ") + pageName);
              qiuwen_page.setCallbackParameters(params);
              qiuwen_page.setEditSummary("".concat(reason, "(批量)"));
              qiuwen_page.setChangeTags(Twinkle.changeTags);
              qiuwen_page.suppressProtectWarning();
              qiuwen_page.deletePage(Twinkle.batchdelete.callbacks.doExtras, pageDeleter.workerFailure);
            });
          }
        });
      };
      Twinkle.batchdelete.callbacks = {
        // this stupid parameter name is a temporary thing until I implement an overhaul
        // of Morebits.wiki.* callback parameters
        doExtras: (thingWithParameters) => {
          const params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() : thingWithParameters.getCallbackParameters();
          params.pageDeleter.workerSuccess(thingWithParameters);
          let query;
          let qiuwen_api;
          if (params.unlink_page) {
            Twinkle.batchdelete.unlinkCache = {};
            query = {
              action: "query",
              list: "backlinks",
              blfilterredir: "nonredirects",
              blnamespace: [0],
              bltitle: params.page,
              bllimit: "max"
              // 500 is max for normal users, 5000 for bots and sysops
            };
            qiuwen_api = new Morebits.wiki.api(window.wgULS("正在获取链入", "正在取得連入"), query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain);
            qiuwen_api.params = params;
            qiuwen_api.post();
          }
          if (params.unlink_file) {
            query = {
              action: "query",
              list: "imageusage",
              iutitle: params.page,
              iulimit: "max"
              // 500 is max for normal users, 5000 for bots and sysops
            };
            qiuwen_api = new Morebits.wiki.api(window.wgULS("正在获取文件链入", "正在取得檔案連入"), query, Twinkle.batchdelete.callbacks.unlinkImageInstancesMain);
            qiuwen_api.params = params;
            qiuwen_api.post();
          }
          if (params.delete_page) {
            if (params.delete_redirects) {
              query = {
                action: "query",
                titles: params.page,
                prop: "redirects",
                rdlimit: "max"
                // 500 is max for normal users, 5000 for bots and sysops
              };
              qiuwen_api = new Morebits.wiki.api(window.wgULS("正在获取重定向", "正在取得重新導向"), query, Twinkle.batchdelete.callbacks.deleteRedirectsMain);
              qiuwen_api.params = params;
              qiuwen_api.post();
            }
            if (params.delete_talk) {
              const pageTitle = mw.Title.newFromText(params.page);
              if (pageTitle && pageTitle.namespace % 2 === 0 && pageTitle.namespace !== 2) {
                pageTitle.namespace++;
                query = {
                  action: "query",
                  titles: pageTitle.toText()
                };
                qiuwen_api = new Morebits.wiki.api(window.wgULS("正在检查讨论页面是否存在", "正在檢查討論頁面是否存在"), query, Twinkle.batchdelete.callbacks.deleteTalk);
                qiuwen_api.params = params;
                qiuwen_api.params.talkPage = pageTitle.toText();
                qiuwen_api.post();
              }
            }
          }
        },
        deleteRedirectsMain: (apiobj) => {
          const xml = apiobj.responseXML;
          const pages = $(xml).find("rd").map((_index, element) => {
            return $(element).attr("title");
          }).get();
          if (!pages.length) {
            return;
          }
          const redirectDeleter = new Morebits.batchOperation(window.wgULS("正在删除到 ", "正在刪除到 ") + apiobj.params.page + window.wgULS(" 的重定向", " 的重新導向"));
          redirectDeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
          redirectDeleter.setPageList(pages);
          redirectDeleter.run((pageName) => {
            const qiuwen_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除 ", "正在刪除 ") + pageName);
            qiuwen_page.setEditSummary("[[QW:CSD#G9|G9]]: ".concat(window.wgULS("指向已删页面“", "指向已刪頁面「")).concat(apiobj.params.page).concat(window.wgULS("”的重定向", "」的重新導向")));
            qiuwen_page.setChangeTags(Twinkle.changeTags);
            qiuwen_page.deletePage(redirectDeleter.workerSuccess, redirectDeleter.workerFailure);
          });
        },
        deleteTalk: (apiobj) => {
          const xml = apiobj.responseXML;
          const exists = $(xml).find("page:not([missing])").length > 0;
          if (!exists) {
            return;
          }
          const page = new Morebits.wiki.page(apiobj.params.talkPage, window.wgULS("正在删除页面 ", "正在刪除頁面 ") + apiobj.params.page + window.wgULS(" 的讨论页", " 的討論頁"));
          page.setEditSummary("[[QW:CSD#G9|G9]]: ".concat(window.wgULS("已删页面“", "已刪頁面「")).concat(apiobj.params.page).concat(window.wgULS("”的[[Help:讨论页|讨论页]]", "」的[[Help:討論頁|討論頁]]")));
          page.setChangeTags(Twinkle.changeTags);
          page.deletePage();
        },
        unlinkBacklinksMain: (apiobj) => {
          const xml = apiobj.responseXML;
          const pages = $(xml).find("bl").map((_index, element) => {
            return $(element).attr("title");
          }).get();
          if (!pages.length) {
            return;
          }
          const unlinker = new Morebits.batchOperation("正在取消到 ".concat(apiobj.params.page).concat(window.wgULS(" 的链入", " 的連入")));
          unlinker.setOption("chunkSize", Twinkle.getPref("batchChunks"));
          unlinker.setPageList(pages);
          unlinker.run((pageName) => {
            const qiuwen_page = new Morebits.wiki.page(pageName, "正在取消 ".concat(pageName).concat(window.wgULS(" 上的链入", " 上的連入")));
            const params = {
              ...apiobj.params
            };
            params.title = pageName;
            params.unlinker = unlinker;
            qiuwen_page.setCallbackParameters(params);
            qiuwen_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);
          });
        },
        unlinkBacklinks: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          if (!pageobj.exists()) {
            params.unlinker.workerSuccess(pageobj);
            return;
          }
          let text;
          if (params.title in Twinkle.batchdelete.unlinkCache) {
            text = Twinkle.batchdelete.unlinkCache[params.title];
          } else {
            text = pageobj.getPageText();
          }
          const old_text = text;
          const qiuwen_page = new Morebits.wikitext.page(text);
          text = qiuwen_page.removeLink(params.page).getText();
          Twinkle.batchdelete.unlinkCache[params.title] = text;
          if (text === old_text) {
            params.unlinker.workerSuccess(pageobj);
            return;
          }
          pageobj.setEditSummary(window.wgULS("取消到已删页面", "取消到已刪頁面") + params.page + window.wgULS("的链入", "的連入"));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setPageText(text);
          pageobj.setCreateOption("nocreate");
          pageobj.setMaxConflictRetries(10);
          pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
        },
        unlinkImageInstancesMain: (apiobj) => {
          const xml = apiobj.responseXML;
          const pages = $(xml).find("iu").map((_index, element) => {
            return $(element).attr("title");
          }).get();
          if (!pages.length) {
            return;
          }
          const unlinker = new Morebits.batchOperation("正在取消到 ".concat(apiobj.params.page).concat(window.wgULS(" 的链入", " 的連入")));
          unlinker.setOption("chunkSize", Twinkle.getPref("batchChunks"));
          unlinker.setPageList(pages);
          unlinker.run((pageName) => {
            const qiuwen_page = new Morebits.wiki.page(pageName, "取消 ".concat(pageName).concat(window.wgULS(" 的文件使用", " 的檔案使用")));
            const params = {
              ...apiobj.params
            };
            params.title = pageName;
            params.unlinker = unlinker;
            qiuwen_page.setCallbackParameters(params);
            qiuwen_page.load(Twinkle.batchdelete.callbacks.unlinkImageInstances);
          });
        },
        unlinkImageInstances: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          if (!pageobj.exists()) {
            params.unlinker.workerSuccess(pageobj);
            return;
          }
          const image = params.page.replace(new RegExp("^".concat(Morebits.namespaceRegex(6), ":")), "");
          let text;
          if (params.title in Twinkle.batchdelete.unlinkCache) {
            text = Twinkle.batchdelete.unlinkCache[params.title];
          } else {
            text = pageobj.getPageText();
          }
          const old_text = text;
          const qiuwen_page = new Morebits.wikitext.page(text);
          text = qiuwen_page.commentOutImage(image, window.wgULS("因文件已删,故注解", "因檔案已刪,故註解")).getText();
          Twinkle.batchdelete.unlinkCache[params.title] = text;
          if (text === old_text) {
            pageobj.getStatusElement().error("在 ".concat(pageobj.getPageName(), " 上取消 ").concat(image).concat(window.wgULS(" 的文件使用失败", " 的檔案使用失敗")));
            params.unlinker.workerFailure(pageobj);
            return;
          }
          pageobj.setEditSummary(window.wgULS("取消使用已被删除文件", "取消使用已被刪除檔案") + image + window.wgULS(",因为:", ",因為:") + params.reason);
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setPageText(text);
          pageobj.setCreateOption("nocreate");
          pageobj.setMaxConflictRetries(10);
          pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
        }
      };
      Twinkle.addInitCallback(Twinkle.batchdelete, "batchdelete");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklebatchundelete.js
var twinklebatchundelete_exports = {};
var init_twinklebatchundelete = __esm({
  "src/Twinkle/modules/twinklebatchundelete.js"() {
    "use strict";
    /*! Twinkle.js - twinklebatchundelete.js */
    (function twinklebatchundelete($) {
      Twinkle.batchundelete = () => {
        if (!Morebits.userIsSysop || !mw.config.get("wgArticleId") || mw.config.get("wgNamespaceNumber") !== mw.config.get("wgNamespaceIds").user && mw.config.get("wgNamespaceNumber") !== mw.config.get("wgNamespaceIds").project) {
          return;
        }
        Twinkle.addPortletLink(Twinkle.batchundelete.callback, window.wgULS("批复", "批復"), "tw-batch-undel", window.wgULS("反删除页面", "反刪除頁面"));
      };
      Twinkle.batchundelete.callback = () => {
        const Window = new Morebits.simpleWindow(600, 400);
        Window.setScriptName("Twinkle");
        Window.setTitle(window.wgULS("批量反删除", "批次反刪除"));
        Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#batchundelete");
        const form = new Morebits.quickForm(Twinkle.batchundelete.callback.evaluate);
        form.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("若存在已删除的讨论页,也恢复", "若存在已刪除的討論頁,也恢復"),
            name: "undel_talk",
            value: "undel_talk",
            checked: true
          }]
        });
        form.append({
          type: "input",
          name: "reason",
          label: "理由:",
          size: 60
        });
        const statusdiv = document.createElement("div");
        statusdiv.style.padding = "15px";
        Window.setContent(statusdiv);
        Morebits.status.init(statusdiv);
        Window.display();
        const query = {
          action: "query",
          generator: "links",
          prop: "info",
          inprop: "protection",
          titles: mw.config.get("wgPageName"),
          gpllimit: Twinkle.getPref("batchMax")
        };
        const statelem = new Morebits.status(window.wgULS("抓取页面列表", "抓取頁面列表"));
        const qiuwen_api = new Morebits.wiki.api(window.wgULS("加载中…", "載入中…"), query, (apiobj) => {
          const xml = apiobj.responseXML;
          const $pages = $(xml).find("page[missing]");
          const list = [];
          $pages.each((_index, page) => {
            const $page = $(page);
            const title = $page.attr("title");
            const $editprot = $page.find('pr[type="create"][level="sysop"]');
            const isProtected = $editprot.length > 0;
            list[list.length] = {
              label: title + (isProtected ? "(".concat(window.wgULS("全保护,", "全保護,")).concat($editprot.attr("expiry") === "infinity" ? window.wgULS("无限期", "無限期") : "".concat(new Morebits.date($editprot.attr("expiry")).calendar("utc"), " (UTC)").concat(window.wgULS("过期", "過期")), ")") : ""),
              value: title,
              checked: true,
              style: isProtected ? "color: #f00" : ""
            };
          });
          apiobj.params.form.append({
            type: "header",
            label: window.wgULS("待恢复页面", "待恢復頁面")
          });
          apiobj.params.form.append({
            type: "button",
            label: window.wgULS("全选", "全選"),
            event: (e) => {
              $(Morebits.quickForm.getElements(e.target.form, "pages")).prop("checked", true);
            }
          });
          apiobj.params.form.append({
            type: "button",
            label: window.wgULS("全不选", "全不選"),
            event: (e) => {
              $(Morebits.quickForm.getElements(e.target.form, "pages")).prop("checked", false);
            }
          });
          apiobj.params.form.append({
            type: "checkbox",
            name: "pages",
            shiftClickSupport: true,
            list
          });
          apiobj.params.form.append({
            type: "submit"
          });
          const result = apiobj.params.form.render();
          apiobj.params.Window.setContent(result);
        }, statelem);
        qiuwen_api.params = {
          form,
          Window
        };
        qiuwen_api.post();
      };
      Twinkle.batchundelete.callback.evaluate = (event) => {
        Morebits.wiki.actionCompleted.notice = window.wgULS("反删除已完成", "反刪除已完成");
        const numProtected = $(Morebits.quickForm.getElements(event.target, "pages")).filter((_index, element) => {
          return element.checked && element.nextElementSibling.style.color === "red";
        }).length;
        if (numProtected > 0 && !confirm(window.wgULS("您正要反删除 ", "您正要反刪除 ") + numProtected + window.wgULS(" 个全保护页面,您确定吗?", " 個全保護頁面,您確定嗎?"))) {
          return;
        }
        const pages = event.target.getChecked("pages");
        const reason = event.target.reason.value;
        const undel_talk = event.target.reason.value;
        if (!reason) {
          void mw.notify("您需要指定理由。", {
            type: "warn",
            tag: "twinklebatchundelete"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(event.target);
        if (!pages) {
          Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("没什么要反删除的,取消操作", "沒什麼要反刪除的,取消操作"));
          return;
        }
        const pageUndeleter = new Morebits.batchOperation(window.wgULS("反删除页面", "反刪除頁面"));
        pageUndeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
        pageUndeleter.setOption("preserveIndividualStatusLines", true);
        pageUndeleter.setPageList(pages);
        pageUndeleter.run((pageName) => {
          const params = {
            page: pageName,
            undel_talk,
            reason,
            pageUndeleter
          };
          const qiuwen_page = new Morebits.wiki.page(pageName, window.wgULS("反删除页面", "反刪除頁面") + pageName);
          qiuwen_page.setCallbackParameters(params);
          qiuwen_page.setEditSummary("".concat(reason, " (批量)"));
          qiuwen_page.setChangeTags(Twinkle.changeTags);
          qiuwen_page.suppressProtectWarning();
          qiuwen_page.setMaxRetries(3);
          qiuwen_page.undeletePage(Twinkle.batchundelete.callbacks.doExtras, pageUndeleter.workerFailure);
        });
      };
      Twinkle.batchundelete.callbacks = {
        // this stupid parameter name is a temporary thing until I implement an overhaul
        // of Morebits.wiki.* callback parameters
        doExtras: (thingWithParameters) => {
          const params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() : thingWithParameters.getCallbackParameters();
          params.pageUndeleter.workerSuccess(thingWithParameters);
          let query;
          let qiuwen_api;
          if (params.undel_talk) {
            const talkpagename = new mw.Title(params.page).getTalkPage().getPrefixedText();
            if (talkpagename !== params.page) {
              query = {
                action: "query",
                prop: "deletedrevisions",
                drvprop: "ids",
                drvlimit: 1,
                titles: talkpagename
              };
              qiuwen_api = new Morebits.wiki.api(window.wgULS("检查讨论页的已删版本", "檢查討論頁的已刪版本"), query, Twinkle.batchundelete.callbacks.undeleteTalk);
              qiuwen_api.params = params;
              qiuwen_api.params.talkPage = talkpagename;
              qiuwen_api.post();
            }
          }
        },
        undeleteTalk: (apiobj) => {
          const xml = apiobj.responseXML;
          const exists = $(xml).find("page:not([missing])").length > 0;
          const delrevs = $(xml).find("rev").attr("revid");
          if (exists || !delrevs) {
            return;
          }
          const page = new Morebits.wiki.page(apiobj.params.talkPage, window.wgULS("正在反删除", "正在反刪除") + apiobj.params.page + window.wgULS("的讨论页", "的討論頁"));
          page.setEditSummary(window.wgULS("反删除“", "反刪除「") + apiobj.params.page + window.wgULS("”的[[Help:讨论页|讨论页]]", "」的[[Help:討論頁|討論頁]]"));
          page.setChangeTags(Twinkle.changeTags);
          page.undeletePage();
        }
      };
      Twinkle.addInitCallback(Twinkle.batchundelete, "batchundelete");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinklebatchprotect.js
var twinklebatchprotect_exports = {};
var init_twinklebatchprotect = __esm({
  "src/Twinkle/modules/twinklebatchprotect.js"() {
    "use strict";
    /*! Twinkle.js - twinklebatchprotect.js */
    (function twinklebatchprotect($) {
      Twinkle.batchprotect = () => {
        if (Morebits.userIsSysop && (mw.config.get("wgArticleId") > 0 && [2, 4].includes(mw.config.get("wgNamespaceNumber")) || mw.config.get("wgNamespaceNumber") === 14 || mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex")) {
          Twinkle.addPortletLink(Twinkle.batchprotect.callback, "批保", "tw-pbatch", "批量保护链出页面");
        }
      };
      Twinkle.batchprotect.unlinkCache = {};
      Twinkle.batchprotect.callback = () => {
        const Window = new Morebits.simpleWindow(600, 400);
        Window.setTitle("批保");
        Window.setScriptName("Twinkle");
        Window.addFooterLink("保护方针", "QW:PROT");
        Window.addFooterLink(window.wgULS("帮助文档", "幫助文檔"), "H:TW/DOC#保护");
        Window.addFooterLink(window.wgULS("问题反馈", "問題反饋"), "HT:TW");
        const form = new Morebits.quickForm(Twinkle.batchprotect.callback.evaluate);
        form.append({
          type: "checkbox",
          event: Twinkle.protect.formevents.editmodify,
          list: [{
            label: "修改编辑保护",
            value: "editmodify",
            name: "editmodify",
            tooltip: "仅限现有页面。",
            checked: true
          }]
        });
        form.append({
          type: "select",
          name: "editlevel",
          label: "编辑权限:",
          event: Twinkle.protect.formevents.editlevel,
          list: Twinkle.protect.protectionLevels
        });
        form.append({
          type: "select",
          name: "editexpiry",
          label: "终止时间:",
          event: (event) => {
            if (event.target.value === "custom") {
              Twinkle.protect.doCustomExpiry(event.target);
            }
          },
          list: Twinkle.protect.protectionLengths
          // Default (2 days) set after render
        });
        form.append({
          type: "checkbox",
          event: Twinkle.protect.formevents.movemodify,
          list: [{
            label: "修改移动保护",
            value: "movemodify",
            name: "movemodify",
            tooltip: "仅限现有页面。",
            checked: true
          }]
        });
        form.append({
          type: "select",
          name: "movelevel",
          label: "移动权限:",
          event: Twinkle.protect.formevents.movelevel,
          list: Twinkle.protect.protectionLevels.filter(
            // Autoconfirmed is required for a move, redundant
            (protLevel) => {
              return protLevel.value !== "autoconfirmed";
            }
          )
        });
        form.append({
          type: "select",
          name: "moveexpiry",
          label: "终止时间:",
          event: (event) => {
            if (event.target.value === "custom") {
              Twinkle.protect.doCustomExpiry(event.target);
            }
          },
          list: Twinkle.protect.protectionLengths
          // Default (2 days) set after render
        });
        form.append({
          type: "checkbox",
          event: (event) => {
            event.target.form.createlevel.disabled = !event.target.checked;
            event.target.form.createexpiry.disabled = !event.target.checked || event.target.form.createlevel.value === "all";
            event.target.form.createlevel.style.color = event.target.checked ? "" : "transparent";
            event.target.form.createexpiry.style.color = event.target.checked ? "" : "transparent";
          },
          list: [{
            label: "修改创建保护",
            value: "createmodify",
            name: "createmodify",
            tooltip: "仅限不存在的页面。",
            checked: true
          }]
        });
        form.append({
          type: "select",
          name: "createlevel",
          label: "创建权限:",
          event: Twinkle.protect.formevents.createlevel,
          list: Twinkle.protect.protectionLevels
        });
        form.append({
          type: "select",
          name: "createexpiry",
          label: "终止时间:",
          event: (event) => {
            if (event.target.value === "custom") {
              Twinkle.protect.doCustomExpiry(event.target);
            }
          },
          list: Twinkle.protect.protectionLengths
          // Default (indefinite) set after render
        });
        form.append({
          type: "header",
          label: ""
          // horizontal rule
        });
        form.append({
          type: "input",
          name: "reason",
          label: "理由(保护日志)",
          size: 60
        });
        const query = {
          action: "query",
          prop: "revisions|info|imageinfo",
          rvprop: "size|user",
          inprop: "protection",
          format: "json"
        };
        if (mw.config.get("wgNamespaceNumber") === 14) {
          query.generator = "categorymembers";
          query.gcmtitle = mw.config.get("wgPageName");
          query.gcmlimit = Twinkle.getPref("batchMax");
        } else if (mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex") {
          query.generator = "allpages";
          query.gapnamespace = mw.util.getParamValue("namespace") || document.querySelectorAll("select[name=namespace]")[0].value;
          query.gapprefix = mw.util.getParamValue("prefix") || document.querySelectorAll("input[name=prefix]")[0].value;
          query.gaplimit = Twinkle.getPref("batchMax");
        } else {
          query.generator = "links";
          query.titles = mw.config.get("wgPageName");
          query.gpllimit = Twinkle.getPref("batchMax");
        }
        const statusdiv = document.createElement("div");
        statusdiv.style.padding = "15px";
        Window.setContent(statusdiv);
        Morebits.status.init(statusdiv);
        Window.display();
        const statelem = new Morebits.status("抓取页面列表");
        const qiuwen_api = new Morebits.wiki.api("加载中……", query, (apiobj) => {
          const response = apiobj.getResponse();
          const pages = response.query && response.query.pages || [];
          const list = [];
          pages.sort(Twinkle.sortByNamespace);
          var _iterator65 = _createForOfIteratorHelper(pages), _step65;
          try {
            for (_iterator65.s(); !(_step65 = _iterator65.n()).done; ) {
              const page = _step65.value;
              const metadata = [];
              const missing = !!page.missing;
              let editProt;
              if (missing) {
                metadata[metadata.length] = "页面不存在";
                editProt = page.protection.filter((protection) => {
                  return protection.type === "create" && protection.level === "sysop";
                }).pop();
              } else {
                if (page.redirect) {
                  metadata[metadata.length] = "重定向";
                }
                if (page.ns === 6) {
                  metadata[metadata.length] = ("上传者:".concat(page.imageinfo[0].user), "最后编辑者:".concat(page.revisions[0].user));
                } else {
                  metadata[metadata.length] = "".concat(mw.language.convertNumber(page.revisions[0].size), "字节");
                }
                editProt = page.protection.filter((protection) => {
                  return protection.type === "edit" && protection.level === "sysop";
                }).pop();
              }
              if (editProt) {
                metadata[metadata.length] = "".concat(missing ? "白纸" : "", "全保护").concat(editProt.expiry === "infinity" ? "(永久)" : "(".concat(new Morebits.date(editProt.expiry).calendar("utc"), " (UTC)过期)"));
              }
              const {
                title
              } = page;
              list[list.length] = {
                label: title + (metadata.length > 0 ? " (".concat(metadata.join("; "), ")") : ""),
                value: title,
                checked: true,
                style: editProt ? "color: #f00" : ""
              };
            }
          } catch (err) {
            _iterator65.e(err);
          } finally {
            _iterator65.f();
          }
          form.append({
            type: "header",
            label: "待保护页面"
          });
          form.append({
            type: "button",
            label: "全选",
            event: (event) => {
              $(Morebits.quickForm.getElements(event.target.form, "pages")).prop("checked", true);
            }
          });
          form.append({
            type: "button",
            label: "全不选",
            event: (event) => {
              $(Morebits.quickForm.getElements(event.target.form, "pages")).prop("checked", false);
            }
          });
          form.append({
            type: "checkbox",
            name: "pages",
            shiftClickSupport: true,
            list
          });
          form.append({
            type: "submit"
          });
          const result = form.render();
          Window.setContent(result);
          result.editexpiry.value = "2 days";
          result.moveexpiry.value = "2 days";
          result.createexpiry.value = "infinity";
          var _iterator66 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "个页面")), _step66;
          try {
            for (_iterator66.s(); !(_step66 = _iterator66.n()).done; ) {
              const links = _step66.value;
              Twinkle.generateArrowLinks(links);
            }
          } catch (err) {
            _iterator66.e(err);
          } finally {
            _iterator66.f();
          }
        }, statelem);
        qiuwen_api.post();
      };
      Twinkle.batchprotect.currentProtectCounter = 0;
      Twinkle.batchprotect.currentprotector = 0;
      Twinkle.batchprotect.callback.evaluate = (event) => {
        Morebits.wiki.actionCompleted.notice = "批量保护完成";
        const form = event.target;
        const numProtected = $(Morebits.quickForm.getElements(form, "个页面")).filter((_index, element) => {
          return element.checked && element.nextElementSibling.style.color === "#f00";
        }).length;
        if (numProtected > 0 && !confirm("您即将对".concat(mw.language.convertNumber(numProtected), "个全保护页面进行操作。您确定吗?"))) {
          return;
        }
        const input = Morebits.quickForm.getInputData(form);
        if (!input.reason) {
          void mw.notify("您必须给出一个理由。", {
            type: "warn",
            tag: "twinklebatchprotect"
          });
          return;
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        if (input.pages.length === 0) {
          Morebits.status.error("Error", "待保护页面不存在,程序终止");
          return;
        }
        const batchOperation = new Morebits.batchOperation("应用保护设置");
        batchOperation.setOption("chunkSize", Twinkle.getPref("batchChunks"));
        batchOperation.setOption("preserveIndividualStatusLines", true);
        batchOperation.setPageList(input.pages);
        batchOperation.run((pageName) => {
          const query = {
            action: "query",
            titles: pageName,
            format: "json"
          };
          const qiuwen_api = new Morebits.wiki.api("正在检查页面“".concat(pageName, "”是否存在"), query, Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure);
          qiuwen_api.params = {
            page: pageName,
            batchOperation,
            ...input
          };
          qiuwen_api.post();
        });
      };
      Twinkle.batchprotect.callbacks = {
        main: (apiobj) => {
          const response = apiobj.getResponse();
          if (response.query.normalized) {
            apiobj.params.page = response.query.normalized[0].to;
          }
          const exists = !response.query.pages[0].missing;
          const page = new Morebits.wiki.page(apiobj.params.page, "正在保护".concat(apiobj.params.page));
          let takenAction = false;
          if (exists && apiobj.params.editmodify) {
            page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);
            takenAction = true;
          }
          if (exists && apiobj.params.movemodify) {
            page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);
            takenAction = true;
          }
          if (!exists && apiobj.params.createmodify) {
            page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);
            takenAction = true;
          }
          if (!takenAction) {
            Morebits.status.warn("正在保护“".concat(apiobj.params.page), "”页面".concat(exists ? "存在" : "不存在", ";无事可做,跳过"));
            apiobj.params.batchOperation.workerFailure(apiobj);
            return;
          }
          page.setEditSummary(apiobj.params.reason);
          page.setChangeTags(Twinkle.changeTags);
          page.protect(apiobj.params.batchOperation.workerSuccess, apiobj.params.batchOperation.workerFailure);
        }
      };
      Twinkle.addInitCallback(Twinkle.batchprotect, "batchprotect");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinkleclose.js
var twinkleclose_exports = {};
var init_twinkleclose = __esm({
  "src/Twinkle/modules/twinkleclose.js"() {
    "use strict";
    /*! Twinkle.js - twinkleclose.js */
    (function twinkleclose($) {
      const $body = $("body");
      Twinkle.close = () => {
        if (Twinkle.getPref("XfdClose") === "hide" || !/^Qiuwen([_ ]talk)?:存废讨论\/记录(?:\/\d+){3}$/.test(mw.config.get("wgPageName"))) {
          return;
        }
        mw.hook("wikipage.content").add((item) => {
          if (item.attr("id") === "mw-content-text") {
            Twinkle.close.addLinks();
          }
        });
      };
      Twinkle.close.addLinks = () => {
        const spanTag = (color, content) => {
          const span = document.createElement("span");
          span.style.color = color;
          span.appendChild(document.createTextNode(content));
          return span;
        };
        $body.find("h1:has(.mw-headline),h2:has(.mw-headline),h3:has(.mw-headline),h4:has(.mw-headline),h5:has(.mw-headline),h6:has(.mw-headline)", "#bodyContent").each((index, element) => {
          element.dataset.section = index + 1;
        });
        const selector = ":has(.mw-headline a:only-of-type):not(:has(+ div.NavFrame))";
        const titles = $body.find("#bodyContent").find("h2".concat(selector, ":not(:has(+ p + h3)), h3").concat(selector));
        const delNode = document.createElement("strong");
        const delLink = document.createElement("a");
        delLink.appendChild(spanTag("Black", "["));
        delLink.appendChild(spanTag("Red", window.wgULS("关闭讨论", "關閉討論")));
        delLink.appendChild(spanTag("Black", "]"));
        delNode.appendChild(delLink);
        var _iterator67 = _createForOfIteratorHelper(titles), _step67;
        try {
          for (_iterator67.s(); !(_step67 = _iterator67.n()).done; ) {
            const current = _step67.value;
            const headlinehref = $(current).find(".mw-headline a:not(.ext-discussiontools-init-section-subscribe-link)").attr("href");
            if (headlinehref !== void 0) {
              let title = null;
              if (headlinehref.includes("redlink=1")) {
                title = headlinehref.slice(19, -22);
              } else {
                const m = headlinehref.match(/\/wiki\/([^?]+)/, "$1");
                if (m !== null) {
                  [, title] = m;
                }
              }
              if (title !== null) {
                title = decodeURIComponent(title);
                title = title.replace(/_/g, " ");
                const pagenotexist = $(current).find(".mw-headline a").hasClass("new");
                const {
                  section
                } = current.dataset;
                const [node] = current.querySelectorAll(".mw-headline");
                node.appendChild(document.createTextNode(" "));
                const tmpNode = delNode.cloneNode(true);
                tmpNode.firstChild.href = "#".concat(section);
                $(tmpNode.firstChild).on("click", () => {
                  Twinkle.close.callback(title, section, pagenotexist);
                  return false;
                });
                node.appendChild(tmpNode);
              }
            }
          }
        } catch (err) {
          _iterator67.e(err);
        } finally {
          _iterator67.f();
        }
      };
      Twinkle.close.codes = [{
        key: window.wgULS("请求无效", "請求無效"),
        value: {
          ir: {
            label: window.wgULS("请求无效", "請求無效"),
            action: "keep"
          },
          rep: {
            label: window.wgULS("重复提出,无效", "重複提出,無效"),
            action: "keep"
          },
          ne: {
            label: window.wgULS("目标页面或文件不存在,无效", "目標頁面或檔案不存在,無效"),
            action: "keep"
          },
          nq: {
            label: window.wgULS("提删者未获取提删资格,无效", "提刪者未取得提刪資格,無效"),
            action: "keep"
          }
        }
      }, {
        key: "保留",
        value: {
          k: {
            label: "保留",
            action: "keep",
            adminonly: true
          },
          sk: {
            label: "快速保留",
            action: "keep"
          },
          tk: {
            label: window.wgULS("暂时保留,改挂维护模板(关注度等)", "暫時保留,改掛維護模板(關注度等)"),
            value: window.wgULS("暂时保留", "暫時保留"),
            action: "keep"
          },
          rr: {
            label: window.wgULS("请求理由消失", "請求理由消失"),
            action: "keep",
            selected: Twinkle.getPref("XfdClose") === "nonadminonly"
          },
          dan: {
            label: window.wgULS("删后重建", "刪後重建"),
            action: "keep",
            adminonly: true
          }
        }
      }, {
        key: window.wgULS("删除", "刪除"),
        value: {
          d: {
            label: window.wgULS("删除", "刪除"),
            action: "del",
            adminonly: true,
            selected: Twinkle.getPref("XfdClose") === "all"
          },
          ic: {
            label: window.wgULS("图像因侵权被删", "圖像因侵權被刪"),
            action: "del",
            adminonly: true
          }
        }
      }, {
        key: window.wgULS("快速删除", "快速刪除"),
        value: {
          sd: {
            label: window.wgULS("快速删除", "快速刪除"),
            action: "del"
          },
          lssd: {
            label: window.wgULS("无来源或著作权信息,快速删除", "無來源或版權資訊,快速刪除"),
            action: "del"
          },
          svg: {
            label: window.wgULS("已改用SVG图形,快速删除", "已改用SVG圖形,快速刪除"),
            action: "del"
          },
          drep: {
            label: window.wgULS("多次被删除,条目锁定", "多次被刪除,條目鎖定"),
            action: "del",
            adminonly: true
          }
        }
      }, {
        key: window.wgULS("其他处理方法", "其他處理方法"),
        value: {
          c: {
            label: window.wgULS("转交侵权", "轉交侵權"),
            action: "noop"
          },
          r: {
            label: "重定向",
            action: "keep",
            adminonly: true
          },
          cr: {
            label: window.wgULS("分类重定向", "分類重定向"),
            action: "keep",
            adminonly: true
          },
          m: {
            label: window.wgULS("移动", "移動"),
            action: "keep",
            adminonly: true
          },
          merge: {
            label: window.wgULS("并入", "併入"),
            action: "keep",
            adminonly: true
          },
          mergeapproved: {
            label: window.wgULS("允许并入", "允許併入"),
            action: "keep",
            adminonly: true
          },
          nc: {
            label: window.wgULS("无共识暂时保留", "無共識暫時保留"),
            value: window.wgULS("无共识", "無共識"),
            action: "keep"
          }
        }
      }];
      Twinkle.close.callback = (title, section, noop) => {
        const Window = new Morebits.simpleWindow(410, 200);
        Window.setTitle("关闭存废讨论 · ".concat(title));
        Window.setScriptName("Twinkle");
        Window.addFooterLink("存废讨论设置", "H:TW/PREF#关闭存废讨论");
        Window.addFooterLink("Twinkle帮助", "H:TW/DOC#关闭存废讨论");
        const form = new Morebits.quickForm(Twinkle.close.callback.evaluate);
        form.append({
          type: "select",
          label: "处理结果:",
          name: "sub_group",
          event: Twinkle.close.callback.change_code
        });
        form.append({
          type: "input",
          name: "sdreason",
          label: "速删理由:",
          tooltip: "用于删除日志,使用{{delete}}的参数格式,例如 A1 或 A1|G1",
          hidden: true
        });
        form.append({
          type: "input",
          name: "remark",
          label: "补充说明:"
        });
        form.append({
          type: "checkbox",
          list: [{
            label: "只关闭讨论,不进行其他操作",
            value: "noop",
            name: "noop",
            event: Twinkle.close.callback.change_operation,
            checked: noop
          }]
        });
        if (new mw.Title(title).namespace % 2 === 0 && new mw.Title(title).namespace !== 2) {
          form.append({
            type: "checkbox",
            list: [{
              label: "删除关联的讨论页",
              value: "talkpage",
              name: "talkpage",
              tooltip: "删除时附带删除此页面的讨论页。",
              checked: true,
              event: (e) => {
                e.stopPropagation();
              }
            }]
          });
        }
        form.append({
          type: "checkbox",
          list: [{
            label: "删除重定向页",
            value: "redirects",
            name: "redirects",
            tooltip: "删除到此页的重定向。",
            checked: true,
            event: (e) => {
              e.stopPropagation();
            }
          }]
        });
        form.append({
          type: "submit"
        });
        const result = form.render();
        Window.setContent(result);
        Window.display();
        const [sub_group] = result.querySelectorAll("select");
        const resultData = {
          title,
          section: Number.parseInt(section, 10),
          noop
        };
        $(result).data("resultData", resultData);
        const createEntries = (contents, container) => {
          for (var _i16 = 0, _Object$entries9 = Object.entries(contents); _i16 < _Object$entries9.length; _i16++) {
            const [itemKey, itemProperties] = _Object$entries9[_i16];
            const key = typeof itemKey === "string" ? itemKey : itemProperties.value;
            const elem = new Morebits.quickForm.element({
              type: "option",
              label: "".concat(key, ":").concat(itemProperties.label),
              value: key,
              selected: itemProperties.selected,
              disabled: Twinkle.getPref("XfdClose") !== "all" && itemProperties.adminonly || itemProperties.disabled
            });
            const elemRendered = container.appendChild(elem.render());
            $(elemRendered).data("messageData", itemProperties);
          }
        };
        var _iterator68 = _createForOfIteratorHelper(Twinkle.close.codes), _step68;
        try {
          for (_iterator68.s(); !(_step68 = _iterator68.n()).done; ) {
            const group = _step68.value;
            let optgroup = new Morebits.quickForm.element({
              type: "optgroup",
              label: group.key
            });
            optgroup = optgroup.render();
            sub_group.appendChild(optgroup);
            createEntries(group.value, optgroup);
          }
        } catch (err) {
          _iterator68.e(err);
        } finally {
          _iterator68.f();
        }
        const event = document.createEvent("Event");
        event.initEvent("change", true, true);
        result.sub_group.dispatchEvent(event);
      };
      Twinkle.close.callback.change_operation = (e) => {
        const noop = e.target.checked;
        const code = e.target.form.sub_group.value;
        const messageData = $(e.target.form.sub_group).find('option[value="'.concat(code, '"]')).data("messageData");
        const {
          talkpage
        } = e.target.form;
        const {
          redirects
        } = e.target.form;
        if (noop || messageData.action === "keep") {
          if (talkpage) {
            talkpage.checked = false;
            talkpage.disabled = true;
          }
          redirects.checked = false;
          redirects.disabled = true;
        } else {
          if (talkpage) {
            talkpage.checked = true;
            talkpage.disabled = false;
          }
          redirects.checked = true;
          redirects.disabled = false;
        }
      };
      Twinkle.close.callback.change_code = (e) => {
        const resultData = $(e.target.form).data("resultData");
        const messageData = $(e.target).find('option[value="'.concat(e.target.value, '"]')).data("messageData");
        const {
          noop
        } = e.target.form;
        const {
          talkpage
        } = e.target.form;
        const {
          redirects
        } = e.target.form;
        if (resultData.noop || messageData.action === "noop") {
          noop.checked = true;
          noop.disabled = true;
          if (talkpage) {
            talkpage.checked = false;
            talkpage.disabled = true;
          }
          redirects.checked = false;
          redirects.disabled = true;
        } else {
          noop.checked = false;
          noop.disabled = false;
          if (messageData.action === "keep") {
            if (talkpage) {
              talkpage.checked = false;
              talkpage.disabled = true;
            }
            redirects.checked = false;
            redirects.disabled = true;
          } else {
            if (talkpage) {
              talkpage.checked = true;
              talkpage.disabled = false;
            }
            redirects.checked = true;
            redirects.disabled = false;
          }
          if (e.target.value === "sd") {
            e.target.form.sdreason.parentElement.removeAttribute("hidden");
          } else {
            e.target.form.sdreason.parentElement.setAttribute("hidden", "");
          }
        }
      };
      Twinkle.close.callback.evaluate = (e) => {
        const code = e.target.sub_group.value;
        const resultData = $(e.target).data("resultData");
        const messageData = $(e.target.sub_group).find('option[value="'.concat(code, '"]')).data("messageData");
        const noop = e.target.noop.checked;
        const talkpage = e.target.talkpage && e.target.talkpage.checked;
        const redirects = e.target.redirects.checked;
        const params = {
          title: resultData.title,
          code,
          remark: e.target.remark.value,
          sdreason: e.target.sdreason.value,
          section: resultData.section,
          parentSection: resultData.parentSection,
          messageData,
          talkpage,
          redirects
        };
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(e.target);
        Morebits.wiki.actionCompleted.notice = "操作完成";
        if (noop || messageData.action === "noop") {
          Twinkle.close.callbacks.talkend(params);
        } else {
          switch (messageData.action) {
            case "del":
              Twinkle.close.callbacks.del(params);
              break;
            case "keep": {
              const qiuwen_page = new Morebits.wiki.page(params.title, "移除存废讨论模板");
              qiuwen_page.setCallbackParameters(params);
              qiuwen_page.load(Twinkle.close.callbacks.keep);
              break;
            }
            default:
              void mw.notify("关闭存废讨论:未定义 ".concat(code), {
                type: "warn",
                tag: "twinkleclose"
              });
          }
        }
      };
      Twinkle.close.callbacks = {
        del: (params) => {
          let query;
          let qiuwen_api;
          Morebits.wiki.addCheckpoint();
          const page = new Morebits.wiki.page(params.title, "删除页面");
          if (params.code === "sd") {
            Twinkle.speedy.callbacks.parseWikitext(params.title, "{{delete|".concat(params.sdreason, "}}"), (reason) => {
              reason = prompt("输入删除理由,或点击确定以接受自动生成的:", reason);
              if (reason === null) {
                page.getStatusElement().warn("没有执行删除");
                Twinkle.close.callbacks.talkend(params);
              } else {
                page.setEditSummary(reason);
                page.setChangeTags(Twinkle.changeTags);
                page.deletePage(() => {
                  page.getStatusElement().info("完成");
                  Twinkle.close.callbacks.talkend(params);
                });
              }
            });
          } else {
            page.setEditSummary("存废讨论通过:[[".concat(mw.config.get("wgPageName"), "#").concat(params.title, "]]"));
            page.setChangeTags(Twinkle.changeTags);
            page.deletePage(() => {
              page.getStatusElement().info("完成");
              Twinkle.close.callbacks.talkend(params);
            });
          }
          if (params.redirects) {
            query = {
              action: "query",
              titles: params.title,
              prop: "redirects",
              rdlimit: "max"
              // 500 is max for normal users, 5000 for bots and sysops
            };
            qiuwen_api = new Morebits.wiki.api("正在获取重定向", query, Twinkle.close.callbacks.deleteRedirectsMain);
            qiuwen_api.params = params;
            qiuwen_api.post();
          }
          if (params.talkPage) {
            const pageTitle = mw.Title.newFromText(params.title);
            if (pageTitle && pageTitle.namespace % 2 === 0 && pageTitle.namespace !== 2) {
              pageTitle.namespace++;
              query = {
                action: "query",
                titles: pageTitle.toText()
              };
              qiuwen_api = new Morebits.wiki.api("正在检查讨论页面是否存在", query, Twinkle.close.callbacks.deleteTalk);
              qiuwen_api.params = params;
              qiuwen_api.apiobj.params.talkPage = pageTitle.toText();
              qiuwen_api.post();
            }
          }
          Morebits.wiki.removeCheckpoint();
        },
        deleteRedirectsMain: (apiobj) => {
          const xml = apiobj.responseXML;
          const pages = $(xml).find("rd").map((_index, element) => {
            return $(element).attr("title");
          }).get();
          if (pages.length === 0) {
            return;
          }
          const redirectDeleter = new Morebits.batchOperation(window.wgULS("正在删除到 ", "正在刪除到 ") + apiobj.params.title + window.wgULS(" 的重定向", " 的重新導向"));
          redirectDeleter.setOption("chunkSize", Twinkle.getPref("batchdeleteChunks"));
          redirectDeleter.setPageList(pages);
          redirectDeleter.run((pageName) => {
            const qiuwen_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除 ", "正在刪除 ") + pageName);
            qiuwen_page.setEditSummary("[[QW:CSD#G5|G5]]:".concat(window.wgULS("指向已删页面“", "指向已刪頁面「")).concat(apiobj.params.title).concat(window.wgULS("”的重定向", "」的重新導向")));
            qiuwen_page.setChangeTags(Twinkle.changeTags);
            qiuwen_page.deletePage(redirectDeleter.workerSuccess, redirectDeleter.workerFailure);
          });
        },
        deleteTalk: (apiobj) => {
          const xml = apiobj.responseXML;
          const exists = $(xml).find("page:not([missing])").length > 0;
          if (!exists) {
            return;
          }
          const page = new Morebits.wiki.page(apiobj.params.talkPage, window.wgULS("正在删除页面 ", "正在刪除頁面 ") + apiobj.params.title + window.wgULS(" 的讨论页", " 的討論頁"));
          page.setEditSummary("[[QW:CSD#G5|G5]]:".concat(window.wgULS("已删页面“", "已刪頁面「")).concat(apiobj.params.title).concat(window.wgULS("”的[[Help:讨论页|讨论页]]", "」的[[Help:討論頁|討論頁]]")));
          page.setChangeTags(Twinkle.changeTags);
          page.deletePage();
        },
        keep: (pageobj) => {
          const statelem = pageobj.getStatusElement();
          if (!pageobj.exists()) {
            statelem.error("页面不存在,可能已被删除");
            return;
          }
          const text = pageobj.getPageText();
          const params = pageobj.getCallbackParameters();
          const pagetitle = mw.Title.newFromText(params.title);
          if (pagetitle.getNamespaceId() % 2 === 0) {
            const talkpagetitle = new mw.Title(pagetitle.getMainText(), pagetitle.getNamespaceId() + 1);
            const talkpage = new Morebits.wiki.page(talkpagetitle.toString(), window.wgULS("标记讨论页", "標記討論頁"));
            const reason = params.messageData.value || params.messageData.label;
            const vfdkept = "{{Old vfd multi|".concat(mw.config.get("wgPageName").split("/").slice(2).join("/"), "|").concat(reason, "}}\n");
            talkpage.setPrependText(vfdkept);
            talkpage.setEditSummary("[[".concat(mw.config.get("wgPageName"), "#").concat(params.title, "]]:").concat(reason));
            talkpage.setChangeTags(Twinkle.changeTags);
            talkpage.setCreateOption("recreate");
            talkpage.prepend();
          }
          let newtext = text.replace(/<noinclude>\s*\{\{([rsaiftcmv]fd)(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*<\/noinclude>\s*/gi, "");
          newtext = newtext.replace(/\{\{([rsaiftcmv]fd)(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
          if (params.code !== "tk") {
            newtext = newtext.replace(/{{(notability|fame|mair|知名度|重要性|显著性|顯著性|知名度不足|人物重要性|重要性不足|notable|关注度|关注度不足|關注度|關注度不足|重要|重要度)(\|(?:{{[^{}]*}}|[^{}])*)?}}\n*/gi, "");
            newtext = newtext.replace(/{{(substub|小小作品|cod|小小條目|小小条目)(\|(?:{{[^{}]*}}|[^{}])*)?}}\n*/gi, "");
          }
          if (params.code === "mergeapproved") {
            const tag = "{{".concat("subst:").concat("Merge approved/auto|discuss=".concat(mw.config.get("wgPageName"), "#").concat(params.title, "}}\n"));
            const qiuwen_page = new Morebits.wikitext.page(newtext);
            newtext = qiuwen_page.insertAfterTemplates(tag, Twinkle.hatnoteRegex).getText();
          }
          if (newtext === text) {
            statelem.warn("未找到存废讨论模板,可能已被移除");
            Twinkle.close.callbacks.talkend(params);
            return;
          }
          const editsummary = "存废讨论关闭:[[".concat(mw.config.get("wgPageName"), "#").concat(params.title, "]]");
          pageobj.setPageText(newtext);
          pageobj.setEditSummary(editsummary);
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setCreateOption("nocreate");
          pageobj.save(Twinkle.close.callbacks.keepComplete);
        },
        keepComplete: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          Twinkle.close.callbacks.talkend(params);
        },
        talkend: (params) => {
          const qiuwen_page = new Morebits.wiki.page(mw.config.get("wgPageName"), "关闭讨论");
          qiuwen_page.setCallbackParameters(params);
          qiuwen_page.setPageSection(params.section);
          qiuwen_page.load(Twinkle.close.callbacks.saveTalk);
        },
        saveTalk: (pageobj) => {
          const statelem = pageobj.getStatusElement();
          let text = pageobj.getPageText();
          const params = pageobj.getCallbackParameters();
          if (text.includes("{{delh")) {
            statelem.error("讨论已被关闭");
            return;
          }
          const sbegin = text.includes("<section begin=backlog />");
          const send = text.includes("<section end=backlog />");
          text = text.replace("\n<section begin=backlog />", "");
          text = text.replace("\n<section end=backlog />", "");
          const bar = text.split("\n----\n");
          const split = bar[0].split("\n");
          text = "".concat(split[0], "\n{{delh|").concat(params.code, "}}\n");
          text += split.slice(1).join("\n");
          const reason = params.messageData.value || params.messageData.label;
          text += "\n<hr>\n: ".concat(reason);
          if (params.remark) {
            text += ":".concat(Morebits.string.appendPunctuation(params.remark));
          } else {
            text += "。";
          }
          if (!Morebits.userIsSysop) {
            text += "{{".concat("subst:").concat("NAC}}");
          }
          text += "--~~".concat("~~", "\n{{delf}}");
          if (bar[1]) {
            text += "\n----\n".concat(bar.slice(1).join("\n----\n"));
          }
          if (send) {
            text += "\n<section end=backlog />";
          }
          if (sbegin) {
            text += "\n<section begin=backlog />";
          }
          pageobj.setPageText(text);
          pageobj.setEditSummary("/* ".concat(params.title, " */ ").concat(reason));
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setCreateOption("nocreate");
          pageobj.save(Twinkle.close.callbacks.disableLink);
        },
        disableLink: (pageobj) => {
          const params = pageobj.getCallbackParameters();
          $("strong a[href=#".concat(params.section, "] span")).css("color", "#808080");
        }
      };
      Twinkle.addInitCallback(Twinkle.close, "close");
    })(jQuery);
  }
});
//! src/Twinkle/modules/twinkleconfig.js
var twinkleconfig_exports = {};
var init_twinkleconfig = __esm({
  "src/Twinkle/modules/twinkleconfig.js"() {
    "use strict";
    /*! Twinkle.js - twinkleconfig.js */
    (function twinkleconfig($) {
      const $body = $("body");
      Twinkle.config = {};
      Twinkle.config.watchlistEnums = {
        yes: window.wgULS("永久加入到监视列表", "永久加入到監視清單"),
        no: window.wgULS("不加入到监视列表", "不加入到監視清單"),
        default: window.wgULS("遵守站点设置", "遵守站點設定"),
        "1 week": window.wgULS("加入到监视列表1周", "加入到監視清單1週"),
        "1 month": window.wgULS("加入到监视列表1个月", "加入到監視清單1個月"),
        "3 months": window.wgULS("加入到监视列表3个月", "加入到監視清單3個月"),
        "6 months": window.wgULS("加入到监视列表6个月", "加入到監視清單6個月")
      };
      Twinkle.config.commonSets = {
        csdCriteria: {
          db: window.wgULS("自定义理由", "自訂理由"),
          g1: "G1",
          g2: "G2",
          g3: "G3",
          g4: "G4",
          g5: "G5",
          g6: "G6",
          g7: "G7",
          g8: "G8",
          g9: "G9",
          a1: "A1",
          a2: "A2",
          a3: "A3",
          o1: "O1",
          o2: "O2",
          o3: "O3",
          f1: "F1",
          f2: "F2",
          f3: "F3",
          f4: "F4",
          f5: "F5",
          r1: "R1",
          r2: "R2"
        },
        csdCriteriaDisplayOrder: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "o1", "o2", "o3", "f1", "f2", "f3", "f4", "f5", "r1", "r2"],
        csdCriteriaNotification: {
          db: window.wgULS("自定义理由", "自訂理由"),
          g1: "G1",
          g2: "G2",
          g3: "G3",
          g4: "G4",
          g5: "G5",
          g6: "G6",
          g7: "G7",
          g8: "G8",
          g9: "G9",
          a1: "A1",
          a2: "A2",
          a3: "A3",
          o1: "O1",
          o2: "O2",
          o3: "O3",
          f1: "F1",
          f2: "F2",
          f3: "F3",
          f4: "F4",
          f5: "F5",
          r1: "R1",
          r2: "R2"
        },
        csdCriteriaNotificationDisplayOrder: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "o1", "o2", "o3", "f1", "f2", "f3", "f4", "f5", "r1", "r2"],
        csdAndDICriteria: {
          db: window.wgULS("自定义理由", "自訂理由"),
          g1: "G1",
          g2: "G2",
          g3: "G3",
          g4: "G4",
          g5: "G5",
          g6: "G6",
          g7: "G7",
          g8: "G8",
          g9: "G9",
          a1: "A1",
          a2: "A2",
          a3: "A3",
          o1: "O1",
          o2: "O2",
          o3: "O3",
          f1: "F1",
          f2: "F2",
          f3: "F3",
          f4: "F4",
          f5: "F5",
          r1: "R1",
          r2: "R2"
        },
        csdAndDICriteriaDisplayOrder: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "o1", "o2", "o3", "f1", "f2", "f3", "f4", "f5", "r1", "r2"],
        xfdCriteria: {
          delete: window.wgULS("删除", "刪除"),
          merge: window.wgULS("合并", "合併"),
          fwdcsd: window.wgULS("转交自快速删除候选", "轉交自快速刪除候選"),
          fame: window.wgULS("批量关注度提删", "批次關注度提刪"),
          substub: window.wgULS("批量小小作品提删", "批次小小作品提刪"),
          batch: window.wgULS("批量其他提删", "批次其他提刪")
        },
        xfdCriteriaDisplayOrder: ["delete", "merge", "fwdcsd", "fame", "substub", "batch"],
        namespacesNoSpecial: {
          0: window.wgULS("(条目)", "(條目)"),
          1: "Talk",
          2: "User",
          3: "User talk",
          4: "Qiuwen",
          5: "Qiuwen talk",
          6: "File",
          7: "File talk",
          8: "MediaWiki",
          9: "MediaWiki talk",
          10: "Template",
          11: "Template talk",
          12: "Help",
          13: "Help talk",
          14: "Category",
          15: "Category talk",
          118: "Draft",
          119: "Draft talk",
          204: "NEA",
          205: "NEA talk",
          206: "Addendum",
          207: "Addendum talk",
          828: "Module",
          829: "Module talk"
        }
      };
      Twinkle.config.sections = [{
        title: window.wgULS("常规", "常規"),
        module: "general",
        preferences: [
          // TwinkleConfig.userTalkPageMode may take arguments:
          // 'window': open a new window, remember the opened window
          // 'tab': opens in a new tab, if possible.
          // 'blank': force open in a new window, even if such a window exists
          {
            name: "userTalkPageMode",
            label: window.wgULS("当要打开用户讨论页时", "當要打開使用者討論頁時"),
            type: "enum",
            enumValues: {
              window: window.wgULS("在窗口中,替换成其它用户对话页", "在當前分頁,替換成其它用戶討論頁"),
              tab: window.wgULS("在新标签页中", "在新分頁中"),
              blank: window.wgULS("在全新的窗口中", "在新視窗中")
            }
          },
          // TwinkleConfig.dialogLargeFont (boolean)
          {
            name: "dialogLargeFont",
            label: window.wgULS("在Twinkle对话框中使用大号字体", "在Twinkle對話方塊中使用大號字型"),
            type: "boolean"
          },
          // Twinkle.config.disabledModules (array)
          {
            name: "disabledModules",
            label: window.wgULS("关闭指定的Twinkle模块", "關閉指定的Twinkle模組"),
            helptip: window.wgULS("您在此选择的功能将无法使用,取消选择以重新启用功能。", "您在此選擇的功能將無法使用,取消選擇以重新啟用功能。"),
            type: "set",
            setValues: {
              arv: window.wgULS("告状", "告狀"),
              warn: "警告",
              block: window.wgULS("封禁", "封鎖"),
              talkback: "通告",
              speedy: window.wgULS("速删", "速刪"),
              copyvio: window.wgULS("侵权", "侵權"),
              xfd: window.wgULS("提删", "提刪"),
              image: window.wgULS("图权", "圖權"),
              protect: window.wgULS("保护", "保護"),
              tag: window.wgULS("标记", "標記"),
              stub: "小作品",
              diff: window.wgULS("差异", "差異"),
              unlink: window.wgULS("链入", "連入"),
              fluff: "回退"
            }
          },
          // Twinkle.config.disabledSysopModules (array)
          {
            name: "disabledSysopModules",
            label: window.wgULS("关闭指定的Twinkle管理员模块", "關閉指定的Twinkle管理員模組"),
            helptip: window.wgULS("您在此选择的功能将无法使用,取消选择以重新启用功能。", "您在此選擇的功能將無法使用,取消選擇以重新啟用功能。"),
            adminOnly: true,
            type: "set",
            setValues: {
              batchdelete: window.wgULS("批删", "批刪"),
              batchundelete: window.wgULS("批复", "批復")
            }
          }
        ]
      }, {
        title: window.wgULS("告状", "告狀"),
        module: "arv",
        preferences: [{
          name: "spiWatchReport",
          label: window.wgULS("发起傀儡调查时加入到监视列表", "發起傀儡調查時加入到監視清單"),
          type: "enum",
          enumValues: Twinkle.config.watchlistEnums
        }]
      }, {
        title: window.wgULS("封禁用户", "封鎖使用者"),
        module: "block",
        adminOnly: true,
        preferences: [
          // TwinkleConfig.defaultToBlock64 (boolean)
          // Whether to default to just blocking the /64 on or off
          {
            name: "defaultToBlock64",
            label: window.wgULS("对于IPv6地址,默认选择封禁/64段", "對於IPv6地址,預設選擇封鎖/64段"),
            type: "boolean"
          },
          // TwinkleConfig.defaultToPartialBlocks (boolean)
          // Whether to default partial blocks on or off
          {
            name: "defaultToPartialBlocks",
            label: window.wgULS("打开封禁菜单时默认选择部分封禁", "打開封鎖選單時預設選擇部分封鎖"),
            type: "boolean"
          },
          // TwinkleConfig.watchBlockNotices (string)
          // Watchlist setting for the page which has been dispatched an warning or notice
          {
            name: "watchBlockNotices",
            label: window.wgULS("发送封禁模板时加入用户讨论页到监视列表", "發送封鎖模板時加入使用者討論頁到監視清單"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          {
            name: "customBlockReasonList",
            label: window.wgULS("自定义封禁理由", "自訂封鎖理由"),
            helptip: window.wgULS("您可以加入常用的封禁理由。自定义的封禁理由会出现在一般的封禁理由下方。", "您可以加入常用的封鎖理由。自訂的封鎖理由會出現在一般的封鎖理由下方。"),
            type: "customList",
            customListValueTitle: window.wgULS("使用封禁模板(默认为 uw-block1)", "使用封鎖模板(預設為 uw-block1)"),
            customListLabelTitle: window.wgULS("“由于…您已被封禁”及封禁日志理由", "「由於…您已被封鎖」及封鎖日誌理由")
          }
        ]
      }, {
        title: window.wgULS("图片删除", "圖片刪除"),
        module: "image",
        preferences: [
          // TwinkleConfig.notifyUserOnDeli (boolean)
          // If the user should be notified after placing a file deletion tag
          {
            name: "notifyUserOnDeli",
            label: window.wgULS("默认勾选“通知创建者”", "預設勾選「通知建立者」"),
            type: "boolean"
          },
          // TwinkleConfig.deliWatchPage (string)
          // The watchlist setting of the page tagged for deletion.
          {
            name: "deliWatchPage",
            label: window.wgULS("标记图片时加入到监视列表", "標記圖片時加入到監視清單"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.deliWatchUser (string)
          // The watchlist setting of the user talk page if a notification is placed.
          {
            name: "deliWatchUser",
            label: window.wgULS("标记图片时加入创建者讨论页到监视列表", "標記圖片時加入建立者討論頁到監視清單"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          }
        ]
      }, {
        title: window.wgULS("保护", "保護"),
        module: "protect",
        preferences: [{
          name: "watchRequestedPages",
          label: window.wgULS("请求保护页面时加入到监视列表", "請求保護頁面時加入到監視清單"),
          type: "enum",
          enumValues: Twinkle.config.watchlistEnums
        }, {
          name: "watchPPTaggedPages",
          label: window.wgULS("标记保护模板时加入到监视列表", "標記保護模板時加入到監視清單"),
          type: "enum",
          enumValues: Twinkle.config.watchlistEnums
        }, {
          name: "watchProtectedPages",
          label: window.wgULS("保护时加入到监视列表", "保護時加入到監視清單"),
          helptip: window.wgULS("若在保护后也标记页面,则使用标记页面的参数设置。", "若在保護後也標記頁面,則使用標記頁面的偏好設定。"),
          adminOnly: true,
          type: "enum",
          enumValues: Twinkle.config.watchlistEnums
        }]
      }, {
        title: "回退",
        // twinklefluff module
        module: "fluff",
        preferences: [
          // TwinkleConfig.autoMenuAfterRollback (bool)
          // Option to automatically open the warning menu if the user talk page is opened post-reversion
          {
            name: "autoMenuAfterRollback",
            label: window.wgULS("在Twinkle回退后自动打开用户讨论页上的Twinkle警告菜单", "在Twinkle回退後自動打開使用者討論頁上的Twinkle警告選單"),
            helptip: window.wgULS("仅在选取下方对应框时才执行", "僅在選取下方對應框時才執行"),
            type: "boolean"
          },
          // TwinkleConfig.openTalkPage (array)
          // What types of actions that should result in opening of talk page
          {
            name: "openTalkPage",
            label: window.wgULS("在这些类型的回退后打开用户讨论页", "在這些類別的回退後打開使用者討論頁"),
            type: "set",
            setValues: {
              norm: window.wgULS("常规回退", "常規回退"),
              vand: window.wgULS("破坏回退", "破壞回退")
            }
          },
          // TwinkleConfig.openTalkPageOnAutoRevert (bool)
          // Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
          {
            name: "openTalkPageOnAutoRevert",
            label: window.wgULS("在从用户贡献及最近更改中发起回退时打开用户讨论页", "在從使用者貢獻及近期變更中發起回退時打開使用者討論頁"),
            helptip: window.wgULS("当它打开时,依赖上一个设置。", "當它打開時,依賴上一個設定。"),
            type: "boolean"
          },
          // TwinkleConfig.rollbackInPlace (bool)
          //
          {
            name: "rollbackInPlace",
            label: window.wgULS("在从用户贡献及最近更改中发起回退时不刷新页面", "在從使用者貢獻及近期變更中發起回退時不重新整理頁面"),
            helptip: window.wgULS("当它打开时,Twinkle将不会在从用户贡献及最近更改中发起回退时刷新页面,允许您一次性回退多个编辑。", "當它打開時,Twinkle將不會在從使用者貢獻及近期變更中發起回退時重新整理頁面,允許您一次性回退多個編輯。"),
            type: "boolean"
          },
          // TwinkleConfig.markRevertedPagesAsMinor (array)
          // What types of actions that should result in marking edit as minor
          {
            name: "markRevertedPagesAsMinor",
            label: window.wgULS("将这些类型的回退标记为小修改", "將這些類別的回退標記為小修改"),
            type: "set",
            setValues: {
              norm: window.wgULS("常规回退", "常規回退"),
              vand: window.wgULS("破坏回退", "破壞回退"),
              torev: window.wgULS("“恢复此版本”", "「恢復此版本」")
            }
          },
          // TwinkleConfig.watchRevertedPages (array)
          // What types of actions that should result in forced addition to watchlist
          {
            name: "watchRevertedPages",
            label: window.wgULS("把这些类型的回退加入到监视列表", "把這些類別的回退加入到監視清單"),
            type: "set",
            setValues: {
              norm: window.wgULS("常规回退", "常規回退"),
              vand: window.wgULS("破坏回退", "破壞回退"),
              torev: window.wgULS("“恢复此版本”", "「恢復此版本」")
            }
          },
          // TwinkleConfig.watchRevertedExpiry
          // If any of the above items are selected, whether to expire the watch
          {
            name: "watchRevertedExpiry",
            label: window.wgULS("当回退页面时,加入到监视列表的期限", "當回退頁面時,加入到監視清單的期限"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.offerReasonOnNormalRevert (boolean)
          // If to offer a prompt for extra summary reason for normal reverts, default to true
          {
            name: "offerReasonOnNormalRevert",
            label: window.wgULS("常规回退时询问理由", "常規回退時詢問理由"),
            helptip: window.wgULS("“常规”回退是中间的那个[回退]链接。", "「常規」回退是中間的那個[回退]連結。"),
            type: "boolean"
          },
          {
            name: "confirmOnFluff",
            label: window.wgULS("回退前要求确认(所有设备)", "回退前要求確認(所有裝置)"),
            helptip: window.wgULS("对于使用移动设备的用户,或者意志不坚定的。", "對於使用行動裝置的使用者,或者意志不堅定的。"),
            type: "boolean"
          },
          // TwinkleConfig.showRollbackLinks (array)
          // Where Twinkle should show rollback links:
          // diff, others, mine, contribs, history, recent
          // Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
          {
            name: "showRollbackLinks",
            label: window.wgULS("在这些页面上显示回退链接", "在這些頁面上顯示回退連結"),
            type: "set",
            setValues: {
              diff: window.wgULS("差异", "差異"),
              history: window.wgULS("历史记录", "歷史記錄"),
              others: window.wgULS("其它用户的贡献", "其它使用者的貢獻"),
              mine: window.wgULS("我的贡献", "我的貢獻"),
              recentchanges: window.wgULS("最近更改", "近期變更"),
              recentchangeslinked: window.wgULS("相关更改", "相關變更")
            }
          },
          {
            name: "customRevertSummary",
            label: "回退理由",
            helptip: window.wgULS("在查看差异时可选,仅善意回退、常规回退、恢复此版本", "在檢視差異時可選,僅善意回退、常規回退、恢復此版本"),
            type: "customList",
            customListValueTitle: "理由",
            customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
          }
        ]
      }, {
        title: window.wgULS("快速删除", "快速刪除"),
        module: "speedy",
        preferences: [
          {
            name: "speedySelectionStyle",
            label: window.wgULS("什么时候执行标记或删除", "什麼時候執行標記或刪除"),
            type: "enum",
            enumValues: {
              buttonClick: window.wgULS("当我点“提交”时", "當我點「提交」時"),
              radioClick: window.wgULS("当我点一个选项时", "當我點一個選項時")
            }
          },
          // TwinkleConfig.watchSpeedyPages (array)
          // Whether to add speedy tagged pages to watchlist
          {
            name: "watchSpeedyPages",
            label: window.wgULS("将以下理由加入到监视列表", "將以下理由加入到監視清單"),
            type: "set",
            setValues: Twinkle.config.commonSets.csdCriteria,
            setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
          },
          // TwinkleConfig.watchSpeedyExpiry
          // If any of the above items are selected, whether to expire the watch
          {
            name: "watchSpeedyExpiry",
            label: window.wgULS("当标记页面时,加入到监视列表的期限", "當標記頁面時,加入到監視清單的期限"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
          // If, when applying speedy template to page, to mark the page as patrolled (if the page was reached from NewPages)
          {
            name: "markSpeedyPagesAsPatrolled",
            label: window.wgULS("标记时标记页面为已巡查(如可能)", "標記時標記頁面為已巡查(如可能)"),
            type: "boolean"
          },
          // TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
          // What types of actions should result that the author of the page being notified of nomination
          {
            name: "notifyUserOnSpeedyDeletionNomination",
            label: window.wgULS("仅在使用以下理由时通知页面创建者", "僅在使用以下理由時通知頁面建立者"),
            helptip: window.wgULS("尽管您在对话框中选择通知,通知仍只会在使用这些理由时发出。", "儘管您在對話方塊中選擇通知,通知仍只會在使用這些理由時發出。"),
            type: "set",
            setValues: Twinkle.config.commonSets.csdCriteriaNotification,
            setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
          },
          // TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
          {
            name: "promptForSpeedyDeletionSummary",
            label: window.wgULS("使用以下理由删除时允许编辑删除理由", "使用以下理由刪除時允許編輯刪除理由"),
            adminOnly: true,
            type: "set",
            setValues: Twinkle.config.commonSets.csdAndDICriteria,
            setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
          },
          // TwinkleConfig.openUserTalkPageOnSpeedyDelete (array of strings)
          // What types of actions that should result user talk page to be opened when speedily deleting (admin only)
          {
            name: "openUserTalkPageOnSpeedyDelete",
            label: window.wgULS("使用以下理由时打开用户讨论页", "使用以下理由時打開使用者討論頁"),
            adminOnly: true,
            type: "set",
            setValues: Twinkle.config.commonSets.csdAndDICriteria,
            setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
          },
          // TwinkleConfig.deleteTalkPageOnDelete (boolean)
          // If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
          {
            name: "deleteTalkPageOnDelete",
            label: window.wgULS("默认勾选“删除讨论页”", "預設勾選「刪除討論頁」"),
            adminOnly: true,
            type: "boolean"
          },
          {
            name: "deleteRedirectsOnDelete",
            label: window.wgULS("默认勾选“删除重定向”", "預設勾選「刪除重新導向」"),
            adminOnly: true,
            type: "boolean"
          },
          // TwinkleConfig.deleteSysopDefaultToDelete (boolean)
          // Make the CSD screen default to "delete" instead of "tag" (admin only)
          {
            name: "deleteSysopDefaultToDelete",
            label: window.wgULS("默认为直接删除而不是标记", "預設為直接刪除而不是標記"),
            helptip: window.wgULS("若已放置快速删除标记,则永远默认为删除模式。", "若已放置快速刪除標記,則永遠預設為刪除模式。"),
            adminOnly: true,
            type: "boolean"
          },
          // TwinkleConfig.speedyWindowWidth (integer)
          // Defines the width of the Twinkle SD window in pixels
          {
            name: "speedyWindowWidth",
            label: window.wgULS("快速删除对话框宽度(像素)", "快速刪除對話方塊寬度(像素)"),
            type: "integer"
          },
          // TwinkleConfig.speedyWindowWidth (integer)
          // Defines the width of the Twinkle SD window in pixels
          {
            name: "speedyWindowHeight",
            label: window.wgULS("快速删除对话框高度(像素)", "快速刪除對話方塊高度(像素)"),
            helptip: window.wgULS("若您有一台很大的显示器,您可以将此调高。", "若您有一台很大的顯示器,您可以將此調高。"),
            type: "integer"
          },
          {
            name: "logSpeedyNominations",
            label: window.wgULS("在用户空间中记录所有快速删除提名", "在使用者空間中記錄所有快速刪除提名"),
            helptip: window.wgULS("非管理员无法访问到已删除的贡献,用户空间日志提供了一个很好的方法来记录这些历史。", "非管理員無法存取到已刪除的貢獻,使用者空間日誌提供了一個很好的方法來記錄這些歷史。"),
            type: "boolean"
          },
          {
            name: "speedyLogPageName",
            label: window.wgULS("在此页保留日志", "在此頁保留日誌"),
            helptip: window.wgULS("在此框中输入子页面名称,您将在User:<i>用户名</i>/<i>子页面</i>找到CSD日志。仅在启用日志时工作。", "在此框中輸入子頁面名稱,您將在User:<i>使用者名稱</i>/<i>子頁面</i>找到CSD日誌。僅在啟用日誌時工作。"),
            type: "string"
          },
          {
            name: "noLogOnSpeedyNomination",
            label: window.wgULS("在使用以下理由时不做记录", "在使用以下理由時不做記錄"),
            type: "set",
            setValues: Twinkle.config.commonSets.csdAndDICriteria,
            setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
          },
          {
            name: "enlargeG7Input",
            label: window.wgULS("扩大CSD G7的按钮", "擴大CSD G7的按鈕"),
            helptip: window.wgULS("扩为默认的两倍大。", "擴為預設的兩倍大。"),
            type: "boolean"
          }
        ]
      }, {
        title: window.wgULS("标记", "標記"),
        module: "tag",
        preferences: [{
          name: "watchTaggedPages",
          label: window.wgULS("标记时加入到监视列表", "標記時加入到監視清單"),
          type: "enum",
          enumValues: Twinkle.config.watchlistEnums
        }, {
          name: "watchMergeDiscussions",
          label: window.wgULS("加入合并讨论时监视讨论页", "加入合併討論時監視討論頁"),
          type: "enum",
          enumValues: Twinkle.config.watchlistEnums
        }, {
          name: "markTaggedPagesAsMinor",
          label: window.wgULS("将标记标记为小修改", "將標記標記為小修改"),
          type: "boolean"
        }, {
          name: "markTaggedPagesAsPatrolled",
          label: window.wgULS("默认勾选“标记页面为已巡查”框", "預設勾選「標記頁面為已巡查」框"),
          type: "boolean"
        }, {
          name: "groupByDefault",
          label: window.wgULS("默认勾选“合并到{{multiple issues}}”复选框", "預設勾選「合併到{{multiple issues}}」核取方塊"),
          type: "boolean"
        }, {
          name: "tagArticleSortOrder",
          label: window.wgULS("条目标记的默认查看方式", "條目標記的預設檢視方式"),
          type: "enum",
          enumValues: {
            cat: window.wgULS("按类型", "按類別"),
            alpha: "按字母"
          }
        }, {
          name: "customTagList",
          label: window.wgULS("自定义条目维护标记", "自訂條目維護標記"),
          helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
          type: "customList",
          customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
          customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
        }, {
          name: "customFileTagList",
          label: window.wgULS("自定义文件维护标记", "自訂檔案維護標記"),
          helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
          type: "customList",
          customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
          customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
        }, {
          name: "customRedirectTagList",
          label: window.wgULS("自定义重定向维护标记", "自訂重新導向維護標記"),
          helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
          type: "customList",
          customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
          customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
        }]
      }, {
        title: "小作品",
        module: "stub",
        preferences: [{
          name: "watchStubbedPages",
          label: window.wgULS("标记时加入到监视列表", "標記時加入到監視清單"),
          type: "boolean"
        }, {
          name: "markStubbedPagesAsMinor",
          label: window.wgULS("将小作品标记为小修改", "將小作品標記為小修改"),
          type: "boolean"
        }, {
          name: "markStubbedPagesAsPatrolled",
          label: window.wgULS("默认勾选“标记页面为已巡查”框", "預設勾選「標記頁面為已巡查」框"),
          type: "boolean"
        }, {
          name: "stubArticleSortOrder",
          label: window.wgULS("条目小作品的默认查看方式", "條目小作品的預設檢視方式"),
          type: "enum",
          enumValues: {
            cat: window.wgULS("按类型", "按類別"),
            alpha: "按字母"
          }
        }, {
          name: "customStubList",
          label: window.wgULS("自定义条目小作品标记", "自訂條目小作品標記"),
          helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
          type: "customList",
          customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
          customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
        }]
      }, {
        title: "通告",
        module: "talkback",
        preferences: [{
          name: "markTalkbackAsMinor",
          label: window.wgULS("将通告标记为小修改", "將通告標記為小修改"),
          type: "boolean"
        }, {
          name: "insertTalkbackSignature",
          label: window.wgULS("通告时加入签名", "通告時加入簽名"),
          type: "boolean"
        }, {
          name: "talkbackHeading",
          label: window.wgULS("通告所用的小节标题", "通告所用的小節標題"),
          type: "string"
        }, {
          name: "mailHeading",
          label: window.wgULS("“有新邮件”所用的小节标题", "「有新郵件」所用的小節標題"),
          type: "string"
        }]
      }, {
        title: window.wgULS("取消链入", "取消連入"),
        module: "unlink",
        preferences: [
          // TwinkleConfig.unlinkNamespaces (array)
          // In what namespaces unlink should happen, default in 0 (article) and 100 (portal)
          {
            name: "unlinkNamespaces",
            label: window.wgULS("取消以下命名空间中的反向链接", "取消以下命名空間中的反向連結"),
            helptip: window.wgULS("请避免选择讨论页,因这样会导致Twinkle试图修改讨论存档。", "請避免選擇討論頁,因這樣會導致Twinkle試圖修改討論存檔。"),
            type: "set",
            setValues: Twinkle.config.commonSets.namespacesNoSpecial
          }
        ]
      }, {
        title: window.wgULS("警告用户", "警告使用者"),
        module: "warn",
        preferences: [
          // TwinkleConfig.defaultWarningGroup (int)
          // if true, watch the page which has been dispatched an warning or notice, if false, default applies
          {
            name: "defaultWarningGroup",
            label: window.wgULS("默认警告级别", "預設警告級別"),
            type: "enum",
            enumValues: {
              1: "1:注意",
              2: "2:警告",
              3: window.wgULS("单层级提醒", "單層級提醒"),
              4: window.wgULS("单层级警告", "單層級警告"),
              5: window.wgULS("自定义提醒或警告", "自訂提醒或警告"),
              6: "所有警告模板",
              7: window.wgULS("自动选择层级", "自動選擇層級")
              // 8 was used for block templates before #260
              // 9 was deprecated
              // 10 was deprecated
              // 11 was deprecated
            }
          },
          // TwinkleConfig.combinedSingletMenus (boolean)
          // if true, show one menu with both single-issue notices and warnings instead of two separately
          {
            name: "combinedSingletMenus",
            label: window.wgULS("将两个单层级菜单合并成一个", "將兩個單層級選單合併成一個"),
            helptip: window.wgULS("当启用此选项时,无论默认警告级别选择单层级通知或单层级警告皆属于此项。", "當啟用此選項時,無論預設警告級別選擇單層級通知或單層級警告皆屬於此項。"),
            type: "boolean"
          },
          // TwinkleConfig.watchWarnings (string)
          // Watchlist setting for the page which has been dispatched an warning or notice
          {
            name: "watchWarnings",
            label: window.wgULS("警告时加入用户讨论页到监视列表", "警告時加入使用者討論頁到監視清單"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.oldSelect (boolean)
          // if true, use the native select menu rather the jquery chosen-based one
          {
            name: "oldSelect",
            label: window.wgULS("使用不可搜索的经典菜单", "使用不可搜尋的經典選單"),
            type: "boolean"
          },
          {
            name: "customWarningList",
            label: window.wgULS("自定义警告模板", "自訂警告模板"),
            helptip: window.wgULS("您可以加入模板或用户子页面。自定义警告会出现在警告对话框中“自定义警告”一节。", "您可以加入模板或使用者子頁面。自訂警告會出現在警告對話方塊中「自訂警告」一節。"),
            type: "customList",
            customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
            customListLabelTitle: window.wgULS("显示的文字(和编辑摘要)", "顯示的文字(和編輯摘要)")
          }
        ]
      }, {
        title: window.wgULS("存废讨论", "存廢討論"),
        module: "xfd",
        preferences: [
          {
            name: "logXfdNominations",
            label: window.wgULS("在用户空间中记录所有存废讨论提名", "在使用者空間中記錄所有存廢討論提名"),
            helptip: window.wgULS("该日志供您追踪所有通过Twinkle提交的存废讨论", "該日誌供您追蹤所有透過Twinkle提交的存廢討論"),
            type: "boolean"
          },
          {
            name: "xfdLogPageName",
            label: window.wgULS("在此页保留日志", "在此頁保留日誌"),
            helptip: window.wgULS("在此框中输入子页面名称,您将在User:<i>用户名</i>/<i>子页面</i>找到XFD日志。仅在启用日志时工作。", "在此框中輸入子頁面名稱,您將在User:<i>使用者名稱</i>/<i>子頁面</i>找到XFD日誌。僅在啟用日誌時工作。"),
            type: "string"
          },
          {
            name: "noLogOnXfdNomination",
            label: window.wgULS("在使用以下理由时不做记录", "在使用以下理由時不做記錄"),
            type: "set",
            setValues: Twinkle.config.commonSets.xfdCriteria,
            setDisplayOrder: Twinkle.config.commonSets.xfdCriteriaDisplayOrder
          },
          // TwinkleConfig.xfdWatchPage (string)
          // The watchlist setting of the page being nominated for XfD.
          {
            name: "xfdWatchPage",
            label: window.wgULS("加入提名的页面到监视列表", "加入提名的頁面到監視清單"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.xfdWatchDiscussion (string)
          // The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
          // or the list page for the other processes.
          {
            name: "xfdWatchDiscussion",
            label: window.wgULS("加入存废讨论页到监视列表", "加入存廢討論頁到監視清單"),
            helptip: window.wgULS("当日的页面。", "當日的頁面。"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.xfdWatchUser (string)
          // The watchlist setting of the user talk page if they receive a notification.
          {
            name: "xfdWatchUser",
            label: window.wgULS("加入创建者讨论页到监视列表(在通知时)", "加入建立者討論頁到監視清單(在通知時)"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          {
            name: "markXfdPagesAsPatrolled",
            label: window.wgULS("标记时标记页面为已巡查(如可能)", "標記時標記頁面為已巡查(如可能)"),
            helptip: window.wgULS("基于技术原因,页面仅会在由Special:NewPages到达时被标记为已巡查。", "基於技術原因,頁面僅會在由Special:NewPages到達時被標記為已巡查。"),
            type: "boolean"
          },
          {
            name: "FwdCsdToXfd",
            label: window.wgULS("提删类型增加转交自快速删除候选", "提刪類別增加轉交自快速刪除候選"),
            helptip: window.wgULS("请确保您充分了解[[Qiuwen:快速删除方针]]才开启此功能。", "請確保您充分了解[[Qiuwen:快速刪除方針]]才開啟此功能。"),
            type: "boolean"
          },
          {
            name: "afdDefaultCategory",
            label: window.wgULS("默认提删类型", "預設提刪類別"),
            helptip: window.wgULS("若选择“相同于上次选择”将使用localStorage来记忆。", "若選擇「相同於上次選擇」將使用localStorage來記憶。"),
            type: "enum",
            enumValues: {
              delete: window.wgULS("删除", "刪除"),
              same: window.wgULS("相同于上次选择", "相同於上次選擇")
            }
          },
          {
            name: "afdFameDefaultReason",
            label: window.wgULS("默认关注度提删理由", "預設關注度提刪理由"),
            helptip: window.wgULS("用于批量提删。", "用於批次提刪。"),
            type: "string"
          },
          {
            name: "afdSubstubDefaultReason",
            label: window.wgULS("默认小小作品提删理由", "預設小小作品提刪理由"),
            helptip: window.wgULS("用于批量提删。", "用於批次提刪。"),
            type: "string"
          }
        ]
      }, {
        title: window.wgULS("关闭存废讨论", "關閉存廢討論"),
        module: "close",
        preferences: [{
          name: "XfdClose",
          label: window.wgULS("在存废讨论显示关闭讨论按钮", "在存廢討論顯示關閉討論按鈕"),
          helptip: window.wgULS("请确保您充分了解[[Qiuwen:删除方针]]才开启此功能。", "請確保您充分了解[[Qiuwen:刪除方針]]才開啟此功能。"),
          type: "enum",
          enumValues: {
            hide: window.wgULS("不显示", "不顯示"),
            nonadminonly: window.wgULS("只包含非管理员可使用选项", "只包含非管理員可使用選項"),
            all: window.wgULS("显示所有选项", "顯示所有選項")
          }
        }]
      }, {
        title: window.wgULS("侵犯著作权", "侵犯著作權"),
        module: "copyvio",
        preferences: [
          // TwinkleConfig.copyvioWatchPage (string)
          // The watchlist setting of the page being nominated for XfD.
          {
            name: "copyvioWatchPage",
            label: window.wgULS("加入提报的页面到监视列表", "加入提報的頁面到監視清單"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.copyvioWatchUser (string)
          // The watchlist setting of the user if he receives a notification.
          {
            name: "copyvioWatchUser",
            label: window.wgULS("加入创建者讨论页到监视列表(在通知时)", "加入建立者討論頁到監視清單(在通知時)"),
            type: "enum",
            enumValues: Twinkle.config.watchlistEnums
          },
          // TwinkleConfig.markCopyvioPagesAsPatrolled (boolean)
          // If, when applying copyvio template to page, to mark the page as patrolled (if the page was reached from NewPages)
          {
            name: "markCopyvioPagesAsPatrolled",
            label: window.wgULS("标记时标记页面为已巡查(如可能)", "標記時標記頁面為已巡查(如可能)"),
            helptip: window.wgULS("基于技术原因,页面仅会在由Special:NewPages到达时被标记为已巡查。", "基於技術原因,頁面僅會在由Special:NewPages到達時被標記為已巡查。"),
            type: "boolean"
          }
        ]
      }, {
        title: window.wgULS("隐藏", "隱藏"),
        hidden: true,
        preferences: [
          // twinkle.js: portlet setup
          {
            name: "portletArea",
            type: "string"
          },
          {
            name: "portletId",
            type: "string"
          },
          {
            name: "portletName",
            type: "string"
          },
          {
            name: "portletType",
            type: "string"
          },
          {
            name: "portletNext",
            type: "string"
          },
          // twinklefluff.js: defines how many revision to query maximum, maximum possible is 50, default is 50
          {
            name: "revertMaxRevisions",
            type: "integer"
          },
          // twinklebatchdelete.js: How many pages should be processed maximum
          {
            name: "batchMax",
            type: "integer",
            adminOnly: true
          },
          // How many pages should be processed at a time by deprod and batchdelete/protect/undelete
          {
            name: "batchChunks",
            type: "integer",
            adminOnly: true
          }
        ]
      }];
      Twinkle.config.init = () => {
        if (mw.config.get("wgPageName") === Twinkle.getPref("configPage") && mw.config.get("wgAction") === "view") {
          if (!document.querySelector("#twinkle-config")) {
            return;
          }
          const contentdiv = document.querySelector("#twinkle-config-content");
          contentdiv.textContent = "";
          const toctable = document.createElement("div");
          toctable.className = "toc";
          toctable.style.marginLeft = "0.4em";
          const toctitle = document.createElement("div");
          toctitle.id = "toctitle";
          const toch2 = document.createElement("h2");
          toch2.textContent = window.wgULS("目录 ", "目錄 ");
          toctitle.appendChild(toch2);
          const toctoggle = document.createElement("span");
          toctoggle.className = "toctoggle";
          toctoggle.appendChild(document.createTextNode("["));
          const toctogglelink = document.createElement("a");
          toctogglelink.className = "internal";
          toctogglelink.setAttribute("href", "#tw-tocshowhide");
          toctogglelink.textContent = window.wgULS("隐藏", "隱藏");
          toctoggle.appendChild(toctogglelink);
          toctoggle.appendChild(document.createTextNode("]"));
          toctitle.appendChild(toctoggle);
          toctable.appendChild(toctitle);
          const tocul = document.createElement("ul");
          toctogglelink.addEventListener("click", () => {
            const $tocul = $(tocul);
            $tocul.toggle();
            if ($tocul.find(":visible").length) {
              toctogglelink.textContent = window.wgULS("隐藏", "隱藏");
            } else {
              toctogglelink.textContent = window.wgULS("显示", "顯示");
            }
          }, false);
          toctable.appendChild(tocul);
          contentdiv.appendChild(toctable);
          const contentform = document.createElement("form");
          contentform.setAttribute("action", "javascript:void(0)");
          contentform.addEventListener("submit", Twinkle.config.save, true);
          contentdiv.appendChild(contentform);
          const container = document.createElement("table");
          container.style.width = "100%";
          contentform.appendChild(container);
          $(Twinkle.config.sections).each((sectionkey, section) => {
            if (section.hidden || section.adminOnly && !Morebits.userIsSysop) {
              return true;
            }
            const tocli = document.createElement("li");
            tocli.className = "toclevel-1";
            const toca = document.createElement("a");
            toca.setAttribute("href", "#".concat(section.module));
            toca.appendChild(document.createTextNode(section.title));
            tocli.appendChild(toca);
            tocul.appendChild(tocli);
            let row = document.createElement("tr");
            let cell = document.createElement("td");
            cell.setAttribute("colspan", "3");
            const heading = document.createElement("h4");
            heading.style.borderBottom = "1px solid #808080";
            heading.style.marginTop = "0.2em";
            heading.id = section.module;
            heading.appendChild(document.createTextNode(section.title));
            cell.appendChild(heading);
            row.appendChild(cell);
            container.appendChild(row);
            let rowcount = 1;
            $(section.preferences).each((prefkey, pref) => {
              if (pref.adminOnly && !Morebits.userIsSysop) {
                return true;
              }
              row = document.createElement("tr");
              row.style.marginBottom = "0.2em";
              if (rowcount++ % 2 === 0) {
                row.style.backgroundColor = "rgb(128 128 128/.1)";
              }
              cell = document.createElement("td");
              let label;
              let input;
              const gotPref = Twinkle.getPref(pref.name);
              switch (pref.type) {
                case "boolean":
                  cell.setAttribute("colspan", "2");
                  label = document.createElement("label");
                  input = document.createElement("input");
                  input.setAttribute("type", "checkbox");
                  input.setAttribute("id", pref.name);
                  input.setAttribute("name", pref.name);
                  if (gotPref === true) {
                    input.checked = true;
                  }
                  label.appendChild(input);
                  label.appendChild(document.createTextNode(pref.label));
                  cell.appendChild(label);
                  break;
                case "string":
                case "integer":
                  cell.style.textAlign = "right";
                  cell.style.paddingRight = "0.5em";
                  label = document.createElement("label");
                  label.setAttribute("for", pref.name);
                  label.appendChild(document.createTextNode("".concat(pref.label, ":")));
                  cell.appendChild(label);
                  row.appendChild(cell);
                  cell = document.createElement("td");
                  cell.style.paddingRight = "1em";
                  input = document.createElement("input");
                  input.setAttribute("type", "text");
                  input.setAttribute("id", pref.name);
                  input.setAttribute("name", pref.name);
                  if (pref.type === "integer") {
                    input.setAttribute("size", 6);
                    input.setAttribute("type", "number");
                    input.setAttribute("step", "1");
                  }
                  if (gotPref) {
                    input.setAttribute("value", gotPref);
                  }
                  cell.appendChild(input);
                  break;
                case "enum": {
                  cell.style.textAlign = "right";
                  cell.style.paddingRight = "0.5em";
                  label = document.createElement("label");
                  label.setAttribute("for", pref.name);
                  label.appendChild(document.createTextNode("".concat(pref.label, ":")));
                  cell.appendChild(label);
                  row.appendChild(cell);
                  cell = document.createElement("td");
                  cell.style.paddingRight = "1em";
                  input = document.createElement("select");
                  input.setAttribute("id", pref.name);
                  input.setAttribute("name", pref.name);
                  let optionExists = false;
                  for (var _i17 = 0, _Object$entries10 = Object.entries(pref.enumValues); _i17 < _Object$entries10.length; _i17++) {
                    const [enumvalue, enumdisplay] = _Object$entries10[_i17];
                    const option = document.createElement("option");
                    option.setAttribute("value", enumvalue);
                    if (gotPref === enumvalue || // Hack to convert old boolean watchlist prefs
                    // to corresponding enums (added in v2.1)
                    typeof gotPref === "boolean" && (gotPref && enumvalue === "yes" || !gotPref && enumvalue === "no")) {
                      option.setAttribute("selected", "selected");
                      optionExists = true;
                    }
                    option.appendChild(document.createTextNode(enumdisplay));
                    input.appendChild(option);
                  }
                  if (!optionExists) {
                    const option = document.createElement("option");
                    option.setAttribute("value", gotPref);
                    option.setAttribute("selected", "selected");
                    option.appendChild(document.createTextNode(gotPref));
                    input.appendChild(option);
                  }
                  cell.appendChild(input);
                  break;
                }
                case "set": {
                  cell.setAttribute("colspan", "2");
                  label = document.createElement("label");
                  label.appendChild(document.createTextNode("".concat(pref.label, ":")));
                  cell.appendChild(label);
                  const checkdiv = document.createElement("div");
                  checkdiv.style.paddingLeft = "1em";
                  const worker = (itemkey, itemvalue) => {
                    const checklabel = document.createElement("label");
                    checklabel.style.marginRight = "0.7em";
                    checklabel.style.display = "inline-block";
                    const check = document.createElement("input");
                    check.setAttribute("type", "checkbox");
                    check.setAttribute("id", "".concat(pref.name, "_").concat(itemkey));
                    check.setAttribute("name", "".concat(pref.name, "_").concat(itemkey));
                    if (gotPref && gotPref.includes(itemkey)) {
                      check.checked = true;
                    }
                    if (pref.name === "unlinkNamespaces" && gotPref && gotPref.includes(Number.parseInt(itemkey, 10))) {
                      check.checked = true;
                    }
                    checklabel.appendChild(check);
                    checklabel.appendChild(document.createTextNode(itemvalue));
                    checkdiv.appendChild(checklabel);
                  };
                  if (pref.setDisplayOrder) {
                    var _iterator69 = _createForOfIteratorHelper(pref.setDisplayOrder), _step69;
                    try {
                      for (_iterator69.s(); !(_step69 = _iterator69.n()).done; ) {
                        const item = _step69.value;
                        worker(item, pref.setValues[item]);
                      }
                    } catch (err) {
                      _iterator69.e(err);
                    } finally {
                      _iterator69.f();
                    }
                  } else {
                    for (var _i18 = 0, _Object$entries11 = Object.entries(pref.setValues); _i18 < _Object$entries11.length; _i18++) {
                      const [itemkey, itemvalue] = _Object$entries11[_i18];
                      worker(itemkey, itemvalue);
                    }
                  }
                  cell.appendChild(checkdiv);
                  break;
                }
                case "customList": {
                  cell.style.textAlign = "right";
                  cell.style.paddingRight = "0.5em";
                  label = document.createElement("label");
                  label.setAttribute("for", pref.name);
                  label.appendChild(document.createTextNode("".concat(pref.label, ":")));
                  cell.appendChild(label);
                  row.appendChild(cell);
                  cell = document.createElement("td");
                  cell.style.paddingRight = "1em";
                  const customListButton = document.createElement("button");
                  customListButton.setAttribute("id", pref.name);
                  customListButton.setAttribute("name", pref.name);
                  customListButton.setAttribute("type", "button");
                  customListButton.addEventListener("click", Twinkle.config.listDialog.display, false);
                  $(customListButton).data({
                    value: gotPref,
                    pref
                  });
                  customListButton.appendChild(document.createTextNode(window.wgULS("编辑项目", "編輯項目")));
                  cell.appendChild(customListButton);
                  break;
                }
                default:
                  void mw.notify("twinkleconfig: 未知类型的属性 ".concat(pref.name), {
                    type: "warn",
                    tag: "twinkleconfig"
                  });
                  break;
              }
              row.appendChild(cell);
              cell = document.createElement("td");
              cell.style.fontSize = "90%";
              cell.style.color = "gray";
              if (pref.helptip) {
                cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g, '{{<a href="'.concat(mw.util.getUrl("Template:"), '$1" rel="noopener" target="_blank">$1</a>}}')).replace(/\[\[(.+?)]]/g, '<a href="'.concat(mw.util.getUrl(""), '$1" rel="noopener" target="_blank">$1</a>'));
              }
              if (pref.type !== "customList") {
                const resetlink = document.createElement("a");
                resetlink.setAttribute("href", "#tw-reset");
                resetlink.setAttribute("id", "twinkle-config-reset-".concat(pref.name));
                resetlink.addEventListener("click", Twinkle.config.resetPrefLink, false);
                resetlink.style.cssFloat = "right";
                resetlink.style.margin = "0 0.6em";
                resetlink.appendChild(document.createTextNode(window.wgULS("复位", "復位")));
                cell.appendChild(resetlink);
              }
              row.appendChild(cell);
              container.appendChild(row);
              return true;
            });
            return true;
          });
          const footerbox = document.createElement("div");
          footerbox.setAttribute("id", "twinkle-config-buttonpane");
          footerbox.style.backgroundColor = "#BCCADF";
          footerbox.style.padding = "0.5em";
          const submitButton = document.createElement("button");
          submitButton.setAttribute("id", "twinkle-config-submit");
          submitButton.setAttribute("type", "submit");
          submitButton.appendChild(document.createTextNode(window.wgULS("保存修改", "儲存修改")));
          footerbox.appendChild(submitButton);
          const footerspan = document.createElement("span");
          footerspan.className = "plainlinks";
          footerspan.style.marginLeft = "2.4em";
          footerspan.style.fontSize = "90%";
          const footera = document.createElement("a");
          footera.setAttribute("href", "#tw-reset-all");
          footera.setAttribute("id", "twinkle-config-resetall");
          footera.addEventListener("click", Twinkle.config.resetAllPrefs, false);
          footera.appendChild(document.createTextNode(window.wgULS("恢复默认", "恢復預設")));
          footerspan.appendChild(footera);
          footerbox.appendChild(footerspan);
          contentform.appendChild(footerbox);
          if (window.location.hash) {
            const loc = window.location.hash;
            window.location.hash = "";
            window.location.hash = loc;
          }
        } else if (mw.config.get("wgNamespaceNumber") === mw.config.get("wgNamespaceIds").user && mw.config.get("wgTitle").indexOf(mw.config.get("wgUserName")) === 0 && mw.config.get("wgPageName").slice(-3) === ".js") {
          const box = document.createElement("div");
          box.setAttribute("id", "twinkle-config-headerbox");
          let link;
          const scriptPageName = mw.config.get("wgPageName").slice(mw.config.get("wgPageName").lastIndexOf("/") + 1, mw.config.get("wgPageName").lastIndexOf(".js"));
          if (scriptPageName === "twinkleoptions") {
            box.setAttribute("class", "config-twopt-box");
            if (mw.config.get("wgArticleId") > 0) {
              box.appendChild(document.createTextNode(window.wgULS("这页包含您的Twinkle参数设置,您可使用", "這頁包含您的Twinkle偏好設定,您可使用")));
            } else {
              box.appendChild(document.createTextNode(window.wgULS("您可配置您的Twinkle,通过使用", "您可配置您的Twinkle,通過使用")));
            }
            link = document.createElement("a");
            link.setAttribute("href", mw.util.getUrl(Twinkle.getPref("configPage")));
            link.appendChild(document.createTextNode(window.wgULS("Twinkle参数设置面板", "Twinkle偏好設定面板")));
            box.appendChild(link);
            box.appendChild(document.createTextNode(window.wgULS(",或直接编辑本页。", ",或直接編輯本頁。")));
            $(box).insertAfter($body.find("#contentSub"));
          } else if (["vector", "vector-2022", "gongbi", "citizen", "common"].includes(scriptPageName)) {
            box.setAttribute("class", "config-userskin-box");
            box.appendChild(document.createTextNode(window.wgULS("若您想配置您的Twinkle,请使用", "若您想配置您的Twinkle,請使用")));
            link = document.createElement("a");
            link.setAttribute("href", mw.util.getUrl(Twinkle.getPref("configPage")));
            link.appendChild(document.createTextNode(window.wgULS("Twinkle参数设置面板", "Twinkle偏好設定面板")));
            box.appendChild(link);
            box.appendChild(document.createTextNode("。"));
            $(box).insertAfter($body.find("#contentSub"));
          }
        }
      };
      Twinkle.config.listDialog = {};
      Twinkle.config.listDialog.addRow = (dlgtable, value, label) => {
        const contenttr = document.createElement("tr");
        let contenttd = document.createElement("td");
        const removeButton = document.createElement("button");
        removeButton.setAttribute("type", "button");
        removeButton.addEventListener("click", () => {
          $(contenttr).remove();
        }, false);
        removeButton.textContent = "移除";
        contenttd.appendChild(removeButton);
        contenttr.appendChild(contenttd);
        contenttd = document.createElement("td");
        let input = document.createElement("input");
        input.setAttribute("type", "text");
        input.className = "twinkle-config-customlist-value";
        input.style.width = "97%";
        if (value) {
          input.setAttribute("value", value);
        }
        contenttd.appendChild(input);
        contenttr.appendChild(contenttd);
        contenttd = document.createElement("td");
        input = document.createElement("input");
        input.setAttribute("type", "text");
        input.className = "twinkle-config-customlist-label";
        input.style.width = "98%";
        if (label) {
          input.setAttribute("value", label);
        }
        contenttd.appendChild(input);
        contenttr.appendChild(contenttd);
        dlgtable.appendChild(contenttr);
      };
      Twinkle.config.listDialog.display = (e) => {
        var _curpref$customListVa, _curpref$customListLa;
        const $prefbutton = $(e.target);
        const curvalue = $prefbutton.data("value");
        const curpref = $prefbutton.data("pref");
        const dialog = new Morebits.simpleWindow(720, 400);
        dialog.setTitle(curpref.label);
        dialog.setScriptName(window.wgULS("Twinkle参数设置", "Twinkle偏好設定"));
        const dialogcontent = document.createElement("div");
        const dlgtable = document.createElement("table");
        dlgtable.className = "wikitable";
        dlgtable.style.margin = "1.4em 1em";
        dlgtable.style.width = "97%";
        const dlgtbody = document.createElement("tbody");
        let dlgtr = document.createElement("tr");
        let dlgth = document.createElement("th");
        dlgth.style.width = "5%";
        dlgtr.appendChild(dlgth);
        dlgth = document.createElement("th");
        dlgth.style.width = "35%";
        dlgth.textContent = (_curpref$customListVa = curpref.customListValueTitle) !== null && _curpref$customListVa !== void 0 ? _curpref$customListVa : window.wgULS("数值", "數值");
        dlgtr.appendChild(dlgth);
        dlgth = document.createElement("th");
        dlgth.style.width = "60%";
        dlgth.textContent = (_curpref$customListLa = curpref.customListLabelTitle) !== null && _curpref$customListLa !== void 0 ? _curpref$customListLa : window.wgULS("标签", "標籤");
        dlgtr.appendChild(dlgth);
        dlgtbody.appendChild(dlgtr);
        let gotRow = false;
        var _iterator70 = _createForOfIteratorHelper(curvalue), _step70;
        try {
          for (_iterator70.s(); !(_step70 = _iterator70.n()).done; ) {
            const v = _step70.value;
            gotRow = true;
            Twinkle.config.listDialog.addRow(dlgtbody, v.value, v.label);
          }
        } catch (err) {
          _iterator70.e(err);
        } finally {
          _iterator70.f();
        }
        if (!gotRow) {
          Twinkle.config.listDialog.addRow(dlgtbody);
        }
        const dlgtfoot = document.createElement("tfoot");
        dlgtr = document.createElement("tr");
        const dlgtd = document.createElement("td");
        dlgtd.setAttribute("colspan", "3");
        const addButton = document.createElement("button");
        addButton.style.minWidth = "8em";
        addButton.setAttribute("type", "button");
        addButton.addEventListener("click", () => {
          Twinkle.config.listDialog.addRow(dlgtbody);
        }, false);
        addButton.textContent = "添加";
        dlgtd.appendChild(addButton);
        dlgtr.appendChild(dlgtd);
        dlgtfoot.appendChild(dlgtr);
        dlgtable.appendChild(dlgtbody);
        dlgtable.appendChild(dlgtfoot);
        dialogcontent.appendChild(dlgtable);
        let button = document.createElement("button");
        button.setAttribute("type", "submit");
        button.addEventListener("click", () => {
          Twinkle.config.listDialog.save($prefbutton, dlgtbody);
          dialog.close();
        }, false);
        button.textContent = window.wgULS("保存修改", "儲存修改");
        dialogcontent.appendChild(button);
        button = document.createElement("button");
        button.setAttribute("type", "submit");
        button.addEventListener("click", () => {
          Twinkle.config.listDialog.reset($prefbutton, dlgtbody);
        }, false);
        button.textContent = window.wgULS("复位", "復位");
        dialogcontent.appendChild(button);
        button = document.createElement("button");
        button.setAttribute("type", "submit");
        button.addEventListener("click", () => {
          dialog.close();
        }, false);
        button.textContent = "取消";
        dialogcontent.appendChild(button);
        dialog.setContent(dialogcontent);
        dialog.display();
      };
      Twinkle.config.listDialog.reset = (button, tbody) => {
        const $button = $(button);
        const curpref = $button.data("pref");
        const oldvalue = $button.data("value");
        Twinkle.config.resetPref(curpref);
        const $tbody = $(tbody);
        $tbody.find("tr").slice(1).remove();
        const curvalue = $button.data("value");
        var _iterator71 = _createForOfIteratorHelper(curvalue), _step71;
        try {
          for (_iterator71.s(); !(_step71 = _iterator71.n()).done; ) {
            const v = _step71.value;
            Twinkle.config.listDialog.addRow(tbody, v.value, v.label);
          }
        } catch (err) {
          _iterator71.e(err);
        } finally {
          _iterator71.f();
        }
        $button.data("value", oldvalue);
      };
      Twinkle.config.listDialog.save = (button, tbody) => {
        const result = [];
        let current = {};
        $(tbody).find('input[type="text"]').each((inputkey, input) => {
          if ($(input).hasClass("twinkle-config-customlist-value")) {
            current = {
              value: input.value
            };
          } else {
            current.label = input.value;
            if (current.value || current.label) {
              result[result.length] = current;
            }
          }
        });
        $(button).data("value", result);
      };
      Twinkle.config.resetPrefLink = (e) => {
        const wantedpref = e.target.id.slice(21);
        $(Twinkle.config.sections).each((sectionkey, section) => {
          if (section.hidden || section.adminOnly && !Morebits.userIsSysop) {
            return true;
          }
          let foundit = false;
          $(section.preferences).each((prefkey, pref) => {
            if (pref.name !== wantedpref) {
              return true;
            }
            Twinkle.config.resetPref(pref);
            foundit = true;
            return false;
          });
          if (foundit) {
            return false;
          }
        });
        return false;
      };
      Twinkle.config.resetPref = (pref) => {
        switch (pref.type) {
          case "boolean":
            document.querySelector("#".concat(pref.name)).checked = Twinkle.defaultConfig[pref.name];
            break;
          case "string":
          case "integer":
          case "enum":
            document.querySelector("#".concat(pref.name)).value = Twinkle.defaultConfig[pref.name];
            break;
          case "set":
            for (var _i19 = 0, _Object$entries12 = Object.entries(pref.setValues); _i19 < _Object$entries12.length; _i19++) {
              const [itemkey] = _Object$entries12[_i19];
              if (document.querySelector("#".concat(pref.name, "_").concat(itemkey))) {
                document.querySelector("#".concat(pref.name, "_").concat(itemkey)).checked = Twinkle.defaultConfig[pref.name].includes(itemkey);
              }
            }
            break;
          case "customList":
            $(document.querySelector("#".concat(pref.name))).data("value", Twinkle.defaultConfig[pref.name]);
            break;
          default:
            void mw.notify("twinkleconfig: unknown data type for preference ".concat(pref.name), {
              type: "warn",
              tag: "twinkleconfig"
            });
            break;
        }
      };
      Twinkle.config.resetAllPrefs = () => {
        $(Twinkle.config.sections).each((sectionkey, section) => {
          if (section.hidden || section.adminOnly && !Morebits.userIsSysop) {
            return true;
          }
          $(section.preferences).each((prefkey, pref) => {
            if (!pref.adminOnly || Morebits.userIsSysop) {
              Twinkle.config.resetPref(pref);
            }
          });
          return true;
        });
        return false;
      };
      Twinkle.config.save = (e) => {
        Morebits.status.init(document.querySelector("#twinkle-config-content"));
        const userjs = "".concat(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").user], ":").concat(mw.config.get("wgUserName"), "/twinkleoptions.js");
        const qiuwen_page = new Morebits.wiki.page(userjs, window.wgULS("保存参数设置到 ", "儲存偏好設定到 ") + userjs);
        qiuwen_page.setCallbackParameters(e.target);
        qiuwen_page.load(Twinkle.config.writePrefs);
        return false;
      };
      Twinkle.config.writePrefs = (pageobj) => {
        const form = pageobj.getCallbackParameters();
        const newConfig = {
          optionsVersion: 2.1
        };
        const compare = (a, b) => {
          if (Array.isArray(a)) {
            if (a.length !== b.length) {
              return false;
            }
            a.sort();
            b.sort();
            var _iterator72 = _createForOfIteratorHelper(a.entries()), _step72;
            try {
              for (_iterator72.s(); !(_step72 = _iterator72.n()).done; ) {
                const [i, element] = _step72.value;
                if (typeof element === "object" && (element.label !== b[i].label || element.value !== b[i].value)) {
                  return false;
                } else if (element.toString() !== b[i].toString()) {
                  return false;
                }
              }
            } catch (err) {
              _iterator72.e(err);
            } finally {
              _iterator72.f();
            }
            return true;
          }
          return a === b;
        };
        $(Twinkle.config.sections).each((sectionkey, section) => {
          if (section.adminOnly && !Morebits.userIsSysop) {
            return;
          }
          $(section.preferences).each((prefkey, pref) => {
            let userValue;
            if (!pref.adminOnly || Morebits.userIsSysop) {
              if (!section.hidden) {
                switch (pref.type) {
                  case "boolean":
                    userValue = form[pref.name].checked;
                    break;
                  case "string":
                  case "enum":
                    userValue = form[pref.name].value;
                    break;
                  case "integer":
                    userValue = Number.parseInt(form[pref.name].value, 10);
                    if (Number.isNaN(userValue)) {
                      Morebits.status.warn(window.wgULS("保存", "儲存"), "".concat(window.wgULS("您为 ", "您為 ") + pref.name, " 指定的值(").concat(pref.value).concat(window.wgULS(")不合法,会继续保存操作,但此值将会跳过。", ")不合法,會繼續儲存操作,但此值將會跳過。")));
                      userValue = null;
                    }
                    break;
                  case "set":
                    userValue = [];
                    if (pref.setDisplayOrder) {
                      var _iterator73 = _createForOfIteratorHelper(pref.setDisplayOrder), _step73;
                      try {
                        for (_iterator73.s(); !(_step73 = _iterator73.n()).done; ) {
                          const item = _step73.value;
                          if (form["".concat(pref.name, "_").concat(item)].checked) {
                            userValue[userValue.length] = item;
                          }
                        }
                      } catch (err) {
                        _iterator73.e(err);
                      } finally {
                        _iterator73.f();
                      }
                    } else {
                      for (var _i20 = 0, _Object$entries13 = Object.entries(pref.setValues); _i20 < _Object$entries13.length; _i20++) {
                        const [itemkey] = _Object$entries13[_i20];
                        if (form["".concat(pref.name, "_").concat(itemkey)].checked) {
                          userValue[userValue.length] = itemkey;
                        }
                      }
                    }
                    break;
                  case "customList":
                    userValue = $(form[pref.name]).data("value");
                    break;
                  default:
                    void mw.notify("twinkleconfig: 未知数据类型,属性 ".concat(pref.name), {
                      type: "warn",
                      tag: "twinkleconfig"
                    });
                    break;
                }
              } else if (Twinkle.prefs) {
                userValue = Twinkle.prefs[pref.name];
              }
            }
            if (userValue !== void 0 && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
              newConfig[pref.name] = userValue;
            }
          });
        });
        const nowiki = "nowiki";
        let text = "// <".concat(nowiki, ">\n").concat(window.wgULS("// twinkleoptions.js:用户Twinkle参数设置文件\n//\n// 注:修改您的参数设置最简单的办法是使用\n// Twinkle参数设置面板,在[[".concat(Morebits.pageNameNorm, "]]。\n//\n// 这个文件是自动生成的,您所做的任何修改(除了\n// 以一种合法的JavaScript的方式来修改这些属性值)会\n// 在下一次您点击“保存”时被覆盖。\n// 修改此文件时,请记得使用合法的JavaScript。\n"), "// twinkleoptions.js:使用者Twinkle參數設定檔案\n//\n// 註:修改您的參數設定最簡單的辦法是使用\n// Twinkle參數設定面板,在[[".concat(Morebits.pageNameNorm, "]]。\n//\n// 這個檔案是自動產生的,您所做的任何修改(除了\n// 以一種合法的JavaScript的方式來修改這些屬性值)會\n// 在下一次您點擊「儲存」時被覆蓋。\n// 修改此檔案時,請記得使用合法的JavaScript。\n")));
        text += "\nwindow.Twinkle = window.Twinkle || {};\nwindow.Twinkle.prefs = window.Twinkle.prefs || {};\nwindow.Twinkle.prefs = ";
        text += JSON.stringify(newConfig, null, 2);
        text += ";\n\n".concat(window.wgULS("// twinkleoptions.js到此为止\n", "// twinkleoptions.js到此為止\n"), "// </").concat(nowiki, ">");
        pageobj.setPageText(text);
        pageobj.setEditSummary(window.wgULS("保存Twinkle参数设置:来自[[", "儲存Twinkle偏好設定:來自[[") + Morebits.pageNameNorm + window.wgULS("]]的自动编辑", "]]的自動編輯"));
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setCreateOption("recreate");
        pageobj.save(Twinkle.config.saveSuccess);
      };
      Twinkle.config.saveSuccess = (pageobj) => {
        pageobj.getStatusElement().info("成功");
        const noticebox = document.createElement("div");
        noticebox.className = "mw-message-box mw-message-box-success";
        noticebox.style.fontSize = "100%";
        noticebox.style.marginTop = "2em";
        noticebox.innerHTML = "<p><b>".concat(window.wgULS("您的Twinkle参数设置已被保存。", "您的Twinkle偏好設定已被儲存。"), "</b></p><p>").concat(window.wgULS("要看到这些更改,您可能需要", "要看到這些更改,您可能需要"), '<a href="').concat(mw.util.getUrl("QW:BYPASS"), '" title="QW:BYPASS"><b>').concat(window.wgULS("绕过浏览器缓存", "繞過瀏覽器快取"), "</b></a>。</p>");
        Morebits.status.root.appendChild(noticebox);
        const noticeclear = document.createElement("br");
        noticeclear.style.clear = "both";
        Morebits.status.root.appendChild(noticeclear);
      };
      Twinkle.addInitCallback(Twinkle.config.init);
    })(jQuery);
  }
});
//! src/Twinkle/Twinkle.js
(function() {
  var _twinkleLoad = _asyncToGenerator(function* () {
    yield Promise.resolve().then(() => (init_twinkle(), twinkle_exports));
    yield Promise.resolve().then(() => (init_twinklearv(), twinklearv_exports));
    yield Promise.resolve().then(() => (init_twinklewarn(), twinklewarn_exports));
    yield Promise.resolve().then(() => (init_twinkleblock(), twinkleblock_exports));
    yield Promise.resolve().then(() => (init_friendlytalkback(), friendlytalkback_exports));
    yield Promise.resolve().then(() => (init_twinklespeedy(), twinklespeedy_exports));
    yield Promise.resolve().then(() => (init_twinklecopyvio(), twinklecopyvio_exports));
    yield Promise.resolve().then(() => (init_twinklexfd(), twinklexfd_exports));
    yield Promise.resolve().then(() => (init_twinkleimage(), twinkleimage_exports));
    yield Promise.resolve().then(() => (init_twinkleprotect(), twinkleprotect_exports));
    yield Promise.resolve().then(() => (init_friendlytag(), friendlytag_exports));
    yield Promise.resolve().then(() => (init_twinklestub(), twinklestub_exports));
    yield Promise.resolve().then(() => (init_twinklediff(), twinklediff_exports));
    yield Promise.resolve().then(() => (init_twinkleunlink(), twinkleunlink_exports));
    yield Promise.resolve().then(() => (init_twinklefluff(), twinklefluff_exports));
    yield Promise.resolve().then(() => (init_twinklebatchdelete(), twinklebatchdelete_exports));
    yield Promise.resolve().then(() => (init_twinklebatchundelete(), twinklebatchundelete_exports));
    yield Promise.resolve().then(() => (init_twinklebatchprotect(), twinklebatchprotect_exports));
    yield Promise.resolve().then(() => (init_twinkleclose(), twinkleclose_exports));
    yield Promise.resolve().then(() => (init_twinkleconfig(), twinkleconfig_exports));
  });
  function twinkleLoad() {
    return _twinkleLoad.apply(this, arguments);
  }
  return twinkleLoad;
})()();

})();

/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWFydi5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGV3YXJuLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvYXBpLnRzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWJsb2NrLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvZnJpZW5kbHl0YWxrYmFjay5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGVzcGVlZHkuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlY29weXZpby5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGV4ZmQuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlaW1hZ2UuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlcHJvdGVjdC5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL2ZyaWVuZGx5dGFnLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZXN0dWIuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlZGlmZi5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGV1bmxpbmsuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlZmx1ZmYuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlYmF0Y2hkZWxldGUuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlYmF0Y2h1bmRlbGV0ZS5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGViYXRjaHByb3RlY3QuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlY2xvc2UuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlY29uZmlnLmpzIiwgInNyYy9Ud2lua2xlL1R3aW5rbGUuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGUuanMgKi9cbihmdW5jdGlvbiB0d2lua2xlKCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdGNvbnN0IFR3aW5rbGUgPSB7fTtcblx0d2luZG93LlR3aW5rbGUgfHw9IFR3aW5rbGU7IC8vIGFsbG93IGdsb2JhbCBhY2Nlc3Ncblx0Ly8gV3JhcCB3aXRoIGFub255bW91cyBmdW5jdGlvblxuXHQvLyBDaGVjayBpZiBhY2NvdW50IGlzIGV4cGVyaWVuY2VkIGVub3VnaCB0byB1c2UgVHdpbmtsZVxuXHRpZiAoIU1vcmViaXRzLnVzZXJJc0luR3JvdXAoJ2F1dG9jb25maXJtZWQnKSAmJiAhTW9yZWJpdHMudXNlcklzSW5Hcm91cCgnY29uZmlybWVkJykpIHtcblx0XHRjb25zb2xlLndhcm4oJ1tUd2lua2xlXSDpnZ7noa7orqTnlKjmiLfmiJboh6rliqjnoa7orqTnlKjmiLfvvIxUd2lua2xl5LiN5Lya6L+Q6KGM44CCJyk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdC8qKlxuXHQgKiBUd2lua2xlLXNwZWNpZmljIGRhdGEgc2hhcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXNcblx0ICogTGlrZWx5IGN1c3RvbWl6ZWQgcGVyIGluc3RhbGxhdGlvblxuXHQgKi9cblx0Ly8gQ3VzdG9tIGNoYW5nZSB0YWcocykgdG8gYmUgYXBwbGllZCB0byBhbGwgVHdpbmtsZSBhY3Rpb25zLCBjcmVhdGUgYXQgU3BlY2lhbDpUYWdzXG5cdFR3aW5rbGUuY2hhbmdlVGFncyA9ICdUd2lua2xlJztcblx0Ly8gQXZhaWxhYmxlIGZvciBhY3Rpb25zIHRoYXQgZG9uJ3QgKHlldCkgc3VwcG9ydCB0YWdzXG5cdFR3aW5rbGUuc3VtbWFyeUFkID0gJ++8iFtbSDpUV3xUd2lua2xlXV3vvIknO1xuXHQvLyBWYXJpb3VzIGhhdG5vdGUgdGVtcGxhdGVzLCB1c2VkIHdoZW4gdGFnZ2luZyAoY3NkL3hmZC90YWcvcHJvZC9wcm90ZWN0KSB0byBlbnN1cmUgb3JkZXJcblx0VHdpbmtsZS5oYXRub3RlUmVnZXggPVxuXHRcdCcoPzpTaG9ydFsgX11kZXNjcmlwdGlvbil8KD86UmVsbGlua3xIYXRub3RlfEhBVCl8KD86TWFpbnxb57uG57SwXVvoioLnr4BdfE1haW5bIF9dYXJ0aWNsZXN85Li7W+adoeainV3nm658SHVycmljYW5lWyBfXW1haW58W+adoeainV3nm6585Li7fFvpoIHpobVd6Z2ifOS4u1vpoIHpobVd6Z2ifOS4u1vpoIHpobVdfOS4u1vpoYzpophd55uufE1haW5bIF9dYXJ0aWNsZXxBUCl8KD86V3Jvbmd0aXRsZXxDb3JyZWN0WyBfXXRpdGxlKXwoPzrkuLvmnaHnm67mtojmrafkuYl85Li75qKd55uu5raI5q2n576pfOa2iOatp+S5iemTvuaOpXzmtojmrafnvqnpj4jmjqV85raI5q2n576p6YCj57WQfOa2iOi/nnzmtojpgKN85raI5q2n5LmJ6L+e57uTfERpc2FtYkxpbmt8Tm90ZXJlZnxEYWJsaW5rKXwoPzpEaXN0aW5ndWlzaHzkuI3mmK98Tm90fOaPkOekunzmt7fmt4Z85YiG5YilfOWIhuWIq3zljYDliKV85Yy65YirfOacrOadoeebrueahOS4u+mimOS4jeaYr3zmnKzmop3nm67nmoTkuLvpoYzkuI3mmK985pys5p2h55uu5Li76aKY5LiN5pivfOacrOaineebruS4u+mhjOS4jeaYr3zmnaHnm67kuLvpopjkuI3mmK985qKd55uu5Li76aGM5LiN5pivfOS4u+mimOS4jeaYr3zkuLvpoYzkuI3mmK98Q29uZnVzZWR85Yy65YiGfOWNgOWIhnxDb25mdXNpb258Q29uZnVzZXxSZWRpcmVjdE5PVHxNaXNzcGVsbGluZyl8KD86RGlzdGluZ3Vpc2gyfFNlbGZEaXN0aW5ndWlzaHxOb3QyfOS4jeaYrzIpfCg/OkZvcil8KD86RGV0YWlsc3xGdXJ0aGVyfFNlZXzlj6bop4F85Y+m6KaLfE1vcmV855u46Zec5qKd55uufOebuOWFs+adoeebrnxEZXRhaWx86KeBfOimi3zmm7TlpJrotYTmlpl85pu05aSa6LOH5paZfEZ1cnRoZXJbIF9daW5mb3JtYXRpb2585pu05aSa6LWE6K6vfOabtOWkmuizh+ioinxNb3JlWyBfXWluZm9ybWF0aW9ufOabtOWkmuS/oeaBryl8KD86U2VsZnJlZil8KD86QWJvdXR8T3RoZXJ1c2VzNHzlhbPkuo586Zec5pa8KXwoPzpPdGhlclsgX111c2VzfE90aGVydXNlfOadoeebrua2iOatp+S5iXzmop3nm67mtojmrafnvql85LuW55SofE90aGVydXNlcyl8KD86T3RoZXJbIF9ddXNlcyBsaXN0fE90aGVydXNlbGlzdHzkuLvmop3nm67mtojmrafnvqnliJfooah85Li75p2h55uu5raI5q2n5LmJ5YiX6KGofE90aGVydXNlc2xpc3R8QWJvdXRsaXN0fEFib3V0WyBfXWxpc3R8T3RoZXJ1c2VzWyBfXWxpc3QpfCg/OlJlZGlyZWN0fOmHjeWumuWQkeiHs+atpHxSZWRpcmVjdHNbIF9daGVyZXxSZWRpcmVjdFsgX110byl8KD86UmVkaXJlY3QyfOS4u+aineebrua2iOatp+e+qTJ85Li75p2h55uu5raI5q2n5LmJMnxSZWRpcnzph43lrprlkJHoh7PmraQyKXwoPzpSZWRpcmVjdDMpfCg/OlJlZGlyZWN0NCl8KD86UmVkaXJlY3QtZGlzdGluZ3Vpc2gpfCg/OlJlZGlyZWN0LXN5bm9ueW0pfCg/OlJlZGlyZWN0LW11bHRpKXwoPzpTZWVbIF9dV2lrdGlvbmFyeXxTZWV3aWt0KXwoPzpTZWVhbHNvfOWPgueci3zlj4PnnIt8U2VlWyBfXWFsc2985Y+C6KeBfOWPg+imi3xBbHNvKXwoPzpTZWVbIF9dYWxzbzJ8U2VlYWxzbzJ85LiN6L2J5o+b5Y+D6KaLfOS4jei9rOaNouWPguingSl8KD86T3RoZXJbIF9dcGxhY2VzKXwoPzpDb250cmFzdHzlsI3mr5R85a+55q+UKSc7XG5cdFR3aW5rbGUuaW5pdENhbGxiYWNrcyA9IFtdO1xuXHQvKipcblx0ICogQWRkcyBhIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiBUd2lua2xlIGhhcyBsb2FkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIG5hbWUgb2YgbW9kdWxlIHVzZWQgdG8gY2hlY2sgaWYgaXMgZGlzYWJsZWQuXG5cdCAqIElmIG5hbWUgaXMgbm90IGdpdmVuLCBtb2R1bGUgaXMgbG9hZGVkIHVuY29uZGl0aW9uYWxseS5cblx0ICovXG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrID0gKGZ1bmMsIG5hbWUpID0+IHtcblx0XHRUd2lua2xlLmluaXRDYWxsYmFja3NbVHdpbmtsZS5pbml0Q2FsbGJhY2tzLmxlbmd0aF0gPSB7XG5cdFx0XHRmdW5jLFxuXHRcdFx0bmFtZSxcblx0XHR9O1xuXHR9O1xuXHRUd2lua2xlLmRlZmF1bHRDb25maWcgPSB7fTtcblx0LyoqXG5cdCAqIFRoaXMgaG9sZHMgdGhlIGRlZmF1bHQgc2V0IG9mIHByZWZlcmVuY2VzIHVzZWQgYnkgVHdpbmtsZS5cblx0ICogSXQgaXMgaW1wb3J0YW50IHRoYXQgYWxsIG5ldyBwcmVmZXJlbmNlcyBhZGRlZCBoZXJlLCBlc3BlY2lhbGx5IGFkbWluLW9ubHkgb25lcywgYXJlIGFsc28gYWRkZWQgdG9cblx0ICogfFR3aW5rbGUuY29uZmlnLnNlY3Rpb25zfCBpbiB0d2lua2xlY29uZmlnLmpzLCBzbyB0aGV5IGFyZSBjb25maWd1cmFibGUgdmlhIHRoZSBUd2lua2xlIHByZWZlcmVuY2VzIHBhbmVsLlxuXHQgKiBGb3IgaGVscCBvbiB0aGUgYWN0dWFsIHByZWZlcmVuY2VzLCBzZWUgdGhlIGNvbW1lbnRzIGluIHR3aW5rbGVjb25maWcuanMuXG5cdCAqXG5cdCAqIEZvcm1lcmx5IFR3aW5rbGUuZGVmYXVsdENvbmZpZy50d2lua2xlXG5cdCAqL1xuXHRUd2lua2xlLmRlZmF1bHRDb25maWcgPSB7XG5cdFx0Ly8gR2VuZXJhbFxuXHRcdHVzZXJUYWxrUGFnZU1vZGU6ICd0YWInLFxuXHRcdGRpYWxvZ0xhcmdlRm9udDogZmFsc2UsXG5cdFx0ZGlzYWJsZWRNb2R1bGVzOiBNb3JlYml0cy51c2VySXNTeXNvcCA/IFtdIDogWydibG9jayddLFxuXHRcdC8vIGRlZmF1bHQgdG8gZGlzYWJsZSBibG9jayBmb3Igbm9uLXN5c29wLCBpZiBlbmFibGUgbWFudWFsbHksIHRoZXkgY2FuIG9ubHkgdXNlIGl0IHRvIHRhZyB1c2VycGFnZVxuXHRcdGRpc2FibGVkU3lzb3BNb2R1bGVzOiBbXSxcblx0XHQvLyBBUlZcblx0XHRzcGlXYXRjaFJlcG9ydDogJ3llcycsXG5cdFx0Ly8gQmxvY2tcblx0XHRkZWZhdWx0VG9CbG9jazY0OiBmYWxzZSxcblx0XHRkZWZhdWx0VG9QYXJ0aWFsQmxvY2tzOiBmYWxzZSxcblx0XHRibGFua1RhbGtwYWdlT25JbmRlZkJsb2NrOiBmYWxzZSxcblx0XHR3YXRjaEJsb2NrTm90aWNlczogJ3llcycsXG5cdFx0Y3VzdG9tQmxvY2tSZWFzb25MaXN0OiBbXSxcblx0XHQvLyBGbHVmZiAocmV2ZXJ0IGFuZCByb2xsYmFjaylcblx0XHRvcGVuVGFsa1BhZ2U6IFtdLFxuXHRcdG9wZW5UYWxrUGFnZU9uQXV0b1JldmVydDogZmFsc2UsXG5cdFx0cm9sbGJhY2tJblBsYWNlOiBmYWxzZSxcblx0XHRtYXJrUmV2ZXJ0ZWRQYWdlc0FzTWlub3I6IFsndmFuZCddLFxuXHRcdHdhdGNoUmV2ZXJ0ZWRQYWdlczogWydub3JtJywgJ3ZhbmQnLCAndG9yZXYnXSxcblx0XHR3YXRjaFJldmVydGVkRXhwaXJ5OiAneWVzJyxcblx0XHRvZmZlclJlYXNvbk9uTm9ybWFsUmV2ZXJ0OiB0cnVlLFxuXHRcdGNvbmZpcm1PbkZsdWZmOiBmYWxzZSxcblx0XHRzaG93Um9sbGJhY2tMaW5rczogWydkaWZmJywgJ290aGVycyddLFxuXHRcdGN1c3RvbVJldmVydFN1bW1hcnk6IFtdLFxuXHRcdC8vIERJICh0d2lua2xlaW1hZ2UpXG5cdFx0bm90aWZ5VXNlck9uRGVsaTogdHJ1ZSxcblx0XHRkZWxpV2F0Y2hQYWdlOiAnZGVmYXVsdCcsXG5cdFx0ZGVsaVdhdGNoVXNlcjogJ2RlZmF1bHQnLFxuXHRcdC8vIFByb3RlY3Rcblx0XHR3YXRjaFJlcXVlc3RlZFBhZ2VzOiAneWVzJyxcblx0XHR3YXRjaFBQVGFnZ2VkUGFnZXM6ICdkZWZhdWx0Jyxcblx0XHR3YXRjaFByb3RlY3RlZFBhZ2VzOiAnZGVmYXVsdCcsXG5cdFx0Ly8gQ1NEXG5cdFx0c3BlZWR5U2VsZWN0aW9uU3R5bGU6ICdidXR0b25DbGljaycsXG5cdFx0d2F0Y2hTcGVlZHlQYWdlczogWydnMScsICdnMycsICdnNCcsICdnNycsICdnOCddLFxuXHRcdHdhdGNoU3BlZWR5RXhwaXJ5OiAneWVzJyxcblx0XHRtYXJrU3BlZWR5UGFnZXNBc1BhdHJvbGxlZDogZmFsc2UsXG5cdFx0d2F0Y2hTcGVlZHlVc2VyOiAnMSBtb250aCcsXG5cdFx0Ly8gdGhlc2UgbmV4dCB0d28gc2hvdWxkIHByb2JhYmx5IGJlIGlkZW50aWNhbCBieSBkZWZhdWx0XG5cdFx0bm90aWZ5VXNlck9uU3BlZWR5RGVsZXRpb25Ob21pbmF0aW9uOiBbXG5cdFx0XHQnZGInLFxuXHRcdFx0J2cxJyxcblx0XHRcdCdnMicsXG5cdFx0XHQnZzMnLFxuXHRcdFx0J2c0Jyxcblx0XHRcdCdnNScsXG5cdFx0XHQnZzYnLFxuXHRcdFx0J2c3Jyxcblx0XHRcdCdnOCcsXG5cdFx0XHQnZzknLFxuXHRcdFx0J2ExJyxcblx0XHRcdCdhMicsXG5cdFx0XHQnYTMnLFxuXHRcdFx0J3IxJyxcblx0XHRcdCdyMicsXG5cdFx0XHQnZjEnLFxuXHRcdFx0J2YyJyxcblx0XHRcdCdmMycsXG5cdFx0XHQnZjQnLFxuXHRcdFx0J2Y1Jyxcblx0XHRcdCdvMScsXG5cdFx0XHQnbzInLFxuXHRcdFx0J28zJyxcblx0XHRdLFxuXHRcdHdhcm5Vc2VyT25TcGVlZHlEZWxldGU6IFtcblx0XHRcdCdkYicsXG5cdFx0XHQnZzEnLFxuXHRcdFx0J2cyJyxcblx0XHRcdCdnMycsXG5cdFx0XHQnZzQnLFxuXHRcdFx0J2c1Jyxcblx0XHRcdCdnNicsXG5cdFx0XHQnZzcnLFxuXHRcdFx0J2c4Jyxcblx0XHRcdCdnOScsXG5cdFx0XHQnYTEnLFxuXHRcdFx0J2EyJyxcblx0XHRcdCdhMycsXG5cdFx0XHQncjEnLFxuXHRcdFx0J3IyJyxcblx0XHRcdCdmMScsXG5cdFx0XHQnZjInLFxuXHRcdFx0J2YzJyxcblx0XHRcdCdmNCcsXG5cdFx0XHQnZjUnLFxuXHRcdFx0J28xJyxcblx0XHRcdCdvMicsXG5cdFx0XHQnbzMnLFxuXHRcdF0sXG5cdFx0cHJvbXB0Rm9yU3BlZWR5RGVsZXRpb25TdW1tYXJ5OiBbXSxcblx0XHRvcGVuVXNlclRhbGtQYWdlT25TcGVlZHlEZWxldGU6IFtdLFxuXHRcdGRlbGV0ZVRhbGtQYWdlT25EZWxldGU6IHRydWUsXG5cdFx0ZGVsZXRlUmVkaXJlY3RzT25EZWxldGU6IHRydWUsXG5cdFx0ZGVsZXRlU3lzb3BEZWZhdWx0VG9EZWxldGU6IGZhbHNlLFxuXHRcdHNwZWVkeVdpbmRvd0hlaWdodDogNTAwLFxuXHRcdHNwZWVkeVdpbmRvd1dpZHRoOiA4MDAsXG5cdFx0bG9nU3BlZWR5Tm9taW5hdGlvbnM6IHRydWUsXG5cdFx0c3BlZWR5TG9nUGFnZU5hbWU6ICdDU0Tml6Xlv5cnLFxuXHRcdG5vTG9nT25TcGVlZHlOb21pbmF0aW9uOiBbJ28xJ10sXG5cdFx0ZW5sYXJnZUc3SW5wdXQ6IGZhbHNlLFxuXHRcdC8vIFVubGlua1xuXHRcdHVubGlua05hbWVzcGFjZXM6IFsnMCcsICc2JywgJzEwJywgJzExOCddLFxuXHRcdC8vIFdhcm5cblx0XHRkZWZhdWx0V2FybmluZ0dyb3VwOiAnMScsXG5cdFx0Y29tYmluZWRTaW5nbGV0TWVudXM6IGZhbHNlLFxuXHRcdHdhdGNoV2FybmluZ3M6ICd5ZXMnLFxuXHRcdG9sZFNlbGVjdDogZmFsc2UsXG5cdFx0Y3VzdG9tV2FybmluZ0xpc3Q6IFtdLFxuXHRcdGF1dG9NZW51QWZ0ZXJSb2xsYmFjazogZmFsc2UsXG5cdFx0Ly8gWGZEXG5cdFx0bG9nWGZkTm9taW5hdGlvbnM6IHRydWUsXG5cdFx0eGZkTG9nUGFnZU5hbWU6ICdYZkTml6Xlv5cnLFxuXHRcdG5vTG9nT25YZmROb21pbmF0aW9uOiBbXSxcblx0XHR4ZmRXYXRjaERpc2N1c3Npb246ICdkZWZhdWx0Jyxcblx0XHR4ZmRXYXRjaFBhZ2U6ICdkZWZhdWx0Jyxcblx0XHR4ZmRXYXRjaFVzZXI6ICdkZWZhdWx0Jyxcblx0XHRtYXJrWGZkUGFnZXNBc1BhdHJvbGxlZDogdHJ1ZSxcblx0XHRGd2RDc2RUb1hmZDogTW9yZWJpdHMudXNlcklzU3lzb3AsXG5cdFx0YWZkRGVmYXVsdENhdGVnb3J5OiAnZGVsZXRlJyxcblx0XHRhZmRGYW1lRGVmYXVsdFJlYXNvbjogJ+ayoeaciei2s+Wkn+eahOWPr+mdoOadpea6kOivgeaYjuatpOadoeebruespuWQiFtbUWl1d2VuOuaUtuW9leagh+WHhnzmlLblvZXmoIflh4ZdXScsXG5cdFx0YWZkU3Vic3R1YkRlZmF1bHRSZWFzb246ICfov4fmnJ/lsI/lsI/kvZzlk4EnLFxuXHRcdFhmZENsb3NlOiBNb3JlYml0cy51c2VySXNTeXNvcCA/ICdhbGwnIDogJ2hpZGUnLFxuXHRcdC8vIENvcHl2aW9cblx0XHRjb3B5dmlvV2F0Y2hQYWdlOiAneWVzJyxcblx0XHRjb3B5dmlvV2F0Y2hVc2VyOiAneWVzJyxcblx0XHRtYXJrQ29weXZpb1BhZ2VzQXNQYXRyb2xsZWQ6IHRydWUsXG5cdFx0Ly8gSGlkZGVuIHByZWZlcmVuY2VzXG5cdFx0YXV0b2xldmVsU3RhbGVEYXlzOiAzLFxuXHRcdHJldmVydE1heFJldmlzaW9uczogNTAsXG5cdFx0Ly8gaW50ZW50aW9uYWxseSBsaW1pdGVkXG5cdFx0YmF0Y2hNYXg6IDUwMDAsXG5cdFx0YmF0Y2hDaHVua3M6IDUwLFxuXHRcdGNvbmZpZ1BhZ2U6ICdIZWxwOlR3aW5rbGUv5Y+C5pWw6K6+572uJyxcblx0XHRwcm9qZWN0TmFtZXNwYWNlTmFtZTogbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbNF0sXG5cdFx0c2FuZGJveFBhZ2U6ICdRaXV3ZW465rKZ55uSJyxcblx0XHQvLyBEZXByZWNhdGVkIG9wdGlvbnMsIGFzIGEgZmFsbGJhY2sgZm9yIGFkZC1vbiBzY3JpcHRzL21vZHVsZXNcblx0XHRzdW1tYXJ5QWQ6ICfvvIhbW0g6VFd8VHdpbmtsZV1d77yJJyxcblx0XHRkZWxldGlvblN1bW1hcnlBZDogJ++8iFtbSDpUV3xUd2lua2xlXV3vvIknLFxuXHRcdHByb3RlY3Rpb25TdW1tYXJ5QWQ6ICfvvIhbW0g6VFd8VHdpbmtsZV1d77yJJyxcblx0XHRibG9ja1N1bW1hcnlBZDogJ++8iFtbSDpUV3xUd2lua2xlXV3vvIknLFxuXHRcdC8vIFRhZ1xuXHRcdGdyb3VwQnlEZWZhdWx0OiB0cnVlLFxuXHRcdHdhdGNoVGFnZ2VkUGFnZXM6ICd5ZXMnLFxuXHRcdHdhdGNoTWVyZ2VEaXNjdXNzaW9uczogJ3llcycsXG5cdFx0bWFya1RhZ2dlZFBhZ2VzQXNNaW5vcjogZmFsc2UsXG5cdFx0bWFya1RhZ2dlZFBhZ2VzQXNQYXRyb2xsZWQ6IHRydWUsXG5cdFx0dGFnQXJ0aWNsZVNvcnRPcmRlcjogJ2NhdCcsXG5cdFx0Y3VzdG9tVGFnTGlzdDogW10sXG5cdFx0Y3VzdG9tRmlsZVRhZ0xpc3Q6IFtdLFxuXHRcdGN1c3RvbVJlZGlyZWN0VGFnTGlzdDogW10sXG5cdFx0Ly8gU3R1YlxuXHRcdHdhdGNoU3R1YmJlZFBhZ2VzOiBmYWxzZSxcblx0XHRtYXJrU3R1YmJlZFBhZ2VzQXNNaW5vcjogZmFsc2UsXG5cdFx0bWFya1N0dWJiZWRQYWdlc0FzUGF0cm9sbGVkOiB0cnVlLFxuXHRcdHN0dWJBcnRpY2xlU29ydE9yZGVyOiAnY2F0Jyxcblx0XHRjdXN0b21TdHViTGlzdDogW10sXG5cdFx0Ly8gVGFsa2JhY2tcblx0XHRtYXJrVGFsa2JhY2tBc01pbm9yOiB0cnVlLFxuXHRcdGluc2VydFRhbGtiYWNrU2lnbmF0dXJlOiB0cnVlLFxuXHRcdC8vIGFsd2F5cyBzaWduIHRhbGtiYWNrIHRlbXBsYXRlc1xuXHRcdHRhbGtiYWNrSGVhZGluZzogd2luZG93LndnVUxTKCflm57lpI3pgJrlkYonLCAn5Zue6KaG6YCa5ZGKJyksXG5cdFx0bWFpbEhlYWRpbmc6IHdpbmRvdy53Z1VMUygn5oKo5pyJ5paw6YKu5Lu277yBJywgJ+aCqOacieaWsOmDteS7tu+8gScpLFxuXHR9O1xuXHQvLyBub3cgc29tZSBza2luIGRlcGVuZGVudCBjb25maWcuXG5cdHN3aXRjaCAobXcuY29uZmlnLmdldCgnc2tpbicpKSB7XG5cdFx0Y2FzZSAndmVjdG9yJzpcblx0XHRjYXNlICd2ZWN0b3ItMjAyMic6XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldEFyZWEgPSAncmlnaHQtbmF2aWdhdGlvbic7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldElkID0gJ3AtdHdpbmtsZSc7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldE5hbWUgPSAnVFcnO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRUeXBlID0gJ21lbnUnO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXROZXh0ID0gJ3Atc2VhcmNoJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2dvbmdiaSc6XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldEFyZWEgPVxuXHRcdFx0XHQkYm9keS5maW5kKCcjcGFnZS10b29scyAuc2lkZWJhci1pbm5lcicpLmxlbmd0aCA+IDBcblx0XHRcdFx0XHQ/ICcjcGFnZS10b29scyAuc2lkZWJhci1pbm5lcidcblx0XHRcdFx0XHQ6ICcjcGFnZS1tb3JlIC5zaWRlYmFyLWlubmVyJztcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0SWQgPSAncC10d2lua2xlJztcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0TmFtZSA9ICdUd2lua2xlJztcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0VHlwZSA9IG51bGw7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldE5leHQgPVxuXHRcdFx0XHQkYm9keS5maW5kKCcjcGFnZS10b29scyAuc2lkZWJhci1pbm5lcicpLmxlbmd0aCA+IDAgPyAncGFnZS1tb3JlJyA6IG51bGw7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdjaXRpemVuJzpcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0QXJlYSA9ICcjcGFnZS1hY3Rpb25zLW1vcmVfX2NhcmQnO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRJZCA9ICdwLXR3aW5rbGUnO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXROYW1lID0gJ1R3aW5rbGUnO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRUeXBlID0gJ25hdic7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldE5leHQgPSAncC10Yic7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRBcmVhID0gbnVsbDtcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0SWQgPSAncC1jYWN0aW9ucyc7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldE5hbWUgPSBudWxsO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRUeXBlID0gbnVsbDtcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0TmV4dCA9IG51bGw7XG5cdH1cblx0VHdpbmtsZS5nZXRQcmVmID0gKG5hbWUpID0+IHtcblx0XHRpZiAodHlwZW9mIFR3aW5rbGUucHJlZnMgPT09ICdvYmplY3QnICYmIFR3aW5rbGUucHJlZnNbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIFR3aW5rbGUucHJlZnNbbmFtZV07XG5cdFx0fVxuXHRcdC8vIE9sZCBwcmVmZXJlbmNlcyBmb3JtYXQsIHVzZWQgYmVmb3JlIHR3aW5rbGVvcHRpb25zLmpzIHdhcyBhIHRoaW5nXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cuVHdpbmtsZUNvbmZpZyA9PT0gJ29iamVjdCcgJiYgd2luZG93LlR3aW5rbGVDb25maWdbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHdpbmRvdy5Ud2lua2xlQ29uZmlnW25hbWVdO1xuXHRcdH1cblx0XHRyZXR1cm4gVHdpbmtsZS5kZWZhdWx0Q29uZmlnW25hbWVdO1xuXHR9O1xuXHQvKipcblx0ICogKioqKioqKioqKioqKioqKiBUd2lua2xlLmFkZFBvcnRsZXQoKSAqKioqKioqKioqKioqKioqXG5cdCAqXG5cdCAqIEFkZHMgYSBwb3J0bGV0IG1lbnUgdG8gb25lIG9mIHRoZSBuYXZpZ2F0aW9uIGFyZWFzIG9uIHRoZSBwYWdlLlxuXHQgKiBUaGlzIGlzIG5lY2Vzc2FyaWx5IHF1aXRlIGEgaGFjayBzaW5jZSBza2lucywgbmF2aWdhdGlvbiBhcmVhcywgYW5kXG5cdCAqIHBvcnRsZXQgbWVudSB0eXBlcyBhbGwgd29yayBzbGlnaHRseSBkaWZmZXJlbnQuXG5cdCAqXG5cdCAqIEF2YWlsYWJsZSBuYXZpZ2F0aW9uIGFyZWFzIGRlcGVuZCBvbiB0aGUgc2tpbiB1c2VkLlxuXHQgKiBWZWN0b3I6XG5cdCAqIC0gRm9yIGVhY2ggb3B0aW9uLCB0aGUgb3V0ZXIgbmF2IGNsYXNzIGNvbnRhaW5zIFwidmVjdG9yLW1lbnVcIiwgdGhlIGlubmVyIGRpdiBjbGFzcyBpcyBcInZlY3Rvci1tZW51LWNvbnRlbnRcIiwgYW5kIHRoZSB1bCBpcyBcInZlY3Rvci1tZW51LWNvbnRlbnQtbGlzdFwiXG5cdCAqIC0gXCJtdy1wYW5lbFwiLCBvdXRlciBuYXYgY2xhc3MgY29udGFpbnMgXCJ2ZWN0b3ItbWVudS1wb3J0YWxcIi4gRXhpc3RpbmcgcG9ydGxldHMvZWxlbWVudHM6IFwicC1sb2dvXCIsIFwicC1uYXZpZ2F0aW9uXCIsIFwicC1pbnRlcmFjdGlvblwiLCBcInAtdGJcIiwgXCJwLWNvbGwtcHJpbnRfZXhwb3J0XCJcblx0ICogLSBcImxlZnQtbmF2aWdhdGlvblwiLCBvdXRlciBuYXYgY2xhc3MgY29udGFpbnMgXCJ2ZWN0b3ItbWVudS10YWJzXCIgb3IgXCJ2ZWN0b3ItbWVudS1kcm9wZG93blwiLiBFeGlzdGluZyBwb3J0bGV0czogXCJwLW5hbWVzcGFjZXNcIiwgXCJwLXZhcmlhbnRzXCIgKG1lbnUpXG5cdCAqIC0gXCJyaWdodC1uYXZpZ2F0aW9uXCIsIG91dGVyIG5hdiBjbGFzcyBjb250YWlucyBcInZlY3Rvci1tZW51LXRhYnNcIiBvciBcInZlY3Rvci1tZW51LWRyb3Bkb3duXCIuIEV4aXN0aW5nIHBvcnRsZXRzOiBcInAtdmlld3NcIiwgXCJwLWNhY3Rpb25zXCIgKG1lbnUpLCBcInAtc2VhcmNoXCJcblx0ICogLSBTcGVjaWFsIGxheW91dCBvZiBwLXBlcnNvbmFsIHBvcnRsZXQgKHBhcnQgb2YgXCJoZWFkXCIpIHRocm91Z2ggc3BlY2lhbGl6ZWQgc3R5bGVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmF2aWdhdGlvbiAtLSBpZCBvZiB0aGUgdGFyZ2V0IG5hdmlnYXRpb24gYXJlYSAoc2tpbiBkZXBlbmRhbnQsIG9uIHZlY3RvciBlaXRoZXIgb2YgXCJsZWZ0LW5hdmlnYXRpb25cIiwgXCJyaWdodC1uYXZpZ2F0aW9uXCIsIG9yIFwibXctcGFuZWxcIilcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0tIGlkIG9mIHRoZSBwb3J0bGV0IG1lbnUgdG8gY3JlYXRlLCBwcmVmZXJhYmx5IHN0YXJ0IHdpdGggXCJwLVwiLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtLSBuYW1lIG9mIHRoZSBwb3J0bGV0IG1lbnUgdG8gY3JlYXRlLiBWaXNpYmlsaXR5IGRlcGVuZHMgb24gdGhlIGNsYXNzIHVzZWQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0tIHR5cGUgb2YgcG9ydGxldC4gQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgdGhlIHZlY3RvciBub24tc2lkZWJhciBwb3J0bGV0cywgcGFzcyBcIm1lbnVcIiB0byBtYWtlIHRoaXMgcG9ydGxldCBhIGRyb3AgZG93biBtZW51LlxuXHQgKiBAcGFyYW0ge05vZGV9IG5leHRub2RlaWQgLS0gdGhlIGlkIG9mIHRoZSBub2RlIGJlZm9yZSB3aGljaCB0aGUgbmV3IGl0ZW0gc2hvdWxkIGJlIGFkZGVkLCBzaG91bGQgYmUgYW5vdGhlciBpdGVtIGluIHRoZSBzYW1lIGxpc3QsIG9yIHVuZGVmaW5lZCB0byBwbGFjZSBpdCBhdCB0aGUgZW5kLlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtOb2RlfSAtLSB0aGUgRE9NIG5vZGUgb2YgdGhlIG5ldyBpdGVtIChhIERJViBlbGVtZW50KSBvciBudWxsXG5cdCAqL1xuXHRUd2lua2xlLmFkZFBvcnRsZXQgPSAobmF2aWdhdGlvbiwgaWQsIHRleHQsIHR5cGUsIG5leHRub2RlaWQpID0+IHtcblx0XHQvLyBzYW5pdHkgY2hlY2tzLCBhbmQgZ2V0IHJlcXVpcmVkIERPTSBub2Rlc1xuXHRcdGNvbnN0IHJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKC9eKD86I3xcXC4pLy50ZXN0KG5hdmlnYXRpb24pID8gbmF2aWdhdGlvbiA6IGAjJHtuYXZpZ2F0aW9ufWApO1xuXHRcdGlmICghcm9vdCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKTtcblx0XHRpZiAoaXRlbSkge1xuXHRcdFx0aWYgKGl0ZW0ucGFyZW50Tm9kZSAmJiBpdGVtLnBhcmVudE5vZGUgPT09IHJvb3QpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0bGV0IG5leHRub2RlO1xuXHRcdGlmIChuZXh0bm9kZWlkKSB7XG5cdFx0XHRuZXh0bm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke25leHRub2RlaWR9YCk7XG5cdFx0fVxuXHRcdC8vIHZlcmlmeS9ub3JtYWxpemUgaW5wdXRcblx0XHRjb25zdCBza2luID0gbXcuY29uZmlnLmdldCgnc2tpbicpO1xuXHRcdGlmIChcblx0XHRcdChza2luICE9PSAndmVjdG9yJyAmJiBza2luICE9PSAndmVjdG9yLTIwMjInKSB8fFxuXHRcdFx0KG5hdmlnYXRpb24gIT09ICdsZWZ0LW5hdmlnYXRpb24nICYmIG5hdmlnYXRpb24gIT09ICdyaWdodC1uYXZpZ2F0aW9uJylcblx0XHQpIHtcblx0XHRcdHR5cGUgPSBudWxsOyAvLyBtZW51IHN1cHBvcnRlZCBvbmx5IGluIHZlY3RvcidzICNsZWZ0LW5hdmlnYXRpb24gJiAjcmlnaHQtbmF2aWdhdGlvblxuXHRcdH1cblx0XHRsZXQgb3V0ZXJOYXZDbGFzcztcblx0XHRsZXQgaW5uZXJEaXZDbGFzcztcblx0XHRzd2l0Y2ggKHNraW4pIHtcblx0XHRcdGNhc2UgJ3ZlY3Rvcic6XG5cdFx0XHRjYXNlICd2ZWN0b3ItMjAyMic6XG5cdFx0XHRcdC8vIFhYWDogcG9ydGFsIGRvZXNuJ3Qgd29ya1xuXHRcdFx0XHRpZiAobmF2aWdhdGlvbiAhPT0gJ3BvcnRhbCcgJiYgbmF2aWdhdGlvbiAhPT0gJ2xlZnQtbmF2aWdhdGlvbicgJiYgbmF2aWdhdGlvbiAhPT0gJ3JpZ2h0LW5hdmlnYXRpb24nKSB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbiA9ICdtdy1wYW5lbCc7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0ZXJOYXZDbGFzcyA9ICdtdy1wb3J0bGV0IHZlY3Rvci1tZW51Jztcblx0XHRcdFx0aWYgKG5hdmlnYXRpb24gPT09ICdtdy1wYW5lbCcpIHtcblx0XHRcdFx0XHRvdXRlck5hdkNsYXNzICs9ICcgdmVjdG9yLW1lbnUtcG9ydGFsJztcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlID09PSAnbWVudScpIHtcblx0XHRcdFx0XHRvdXRlck5hdkNsYXNzICs9ICcgdmVjdG9yLW1lbnUtZHJvcGRvd24gdmVjdG9yLWRyb3Bkb3duIHZlY3Rvci1tZW51LWRyb3Bkb3duLW5vaWNvbic7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b3V0ZXJOYXZDbGFzcyArPSAnIHZlY3Rvci1tZW51LXRhYnMnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlubmVyRGl2Q2xhc3MgPSAndmVjdG9yLW1lbnUtY29udGVudCB2ZWN0b3ItZHJvcGRvd24tY29udGVudCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZ29uZ2JpJzpcblx0XHRcdFx0b3V0ZXJOYXZDbGFzcyA9ICdtdy1wb3J0bGV0Jztcblx0XHRcdFx0aW5uZXJEaXZDbGFzcyA9ICdtdy1wb3J0bGV0LWJvZHknO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2NpdGl6ZW4nOlxuXHRcdFx0XHRvdXRlck5hdkNsYXNzID0gJ213LXBvcnRsZXQnO1xuXHRcdFx0XHRpbm5lckRpdkNsYXNzID0gJ213LXBvcnRsZXQtdHdpbmtsZSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0bmF2aWdhdGlvbiA9ICdjb2x1bW4tb25lJztcblx0XHRcdFx0b3V0ZXJOYXZDbGFzcyA9ICdwb3J0bGV0Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIEJ1aWxkIHRoZSBET00gZWxlbWVudHMuXG5cdFx0bGV0IG91dGVyTmF2O1xuXHRcdGxldCBoZWFkaW5nO1xuXHRcdGlmIChza2luID09PSAndmVjdG9yLTIwMjInKSB7XG5cdFx0XHRvdXRlck5hdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0aGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dGVyTmF2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmF2Jyk7XG5cdFx0XHRoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcblx0XHR9XG5cdFx0b3V0ZXJOYXYuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCBgJHtpZH0tbGFiZWxgKTtcblx0XHQvLyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHVzZWQgaGVyZSAob3V0ZXJOYXZDbGFzcyk6XG5cdFx0Ly8gKiBtdy1wb3J0bGV0IHZlY3Rvci1tZW51IHZlY3Rvci1tZW51LSpcblx0XHQvLyAqIG13LXBvcnRsZXRcblx0XHQvLyAqIGNvbHVtbi1vbmVcblx0XHQvLyBWZWN0b3IgZ2V0dGluZyB2ZWN0b3ItbWVudS1lbXB0eSBGSVhNRSBUT0RPXG5cdFx0b3V0ZXJOYXYuY2xhc3NOYW1lID0gYCR7b3V0ZXJOYXZDbGFzc30gZW1wdHlQb3J0bGV0YDtcblx0XHRvdXRlck5hdi5pZCA9IGlkO1xuXHRcdGlmIChuZXh0bm9kZSAmJiBuZXh0bm9kZS5wYXJlbnROb2RlID09PSByb290KSB7XG5cdFx0XHRyb290Lmluc2VydEJlZm9yZShvdXRlck5hdiwgbmV4dG5vZGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyb290LmFwcGVuZENoaWxkKG91dGVyTmF2KTtcblx0XHR9XG5cdFx0aGVhZGluZy5pZCA9IGAke2lkfS1sYWJlbGA7XG5cdFx0Y29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuXHRcdGlmIChza2luID09PSAndmVjdG9yJyB8fCBza2luID09PSAndmVjdG9yLTIwMjInKSB7XG5cdFx0XHRoZWFkaW5nLnNldEF0dHJpYnV0ZSgnZm9yJywgYCR7aWR9LWRyb3Bkb3duLWNoZWNrYm94YCk7XG5cdFx0XHR1bC5jbGFzc05hbWUgPSAndmVjdG9yLW1lbnUtY29udGVudC1saXN0Jztcblx0XHRcdGhlYWRpbmcuY2xhc3NOYW1lID0gJ3ZlY3Rvci1tZW51LWhlYWRpbmcgdmVjdG9yLWRyb3Bkb3duLWxhYmVsJztcblx0XHRcdC8vIGFkZCBpbnZpc2libGUgY2hlY2tib3ggdG8ga2VlcCBtZW51IG9wZW4gd2hlbiBjbGlja2VkXG5cdFx0XHQvLyBzaW1pbGFyIHRvIHRoZSBwLWNhY3Rpb25zIChcIk1vcmVcIikgbWVudVxuXHRcdFx0aWYgKG91dGVyTmF2Q2xhc3MuaW5jbHVkZXMoJ3ZlY3Rvci1tZW51LWRyb3Bkb3duJykpIHtcblx0XHRcdFx0Y29uc3QgY2hrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblx0XHRcdFx0Y2hrYm94LmlkID0gYCR7aWR9LWRyb3Bkb3duLWNoZWNrYm94YDtcblx0XHRcdFx0Y2hrYm94LmNsYXNzTmFtZSA9ICd2ZWN0b3ItbWVudS1jaGVja2JveCB2ZWN0b3ItZHJvcGRvd24tY2hlY2tib3gnO1xuXHRcdFx0XHRjaGtib3guc2V0QXR0cmlidXRlKCd0eXBlJywgJ2NoZWNrYm94Jyk7XG5cdFx0XHRcdGNoa2JveC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGAke2lkfS1sYWJlbGApO1xuXHRcdFx0XHRvdXRlck5hdi5hcHBlbmRDaGlsZChjaGtib3gpO1xuXHRcdFx0XHQvLyBWZWN0b3IgZ2V0cyBpdHMgdGl0bGUgaW4gYSBzcGFuOyBhbGwgb3RoZXJzIGV4Y2VwdFxuXHRcdFx0XHQvLyBnb25nYmkgaGF2ZSBubyB0aXRsZSwgYW5kIGl0IGhhcyBubyBzcGFuXG5cdFx0XHRcdGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHRcdHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xuXHRcdFx0XHRoZWFkaW5nLmFwcGVuZENoaWxkKHNwYW4pO1xuXHRcdFx0XHRjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRhLmhyZWYgPSAnIyc7XG5cdFx0XHRcdCQoYSkub24oJ2NsaWNrJywgKGUpID0+IHtcblx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRoZWFkaW5nLmFwcGVuZENoaWxkKGEpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBCYXNpY2FsbHkganVzdCBHb25nYmlcblx0XHRcdGhlYWRpbmcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xuXHRcdH1cblx0XHRvdXRlck5hdi5hcHBlbmRDaGlsZChoZWFkaW5nKTtcblx0XHRpZiAoaW5uZXJEaXZDbGFzcykge1xuXHRcdFx0Y29uc3QgaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdC8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBoZXJlIChpbm5lckRpdkNsYXNzKTpcblx0XHRcdC8vICogdmVjdG9yLW1lbnUtY29udGVudFxuXHRcdFx0Ly8gKiBtdy1wb3J0bGV0LWJvZHlcblx0XHRcdC8vICogbXctcG9ydGxldC10d2lua2xlXG5cdFx0XHQvLyAqIHBvcnRsZXRcblx0XHRcdGlubmVyRGl2LmNsYXNzTmFtZSA9IGlubmVyRGl2Q2xhc3M7XG5cdFx0XHRpbm5lckRpdi5hcHBlbmRDaGlsZCh1bCk7XG5cdFx0XHRvdXRlck5hdi5hcHBlbmRDaGlsZChpbm5lckRpdik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dGVyTmF2LmFwcGVuZENoaWxkKHVsKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dGVyTmF2O1xuXHR9O1xuXHQvKipcblx0ICogKioqKioqKioqKioqKioqKiBUd2lua2xlLmFkZFBvcnRsZXRMaW5rKCkgKioqKioqKioqKioqKioqKlxuXHQgKiBCdWlsZHMgYSBwb3J0bGV0IG1lbnUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQsIGFuZCBhZGQgdGhlIHBvcnRsZXQgbGluay5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd8RnVuY3Rpb259IHRhc2sgLS0gRWl0aGVyIGEgVVJMIGZvciB0aGUgcG9ydGxldCBsaW5rIG9yIGEgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0b29sdGlwXG5cdCAqIEByZXR1cm4ge09iamVjdH0gbGlua1xuXHQgKi9cblx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayA9ICh0YXNrLCB0ZXh0LCBpZCwgdG9vbHRpcCkgPT4ge1xuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ3BvcnRsZXRBcmVhJykgIT09IG51bGwpIHtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldChcblx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdwb3J0bGV0QXJlYScpLFxuXHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3BvcnRsZXRJZCcpLFxuXHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3BvcnRsZXROYW1lJyksXG5cdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZigncG9ydGxldFR5cGUnKSxcblx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdwb3J0bGV0TmV4dCcpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRjb25zdCBsaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhcblx0XHRcdFR3aW5rbGUuZ2V0UHJlZigncG9ydGxldElkJyksXG5cdFx0XHR0eXBlb2YgdGFzayA9PT0gJ3N0cmluZycgPyB0YXNrIDogJyMnLFxuXHRcdFx0dGV4dCxcblx0XHRcdGlkLFxuXHRcdFx0dG9vbHRpcFxuXHRcdCk7XG5cdFx0JGJvZHkuZmluZCgnLmNsaWVudC1qcyAuc2tpbi12ZWN0b3IgI3AtY2FjdGlvbnMnKS5jc3MoJ21hcmdpbi1yaWdodCcsICdpbml0aWFsJyk7XG5cdFx0aWYgKHR5cGVvZiB0YXNrID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQkKGxpbmspXG5cdFx0XHRcdC5maW5kKCdhJylcblx0XHRcdFx0Lm9uKCdjbGljaycsIChldikgPT4ge1xuXHRcdFx0XHRcdHRhc2soKTtcblx0XHRcdFx0XHRldi5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKCQuY29sbGFwc2libGVUYWJzKSB7XG5cdFx0XHQkLmNvbGxhcHNpYmxlVGFicy5oYW5kbGVSZXNpemUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGxpbms7XG5cdH07XG5cdC8qKlxuXHQgKiAqKioqKioqKioqKioqKioqIEdlbmVyYWwgaW5pdGlhbGl6YXRpb24gY29kZSAqKioqKioqKioqKioqKioqXG5cdCAqL1xuXHRjb25zdCBzY3JpcHR1cmwgPSBtdy51dGlsLmdldFVybChgVXNlcjoke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX0vdHdpbmtsZW9wdGlvbnMuanNgLCB7XG5cdFx0YWN0aW9uOiAncmF3Jyxcblx0XHRjdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG5cdFx0aGFwcHk6ICd5ZXMnLFxuXHR9KTtcblx0Ly8gUmV0cmlldmUgdGhlIHVzZXIncyBUd2lua2xlIHByZWZlcmVuY2VzICh3aW5kb3cuVHdpbmtsZS5wcmVmcylcblx0VHdpbmtsZS5wcmVmcyB8fD0ge307XG5cdG13LmxvYWRlclxuXHRcdC5nZXRTY3JpcHQoc2NyaXB0dXJsKVxuXHRcdC5mYWlsKCgpID0+IHtcblx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5pyq6IO95Yqg6L295oKo55qEVHdpbmtsZeWPguaVsOiuvue9ricsICfmnKrog73ovInlhaXmgqjnmoRUd2lua2xl5YGP5aW96Kit5a6aJyksIHtcblx0XHRcdFx0dHlwZTogJ2Vycm9yJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZScsXG5cdFx0XHR9KTtcblx0XHR9KVxuXHRcdC5hbHdheXMoKCkgPT4ge1xuXHRcdFx0JChUd2lua2xlLmxvYWQpO1xuXHRcdH0pO1xuXHQvLyBEZXZlbG9wZXJzOiB5b3UgY2FuIGltcG9ydCBjdXN0b20gVHdpbmtsZSBtb2R1bGVzIGhlcmVcblx0Ly8gRm9yIGV4YW1wbGUsIG13LmxvYWRlci5sb2FkKHNjcmlwdHBhdGhiZWZvcmUgKyBcIlVzZXI6VW5jbGVEb3VnZ2llL21vcmViaXRzLXRlc3QuanNcIiArIHNjcmlwdHBhdGhhZnRlcik7XG5cdFR3aW5rbGUubG9hZCA9ICgpID0+IHtcblx0XHQvLyBEb24ndCBhY3RpdmF0ZSBvbiBzcGVjaWFsIHBhZ2VzIG90aGVyIHRoYW4gdGhvc2UgbGlzdGVkIGhlcmUsIHNvXG5cdFx0Ly8gdGhhdCBvdGhlcnMgbG9hZCBmYXN0ZXIsIGVzcGVjaWFsbHkgdGhlIHdhdGNobGlzdC5cblx0XHRsZXQgYWN0aXZlU3BlY2lhbFBhZ2VMaXN0ID0gWydCbG9jaycsICdDb250cmlidXRpb25zJywgJ0FidXNlTG9nJywgJ1JlY2VudGNoYW5nZXMnLCAnUmVjZW50Y2hhbmdlc2xpbmtlZCddOyAvLyB3Z1JlbGV2YW50VXNlck5hbWUgZGVmaW5lZCBmb3Igbm9uLXN5c29wcyBvbiBTcGVjaWFsOkJsb2NrXG5cdFx0aWYgKE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRhY3RpdmVTcGVjaWFsUGFnZUxpc3QgPSBbXG5cdFx0XHRcdC4uLmFjdGl2ZVNwZWNpYWxQYWdlTGlzdCxcblx0XHRcdFx0J0RlbGV0ZWRDb250cmlidXRpb25zJyxcblx0XHRcdFx0J1ByZWZpeGluZGV4Jyxcblx0XHRcdFx0J0Jyb2tlblJlZGlyZWN0cycsXG5cdFx0XHRdO1xuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAtMSAmJlxuXHRcdFx0IWFjdGl2ZVNwZWNpYWxQYWdlTGlzdC5pbmNsdWRlcyhtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBQcmV2ZW50IGNsaWNramFja2luZ1xuXHRcdGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBTZXQgY3VzdG9tIEFwaS1Vc2VyLUFnZW50IGhlYWRlciwgZm9yIHNlcnZlci1zaWRlIGxvZ2dpbmcgcHVycG9zZXNcblx0XHRUd2lua2xlLnVzZXJBZ2VudCA9ICdUd2lua2xlLzEuMSc7XG5cdFx0TW9yZWJpdHMud2lraS5hcGkuc2V0QXBpVXNlckFnZW50KFR3aW5rbGUudXNlckFnZW50KTtcblx0XHRUd2lua2xlLmRpc2FibGVkTW9kdWxlcyA9IFsuLi5Ud2lua2xlLmdldFByZWYoJ2Rpc2FibGVkTW9kdWxlcycpLCAuLi5Ud2lua2xlLmdldFByZWYoJ2Rpc2FibGVkU3lzb3BNb2R1bGVzJyldO1xuXHRcdC8vIFJlZGVmaW5lIGFkZEluaXRDYWxsYmFjayBzbyB0aGF0IGFueSBtb2R1bGVzIGJlaW5nIGxvYWRlZCBub3cgb24gYXJlIGRpcmVjdGx5XG5cdFx0Ly8gaW5pdGlhbGlzZWQgcmF0aGVyIHRoYW4gYWRkZWQgdG8gaW5pdENhbGxiYWNrcyBhcnJheVxuXHRcdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrID0gKGZ1bmMsIG5hbWUpID0+IHtcblx0XHRcdGlmICghbmFtZSB8fCAhVHdpbmtsZS5kaXNhYmxlZE1vZHVsZXMuaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0ZnVuYygpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gSW5pdGlhbGlzZSBtb2R1bGVzIHRoYXQgd2VyZSBzYXZlZCBpbiBpbml0Q2FsbGJhY2tzIGFycmF5XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgVHdpbmtsZS5pbml0Q2FsbGJhY2tzKSB7XG5cdFx0XHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhtb2R1bGUuZnVuYywgbW9kdWxlLm5hbWUpO1xuXHRcdH1cblx0XHQvLyBJbmNyZWFzZXMgdGV4dCBzaXplIGluIFR3aW5rbGUgZGlhbG9ncywgaWYgc28gY29uZmlndXJlZFxuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2RpYWxvZ0xhcmdlRm9udCcpKSB7XG5cdFx0XHRtdy51dGlsLmFkZENTUyhcblx0XHRcdFx0Jy5tb3JlYml0cy1kaWFsb2ctY29udGVudCwubW9yZWJpdHMtZGlhbG9nLWZvb3Rlcmxpbmtze2ZvbnQtc2l6ZToxMDAlIWltcG9ydGFudH0ubW9yZWJpdHMtZGlhbG9nIGlucHV0LC5tb3JlYml0cy1kaWFsb2cgc2VsZWN0LC5tb3JlYml0cy1kaWFsb2ctY29udGVudCBidXR0b257Zm9udC1zaXplOmluaGVyaXQgIWltcG9ydGFudH0nXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvLyBIaWRlIHRoZSBsaW5nZXJpbmcgc3BhY2UgaWYgdGhlIFRXIG1lbnUgaXMgZW1wdHlcblx0XHRjb25zdCBpc1ZlY3RvciA9IFsndmVjdG9yJywgJ3ZlY3Rvci0yMDIyJ10uaW5jbHVkZXMobXcuY29uZmlnLmdldCgnc2tpbicpKTtcblx0XHRpZiAoaXNWZWN0b3IgJiYgVHdpbmtsZS5nZXRQcmVmKCdwb3J0bGV0VHlwZScpID09PSAnbWVudScgJiYgJGJvZHkuZmluZCgnI3AtdHdpbmtsZScpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0JGJvZHkuZmluZCgnI3AtY2FjdGlvbnMnKS5jc3MoJ21hcmdpbi1yaWdodCcsICdpbml0aWFsJyk7XG5cdFx0fVxuXHR9O1xuXHQvKipcblx0ICogVHdpbmtsZS1zcGVjaWZpYyB1dGlsaXR5IGZ1bmN0aW9ucyBzaGFyZWQgYnkgbXVsdGlwbGUgbW9kdWxlc1xuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGZpcnN0XG5cdCAqIEBwYXJhbSB7Kn0gc2Vjb25kXG5cdCAqL1xuXHQvLyBVc2VkIGluIGJhdGNoLCB1bmxpbmssIGFuZCBkZXByb2QgdG8gc29ydCBwYWdlcyBieSBuYW1lc3BhY2UsIGFzXG5cdC8vIGpzb24gZm9ybWF0dmVyc2lvbj0yIHNvcnRzIGJ5IHBhZ2VpZCBpbnN0ZWFkICgjMTI1MSlcblx0VHdpbmtsZS5zb3J0QnlOYW1lc3BhY2UgPSAoZmlyc3QsIHNlY29uZCkgPT4ge1xuXHRcdHJldHVybiBmaXJzdC5ucyAtIHNlY29uZC5ucyB8fCAoZmlyc3QudGl0bGUgPiBzZWNvbmQudGl0bGUgPyAxIDogLTEpO1xuXHR9O1xuXHQvLyBVc2VkIGluIHVubGluayBsaXN0aW5ncyB0byBsaW5rIHRoZSBwYWdlIHRpdGxlXG5cdFR3aW5rbGUuZ2VuZXJhdGVCYXRjaFBhZ2VMaW5rcyA9IChjaGVja2JveCkgPT4ge1xuXHRcdGNvbnN0ICRjaGVja2JveCA9ICQoY2hlY2tib3gpO1xuXHRcdGNvbnN0IGxpbmsgPSBNb3JlYml0cy5odG1sTm9kZSgnYScsICRjaGVja2JveC52YWwoKSk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3R3LWJhdGNocGFnZS1saW5rJyk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBtdy51dGlsLmdldFVybCgkY2hlY2tib3gudmFsKCkpKTtcblx0XHRsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuXHRcdCRjaGVja2JveC5uZXh0KCkucHJlcGVuZChbbGluaywgJyAnXSk7XG5cdH07XG59KShqUXVlcnkpO1xuXG5leHBvcnQge307XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcblxuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlYXJ2LmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWFydigkKSB7XG5cdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHQvKipcblx0ICogdHdpbmtsZWFydi5qczogQVJWIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJBUlZcIilcblx0ICogQWN0aXZlIG9uOiBBbnkgcGFnZSB3aXRoIHJlbGV2YW50IHVzZXIgbmFtZSAodXNlcnNwYWNlLCBjb250cmlicywgZXRjLilcblx0ICovXG5cdFR3aW5rbGUuYXJ2ID0gKCkgPT4ge1xuXHRcdGNvbnN0IHVzZXJuYW1lID0gbXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyk7XG5cdFx0aWYgKCF1c2VybmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBpc0lQID0gbXcudXRpbC5pc0lQQWRkcmVzcyh1c2VybmFtZSk7XG5cdFx0Y29uc3QgdGl0bGUgPSBpc0lQXG5cdFx0XHQ/IHdpbmRvdy53Z1VMUygn5oql5ZGKSVDnu5nnrqHnkIblkZgnLCAn5aCx5ZGKSVDntabnrqHnkIblk6EnKVxuXHRcdFx0OiB3aW5kb3cud2dVTFMoJ+aKpeWRiueUqOaIt+e7meeuoeeQhuS6uuWRmCcsICfloLHlkYrkvb/nlKjogIXntabnrqHnkIbkurrlk6EnKTtcblx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRUd2lua2xlLmFydi5jYWxsYmFjayh1c2VybmFtZSwgaXNJUCk7XG5cdFx0XHR9LFxuXHRcdFx0d2luZG93LndnVUxTKCflkYrnirYnLCAn5ZGK54uAJyksXG5cdFx0XHQndHctYXJ2Jyxcblx0XHRcdHRpdGxlXG5cdFx0KTtcblx0fTtcblx0VHdpbmtsZS5hcnYuY2FsbGJhY2sgPSAodWlkLCBpc0lQKSA9PiB7XG5cdFx0aWYgKHVpZCA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+S9oOS4jeaDs+aKpeWRiuS9oOiHquW3se+8jOWvueWQp++8nycsICfkvaDkuI3mg7PloLHlkYrkvaDoh6rlt7HvvIzlsI3lkKfvvJ8nKSwge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjAwLCA1MDApO1xuXHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+aKpeWRiueUqOaIt+e7meeuoeeQhuS6uuWRmCcsICfloLHlkYrkvb/nlKjogIXntabnrqHnkIbkurrlk6EnKSk7XG5cdFx0V2luZG93LnNldFNjcmlwdE5hbWUoJ1R3aW5rbGUnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+WRiueKtuiuvue9ricsICflkYrni4DoqK3lrponKSwgJ0g6VFcvUFJFRiNhcnYnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ1R3aW5rbGXluK7liqknLCAnVHdpbmtsZeiqquaYjicpLCAnSDpUVyPlkYrni4AnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLmFydi5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Y29uc3QgY2F0ZWdvcmllcyA9IGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ2NhdGVnb3J5Jyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAieaLqeaKpeWRiuexu+Wei++8micsICfpgbjmk4floLHlkYrpoZ7liKXvvJonKSxcblx0XHRcdGV2ZW50OiBUd2lua2xlLmFydi5jYWxsYmFjay5jaGFuZ2VDYXRlZ29yeSxcblx0XHR9KTtcblx0XHRjYXRlZ29yaWVzLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+egtOWdj++8iFFXOlZJUO+8iScsICfnoLTlo57vvIhRVzpWSVDvvIknKSxcblx0XHRcdHZhbHVlOiAnYWl2Jyxcblx0XHR9KTtcblx0XHRjYXRlZ29yaWVzLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+e8lui+keS6ieiuru+8iFFXOkVXSVDvvIknLCAn57eo6Lyv54it6K2w77yIUVc6RVdJUO+8iScpLFxuXHRcdFx0dmFsdWU6ICdld2lwJyxcblx0XHR9KTtcblx0XHRjYXRlZ29yaWVzLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+WQje+8iFFXOlVBQe+8iScsICfkvb/nlKjogIXlkI3nqLHvvIhRVzpVQUHvvIknKSxcblx0XHRcdHZhbHVlOiAndXNlcm5hbWUnLFxuXHRcdFx0ZGlzYWJsZWQ6IG13LnV0aWwuaXNJUEFkZHJlc3ModWlkKSxcblx0XHR9KTtcblx0XHRjYXRlZ29yaWVzLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WCgOWEoeiwg+afpe+8iFFXOlNQSe+8iScsICflgoDlhKHoqr/mn6XvvIhRVzpTUEnvvIknKSxcblx0XHRcdHZhbHVlOiAnc3BpJyxcblx0XHRcdGRpc2FibGVkOiBtdy51dGlsLmlzSVBBZGRyZXNzKHVpZCksXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRsYWJlbDogJycsXG5cdFx0XHRzdHlsZTogJ2NvbG9yOiAjZjAwJyxcblx0XHRcdGlkOiAndHdpbmtsZS1hcnYtYmxvY2t3YXJuaW5nJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6ICdXb3JrIGFyZWEnLFxuXHRcdFx0bmFtZTogJ3dvcmtfYXJlYScsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0XHRsYWJlbDogJ+aPkOS6pCcsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2hpZGRlbicsXG5cdFx0XHRuYW1lOiAndWlkJyxcblx0XHRcdHZhbHVlOiB1aWQsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgYmxvY2tlZCwgdXBkYXRlIG5vdGljZVxuXHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0bGlzdDogJ2Jsb2NrcycsXG5cdFx0XHRia3Byb3A6ICdyYW5nZXxmbGFncycsXG5cdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHR9O1xuXHRcdGlmIChpc0lQKSB7XG5cdFx0XHRxdWVyeS5ia2lwID0gdWlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRxdWVyeS5ia3VzZXJzID0gdWlkO1xuXHRcdH1cblx0XHRuZXcgTW9yZWJpdHMud2lraS5hcGkod2luZG93LndnVUxTKCfmo4Dmn6XnlKjmiLfnmoTlsIHnpoHnirbmgIEnLCAn5qqi5p+l5L2/55So6ICF55qE5bCB6Y6W54uA5oWLJyksIHF1ZXJ5LCAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCBibG9ja2xpc3QgPSBhcGlvYmouZ2V0UmVzcG9uc2UoKS5xdWVyeS5ibG9ja3M7XG5cdFx0XHRpZiAoYmxvY2tsaXN0Lmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBbYmxvY2tdID0gYmxvY2tsaXN0O1xuXHRcdFx0XHRsZXQgbWVzc2FnZSA9XG5cdFx0XHRcdFx0KGlzSVAgPyB3aW5kb3cud2dVTFMoJ+atpElQ5Zyw5Z2AJywgJ+atpElQ5L2N5Z2AJykgOiB3aW5kb3cud2dVTFMoJ+atpOi0puWPtycsICfmraTos6zomZ8nKSkgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bey57uP6KKrJywgJ+W3sue2k+iiqycpICtcblx0XHRcdFx0XHQoYmxvY2sucGFydGlhbCA/ICfpg6jliIYnIDogJycpO1xuXHRcdFx0XHQvLyBTdGFydCBhbmQgZW5kIGRpZmZlciwgcmFuZ2UgYmxvY2tlZFxuXHRcdFx0XHRtZXNzYWdlICs9IGJsb2NrLnJhbmdlc3RhcnQgPT09IChibG9jay5yYW5nZWVuZCA/ICfmrrUnIDogJycpICsgd2luZG93LndnVUxTKCflsIHnpoHjgIInLCAn5bCB6Y6W44CCJyk7XG5cdFx0XHRcdGlmIChibG9jay5wYXJ0aWFsKSB7XG5cdFx0XHRcdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtYXJ2LWJsb2Nrd2FybmluZycpLmNzcygnY29sb3InLCAnYmxhY2snKTsgLy8gTGVzcyBzZXZlcmVcblx0XHRcdFx0fVxuXHRcdFx0XHQkYm9keS5maW5kKCcjdHdpbmtsZS1hcnYtYmxvY2t3YXJuaW5nJykudGV4dChtZXNzYWdlKTtcblx0XHRcdH1cblx0XHR9KS5wb3N0KCk7XG5cdFx0Ly8gV2UgbXVzdCBpbml0IHRoZVxuXHRcdGNvbnN0IGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXHRcdGV2dC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdHJlc3VsdC5jYXRlZ29yeS5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cdH07XG5cdFR3aW5rbGUuYXJ2Lmx0YV9saXN0ID0gW1xuXHRcdHtcblx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivt+mAieaLqScsICfoq4vpgbjmk4cnKSxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLmFydi5jYWxsYmFjay5zb2NrbWFzdGVyX2NoYW5nZWQgPSAoZSkgPT4ge1xuXHRcdFR3aW5rbGUuYXJ2LmNhbGxiYWNrLnNldF9zb2NrbWFzdGVyKGUudGFyZ2V0LnZhbHVlKTtcblx0fTtcblx0VHdpbmtsZS5hcnYuY2FsbGJhY2suc2V0X3NvY2ttYXN0ZXIgPSAoc29ja21hc3RlcikgPT4ge1xuXHRcdCRib2R5LmZpbmQoJ2NvZGUudHctYXJ2LXNvY2ttYXN0ZXInKS50ZXh0KCd7eycuY29uY2F0KCdzdWJzdDonLCBgU29ja3N1c3BlY3Rub3RpY2V8MT0ke3NvY2ttYXN0ZXJ9fX1gKSk7XG5cdH07XG5cdFR3aW5rbGUuYXJ2LmNhbGxiYWNrLmNoYW5nZUNhdGVnb3J5ID0gKGUpID0+IHtcblx0XHRjb25zdCB2YWx1ZV8gPSBlLnRhcmdldC52YWx1ZTtcblx0XHRjb25zdCByb290XyA9IGUudGFyZ2V0LmZvcm07XG5cdFx0Y29uc3QgW29sZF9hcmVhXSA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhyb290XywgJ3dvcmtfYXJlYScpO1xuXHRcdGxldCB3b3JrX2FyZWEgPSBudWxsO1xuXHRcdGNvbnN0IHByZXZpZXdsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdHByZXZpZXdsaW5rLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcblx0XHRwcmV2aWV3bGluay50ZXh0Q29udGVudCA9IHdpbmRvdy53Z1VMUygn6aKE6KeIJywgJ+mgkOimvScpO1xuXHRcdCQocHJldmlld2xpbmspLm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFR3aW5rbGUuYXJ2LmNhbGxiYWNrLnByZXZpZXcocm9vdF8pO1xuXHRcdH0pO1xuXHRcdHN3aXRjaCAodmFsdWVfKSB7XG5cdFx0XHRjYXNlICdld2lwJzpcblx0XHRcdFx0d29ya19hcmVhID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aKpeWRiue8lui+keS6ieiuricsICfloLHlkYrnt6jovK/niK3orbAnKSxcblx0XHRcdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkeW5pbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3BhZ2UnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ebuOWFs+mhtemdou+8micsICfnm7jpl5zpoIHpnaLvvJonKSxcblx0XHRcdFx0XHRzdWJsYWJlbDogd2luZG93LndnVUxTKCfpobXpnaLvvJonLCAn6aCB6Z2i77yaJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCflpoLkuI3luIzmnJvorqnmiqXlkYrpk77mjqXliLDpobXpnaLvvIzor7fnlZnnqbonLCAn5aaC5LiN5biM5pyb6K6T5aCx5ZGK6YCj57WQ5Yiw6aCB6Z2i77yM6KuL55WZ56m6JyksXG5cdFx0XHRcdFx0bWluOiAxLFxuXHRcdFx0XHRcdG1heDogMTAsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAndGV4dGFyZWEnLFxuXHRcdFx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivhOiuuu+8micsICfoqZXoq5bvvJonKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGlkOiAnYXJ2cHJldmlldycsXG5cdFx0XHRcdFx0bGFiZWw6IFtwcmV2aWV3bGlua10sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogJ3R3aW5rbGVhcnYtcHJldmlld2JveCcsXG5cdFx0XHRcdFx0c3R5bGU6ICdkaXNwbGF5OiBub25lJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYSA9IHdvcmtfYXJlYS5yZW5kZXIoKTtcblx0XHRcdFx0b2xkX2FyZWEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod29ya19hcmVhLCBvbGRfYXJlYSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcm5hbWUnOlxuXHRcdFx0XHR3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5oql5ZGK5LiN5b2T55So5oi35ZCNJywgJ+WgseWRiuS4jeeVtuS9v+eUqOiAheWQjeeosScpLFxuXHRcdFx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LiN5b2T55So5oi35ZCN57G75Z6LJywgJ+S4jeeVtuS9v+eUqOiAheWQjeeosemhnuWIpScpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmsYLpl7vnmb7np5HkuI3lhYHorrjkvb/nlKjluKbmnInor6/lr7zmgKfjgIHlrqPkvKDmgKfjgIHkvq7ovrHmgKfmiJbnoLTlnY/mgKfnmoTnlKjmiLflkI3jgILmraTlpJbvvIzkvb/nlKjln5/lkI3lj4rpgq7nrrHlnLDlnYDnmoTnlKjmiLflkI3kuqbooqvnpoHmraLjgILov5nkupvlh4bliJnkv7HlupTlupTnlKjoh7PnlKjmiLflkI3lj4rnrb7lkI3jgILlnKjlhbbku5bor63oqIDkuK3kuI3lvZPnmoTnlKjmiLflkI3miJbpgJrov4fplJnmi7zjgIHmm7/ku6PjgIHmmpfnpLrjgIHmi4blrZfmiJbku7vkvZXpl7TmjqXmlrnms5Xovr7miJDnmoTpnZ7lpqXlvZPnlKjmiLflkI3lkIzmoLfop4bkuLrov53op4TjgIInLFxuXHRcdFx0XHRcdFx0J+axguiBnueZvuenkeS4jeWFgeioseS9v+eUqOW4tuacieiqpOWwjuaAp+OAgeWuo+WCs+aAp+OAgeS+rui+seaAp+aIluegtOWjnuaAp+eahOS9v+eUqOiAheWQjeeoseOAguatpOWklu+8jOS9v+eUqOWfn+WQjeWPiumbu+WtkOS/oeeuseS9jeWdgOeahOS9v+eUqOiAheWQjeeoseS6puiiq+emgeatouOAgumAmeS6m+a6luWJh+S/seaHieaHieeUqOiHs+S9v+eUqOiAheWQjeeoseWPiuewveWQjeOAguWcqOWFtuS7luiqnuiogOS4reS4jeeVtueahOS9v+eUqOiAheWQjeeoseaIlumAmumBjumMr+aLvOOAgeabv+S7o+OAgeaal+ekuuOAgeaLhuWtl+aIluS7u+S9lemWk+aOpeaWueazlemBlOaIkOeahOmdnuWmpeeVtuS9v+eUqOiAheWQjeeoseWQjOaoo+imlueCuumBleimj+OAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRuYW1lOiAnYXJ2dHlwZScsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor6/lr7zmgKfnlKjmiLflkI0nLCAn6Kqk5bCO5oCn5L2/55So6ICF5ZCN56ixJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ+ivr+WvvOaApycsICfoqqTlsI7mgKcnKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfor6/lr7zmgKfnlKjmiLflkI3pmpDlkKvnnYDkuI7otKHnjK7ogIXnm7jlhbPmiJbor6/lr7zku5bkurrnmoTkuovmg4XjgILkvovlpoLvuLDkuI3lrp7op4LngrnjgIHmmpfnpLrotKblj7fmi6XmnInnibnlrprmnYPpmZDmiJbmmpfnpLror6XotKblj7flubbpnZ7nlLHkuIDkurrmi6XmnInogIzmmK/nlLHkuIDkuKrnu4TnvqTjgIHkuIDkuKrpobnnm67miJbkuIDkuKrpm4bkvZPov5DkvZzjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfoqqTlsI7mgKfkvb/nlKjogIXlkI3nqLHpmrHlkKvokZfoiIfosqLnjbvogIXnm7jpl5zmiJboqqTlsI7ku5bkurrnmoTkuovmg4XjgILkvovlpoLvuLDkuI3lr6bop4Dpu57jgIHmmpfnpLros6zomZ/mk4HmnInnibnlrprmrIrpmZDmiJbmmpfnpLroqbLos6zomZ/kuKbpnZ7nlLHkuIDkurrmk4HmnInogIzmmK/nlLHkuIDlgIvnvqTntYTjgIHkuIDlgIvoqIjnlavmiJbkuIDlgIvpm4bpq5TpgYvkvZzjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflrqPkvKDmgKfnlKjmiLflkI0nLCAn5a6j5YKz5oCn5L2/55So6ICF5ZCN56ixJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ+Wuo+S8oOaApycsICflrqPlgrPmgKcnKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflrqPkvKDmgKfnlKjmiLflkI3kvJrkuo7msYLpl7vnmb7np5HkuIrotbfmjqjplIDkuIDkuKrnu4TnvqTmiJbkuIDpl7Tlhazlj7jnmoTkvZznlKjjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCflrqPlgrPmgKfkvb/nlKjogIXlkI3nqLHmnIPmlrzmsYLogZ7nmb7np5HkuIrotbfmjqjpirfkuIDlgIvnvqTntYTmiJbkuIDplpPlhazlj7jnmoTkvZznlKjjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmmpfnpLrlubbpnZ7nlLHkuIDkurrmi6XmnIknLCAn5pqX56S65Lim6Z2e55Sx5LiA5Lq65pOB5pyJJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnc2hhcmVkJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmr4/kuKrotKblj7flj6rlj6/ku6Xku6PooajkuKrkurrvvIjlrrnorrjkuIDkupvkvovlpJbmg4XlhrXvvInvvIzmiYDmnInkuI7ku5bkurrliIbkuqvotKblj7fnmoTooYzkuLrvvIjljIXmi6zliIbkuqvotKblj7flr4bnoIHvvInlnYfooqvnpoHmraLjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfmr4/lgIvos6zomZ/lj6rlj6/ku6Xku6PooajlgIvkurrvvIjlrrnoqLHkuIDkupvkvovlpJbmg4Xms4HvvInvvIzmiYDmnInoiIfku5bkurrliIbkuqvos6zomZ/nmoTooYzngrrvvIjljIXmi6zliIbkuqvos6zomZ/lr4bnorzvvInlnYfooqvnpoHmraLjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkvq7ovrHmgKfnlKjmiLflkI0nLCAn5L6u6L6x5oCn5L2/55So6ICF5ZCN56ixJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAn5L6u6L6x5oCnJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfkvq7ovrHmgKfnlKjmiLflkI3ku6TljY/osIPnvJbovpHlj5jlvpflm7Dpmr7vvIznlJroh7Pml6Dlj6/og73jgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfkvq7ovrHmgKfkvb/nlKjogIXlkI3nqLHku6TljZToqr/nt6jovK/ororlvpflm7Dpm6PvvIznlJroh7PnhKHlj6/og73jgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnoLTlnY/mgKfnlKjmiLflkI0nLCAn56C05aOe5oCn5L2/55So6ICF5ZCN56ixJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ+egtOWdj+aApycsICfnoLTlo57mgKcnKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnoLTlnY/mgKfnlKjmiLflkI3ljIXmi6zkurrouqvmlLvlh7vjgIHkvKrlhpLku5bkurrmiJblhbbku5bkuIDliIfmnInnnYDmuIXmmbDlj6/op4HnmoTnoLTlnY/msYLpl7vnmb7np5HmhI/lm77nmoTnlKjmiLflkI3jgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfnoLTlo57mgKfkvb/nlKjogIXlkI3nqLHljIXmi6zkurrouqvmlLvmk4rjgIHlgb3lhpLku5bkurrmiJblhbbku5bkuIDliIfmnInokZfmuIXmmbDlj6/opovnmoTnoLTlo57msYLogZ7nmb7np5HmhI/lnJbnmoTkvb/nlKjogIXlkI3nqLHjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Zyo6aG16Z2i5LiK6ZqQ6JeP55So5oi35ZCN77yI6ZyA55uR552j55qE55So5oi35ZCN6K+35Yu/5LqO56uZ5YaF5oql5ZGK77yM5Yu+6YCJ5q2k6aG55bm25LiN5p6E5oiQ6IO95Zyo56uZ5YaF5oql5ZGK55qE55CG55Sx77yJJyxcblx0XHRcdFx0XHRcdFx0XHQn5Zyo6aCB6Z2i5LiK6Zqx6JeP5L2/55So6ICF5ZCN56ix77yI6ZyA55uj552j55qE5L2/55So6ICF5ZCN56ix6KuL5Yu/5pa856uZ5YWn5aCx5ZGK77yM5Yu+6YG45q2k6aCF5Lim5LiN5qeL5oiQ6IO95Zyo56uZ5YWn5aCx5ZGK55qE55CG55Sx77yJJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+iLpeeUqOaIt+WQjeS4jeW9k+ivt+WLvumAieatpOmhue+8jOazqOaEj++8muivt+iAg+iZkeengeS4i+iBlOezu+euoeeQhuWRmOWkhOeQhuOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+iLpeS9v+eUqOiAheWQjeeoseS4jeeVtuiri+WLvumBuOatpOmghe+8jOazqOaEj++8muiri+iAg+aFruengeS4i+iBr+e1oeeuoeeQhuWToeiZleeQhuOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2hpZGVuYW1lJyxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdoaWRlbmFtZScsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0c3R5bGU6ICdmb250LXdlaWdodDogYm9sZDsnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor4TorrrvvJonLCAn6KmV6KuW77yaJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogJ2FydnByZXZpZXcnLFxuXHRcdFx0XHRcdGxhYmVsOiBbcHJldmlld2xpbmtdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0d2lua2xlYXJ2LXByZXZpZXdib3gnLFxuXHRcdFx0XHRcdHN0eWxlOiAnZGlzcGxheTogbm9uZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEgPSB3b3JrX2FyZWEucmVuZGVyKCk7XG5cdFx0XHRcdG9sZF9hcmVhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdvcmtfYXJlYSwgb2xkX2FyZWEpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NwaSc6XG5cdFx0XHRcdHdvcmtfYXJlYSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj5HotbflgoDlhKHosIPmn6UnLCAn55m86LW35YKA5YSh6Kq/5p+lJyksXG5cdFx0XHRcdFx0bmFtZTogJ3dvcmtfYXJlYScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdzb2NrbWFzdGVyJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+S4u+i0puWPt+eahOeUqOaIt+WQje+8iOS4jeWQq1VzZXI65YmN57yA77yJJywgJ+S4u+izrOiZn+eahOS9v+eUqOiAheWQjeeose+8iOS4jeWQq1VzZXI65a2X6aaW77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6IHJvb3RfLnVpZC52YWx1ZSxcblx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5hcnYuY2FsbGJhY2suc29ja21hc3Rlcl9jaGFuZ2VkLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0d2lua2xlYXJ2LXNwaW5vdGljZWJveCcsXG5cdFx0XHRcdFx0c3R5bGU6ICdkaXNwbGF5OiBub25lJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkeW5pbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NvY2twdXBwZXQnLFxuXHRcdFx0XHRcdGxhYmVsOiAn5YKA5YShJyxcblx0XHRcdFx0XHRzdWJsYWJlbDogJ+WCgOWEoe+8micsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCflgoDlhKHnmoTnlKjmiLflkI3vvIjkuI3lkKtVc2VyOuWJjee8gO+8iScsICflgoDlhKHnmoTkvb/nlKjogIXlkI3nqLHvvIjkuI3lkKtVc2VyOuWtl+mmlu+8iScpLFxuXHRcdFx0XHRcdG1pbjogMixcblx0XHRcdFx0XHRtYXg6IDksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAndGV4dGFyZWEnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivgeaNru+8micsICforYnmk5rvvJonKSxcblx0XHRcdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6L6T5YWl6IO95aSf55So5p2l5L2T546w6L+Z5Lqb55So5oi35Y+v6IO95rul55So5aSa6YeN6LSm5Y+355qE6K+B5o2u77yM6L+Z6YCa5bi45YyF5ous6Iy26aaG5Y+R6KiA44CB6aG16Z2i5Y6G5Y+y5oiW5YW25LuW5pyJ5YWz55qE5L+h5oGv44CC6K+36YG/5YWN5Zyo5q2k5aSE5o+Q5L6b6Z2e5LiO5YKA5YSh5oiW5rul55So5aSa6YeN6LSm5Y+355u45YWz55qE5YW25LuW6K6o6K6644CCJyxcblx0XHRcdFx0XHRcdCfovLjlhaXog73lpKDnlKjkvobpq5Tnj77pgJnkupvkvb/nlKjogIXlj6/og73mv6vnlKjlpJrph43os6zomZ/nmoTorYnmk5rvvIzpgJnpgJrluLjljIXmi6zojLbppKjnmbzoqIDjgIHpoIHpnaLmrbflj7LmiJblhbbku5bmnInpl5znmoTos4foqIrjgILoq4vpgb/lhY3lnKjmraTomZXmj5DkvpvpnZ7oiIflgoDlhKHmiJbmv6vnlKjlpJrph43os6zomZ/nm7jpl5znmoTlhbbku5boqI7oq5bjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fmsYLnlKjmiLfmn6XmoLgnLCAn6KuL5rGC5L2/55So6ICF5p+l5qC4JyksXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdjaGVja3VzZXInLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+eUqOaIt+afpeaguOaYr+S4gOenjeeUqOS6juiOt+WPluWCgOWEoeaMh+aOp+ebuOWFs+aKgOacr+ivgeaNrueahOW3peWFt++8jOiLpeayoeacieato+W9k+eQhueUseWImeS4jeS8muS9v+eUqO+8jOaCqOW/hemhu+WcqOivgeaNruWtl+auteWFheWIhuino+mHiuS4uuS7gOS5iOmcgOimgeS9v+eUqOivpeW3peWFt+OAgueUqOaIt+afpeaguOS4jeS8mueUqOS6juWFrOW8gOi/nuaOpeeUqOaIt+i0puWPt+S9v+eUqOeahElQ5Zyw5Z2A44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5L2/55So6ICF5p+l5qC45piv5LiA56iu55So5pa8542y5Y+W5YKA5YSh5oyH5o6n55u46Zec5oqA6KGT6K2J5pOa55qE5bel5YW377yM6Iul5rKS5pyJ5q2j55W255CG55Sx5YmH5LiN5pyD5L2/55So77yM5oKo5b+F6aCI5Zyo6K2J5pOa5qyE5L2N5YWF5YiG6Kej6YeL54K65LuA6bq86ZyA6KaB5L2/55So6Kmy5bel5YW344CC5L2/55So6ICF5p+l5qC45LiN5pyD55So5pa85YWs6ZaL6YCj5o6l5L2/55So6ICF6LOs6Jmf5L2/55So55qESVDkvY3lnYDjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogJ2FydnByZXZpZXcnLFxuXHRcdFx0XHRcdGxhYmVsOiBbcHJldmlld2xpbmtdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0d2lua2xlYXJ2LXByZXZpZXdib3gnLFxuXHRcdFx0XHRcdHN0eWxlOiAnZGlzcGxheTogbm9uZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRsYWJlbDogW1xuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfor7fkvb/nlKjluLjor4blhrPlrprmmK/lkKbku6UnLCAn6KuL5L2/55So5bi46K2Y5rG65a6a5piv5ZCm5LulJyksXG5cdFx0XHRcdFx0XHQkKCc8Y29kZT4nKS5hZGRDbGFzcygndHctYXJ2LXNvY2ttYXN0ZXInKS5jc3MoJ21hcmdpbicsICcycHg7JylbMF0sXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCfpgJrnn6XnlKjmiLfjgILov5nkuI3mmK/lv4XpobvnmoTvvIzlr7nkuo7mtonlj4rmlrDnlKjmiLfnmoTmiqXlkYrogIzoqIDvvIzpgJrnn6Xku5bku6zog73orqnmiqXlkYrmmL7lvpfmm7TlhazlubPvvIzkvYbmmK/orrjlpJrmg4XlhrXkuIvvvIjlpoLplb/mnJ/noLTlnY/ogIXvvInpgJrnn6Xmm7Tlj6/og73pgILlvpflhbblj43jgIInLFxuXHRcdFx0XHRcdFx0XHQn6YCa55+l5L2/55So6ICF44CC6YCZ5LiN5piv5b+F6aCI55qE77yM5bCN5pa85raJ5Y+K5paw5L2/55So6ICF55qE5aCx5ZGK6ICM6KiA77yM6YCa55+l5LuW5YCR6IO96K6T5aCx5ZGK6aGv5b6X5pu05YWs5bmz77yM5L2G5piv6Kix5aSa5oOF5rOB5LiL77yI5aaC6ZW35pyf56C05aOe6ICF77yJ6YCa55+l5pu05Y+v6IO96YGp5b6X5YW25Y+N44CCJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhID0gd29ya19hcmVhLnJlbmRlcigpO1xuXHRcdFx0XHQkKCdpbnB1dDp0ZXh0W25hbWU9c29ja3B1cHBldF0nLCB3b3JrX2FyZWEpLmZpcnN0KCkudmFsKHJvb3RfLnVpZC52YWx1ZSk7XG5cdFx0XHRcdG9sZF9hcmVhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdvcmtfYXJlYSwgb2xkX2FyZWEpO1xuXHRcdFx0XHRyb290Xy5zcGlub3RpY2VwcmV2aWV3ZXIgPSBuZXcgTW9yZWJpdHMud2lraS5wcmV2aWV3KFxuXHRcdFx0XHRcdCQod29ya19hcmVhKS5maW5kKCcjdHdpbmtsZWFydi1zcGlub3RpY2Vib3gnKS5sYXN0KClbMF1cblx0XHRcdFx0KTtcblx0XHRcdFx0VHdpbmtsZS5hcnYuY2FsbGJhY2suc2V0X3NvY2ttYXN0ZXIocm9vdF8udWlkLnZhbHVlKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdC8qIGNhc2UgJ2Fpdic6ICovXG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5oql5ZGK55So5oi356C05Z2PJywgJ+WgseWRiuS9v+eUqOiAheegtOWjnicpLFxuXHRcdFx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmj5DmiqXlgoDlhKHlupTkvJjlhYjlj5HpgIHoh7PlgoDlhKHosIPmn6XvvIzpmaTpnZ7nm7jlhbPnmoTotKblj7fmnInpq5jpopHnjofjgIHmtonlj4rlpJrkuKrpobXpnaLnrYnntKfmgKXkuKXph43nmoTnoLTlnY/ooYzkuLrjgIInLFxuXHRcdFx0XHRcdFx0J+aPkOWgseWCgOWEoeaHieWEquWFiOeZvOmAgeiHs+WCgOWEoeiqv+afpe+8jOmZpOmdnuebuOmXnOeahOizrOiZn+aciemrmOmgu+eOh+OAgea2ieWPiuWkmuWAi+mggemdouetiee3iuaApeWatOmHjeeahOegtOWjnuihjOeCuuOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAncGFnZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55u45YWz6aG16Z2i77yaJywgJ+ebuOmXnOmggemdou+8micpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5aaC5LiN5biM5pyb6K6p5oql5ZGK6ZO+5o6l5Yiw6aG16Z2i77yM6K+355WZ56m6JywgJ+WmguS4jeW4jOacm+iuk+WgseWRiumAo+e1kOWIsOmggemdou+8jOiri+eVmeepuicpLFxuXHRcdFx0XHRcdHZhbHVlOiBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ZhbmFydGljbGUnKSB8fCAnJyxcblx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCB7dmFsdWV9ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRcdFx0Y29uc3Qgcm9vdCA9IGV2ZW50LnRhcmdldC5mb3JtO1xuXHRcdFx0XHRcdFx0aWYgKHZhbHVlID09PSAnJykge1xuXHRcdFx0XHRcdFx0XHRyb290LmJhZGlkLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0cm9vdC5nb29kaWQuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cm9vdC5iYWRpZC5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRyb290Lmdvb2RpZC5kaXNhYmxlZCA9IHJvb3QuYmFkaWQudmFsdWUgPT09ICcnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdiYWRpZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y+X5Yiw56C05Z2P55qE5L+u6K6i54mI5pys77yaJywgJ+WPl+WIsOegtOWjnueahOS/ruiogueJiOacrO+8micpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn55WZ56m65Lul55Wl6L+H5beu5byCJywgJ+eVmeepuuS7peeVpemBjuW3rueVsCcpLFxuXHRcdFx0XHRcdHZhbHVlOiBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ZhbmFydGljbGVyZXZpZCcpIHx8ICcnLFxuXHRcdFx0XHRcdGRpc2FibGVkOiAhbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlJyksXG5cdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qge3ZhbHVlfSA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0XHRcdGNvbnN0IHJvb3QgPSBldmVudC50YXJnZXQuZm9ybTtcblx0XHRcdFx0XHRcdHJvb3QuZ29vZGlkLmRpc2FibGVkID0gdmFsdWUgPT09ICcnO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdnb29kaWQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+egtOWdj+WJjeeahOS/ruiuoueJiOacrO+8micsICfnoLTlo57liY3nmoTkv67oqILniYjmnKzvvJonKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+eVmeepuuS7peeVpei/h+W3ruW8gueahOi+g+aXqeeJiOacrCcsICfnlZnnqbrku6XnlaXpgY7lt67nlbDnmoTovIPml6nniYjmnKwnKSxcblx0XHRcdFx0XHR2YWx1ZTogbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlZ29vZHJldmlkJykgfHwgJycsXG5cdFx0XHRcdFx0ZGlzYWJsZWQ6ICFtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ZhbmFydGljbGUnKSB8fCBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ZhbmFydGljbGVyZXZpZCcpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRuYW1lOiAnYXJ2dHlwZScsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflt7Llj5Hlh7rmnIDlkI7orablkYonLCAn5bey55m85Ye65pyA5b6M6K2m5ZGKJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnZmluYWwnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCB56aB6L+H5pyf5ZCO6ZqP5Y2z56C05Z2PJywgJ+WwgemOlumBjuacn+W+jOmaqOWNs+egtOWjnicpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3Bvc3RibG9jaycsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmmL7ogIzmmJPop4HnmoTnuq/noLTlnY/nlKjmiLcnLCAn6aGv6ICM5piT6KaL55qE57SU56C05aOe5L2/55So6ICFJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAndmFuZGFsb25seScsXG5cdFx0XHRcdFx0XHRcdGRpc2FibGVkOiBtdy51dGlsLmlzSVBBZGRyZXNzKHJvb3RfLnVpZC52YWx1ZSksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmmL7ogIzmmJPop4HnmoRzcGFtYm905oiW5aSx56qD6LSm5Y+3JywgJ+mhr+iAjOaYk+imi+eahHNwYW1ib3TmiJblpLHnq4ros6zomZ8nKSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdzcGFtYm90Jyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7heeUqOadpeaVo+WPkeW5v+WRiuWuo+S8oOeahOeUqOaItycsICflg4XnlKjkvobmlaPnmbzlu6PlkYrlrqPlgrPnmoTkvb/nlKjogIUnKSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdwcm9tb29ubHknLFxuXHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogbXcudXRpbC5pc0lQQWRkcmVzcyhyb290Xy51aWQudmFsdWUpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFtdy51dGlsLmlzSVBBZGRyZXNzKG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpKSkge1xuXHRcdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOmhtemdouS4iuWPiue8lui+keaRmOimgemakOiXj+eUqOaIt+WQjScsICflnKjpoIHpnaLkuIrlj4rnt6jovK/mkZjopoHpmrHol4/kvb/nlKjogIXlkI3nqLEnKSxcblx0XHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn6Iul55So5oi35ZCN5LiN5b2T6K+35Yu+6YCJ5q2k6aG577yM5rOo5oSP77ya6K+36ICD6JmR56eB5LiL6IGU57O7566h55CG5ZGY5aSE55CG44CCJyxcblx0XHRcdFx0XHRcdFx0XHRcdCfoi6Xkvb/nlKjogIXlkI3nqLHkuI3nlbboq4vli77pgbjmraTpoIXvvIzms6jmhI/vvJroq4vogIPmha7np4HkuIvoga/ntaHnrqHnkIblk6HomZXnkIbjgIInXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnaGlkZW5hbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnaGlkZW5hbWUnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAndGV4dGFyZWEnLFxuXHRcdFx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivhOiuuu+8micsICfoqZXoq5bvvJonKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGlkOiAnYXJ2cHJldmlldycsXG5cdFx0XHRcdFx0bGFiZWw6IFtwcmV2aWV3bGlua10sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogJ3R3aW5rbGVhcnYtcHJldmlld2JveCcsXG5cdFx0XHRcdFx0c3R5bGU6ICdkaXNwbGF5OiBub25lJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYSA9IHdvcmtfYXJlYS5yZW5kZXIoKTtcblx0XHRcdFx0b2xkX2FyZWEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod29ya19hcmVhLCBvbGRfYXJlYSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRyb290Xy5wcmV2aWV3ZXIgPSBuZXcgTW9yZWJpdHMud2lraS5wcmV2aWV3KCQod29ya19hcmVhKS5maW5kKCcjdHdpbmtsZWFydi1wcmV2aWV3Ym94JykubGFzdCgpWzBdKTtcblx0fTtcblx0VHdpbmtsZS5hcnYuY2FsbGJhY2sucHJldmlldyA9IChmb3JtKSA9PiB7XG5cdFx0Y29uc3QgcmVhc29uID0gVHdpbmtsZS5hcnYuY2FsbGJhY2suZ2V0UmVwb3J0V2lraXRleHQoZm9ybSk7XG5cdFx0aWYgKHJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGlucHV0ID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldElucHV0RGF0YShmb3JtKTtcblx0XHRsZXQgdGl0bGU7XG5cdFx0c3dpdGNoIChpbnB1dC5jYXRlZ29yeSkge1xuXHRcdFx0Y2FzZSAndmlwJzpcblx0XHRcdFx0dGl0bGUgPSAnUWl1d2VuX3RhbGs65oql5ZGK5b2T5YmN56C05Z2PJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdld2lwJzpcblx0XHRcdFx0dGl0bGUgPSAnUWl1d2VuX3RhbGs6566h55CG5ZGY5ZGK56S65p2/Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VybmFtZSc6XG5cdFx0XHRcdHRpdGxlID0gJ1FpdXdlbl90YWxrOueuoeeQhuWRmOWRiuekuuadvyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc3BpJzpcblx0XHRcdFx0dGl0bGUgPSAnUWl1d2VuX3RhbGs6566h55CG5ZGY5ZGK56S65p2/Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aXRsZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGZvcm0ucHJldmlld2VyLmJlZ2luUmVuZGVyKGBfX05PVE9DX18ke3JlYXNvblswXX1gLCB0aXRsZSk7XG5cdH07XG5cdFR3aW5rbGUuYXJ2LmNhbGxiYWNrLmdldFJlcG9ydFdpa2l0ZXh0ID0gKGZvcm0pID0+IHtcblx0XHRjb25zdCBpbnB1dCA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZm9ybSk7XG5cdFx0bGV0IHJlYXNvbiA9ICcnO1xuXHRcdGxldCBjb21tZW50ID0gJyc7XG5cdFx0Y29uc3Qge3VpZH0gPSBpbnB1dDtcblx0XHRjb25zdCBjaGVja1RpdGxlID0gKHRpdGxlLCByZXZpZCkgPT4ge1xuXHRcdFx0aWYgKC9odHRwcz86XFwvXFwvLy50ZXN0KHRpdGxlKSkge1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+mhtemdouWQjeensOS4jeiDveS9v+eUqOe9keWdgOOAgicsICfpoIHpnaLlkI3nqLHkuI3og73kvb/nlKjntrLlnYDjgIInKSwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYXJ2Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGxldCBwYWdlXztcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHBhZ2VfID0gbmV3IG13LlRpdGxlKHRpdGxlKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeShcblx0XHRcdFx0XHRgJHtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn4oCcJywgJ+OAjCcpICtcblx0XHRcdFx0XHRcdHRpdGxlICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+KAneS4jeaYr+S4gOS4quacieaViOeahOmhtemdouWQjeensO+8jOWmguimgeS9v+eUqOW3ruW8gumTvuaOpeivt+aUvuWcqOKAnOivhOiuuuKAnScsXG5cdFx0XHRcdFx0XHRcdCfjgI3kuI3mmK/kuIDlgIvmnInmlYjnmoTpoIHpnaLlkI3nqLHvvIzlpoLopoHkvb/nlKjlt67nlbDpgKPntZDoq4vmlL7lnKjjgIzoqZXoq5bjgI0nXG5cdFx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdChyZXZpZCA/IHdpbmRvdy53Z1VMUygn77yM5oiW5q2j56Gu6L6T5YWl4oCc5L+u6K6i54mI5pys4oCdJywgJ++8jOaIluato+eiuui8uOWFpeOAjOS/ruiogueJiOacrOOAjScpIDogJycpXG5cdFx0XHRcdFx0feOAgmAsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZWFydicsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFnZV8ubmFtZXNwYWNlID09PSAtMSkge1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeShcblx0XHRcdFx0XHRgJHtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn4oCcJywgJ+OAjCcpICtcblx0XHRcdFx0XHRcdHRpdGxlICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+KAneWxnuS6jueJueauiumhtemdou+8jOWmguimgeS9v+eUqOW3ruW8gumTvuaOpeivt+aUvuWcqOKAnOivhOiuuuKAnScsXG5cdFx0XHRcdFx0XHRcdCfjgI3lsazmlrznibnmrorpoIHpnaLvvIzlpoLopoHkvb/nlKjlt67nlbDpgKPntZDoq4vmlL7lnKjjgIzoqZXoq5bjgI0nXG5cdFx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdChyZXZpZCA/IHdpbmRvdy53Z1VMUygn77yM5oiW5q2j56Gu6L6T5YWl4oCc5L+u6K6i54mI5pys4oCdJywgJ++8jOaIluato+eiuui8uOWFpeOAjOS/ruiogueJiOacrOOAjScpIDogJycpXG5cdFx0XHRcdFx0feOAgmAsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZWFydicsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcGFnZV87XG5cdFx0fTtcblx0XHRsZXQgcGFnZTtcblx0XHRzd2l0Y2ggKGlucHV0LmNhdGVnb3J5KSB7XG5cdFx0XHQvLyBSZXBvcnQgM1JSXG5cdFx0XHRjYXNlICdld2lwJzoge1xuXHRcdFx0XHRpZiAoaW5wdXQucmVhc29uID09PSAnJykge1xuXHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5oKo5b+F6aG75oyH5a6a55CG55SxJywgJ+aCqOW/hemgiOaMh+WumueQhueUsScpLCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYXJ2Jyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVhc29uICs9IGA9PSDnvJbovpHmiJjkuL7miqXvvIgke3VpZH3vvIkgPT1cXG5gO1xuXHRcdFx0XHRyZWFzb24gKz0gYCogJycne3t2YW5kYWx8JHsvWz1dLy50ZXN0KHVpZCkgPyAnMT0nIDogJyd9JHt1aWR9fX0nJydcXG5gO1xuXHRcdFx0XHRjb25zdCBwYWdlcyA9ICQoJ2lucHV0OnRleHRbbmFtZT1wYWdlXScsIGZvcm0pLm1hcCgobywgZSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAkKGUpLnZhbCgpIHx8IG51bGw7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHBhZ2VfIG9mIHBhZ2VzKSB7XG5cdFx0XHRcdFx0cGFnZSA9IGNoZWNrVGl0bGUocGFnZV8sIGZhbHNlKTtcblx0XHRcdFx0XHRpZiAoIXBhZ2UpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29tbWVudCArPSBgKiB7e3BhZ2VsaW5rc3wke1xuXHRcdFx0XHRcdFx0cGFnZS5nZXRQcmVmaXhlZFRleHQoKS5pbmNsdWRlcygnPScpID8gJzE9JyA6ICcnXG5cdFx0XHRcdFx0fSR7cGFnZS5nZXRQcmVmaXhlZFRleHQoKX19fVxcbmA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5wdXQucmVhc29uID0gaW5wdXQucmVhc29uLnJlcGxhY2UoL1xcblxcbisvZywgJ1xcbicpO1xuXHRcdFx0XHRpbnB1dC5yZWFzb24gPSBpbnB1dC5yZWFzb24ucmVwbGFjZSgvXFxyP1xcbi9nLCAnXFxuKjonKTsgLy8gaW5kZW50IG5ld2xpbmVzXG5cdFx0XHRcdGNvbW1lbnQgKz0gYCogJHtpbnB1dC5yZWFzb259XFxuYDtcblx0XHRcdFx0Y29tbWVudCA9IGNvbW1lbnQudHJpbSgpO1xuXHRcdFx0XHRjb21tZW50ID0gTW9yZWJpdHMuc3RyaW5nLmFwcGVuZFB1bmN0dWF0aW9uKGNvbW1lbnQpO1xuXHRcdFx0XHRyZWFzb24gKz0gYCR7Y29tbWVudH1cXG4qIOaPkOaKpeS6uu+8mn5+YC5jb25jYXQoJ35+XFxuKiDlpITnkIbvvJonKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyBSZXBvcnQgaW5hcHByb3ByaWF0ZSB1c2VybmFtZVxuXHRcdFx0Y2FzZSAndXNlcm5hbWUnOiB7XG5cdFx0XHRcdGxldCB0eXBlcyA9IGlucHV0LmFydnR5cGUubWFwKE1vcmViaXRzLnN0cmluZy50b0xvd2VyQ2FzZUZpcnN0Q2hhcik7XG5cdFx0XHRcdGNvbnN0IGhhc1NoYXJlZCA9IHR5cGVzLmluY2x1ZGVzKCdzaGFyZWQnKTtcblx0XHRcdFx0aWYgKGhhc1NoYXJlZCkge1xuXHRcdFx0XHRcdHR5cGVzLnNwbGljZSh0eXBlcy5pbmRleE9mKCdzaGFyZWQnKSwgMSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR5cGVzLmluY2x1ZGVzKCfkvq7ovrHmgKcnKSAmJlxuXHRcdFx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Lil6YeN55qE5L6u6L6x5oCn55So5oi35ZCN5ZKM6ZKI5a+554m55a6a5Liq5Lq655qE5L6u6L6x5oCn55So5oi35ZCN5LiN5bqU5Zyo5YWs5byA6aG16Z2i5oql5ZGK77yM6ICM5piv5bqU5b2T56eB5LiL6IGU57O755uR552j5ZGY5aSE55CG44CC5piv5ZCm57un57ut77yfJyxcblx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muWatOmHjeeahOS+rui+seaAp+S9v+eUqOiAheWQjeeoseWSjOmHneWwjeeJueWumuWAi+S6uueahOS+rui+seaAp+S9v+eUqOiAheWQjeeoseS4jeaHieWcqOWFrOmWi+mggemdouWgseWRiu+8jOiAjOaYr+aHieeVtuengeS4i+iBr+e1oeebo+edo+WToeiZleeQhuOAguaYr+WQpue5vOe6jO+8nydcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZXMubGVuZ3RoIDw9IDIpIHtcblx0XHRcdFx0XHR0eXBlcyA9IHR5cGVzLmpvaW4oJ+WSjCcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHR5cGVzID0gW3R5cGVzLnNsaWNlKDAsIC0xKS5qb2luKCfjgIEnKSwgdHlwZXMuc2xpY2UoLTEpXS5qb2luKCflkownKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21tZW50ICs9IGAqe3t1c2VyLXVhYXwxPSR7dWlkfWA7XG5cdFx0XHRcdGlmIChpbnB1dC5oaWRlbmFtZSkge1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gJ3xoaWRlbmFtZT0xJztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21tZW50ICs9ICd9fSAmbmRhc2g7ICc7XG5cdFx0XHRcdGlmICh0eXBlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb21tZW50ICs9IHR5cGVzICsgd2luZG93LndnVUxTKCfnlKjmiLflkI0nLCAn5L2/55So6ICF5ZCN56ixJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVzLmxlbmd0aCAmJiBoYXNTaGFyZWQpIHtcblx0XHRcdFx0XHRjb21tZW50ICs9ICfvvIwnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChoYXNTaGFyZWQpIHtcblx0XHRcdFx0XHRjb21tZW50ICs9IHdpbmRvdy53Z1VMUygn5pqX56S66K+l6LSm5Y+35bm26Z2e55Sx5LiA5Lq65oul5pyJJywgJ+aal+ekuuipsuizrOiZn+S4pumdnueUseS4gOS6uuaTgeaciScpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlcy5sZW5ndGggfHwgaGFzU2hhcmVkKSB7XG5cdFx0XHRcdFx0Y29tbWVudCArPSAn44CCJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaW5wdXQucmVhc29uKSB7XG5cdFx0XHRcdFx0Y29tbWVudCArPSBNb3JlYml0cy5zdHJpbmcudG9VcHBlckNhc2VGaXJzdENoYXIoaW5wdXQucmVhc29uKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21tZW50ID0gTW9yZWJpdHMuc3RyaW5nLmFwcGVuZFB1bmN0dWF0aW9uKGNvbW1lbnQpO1xuXHRcdFx0XHRjb21tZW50ICs9ICctLX5+Jy5jb25jYXQoJ35+Jyk7XG5cdFx0XHRcdGNvbW1lbnQgPSBjb21tZW50LnJlcGxhY2UoL1xccj9cXG4vZywgJ1xcbio6Jyk7IC8vIGluZGVudCBuZXdsaW5lc1xuXHRcdFx0XHRyZWFzb24gPSBgPT0g5LiN5b2T55So5oi35ZCN5oql5ZGK77yIJHtcblx0XHRcdFx0XHRpbnB1dC5oaWRlbmFtZSA/IHdpbmRvdy53Z1VMUygn5bey6ZqQ6JeP55So5oi35ZCNJywgJ+W3sumaseiXj+S9v+eUqOiAheWQjeeosScpIDogdWlkXG5cdFx0XHRcdH3vvIkgPT1cXG5gO1xuXHRcdFx0XHRyZWFzb24gKz0gY29tbWVudDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyBRVzpTUElcblx0XHRcdGNhc2UgJ3NwaSc6IHtcblx0XHRcdFx0aWYgKCFpbnB1dC5yZWFzb24pIHtcblx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+i+k+WFpeivgeaNruOAgicsICfoq4vovLjlhaXorYnmk5rjgIInKSwge1xuXHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZWFydicsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNvY2twdXBwZXRzID0gTW9yZWJpdHMuYXJyYXkudW5pcShcblx0XHRcdFx0XHRbLi4uJCgnaW5wdXQ6dGV4dFtuYW1lPXNvY2twdXBwZXRdJywgZm9ybSldLm1hcCgobykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuICQobykudmFsKCkudHJpbSgpIHx8IG51bGw7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKCFzb2NrcHVwcGV0c1swXSkge1xuXHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5oKo5rKh5pyJ5oyH5a6a5Lu75L2V5YKA5YSh44CCJywgJ+aCqOaykuacieaMh+WumuS7u+S9leWCgOWEoeOAgicpLCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYXJ2Jyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29tbWVudCArPSAne3snLmNvbmNhdCgnc3Vic3Q6JywgJ1NQSSByZXBvcnR8Jyk7XG5cdFx0XHRcdGlmICghc29ja3B1cHBldHMuaW5jbHVkZXMoaW5wdXQuc29ja21hc3RlcikpIHtcblx0XHRcdFx0XHRjb21tZW50ICs9ICcxPXt7Jy5jb25jYXQoXG5cdFx0XHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0XHRcdCcjaWZleGlzdDp7eycsXG5cdFx0XHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0XHRcdGBGVUxMUEFHRU5BTUV9fXx8JHtpbnB1dC5zb2NrbWFzdGVyfX19fGBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbW1lbnQgKz0gYCR7c29ja3B1cHBldHNcblx0XHRcdFx0XHQubWFwKChzb2NrLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGAke2luZGV4ICsgMn09JHtzb2NrfWA7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuam9pbignfCcpfVxcbnxldmlkZW5jZT0ke01vcmViaXRzLnN0cmluZy5hcHBlbmRQdW5jdHVhdGlvbihpbnB1dC5yZWFzb24pfVxcbmA7XG5cdFx0XHRcdGlmIChpbnB1dC5jaGVja3VzZXIpIHtcblx0XHRcdFx0XHRjb21tZW50ICs9ICd8Y2hlY2t1c2VyPXllcyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29tbWVudCArPSAnfX0nO1xuXHRcdFx0XHRyZWFzb24gPSBjb21tZW50O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVwb3J0IHVzZXIgZm9yIHZhbmRhbGlzbVxuXHRcdFx0LyogY2FzZSAnYWl2JzogKi9cblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0aWYgKCFpbnB1dC5hcnZ0eXBlLmxlbmd0aCAmJiBpbnB1dC5yZWFzb24gPT09ICcnKSB7XG5cdFx0XHRcdFx0dm9pZCBtdy5ub3RpZnkod2luZG93LndnVUxTKCfmgqjlv4XpobvmjIflrprnkIbnlLEnLCAn5oKo5b+F6aCI5oyH5a6a55CG55SxJyksIHtcblx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZWFzb24gKz0gYD09ICR7aW5wdXQuaGlkZW5hbWUgPyB3aW5kb3cud2dVTFMoJ+W3sumakOiXj+eUqOaIt+WQjScsICflt7LpmrHol4/kvb/nlKjogIXlkI3nqLEnKSA6IHVpZH0gPT1cXG5gO1xuXHRcdFx0XHRyZWFzb24gKz0gYCogJycne3t2YW5kYWx8JHsvWz1dLy50ZXN0KHVpZCkgPyAnMT0nIDogJyd9JHt1aWR9YDtcblx0XHRcdFx0aWYgKGlucHV0LmhpZGVuYW1lKSB7XG5cdFx0XHRcdFx0cmVhc29uICs9ICd8aGlkZW5hbWU9MSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVhc29uICs9IFwifX0nJydcXG5cIjtcblx0XHRcdFx0Y29uc3QgdHlwZXMgPSBpbnB1dC5hcnZ0eXBlXG5cdFx0XHRcdFx0Lm1hcCgodikgPT4ge1xuXHRcdFx0XHRcdFx0c3dpdGNoICh2KSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2ZpbmFsJzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gJ+W3suWPkeWHuuacgOWQjuitpuWRiic7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3Bvc3RibG9jayc6XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuICflsIHnpoHov4fmnJ/lkI7pmo/ljbPnoLTlnY8nO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdzcGFtYm90Jzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gJ+aYvuiAjOaYk+ingeeahHNwYW1ib3TmiJblpLHnqoPotKblj7cnO1xuXHRcdFx0XHRcdFx0XHRjYXNlICd2YW5kYWxvbmx5Jzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gJ+aYvuiAjOaYk+ingeeahOe6r+egtOWdj+eUqOaItyc7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3Byb21vb25seSc6XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuICfku4XnlKjmnaXmlaPlj5Hlub/lkYrlrqPkvKDnmoTnlKjmiLcnO1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAn5pyq55+l55CG55SxJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKCfvvIwnKTtcblx0XHRcdFx0aWYgKGlucHV0LnBhZ2UgIT09ICcnKSB7XG5cdFx0XHRcdFx0cGFnZSA9IGNoZWNrVGl0bGUoaW5wdXQucGFnZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCFwYWdlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbW1lbnQgKz0gYCoge3twYWdlbGlua3N8JHtcblx0XHRcdFx0XHRcdHBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCkuaW5jbHVkZXMoJz0nKSA/ICcxPScgOiAnJ1xuXHRcdFx0XHRcdH0ke3BhZ2UuZ2V0UHJlZml4ZWRUZXh0KCl9fX1gO1xuXHRcdFx0XHRcdGlmIChpbnB1dC5iYWRpZCkge1xuXHRcdFx0XHRcdFx0Y29tbWVudCArPSBg77yIe3tkaWZmfCR7cGFnZS5nZXRQcmVmaXhlZFRleHQoKX18JHtpbnB1dC5iYWRpZH18JHtpbnB1dC5nb29kaWQgPz8gJyd9fGRpZmZ9fe+8iWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbW1lbnQgKz0gJ1xcbic7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVzKSB7XG5cdFx0XHRcdFx0Y29tbWVudCArPSBgKiAke3R5cGVzfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlucHV0LnJlYXNvbiAhPT0gJycpIHtcblx0XHRcdFx0XHRpbnB1dC5yZWFzb24gPSBpbnB1dC5yZWFzb24ucmVwbGFjZSgvXFxuXFxuKy9nLCAnXFxuJyk7XG5cdFx0XHRcdFx0aW5wdXQucmVhc29uID0gaW5wdXQucmVhc29uLnJlcGxhY2UoL1xccj9cXG4vZywgJ1xcbio6Jyk7IC8vIGluZGVudCBuZXdsaW5lc1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gKHR5cGVzID8gJ+OAgicgOiAnKiAnKSArIGlucHV0LnJlYXNvbjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21tZW50ID0gY29tbWVudC50cmltKCk7XG5cdFx0XHRcdGNvbW1lbnQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oY29tbWVudCk7XG5cdFx0XHRcdHJlYXNvbiArPSBgJHtjb21tZW50fVxcbiog5Y+R546w5Lq677yafn5gLmNvbmNhdCgnfn5cXG4qIOWkhOeQhu+8micpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFtyZWFzb24sIGNvbW1lbnRdO1xuXHR9O1xuXHRUd2lua2xlLmFydi5jYWxsYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IGlucHV0ID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldElucHV0RGF0YShmb3JtKTtcblx0XHRjb25zdCB7dWlkfSA9IGlucHV0O1xuXHRcdGxldCByZWFzb247XG5cdFx0bGV0IHN1bW1hcnk7XG5cdFx0c3dpdGNoIChpbnB1dC5jYXRlZ29yeSkge1xuXHRcdFx0Ly8gUmVwb3J0IDNSUlxuXHRcdFx0Y2FzZSAnZXdpcCc6IHtcblx0XHRcdFx0cmVhc29uID0gVHdpbmtsZS5hcnYuY2FsbGJhY2suZ2V0UmVwb3J0V2lraXRleHQoZm9ybSk7XG5cdFx0XHRcdGlmIChyZWFzb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdW1tYXJ5ID0gYCR7d2luZG93LndnVUxTKCfmiqXlkYonLCAn5aCx5ZGKJyl9W1tTcGVjaWFsOkNvbnRyaWJzLyR7dWlkfXwke3VpZH1dXWA7XG5cdFx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9ICdRaXV3ZW5fdGFsazrnrqHnkIblkZjlkYrnpLrmnb8nO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+aKpeWRiuWujOaIkCcsICfloLHlkYrlrozmiJAnKTtcblx0XHRcdFx0Y29uc3QgZXdpcFBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdCdRaXV3ZW5fdGFsazrnrqHnkIblkZjlkYrnpLrmnb8nLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5aSE55CGRVdJUOivt+axgicsICfomZXnkIZFV0lQ6KuL5rGCJylcblx0XHRcdFx0KTtcblx0XHRcdFx0ZXdpcFBhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSk7XG5cdFx0XHRcdGV3aXBQYWdlLmxvYWQoKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHRleHQgPSBld2lwUGFnZS5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRcdGNvbnN0ICRld2lwTGluayA9ICc8YSByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCIvd2lraS9RVzpFV0lQXCI+UVc6RVdJUDwvYT4nO1xuXHRcdFx0XHRcdC8vIGNoZWNrIGlmIHVzZXIgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZFxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRcdGA9PT1cXFxccypcXFxce1xcXFx7XFxcXHMqKD86W1Z2XWFuZGFsKVxcXFxzKlxcXFx8XFxcXHMqKD86MT0pP1xcXFxzKiR7TW9yZWJpdHMuc3RyaW5nLmVzY2FwZVJlZ0V4cChcblx0XHRcdFx0XHRcdFx0XHR1aWRcblx0XHRcdFx0XHRcdFx0KX1cXFxccypcXFxcfVxcXFx9XFxcXHMqPT09YFxuXHRcdFx0XHRcdFx0KS50ZXN0KHRleHQpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRld2lwUGFnZVxuXHRcdFx0XHRcdFx0XHQuZ2V0U3RhdHVzRWxlbWVudCgpXG5cdFx0XHRcdFx0XHRcdC5lcnJvcih3aW5kb3cud2dVTFMoJ+aKpeWRiuW3suWtmOWcqO+8jOWwhuS4jeS8muWKoOWFpeaWsOeahCcsICfloLHlkYrlt7LlrZjlnKjvvIzlsIfkuI3mnIPliqDlhaXmlrDnmoQnKSk7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMucHJpbnRVc2VyVGV4dChcblx0XHRcdFx0XHRcdFx0cmVhc29uWzFdLFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+aCqOi+k+WFpeeahOivhOiuuuW3suWcqOS4i+aWueaPkOS+m++8jOaCqOWPr+S7peWwhuWFtuWKoOWFpeWIsCcsXG5cdFx0XHRcdFx0XHRcdFx0J+aCqOi8uOWFpeeahOipleirluW3suWcqOS4i+aWueaPkOS+m++8jOaCqOWPr+S7peWwh+WFtuWKoOWFpeWIsCdcblx0XHRcdFx0XHRcdFx0KSArXG5cdFx0XHRcdFx0XHRcdFx0JGV3aXBMaW5rICtcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+W3suWtmOWcqOeahOWwj+iKguS4re+8micsICflt7LlrZjlnKjnmoTlsI/nr4DkuK3vvJonKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZXdpcFBhZ2Uuc2V0UGFnZVNlY3Rpb24oMCk7XG5cdFx0XHRcdFx0ZXdpcFBhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+WKoOWFpeaWsOaKpeWRiuKApicsICfliqDlhaXmlrDloLHlkYrigKYnKSk7XG5cdFx0XHRcdFx0ZXdpcFBhZ2Uuc2V0RWRpdFN1bW1hcnkoc3VtbWFyeSk7XG5cdFx0XHRcdFx0ZXdpcFBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdGV3aXBQYWdlLnNldEFwcGVuZFRleHQoYFxcbiR7cmVhc29uWzBdfWApO1xuXHRcdFx0XHRcdGV3aXBQYWdlLmFwcGVuZCgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyBSZXBvcnQgaW5hcHByb3ByaWF0ZSB1c2VybmFtZVxuXHRcdFx0Y2FzZSAndXNlcm5hbWUnOiB7XG5cdFx0XHRcdHJlYXNvbiA9IFR3aW5rbGUuYXJ2LmNhbGxiYWNrLmdldFJlcG9ydFdpa2l0ZXh0KGZvcm0pO1xuXHRcdFx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSAnUWl1d2VuX3RhbGs6566h55CG5ZGY5ZGK56S65p2/Jztcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKCfmiqXlkYrlrozmiJAnLCAn5aCx5ZGK5a6M5oiQJyk7XG5cdFx0XHRcdGNvbnN0IHVhYVBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdCdRaXV3ZW5fdGFsazrnrqHnkIblkZjlkYrnpLrmnb8nLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5aSE55CGVUFB6K+35rGCJywgJ+iZleeQhlVBQeiri+axgicpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHVhYVBhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSk7XG5cdFx0XHRcdHVhYVBhZ2UubG9hZCgoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdGV4dCA9IHVhYVBhZ2UuZ2V0UGFnZVRleHQoKTtcblx0XHRcdFx0XHQvLyBjaGVjayBpZiB1c2VyIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWRcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdFx0XHRgXFxcXHtcXFxce1xcXFxzKnVzZXItdWFhXFxcXHMqXFxcXHxcXFxccyooMVxcXFxzKj1cXFxccyopPyR7TW9yZWJpdHMuc3RyaW5nLmVzY2FwZVJlZ0V4cChcblx0XHRcdFx0XHRcdFx0XHR1aWRcblx0XHRcdFx0XHRcdFx0KX1cXFxccyooXFxcXHx8XFxcXH0pYFxuXHRcdFx0XHRcdFx0KS50ZXN0KHRleHQpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHR1YWFQYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5lcnJvcih3aW5kb3cud2dVTFMoJ+eUqOaIt+W3suiiq+WIl+WFpeOAgicsICfkvb/nlKjogIXlt7LooqvliJflhaXjgIInKSk7XG5cdFx0XHRcdFx0XHRjb25zdCAkdWFhTGluayA9ICc8YSByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCIvd2lraS9RVzpVQUFcIj5RVzpVQUE8L2E+Jztcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5wcmludFVzZXJUZXh0KFxuXHRcdFx0XHRcdFx0XHRyZWFzb25bMV0sXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5oKo6L6T5YWl55qE6K+E6K665bey5Zyo5LiL5pa55o+Q5L6b77yM5oKo5Y+v5Lul5bCG5YW25omL5bel5Yqg5YWlJyxcblx0XHRcdFx0XHRcdFx0XHQn5oKo6Ly45YWl55qE6KmV6KuW5bey5Zyo5LiL5pa55o+Q5L6b77yM5oKo5Y+v5Lul5bCH5YW25omL5bel5Yqg5YWlJ1xuXHRcdFx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdFx0XHQkdWFhTGluayArXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkuIror6XnlKjmiLfnmoTmiqXlkYrkuK3vvJonLCAn5LiK6Kmy5L2/55So6ICF55qE5aCx5ZGK5Lit77yaJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHVhYVBhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+WKoOWFpeaWsOaKpeWRiuKApicsICfliqDlhaXmlrDloLHlkYrigKYnKSk7XG5cdFx0XHRcdFx0dWFhUGFnZS5zZXRFZGl0U3VtbWFyeSh3aW5kb3cud2dVTFMoJ+aWsOaPkOaKpScsICfmlrDmj5DloLEnKSk7XG5cdFx0XHRcdFx0dWFhUGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0dWFhUGFnZS5zZXRBcHBlbmRUZXh0KGBcXG5cXG4ke3JlYXNvblswXX1gKTtcblx0XHRcdFx0XHR1YWFQYWdlLmFwcGVuZCgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyBRVzpTUElcblx0XHRcdGNhc2UgJ3NwaSc6IHtcblx0XHRcdFx0cmVhc29uID0gVHdpbmtsZS5hcnYuY2FsbGJhY2suZ2V0UmVwb3J0V2lraXRleHQoZm9ybSk7XG5cdFx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRjb25zdCByZXBvcnRwYWdlID0gJ1FpdXdlbl90YWxrOueuoeeQhuWRmOWRiuekuuadvyc7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gcmVwb3J0cGFnZTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKCfmiqXlkYrlrozmiJAnLCAn5aCx5ZGK5a6M5oiQJyk7XG5cdFx0XHRcdGNvbnN0IHNwaVBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHJlcG9ydHBhZ2UsIHdpbmRvdy53Z1VMUygn5oqT5Y+W6K6o6K666aG16Z2iJywgJ+aKk+WPluiojuirlumggemdoicpKTtcblx0XHRcdFx0c3BpUGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0c3BpUGFnZS5zZXRFZGl0U3VtbWFyeSh3aW5kb3cud2dVTFMoJ+WKoOWFpeaWsOaPkOaKpScsICfliqDlhaXmlrDmj5DloLEnKSk7XG5cdFx0XHRcdHNwaVBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRzcGlQYWdlLnNldEFwcGVuZFRleHQocmVhc29uWzBdKTtcblx0XHRcdFx0c3BpUGFnZS5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCdzcGlXYXRjaFJlcG9ydCcpKTtcblx0XHRcdFx0c3BpUGFnZS5hcHBlbmQoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlcG9ydCB1c2VyIGZvciB2YW5kYWxpc21cblx0XHRcdC8qIGNhc2UgJ2Fpdic6ICovXG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdHJlYXNvbiA9IFR3aW5rbGUuYXJ2LmNhbGxiYWNrLmdldFJlcG9ydFdpa2l0ZXh0KGZvcm0pO1xuXHRcdFx0XHRpZiAocmVhc29uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c3VtbWFyeSA9IGAke3dpbmRvdy53Z1VMUygn5oql5ZGKJywgJ+WgseWRiicpfVtbU3BlY2lhbDpDb250cmlicy8ke3VpZH18JHt1aWR9XV1gO1xuXHRcdFx0XHRpZiAoaW5wdXQuaGlkZW5hbWUpIHtcblx0XHRcdFx0XHRzdW1tYXJ5ID0gd2luZG93LndnVUxTKCfmiqXlkYrkuIDlkI3nlKjmiLcnLCAn5aCx5ZGK5LiA5ZCN5L2/55So6ICFJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gJ1FpdXdlbl90YWxrOuaKpeWRiuW9k+WJjeegtOWdjyc7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5oql5ZGK5a6M5oiQJywgJ+WgseWRiuWujOaIkCcpO1xuXHRcdFx0XHRjb25zdCBhaXZQYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHQnUWl1d2VuX3RhbGs65oql5ZGK5b2T5YmN56C05Z2PJyxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WkhOeQhlZJUOivt+axgicsICfomZXnkIZWSVDoq4vmsYInKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhaXZQYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0XHRhaXZQYWdlLmxvYWQoKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHRleHQgPSBhaXZQYWdlLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdFx0Y29uc3QgJGFpdkxpbmsgPSAnPGEgcmVsPVwibm9vcGVuZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiL3dpa2kvUVc6VklQXCI+UVc6VklQPC9hPic7XG5cdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdXNlciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0YD09PVxcXFxzKlxcXFx7XFxcXHtcXFxccyooPzpbVnZdYW5kYWwpXFxcXHMqXFxcXHxcXFxccyooPzoxPSk/XFxcXHMqJHtNb3JlYml0cy5zdHJpbmcuZXNjYXBlUmVnRXhwKFxuXHRcdFx0XHRcdFx0XHRcdHVpZFxuXHRcdFx0XHRcdFx0XHQpfVxcXFxzKlxcXFx9XFxcXH1cXFxccyo9PT1gXG5cdFx0XHRcdFx0XHQpLnRlc3QodGV4dClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGFpdlBhZ2Vcblx0XHRcdFx0XHRcdFx0LmdldFN0YXR1c0VsZW1lbnQoKVxuXHRcdFx0XHRcdFx0XHQuZXJyb3Iod2luZG93LndnVUxTKCfmiqXlkYrlt7LlrZjlnKjvvIzlsIbkuI3kvJrliqDlhaXmlrDnmoQnLCAn5aCx5ZGK5bey5a2Y5Zyo77yM5bCH5LiN5pyD5Yqg5YWl5paw55qEJykpO1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLnByaW50VXNlclRleHQoXG5cdFx0XHRcdFx0XHRcdHJlYXNvblsxXSxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjovpPlhaXnmoTor4Torrrlt7LlnKjkuIvmlrnmj5DkvpvvvIzmgqjlj6/ku6XlsIblhbbliqDlhaXliLAnLFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjovLjlhaXnmoToqZXoq5blt7LlnKjkuIvmlrnmj5DkvpvvvIzmgqjlj6/ku6XlsIflhbbliqDlhaXliLAnXG5cdFx0XHRcdFx0XHRcdCkgK1xuXHRcdFx0XHRcdFx0XHRcdCRhaXZMaW5rICtcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+W3suWtmOWcqOeahOWwj+iKguS4re+8micsICflt7LlrZjlnKjnmoTlsI/nr4DkuK3vvJonKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YWl2UGFnZS5zZXRQYWdlU2VjdGlvbigwKTtcblx0XHRcdFx0XHRhaXZQYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5zdGF0dXMod2luZG93LndnVUxTKCfliqDlhaXmlrDmiqXlkYrigKYnLCAn5Yqg5YWl5paw5aCx5ZGK4oCmJykpO1xuXHRcdFx0XHRcdGFpdlBhZ2Uuc2V0RWRpdFN1bW1hcnkoc3VtbWFyeSk7XG5cdFx0XHRcdFx0YWl2UGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0YWl2UGFnZS5zZXRBcHBlbmRUZXh0KGBcXG4ke3JlYXNvblswXX1gKTtcblx0XHRcdFx0XHRhaXZQYWdlLmFwcGVuZCgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLmFydiwgJ2FydicpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5cbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZXdhcm4uanMgKi9cbihmdW5jdGlvbiB0d2lua2xld2FybigkKSB7XG5cdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHQvKipcblx0ICogdHdpbmtsZXdhcm4uanM6IFdhcm4gbW9kdWxlXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogVGFiIChcIldhcm5cIilcblx0ICogQWN0aXZlIG9uOiBBbnkgcGFnZSB3aXRoIHJlbGV2YW50IHVzZXIgbmFtZSAodXNlcnNwYWNlLCBjb250cmlicyxcblx0ICogZXRjLiksIGFzIHdlbGwgYXMgdGhlIHJvbGxiYWNrIHN1Y2Nlc3MgcGFnZVxuXHQgKi9cblx0Y29uc3QgcmVsZXZhbnRVc2VyTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpO1xuXHRUd2lua2xlLndhcm4gPSAoKSA9PiB7XG5cdFx0aWYgKHJlbGV2YW50VXNlck5hbWUpIHtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdFR3aW5rbGUud2Fybi5jYWxsYmFjayxcblx0XHRcdFx0J+itpuWRiicsXG5cdFx0XHRcdCd0dy13YXJuJyxcblx0XHRcdFx0d2luZG93LndnVUxTKCforablkYrmiJbmj5DphpLnlKjmiLcnLCAn6K2m5ZGK5oiW5o+Q6YaS5L2/55So6ICFJylcblx0XHRcdCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignYXV0b01lbnVBZnRlclJvbGxiYWNrJykgJiZcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMyAmJlxuXHRcdFx0XHRtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ZhbmFydGljbGUnKSAmJlxuXHRcdFx0XHQhbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdub2F1dG93YXJuJylcblx0XHRcdCkge1xuXHRcdFx0XHRUd2lua2xlLndhcm4uY2FsbGJhY2soKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTW9kaWZ5IFVSTCBvZiB0YWxrIHBhZ2Ugb24gcm9sbGJhY2sgc3VjY2VzcyBwYWdlcywgbWFrZXMgdXNlIG9mIGFcblx0XHQvLyBjdXN0b20gbWVzc2FnZSBib3ggaW4gW1tNZWRpYVdpa2k6Um9sbGJhY2stc3VjY2Vzc11dXG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICdyb2xsYmFjaycpIHtcblx0XHRcdGNvbnN0ICR2YW5kYWxUYWxrTGluayA9ICRib2R5LmZpbmQoJyNtdy1yb2xsYmFjay1zdWNjZXNzJykuZmluZCgnLm13LXVzZXJ0b29sbGlua3MgYScpLmZpcnN0KCk7XG5cdFx0XHRpZiAoJHZhbmRhbFRhbGtMaW5rLmxlbmd0aCkge1xuXHRcdFx0XHRUd2lua2xlLndhcm4ubWFrZVZhbmRhbFRhbGtMaW5rKCR2YW5kYWxUYWxrTGluaywgTW9yZWJpdHMucGFnZU5hbWVOb3JtKTtcblx0XHRcdFx0JHZhbmRhbFRhbGtMaW5rLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnQWJ1c2VMb2cnICYmXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0FidXNlRmlsdGVyVmFyaWFibGVzJykgIT09IG51bGxcblx0XHQpIHtcblx0XHRcdGNvbnN0IGFmVGFsa0xpbmsgPSAkYm9keS5maW5kKCcubXctdXNlcnRvb2xsaW5rcy10YWxrJykuZmlyc3QoKTtcblx0XHRcdGlmIChhZlRhbGtMaW5rLmxlbmd0aCkge1xuXHRcdFx0XHRUd2lua2xlLndhcm4ubWFrZVZhbmRhbFRhbGtMaW5rKGFmVGFsa0xpbmssIG13LmNvbmZpZy5nZXQoJ3dnQWJ1c2VGaWx0ZXJWYXJpYWJsZXMnKS5wYWdlX3ByZWZpeGVkdGl0bGUpO1xuXHRcdFx0XHRhZlRhbGtMaW5rLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0VHdpbmtsZS53YXJuLm1ha2VWYW5kYWxUYWxrTGluayA9ICgkdmFuZGFsVGFsa0xpbmssIHBhZ2VuYW1lKSA9PiB7XG5cdFx0JHZhbmRhbFRhbGtMaW5rLndyYXBJbm5lcihcblx0XHRcdCQoJzxzcGFuPicpLmF0dHIoXG5cdFx0XHRcdCd0aXRsZScsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5aaC5p6c5ZCI6YCC77yM5oKo5Y+v5Lul55SoVHdpbmtsZeWcqOivpeeUqOaIt+iuqOiuuumhteS4iuWBmuWHuuitpuWRiuOAgicsXG5cdFx0XHRcdFx0J+WmguaenOWQiOmBqe+8jOaCqOWPr+S7peeUqFR3aW5rbGXlnKjoqbLkvb/nlKjogIXoqI7oq5bpoIHkuIrlgZrlh7rorablkYrjgIInXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpO1xuXHRcdGNvbnN0IGV4dHJhUGFyYW0gPSBgdmFuYXJ0aWNsZT0ke213LnV0aWwucmF3dXJsZW5jb2RlKHBhZ2VuYW1lKX1gO1xuXHRcdGNvbnN0IGhyZWYgPSAkdmFuZGFsVGFsa0xpbmsuYXR0cignaHJlZicpO1xuXHRcdGlmIChocmVmLmluY2x1ZGVzKCc/JykpIHtcblx0XHRcdCR2YW5kYWxUYWxrTGluay5hdHRyKCdocmVmJywgYCR7aHJlZn0mJHtleHRyYVBhcmFtfWApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdmFuZGFsVGFsa0xpbmsuYXR0cignaHJlZicsIGAke2hyZWZ9PyR7ZXh0cmFQYXJhbX1gKTtcblx0XHR9XG5cdH07XG5cdC8vIFVzZWQgdG8gY2xvc2Ugd2luZG93IHdoZW4gc3dpdGNoaW5nIHRvIEFSViBpbiBhdXRvbGV2ZWxcblx0VHdpbmtsZS53YXJuLmRpYWxvZyA9IG51bGw7XG5cdFR3aW5rbGUud2Fybi5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRyZWxldmFudFVzZXJOYW1lID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgJiZcblx0XHRcdCFjb25maXJtKHdpbmRvdy53Z1VMUygn5oKo5bCG6KaB6K2m5ZGK6Ieq5bex77yB5oKo56Gu5a6a6KaB57un57ut5ZCX77yfJywgJ+aCqOWwh+imgeitpuWRiuiHquW3se+8geaCqOeiuuWumuimgee5vOe6jOWXju+8nycpKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRUd2lua2xlLndhcm4uZGlhbG9nID0gbmV3IE1vcmViaXRzLnNpbXBsZVdpbmRvdyg2MDAsIDQ0MCk7XG5cdFx0Y29uc3Qge2RpYWxvZ30gPSBUd2lua2xlLndhcm47XG5cdFx0ZGlhbG9nLnNldFRpdGxlKHdpbmRvdy53Z1VMUygn6K2m5ZGK44CB5o+Q6YaS55So5oi3JywgJ+itpuWRiuOAgeaPkOmGkuS9v+eUqOiAhScpKTtcblx0XHRkaWFsb2cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdGRpYWxvZy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn6K2m5ZGK6K6+572uJywgJ+itpuWRiuioreWumicpLCAnSDpUVy9QUkVGI3dhcm4nKTtcblx0XHRkaWFsb2cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ1R3aW5rbGXluK7liqknLCAnVHdpbmtsZeiqquaYjicpLCAnSDpUVy9ET0Mjd2FybicpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUud2Fybi5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Y29uc3QgbWFpbl9zZWxlY3QgPSBmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCJ5oup6KaB5Y+R6YCB55qE6K2m5ZGK5oiW5o+Q6YaS57G75Z6LJywgJ+mBuOaTh+imgeWCs+mAgeeahOitpuWRiuaIluaPkOmGkumhnuWIpScpLFxuXHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfpppblhYjpgInmi6nkuIDnu4TvvIzlho3pgInmi6nlhbfkvZPnmoTorablkYrmqKHmnb/jgIInLCAn6aaW5YWI6YG45pOH5LiA57WE77yM5YaN6YG45pOH5YW36auU55qE6K2m5ZGK5qih5p2/44CCJyksXG5cdFx0fSk7XG5cdFx0Y29uc3QgbWFpbl9ncm91cCA9IG1haW5fc2VsZWN0LmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdG5hbWU6ICdtYWluX2dyb3VwJyxcblx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+aCqOWPr+WcqFR3aW5rbGXlj4LmlbDorr7nva7kuK3orr7nva7pu5jorqTpgInmi6nnmoTpgInpobknLFxuXHRcdFx0XHQn5oKo5Y+v5ZyoVHdpbmtsZeWBj+WlveioreWumuS4reioreWumumgkOioremBuOaTh+eahOmBuOmghSdcblx0XHRcdCksXG5cdFx0XHRldmVudDogVHdpbmtsZS53YXJuLmNhbGxiYWNrLmNoYW5nZV9jYXRlZ29yeSxcblx0XHR9KTtcblx0XHRjb25zdCBkZWZhdWx0R3JvdXAgPSBOdW1iZXIucGFyc2VJbnQoVHdpbmtsZS5nZXRQcmVmKCdkZWZhdWx0V2FybmluZ0dyb3VwJyksIDYpO1xuXHRcdG1haW5fZ3JvdXAuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5Yqo6YCJ5oup5bGC57qnJywgJ+iHquWLlemBuOaTh+WxpOe0micpLFxuXHRcdFx0dmFsdWU6ICdhdXRvbGV2ZWwnLFxuXHRcdFx0c2VsZWN0ZWQ6IGRlZmF1bHRHcm91cCA9PT0gNyxcblx0XHR9KTtcblx0XHRtYWluX2dyb3VwLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiAnMe+8muaPkOmGkicsXG5cdFx0XHR2YWx1ZTogJ2xldmVsMScsXG5cdFx0XHRzZWxlY3RlZDogZGVmYXVsdEdyb3VwID09PSAxLFxuXHRcdH0pO1xuXHRcdG1haW5fZ3JvdXAuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0bGFiZWw6ICcy77ya6K2m5ZGKJyxcblx0XHRcdHZhbHVlOiAnbGV2ZWwyJyxcblx0XHRcdHNlbGVjdGVkOiBkZWZhdWx0R3JvdXAgPT09IDIsXG5cdFx0fSk7XG5cdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignY29tYmluZWRTaW5nbGV0TWVudXMnKSkge1xuXHRcdFx0bWFpbl9ncm91cC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y2V5bGC57qn5raI5oGvJywgJ+WWruWxpOe0muioiuaBrycpLFxuXHRcdFx0XHR2YWx1ZTogJ3NpbmdsZWNvbWJpbmVkJyxcblx0XHRcdFx0c2VsZWN0ZWQ6IGRlZmF1bHRHcm91cCA9PT0gMyB8fCBkZWZhdWx0R3JvdXAgPT09IDQsXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWFpbl9ncm91cC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y2V5bGC57qn5o+Q6YaSJywgJ+WWruWxpOe0muaPkOmGkicpLFxuXHRcdFx0XHR2YWx1ZTogJ3NpbmdsZW5vdGljZScsXG5cdFx0XHRcdHNlbGVjdGVkOiBkZWZhdWx0R3JvdXAgPT09IDMsXG5cdFx0XHR9KTtcblx0XHRcdG1haW5fZ3JvdXAuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WNleWxgue6p+itpuWRiicsICfllq7lsaTntJrorablkYonKSxcblx0XHRcdFx0dmFsdWU6ICdzaW5nbGV3YXJuJyxcblx0XHRcdFx0c2VsZWN0ZWQ6IGRlZmF1bHRHcm91cCA9PT0gNCxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21XYXJuaW5nTGlzdCcpLmxlbmd0aCkge1xuXHRcdFx0bWFpbl9ncm91cC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ6K2m5ZGKJywgJ+iHquioguitpuWRiicpLFxuXHRcdFx0XHR2YWx1ZTogJ2N1c3RvbScsXG5cdFx0XHRcdHNlbGVjdGVkOiBkZWZhdWx0R3JvdXAgPT09IDUsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0bWFpbl9ncm91cC5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRsYWJlbDogJ+aJgOacieitpuWRiuaooeadvycsXG5cdFx0XHR2YWx1ZTogJ2tpdGNoZW5zaW5rJyxcblx0XHRcdHNlbGVjdGVkOiBkZWZhdWx0R3JvdXAgPT09IDYsXG5cdFx0fSk7XG5cdFx0bWFpbl9zZWxlY3QuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ3N1Yl9ncm91cCcsXG5cdFx0XHRldmVudDogVHdpbmtsZS53YXJuLmNhbGxiYWNrLmNoYW5nZV9zdWJjYXRlZ29yeSxcblx0XHR9KTsgLy8gV2lsbCBiZSBlbXB0eSB0byBiZWdpbiB3aXRoLlxuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRuYW1lOiAnYXJ0aWNsZScsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpobXpnaLpk77mjqUnLCAn6aCB6Z2i6YCj57WQJyksXG5cdFx0XHR2YWx1ZTogbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlJykgfHwgJycsXG5cdFx0XHRzaXplOiA1MCxcblx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn57uZ5qih5p2/5Lit5Yqg5YWl5LiA6aG16Z2i6ZO+5o6l77yM5Y+v55WZ56m644CCJywgJ+e1puaooeadv+S4reWKoOWFpeS4gOmggemdoumAo+e1kO+8jOWPr+eVmeepuuOAgicpLFxuXHRcdFx0cGxhY2Vob2xkZXI6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+S7hemZkOS4gOS4qu+8jOWLv+S9v+eUqOe9keWdgOOAgVtbIF1d77yM5Y+v5L2/55SoU3BlY2lhbDpEaWZmJyxcblx0XHRcdFx0J+WDhemZkOS4gOWAi++8jOWLv+S9v+eUqOe2suWdgOOAgVtbIF1d77yM5Y+v5L2/55SoU3BlY2lhbDpEaWZmJ1xuXHRcdFx0KSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdGxhYmVsOiAnJyxcblx0XHRcdHN0eWxlOiAnY29sb3I6ICNmMDAnLFxuXHRcdFx0aWQ6ICd0d2lua2xlLXdhcm4td2FybmluZy1tZXNzYWdlcycsXG5cdFx0fSk7XG5cdFx0Y29uc3QgbW9yZSA9IGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRuYW1lOiAncmVhc29uR3JvdXAnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K2m5ZGK5L+h5oGvJywgJ+itpuWRiuizh+ioiicpLFxuXHRcdH0pO1xuXHRcdG1vcmUuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj6/pgInkv6Hmga/vvJonLCAn5Y+v6YG46LOH6KiK77yaJyksXG5cdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn55CG55Sx5oiW5piv6ZmE5Yqg5L+h5oGvJywgJ+eQhueUseaIluaYr+mZhOWKoOizh+ioiicpLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHByZXZpZXdsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdCQocHJldmlld2xpbmspLm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFR3aW5rbGUud2Fybi5jYWxsYmFja3MucHJldmlldyhyZXN1bHQpOyAvLyB8cmVzdWx0fCBpcyBkZWZpbmVkIGJlbG93XG5cdFx0fSk7XG5cblx0XHRwcmV2aWV3bGluay5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0cHJldmlld2xpbmsudGV4dENvbnRlbnQgPSB3aW5kb3cud2dVTFMoJ+mihOiniCcsICfpoJDopr0nKTtcblx0XHRtb3JlLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdGlkOiAnd2FybmluZ3ByZXZpZXcnLFxuXHRcdFx0bGFiZWw6IFtwcmV2aWV3bGlua10sXG5cdFx0fSk7XG5cdFx0bW9yZS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRpZDogJ3R3aW5rbGV3YXJuLXByZXZpZXdib3gnLFxuXHRcdFx0c3R5bGU6ICdkaXNwbGF5OiBub25lJyxcblx0XHR9KTtcblx0XHRtb3JlLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHRcdGxhYmVsOiAn5o+Q5LqkJyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdGRpYWxvZy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0ZGlhbG9nLmRpc3BsYXkoKTtcblx0XHRyZXN1bHQubWFpbl9ncm91cC5yb290ID0gcmVzdWx0O1xuXHRcdHJlc3VsdC5wcmV2aWV3ZXIgPSBuZXcgTW9yZWJpdHMud2lraS5wcmV2aWV3KCQocmVzdWx0KS5maW5kKCdkaXYjdHdpbmtsZXdhcm4tcHJldmlld2JveCcpLmxhc3QoKVswXSk7XG5cdFx0Ly8gUG90ZW50aWFsIG5vdGljZXMgZm9yIHN0YWxlbmVzcyBhbmQgbWlzc2VkIHJldmVydHNcblx0XHRsZXQgbWVzc2FnZSA9ICcnO1xuXHRcdGxldCBxdWVyeSA9IHt9O1xuXHRcdGNvbnN0IHZhbnJldmlkID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlcmV2aWQnKTtcblx0XHRpZiAodmFucmV2aWQpIHtcblx0XHRcdC8vIElmIHlvdSB0cmllZCByZXZlcnRpbmcsIGNoZWNrIGlmICp5b3UqIGFjdHVhbGx5IHJldmVydGVkXG5cdFx0XHRpZiAoIW13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnbm9hdXRvd2FybicpICYmIG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgndmFuYXJ0aWNsZScpKSB7XG5cdFx0XHRcdC8vIFZpYSBmbHVmZiBsaW5rXG5cdFx0XHRcdHF1ZXJ5ID0ge1xuXHRcdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHR0aXRsZXM6IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgndmFuYXJ0aWNsZScpLFxuXHRcdFx0XHRcdHByb3A6ICdyZXZpc2lvbnMnLFxuXHRcdFx0XHRcdHJ2c3RhcnRpZDogdmFucmV2aWQsXG5cdFx0XHRcdFx0cnZsaW1pdDogMixcblx0XHRcdFx0XHRydmRpcjogJ25ld2VyJyxcblx0XHRcdFx0XHRydnByb3A6ICd1c2VyJyxcblx0XHRcdFx0fTtcblx0XHRcdFx0bmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5qOA5p+l5oKo5piv5ZCm5oiQ5Yqf5Zue6YCA6K+l6aG16Z2iJywgJ+aqouafpeaCqOaYr+WQpuaIkOWKn+WbnumAgOipsumggemdoicpLFxuXHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdChhcGlvYmopID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHJldmVydFVzZXIgPSAkKGFwaW9iai5nZXRSZXNwb25zZSgpKS5maW5kKCdyZXZpc2lvbnMgcmV2JylbMV0uZ2V0QXR0cmlidXRlKCd1c2VyJyk7XG5cdFx0XHRcdFx0XHRpZiAocmV2ZXJ0VXNlciAmJiByZXZlcnRVc2VyICE9PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZSArPSB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WFtuS7luS6uuWbnumAgOS6huivpemhtemdou+8jOW5tuWPr+iDveW3sue7j+itpuWRiuivpeeUqOaIt+OAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+WFtuS7luS6uuWbnumAgOS6huipsumggemdou+8jOS4puWPr+iDveW3sue2k+itpuWRiuipsuS9v+eUqOiAheOAgidcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtd2Fybi13YXJuaW5nLW1lc3NhZ2VzJykudGV4dChg6K2m5ZGK77yaJHttZXNzYWdlfWApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KS5wb3N0KCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBDb25maXJtIGVkaXQgd2Fzbid0IHRvbyBvbGQgZm9yIGEgd2FybmluZ1xuXHRcdFx0Y29uc3QgY2hlY2tTdGFsZSA9ICh2YW50aW1lc3RhbXBfKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJldkRhdGUgPSBuZXcgTW9yZWJpdHMuZGF0ZSh2YW50aW1lc3RhbXBfKTtcblx0XHRcdFx0aWYgKHZhbnRpbWVzdGFtcF8gJiYgcmV2RGF0ZS5pc1ZhbGlkKCkgJiYgcmV2RGF0ZS5hZGQoMjQsICdob3VycycpLmlzQmVmb3JlKG5ldyBEYXRlKCkpKSB7XG5cdFx0XHRcdFx0bWVzc2FnZSArPSB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6L+Z56yU57yW6L6R5piv5ZyoMjTlsI/ml7bliY3lgZrlh7rnmoTvvIznjrDlnKjorablkYrlj6/og73lt7Lov4fml7bjgIInLFxuXHRcdFx0XHRcdFx0J+mAmeethue3qOi8r+aYr+WcqDI05bCP5pmC5YmN5YGa5Ye655qE77yM54++5Zyo6K2m5ZGK5Y+v6IO95bey6YGO5pmC44CCJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtd2Fybi13YXJuaW5nLW1lc3NhZ2VzJykudGV4dChg6K2m5ZGK77yaJHttZXNzYWdlfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0bGV0IHZhbnRpbWVzdGFtcCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgndmFudGltZXN0YW1wJyk7XG5cdFx0XHQvLyBQcm92aWRlZCBmcm9tIGEgZmx1ZmYgbW9kdWxlLWJhc2VkIHJldmVydCwgbm8gQVBJIGxvb2t1cCBuZWNlc3Nhcnlcblx0XHRcdGlmICh2YW50aW1lc3RhbXApIHtcblx0XHRcdFx0Y2hlY2tTdGFsZSh2YW50aW1lc3RhbXApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0XHRcdHByb3A6ICdyZXZpc2lvbnMnLFxuXHRcdFx0XHRcdHJ2cHJvcDogJ3RpbWVzdGFtcCcsXG5cdFx0XHRcdFx0cmV2aWRzOiB2YW5yZXZpZCxcblx0XHRcdFx0fTtcblx0XHRcdFx0bmV3IE1vcmViaXRzLndpa2kuYXBpKHdpbmRvdy53Z1VMUygn6I635Y+W54mI5pys5pe26Ze05oizJywgJ+WPluW+l+eJiOacrOaZgumWk+aIsycpLCBxdWVyeSwgKGFwaW9iaikgPT4ge1xuXHRcdFx0XHRcdHZhbnRpbWVzdGFtcCA9ICQoYXBpb2JqLmdldFJlc3BvbnNlKCkpLmZpbmQoJ3JldmlzaW9ucyByZXYnKS5hdHRyKCd0aW1lc3RhbXAnKTtcblx0XHRcdFx0XHRjaGVja1N0YWxlKHZhbnRpbWVzdGFtcCk7XG5cdFx0XHRcdH0pLnBvc3QoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgaW5pdCA9ICgpID0+IHtcblx0XHRcdC8vIFdlIG11c3QgaW5pdCB0aGUgZmlyc3QgY2hvaWNlIChHZW5lcmFsIE5vdGUpO1xuXHRcdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRcdHJlc3VsdC5tYWluX2dyb3VwLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHR9O1xuXHRcdGluaXQoKTtcblx0fTtcblx0Ly8gVGhpcyBpcyBhbGwgdGhlIG1lc3NhZ2VzIHRoYXQgbWlnaHQgYmUgZGlzcGF0Y2hlZCBieSB0aGUgY29kZVxuXHQvLyBFYWNoIG9mIHRoZSBpbmRpdmlkdWFsIHRlbXBsYXRlcyByZXF1aXJlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246XG5cdC8vICAgbGFiZWwgKHJlcXVpcmVkKTogQSBzaG9ydCBkZXNjcmlwdGlvbiBkaXNwbGF5ZWQgaW4gdGhlIGRpYWxvZ1xuXHQvLyAgIHN1bW1hcnkgKHJlcXVpcmVkKTogVGhlIGVkaXQgc3VtbWFyeSB1c2VkLiBJZiBhbiBhcnRpY2xlIG5hbWUgaXMgZW50ZXJlZCwgdGhlIHN1bW1hcnkgaXMgcG9zdGZpeGVkIHdpdGggXCJvbiBbW2FydGljbGVdXVwiLCBhbmQgaXQgaXMgYWx3YXlzIHBvc3RmaXhlZCB3aXRoIFwiLiAkc3VtbWFyeUFkXCJcblx0Ly8gICBzdXBwcmVzc0FydGljbGVJblN1bW1hcnkgKG9wdGlvbmFsKTogU2V0IHRvIHRydWUgdG8gc3VwcHJlc3Mgc2hvd2luZyB0aGUgYXJ0aWNsZSBuYW1lIGluIHRoZSBlZGl0IHN1bW1hcnkuIFVzZWZ1bCBpZiB0aGUgd2FybmluZyByZWxhdGVzIHRvIGF0dGFjayBwYWdlcywgb3Igc29tZSBzdWNoLlxuXHRUd2lua2xlLndhcm4ubWVzc2FnZXMgPSB7XG5cdFx0bGV2ZWxzOiBbXG5cdFx0XHR7XG5cdFx0XHRcdGNhdGVnb3J5OiB3aW5kb3cud2dVTFMoJ+S4jeWQjOexu+Wei+eahOmdnuW7uuiuvue8lui+kScsICfkuI3lkIzpoZ7liKXnmoTpnZ7lu7roqK3nt6jovK8nKSxcblx0XHRcdFx0bGlzdDoge1xuXHRcdFx0XHRcdCd1dy1jb3B5cmlnaHQnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L6154qv6JGX5L2c5p2DJywgJ+S+teeKr+eJiOasiicpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muS+teeKr+iRl+S9nOadgycsICfms6jmhI/vvJrkvrXniq/niYjmrIonKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5aSa5qyh5L6154qv6JGX5L2c5p2DJywgJ+WkmuasoeS+teeKr+eJiOasiicpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muWkmuasoeS+teeKr+iRl+S9nOadgycsICforablkYrvvJrlpJrmrKHkvrXniq/niYjmrIonKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctY3J5c3RhbCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliqDlhaXoh4bmtYvmiJbmnKrnoa7orqTnmoTmtojmga8nLCAn5Yqg5YWl6IeG5ris5oiW5pyq56K66KqN55qE6KiK5oGvJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Yqg5YWl6IeG5rWL5oiW5pyq56Gu6K6k55qE5raI5oGvJywgJ+azqOaEj++8muWKoOWFpeiHhua4rOaIluacqueiuuiqjeeahOioiuaBrycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflpJrmrKHliqDlhaXoh4bmtYvmiJbmnKrnoa7orqTnmoTmtojmga8nLCAn5aSa5qyh5Yqg5YWl6IeG5ris5oiW5pyq56K66KqN55qE6KiK5oGvJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5aSa5qyh5Yqg5YWl6IeG5rWL5oiW5pyq56Gu6K6k55qE5raI5oGvJyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5aSa5qyh5Yqg5YWl6IeG5ris5oiW5pyq56K66KqN55qE6KiK5oGvJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1kZWxldGUnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LiN5oGw5b2T5Zyw56e76Zmk6aG16Z2i5YaF5a6544CB5qih5p2/5oiW6LWE5paZJywgJ+S4jeaBsOeVtuWcsOenu+mZpOmggemdouWFp+WuueOAgeaooeadv+aIluizh+aWmScpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muS4jeaBsOW9k+WcsOenu+mZpOmhtemdouWGheWuueOAgeaooeadv+aIlui1hOaWmScsXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muS4jeaBsOeVtuWcsOenu+mZpOmggemdouWFp+WuueOAgeaooeadv+aIluizh+aWmSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LiN5oGw5b2T5Zyw56e76Zmk6aG16Z2i5YaF5a6544CB5qih5p2/5oiW6LWE5paZJywgJ+S4jeaBsOeVtuWcsOenu+mZpOmggemdouWFp+WuueOAgeaooeadv+aIluizh+aWmScpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muS4jeaBsOW9k+WcsOenu+mZpOmhtemdouWGheWuueOAgeaooeadv+aIlui1hOaWmScsXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muS4jeaBsOeVtuWcsOenu+mZpOmggemdouWFp+WuueOAgeaooeadv+aIluizh+aWmSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctaW1hZ2UnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo6aG16Z2i5Lit5Yqg5YWl5LiN5b2T5Zu+54mHJywgJ+WcqOmggemdouS4reWKoOWFpeS4jeeVtuWclueJhycpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWcqOmhtemdouS4reWKoOWFpeS4jeW9k+WbvueJhycsICfms6jmhI/vvJrlnKjpoIHpnaLkuK3liqDlhaXkuI3nlbblnJbniYcnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo6aG16Z2i5Lit5Yqg5YWl5LiN5b2T5Zu+54mHJywgJ+WcqOmggemdouS4reWKoOWFpeS4jeeVtuWclueJhycpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muWcqOmhtemdouS4reWKoOWFpeS4jeW9k+WbvueJhycsICforablkYrvvJrlnKjpoIHpnaLkuK3liqDlhaXkuI3nlbblnJbniYcnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctbmV3cGFnZSc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliJvlu7rkuI3lvZPpobXpnaInLCAn5bu656uL5LiN55W26aCB6Z2iJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Yib5bu65LiN5b2T6aG16Z2iJywgJ+azqOaEj++8muW7uueri+S4jeeVtumggemdoicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliJvlu7rkuI3lvZPpobXpnaInLCAn5bu656uL5LiN55W26aCB6Z2iJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5Yib5bu65LiN5b2T6aG16Z2iJywgJ+itpuWRiu+8muW7uueri+S4jeeVtumggemdoicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1ub3InOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5p2h55uu5Lit5Yqg5YWl5Y6f5Yib56CU56m2JywgJ+WcqOaineebruS4reWKoOWFpeWOn+WJteeglOepticpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWcqOadoeebruS4reWKoOWFpeWOn+WIm+eglOepticsICfms6jmhI/vvJrlnKjmop3nm67kuK3liqDlhaXljp/libXnoJTnqbYnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5p2h55uu5Lit5Yqg5YWl5Y6f5Yib56CU56m2JywgJ+WcqOaineebruS4reWKoOWFpeWOn+WJteeglOepticpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muWcqOadoeebruS4reWKoOWFpeWOn+WIm+eglOepticsICforablkYrvvJrlnKjmop3nm67kuK3liqDlhaXljp/libXnoJTnqbYnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctb3Bvdic6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov53lj43lrqLop4Lljp/liJknLCAn6YGV5Y+N5a6i6KeA5Y6f5YmHJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya6L+d5Y+N5a6i6KeC5Y6f5YiZJywgJ+azqOaEj++8mumBleWPjeWuouingOWOn+WJhycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov53lj43lrqLop4Lljp/liJknLCAn6YGV5Y+N5a6i6KeA5Y6f5YmHJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya6L+d5Y+N5a6i6KeC5Y6f5YiZJywgJ+itpuWRiu+8mumBleWPjeWuouingOWOn+WJhycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1yZWRpcmVjdCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliJvlu7rnoLTlnY/mgKfnmoTph43lrprlkJEnLCAn5bu656uL56C05aOe5oCn55qE6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Yib5bu656C05Z2P5oCn55qE6YeN5a6a5ZCRJywgJ+azqOaEj++8muW7uueri+egtOWjnuaAp+eahOmHjeWumuWQkScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliJvlu7rmgbbmhI/ph43lrprlkJEnLCAn5bu656uL5oOh5oSP6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5Yib5bu65oG25oSP6YeN5a6a5ZCRJywgJ+itpuWRiu+8muW7uueri+aDoeaEj+mHjeWumuWQkScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy11cGxvYWQnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LiK5Lyg5LiN5b2T5Zu+5YOPJywgJ+S4iuWCs+S4jeeVtuWcluWDjycpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muS4iuS8oOS4jeW9k+WbvuWDjycsICfms6jmhI/vvJrkuIrlgrPkuI3nlbblnJblg48nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LiK5Lyg5LiN5b2T5Zu+5YOPJywgJ+S4iuWCs+S4jeeVtuWcluWDjycpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muS4iuS8oOS4jeW9k+WbvuWDjycsICforablkYrvvJrkuIrlgrPkuI3nlbblnJblg48nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctdmFuZGFsaXNtJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aYjuaYvueahOegtOWdjycsICfmmI7poa/nmoTnoLTlo54nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrmmI7mmL7noLTlnY8nLCAn5rOo5oSP77ya5piO6aGv56C05aOeJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aYjuaYvueahOegtOWdjycsICfmmI7poa/nmoTnoLTlo54nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrmmI7mmL7noLTlnY8nLCAn6K2m5ZGK77ya5piO6aGv56C05aOeJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LXRkZWwnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Zyo6Zeu6aKY5LuN5pyq6Kej5Yaz55qE5oOF5Ya15LiL56e76Zmk57u05oqk5oCn5qih5p2/Jyxcblx0XHRcdFx0XHRcdFx0XHQn5Zyo5ZWP6aGM5LuN5pyq6Kej5rG655qE5oOF5rOB5LiL56e76Zmk57at6K235oCn5qih5p2/J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muenu+mZpOe7tOaKpOaAp+aooeadvycsICfms6jmhI/vvJrnp7vpmaTntq3orbfmgKfmqKHmnb8nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Zyo6Zeu6aKY5LuN5pyq6Kej5Yaz55qE5oOF5Ya15LiL56e76Zmk57u05oqk5oCn5qih5p2/Jyxcblx0XHRcdFx0XHRcdFx0XHQn5Zyo5ZWP6aGM5LuN5pyq6Kej5rG655qE5oOF5rOB5LiL56e76Zmk57at6K235oCn5qih5p2/J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muenu+mZpOe7tOaKpOaAp+aooeadvycsICforablkYrvvJrnp7vpmaTntq3orbfmgKfmqKHmnb8nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGNhdGVnb3J5OiB3aW5kb3cud2dVTFMoJ+WinuWKoOW5v+WRiicsICflop7liqDlu6PlkYonKSxcblx0XHRcdFx0bGlzdDoge1xuXHRcdFx0XHRcdCd1dy1zcGFtJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WinuWKoOS4jeWQiOmAgueahOWklumDqOmTvuaOpScsICflop7liqDkuI3lkIjpgannmoTlpJbpg6jpgKPntZAnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrlop7liqDkuI3lkIjpgILnmoTlpJbpg6jpk77mjqUnLCAn5rOo5oSP77ya5aKe5Yqg5LiN5ZCI6YGp55qE5aSW6YOo6YCj57WQJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WinuWKoOWeg+WcvumTvuaOpScsICflop7liqDlnoPlnL7pgKPntZAnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrlop7liqDlnoPlnL7pk77mjqUnLCAn6K2m5ZGK77ya5aKe5Yqg5Z6D5Zy+6YCj57WQJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LWFkdmVydCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKnnlKjmsYLpl7vnmb7np5HmnaXlj5HluIPlub/lkYrmiJbmjqjlub8nLCAn5Yip55So5rGC6IGe55m+56eR5L6G55m85biD5buj5ZGK5oiW5o6o5bujJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5Yip55So5rGC6Ze755m+56eR5p2l5Y+R5biD5bm/5ZGK5oiW5o6o5bm/Jyxcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5Yip55So5rGC6IGe55m+56eR5L6G55m85biD5buj5ZGK5oiW5o6o5bujJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKnnlKjmsYLpl7vnmb7np5HmnaXlj5HluIPlub/lkYrmiJbmjqjlub8nLCAn5Yip55So5rGC6IGe55m+56eR5L6G55m85biD5buj5ZGK5oiW5o6o5bujJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Yip55So5rGC6Ze755m+56eR5p2l5Y+R5biD5bm/5ZGK5oiW5o6o5bm/Jyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Yip55So5rGC6IGe55m+56eR5L6G55m85biD5buj5ZGK5oiW5o6o5bujJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Y2F0ZWdvcnk6IHdpbmRvdy53Z1VMUygn5Yqg5o+S5LiN5a6e44CB6K+96LCk5paH5a2XJywgJ+WKoOaPkuS4jeWvpuOAgeiqueisl+aWh+WtlycpLFxuXHRcdFx0XHRsaXN0OiB7XG5cdFx0XHRcdFx0J3V3LWJpb2cnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Zyo5Lq654mp5Lyg6K6w5Lit5Yqg5YWl5rKh5pyJ5Y+v6Z2g5p2l5rqQ5L2Q6K+B6ICM5LiU5Y+v6IO95byV5Y+R5LqJ6K6u55qE5YaF5a65Jyxcblx0XHRcdFx0XHRcdFx0XHQn5Zyo5Lq654mp5YKz6KiY5Lit5Yqg5YWl5rKS5pyJ5Y+v6Z2g5L6G5rqQ5L2Q6K2J6ICM5LiU5Y+v6IO95byV55m854it6K2w55qE5YWn5a65J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muWcqOS6uueJqeS8oOiusOS4reWKoOWFpeayoeacieWPr+mdoOadpea6kOS9kOivgeiAjOS4lOWPr+iDveW8leWPkeS6ieiurueahOWGheWuuScsXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muWcqOS6uueJqeWCs+iomOS4reWKoOWFpeaykuacieWPr+mdoOS+hua6kOS9kOitieiAjOS4lOWPr+iDveW8leeZvOeIreitsOeahOWFp+WuuSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Zyo5Lq654mp5Lyg6K6w5Lit5Yqg5YWl5rKh5pyJ5Y+v6Z2g5p2l5rqQ5L2Q6K+B6ICM5LiU5Y+v6IO95byV5Y+R5LqJ6K6u55qE5YaF5a65Jyxcblx0XHRcdFx0XHRcdFx0XHQn5Zyo5Lq654mp5YKz6KiY5Lit5Yqg5YWl5rKS5pyJ5Y+v6Z2g5L6G5rqQ5L2Q6K2J6ICM5LiU5Y+v6IO95byV55m854it6K2w55qE5YWn5a65J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muWcqOS6uueJqeS8oOiusOS4reWKoOWFpeayoeacieWPr+mdoOadpea6kOS9kOivgeiAjOS4lOWPr+iDveW8leWPkeS6ieiurueahOWGheWuuScsXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muWcqOS6uueJqeWCs+iomOS4reWKoOWFpeaykuacieWPr+mdoOS+hua6kOS9kOitieiAjOS4lOWPr+iDveW8leeZvOeIreitsOeahOWFp+WuuSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctZXJyb3InOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pWF5oSP5Yqg5YWl5LiN5a6e5YaF5a65JywgJ+aVheaEj+WKoOWFpeS4jeWvpuWFp+WuuScpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muaVheaEj+WKoOWFpeS4jeWunuWGheWuuScsICfms6jmhI/vvJrmlYXmhI/liqDlhaXkuI3lr6blhaflrrknKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pWF5oSP5Yqg5YWl5LiN5a6e5YaF5a65JywgJ+aVheaEj+WKoOWFpeS4jeWvpuWFp+WuuScpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muaVheaEj+WKoOWFpeS4jeWunuWGheWuuScsICforablkYrvvJrmlYXmhI/liqDlhaXkuI3lr6blhaflrrknKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctdW5zb3VyY2VkJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeayoeacieWPr+mdoOadpea6kOS9kOivgeeahOWGheWuuScsICfliqDlhaXmspLmnInlj6/pnaDkvobmupDkvZDorYnnmoTlhaflrrknKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrliqDlhaXmsqHmnInlj6/pnaDmnaXmupDkvZDor4HnmoTlhoXlrrknLFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrliqDlhaXmspLmnInlj6/pnaDkvobmupDkvZDorYnnmoTlhaflrrknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeayoeacieWPr+mdoOadpea6kOS9kOivgeeahOWGheWuuScsICfliqDlhaXmspLmnInlj6/pnaDkvobmupDkvZDorYnnmoTlhaflrrknKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrliqDlhaXmsqHmnInlj6/pnaDmnaXmupDkvZDor4HnmoTlhoXlrrknLFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrliqDlhaXmspLmnInlj6/pnaDkvobmupDkvZDorYnnmoTlhaflrrknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRjYXRlZ29yeTogd2luZG93LndnVUxTKCfnv7vor5Hlk4HotKgnLCAn57+76K2v5ZOB6LOqJyksXG5cdFx0XHRcdGxpc3Q6IHtcblx0XHRcdFx0XHQndXctcm91Z2h0cmFuc2xhdGlvbic6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmgqjnv7vor5HnmoTotKjph4/mnInlvoXmlLnlloQnLCAn5oKo57+76K2v55qE6LOq6YeP5pyJ5b6F5pS55ZaEJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5oKo57+76K+R55qE6LSo6YeP5pyJ5b6F5pS55ZaEJywgJ+azqOaEj++8muaCqOe/u+itr+eahOizqumHj+acieW+heaUueWWhCcpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnspfliqPnv7vor5EnLCAn57KX5Yqj57+76K2vJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya57KX5Yqj57+76K+RJywgJ+itpuWRiu+8mueyl+WKo+e/u+itrycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Y2F0ZWdvcnk6IHdpbmRvdy53Z1VMUygn6Z2e6IO95o6l5Y+X5LiU6L+d5Y+N5pa56ZKI55qE5Y2V5pa56Z2i6KGM5Li65oiW5pON5L2cJywgJ+mdnuiDveaOpeWPl+S4lOmBleWPjeaWuemHneeahOWWruaWuemdouihjOeCuuaIluaTjeS9nCcpLFxuXHRcdFx0XHRsaXN0OiB7XG5cdFx0XHRcdFx0J3V3LWFmZCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vpmaR7e2FmZH1977yI6aG16Z2i5a2Y5bqf6K6o6K6677yJ5qih5p2/JywgJ+enu+mZpHt7YWZkfX3vvIjpoIHpnaLlrZjlu6LoqI7oq5bvvInmqKHmnb8nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrnp7vpmaR7e2FmZH1977yI6aG16Z2i5a2Y5bqf6K6o6K6677yJ5qih5p2/Jyxcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya56e76Zmke3thZmR9fe+8iOmggemdouWtmOW7ouiojuirlu+8ieaooeadvydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56e76Zmke3thZmR9fe+8iOmhtemdouWtmOW6n+iuqOiuuu+8ieaooeadvycsICfnp7vpmaR7e2FmZH1977yI6aCB6Z2i5a2Y5bui6KiO6KuW77yJ5qih5p2/JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya56e76Zmke3thZmR9fe+8iOmhtemdouWtmOW6n+iuqOiuuu+8ieaooeadvycsXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muenu+mZpHt7YWZkfX3vvIjpoIHpnaLlrZjlu6LoqI7oq5bvvInmqKHmnb8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LW1vcyc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3mgbDlvZPnmoTmnaHnm67moLzlvI/jgIHml6XmnJ/jgIHor63oqIDnrYknLCAn5LiN5oGw55W255qE5qKd55uu5qC85byP44CB5pel5pyf44CB6Kqe6KiA562JJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5LiN5oGw5b2T55qE5p2h55uu5qC85byP44CB5pel5pyf44CB6K+t6KiA562JJyxcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5LiN5oGw55W255qE5qKd55uu5qC85byP44CB5pel5pyf44CB6Kqe6KiA562JJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3mgbDlvZPnmoTmnaHnm67moLzlvI/jgIHml6XmnJ/jgIHor63oqIDnrYknLCAn5LiN5oGw55W255qE5qKd55uu5qC85byP44CB5pel5pyf44CB6Kqe6KiA562JJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5LiN5oGw5b2T55qE5p2h55uu5qC85byP44CB5pel5pyf44CB6K+t6KiA562JJyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5LiN5oGw55W255qE5qKd55uu5qC85byP44CB5pel5pyf44CB6Kqe6KiA562JJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1tb3ZlJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+aXoOaVheenu+WKqOadoeebri/mlrDlkI3np7DkuI3nrKblkIjlkb3lkI3op4TojIMnLFxuXHRcdFx0XHRcdFx0XHRcdCfnhKHmlYXnp7vli5Xmop3nm64v5paw5ZCN56ix5LiN56ym5ZCI5ZG95ZCN6KaP56+EJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muS4jeaBsOW9k+WcsOenu+WKqOmhtemdoicsICfms6jmhI/vvJrkuI3mgbDnlbblnLDnp7vli5XpoIHpnaInKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5oqK6aG16Z2i56e75Yqo5Yiw5LiN5oGw5b2T44CB6L+d5Y+N5ZG95ZCN5bi46KeE5oiW6L+d5Y+N5YWx6K+G55qE5qCH6aKYJyxcblx0XHRcdFx0XHRcdFx0XHQn5oqK6aCB6Z2i56e75YuV5Yiw5LiN5oGw55W244CB6YGV5Y+N5ZG95ZCN5bi46KaP5oiW6YGV5Y+N5YWx6K2Y55qE5qiZ6aGMJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muS4jeaBsOW9k+WcsOenu+WKqOmhtemdoicsICforablkYrvvJrkuI3mgbDnlbblnLDnp7vli5XpoIHpnaInKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctc3BlZWR5Jzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+enu+mZpHt7ZGVsZXRlfX3vvIjlv6vpgJ/liKDpmaTvvInmqKHmnb8nLCAn56e76Zmke3tkZWxldGV9fe+8iOW/q+mAn+WIqumZpO+8ieaooeadvycpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muenu+mZpHt7ZGVsZXRlfX3vvIjlv6vpgJ/liKDpmaTvvInmqKHmnb8nLFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrnp7vpmaR7e2RlbGV0ZX1977yI5b+r6YCf5Yiq6Zmk77yJ5qih5p2/J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vpmaR7e2RlbGV0ZX1977yI5b+r6YCf5Yig6Zmk77yJ5qih5p2/JywgJ+enu+mZpHt7ZGVsZXRlfX3vvIjlv6vpgJ/liKrpmaTvvInmqKHmnb8nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrnp7vpmaR7e2RlbGV0ZX1977yI5b+r6YCf5Yig6Zmk77yJ5qih5p2/Jyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya56e76Zmke3tkZWxldGV9fe+8iOW/q+mAn+WIqumZpO+8ieaooeadvydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctdGFsa3BhZ2UnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6L+d5Y+N6K6o6K666aG16KeE6IyDJywgJ+mBleWPjeiojuirlumggeimj+evhCcpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8mui/neWPjeiuqOiuuumhteinhOiMgycsICfms6jmhI/vvJrpgZXlj43oqI7oq5bpoIHopo/nr4QnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6L+d5Y+N6K6o6K666aG16KeE6IyDJywgJ+mBleWPjeiojuirlumggeimj+evhCcpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8mui/neWPjeiuqOiuuumhteinhOiMgycsICforablkYrvvJrpgZXlj43oqI7oq5bpoIHopo/nr4QnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctdHB2Jzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn5L+u5pS55LuW5Lq655WZ6KiAJyxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogJ+azqOaEj++8muS/ruaUueS7luS6uueVmeiogCcsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn5L+u5pS55LuW5Lq655WZ6KiAJyxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogJ+itpuWRiu+8muS/ruaUueS7luS6uueVmeiogCcsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRjYXRlZ29yeTogd2luZG93LndnVUxTKCflr7nlhbbku5bnlKjmiLflkozmnaHnm67nmoTmgIHluqYnLCAn5bCN5YW25LuW55So5oi25ZKM5qKd55uu55qE5oWL5bqmJyksXG5cdFx0XHRcdGxpc3Q6IHtcblx0XHRcdFx0XHQndXctaWxsZWdhbCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliqDlhaXkuI3nrKblkIjkuK3lm73ku7flgLzop4LnmoTlhoXlrrknLCAn5Yqg5YWl5LiN56ym5ZCI5Lit5ZyL5YO55YC86KeA55qE5YWn5a65JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5Yqg5YWl5LiN56ym5ZCI5Lit5Zu95Lu35YC86KeC55qE5YaF5a65Jyxcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5Yqg5YWl5LiN56ym5ZCI5Lit5ZyL5YO55YC86KeA55qE5YWn5a65J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliqDlhaXkuI3nrKblkIjkuK3lm73ku7flgLzop4LnmoTlhoXlrrknLCAn5Yqg5YWl5LiN56ym5ZCI5Lit5ZyL5YO55YC86KeA55qE5YWn5a65JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Yqg5YWl5LiN56ym5ZCI5Lit5Zu95Lu35YC86KeC55qE5YaF5a65Jyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Yqg5YWl5LiN56ym5ZCI5Lit5ZyL5YO55YC86KeA55qE5YWn5a65J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1vd24nOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Li75byg5p2h55uu5omA5pyJ5p2DJywgJ+S4u+W8teaineebruaJgOacieasiicpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muS4u+W8oOadoeebruaJgOacieadgycsICfms6jmhI/vvJrkuLvlvLXmop3nm67miYDmnInmrIonKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Li75byg5p2h55uu55qE5omA5pyJ5p2DJywgJ+S4u+W8teaineebrueahOaJgOacieasiicpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muS4u+W8oOadoeebrueahOaJgOacieadgycsICforablkYrvvJrkuLvlvLXmop3nm67nmoTmiYDmnInmrIonKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctc29jaWFsbWVkaWEnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCG5rGC6Ze755m+56eR5b2T5L2c56S+5Lqk5aqS5L2T5L2/55SoJywgJ+Wwh+axguiBnueZvuenkeeVtuS9nOekvuS6pOWqkumrlOS9v+eUqCcpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muWwhuaxgumXu+eZvuenkeW9k+S9nOekvuS6pOWqkuS9k+S9v+eUqCcsXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muWwh+axguiBnueZvuenkeeVtuS9nOekvuS6pOWqkumrlOS9v+eUqCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCG5rGC6Ze755m+56eR5b2T5L2c56S+5Lqk5aqS5L2T5L2/55SoJywgJ+Wwh+axguiBnueZvuenkeeVtuS9nOekvuS6pOWqkumrlOS9v+eUqCcpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muWwhuaxgumXu+eZvuenkeW9k+S9nOekvuS6pOWqkuS9k+S9v+eUqCcsXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muWwh+axguiBnueZvuenkeeVtuS9nOekvuS6pOWqkumrlOS9v+eUqCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XSxcblx0XHRzaW5nbGVub3RpY2U6IHtcblx0XHRcdCd1dy0ycmVkaXJlY3QnOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOenu+WKqOmhtemdouWQjuW6lOivpeS/ruWkjeWPjOmHjemHjeWumuWQkScsICflnKjnp7vli5XpoIHpnaLlvozmh4noqbLkv67lvqnpm5nph43ph43lrprlkJEnKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrlnKjnp7vliqjpobXpnaLlkI7lupTor6Xkv67lpI3lj4zph43ph43lrprlkJEnLCAn5rOo5oSP77ya5Zyo56e75YuV6aCB6Z2i5b6M5oeJ6Kmy5L+u5b6p6ZuZ6YeN6YeN5a6a5ZCRJyksXG5cdFx0XHR9LFxuXHRcdFx0J3V3LWFpdic6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Li+5oql5LqL6aG55bm25LiN5piv56C05Z2P6KGM5Li6JywgJ+iIieWgseS6i+mgheS4puS4jeaYr+egtOWjnuihjOS4uicpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muS4jeaBsOW9k+WcsOS4vuaKpeegtOWdjycsICfms6jmhI/vvJrkuI3mgbDnlbblnLDoiInloLHnoLTlo54nKSxcblx0XHRcdH0sXG5cdFx0XHQndXctYXJ0aWNsZXNpZyc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5p2h55uu5Lit562+5ZCNJywgJ+WcqOaineebruS4reewveWQjScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWcqOadoeebruS4reetvuWQjScsICfms6jmhI/vvJrlnKjmop3nm67kuK3nsL3lkI0nKSxcblx0XHRcdH0sXG5cdFx0XHQndXctYXV0b2Jpb2dyYXBoeSc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yib5bu66Ieq5LygJywgJ+W7uueri+iHquWCsycpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWIm+W7uuiHquS8oCcsICfms6jmhI/vvJrlu7rnq4voh6rlgrMnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctYmFkY2F0Jzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliqDlhaXplJnor6/nmoTpobXpnaLliIbnsbsnLCAn5Yqg5YWl6Yyv6Kqk55qE6aCB6Z2i5YiG6aGeJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Yqg5YWl6ZSZ6K+v55qE6aG16Z2i5YiG57G7JywgJ+azqOaEj++8muWKoOWFpemMr+iqpOeahOmggemdouWIhumhnicpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1iaXRlJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkvKTlrrPmlrDmiYsnLCAn5YK35a6z5paw5omLJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Lyk5a6z5paw5omLJywgJ+azqOaEj++8muWCt+Wus+aWsOaJiycpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1jaGluZXNlJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fkvb/nlKjmoIflh4bmsYnor63msp/pgJonLCAn6KuL5L2/55So5qiZ5rqW5ryi6Kqe5rqd6YCaJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya6K+35L2/55So5qCH5YeG5rGJ6K+t5rKf6YCaJywgJ+azqOaEj++8muiri+S9v+eUqOaomea6lua8ouiqnua6nemAmicpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1jcG1vdmUnOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WJqui0tOenu+WKqCcsICfliarosrznp7vli5UnKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrliarotLTnp7vliqgnLCAn5rOo5oSP77ya5Ymq6LK856e75YuVJyksXG5cdFx0XHR9LFxuXHRcdFx0J3V3LWRhYic6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5raI5q2n5LmJ6aG15qC85byP6ZSZ6K+vJywgJ+a2iOatp+e+qemggeagvOW8j+mMr+iqpCcpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8mua2iOatp+S5iemhteagvOW8j+mUmeivrycsICfms6jmhI/vvJrmtojmrafnvqnpoIHmoLzlvI/pjK/oqqQnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctbmV3cGFnZS1kcmFmdCc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pyA6L+R5Yib5bu655qE6aG16Z2i6KKr56e75Yqo5Yiw6I2J56i/JywgJ+acgOi/keW7uueri+eahOmggemdouiiq+enu+WLleWIsOiNieeovycpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muacgOi/keWIm+W7uueahOmhtemdouiiq+enu+WKqOWIsOiNieeovycsICfms6jmhI/vvJrmnIDov5Hlu7rnq4vnmoTpoIHpnaLooqvnp7vli5XliLDojYnnqL8nKSxcblx0XHRcdH0sXG5cdFx0XHQndXctc2VsZnJldmVydCc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5oSf6LCi5oKo6Ieq6KGM5Zue6YCA6Ieq5bex55qE5rWL6K+V77yM5Lul5ZCO5LiN6KaB5YaN6L+Z5qC35YGa5LqGJyxcblx0XHRcdFx0XHQn5oSf6Kyd5oKo6Ieq6KGM5Zue6YCA6Ieq5bex55qE5ris6Kmm77yM5Lul5b6M5LiN6KaB5YaN6YCZ5qij5YGa5LqGJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWbnumAgOS4quS6uueahOa1i+ivlScsICfms6jmhI/vvJrlm57pgIDlgIvkurrnmoTmuKzoqaYnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctc3Vic3R1Yic6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yib5bu65bCP5bCP5L2c5ZOBJywgJ+W7uueri+Wwj+Wwj+S9nOWTgScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muWIm+W7uuWwj+Wwj+S9nOWTgScsICforablkYrvvJrlu7rnq4vlsI/lsI/kvZzlk4EnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctdGFsa2luYXJ0aWNsZSc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5p2h55uu6aG15Lit55WZ5LiL5oSP6KeBJywgJ+WcqOaineebrumggeS4reeVmeS4i+aEj+imiycpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWcqOadoeebrumhteS4reeVmeS4i+aEj+ingScsICfms6jmhI/vvJrlnKjmop3nm67poIHkuK3nlZnkuIvmhI/oposnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctdW5zaWduZWQnOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ayoeacieWcqOiuqOiuuumhteS4iuetvuWQjScsICfmspLmnInlnKjoqI7oq5bpoIHkuIrnsL3lkI0nKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrmsqHmnInlnKjorqjorrrpobXkuIrnrb7lkI0nLCAn5rOo5oSP77ya5rKS5pyJ5Zyo6KiO6KuW6aCB5LiK57C95ZCNJyksXG5cdFx0XHR9LFxuXHRcdFx0J3V3LXdyb25nY3NkJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflv6vpgJ/liKDpmaTnkIbnlLHkuI3lvZMnLCAn5b+r6YCf5Yiq6Zmk55CG55Sx5LiN55W2JyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5b+r6YCf5Yig6Zmk55CG55Sx5LiN5b2TJywgJ+azqOaEj++8muW/q+mAn+WIqumZpOeQhueUseS4jeeVticpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy13cm9uZ3N1bW1hcnknOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOe8lui+keaRmOimgeWItumAoOS4jemAguW9k+eahOWGheWuuScsICflnKjnt6jovK/mkZjopoHoo73pgKDkuI3pgannlbbnmoTlhaflrrknKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrlnKjnvJbovpHmkZjopoHliLbpgKDkuI3pgILlvZPnmoTlhoXlrrknLCAn6K2m5ZGK77ya5Zyo57eo6Lyv5pGY6KaB6KO96YCg5LiN6YGp55W255qE5YWn5a65JyksXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0c2luZ2xld2Fybjoge1xuXHRcdFx0J3V3LTNycic6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5oi35r2c5Zyo6L+d5Y+N5Zue6YCA5LiN6L+H5LiJ5Y6f5YiZ55qE5Y+v6IO95oCnJywgJ+eUqOaItua9m+WcqOmBleWPjeWbnumAgOS4jemBjuS4ieWOn+WJh+eahOWPr+iDveaApycpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+itpuWRiu+8mueUqOaIt+a9nOWcqOi/neWPjeWbnumAgOS4jei/h+S4ieWOn+WImeeahOWPr+iDveaApycsXG5cdFx0XHRcdFx0J+itpuWRiu+8mueUqOaItua9m+WcqOmBleWPjeWbnumAgOS4jemBjuS4ieWOn+WJh+eahOWPr+iDveaApydcblx0XHRcdFx0KSxcblx0XHRcdH0sXG5cdFx0XHQndXctYXR0YWNrJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkurrouqvmlLvlh7snLCAn5Lq66Lqr5pS75pOKJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5Lq66Lqr5pS75Ye7JywgJ+itpuWRiu+8muS6uui6q+aUu+aTiicpLFxuXHRcdFx0XHRzdXBwcmVzc0FydGljbGVJblN1bW1hcnk6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0J3V3LWNvaSc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yip55uK5Yay56qBJywgJ+WIqeebiuihneeqgScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWIqeebiuWGsueqgScsICfms6jmhI/vvJrliKnnm4rooZ3nqoEnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctZmFrZXNvdXJjZSc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Jma5p6E5pWw5o2u5rqQ5oiW5byV5paHJywgJ+iZm+ani+izh+aWmeS+hua6kOaIluW8leaWhycpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muiZmuaehOaVsOaNrua6kOaIluW8leaWhycsICforablkYrvvJromZvmp4vos4fmlpnkvobmupDmiJblvJXmlocnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctcGluZm8nOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W8oOi0tOS7luS6uumakOengScsICflvLXosrzku5bkurrpmrHnp4EnKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrlvKDotLTku5bkurrpmpDnp4EnLCAn6K2m5ZGK77ya5by16LK85LuW5Lq66Zqx56eBJyksXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH07XG5cdC8vIFVzZWQgcmVwZWF0ZWRseSBiZWxvdyBhY3Jvc3MgbWVudSByZWJ1aWxkc1xuXHRUd2lua2xlLndhcm4ucHJldl9hcnRpY2xlID0gbnVsbDtcblx0VHdpbmtsZS53YXJuLnByZXZfcmVhc29uID0gbnVsbDtcblx0VHdpbmtsZS53YXJuLnRhbGtwYWdlT2JqID0gbnVsbDtcblx0VHdpbmtsZS53YXJuLmNhbGxiYWNrLmNoYW5nZV9jYXRlZ29yeSA9IGZ1bmN0aW9uIGNoYW5nZV9jYXRlZ29yeShlKSB7XG5cdFx0Y29uc3Qge3ZhbHVlfSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHtzdWJfZ3JvdXB9ID0gZS50YXJnZXQucm9vdDtcblx0XHRzdWJfZ3JvdXAubWFpbl9ncm91cCA9IHZhbHVlO1xuXHRcdGxldCBvbGRfc3VidmFsdWUgPSBzdWJfZ3JvdXAudmFsdWU7XG5cdFx0bGV0IG9sZF9zdWJ2YWx1ZV9yZTtcblx0XHRpZiAob2xkX3N1YnZhbHVlKSB7XG5cdFx0XHRpZiAodmFsdWUgPT09ICdraXRjaGVuc2luaycpIHtcblx0XHRcdFx0Ly8gRXhhY3QgbWF0Y2ggcG9zc2libGUgaW4ga2l0Y2hlbnNpbmsgbWVudVxuXHRcdFx0XHRvbGRfc3VidmFsdWVfcmUgPSBuZXcgUmVnRXhwKG13LnV0aWwuZXNjYXBlUmVnRXhwKG9sZF9zdWJ2YWx1ZSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b2xkX3N1YnZhbHVlID0gb2xkX3N1YnZhbHVlLnJlcGxhY2UoL1xcZCooaW0pPyQvLCAnJyk7XG5cdFx0XHRcdG9sZF9zdWJ2YWx1ZV9yZSA9IG5ldyBSZWdFeHAoYCR7bXcudXRpbC5lc2NhcGVSZWdFeHAob2xkX3N1YnZhbHVlKX0oXFxcXGQqPykkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlIChzdWJfZ3JvdXAuaGFzQ2hpbGROb2RlcygpKSB7XG5cdFx0XHRzdWJfZ3JvdXAucmVtb3ZlQ2hpbGQoc3ViX2dyb3VwLmZpcnN0Q2hpbGQpO1xuXHRcdH1cblx0XHRsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcblx0XHQvLyB3b3JrZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBjb21ibyBib3ggZW50cmllc1xuXHRcdGNvbnN0IGNyZWF0ZUVudHJpZXMgPSAoY29udGVudHMsIGNvbnRhaW5lciwgd3JhcEluT3B0Z3JvdXAsIHZhbCA9IHZhbHVlKSA9PiB7XG5cdFx0XHQvLyBsZXZlbDItPjIsIHNpbmdsZXdhcm4tPicnOyBhbHNvIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG5cdFx0XHQvLyBzY2FsZWQgbGV2ZWxzIGZyb20gc2luZ2xlbm90aWNlLCBzaW5nbGV3YXJuLCBhbmQgY3VzdG9tXG5cdFx0XHRjb25zdCBsZXZlbCA9IHZhbC5yZXBsYWNlKC9eXFxEKy9nLCAnJyk7XG5cdFx0XHQvLyBkdWUgdG8gYW4gYXBwYXJlbnQgaU9TIGJ1Zywgd2UgaGF2ZSB0byBhZGQgYW4gb3B0aW9uLWdyb3VwIHRvIHByZXZlbnQgdHJ1bmNhdGlvbiBvZiB0ZXh0XG5cdFx0XHQvLyAoc2VhcmNoIFdUOlRXIGFyY2hpdmVzIGZvciBcIlByb2JsZW0gc2VsZWN0aW5nIHdhcm5pbmdzIG9uIGFuIGlQaG9uZVwiKVxuXHRcdFx0aWYgKHdyYXBJbk9wdGdyb3VwICYmICQuY2xpZW50LnByb2ZpbGUoKS5wbGF0Zm9ybSA9PT0gJ2lwaG9uZScpIHtcblx0XHRcdFx0bGV0IHdyYXBwZXJPcHRncm91cCA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ29wdGdyb3VwJyxcblx0XHRcdFx0XHRsYWJlbDogJ+WPr+eUqOaooeadvycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3cmFwcGVyT3B0Z3JvdXAgPSB3cmFwcGVyT3B0Z3JvdXAucmVuZGVyKCk7XG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZCh3cmFwcGVyT3B0Z3JvdXApO1xuXHRcdFx0XHRjb250YWluZXIgPSB3cmFwcGVyT3B0Z3JvdXA7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IFtpdGVtS2V5LCBpdGVtUHJvcGVydGllc10gb2YgT2JqZWN0LmVudHJpZXMoY29udGVudHMpKSB7XG5cdFx0XHRcdC8vIFNraXAgaWYgdGhlIGN1cnJlbnQgdGVtcGxhdGUgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBmb3IgdGhlIGN1cnJlbnQgbGV2ZWxcblx0XHRcdFx0aWYgKCEhbGV2ZWwgJiYgIWl0ZW1Qcm9wZXJ0aWVzW3ZhbF0pIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qga2V5ID0gdHlwZW9mIGl0ZW1LZXkgPT09ICdzdHJpbmcnID8gaXRlbUtleSA6IGl0ZW1Qcm9wZXJ0aWVzLnZhbHVlO1xuXHRcdFx0XHRjb25zdCB0ZW1wbGF0ZSA9IGtleSArIGxldmVsO1xuXHRcdFx0XHRjb25zdCBlbGVtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogYHt7JHt0ZW1wbGF0ZX19fTogJHtsZXZlbCA/IGl0ZW1Qcm9wZXJ0aWVzW3ZhbF0ubGFiZWwgOiBpdGVtUHJvcGVydGllcy5sYWJlbH1gLFxuXHRcdFx0XHRcdHZhbHVlOiB0ZW1wbGF0ZSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vIFNlbGVjdCBpdGVtIGJlc3QgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBzZWxlY3Rpb25cblx0XHRcdFx0aWYgKCFzZWxlY3RlZCAmJiBvbGRfc3VidmFsdWUgJiYgb2xkX3N1YnZhbHVlX3JlLnRlc3QodGVtcGxhdGUpKSB7XG5cdFx0XHRcdFx0ZWxlbS5kYXRhLnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRzZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgZWxlbVJlbmRlcmVkID0gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW0ucmVuZGVyKCkpO1xuXHRcdFx0XHQkKGVsZW1SZW5kZXJlZCkuZGF0YSgnbWVzc2FnZURhdGEnLCBpdGVtUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRzd2l0Y2ggKHZhbHVlKSB7XG5cdFx0XHRjYXNlICdzaW5nbGVub3RpY2UnOlxuXHRcdFx0Y2FzZSAnc2luZ2xld2Fybic6XG5cdFx0XHRcdGNyZWF0ZUVudHJpZXMoVHdpbmtsZS53YXJuLm1lc3NhZ2VzW3ZhbHVlXSwgc3ViX2dyb3VwLCB0cnVlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzaW5nbGVjb21iaW5lZCc6IHtcblx0XHRcdFx0Y29uc3QgdW5Tb3J0ZWRTaW5nbGV0cyA9IHtcblx0XHRcdFx0XHQuLi5Ud2lua2xlLndhcm4ubWVzc2FnZXMuc2luZ2xlbm90aWNlLFxuXHRcdFx0XHRcdC4uLlR3aW5rbGUud2Fybi5tZXNzYWdlcy5zaW5nbGV3YXJuLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBzb3J0ZWRTaW5nbGV0TWVzc2FnZXMgPSB7fTtcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModW5Tb3J0ZWRTaW5nbGV0cykuc29ydCgpKSB7XG5cdFx0XHRcdFx0c29ydGVkU2luZ2xldE1lc3NhZ2VzW2tleV0gPSB1blNvcnRlZFNpbmdsZXRzW2tleV07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3JlYXRlRW50cmllcyhzb3J0ZWRTaW5nbGV0TWVzc2FnZXMsIHN1Yl9ncm91cCwgdHJ1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnY3VzdG9tJzpcblx0XHRcdFx0Y3JlYXRlRW50cmllcyhUd2lua2xlLmdldFByZWYoJ2N1c3RvbVdhcm5pbmdMaXN0JyksIHN1Yl9ncm91cCwgdHJ1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAna2l0Y2hlbnNpbmsnOlxuXHRcdFx0XHRmb3IgKGNvbnN0IGx2bCBvZiBbJ2xldmVsMScsICdsZXZlbDInXSkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgbGV2ZWxHcm91cCBvZiBUd2lua2xlLndhcm4ubWVzc2FnZXMubGV2ZWxzKSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVFbnRyaWVzKGxldmVsR3JvdXAubGlzdCwgc3ViX2dyb3VwLCB0cnVlLCBsdmwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRjcmVhdGVFbnRyaWVzKFR3aW5rbGUud2Fybi5tZXNzYWdlcy5zaW5nbGVub3RpY2UsIHN1Yl9ncm91cCwgdHJ1ZSk7XG5cdFx0XHRcdGNyZWF0ZUVudHJpZXMoVHdpbmtsZS53YXJuLm1lc3NhZ2VzLnNpbmdsZXdhcm4sIHN1Yl9ncm91cCwgdHJ1ZSk7XG5cdFx0XHRcdGNyZWF0ZUVudHJpZXMoVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21XYXJuaW5nTGlzdCcpLCBzdWJfZ3JvdXAsIHRydWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2xldmVsMSc6XG5cdFx0XHRjYXNlICdsZXZlbDInOlxuXHRcdFx0XHQvLyBDcmVhdGVzIHN1Ymdyb3VwIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVyZSBpcyBhbnl0aGluZyB0byBwbGFjZSBpbiBpdDtcblx0XHRcdFx0Ly8gbGVhdmVzIFwiUmVtb3ZhbCBvZiBkZWxldGlvbiB0YWdzXCIgZW1wdHkgZm9yIGxldmVsIDJcblx0XHRcdFx0Zm9yIChjb25zdCBsZXZlbEdyb3VwIG9mIFR3aW5rbGUud2Fybi5tZXNzYWdlcy5sZXZlbHMpIHtcblx0XHRcdFx0XHRsZXQgb3B0Z3JvdXAgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ29wdGdyb3VwJyxcblx0XHRcdFx0XHRcdGxhYmVsOiBsZXZlbEdyb3VwLmNhdGVnb3J5LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9wdGdyb3VwID0gb3B0Z3JvdXAucmVuZGVyKCk7XG5cdFx0XHRcdFx0c3ViX2dyb3VwLmFwcGVuZENoaWxkKG9wdGdyb3VwKTtcblx0XHRcdFx0XHQvLyBjcmVhdGUgdGhlIG9wdGlvbnNcblx0XHRcdFx0XHRjcmVhdGVFbnRyaWVzKGxldmVsR3JvdXAubGlzdCwgb3B0Z3JvdXAsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dG9sZXZlbCc6IHtcblx0XHRcdFx0Ly8gQ2hlY2sgdXNlciBwYWdlIHRvIGRldGVybWluZSBhcHByb3ByaWF0ZSBsZXZlbFxuXHRcdFx0XHRjb25zdCBhdXRvbGV2ZWxQcm9jID0gKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHdpa2l0ZXh0ID0gVHdpbmtsZS53YXJuLnRhbGtwYWdlT2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdFx0Ly8gaGlzdG9yeSBub3QgbmVlZGVkIGZvciBhdXRvbGV2ZWxcblx0XHRcdFx0XHRjb25zdCBbbGF0ZXN0XSA9IFR3aW5rbGUud2Fybi5jYWxsYmFja3MuZGF0ZVByb2Nlc3Npbmcod2lraXRleHQpO1xuXHRcdFx0XHRcdC8vIFBzZXVkby1wYXJhbXMgd2l0aCBvbmx5IHdoYXQncyBuZWVkZWQgdG8gcGFyc2UgdGhlIGxldmVsIGkuZS4gbm8gbWVzc2FnZURhdGFcblx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRzdWJfZ3JvdXA6IG9sZF9zdWJ2YWx1ZSxcblx0XHRcdFx0XHRcdGFydGljbGU6IGUudGFyZ2V0LnJvb3QuYXJ0aWNsZS52YWx1ZSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGx2bCA9IGBsZXZlbCR7VHdpbmtsZS53YXJuLmNhbGxiYWNrcy5hdXRvbGV2ZWxQYXJzZVdpa2l0ZXh0KHdpa2l0ZXh0LCBwYXJhbXMsIGxhdGVzdClbMV19YDtcblx0XHRcdFx0XHQvLyBJZGVudGljYWwgdG8gbGV2ZWwxLCBldGMuIGFib3ZlIGJ1dCBleHBsaWNpdGx5IHByb3ZpZGVzIHRoZSBsZXZlbFxuXHRcdFx0XHRcdGZvciAoY29uc3QgbGV2ZWxHcm91cCBvZiBUd2lua2xlLndhcm4ubWVzc2FnZXMubGV2ZWxzKSB7XG5cdFx0XHRcdFx0XHRsZXQgb3B0Z3JvdXAgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0Z3JvdXAnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogbGV2ZWxHcm91cC5jYXRlZ29yeSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b3B0Z3JvdXAgPSBvcHRncm91cC5yZW5kZXIoKTtcblx0XHRcdFx0XHRcdHN1Yl9ncm91cC5hcHBlbmRDaGlsZChvcHRncm91cCk7XG5cdFx0XHRcdFx0XHQvLyBjcmVhdGUgdGhlIG9wdGlvbnNcblx0XHRcdFx0XHRcdGNyZWF0ZUVudHJpZXMobGV2ZWxHcm91cC5saXN0LCBvcHRncm91cCwgZmFsc2UsIGx2bCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIFRyaWdnZXIgc3ViY2F0ZWdvcnkgY2hhbmdlLCBhZGQgc2VsZWN0IG1lbnUsIGV0Yy5cblx0XHRcdFx0XHRUd2lua2xlLndhcm4uY2FsbGJhY2sucG9zdENhdGVnb3J5Q2xlYW51cChlKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKFR3aW5rbGUud2Fybi50YWxrcGFnZU9iaikge1xuXHRcdFx0XHRcdGF1dG9sZXZlbFByb2MoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB1c2VydGFsa19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdGBVc2VyX3RhbGs6JHtyZWxldmFudFVzZXJOYW1lfWAsXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOi9veS4iuasoeitpuWRiicsICfovInlhaXkuIrmrKHorablkYonKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0dXNlcnRhbGtfcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdFx0dXNlcnRhbGtfcGFnZS5sb2FkKFxuXHRcdFx0XHRcdFx0KHBhZ2VvYmopID0+IHtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS53YXJuLnRhbGtwYWdlT2JqID0gcGFnZW9iajsgLy8gVXBkYXRlIHRhbGtwYWdlT2JqXG5cdFx0XHRcdFx0XHRcdGF1dG9sZXZlbFByb2MoKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIENhdGNoIGFuZCB3YXJuIGlmIHRoZSB0YWxrcGFnZSBjYW4ndCBsb2FkLFxuXHRcdFx0XHRcdFx0XHQvLyBtb3N0IGxpa2VseSBiZWNhdXNlIGl0J3MgYSBjcm9zcy1uYW1lc3BhY2UgcmVkaXJlY3Rcblx0XHRcdFx0XHRcdFx0Ly8gU3VwZXJzZWRlcyB0aGUgdHlwaWNhbCAkYXV0b2xldmVsTWVzc2FnZSBhZGRlZCBpbiBhdXRvbGV2ZWxQYXJzZVdpa2l0ZXh0XG5cdFx0XHRcdFx0XHRcdGNvbnN0ICRub1RhbGtQYWdlTm9kZSA9ICQoJzxzdHJvbmc+Jylcblx0XHRcdFx0XHRcdFx0XHQuYXR0cignaWQnLCAndHdpbmtsZS13YXJuLWF1dG9sZXZlbC1tZXNzYWdlJylcblx0XHRcdFx0XHRcdFx0XHQuY3NzKCdjb2xvcicsICcjZjAwJylcblx0XHRcdFx0XHRcdFx0XHQudGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0J+aXoOazleWKoOi9veeUqOaIt+iuqOiuuumhte+8jOi/meWPr+iDveaYr+WboOS4uuWug+aYr+i3qOWRveWQjeepuumXtOmHjeWumuWQke+8jOiHquWKqOmAieaLqeitpuWRiue6p+WIq+WwhuS4jeS8mui/kOS9nOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCfnhKHms5XovInlhaXkvb/nlKjogIXoqI7oq5bpoIHvvIzpgJnlj6/og73mmK/lm6DngrrlroPmmK/ot6jlkb3lkI3nqbrplpPph43mlrDlsI7lkJHvvIzoh6rli5Xpgbjmk4forablkYrntJrliKXlsIfkuI3mnIPpgYvkvZzjgIInXG5cdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0JG5vVGFsa1BhZ2VOb2RlLmluc2VydEJlZm9yZSgkYm9keS5maW5kKCcjdHdpbmtsZS13YXJuLXdhcm5pbmctbWVzc2FnZXMnKSk7XG5cdFx0XHRcdFx0XHRcdC8vIElmIGEgcHJldmlldyB3YXMgb3BlbmVkIHdoaWxlIGluIGEgZGlmZmVyZW50IG1vZGUsIGNsb3NlIGl0XG5cdFx0XHRcdFx0XHRcdC8vIFNob3VsZCBudWxsaWZ5IHRoZSBuZWVkIHRvIGNhdGNoIHRoZSBlcnJvciBpbiBwcmV2aWV3IGNhbGxiYWNrXG5cdFx0XHRcdFx0XHRcdGUudGFyZ2V0LnJvb3QucHJldmlld2VyLmNsb3NlUHJldmlldygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ3R3aW5rbGV3YXJu77ya5pyq55+l55qE6K2m5ZGK57uEJywgJ3R3aW5rbGV3YXJu77ya5pyq55+l55qE6K2m5ZGK57WEJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZXdhcm4nLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIFRyaWdnZXIgc3ViY2F0ZWdvcnkgY2hhbmdlLCBhZGQgc2VsZWN0IG1lbnUsIGV0Yy5cblx0XHQvLyBIZXJlIGJlY2F1c2Ugb2YgdGhlIGFzeW5jIGxvYWQgZm9yIGF1dG9sZXZlbFxuXHRcdGlmICh2YWx1ZSAhPT0gJ2F1dG9sZXZlbCcpIHtcblx0XHRcdC8vIHJlc2V0IGFueSBhdXRvbGV2ZWwtc3BlY2lmaWMgbWVzc2FnZXMgd2hpbGUgd2UncmUgaGVyZVxuXHRcdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtd2Fybi1hdXRvbGV2ZWwtbWVzc2FnZScpLnJlbW92ZSgpO1xuXHRcdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrLnBvc3RDYXRlZ29yeUNsZWFudXAoZSk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLndhcm4uY2FsbGJhY2sucG9zdENhdGVnb3J5Q2xlYW51cCA9IChlKSA9PiB7XG5cdFx0Ly8gY2xlYXIgb3ZlcnJpZGRlbiBsYWJlbCBvbiBhcnRpY2xlIHRleHRib3hcblx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFRvb2x0aXBWaXNpYmlsaXR5KGUudGFyZ2V0LnJvb3QuYXJ0aWNsZSwgdHJ1ZSk7XG5cdFx0TW9yZWJpdHMucXVpY2tGb3JtLnJlc2V0RWxlbWVudExhYmVsKGUudGFyZ2V0LnJvb3QuYXJ0aWNsZSk7XG5cdFx0Ly8gVHJpZ2dlciBjdXN0b20gbGFiZWwvY2hhbmdlIG9uIG1haW4gY2F0ZWdvcnkgY2hhbmdlXG5cdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrLmNoYW5nZV9zdWJjYXRlZ29yeShlKTtcblx0XHQvLyBVc2Ugc2VsZWN0MiB0byBtYWtlIHRoZSBzZWxlY3QgbWVudSBzZWFyY2hhYmxlXG5cdFx0aWYgKCFUd2lua2xlLmdldFByZWYoJ29sZFNlbGVjdCcpKSB7XG5cdFx0XHQkYm9keVxuXHRcdFx0XHQuZmluZCgnc2VsZWN0W25hbWU9c3ViX2dyb3VwXScpXG5cdFx0XHRcdC5zZWxlY3QyKHtcblx0XHRcdFx0XHR3aWR0aDogJzEwMCUnLFxuXHRcdFx0XHRcdG1hdGNoZXI6IE1vcmViaXRzLnNlbGVjdDIubWF0Y2hlcnMub3B0Z3JvdXBGdWxsLFxuXHRcdFx0XHRcdHRlbXBsYXRlUmVzdWx0OiBNb3JlYml0cy5zZWxlY3QyLmhpZ2hsaWdodFNlYXJjaE1hdGNoZXMsXG5cdFx0XHRcdFx0bGFuZ3VhZ2U6IHtcblx0XHRcdFx0XHRcdHNlYXJjaGluZzogTW9yZWJpdHMuc2VsZWN0Mi5xdWVyeUludGVyY2VwdG9yLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jaGFuZ2UoVHdpbmtsZS53YXJuLmNhbGxiYWNrLmNoYW5nZV9zdWJjYXRlZ29yeSk7XG5cdFx0XHQkYm9keS5maW5kKCcuc2VsZWN0Mi1zZWxlY3Rpb24nKS5vbigna2V5ZG93bicsIE1vcmViaXRzLnNlbGVjdDIuYXV0b1N0YXJ0KS50cmlnZ2VyKCdmb2N1cycpO1xuXHRcdFx0bXcudXRpbC5hZGRDU1MoXG5cdFx0XHRcdC8qIEluY3JlYXNlIGhlaWdodDtcblx0XHRcdFx0ICogUmVkdWNlIHBhZGRpbmc7XG5cdFx0XHRcdCAqIEFkanVzdCBmb250IHNpemUuXG5cdFx0XHRcdCAqICovXG5cdFx0XHRcdCcuc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdDItZHJvcGRvd24gLnNlbGVjdDItcmVzdWx0cz4uc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25ze21heC1oZWlnaHQ6MzUwcHh9LnNlbGVjdDItcmVzdWx0cyAuc2VsZWN0Mi1yZXN1bHRzX19ncm91cCwuc2VsZWN0Mi1yZXN1bHRzIC5zZWxlY3QyLXJlc3VsdHNfX29wdGlvbntwYWRkaW5nLXRvcDoxcHg7cGFkZGluZy1ib3R0b206MXB4fS5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0Mi1kcm9wZG93biAuc2VsZWN0Mi1yZXN1bHRzLC5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0aW9uIC5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWR7Zm9udC1zaXplOjEzcHh9J1xuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUud2Fybi5jYWxsYmFjay5jaGFuZ2Vfc3ViY2F0ZWdvcnkgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IG1haW5fZ3JvdXAgPSBlLnRhcmdldC5mb3JtLm1haW5fZ3JvdXAudmFsdWU7XG5cdFx0Y29uc3Qge3ZhbHVlfSA9IGUudGFyZ2V0LmZvcm0uc3ViX2dyb3VwO1xuXHRcdC8vIFRhZ3MgdGhhdCBkb24ndCB0YWtlIGEgbGlua2VkIGFydGljbGUsIGJ1dCBzb21ldGhpbmcgZWxzZSAob2Z0ZW4gYSB1c2VybmFtZSkuXG5cdFx0Ly8gVGhlIHZhbHVlIG9mIGVhY2ggdGFnIGlzIHRoZSBsYWJlbCBuZXh0IHRvIHRoZSBpbnB1dCBmaWVsZFxuXHRcdGNvbnN0IG5vdExpbmtlZEFydGljbGUgPSB7XG5cdFx0XHQndXctYml0ZSc6IHdpbmRvdy53Z1VMUygn6KKr4oCc5ZKs5Yiw4oCd55qE55So5oi377yI5LiN5ZCrVXNlcjrvvIkgJywgJ+iiq+OAjOWSrOWIsOOAjeeahOS9v+eUqOiAhe+8iOS4jeWQq1VzZXI677yJICcpLFxuXHRcdFx0J3V3LWFpdic6IHdpbmRvdy53Z1VMUygn5Y+v6YCJ6L6T5YWl6KKr6K2m5ZGK55qE55So5oi35ZCN77yI5LiN5ZCrVXNlcjrvvIkgJywgJ+WPr+mBuOi8uOWFpeiiq+itpuWRiueahOS9v+eUqOiAheWQjeeose+8iOS4jeWQq1VzZXI677yJICcpLFxuXHRcdH07XG5cdFx0aWYgKFsnc2luZ2xlbm90aWNlJywgJ3NpbmdsZXdhcm4nLCAnc2luZ2xlY29tYmluZWQnLCAna2l0Y2hlbnNpbmsnXS5pbmNsdWRlcyhtYWluX2dyb3VwKSkge1xuXHRcdFx0aWYgKG5vdExpbmtlZEFydGljbGVbdmFsdWVdKSB7XG5cdFx0XHRcdGlmIChUd2lua2xlLndhcm4ucHJldl9hcnRpY2xlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS53YXJuLnByZXZfYXJ0aWNsZSA9IGUudGFyZ2V0LmZvcm0uYXJ0aWNsZS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlLnRhcmdldC5mb3JtLmFydGljbGUubm90QXJ0aWNsZSA9IHRydWU7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uYXJ0aWNsZS52YWx1ZSA9ICcnO1xuXHRcdFx0XHQvLyBjaGFuZ2UgZm9ybSBsYWJlbHMgYWNjb3JkaW5nIHRvIHRoZSB3YXJuaW5nIHNlbGVjdGVkXG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VG9vbHRpcFZpc2liaWxpdHkoZS50YXJnZXQuZm9ybS5hcnRpY2xlLCBmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5vdmVycmlkZUVsZW1lbnRMYWJlbChlLnRhcmdldC5mb3JtLmFydGljbGUsIG5vdExpbmtlZEFydGljbGVbdmFsdWVdKTtcblx0XHRcdH0gZWxzZSBpZiAoZS50YXJnZXQuZm9ybS5hcnRpY2xlLm5vdEFydGljbGUpIHtcblx0XHRcdFx0aWYgKFR3aW5rbGUud2Fybi5wcmV2X2FydGljbGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRlLnRhcmdldC5mb3JtLmFydGljbGUudmFsdWUgPSBUd2lua2xlLndhcm4ucHJldl9hcnRpY2xlO1xuXHRcdFx0XHRcdFR3aW5rbGUud2Fybi5wcmV2X2FydGljbGUgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uYXJ0aWNsZS5ub3RBcnRpY2xlID0gZmFsc2U7XG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VG9vbHRpcFZpc2liaWxpdHkoZS50YXJnZXQuZm9ybS5hcnRpY2xlLCB0cnVlKTtcblx0XHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnJlc2V0RWxlbWVudExhYmVsKGUudGFyZ2V0LmZvcm0uYXJ0aWNsZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGFkZCBiaWcgcmVkIG5vdGljZSwgd2FybmluZyB1c2VycyBhYm91dCBob3cgdG8gdXNlIHt7dXctW2NvaS1ddXNlcm5hbWV9fSBhcHByb3ByaWF0ZWx5XG5cdFx0JGJvZHkuZmluZCgnI3R3LXdhcm4tcmVkLW5vdGljZScpLnJlbW92ZSgpO1xuXHR9O1xuXHRUd2lua2xlLndhcm4uY2FsbGJhY2tzID0ge1xuXHRcdGdldFdhcm5pbmdXaWtpdGV4dDogKHRlbXBsYXRlTmFtZSwgYXJ0aWNsZSwgcmVhc29uLCBpc0N1c3RvbSwgbm9TaWduKSA9PiB7XG5cdFx0XHRsZXQgdGV4dCA9ICd7eycuY29uY2F0KCdzdWJzdDonLCB0ZW1wbGF0ZU5hbWUpO1xuXHRcdFx0Ly8gYWRkIGxpbmtlZCBhcnRpY2xlIGZvciB1c2VyIHdhcm5pbmdzXG5cdFx0XHRpZiAoYXJ0aWNsZSkge1xuXHRcdFx0XHR0ZXh0ICs9IGB8MT0ke2FydGljbGV9YDtcblx0XHRcdH1cblx0XHRcdGlmIChyZWFzb24pIHtcblx0XHRcdFx0Ly8gYWRkIGV4dHJhIG1lc3NhZ2Vcblx0XHRcdFx0dGV4dCArPSBgfDI9JHtyZWFzb259YDtcblx0XHRcdH1cblx0XHRcdHRleHQgKz0gJ3xzdWJzdD0nLmNvbmNhdCgnc3Vic3Q6Jyk7XG5cdFx0XHRpZiAoIW5vU2lnbikge1xuXHRcdFx0XHR0ZXh0ICs9ICd8c2lnPX5+Jy5jb25jYXQoJ35+Jyk7XG5cdFx0XHR9XG5cdFx0XHR0ZXh0ICs9ICd9fSc7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9LFxuXHRcdHNob3dQcmV2aWV3OiAoZm9ybSwgdGVtcGxhdGVuYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBpbnB1dCA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZm9ybSk7XG5cdFx0XHQvLyBQcm92aWRlZCBvbiBhdXRvbGV2ZWwsIG5vdCBvdGhlcndpc2Vcblx0XHRcdHRlbXBsYXRlbmFtZSB8fD0gaW5wdXQuc3ViX2dyb3VwO1xuXHRcdFx0Y29uc3QgbGlua2VkYXJ0aWNsZSA9IGlucHV0LmFydGljbGU7XG5cdFx0XHRjb25zdCB0ZW1wbGF0ZXRleHQgPSBUd2lua2xlLndhcm4uY2FsbGJhY2tzLmdldFdhcm5pbmdXaWtpdGV4dChcblx0XHRcdFx0dGVtcGxhdGVuYW1lLFxuXHRcdFx0XHRsaW5rZWRhcnRpY2xlLFxuXHRcdFx0XHRpbnB1dC5yZWFzb24sXG5cdFx0XHRcdGlucHV0Lm1haW5fZ3JvdXAgPT09ICdjdXN0b20nXG5cdFx0XHQpO1xuXHRcdFx0Zm9ybS5wcmV2aWV3ZXIuYmVnaW5SZW5kZXIodGVtcGxhdGV0ZXh0LCBgVXNlcl90YWxrOiR7cmVsZXZhbnRVc2VyTmFtZX1gKTsgLy8gRm9yY2Ugd2lraXRleHQvY29ycmVjdCB1c2VybmFtZVxuXHRcdH0sXG5cblx0XHQvLyBKdXN0IGEgcGFzcy10aHJvdWdoIHVubGVzcyB0aGUgYXV0b2xldmVsIG9wdGlvbiB3YXMgc2VsZWN0ZWRcblx0XHRwcmV2aWV3OiAoZm9ybSkgPT4ge1xuXHRcdFx0aWYgKGZvcm0ubWFpbl9ncm91cC52YWx1ZSA9PT0gJ2F1dG9sZXZlbCcpIHtcblx0XHRcdFx0Ly8gQWx3YXlzIGdldCBhIG5ldywgdXBkYXRlZCB0YWxrcGFnZSBmb3IgYXV0b2xldmVsIHByb2Nlc3Npbmdcblx0XHRcdFx0Y29uc3QgdXNlcnRhbGtfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0YFVzZXJfdGFsazoke3JlbGV2YW50VXNlck5hbWV9YCxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOi9veS4iuasoeitpuWRiicsICfovInlhaXkuIrmrKHorablkYonKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR1c2VydGFsa19wYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0Ly8gV2lsbCBmYWlsIHNpbGVudGx5IGlmIHRoZSB0YWxrIHBhZ2UgaXMgYSBjcm9zcy1ucyByZWRpcmVjdCxcblx0XHRcdFx0Ly8gcmVtb3ZhbCBvZiB0aGUgcHJldmlldyBib3ggaGFuZGxlZCB3aGVuIGxvYWRpbmcgdGhlIG1lbnVcblx0XHRcdFx0dXNlcnRhbGtfcGFnZS5sb2FkKChwYWdlb2JqKSA9PiB7XG5cdFx0XHRcdFx0VHdpbmtsZS53YXJuLnRhbGtwYWdlT2JqID0gcGFnZW9iajsgLy8gVXBkYXRlIHRhbGtwYWdlT2JqXG5cdFx0XHRcdFx0Y29uc3Qgd2lraXRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdFx0Ly8gaGlzdG9yeSBub3QgbmVlZGVkIGZvciBhdXRvbGV2ZWxcblx0XHRcdFx0XHRjb25zdCBbbGF0ZXN0XSA9IFR3aW5rbGUud2Fybi5jYWxsYmFja3MuZGF0ZVByb2Nlc3Npbmcod2lraXRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHN1Yl9ncm91cDogZm9ybS5zdWJfZ3JvdXAudmFsdWUsXG5cdFx0XHRcdFx0XHRhcnRpY2xlOiBmb3JtLmFydGljbGUudmFsdWUsXG5cdFx0XHRcdFx0XHRtZXNzYWdlRGF0YTogJChmb3JtLnN1Yl9ncm91cClcblx0XHRcdFx0XHRcdFx0LmZpbmQoYG9wdGlvblt2YWx1ZT1cIiR7JChmb3JtLnN1Yl9ncm91cCkudmFsKCl9XCJdYClcblx0XHRcdFx0XHRcdFx0LmRhdGEoJ21lc3NhZ2VEYXRhJyksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBbdGVtcGxhdGVdID0gVHdpbmtsZS53YXJuLmNhbGxiYWNrcy5hdXRvbGV2ZWxQYXJzZVdpa2l0ZXh0KHdpa2l0ZXh0LCBwYXJhbXMsIGxhdGVzdCk7XG5cdFx0XHRcdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrcy5zaG93UHJldmlldyhmb3JtLCB0ZW1wbGF0ZSk7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHRlbXBsYXRlcyBoYXZlIGRpdmVyZ2VkLCBmYWtlIGEgY2hhbmdlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gdG8gcmVsb2FkIHRoZSBtZW51IHdpdGggdGhlIHVwZGF0ZWQgcGFnZW9ialxuXHRcdFx0XHRcdGlmIChmb3JtLnN1Yl9ncm91cC52YWx1ZSAhPT0gdGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXHRcdFx0XHRcdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRmb3JtLm1haW5fZ3JvdXAuZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRUd2lua2xlLndhcm4uY2FsbGJhY2tzLnNob3dQcmV2aWV3KGZvcm0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogVXNlZCBpbiB0aGUgbWFpbiBhbmQgYXV0b2xldmVsIGxvb3BzIHRvIGRldGVybWluZSB3aGVuIHRvIHdhcm5cblx0XHQgKiBhYm91dCBleGNlc3NpdmVseSByZWNlbnQsIHN0YWxlLCBvciBpZGVudGljYWwgd2FybmluZ3MuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gd2lraXRleHQgIFRoZSB0ZXh0IG9mIGEgdXNlcidzIHRhbGsgcGFnZSwgZnJvbSBnZXRQYWdlVGV4dCgpXG5cdFx0ICogQHJldHVybnMge09iamVjdFtdfSAtIEFycmF5IG9mIG9iamVjdHM6IGxhdGVzdCBjb250YWlucyBtb3N0IHJlY2VudFxuXHRcdCAqIHdhcm5pbmcgYW5kIGRhdGU7IGhpc3RvcnkgbGlzdHMgYWxsIHByaW9yIHdhcm5pbmdzXG5cdFx0ICovXG5cdFx0ZGF0ZVByb2Nlc3Npbmc6ICh3aWtpdGV4dCkgPT4ge1xuXHRcdFx0Y29uc3QgaGlzdG9yeV9yZSA9XG5cdFx0XHRcdC88IS0tXFxzP1RlbXBsYXRlOihbdVVddy0uKj8pXFxzPy0tPi4qPyhcXGR7NH0p5bm0KFxcZHsxLDJ9KeaciChcXGR7MSwyfSnml6UgXFwoW+aXpeS4gOS6jOS4ieWbm+S6lOWFrV1cXCkgKFxcZHsxLDJ9KTooXFxkezEsMn0pIFxcKENTVFxcKS9nO1xuXHRcdFx0Y29uc3QgaGlzdG9yeSA9IHt9O1xuXHRcdFx0Y29uc3QgbGF0ZXN0ID0ge1xuXHRcdFx0XHRkYXRlOiBuZXcgTW9yZWJpdHMuZGF0ZSgwKSxcblx0XHRcdFx0dHlwZTogJycsXG5cdFx0XHR9O1xuXHRcdFx0bGV0IGN1cnJlbnQ7XG5cdFx0XHR3aGlsZSAoKGN1cnJlbnQgPSBoaXN0b3J5X3JlLmV4ZWMod2lraXRleHQpKSAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb25zdCBbLCB0ZW1wbGF0ZV0gPSBjdXJyZW50O1xuXHRcdFx0XHRjb25zdCBjdXJyZW50X2RhdGUgPSBuZXcgTW9yZWJpdHMuZGF0ZShcblx0XHRcdFx0XHRgJHtjdXJyZW50WzJdfS0ke2N1cnJlbnRbM119LSR7Y3VycmVudFs0XX0gJHtjdXJyZW50WzVdfToke2N1cnJlbnRbNl19IChDU1QpYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoISh0ZW1wbGF0ZSBpbiBoaXN0b3J5KSB8fCBoaXN0b3J5W3RlbXBsYXRlXS5pc0JlZm9yZShjdXJyZW50X2RhdGUpKSB7XG5cdFx0XHRcdFx0aGlzdG9yeVt0ZW1wbGF0ZV0gPSBjdXJyZW50X2RhdGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFsYXRlc3QuZGF0ZS5pc0FmdGVyKGN1cnJlbnRfZGF0ZSkpIHtcblx0XHRcdFx0XHRsYXRlc3QuZGF0ZSA9IGN1cnJlbnRfZGF0ZTtcblx0XHRcdFx0XHRsYXRlc3QudHlwZSA9IHRlbXBsYXRlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2xhdGVzdCwgaGlzdG9yeV07XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBNYWluIGxvb3AgZm9yIGRlY2lkaW5nIHdoYXQgdGhlIGxldmVsIHNob3VsZCBpbmNyZW1lbnQgdG8uIE1vc3Qgb2Zcblx0XHQgKiB0aGlzIGlzIHJlYWxseSBqdXN0IGVycm9yIGNhdGNoaW5nIGFuZCB1cGRhdGluZyB0aGUgc3Vic2VxdWVudCBkYXRhLlxuXHRcdCAqIE1heSBwcm9kdWNlIHVwIHRvIHR3byBub3RpY2VzIGluIGEgdHdpbmtsZS13YXJuLWF1dG9sZXZlbC1tZXNzYWdlcyBkaXZcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB3aWtpdGV4dCAgVGhlIHRleHQgb2YgYSB1c2VyJ3MgdGFsayBwYWdlLCBmcm9tIGdldFBhZ2VUZXh0KCkgKHJlcXVpcmVkKVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgIFBhcmFtcyBvYmplY3Q6IHN1Yl9ncm91cCBpcyB0aGUgdGVtcGxhdGUgKHJlcXVpcmVkKTtcblx0XHQgKiBhcnRpY2xlIGlzIHRoZSB1c2VyLXByb3ZpZGVkIGFydGljbGUgKGZvcm0uYXJ0aWNsZSkgdXNlZCB0byBsaW5rIEFSViBvbiByZWNlbnQgbGV2ZWwyIHdhcm5pbmdzO1xuXHRcdCAqIG1lc3NhZ2VEYXRhIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIGdldHRpbmcgdGhlIGZ1bGwgdGVtcGxhdGUsIGFzIGl0J3Ncblx0XHQgKiB1c2VkIHRvIGVuc3VyZSBhIHZhbGlkIHRlbXBsYXRlIG9mIHRoYXQgbGV2ZWwgZXhpc3RzXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxhdGVzdCAgRmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgZnJvbVxuXHRcdCAqIGRhdGVQcm9jZXNzaW5nLiBQcm92aWRlZCBoZXJlIHJhdGhlciB0aGFuIHByb2Nlc3NlZCB3aXRoaW4gdG8gYXZvaWRcblx0XHQgKiByZXBlYXRlZCBjYWxsIHRvIGRhdGVQcm9jZXNzaW5nXG5cdFx0ICogQHBhcmFtIHsoRGF0ZXxNb3JlYml0cy5kYXRlKX0gZGF0ZSAgRGF0ZSBmcm9tIHdoaWNoIHN0YWxlbmVzcyBpcyBkZXRlcm1pbmVkXG5cdFx0ICogQHBhcmFtIHtNb3JlYml0cy5zdGF0dXN9IHN0YXRlbGVtICBTdGF0dXMgZWxlbWVudCwgb25seSB1c2VkIGZvciBoYW5kbGluZyBlcnJvciBpbiBmaW5hbCBleGVjdXRpb25cblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtBcnJheX0gLSBBcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmdWxsIHRlbXBsYXRlIGFuZCBqdXN0IHRoZSB3YXJuaW5nIGxldmVsXG5cdFx0ICovXG5cdFx0YXV0b2xldmVsUGFyc2VXaWtpdGV4dDogKHdpa2l0ZXh0LCBwYXJhbXMsIGxhdGVzdCwgZGF0ZSwgc3RhdGVsZW0pID0+IHtcblx0XHRcdGxldCBsZXZlbDsgLy8gdW5kZWZpbmVkIHJhdGhlciB0aGFuICcnIG1lYW5zIHRoZSBpc05hTiBiZWxvdyB3aWxsIHJldHVybiB0cnVlXG5cdFx0XHRpZiAoL1xcZD8kLy50ZXN0KGxhdGVzdC50eXBlKSkge1xuXHRcdFx0XHQvLyBsZXZlbDEtMlxuXHRcdFx0XHRsZXZlbCA9IE51bWJlci5wYXJzZUludChsYXRlc3QudHlwZS5yZXBsYWNlKC8uKihcXGQpPyQvLCAnJDEnKSwgMTApO1xuXHRcdFx0fSBlbHNlIGlmIChsYXRlc3QudHlwZSkge1xuXHRcdFx0XHRsZXZlbCA9IDE7IC8vIHNpbmdsZW5vdGljZSBvciBub3QgZm91bmRcblx0XHRcdH1cblx0XHRcdGNvbnN0ICRhdXRvbGV2ZWxNZXNzYWdlID0gJCgnPGRpdj4nKS5hdHRyKCdpZCcsICd0d2lua2xlLXdhcm4tYXV0b2xldmVsLW1lc3NhZ2UnKTtcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4obGV2ZWwpKSB7XG5cdFx0XHRcdC8vIE5vIHByaW9yIHdhcm5pbmdzIGZvdW5kLCB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdFx0XHRsZXZlbCA9IDE7XG5cdFx0XHR9IGVsc2UgaWYgKGxldmVsID4gMiB8fCBsZXZlbCA8IDEpIHtcblx0XHRcdFx0Ly8gU2hvdWxkbid0IGhhcHBlblxuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfml6Dms5Xop6PmnpDkuIrmrKHnmoTorablkYrlsYLnuqfvvIzor7fmiYvliqjpgInmi6nkuIDkuKrorablkYrlsYLnuqfjgIInLFxuXHRcdFx0XHRcdCfnhKHms5Xop6PmnpDkuIrmrKHnmoTorablkYrlsaTntJrvvIzoq4vmiYvli5Xpgbjmk4fkuIDlgIvorablkYrlsaTntJrjgIInXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChzdGF0ZWxlbSkge1xuXHRcdFx0XHRcdHN0YXRlbGVtLmVycm9yKG1lc3NhZ2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KG1lc3NhZ2UsIHtcblx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGV3YXJuJyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRlIHx8PSBuZXcgRGF0ZSgpO1xuXHRcdFx0XHRjb25zdCBhdXRvVGltZW91dCA9IG5ldyBNb3JlYml0cy5kYXRlKGxhdGVzdC5kYXRlLmdldFRpbWUoKSkuYWRkKFxuXHRcdFx0XHRcdE51bWJlci5wYXJzZUludChUd2lua2xlLmdldFByZWYoJ2F1dG9sZXZlbFN0YWxlRGF5cycpLCAxMCksXG5cdFx0XHRcdFx0J2RheSdcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGF1dG9UaW1lb3V0LmlzQWZ0ZXIoZGF0ZSkpIHtcblx0XHRcdFx0XHRpZiAobGV2ZWwgPT09IDIpIHtcblx0XHRcdFx0XHRcdGxldmVsID0gMjtcblx0XHRcdFx0XHRcdC8vIEJhc2ljYWxseSBpbmRpY2F0ZXMgd2hldGhlciB3ZSdyZSBpbiB0aGUgZmluYWwgTWFpbiBldmFsdWF0aW9uIG9yIG5vdCxcblx0XHRcdFx0XHRcdC8vIGFuZCB0aHVzIHdoZXRoZXIgd2UgY2FuIGNvbnRpbnVlIG9yIG5lZWQgdG8gZGlzcGxheSB0aGUgd2FybmluZyBhbmQgbGlua1xuXHRcdFx0XHRcdFx0aWYgKCFzdGF0ZWxlbSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCAkbGluayA9ICQoJzxhPicpXG5cdFx0XHRcdFx0XHRcdFx0LmF0dHIoJ2hyZWYnLCAnIycpXG5cdFx0XHRcdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCfljZXlh7vmraTlpITmiZPlvIDlkYrnirblt6XlhbcnLCAn6bue5pOK5q2k6JmV5omT6ZaL5ZGK54uA5bel5YW3JykpXG5cdFx0XHRcdFx0XHRcdFx0LmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpXG5cdFx0XHRcdFx0XHRcdFx0Lm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0XHRcdFR3aW5rbGUud2Fybi5kaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFR3aW5rbGUuYXJ2LmNhbGxiYWNrKHJlbGV2YW50VXNlck5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0JGJvZHkuZmluZCgnaW5wdXRbbmFtZT1wYWdlXScpLnZhbChwYXJhbXMuYXJ0aWNsZSk7IC8vIFRhcmdldCBwYWdlXG5cdFx0XHRcdFx0XHRcdFx0XHQkYm9keS5maW5kKCdpbnB1dFt2YWx1ZT1maW5hbF0nKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7IC8vIFZhbmRhbGlzbSBhZnRlciBmaW5hbFxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN0YXR1c05vZGUgPSAkKCc8ZGl2PicpXG5cdFx0XHRcdFx0XHRcdFx0LmNzcygnY29sb3InLCAnI2YwMCcpXG5cdFx0XHRcdFx0XHRcdFx0LnRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRyZWxldmFudFVzZXJOYW1lICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmnIDlkI7mlLbliLDkuobkuIDkuKrlsYLnuqcy6K2m5ZGK77yIJywgJ+acgOW+jOaUtuWIsOS6huS4gOWAi+WxpOe0mjLorablkYrvvIgnKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhdGVzdC50eXBlICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCfvvInvvIzmiYDku6XlsIblhbbmiqXlkYrnu5nnrqHnkIbkurrlkZjkvJrmr5TovoPlpb3vvJsnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCfvvInvvIzmiYDku6XlsIflhbbloLHlkYrntabnrqHnkIbkurrlk6HmnIPmr5TovIPlpb3vvJsnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRzdGF0dXNOb2RlLmFwcGVuZCgkbGlua1swXSk7XG5cdFx0XHRcdFx0XHRcdCRhdXRvbGV2ZWxNZXNzYWdlLmFwcGVuZChzdGF0dXNOb2RlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gQXV0b21hdGljYWxseSBpbmNyZWFzZSBzZXZlcml0eVxuXHRcdFx0XHRcdFx0bGV2ZWwgKz0gMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gUmVzZXQgd2FybmluZyBsZXZlbCBpZiBtb3N0LXJlY2VudCB3YXJuaW5nIGlzIHRvbyBvbGRcblx0XHRcdFx0XHRsZXZlbCA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdCRhdXRvbGV2ZWxNZXNzYWdlLnByZXBlbmQoXG5cdFx0XHRcdCQoXG5cdFx0XHRcdFx0YDxkaXY+JHt3aW5kb3cud2dVTFMoJ+WwhuWPkemAgScsICflsIfnmbzpgIEnKX08c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkO1wiPiR7d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+Wxgue6pycsXG5cdFx0XHRcdFx0XHQn5bGk57SaJ1xuXHRcdFx0XHRcdCl9JHtsZXZlbH08L3NwYW4+6K2m5ZGK5qih5p2/44CCPC9kaXY+YFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0Ly8gUGxhY2UgYWZ0ZXIgdGhlIHN0YWxlIGFuZCBvdGhlci11c2VyLXJldmVydGVkICh0ZXh0LW9ubHkpIG1lc3NhZ2VzXG5cdFx0XHQkYm9keS5maW5kKCcjdHdpbmtsZS13YXJuLWF1dG9sZXZlbC1tZXNzYWdlJykucmVtb3ZlKCk7IC8vIGNsZWFuIHNsYXRlXG5cdFx0XHQkYXV0b2xldmVsTWVzc2FnZS5pbnNlcnRBZnRlcigkYm9keS5maW5kKCcjdHdpbmtsZS13YXJuLXdhcm5pbmctbWVzc2FnZXMnKSk7XG5cdFx0XHRsZXQgdGVtcGxhdGUgPSBwYXJhbXMuc3ViX2dyb3VwLnJlcGxhY2UoLyguKilcXGQkLywgJyQxJyk7XG5cdFx0XHQvLyBWYWxpZGF0ZSB3YXJuaW5nIGxldmVsLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHV3LWdlbmVyaWMgc2VyaWVzLlxuXHRcdFx0Ly8gT25seSBhIGZldyBpdGVtcyBhcmUgbWlzc2luZyBhIGxldmVsLCBhbmQgaW4gYWxsIGJ1dCBhIGhhbmRmdWxcblx0XHRcdC8vIG9mIGNhc2VzLCB0aGUgdXctZ2VuZXJpYyBzZXJpZXMgaXMgZXhwbGljaXRseSB1c2VkIGVsc2V3aGVyZS5cblx0XHRcdGlmIChwYXJhbXMubWVzc2FnZURhdGEgJiYgIXBhcmFtcy5tZXNzYWdlRGF0YVtgbGV2ZWwke2xldmVsfWBdKSB7XG5cdFx0XHRcdHRlbXBsYXRlID0gJ3V3LWdlbmVyaWMnO1xuXHRcdFx0fVxuXHRcdFx0dGVtcGxhdGUgKz0gbGV2ZWw7XG5cdFx0XHRyZXR1cm4gW3RlbXBsYXRlLCBsZXZlbF07XG5cdFx0fSxcblx0XHRtYWluOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IHN0YXRlbGVtID0gcGFnZW9iai5nZXRTdGF0dXNFbGVtZW50KCk7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0bGV0IHttZXNzYWdlRGF0YX0gPSBwYXJhbXM7XG5cdFx0XHRjb25zdCB3YXJuaW5nSGlzdG9yeSA9IFR3aW5rbGUud2Fybi5jYWxsYmFja3MuZGF0ZVByb2Nlc3NpbmcodGV4dCk7XG5cdFx0XHRjb25zdCBbbGF0ZXN0LCBoaXN0b3J5XSA9IHdhcm5pbmdIaXN0b3J5O1xuXHRcdFx0Y29uc3Qgbm93ID0gbmV3IE1vcmViaXRzLmRhdGUocGFnZW9iai5nZXRMb2FkVGltZSgpKTtcblx0XHRcdFR3aW5rbGUud2Fybi50YWxrcGFnZU9iaiA9IHBhZ2VvYmo7IC8vIFVwZGF0ZSB0YWxrcGFnZU9iaiwganVzdCBpbiBjYXNlXG5cdFx0XHRpZiAocGFyYW1zLm1haW5fZ3JvdXAgPT09ICdhdXRvbGV2ZWwnKSB7XG5cdFx0XHRcdC8vIFt0ZW1wbGF0ZSwgbGV2ZWxdXG5cdFx0XHRcdGNvbnN0IHRlbXBsYXRlQW5kTGV2ZWwgPSBUd2lua2xlLndhcm4uY2FsbGJhY2tzLmF1dG9sZXZlbFBhcnNlV2lraXRleHQoXG5cdFx0XHRcdFx0dGV4dCxcblx0XHRcdFx0XHRwYXJhbXMsXG5cdFx0XHRcdFx0bGF0ZXN0LFxuXHRcdFx0XHRcdG5vdyxcblx0XHRcdFx0XHRzdGF0ZWxlbVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBPbmx5IGlmIHRoZXJlJ3MgYSBjaGFuZ2UgZnJvbSB0aGUgcHJpb3IgZGlzcGxheS9sb2FkXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRwYXJhbXMuc3ViX2dyb3VwICE9PSB0ZW1wbGF0ZUFuZExldmVsWzBdICYmXG5cdFx0XHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WwhuWPkemAgee7meeUqOaIt3t7JywgJ+Wwh+eZvOmAgee1puS9v+eUqOiAhXt7JykgK1xuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZUFuZExldmVsWzBdICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCd9feaooeadv++8jOWlveWQl++8nycsICd9feaooeadv++8jOWlveWXju+8nycpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iCcsICfkvb/nlKjogIXlj5bmtognKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFVwZGF0ZSBwYXJhbXMgbm93IHRoYXQgd2UndmUgc2VsZWN0ZWQgYSB3YXJuaW5nXG5cdFx0XHRcdFtwYXJhbXMuc3ViX2dyb3VwXSA9IHRlbXBsYXRlQW5kTGV2ZWw7XG5cdFx0XHRcdG1lc3NhZ2VEYXRhID0gcGFyYW1zLm1lc3NhZ2VEYXRhW2BsZXZlbCR7dGVtcGxhdGVBbmRMZXZlbFsxXX1gXTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdHBhcmFtcy5zdWJfZ3JvdXAgaW4gaGlzdG9yeSAmJlxuXHRcdFx0XHRuZXcgTW9yZWJpdHMuZGF0ZShoaXN0b3J5W3BhcmFtcy5zdWJfZ3JvdXBdKS5hZGQoMSwgJ2RheScpLmlzQWZ0ZXIobm93KSAmJlxuXHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+i/kTI05bCP5pe25YaF5LiA5Liq5ZCM5qC355qEICcsICfov5EyNOWwj+aZguWFp+S4gOWAi+WQjOaoo+eahCAnKSArXG5cdFx0XHRcdFx0XHRwYXJhbXMuc3ViX2dyb3VwICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOaooeadv+W3suiiq+WPkeWHuuOAglxcbuaYr+WQpue7p+e7re+8nycsICcg5qih5p2/5bey6KKr55m85Ye644CCXFxu5piv5ZCm57m857qM77yfJylcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHN0YXRlbGVtLmVycm9yKHdpbmRvdy53Z1VMUygn55So5oi35Y+W5raIJywgJ+S9v+eUqOiAheWPlua2iCcpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGF0ZXN0LmRhdGUuYWRkKDEsICdtaW51dGUnKTsgLy8gYWZ0ZXIgbG9uZyBkZWJhdGUsIG9uZSBtaW51dGUgaXMgbWF4XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGxhdGVzdC5kYXRlLmlzQWZ0ZXIobm93KSAmJlxuXHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+i/kTHliIbpkp/lhoUgJywgJ+i/kTHliIbpkJjlhacgJykgK1xuXHRcdFx0XHRcdFx0bGF0ZXN0LnR5cGUgK1xuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCcg5qih5p2/5bey6KKr5Y+R5Ye644CCXFxu5piv5ZCm57un57ut77yfJywgJyDmqKHmnb/lt7Looqvnmbzlh7rjgIJcXG7mmK/lkKbnubznuozvvJ8nKVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfnlKjmiLflj5bmtognLCAn5L2/55So6ICF5Y+W5raIJykpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBidWlsZCB0aGUgZWRpdCBzdW1tYXJ5XG5cdFx0XHQvLyBGdW5jdGlvbiB0byBoYW5kbGUgZ2VuZXJhdGlvbiBvZiBzdW1tYXJ5IHByZWZpeCBmb3IgY3VzdG9tIHRlbXBsYXRlc1xuXHRcdFx0Y29uc3QgY3VzdG9tUHJvY2VzcyA9ICh0ZW1wbGF0ZSkgPT4ge1xuXHRcdFx0XHRbdGVtcGxhdGVdID0gdGVtcGxhdGUuc3BsaXQoJ3wnKTtcblx0XHRcdFx0bGV0IHByZWZpeDtcblx0XHRcdFx0c3dpdGNoICh0ZW1wbGF0ZS5zbGljZSgtMSkpIHtcblx0XHRcdFx0XHRjYXNlICcxJzpcblx0XHRcdFx0XHRcdHByZWZpeCA9ICfms6jmhI8nO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnMic6XG5cdFx0XHRcdFx0XHRwcmVmaXggPSAn6K2m5ZGKJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdC8vIGZhbGxzIHRocm91Z2hcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cHJlZml4ID0gJ+aPkOmGkic7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYCR7cHJlZml4fe+8miR7TW9yZWJpdHMuc3RyaW5nLnRvVXBwZXJDYXNlRmlyc3RDaGFyKG1lc3NhZ2VEYXRhLmxhYmVsKX1gO1xuXHRcdFx0fTtcblx0XHRcdGxldCBzdW1tYXJ5O1xuXHRcdFx0aWYgKHBhcmFtcy5tYWluX2dyb3VwID09PSAnY3VzdG9tJykge1xuXHRcdFx0XHRzdW1tYXJ5ID0gY3VzdG9tUHJvY2VzcyhwYXJhbXMuc3ViX2dyb3VwKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vcm1hbGl6ZSBraXRjaGVuc2luayB0byB0aGUgMS0yIHN0eWxlXG5cdFx0XHRcdGlmIChwYXJhbXMubWFpbl9ncm91cCA9PT0gJ2tpdGNoZW5zaW5rJyAmJiAhL15EKyQvLnRlc3QocGFyYW1zLnN1Yl9ncm91cCkpIHtcblx0XHRcdFx0XHRsZXQgc3ViID0gcGFyYW1zLnN1Yl9ncm91cC5zbGljZSgtMSk7XG5cdFx0XHRcdFx0aWYgKHN1YiA9PT0gJ20nKSB7XG5cdFx0XHRcdFx0XHRzdWIgPSBwYXJhbXMuc3ViX2dyb3VwLnNsaWNlKC0zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qgb3ZlcndyaXRlIHV3LTNyciwgdGVjaG5pY2FsbHkgdW5uZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoL1xcZC8udGVzdChzdWIpKSB7XG5cdFx0XHRcdFx0XHRwYXJhbXMubWFpbl9ncm91cCA9IGBsZXZlbCR7c3VifWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHNpbmdsZXQgfHwgbGV2ZWwxLTIsIG5vIG5lZWQgdG8gL15cXEQrJC8udGVzdChwYXJhbXMubWFpbl9ncm91cClcblx0XHRcdFx0c3VtbWFyeSA9XG5cdFx0XHRcdFx0bWVzc2FnZURhdGEuc3VtbWFyeSB8fCAobWVzc2FnZURhdGFbcGFyYW1zLm1haW5fZ3JvdXBdICYmIG1lc3NhZ2VEYXRhW3BhcmFtcy5tYWluX2dyb3VwXS5zdW1tYXJ5KTtcblx0XHRcdFx0Ly8gTm90IGluIFR3aW5rbGUud2Fybi5tZXNzYWdlcywgYXNzdW1lIGN1c3RvbSB0ZW1wbGF0ZVxuXHRcdFx0XHRpZiAoIXN1bW1hcnkpIHtcblx0XHRcdFx0XHRzdW1tYXJ5ID0gY3VzdG9tUHJvY2VzcyhwYXJhbXMuc3ViX2dyb3VwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobWVzc2FnZURhdGEuc3VwcHJlc3NBcnRpY2xlSW5TdW1tYXJ5ICE9PSB0cnVlICYmIHBhcmFtcy5hcnRpY2xlKSB7XG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5zdWJfZ3JvdXAgPT09ICd1dy1haXYnKSB7XG5cdFx0XHRcdFx0XHQvLyB0aGVzZSB0ZW1wbGF0ZXMgcmVxdWlyZSBhIHVzZXJuYW1lXG5cdFx0XHRcdFx0XHRzdW1tYXJ5ICs9IGDvvIgke3dpbmRvdy53Z1VMUygn5a+55LqOJywgJ+WwjeaWvCcpfVtbVXNlcjoke3BhcmFtcy5hcnRpY2xlfV1d77yJYDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5zdWJfZ3JvdXAgPT09ICd1dy1iaXRlJykge1xuXHRcdFx0XHRcdFx0Ly8gdGhpcyB0ZW1wbGF0ZSByZXF1aXJlcyBhIHVzZXJuYW1lXG5cdFx0XHRcdFx0XHRzdW1tYXJ5ICs9IGDvvIwke3dpbmRvdy53Z1VMUygn5LqOJywgJ+aWvCcpfVtbVXNlciB0YWxrOiR7cGFyYW1zLmFydGljbGV9XV1gO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdW1tYXJ5ICs9IGAke3dpbmRvdy53Z1VMUygn77yM5LqOW1snLCAn77yM5pa8W1snKSArIHBhcmFtcy5hcnRpY2xlfV1dYDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoc3VtbWFyeSk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hXYXJuaW5ncycpKTtcblx0XHRcdC8vIEdldCBhY3R1YWwgd2FybmluZyB0ZXh0XG5cdFx0XHRjb25zdCB3YXJuaW5nVGV4dCA9IFR3aW5rbGUud2Fybi5jYWxsYmFja3MuZ2V0V2FybmluZ1dpa2l0ZXh0KFxuXHRcdFx0XHRwYXJhbXMuc3ViX2dyb3VwLFxuXHRcdFx0XHRwYXJhbXMuYXJ0aWNsZSxcblx0XHRcdFx0cGFyYW1zLnJlYXNvbixcblx0XHRcdFx0cGFyYW1zLm1haW5fZ3JvdXAgPT09ICdjdXN0b20nXG5cdFx0XHQpO1xuXHRcdFx0bGV0IHNlY3Rpb25FeGlzdHMgPSBmYWxzZTtcblx0XHRcdGxldCBzZWN0aW9uTnVtYmVyID0gMDtcblx0XHRcdC8vIE9ubHkgY2hlY2sgc2VjdGlvbnMgaWYgdGhlcmUgYXJlIHNlY3Rpb25zIG9yIHRoZXJlJ3MgYSBjaGFuY2Ugd2Ugd29uJ3QgY3JlYXRlIG91ciBvd25cblx0XHRcdGlmICghbWVzc2FnZURhdGEuaGVhZGluZyAmJiB0ZXh0Lmxlbmd0aCkge1xuXHRcdFx0XHQvLyBHZXQgYWxsIHNlY3Rpb25zXG5cdFx0XHRcdGNvbnN0IHNlY3Rpb25zID0gdGV4dC5tYXRjaCgvXig9PSopLitcXDEvZ20pO1xuXHRcdFx0XHRpZiAoc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRcdFx0Ly8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHNlY3Rpb24gaGVhZGVyIGluIHF1ZXN0aW9uXG5cdFx0XHRcdFx0Y29uc3QgZGF0ZUhlYWRlclJlZ2V4ID0gbm93Lm1vbnRoSGVhZGVyUmVnZXgoKTtcblx0XHRcdFx0XHRzZWN0aW9uTnVtYmVyID0gMDtcblx0XHRcdFx0XHQvLyBGaW5kIHRoaXMgbW9udGgncyBzZWN0aW9uIGFtb25nIEwyIHNlY3Rpb25zLCBwcmVmZXJyaW5nIHRoZSBib3R0b20tbW9zdFxuXHRcdFx0XHRcdHNlY3Rpb25FeGlzdHMgPSBzZWN0aW9ucy5yZXZlcnNlKCkuc29tZSgoc2VjLCBpZHgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdC9eKD09KVtePV0uK1xcMS9tLnRlc3Qoc2VjKSAmJlxuXHRcdFx0XHRcdFx0XHRkYXRlSGVhZGVyUmVnZXgudGVzdChzZWMpICYmXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiAoc2VjdGlvbk51bWJlciA9IHNlY3Rpb25zLmxlbmd0aCAtIDEgLSBpZHgpID09PSAnbnVtYmVyJ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHNlY3Rpb25FeGlzdHMpIHtcblx0XHRcdFx0Ly8gYXBwZW5kIHRvIGV4aXN0aW5nIHNlY3Rpb25cblx0XHRcdFx0cGFnZW9iai5zZXRQYWdlU2VjdGlvbihzZWN0aW9uTnVtYmVyICsgMSk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0QXBwZW5kVGV4dChgXFxuXFxuJHt3YXJuaW5nVGV4dH1gKTtcblx0XHRcdFx0cGFnZW9iai5hcHBlbmQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChtZXNzYWdlRGF0YS5oZWFkaW5nKSB7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIG5ldyBzZWN0aW9uXG5cdFx0XHRcdFx0cGFnZW9iai5zZXROZXdTZWN0aW9uVGl0bGUobWVzc2FnZURhdGEuaGVhZGluZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyq5om+5Yiw5b2T5pyI55qE5LqM57qn5qCH6aKY77yM5bCG5Yib5bu65paw55qEJywgJ+acquaJvuWIsOeVtuaciOeahOS6jOe0muaomemhjO+8jOWwh+W7uueri+aWsOeahCcpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRwYWdlb2JqLnNldE5ld1NlY3Rpb25UaXRsZShub3cubW9udGhIZWFkZXIoMCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhZ2VvYmouc2V0TmV3U2VjdGlvblRleHQod2FybmluZ1RleHQpO1xuXHRcdFx0XHRwYWdlb2JqLm5ld1NlY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLndhcm4uY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHVzZXJUYWxrUGFnZSA9IGBVc2VyX3RhbGs6JHtyZWxldmFudFVzZXJOYW1lfWA7XG5cdFx0Ly8gcmVhc29uLCBtYWluX2dyb3VwLCBzdWJfZ3JvdXAsIGFydGljbGVcblx0XHRjb25zdCBwYXJhbXMgPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0SW5wdXREYXRhKGUudGFyZ2V0KTtcblx0XHRpZiAocGFyYW1zLmFydGljbGUpIHtcblx0XHRcdGlmICgvaHR0cHM/OlxcL1xcLy8udGVzdChwYXJhbXMuYXJ0aWNsZSkpIHtcblx0XHRcdFx0dm9pZCBtdy5ub3RpZnkod2luZG93LndnVUxTKCfigJzpobXpnaLpk77mjqXigJ3kuI3og73kvb/nlKjnvZHlnYDjgIInLCAn44CM6aCB6Z2i6YCj57WQ44CN5LiN6IO95L2/55So57ay5Z2A44CCJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAnd2FybicsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBhcnRpY2xlID0gbmV3IG13LlRpdGxlKHBhcmFtcy5hcnRpY2xlKTtcblx0XHRcdFx0cGFyYW1zLmFydGljbGUgPSBhcnRpY2xlLmdldFByZWZpeGVkVGV4dCgpO1xuXHRcdFx0XHRpZiAoYXJ0aWNsZS5nZXRGcmFnbWVudCgpKSB7XG5cdFx0XHRcdFx0cGFyYW1zLmFydGljbGUgKz0gYCMke2FydGljbGUuZ2V0RnJhZ21lbnQoKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0YWxlcnQoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+KAnOmhtemdoumTvuaOpeKAneS4jeWQiOazle+8jOS7heiDvei+k+WFpeS4gOS4qumhtemdouWQjeensO+8jOWLv+S9v+eUqOe9keWdgOOAgVtbIF1d77yM5Y+v5L2/55SoU3BlY2lhbDpEaWZm44CCJyxcblx0XHRcdFx0XHRcdCfjgIzpoIHpnaLpgKPntZDjgI3kuI3lkIjms5XvvIzlg4Xog73ovLjlhaXkuIDlgIvpoIHpnaLlkI3nqLHvvIzli7/kvb/nlKjntrLlnYDjgIFbWyBdXe+8jOWPr+S9v+eUqFNwZWNpYWw6RGlmZuOAgidcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gVGhlIGF1dG9sZXZlbCBvcHRpb24gd2lsbCBhbHJlYWR5IGtub3cgYnkgbm93IGlmIGEgdXNlciB0YWxrIHBhZ2Vcblx0XHQvLyBpcyBhIGNyb3NzLW5hbWVzcGFjZSByZWRpcmVjdCAodmlhICEhVHdpbmtsZS53YXJuLnRhbGtwYWdlT2JqKSwgc29cblx0XHQvLyB0ZWNobmljYWxseSB3ZSBjb3VsZCBhbGVydCBhbiBlcnJvciBoZXJlLCBidXQgdGhlIHVzZXIgd2lsbCBoYXZlXG5cdFx0Ly8gYWxyZWFkeSBpZ25vcmVkIHRoZSBib2xkIHJlZCBlcnJvciBhYm92ZS4gTW9yZW92ZXIsIHRoZXkgcHJvYmFibHlcblx0XHQvLyAqZG9uJ3QqIHdhbnQgdG8gYWN0dWFsbHkgaXNzdWUgYSB3YXJuaW5nLCBzbyB0aGUgZXJyb3IgaGFuZGxpbmdcblx0XHQvLyBhZnRlciB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQgaXMgcHJvYmFibHkgcHJlZmVyYWJsZVxuXHRcdC8vIEZpbmQgdGhlIHNlbGVjdGVkIDxvcHRpb24+IGVsZW1lbnQgc28gd2UgY2FuIGZldGNoIHRoZSBkYXRhIHN0cnVjdHVyZVxuXHRcdGNvbnN0ICRzZWxlY3RlZEVsID0gJChlLnRhcmdldC5zdWJfZ3JvdXApLmZpbmQoYG9wdGlvblt2YWx1ZT1cIiR7JChlLnRhcmdldC5zdWJfZ3JvdXApLnZhbCgpfVwiXWApO1xuXHRcdHBhcmFtcy5tZXNzYWdlRGF0YSA9ICRzZWxlY3RlZEVsLmRhdGEoJ21lc3NhZ2VEYXRhJyk7XG5cdFx0aWYgKHBhcmFtcy5tZXNzYWdlRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+mAieaLqeitpuWRiuaooeadv+OAgicsICfoq4vpgbjmk4forablkYrmqKHmnb/jgIInKSwge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3dhcm4nLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZS50YXJnZXQpO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gdXNlclRhbGtQYWdlO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn6K2m5ZGK5a6M5oiQ77yM5bCG5Zyo5Yeg56eS5ZCO5Yi35pawJywgJ+itpuWRiuWujOaIkO+8jOWwh+WcqOW5vuenkuW+jOmHjeaWsOaVtOeQhicpO1xuXHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZSh1c2VyVGFsa1BhZ2UsIHdpbmRvdy53Z1VMUygn55So5oi36K6o6K666aG15L+u5pS5JywgJ+S9v+eUqOiAheiojuirlumggeS/ruaUuScpKTtcblx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRxaXV3ZW5fcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0cWl1d2VuX3BhZ2UubG9hZChUd2lua2xlLndhcm4uY2FsbGJhY2tzLm1haW4pO1xuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLndhcm4sICd3YXJuJyk7XG59KShqUXVlcnkpO1xuXG5leHBvcnQge307XG4iLCAiaW1wb3J0IHtpbml0TXdBcGl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbmNvbnN0IGFwaTogbXcuQXBpID0gaW5pdE13QXBpKCdtb3JlYml0cy5qczsgVHdpbmtsZS8xLjEnKTtcblxuZXhwb3J0IHthcGl9O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIG5vLWpxdWVyeS9uby1tYXAtdXRpbCAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7YXBpfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQge2dlbmVyYXRlQXJyYXl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWJsb2NrLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWJsb2NrKCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdGxldCByZWxldmFudFVzZXJOYW1lO1xuXHRsZXQgYmxvY2tlZFVzZXJOYW1lO1xuXHRjb25zdCBtZW51Rm9ybWF0dGVkTmFtZXNwYWNlcyA9IHtcblx0XHQuLi5tdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKSxcblx0fTtcblx0bWVudUZvcm1hdHRlZE5hbWVzcGFjZXNbMF0gPSB3aW5kb3cud2dVTFMoJ++8iOadoeebru+8iScsICfvvIjmop3nm67vvIknKTtcblx0Y29uc3QgYmxvY2tBY3Rpb25UZXh0ID0ge1xuXHRcdGJsb2NrOiB3aW5kb3cud2dVTFMoJ+WwgeemgScsICflsIHpjpYnKSxcblx0XHRyZWJsb2NrOiB3aW5kb3cud2dVTFMoJ+mHjeaWsOWwgeemgScsICfph43mlrDlsIHpjpYnKSxcblx0XHR1bmJsb2NrOiB3aW5kb3cud2dVTFMoJ+ino+mZpOWwgeemgScsICfop6PpmaTlsIHpjpYnKSxcblx0fTtcblx0LyoqXG5cdCAqIHR3aW5rbGVibG9jay5qczogQmxvY2sgbW9kdWxlXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogVGFiIChcIkJsb2NrXCIpXG5cdCAqIEFjdGl2ZSBvbjogQW55IHBhZ2Ugd2l0aCByZWxldmFudCB1c2VyIG5hbWUgKHVzZXJzcGFjZSwgY29udHJpYnMsIGV0Yy4pXG5cdCAqL1xuXHRUd2lua2xlLmJsb2NrID0gKCkgPT4ge1xuXHRcdHJlbGV2YW50VXNlck5hbWUgPSBtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKTtcblx0XHQvLyBzaG91bGQgc2hvdyBvbiBDb250cmlidXRpb25zIG9yIEJsb2NrIHBhZ2VzLCBhbnl3aGVyZSB0aGVyZSdzIGEgcmVsZXZhbnQgdXNlclxuXHRcdC8vIElnbm9yZSByYW5nZXMgd2lkZXIgdGhhbiB0aGUgQ0lEUiBsaW1pdFxuXHRcdC8vIEVuYWJsZSBmb3Igbm9uLWFkbWluc1xuXHRcdGlmIChcblx0XHRcdChNb3JlYml0cy51c2VySXNTeXNvcCB8fCAhbXcudXRpbC5pc0lQQWRkcmVzcyhyZWxldmFudFVzZXJOYW1lLCB0cnVlKSkgJiZcblx0XHRcdHJlbGV2YW50VXNlck5hbWUgJiZcblx0XHRcdCghTW9yZWJpdHMuaXAuaXNSYW5nZShyZWxldmFudFVzZXJOYW1lKSB8fCBNb3JlYml0cy5pcC52YWxpZENJRFIocmVsZXZhbnRVc2VyTmFtZSkpXG5cdFx0KSB7XG5cdFx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WwgeemgScsICflsIHpjpYnKSxcblx0XHRcdFx0J3R3LWJsb2NrJyxcblx0XHRcdFx0d2luZG93LndnVUxTKCflsIHnpoHnm7jlhbPnlKjmiLcnLCAn5bCB6Y6W55u46Zec5L2/55So6ICFJylcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdHJlbGV2YW50VXNlck5hbWUgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSAmJlxuXHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5oKo5Y2z5bCG5a+56Ieq5bex5omn6KGM5bCB56aB55u45YWz5pON5L2c77yB56Gu6K6k6KaB57un57ut5ZCX77yfJyxcblx0XHRcdFx0XHQn5oKo5Y2z5bCH5bCN6Ieq5bex5Z+36KGM5bCB6Y6W55u46Zec5pON5L2c77yB56K66KqN6KaB57m857qM5ZeO77yfJ1xuXHRcdFx0XHQpXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbyA9IHVuZGVmaW5lZDtcblx0XHRUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMgPSB7fTtcblx0XHRUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMgPSB7fTtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDY1MCwgNTMwKTtcblx0XHQvLyBuZWVkIHRvIGJlIHZlcmJvc2UgYWJvdXQgd2hvIHdlJ3JlIGJsb2NraW5nXG5cdFx0V2luZG93LnNldFRpdGxlKFxuXHRcdFx0d2luZG93LndnVUxTKCflsIHnpoHmiJblkJEnLCAn5bCB6Y6W5oiW5ZCRJykgKyByZWxldmFudFVzZXJOYW1lICsgd2luZG93LndnVUxTKCflj5Hlh7rlsIHnpoHmqKHmnb8nLCAn55m85Ye65bCB6Y6W5qih5p2/Jylcblx0XHQpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCflsIHnpoHmlrnpkognLCAn5bCB6Y6W5pa56YedJyksICdRVzpCTE9DSycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5bCB56aB6K6+572uJywgJ+WwgemOluioreWumicpLCAnSDpUVy9QUkVGI2Jsb2NrJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2Jsb2NrJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS5ibG9jay5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Y29uc3QgYWN0aW9uZmllbGQgPSBmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pON5L2c57G75Z6LJywgJ+aTjeS9nOmhnuWIpScpLFxuXHRcdH0pO1xuXHRcdGFjdGlvbmZpZWxkLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0bmFtZTogJ2FjdGlvbnR5cGUnLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2FjdGlvbixcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwgeemgeeUqOaItycsICflsIHpjpbkvb/nlKjogIUnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ2Jsb2NrJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn55So6YCJ5oup55qE6YCJ6aG55YWo56uZ5bCB56aB55u45YWz55So5oi377yM6Iul5pyq5Yu+6YCJ6YOo5YiG5bCB56aB5YiZ5Li65YWo56uZ5bCB56aB44CCJyxcblx0XHRcdFx0XHRcdCfnlKjpgbjmk4fnmoTpgbjpoIXlhajnq5nlsIHpjpbnm7jpl5zkvb/nlKjogIXvvIzoi6XmnKrli77pgbjpg6jliIblsIHpjpbliYfngrrlhajnq5nlsIHpjpbjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRoaWRkZW46ICFNb3JlYml0cy51c2VySXNTeXNvcCxcblx0XHRcdFx0XHRjaGVja2VkOiBNb3JlYml0cy51c2VySXNTeXNvcCxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mDqOWIhuWwgeemgScsICfpg6jliIblsIHpjpYnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BhcnRpYWwnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5ZCv55So6YOo5YiG5bCB56aB5Y+K6YOo5YiG5bCB56aB5qih5p2/44CCJywgJ+WVn+eUqOmDqOWIhuWwgemOluWPiumDqOWIhuWwgemOluaooeadv+OAgicpLFxuXHRcdFx0XHRcdGhpZGRlbjogIU1vcmViaXRzLnVzZXJJc1N5c29wLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuZ2V0UHJlZignZGVmYXVsdFRvUGFydGlhbEJsb2NrcycpLCAvLyBPdmVycmlkZGVuIGlmIGFscmVhZHkgYmxvY2tlZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5bCB56aB5qih5p2/5Yiw55So5oi36K6o6K666aG1JywgJ+WKoOWFpeWwgemOluaooeadv+WIsOS9v+eUqOiAheiojuirlumggScpLFxuXHRcdFx0XHRcdHZhbHVlOiAndGVtcGxhdGUnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfoi6XmiafooYzlsIHnpoHnmoTnrqHnkIblkZjlv5jorrDlj5Hlh7rlsIHnpoHmqKHmnb/vvIzmiJbkvaDlsIHnpoHkuobnlKjmiLfogIzmsqHmnInnu5nlhbblj5Hlh7rmqKHmnb/vvIzliJnkvaDlj6/ku6XnlKjmraTmnaXlj5Hlh7rlkIjpgILnmoTmqKHmnb/jgILli77pgInpg6jliIblsIHnpoHku6Xkvb/nlKjpg6jliIblsIHnpoHmqKHmnb/jgIInLFxuXHRcdFx0XHRcdFx0J+iLpeWft+ihjOWwgemOlueahOeuoeeQhuWToeW/mOiomOeZvOWHuuWwgemOluaooeadv++8jOaIluS9oOWwgemOluS6huS9v+eUqOiAheiAjOaykuaciee1puWFtueZvOWHuuaooeadv++8jOWJh+S9oOWPr+S7peeUqOatpOS+hueZvOWHuuWQiOmBqeeahOaooeadv+OAguWLvumBuOmDqOWIhuWwgemOluS7peS9v+eUqOmDqOWIhuWwgemOluaooeadv+OAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdC8vIERpc2FsbG93IHdoZW4gdmlld2luZyB0aGUgYmxvY2sgZGlhbG9nIG9uIGFuIElQIHJhbmdlXG5cdFx0XHRcdFx0aGlkZGVuOiAhTW9yZWJpdHMudXNlcklzU3lzb3AsXG5cdFx0XHRcdFx0Y2hlY2tlZDogTW9yZWJpdHMudXNlcklzU3lzb3AgJiYgIU1vcmViaXRzLmlwLmlzUmFuZ2UocmVsZXZhbnRVc2VyTmFtZSksXG5cdFx0XHRcdFx0ZGlzYWJsZWQ6IE1vcmViaXRzLmlwLmlzUmFuZ2UocmVsZXZhbnRVc2VyTmFtZSksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDnlKjmiLfpobUnLCAn5qiZ6KiY5L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd0YWcnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflsIbnlKjmiLfpobXmm7/mjaLmiJDnm7jlhbPnmoTmoIforrDmqKHmnb/vvIzku4XpmZDmsLjkuYXlsIHnpoHkvb/nlKjjgIInLFxuXHRcdFx0XHRcdFx0J+Wwh+S9v+eUqOiAhemggemdouabv+aPm+aIkOebuOmXnOeahOaomeiomOaooeadv++8jOWDhemZkOawuOS5heWwgemOluS9v+eUqOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGhpZGRlbjogdHJ1ZSxcblx0XHRcdFx0XHRjaGVja2VkOiAhTW9yZWJpdHMudXNlcklzU3lzb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkv53miqTnlKjmiLfpobUnLCAn5L+d6K235L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcm90ZWN0Jyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WFqOS/neaKpOeUqOaIt+mhte+8jOS7hemZkOawuOS5heWwgeemgeS9v+eUqOOAgicsICflhajkv53orbfkvb/nlKjogIXpoIHpnaLvvIzlg4XpmZDmsLjkuYXlsIHpjpbkvb/nlKjjgIInKSxcblx0XHRcdFx0XHRoaWRkZW46IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfop6PpmaTlsIHnpoHnlKjmiLcnLCAn6Kej6Zmk5bCB6Y6W5L2/55So6ICFJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1bmJsb2NrJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+ino+mZpOWwgeemgeebuOWFs+eUqOaIt+OAgicsICfop6PpmaTlsIHpjpbnm7jpl5zkvb/nlKjogIXjgIInKSxcblx0XHRcdFx0XHRoaWRkZW46ICFNb3JlYml0cy51c2VySXNTeXNvcCxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0LyoqXG5cdFx0ICogQWRkIG9wdGlvbiBmb3IgSVB2NiByYW5nZXMgc21hbGxlciB0aGFuIC82NCB0byB1cGdyYWRlIHRvIHRoZSA2NFxuXHRcdCAqIENJRFIuIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdoZXJlIHdlIHdhbnRcblx0XHQgKiB3Z1JlbGV2YW50VXNlck5hbWUgc2luY2UgdGhpcyBkZXBlbmRzIGVudGlyZWx5IG9uIHRoZSBvcmlnaW5hbCB1c2VyLlxuXHRcdCAqIEluIHRoZW9yeSwgd2Ugc2hvdWxkbid0IHVzZSBNb3JlYml0cy5pcC5nZXQ2NCBoZXJlIHNpbmNlIHNpbmNlIHdlIHdhbnRcblx0XHQgKiB0byBleGNsdWRlIGZ1bmN0aW9uYWxseS1lcXVpdmFsZW50IC82NHMuICBUaGF0J2QgYmU6XG5cdFx0ICogLy8gaWYgKG13LnV0aWwuaXNJUHY2QWRkcmVzcyhtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSwgdHJ1ZSkgJiZcblx0XHQgKiAvLyAobXcudXRpbC5pc0lQdjZBZGRyZXNzKG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpKSB8fCBwYXJzZUludChtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKS5yZXBsYWNlKC9eKC4rPylcXC8/KFxcZHsxLDN9KT8kLywgJyQyJyksIDEwKSA+IDY0KSkge1xuXHRcdCAqIEluIHByYWN0aWNlLCB0aG91Z2gsIHNpbmNlIGZ1bmN0aW9uYWxseS1lcXVpdmFsZW50IHJhbmdlcyBhcmVcblx0XHQgKiAobWlzKXRyZWF0ZWQgYXMgc2VwYXJhdGUgYnkgTWVkaWFXaWtpJ3MgbG9nZ2luZyxcblx0XHQgKiB1c2luZyBNb3JlYml0cy5pcC5nZXQ2NCBwcm92aWRlcyBhIG1vZGljdW0gb2YgcmVsaWVmIGluIHRoaXNlIGNhc2UuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc2l4dHlGb3VyID0gTW9yZWJpdHMuaXAuZ2V0NjQobXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJykpO1xuXHRcdGlmIChzaXh0eUZvdXIgJiYgc2l4dHlGb3VyICE9PSBtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSkge1xuXHRcdFx0Y29uc3QgYmxvY2s2NGZpZWxkID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfovazmjaLkuLovNjTmrrXlsIHnpoEnLCAn6L2J5o+b54K6LzY05q615bCB6Y6WJyksXG5cdFx0XHRcdG5hbWU6ICdmaWVsZF82NCcsXG5cdFx0XHR9KTtcblx0XHRcdGJsb2NrNjRmaWVsZC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0c3R5bGU6ICdtYXJnaW4tYm90dG9tOiAwLjVlbScsXG5cdFx0XHRcdGxhYmVsOiBbd2dVTFMoJ+ebtOaOpeWwgeemgS82NOauteacieebiuaXoOWus+OAgicsICfnm7TmjqXlsIHpjpYvNjTmrrXmnInnm4rnhKHlrrPjgIInKV0sXG5cdFx0XHR9KTtcblx0XHRcdGJsb2NrNjRmaWVsZC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRuYW1lOiAnYmxvY2s2NCcsXG5cdFx0XHRcdGV2ZW50OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV9ibG9jazY0LFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdkZWZhdWx0VG9CbG9jazY0JyksXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlLnmiJDlsIHnpoEvNjQnLCAn5pS55oiQ5bCB6Y6WLzY0JyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ2Jsb2NrNjQnLFxuXHRcdFx0XHRcdFx0dG9vbHRpcDogTW9yZWJpdHMuaXAuaXNSYW5nZShtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSlcblx0XHRcdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoJ+WwhuS4jeS8muWPkemAgeaooeadv+mAmuefpeOAgicsICflsIfkuI3mnIPnmbzpgIHmqKHmnb/pgJrnn6XjgIInKVxuXHRcdFx0XHRcdFx0XHQ6IHdpbmRvdy53Z1VMUygn5Lu75L2V5qih5p2/5bCG5Lya5Y+R6YCB57uZ5Y6f5aeLSVDvvJonLCAn5Lu75L2V5qih5p2/5bCH5pyD55m86YCB57Wm5Y6f5aeLSVDvvJonKSArXG5cdFx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6kJywgJ+mgkOiorScpLFxuXHRcdFx0bmFtZTogJ2ZpZWxkX3ByZXNldCcsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aooeadv+mAiemhuScsICfmqKHmnb/pgbjpoIUnKSxcblx0XHRcdG5hbWU6ICdmaWVsZF90ZW1wbGF0ZV9vcHRpb25zJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCJ6aG5JywgJ+WwgemOlumBuOmghScpLFxuXHRcdFx0bmFtZTogJ2ZpZWxkX2Jsb2NrX29wdGlvbnMnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDnlKjmiLfpobUnLCAn5qiZ6KiY5L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRuYW1lOiAnZmllbGRfdGFnX29wdGlvbnMnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfop6PpmaTlsIHnpoHpgInpobknLCAn6Kej6Zmk5bCB6Y6W6YG46aCFJyksXG5cdFx0XHRuYW1lOiAnZmllbGRfdW5ibG9ja19vcHRpb25zJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHRcdGxhYmVsOiAn5o+Q5LqkJyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0XHRyZXN1bHQucm9vdCA9IHJlc3VsdDtcblx0XHRUd2lua2xlLmJsb2NrLmZldGNoVXNlckluZm8oKCkgPT4ge1xuXHRcdFx0aWYgKFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkKSB7XG5cdFx0XHRcdGNvbnN0ICRmb3JtID0gJChyZXN1bHQpO1xuXHRcdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9dGFnXScpLnBhcmVudCgpLCB0cnVlKTtcblx0XHRcdFx0aWYgKE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KFxuXHRcdFx0XHRcdFx0JGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cHJvdGVjdF0nKS5wYXJlbnQoKSxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBUb2dnbGUgaW5pdGlhbCBwYXJ0aWFsIHN0YXRlIGRlcGVuZGluZyBvbiBwcmlvciBibG9jayB0eXBlLFxuXHRcdFx0Ly8gd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdFRvUGFydGlhbEJsb2NrcyBwcmVmXG5cdFx0XHRpZiAoYmxvY2tlZFVzZXJOYW1lID09PSByZWxldmFudFVzZXJOYW1lKSB7XG5cdFx0XHRcdCQocmVzdWx0KVxuXHRcdFx0XHRcdC5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1wYXJ0aWFsXScpXG5cdFx0XHRcdFx0LnByb3AoJ2NoZWNrZWQnLCBUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8ucGFydGlhbCA9PT0gJycpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gY2xlYW4gdXAgcHJlc2V0IGRhdGEgKGRlZmF1bHRzLCBldGMuKSwgZG9uZSBleGFjdGx5IG9uY2UsIG11c3QgYmUgYmVmb3JlIFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2FjdGlvbiBpcyBjYWxsZWRcblx0XHRcdFR3aW5rbGUuYmxvY2sudHJhbnNmb3JtQmxvY2tQcmVzZXRzKCk7XG5cdFx0XHQvLyBpbml0IHRoZSBjb250cm9scyBhZnRlciB1c2VyIGFuZCBibG9jayBpbmZvIGhhdmUgYmVlbiBmZXRjaGVkXG5cdFx0XHRjb25zdCBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRcdGV2dC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdFx0aWYgKHJlc3VsdC5ibG9jazY0ICYmIHJlc3VsdC5ibG9jazY0LmNoZWNrZWQpIHtcblx0XHRcdFx0Ly8gQ2FsbHMgdGhlIHNhbWUgY2hhbmdlX2FjdGlvbiBldmVudCBvbmNlIGZpbmlzaGVkXG5cdFx0XHRcdHJlc3VsdC5ibG9jazY0LmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5hY3Rpb250eXBlWzBdLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblx0Ly8gU3RvcmUgZmV0Y2hlZCB1c2VyIGRhdGEsIG9ubHkgcmVsZXZhbnQgaWYgc3dpdGNoaW5nIElQdjYgdG8gYSAvNjRcblx0VHdpbmtsZS5ibG9jay5mZXRjaGVkRGF0YSA9IHt9O1xuXHQvLyBQcm9jZXNzZXMgdGhlIGRhdGEgZnJvbSBhIGEgcXVlcnkgcmVzcG9uc2UsIHNlcGFyYXRlZCBmcm9tXG5cdC8vIFR3aW5rbGUuYmxvY2suZmV0Y2hVc2VySW5mbyB0byBhbGxvdyByZXByb2Nlc3Npbmcgb2YgYWxyZWFkeS1mZXRjaGVkIGRhdGFcblx0VHdpbmtsZS5ibG9jay5wcm9jZXNzVXNlckluZm8gPSAoZGF0YSwgZm4pID0+IHtcblx0XHRsZXQgW2Jsb2NraW5mb10gPSBkYXRhLnF1ZXJ5LmJsb2Nrcztcblx0XHRjb25zdCBbdXNlcmluZm9dID0gZGF0YS5xdWVyeS51c2Vycztcblx0XHQvLyBJZiBhbiBJUCBpcyBibG9ja2VkICphbmQqIHJhbmdlYmxvY2tlZCwgdGhlIGFib3ZlIGZpbmRzXG5cdFx0Ly8gd2hpY2hldmVyIGJsb2NrIGlzIG1vcmUgcmVjZW50LCBub3QgbmVjZXNzYXJpbHkgY29ycmVjdC5cblx0XHQvLyBUaHJlZSBzZWVtcy4uLiB1bmxpa2VseVxuXHRcdGlmIChkYXRhLnF1ZXJ5LmJsb2Nrcy5sZW5ndGggPiAxICYmIGJsb2NraW5mby51c2VyICE9PSByZWxldmFudFVzZXJOYW1lKSB7XG5cdFx0XHRbLCBibG9ja2luZm9dID0gZGF0YS5xdWVyeS5ibG9ja3M7XG5cdFx0fVxuXHRcdC8vIENhY2hlIHJlc3BvbnNlLCB1c2VkIHdoZW4gdG9nZ2xpbmcgLzY0IGJsb2Nrc1xuXHRcdFR3aW5rbGUuYmxvY2suZmV0Y2hlZERhdGFbdXNlcmluZm8ubmFtZV0gPSBkYXRhO1xuXHRcdFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkID0gISF1c2VyaW5mby51c2VyaWQ7XG5cdFx0aWYgKFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkKSB7XG5cdFx0XHRUd2lua2xlLmJsb2NrLnVzZXJJc0JvdCA9XG5cdFx0XHRcdCEhdXNlcmluZm8uZ3JvdXBtZW1iZXJzaGlwcyAmJlxuXHRcdFx0XHR1c2VyaW5mby5ncm91cG1lbWJlcnNoaXBzXG5cdFx0XHRcdFx0Lm1hcCgoZSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGUuZ3JvdXA7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuaW5jbHVkZXMoJ2JvdCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2lua2xlLmJsb2NrLnVzZXJJc0JvdCA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoYmxvY2tpbmZvKSB7XG5cdFx0XHQvLyBoYW5kbGUgZnJ1c3RyYXRpbmcgc3lzdGVtIG9mIGludmVydGVkIGJvb2xlYW4gdmFsdWVzXG5cdFx0XHRibG9ja2luZm8uZGlzYWJsZXRhbGsgPSBibG9ja2luZm8uYWxsb3d1c2VydGFsayA9PT0gdW5kZWZpbmVkO1xuXHRcdFx0YmxvY2tpbmZvLmhhcmRibG9jayA9IGJsb2NraW5mby5hbm9ub25seSA9PT0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHQvLyB3aWxsIHVuZGVmaW5lIGlmIG5vIGJsb2NrcyBwcmVzZW50XG5cdFx0VHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvID0gYmxvY2tpbmZvO1xuXHRcdGJsb2NrZWRVc2VyTmFtZSA9IFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbyAmJiBUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8udXNlcjtcblx0XHQvLyBTZW1pLWJ1c3RlZCBvbiByYW5nZXMuXG5cdFx0Ly8gQmFzaWNhbGx5LCBsb2dldmVudHMgZG9lc24ndCB0cmVhdCBmdW5jdGlvbmFsbHktZXF1aXZhbGVudCByYW5nZXNcblx0XHQvLyBhcyBlcXVpdmFsZW50LCBtZWFuaW5nIGFueSBmdW5jdGlvbmFsbHktZXF1aXZhbGVudCBJUCByYW5nZSBpc1xuXHRcdC8vIG1pc2ludGVycHJldGVkIGJ5IHRoZSBsb2cgdGhyb3VnaG91dC4gIFdpdGhvdXQgbG9nZXZlbnRzXG5cdFx0Ly8gcmVkaXJlY3RpbmcgKGxpa2UgU3BlY2lhbDpCbG9jayBkb2VzKSB3ZSB3b3VsZCBuZWVkIGEgZnVuY3Rpb24gdG9cblx0XHQvLyBwYXJzZSByYW5nZXMsIHdoaWNoIGlzIGEgcGFpbi4gIElQVXRpbHMgaGFzIHRoZSBjb2RlLCBidXQgaXQnZCBiZSBhXG5cdFx0Ly8gbG90IG9mIGNydWZ0IGZvciBvbmUgcHVycG9zZS5cblx0XHRUd2lua2xlLmJsb2NrLmhhc0Jsb2NrTG9nID0gISFkYXRhLnF1ZXJ5LmxvZ2V2ZW50cy5sZW5ndGg7XG5cdFx0VHdpbmtsZS5ibG9jay5ibG9ja0xvZyA9IFR3aW5rbGUuYmxvY2suaGFzQmxvY2tMb2cgJiYgZGF0YS5xdWVyeS5sb2dldmVudHM7XG5cdFx0Ly8gVXNlZCBsYXRlciB0byBjaGVjayBpZiBibG9jayBzdGF0dXMgY2hhbmdlZCB3aGlsZSBmaWxsaW5nIG91dCB0aGUgZm9ybVxuXHRcdFR3aW5rbGUuYmxvY2suYmxvY2tMb2dJZCA9IFR3aW5rbGUuYmxvY2suaGFzQmxvY2tMb2cgPyBkYXRhLnF1ZXJ5LmxvZ2V2ZW50c1swXS5sb2dpZCA6IGZhbHNlO1xuXHRcdGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiBmbigpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5mZXRjaFVzZXJJbmZvID0gKGZuKSA9PiB7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGxpc3Q6ICdibG9ja3N8dXNlcnN8bG9nZXZlbnRzJyxcblx0XHRcdGxldHlwZTogJ2Jsb2NrJyxcblx0XHRcdGxlbGltaXQ6IDIsXG5cdFx0XHRsZXRpdGxlOiBgVXNlcjoke3JlbGV2YW50VXNlck5hbWV9YCxcblx0XHRcdGJrcHJvcDogJ2V4cGlyeXxyZWFzb258ZmxhZ3N8cmVzdHJpY3Rpb25zfHJhbmdlfHVzZXInLFxuXHRcdFx0dXN1c2VyczogcmVsZXZhbnRVc2VyTmFtZSxcblx0XHR9O1xuXHRcdC8vIGJrdXNlcnMgZG9lc24ndCBjYXRjaCBzaW5nbGUgSVBzIGJsb2NrZWQgYXMgcGFydCBvZiBhIHJhbmdlIGJsb2NrXG5cdFx0aWYgKG13LnV0aWwuaXNJUEFkZHJlc3MocmVsZXZhbnRVc2VyTmFtZSwgdHJ1ZSkpIHtcblx0XHRcdHF1ZXJ5LmJraXAgPSByZWxldmFudFVzZXJOYW1lO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRxdWVyeS5ia3VzZXJzID0gcmVsZXZhbnRVc2VyTmFtZTtcblx0XHRcdC8vIGdyb3VwbWVtYmVyc2hpcHMgb25seSByZWxldmFudCBmb3IgcmVnaXN0ZXJlZCB1c2Vyc1xuXHRcdFx0cXVlcnkudXNwcm9wID0gJ2dyb3VwbWVtYmVyc2hpcHMnO1xuXHRcdH1cblx0XHR2b2lkIGFwaS5nZXQocXVlcnkpLnRoZW4oXG5cdFx0XHQoZGF0YSkgPT4ge1xuXHRcdFx0XHRUd2lua2xlLmJsb2NrLnByb2Nlc3NVc2VySW5mbyhkYXRhLCBmbik7XG5cdFx0XHR9LFxuXHRcdFx0KGVycm9yKSA9PiB7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KCRib2R5LmZpbmQoJ2RpdltuYW1lPVwiY3VycmVudGJsb2NrXCJdIHNwYW4nKS5sYXN0KClbMF0pO1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybih3aW5kb3cud2dVTFMoJ+aKk+WPlueUqOaIt+S/oeaBr+WHuumUmScsICfmipPlj5bkvb/nlKjogIXos4foqIrlh7rpjK8nKSwgZXJyb3IpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suc2F2ZUZpZWxkc2V0ID0gKGZpZWxkc2V0KSA9PiB7XG5cdFx0VHdpbmtsZS5ibG9ja1skKGZpZWxkc2V0KS5wcm9wKCduYW1lJyldID0ge307XG5cdFx0Zm9yIChjb25zdCBlbCBvZiAkKGZpZWxkc2V0KS5zZXJpYWxpemVBcnJheSgpKSB7XG5cdFx0XHQvLyBuYW1lc3BhY2VzIGFuZCBwYWdlcyBmb3IgcGFydGlhbCBibG9ja3MgYXJlIG92ZXJ3cml0dGVuXG5cdFx0XHQvLyBoZXJlLCBidXQgd2UncmUgaGFuZGxpbmcgdGhlbSBlbHNld2hlcmUgc28gdGhhdCdzIGZpbmVcblx0XHRcdFR3aW5rbGUuYmxvY2tbJChmaWVsZHNldCkucHJvcCgnbmFtZScpXVtlbC5uYW1lXSA9IGVsLnZhbHVlO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfYmxvY2s2NCA9IChlKSA9PiB7XG5cdFx0Y29uc3QgJGZvcm0gPSAkKGUudGFyZ2V0LmZvcm0pO1xuXHRcdGNvbnN0ICRibG9jazY0ID0gJGZvcm0uZmluZCgnW25hbWU9YmxvY2s2NF0nKTtcblx0XHQvLyBTaG93L2hpZGUgYmxvY2s2NCBidXR0b25cblx0XHQvLyBTaW5nbGUgSVB2Niwgb3IgSVB2NiByYW5nZSBzbWFsbGVyIHRoYW4gYSAvNjRcblx0XHRjb25zdCBwcmlvck5hbWUgPSByZWxldmFudFVzZXJOYW1lO1xuXHRcdGlmICgkYmxvY2s2NC5pcygnOmNoZWNrZWQnKSkge1xuXHRcdFx0cmVsZXZhbnRVc2VyTmFtZSA9IE1vcmViaXRzLmlwLmdldDY0KG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVsZXZhbnRVc2VyTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpO1xuXHRcdH1cblx0XHQvLyBObyB0ZW1wbGF0ZXMgZm9yIHJhbmdlcywgYnV0IGlmIHRoZSBvcmlnaW5hbCB1c2VyIGlzIGEgc2luZ2xlIElQLCBvZmZlciB0aGUgb3B0aW9uXG5cdFx0Ly8gKGRvbmUgc2VwYXJhdGVseSBpbiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmlzc3VlX3RlbXBsYXRlKVxuXHRcdGNvbnN0IG9yaWdpbmFsSXNSYW5nZSA9IE1vcmViaXRzLmlwLmlzUmFuZ2UobXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJykpO1xuXHRcdCRmb3JtXG5cdFx0XHQuZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9dGVtcGxhdGVdJylcblx0XHRcdC5wcm9wKCdkaXNhYmxlZCcsIG9yaWdpbmFsSXNSYW5nZSlcblx0XHRcdC5wcm9wKCdjaGVja2VkJywgIW9yaWdpbmFsSXNSYW5nZSk7XG5cdFx0Ly8gUmVmZXRjaC9yZXByb2Nlc3MgdXNlciBpbmZvIHRoZW4gcmVnZW5lcmF0ZSB0aGUgbWFpbiBjb250ZW50XG5cdFx0Y29uc3QgcmVnZW5lcmF0ZUZvcm0gPSAoKSA9PiB7XG5cdFx0XHQvLyBUd2VhayB0aXRsZWJhciB0ZXh0LiAgSW4gdGhlb3J5LCB3ZSBjb3VsZCBzYXZlIHRoZSBkaWFsb2dcblx0XHRcdC8vIGF0IGluaXRpYWxpemF0aW9uIGFuZCB0aGVuIHVzZSBgLnNldFRpdGxlYCBvclxuXHRcdFx0Ly8gYGRpYWxvZygnb3B0aW9uJywgJ3RpdGxlJylgLCBidXQgaW4gcHJhY3RpY2UgdGhhdCBzd2FsbG93c1xuXHRcdFx0Ly8gdGhlIHNjcmlwdE5hbWUgYW5kIHJlcXVpcmVzIGAuZGlzcGxheWBpbmcsIHdoaWNoIGp1bXBzIHRoZVxuXHRcdFx0Ly8gd2luZG93LiAgSXQncyBqdXN0IGEgbGluZSBvZiB0ZXh0LCBzbyB0aGlzIGlzIGZpbmUuXG5cdFx0XHRjb25zdCB0aXRsZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy51aS1kaWFsb2ctdGl0bGUnKS5maXJzdENoaWxkLm5leHRTaWJsaW5nO1xuXHRcdFx0dGl0bGVCYXIubm9kZVZhbHVlID0gdGl0bGVCYXIubm9kZVZhbHVlLnJlcGxhY2UocHJpb3JOYW1lLCByZWxldmFudFVzZXJOYW1lKTtcblx0XHRcdC8vIENvcnJlY3QgcGFydGlhbCBzdGF0ZVxuXHRcdFx0JGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cGFydGlhbF0nKS5wcm9wKCdjaGVja2VkJywgVHdpbmtsZS5nZXRQcmVmKCdkZWZhdWx0VG9QYXJ0aWFsQmxvY2tzJykpO1xuXHRcdFx0aWYgKGJsb2NrZWRVc2VyTmFtZSA9PT0gcmVsZXZhbnRVc2VyTmFtZSkge1xuXHRcdFx0XHQkZm9ybVxuXHRcdFx0XHRcdC5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1wYXJ0aWFsXScpXG5cdFx0XHRcdFx0LnByb3AoJ2NoZWNrZWQnLCBUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8ucGFydGlhbCA9PT0gJycpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gU2V0IGNvbnRlbnQgYXBwcm9wcmlhdGVseVxuXHRcdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfYWN0aW9uKGUpO1xuXHRcdH07XG5cdFx0aWYgKFR3aW5rbGUuYmxvY2suZmV0Y2hlZERhdGFbcmVsZXZhbnRVc2VyTmFtZV0pIHtcblx0XHRcdFR3aW5rbGUuYmxvY2sucHJvY2Vzc1VzZXJJbmZvKFR3aW5rbGUuYmxvY2suZmV0Y2hlZERhdGFbcmVsZXZhbnRVc2VyTmFtZV0sIHJlZ2VuZXJhdGVGb3JtKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdpbmtsZS5ibG9jay5mZXRjaFVzZXJJbmZvKHJlZ2VuZXJhdGVGb3JtKTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2FjdGlvbiA9IChlKSA9PiB7XG5cdFx0bGV0IGZpZWxkX3ByZXNldDtcblx0XHRsZXQgZmllbGRfdGVtcGxhdGVfb3B0aW9ucztcblx0XHRsZXQgZmllbGRfYmxvY2tfb3B0aW9ucztcblx0XHRsZXQgZmllbGRfdGFnX29wdGlvbnM7XG5cdFx0bGV0IGZpZWxkX3VuYmxvY2tfb3B0aW9ucztcblx0XHRjb25zdCAkZm9ybSA9ICQoZS50YXJnZXQuZm9ybSk7XG5cdFx0Ly8gTWFrZSBpZnMgc2hvcnRlclxuXHRcdGNvbnN0ICRibG9jayA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPWJsb2NrXScpO1xuXHRcdGxldCBibG9ja0JveCA9ICRibG9jay5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCAkdGVtcGxhdGUgPSAkZm9ybS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT10ZW1wbGF0ZV0nKTtcblx0XHRsZXQgdGVtcGxhdGVCb3ggPSAkdGVtcGxhdGUuaXMoJzpjaGVja2VkJyk7XG5cdFx0Y29uc3QgJHRhZyA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXRhZ10nKTtcblx0XHRjb25zdCB0YWdCb3ggPSAkdGFnLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGNvbnN0ICRwcm90ZWN0ID0gJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cHJvdGVjdF0nKTtcblx0XHRjb25zdCAkcGFydGlhbCA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXBhcnRpYWxdJyk7XG5cdFx0Y29uc3QgcGFydGlhbEJveCA9ICRwYXJ0aWFsLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGNvbnN0ICR1bmJsb2NrID0gJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9dW5ibG9ja10nKTtcblx0XHRjb25zdCB1bmJsb2NrQm94ID0gJHVuYmxvY2suaXMoJzpjaGVja2VkJyk7XG5cdFx0bGV0IGJsb2NrR3JvdXAgPSBwYXJ0aWFsQm94ID8gVHdpbmtsZS5ibG9jay5ibG9ja0dyb3Vwc1BhcnRpYWwgOiBUd2lua2xlLmJsb2NrLmJsb2NrR3JvdXBzO1xuXHRcdGlmIChlLnRhcmdldC52YWx1ZSA9PT0gJ3VuYmxvY2snKSB7XG5cdFx0XHRpZiAoIVR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbykge1xuXHRcdFx0XHQkdW5ibG9jay5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+eUqOaIt+ayoeacieiiq+WwgeemgScsICfkvb/nlKjogIXmspLmnInooqvlsIHpjpYnKSwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYmxvY2snLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0JGJsb2NrLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHRibG9ja0JveCA9IGZhbHNlO1xuXHRcdFx0JHRlbXBsYXRlLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHR0ZW1wbGF0ZUJveCA9IGZhbHNlO1xuXHRcdFx0JHRhZy5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuXHRcdFx0JHByb3RlY3QucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHRcdCRwYXJ0aWFsLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCR1bmJsb2NrLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0fVxuXHRcdCRwYXJ0aWFsLnByb3AoJ2Rpc2FibGVkJywgIWJsb2NrQm94ICYmICF0ZW1wbGF0ZUJveCk7XG5cdFx0Ly8gQWRkIGN1cnJlbnQgYmxvY2sgcGFyYW1ldGVycyBhcyBkZWZhdWx0IHByZXNldFxuXHRcdGNvbnN0IHByaW9yID0ge1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5b2T5YmN5bCB56aBJywgJ+ebruWJjeWwgemOlicpLFxuXHRcdH07XG5cdFx0aWYgKGJsb2NrZWRVc2VyTmFtZSA9PT0gcmVsZXZhbnRVc2VyTmFtZSkge1xuXHRcdFx0VHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvLnByaW9yID0gVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvO1xuXHRcdFx0Ly8gdmFsdWUgbm90IGEgdmFsaWQgdGVtcGxhdGUgc2VsZWN0aW9uLCBjaG9zZW4gYmVsb3cgYnkgc2V0dGluZyB0ZW1wbGF0ZU5hbWVcblx0XHRcdHByaW9yLmxpc3QgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflvZPliY3lsIHnpoHorr7nva4nLCAn55uu5YmN5bCB6Y6W6Kit5a6aJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcmlvcicsXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdO1xuXHRcdFx0Ly8gQXJyYXlzIG9mIG9iamVjdHMgYXJlIGFubm95aW5nIHRvIGNoZWNrXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFibG9ja0dyb3VwLnNvbWUoKGJnKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGJnLmxhYmVsID09PSBwcmlvci5sYWJlbDtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRibG9ja0dyb3VwW2Jsb2NrR3JvdXAubGVuZ3RoXSA9IHByaW9yO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWx3YXlzIGVuc3VyZSBwcm9wZXIgdGVtcGxhdGUgZXhpc3RzL2lzIHNlbGVjdGVkIHdoZW4gc3dpdGNoaW5nIG1vZGVzXG5cdFx0XHRpZiAocGFydGlhbEJveCkge1xuXHRcdFx0XHRUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm8ucHJpb3IudGVtcGxhdGVOYW1lID0gTW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkoXG5cdFx0XHRcdFx0VHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLmV4cGlyeVxuXHRcdFx0XHQpXG5cdFx0XHRcdFx0PyAndXctcGJsb2NraW5kZWYnXG5cdFx0XHRcdFx0OiAndXctcGJsb2NrJztcblx0XHRcdH0gZWxzZSBpZiAoVHdpbmtsZS5ibG9jay5pc1JlZ2lzdGVyZWQpIHtcblx0XHRcdFx0VHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvLnByaW9yLnRlbXBsYXRlTmFtZSA9IE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KFxuXHRcdFx0XHRcdFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mby5leHBpcnlcblx0XHRcdFx0KVxuXHRcdFx0XHRcdD8gJ3V3LWJsb2NraW5kZWYnXG5cdFx0XHRcdFx0OiAndXctYmxvY2snO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0VHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvLnByaW9yLnRlbXBsYXRlTmFtZSA9ICd1dy1hYmxvY2snO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBCdXQgZmlyc3QgcmVtb3ZlIGFueSBwcmlvciBwcmlvclxuXHRcdFx0YmxvY2tHcm91cCA9IGJsb2NrR3JvdXAuZmlsdGVyKChiZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYmcubGFiZWwgIT09IHByaW9yLmxhYmVsO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suc2F2ZUZpZWxkc2V0KCRib2R5LmZpbmQoJ1tuYW1lPWZpZWxkX2Jsb2NrX29wdGlvbnNdJykpO1xuXHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suc2F2ZUZpZWxkc2V0KCRib2R5LmZpbmQoJ1tuYW1lPWZpZWxkX3RlbXBsYXRlX29wdGlvbnNdJykpO1xuXHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suc2F2ZUZpZWxkc2V0KCRib2R5LmZpbmQoJ1tuYW1lPWZpZWxkX3RhZ19vcHRpb25zXScpKTtcblx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnNhdmVGaWVsZHNldCgkYm9keS5maW5kKCdbbmFtZT1maWVsZF91bmJsb2NrX29wdGlvbnNdJykpO1xuXHRcdGlmIChibG9ja0JveCkge1xuXHRcdFx0ZmllbGRfcHJlc2V0ID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6kJywgJ+mgkOiorScpLFxuXHRcdFx0XHRuYW1lOiAnZmllbGRfcHJlc2V0Jyxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfcHJlc2V0LmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRuYW1lOiAncHJlc2V0Jyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCJ5oup6buY6K6k77yaJywgJ+mBuOaTh+mgkOiore+8micpLFxuXHRcdFx0XHRldmVudDogVHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfcHJlc2V0LFxuXHRcdFx0XHRsaXN0OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmZpbHRlcmVkX2Jsb2NrX2dyb3VwcyhibG9ja0dyb3VwKSxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucyA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwgeemgemAiemhuScsICflsIHpjpbpgbjpoIUnKSxcblx0XHRcdFx0bmFtZTogJ2ZpZWxkX2Jsb2NrX29wdGlvbnMnLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRuYW1lOiAnY3VycmVudGJsb2NrJyxcblx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0bmFtZTogJ2hhc2Jsb2NrbG9nJyxcblx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0bmFtZTogJ2V4cGlyeV9wcmVzZXQnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov4fmnJ/ml7bpl7TvvJonLCAn6YGO5pyf5pmC6ZaT77yaJyksXG5cdFx0XHRcdGV2ZW50OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV9leHBpcnksXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYknLCAn6Ieq6KiCJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ2N1c3RvbScsXG5cdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aXoOmZkOacnycsICfnhKHpmZDmnJ8nKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnaW5maW5pdHknLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnM+Wwj+aXticsICcz5bCP5pmCJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJzMgaG91cnMnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnMTLlsI/ml7YnLCAnMTLlsI/mmYInKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMTIgaG91cnMnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6ICcx5aSpJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMSBkYXknLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnMzHlsI/ml7YnLCAnMzHlsI/mmYInKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMzEgaG91cnMnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6ICcy5aSpJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMiBkYXlzJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAnM+WkqScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJzMgZGF5cycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcx5ZGoJywgJzHpgLEnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMSB3ZWVrJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJzLlkagnLCAnMumAsScpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICcyIHdlZWtzJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJzHkuKrmnIgnLCAnMeWAi+aciCcpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICcxIG1vbnRoJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJzPkuKrmnIgnLCAnM+WAi+aciCcpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICczIG1vbnRocycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCc25Liq5pyIJywgJzblgIvmnIgnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnNiBtb250aHMnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6ICcx5bm0Jyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMSB5ZWFyJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAnMuW5tCcsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJzIgeWVhcnMnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6ICcz5bm0Jyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMyB5ZWFycycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRuYW1lOiAnZXhwaXJ5Jyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ6L+H5pyf5pe26Ze0JywgJ+iHquiogumBjuacn+aZgumWkycpLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aCqOWPr+S7peS9v+eUqOebuOWvueaXtumXtO+8jOWmguKAnDEgbWludXRl4oCd5oiW4oCcMTkgZGF5c+KAne+8m+aIlue7neWvueaXtumXtO+8jOKAnHl5eXltbWRkaGhtbeKAne+8iOWmguKAnDIwMDYwMjAxMTQwNeKAneaYrzIwMDblubQy5pyIMeaXpTE0OjA1IFVUQ+OAgu+8iScsXG5cdFx0XHRcdFx0J+aCqOWPr+S7peS9v+eUqOebuOWwjeaZgumWk++8jOWmguOAjDEgbWludXRl44CN5oiW44CMMTkgZGF5c+OAje+8m+aIlue1leWwjeaZgumWk++8jOOAjHl5eXltbWRkaGhtbeOAje+8iOWmguOAjDIwMDYwMjAxMTQwNeOAjeaYrzIwMDblubQy5pyIMeaXpTE0OjA1IFVUQ+OAgu+8iSdcblx0XHRcdFx0KSxcblx0XHRcdFx0dmFsdWU6IFR3aW5rbGUuYmxvY2suZmllbGRfYmxvY2tfb3B0aW9ucy5leHBpcnkgfHwgVHdpbmtsZS5ibG9jay5maWVsZF90ZW1wbGF0ZV9vcHRpb25zLnRlbXBsYXRlX2V4cGlyeSxcblx0XHRcdH0pO1xuXHRcdFx0aWYgKHBhcnRpYWxCb3gpIHtcblx0XHRcdFx0Ly8gUGFydGlhbCBibG9ja1xuXHRcdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdFx0bmFtZTogJ3BhZ2VyZXN0cmljdGlvbnMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mhtemdouWwgeemgScsICfpoIHpnaLlsIHpjpYnKSxcblx0XHRcdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfmnIDlpJoxMOS4qumhtemdouOAgicsICfmnIDlpJoxMOWAi+mggemdouOAgicpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgbnMgPSBmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdFx0bmFtZTogJ25hbWVzcGFjZXJlc3RyaWN0aW9ucycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5ZG95ZCN56m66Ze05bCB56aBJywgJ+WRveWQjeepuumWk+WwgemOlicpLFxuXHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+aMh+WumuWwgeemgeeahOWRveWQjeepuumXtOOAgicsICfmjIflrprlsIHpjpbnmoTlkb3lkI3nqbrplpPjgIInKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvciAoY29uc3QgW251bWJlciwgbmFtZV0gb2YgT2JqZWN0LmVudHJpZXMobWVudUZvcm1hdHRlZE5hbWVzcGFjZXMpKSB7XG5cdFx0XHRcdFx0Ly8gSWdub3JlIC0xOiBTcGVjaWFsOyAtMjogTWVkaWE7IGFuZCAyMzAwLTIzMDM6IEdhZGdldCAodGFsaykgYW5kIEdhZGdldCBkZWZpbml0aW9uICh0YWxrKVxuXHRcdFx0XHRcdGlmIChudW1iZXIgPj0gMCAmJiBudW1iZXIgPCA4MzApIHtcblx0XHRcdFx0XHRcdG5zLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogbmFtZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IG51bWJlcixcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYmxvY2tvcHRpb25zID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5ibG9jay5maWVsZF9ibG9ja19vcHRpb25zLm5vY3JlYXRlLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+emgeatouWIm+W7uui0puWPtycsICfnpoHmraLlu7rnq4vos6zomZ8nKSxcblx0XHRcdFx0XHRuYW1lOiAnbm9jcmVhdGUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnMScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMubm9lbWFpbCxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnlLXlrZDpgq7ku7blgZznlKgnLCAn6Zu75a2Q6YO15Lu25YGc55SoJyksXG5cdFx0XHRcdFx0bmFtZTogJ25vZW1haWwnLFxuXHRcdFx0XHRcdHZhbHVlOiAnMScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMuZGlzYWJsZXRhbGssXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LiN6IO957yW6L6R6Ieq5bex55qE6K6o6K666aG1JywgJ+S4jeiDvee3qOi8r+iHquW3seeahOiojuirlumggScpLFxuXHRcdFx0XHRcdG5hbWU6ICdkaXNhYmxldGFsaycsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0XHR0b29sdGlwOiBwYXJ0aWFsQm94XG5cdFx0XHRcdFx0XHQ/IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6Iul5L2/55So6YOo5YiG5bCB56aB77yM5LiN5bqU6YCJ5oup5q2k6aG577yM6Zmk6Z2e5oKo5Lmf5oOz6KaB56aB5q2i57yW6L6R55So5oi36K6o6K666aG144CCJyxcblx0XHRcdFx0XHRcdFx0XHQn6Iul5L2/55So6YOo5YiG5bCB6Y6W77yM5LiN5oeJ6YG45pOH5q2k6aCF77yM6Zmk6Z2e5oKo5Lmf5oOz6KaB56aB5q2i57eo6Lyv5L2/55So6ICF6KiO6KuW6aCB44CCJ1xuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQ6ICcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XTtcblx0XHRcdGlmIChUd2lua2xlLmJsb2NrLmlzUmVnaXN0ZXJlZCkge1xuXHRcdFx0XHRibG9ja29wdGlvbnNbYmxvY2tvcHRpb25zLmxlbmd0aF0gPSB7XG5cdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5ibG9jay5maWVsZF9ibG9ja19vcHRpb25zLmF1dG9ibG9jayxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rliqjlsIHnpoEnLCAn6Ieq5YuV5bCB6Y6WJyksXG5cdFx0XHRcdFx0bmFtZTogJ2F1dG9ibG9jaycsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJsb2Nrb3B0aW9uc1tibG9ja29wdGlvbnMubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMuaGFyZGJsb2NrLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mYu+atoueZu+W9leeUqOaIt+S9v+eUqOivpUlQ5Zyw5Z2A57yW6L6RJywgJ+mYu+atoueZu+WFpeS9v+eUqOiAheS9v+eUqOipsklQ5L2N5Z2A57eo6LyvJyksXG5cdFx0XHRcdFx0bmFtZTogJ2hhcmRibG9jaycsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGJsb2Nrb3B0aW9uc1tibG9ja29wdGlvbnMubGVuZ3RoXSA9XG5cdFx0XHRcdCh7XG5cdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5ibG9jay5maWVsZF9ibG9ja19vcHRpb25zLndhdGNodXNlcixcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnm5Hop4bor6XnlKjmiLfnmoTnlKjmiLfpobXlkozorqjorrrpobUnLCAn55uj6KaW6Kmy5L2/55So6ICF55qE5L2/55So6ICF6aCB6Z2i5ZKM6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNodXNlcicsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w5b2T5YmN55qE56C05Z2P5Lit55qE6K+35rGCJywgJ+aomeiomOeVtuWJjeeahOegtOWjnuS4reeahOiri+axgicpLFxuXHRcdFx0XHRcdG5hbWU6ICdjbG9zZXZpcCcsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICdibG9ja29wdGlvbnMnLFxuXHRcdFx0XHRsaXN0OiBibG9ja29wdGlvbnMsXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55CG55Sx77yI55So5LqO5bCB56aB5pel5b+X77yJ77yaJywgJ+eQhueUse+8iOeUqOaWvOWwgemOluaXpeiqjO+8ie+8micpLFxuXHRcdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfor7fogIPomZHlnKjpu5jorqTnmoTmtojmga/kuK3liqDlhaXmnInnlKjnmoTor6bnu4bkv6Hmga/jgIInLFxuXHRcdFx0XHRcdCfoq4vogIPmha7lnKjpoJDoqK3nmoToqIrmga/kuK3liqDlhaXmnInnlKjnmoToqbPntLDos4foqIrjgIInXG5cdFx0XHRcdCksXG5cdFx0XHRcdHZhbHVlOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMucmVhc29uLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRuYW1lOiAnZmlsZXJsb2dfbGFiZWwnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj4Lop4HvvJonLCAn5Y+D6KaL77yaJyksXG5cdFx0XHRcdHN0eWxlOiAnZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zdHlsZTpub3JtYWwgIWltcG9ydGFudCcsXG5cdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5Zyo5bCB56aB55CG55Sx5Lit5qCH5riF54m55q6K5oOF5Ya15Lul5L6b5YW25LuW566h55CG5ZGY5Y+C6ICDJyxcblx0XHRcdFx0XHQn5Zyo5bCB6Y6W55CG55Sx5Lit5qiZ5riF54m55q6K5oOF5rOB5Lul5L6b5YW25LuW566h55CG5ZOh5Y+D6ICDJ1xuXHRcdFx0XHQpLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICdmaWx0ZXJfc2VlX2Fsc28nLFxuXHRcdFx0XHRldmVudDogVHdpbmtsZS5ibG9jay5jYWxsYmFjay50b2dnbGVfc2VlX2Fsc29zLFxuXHRcdFx0XHRzdHlsZTogJ2Rpc3BsYXk6aW5saW5lLWJsb2NrOyBtYXJnaW4tcmlnaHQ6NXB4Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+i/h+a7pOWZqOaXpeW/lycsICfpgY7mv77lmajml6XoqownKSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUygn6L+H5ruk5Zmo5pel5b+XJywgJ+mBjua/vuWZqOaXpeiqjCcpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ2RlbGV0ZWRfc2VlX2Fsc28nLFxuXHRcdFx0XHRldmVudDogVHdpbmtsZS5ibG9jay5jYWxsYmFjay50b2dnbGVfc2VlX2Fsc29zLFxuXHRcdFx0XHRzdHlsZTogJ2Rpc3BsYXk6aW5saW5lLWJsb2NrOyBtYXJnaW4tcmlnaHQ6NXB4Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W3suWIoOmZpOeahOe8lui+kScsICflt7LliKrpmaTnmoTnt6jovK8nKSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUygn5bey5Yig6Zmk55qE57yW6L6RJywgJ+W3suWIqumZpOeahOe3qOi8rycpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ2ZpbHRlcl9zZWVfYWxzbycsXG5cdFx0XHRcdGV2ZW50OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnRvZ2dsZV9zZWVfYWxzb3MsXG5cdFx0XHRcdHN0eWxlOiAnZGlzcGxheTppbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDo1cHgnLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5oi36K6o6K666aG1JywgJ+S9v+eUqOiAheiojuirlumggScpLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCfnlKjmiLforqjorrrpobUnLCAn5L2/55So6ICF6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRuYW1lOiAnZmlsdGVyX3NlZV9hbHNvJyxcblx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2sudG9nZ2xlX3NlZV9hbHNvcyxcblx0XHRcdFx0c3R5bGU6ICdkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OjVweCcsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov4fljrvnmoTlsIHnpoHorrDlvZUnLCAn6YGO5Y6755qE5bCB6Y6W6KiY6YyEJyksXG5cdFx0XHRcdFx0XHRjaGVja2VkOiBmYWxzZSxcblx0XHRcdFx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ+i/h+WOu+eahOWwgeemgeiusOW9lScsICfpgY7ljrvnmoTlsIHpjpboqJjpjIQnKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0XHQvLyBZZXQtYW5vdGhlci1sb2dldmVudHMtZG9lc24ndC1oYW5kbGUtcmFuZ2VzLXdlbGxcblx0XHRcdGlmIChibG9ja2VkVXNlck5hbWUgPT09IHJlbGV2YW50VXNlck5hbWUpIHtcblx0XHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoaWRkZW4nLFxuXHRcdFx0XHRcdG5hbWU6ICdyZWJsb2NrJyxcblx0XHRcdFx0XHR2YWx1ZTogJzEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRlbXBsYXRlQm94KSB7XG5cdFx0XHRmaWVsZF90ZW1wbGF0ZV9vcHRpb25zID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qih5p2/6YCJ6aG5JywgJ+aooeadv+mBuOmghScpLFxuXHRcdFx0XHRuYW1lOiAnZmllbGRfdGVtcGxhdGVfb3B0aW9ucycsXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdG5hbWU6ICd0ZW1wbGF0ZScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAieaLqeiuqOiuuumhteaooeadv++8micsICfpgbjmk4foqI7oq5bpoIHmqKHmnb/vvJonKSxcblx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX3RlbXBsYXRlLFxuXHRcdFx0XHRsaXN0OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmZpbHRlcmVkX2Jsb2NrX2dyb3VwcyhibG9ja0dyb3VwLCB0cnVlKSxcblx0XHRcdFx0dmFsdWU6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy50ZW1wbGF0ZSxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRuYW1lOiAnYXJ0aWNsZScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mTvuaOpemhtemdoicsICfpgKPntZDpoIHpnaInKSxcblx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+WPr+S7pemaj+mAmuefpemTvuaOpemhtemdou+8jOS+i+WmguegtOWdj+eahOebruagh+OAguayoeacieadoeebrumcgOimgemTvuaOpeWImeivt+eVmeepuuOAgicsXG5cdFx0XHRcdFx0J+WPr+S7pemaqOmAmuefpemAo+e1kOmggemdou+8jOS+i+WmguegtOWjnueahOebruaomeOAguaykuacieaineebrumcgOimgemAo+e1kOWJh+iri+eVmeepuuOAgidcblx0XHRcdFx0KSxcblx0XHRcdH0pO1xuXHRcdFx0Ly8gT25seSB2aXNpYmxlIGlmIHBhcnRpYWwgYW5kIG5vdCBibG9ja2luZ1xuXHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRuYW1lOiAnYXJlYScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwgeemgeiMg+WbtCcsICflsIHpjpbnr4TlnI0nKSxcblx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+mYu+atoueUqOaIt+e8lui+keeahOmhtemdouaIluWRveWQjeepuumXtOeahOWPr+mAieivtOaYjuOAgicsXG5cdFx0XHRcdFx0J+mYu+atouS9v+eUqOiAhee3qOi8r+eahOmggemdouaIluWRveWQjeepuumWk+eahOWPr+mBuOiqquaYjuOAgidcblx0XHRcdFx0KSxcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFibG9ja0JveCkge1xuXHRcdFx0XHRmaWVsZF90ZW1wbGF0ZV9vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAndGVtcGxhdGVfZXhwaXJ5Jyxcblx0XHRcdFx0XHRsYWJlbDogJ+Wwgeemgeacn+mZkO+8micsXG5cdFx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5bCB56aB5pe26ZW/77yM5aaCMjTlsI/ml7bjgIEy5ZGo44CB5peg6ZmQ5pyf562J44CCJywgJ+WwgemOluaZgumVt++8jOWmgjI05bCP5pmC44CBMumAseOAgeeEoemZkOacn+etieOAgicpLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0bmFtZTogJ2Jsb2NrX3JlYXNvbicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+KAnOeUseS6juKApuKApuaCqOW3suiiq+WwgeemgeKAnScsICfjgIznlLHmlrzigKbigKbmgqjlt7LooqvlsIHpjpbjgI0nKSxcblx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCflj6/pgInnmoTnkIbnlLHvvIznlKjkuo7mm7/mjaLpu5jorqTnkIbnlLHjgILlj6rlnKjluLjop4TlsIHnpoHmqKHmnb/kuK3mnInmlYjjgIInLFxuXHRcdFx0XHRcdCflj6/pgbjnmoTnkIbnlLHvvIznlKjmlrzmm7/mj5vpoJDoqK3nkIbnlLHjgILlj6rlnKjluLjopo/lsIHpjpbmqKHmnb/kuK3mnInmlYjjgIInXG5cdFx0XHRcdCksXG5cdFx0XHRcdHZhbHVlOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYmxvY2tfcmVhc29uLFxuXHRcdFx0XHRzaXplOiA2MCxcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGJsb2NrQm94KSB7XG5cdFx0XHRcdGZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdG5hbWU6ICdibGFua19kdXJhdGlvbicsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3lnKjmqKHmnb/kuK3ljIXlkKvlsIHnpoHmnJ/pmZAnLCAn5LiN5Zyo5qih5p2/5Lit5YyF5ZCr5bCB6Y6W5pyf6ZmQJyksXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ibGFua19kdXJhdGlvbixcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmqKHmnb/lsIbkvJrmmL7npLrigJzkuIDmrrXml7bpl7TigJ3ogIzkuI3mmK/lhbfkvZPml7bplb8nLFxuXHRcdFx0XHRcdFx0XHRcdCfmqKHmnb/lsIfmnIPpoa/npLrjgIzkuIDmrrXmmYLplpPjgI3ogIzkuI3mmK/lhbfpq5TmmYLplbcnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3og73nvJbovpHoh6rlt7HnmoTorqjorrrpobUnLCAn5LiN6IO957eo6Lyv6Ieq5bex55qE6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdub3RhbGsnLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMubm90YWxrLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+eUqOatpOWcqOWwgeemgeaooeadv+S4reaMh+aYjuivpeeUqOaIt+e8lui+keiuqOiuuumhteeahOadg+mZkOW3suiiq+enu+mZpCcsXG5cdFx0XHRcdFx0XHRcdFx0J+eUqOatpOWcqOWwgemOluaooeadv+S4reaMh+aYjuipsuS9v+eUqOiAhee3qOi8r+iojuirlumggeeahOasiumZkOW3suiiq+enu+mZpCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S4jeiDveWPkemAgeeUteWtkOmCruS7ticsICfkuI3og73lgrPpgIHpm7vlrZDpg7Xku7YnKSxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ25vZW1haWxfdGVtcGxhdGUnLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMubm9lbWFpbF90ZW1wbGF0ZSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHnpoHmqKHmnb/kuK3mjIfmmI7or6XnlKjmiLflj5HpgIHnlLXlrZDpgq7ku7bnmoTmnYPpmZDlt7Looqvnp7vpmaQnLFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHpjpbmqKHmnb/kuK3mjIfmmI7oqbLkvb/nlKjogIXlgrPpgIHpm7vlrZDpg7Xku7bnmoTmrIrpmZDlt7Looqvnp7vpmaQnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3og73liJvlu7rotKblj7cnLCAn5LiN6IO95bu656uL6LOs6JmfJyksXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdub2NyZWF0ZV90ZW1wbGF0ZScsXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ub2NyZWF0ZV90ZW1wbGF0ZSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHnpoHmqKHmnb/kuK3mjIfmmI7or6XnlKjmiLfliJvlu7rotKblj7fnmoTmnYPpmZDlt7Looqvnp7vpmaQnLFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHpjpbmqKHmnb/kuK3mjIfmmI7oqbLkvb/nlKjogIXlu7rnq4vos6zomZ/nmoTmrIrpmZDlt7Looqvnp7vpmaQnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgJHByZXZpZXdsaW5rID0gJCgnPGE+JykuYXR0cignaWQnLCAndHdpbmtsZWJsb2NrLXByZXZpZXctbGluaycpLnRleHQod2luZG93LndnVUxTKCfpooTop4gnLCAn6aCQ6Ka9JykpO1xuXHRcdFx0JHByZXZpZXdsaW5rLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2sucHJldmlldygkZm9ybVswXSk7XG5cdFx0XHR9KTtcblx0XHRcdCRwcmV2aWV3bGluay5jc3Moe1xuXHRcdFx0XHRjdXJzb3I6ICdwb2ludGVyJyxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0aWQ6ICdibG9ja3ByZXZpZXcnLFxuXHRcdFx0XHRsYWJlbDogWyRwcmV2aWV3bGlua1swXV0sXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdGlkOiAndHdpbmtsZWJsb2NrLXByZXZpZXdib3gnLFxuXHRcdFx0XHRzdHlsZTogJ2Rpc3BsYXk6IG5vbmUnLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmICh0YWdCb3gpIHtcblx0XHRcdGZpZWxkX3RhZ19vcHRpb25zID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w55So5oi36aG1JywgJ+aomeiomOS9v+eUqOiAhemggemdoicpLFxuXHRcdFx0XHRuYW1lOiAnZmllbGRfdGFnX29wdGlvbnMnLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF90YWdfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRuYW1lOiAndGFnJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCJ5oup55So5oi36aG15qih5p2/77yaJywgJ+mBuOaTh+S9v+eUqOiAhemggemdouaooeadv++8micpLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IGB7e0Jsb2NrZWQgdXNlcn1977yaJHt3aW5kb3cud2dVTFMoJ+S4gOiIrOawuOS5heWwgeemgScsICfkuIDoiKzmsLjkuYXlsIHpjpYnKX1gLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdCbG9ja2VkIHVzZXInLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IGB7e1NvY2twdXBwZXR9fe+8miR7d2luZG93LndnVUxTKCflgoDlhKHotKblj7cnLCAn5YKA5YSh6LOs6JmfJyl9YCxcblx0XHRcdFx0XHRcdHZhbHVlOiAnU29ja3B1cHBldCcsXG5cdFx0XHRcdFx0XHRzdWJncm91cDogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogJ3NwcFVzZXJuYW1lJyxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S4u+i0puWPt+eUqOaIt+WQje+8micsICfkuLvos6zomZ/kvb/nlKjogIXlkI3nqLHvvJonKSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdzcHBUeXBlJyxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnirbmgIHvvJonLCAn54uA5oWL77yaJyksXG5cdFx0XHRcdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdibG9ja2VkJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGBibG9ja2VkIC0gJHt3aW5kb3cud2dVTFMoJ+S7heS+neihjOS4uuivgeaNruiupOWumicsICflg4Xkvp3ooYzngrrorYnmk5roqo3lrponKX1gLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3Byb3ZlbicsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBgcHJvdmVuIC0gJHt3aW5kb3cud2dVTFMoJ+e7j+WCgOWEoeiwg+afpeehruiupCcsICfntpPlgoDlhKHoqr/mn6Xnorroqo0nKX1gLFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnY29uZmlybWVkJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGBjb25maXJtZWQgLSAke3dpbmRvdy53Z1VMUygn57uP5p+l5qC456Gu6K6kJywgJ+e2k+afpeaguOeiuuiqjScpfWAsXG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnc3BwRXZpZGVuY2UnLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qC55o2u4oCm4oCm56Gu5a6a77yaJywgJ+agueaTmuKApuKApueiuuWumu+8micpLFxuXHRcdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfnuq/mloflrZfmiJbmmK/luKZbW11d55qE6ZO+5o6l77yM5L6L5aaC77yaW1tTcGVjaWFsOuWbuuWumumTvuaOpS94eHh4eHh4eHznlKjmiLfmn6XmoLhdXScsXG5cdFx0XHRcdFx0XHRcdFx0XHQn57SU5paH5a2X5oiW5piv5bi2W1tdXeeahOmAo+e1kO+8jOS+i+Wmgu+8mltbU3BlY2lhbDrlm7rlrprpk77mjqUveHh4eHh4eHh855So5oi25p+l5qC4XV0nXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogYHt7U29ja3B1cHBldGVlcnxibG9ja2VkfX3vvJoke3dpbmRvdy53Z1VMUygn5YKA5YSh5Li76LSm5Y+3JywgJ+WCgOWEoeS4u+izrOiZnycpfWAsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ1NvY2twdXBwZXRlZXInLFxuXHRcdFx0XHRcdFx0c3ViZ3JvdXA6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnc3BtQ2hlY2tlZCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnc3BtQ2hlY2tlZCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+e7j+eUqOaIt+afpeaguOehruiupCcsICfntpPkvb/nlKjogIXmn6XmoLjnorroqo0nKSxcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdzcG1FdmlkZW5jZScsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpop3lpJbnkIbnlLHvvJonLCAn6aGN5aSW55CG55Sx77yaJyksXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKHVuYmxvY2tCb3gpIHtcblx0XHRcdGZpZWxkX3VuYmxvY2tfb3B0aW9ucyA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ino+mZpOWwgeemgemAiemhuScsICfop6PpmaTlsIHpjpbpgbjpoIUnKSxcblx0XHRcdFx0bmFtZTogJ2ZpZWxkX3VuYmxvY2tfb3B0aW9ucycsXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX3VuYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAndGV4dGFyZWEnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnkIbnlLHvvIjnlKjkuo7lsIHnpoHml6Xlv5fvvInvvJonLCAn55CG55Sx77yI55So5pa85bCB6Y6W5pel6KqM77yJ77yaJyksXG5cdFx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0XHR2YWx1ZTogVHdpbmtsZS5ibG9jay5maWVsZF91bmJsb2NrX29wdGlvbnMucmVhc29uLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGxldCBvbGRmaWVsZDtcblx0XHRpZiAoZmllbGRfcHJlc2V0KSB7XG5cdFx0XHRbb2xkZmllbGRdID0gJGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3ByZXNldFwiXScpO1xuXHRcdFx0b2xkZmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZmllbGRfcHJlc2V0LnJlbmRlcigpLCBvbGRmaWVsZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRmb3JtLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZF9wcmVzZXRcIl0nKS5oaWRlKCk7XG5cdFx0fVxuXHRcdGlmIChmaWVsZF9ibG9ja19vcHRpb25zKSB7XG5cdFx0XHRbb2xkZmllbGRdID0gJGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX2Jsb2NrX29wdGlvbnNcIl0nKTtcblx0XHRcdG9sZGZpZWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGZpZWxkX2Jsb2NrX29wdGlvbnMucmVuZGVyKCksIG9sZGZpZWxkKTtcblx0XHRcdCRmb3JtLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZF82NFwiXScpLnNob3coKTtcblx0XHRcdCRmb3JtLmZpbmQoJ1tuYW1lPXBhZ2VyZXN0cmljdGlvbnNdJykuc2VsZWN0Mih7XG5cdFx0XHRcdHdpZHRoOiAnMTAwJScsXG5cdFx0XHRcdHBsYWNlaG9sZGVyOiB3aW5kb3cud2dVTFMoJ+i+k+WFpeimgemYu+atoueUqOaIt+e8lui+keeahOmhtemdoicsICfovLjlhaXopoHpmLvmraLkvb/nlKjogIXnt6jovK/nmoTpoIHpnaInKSxcblx0XHRcdFx0bGFuZ3VhZ2U6IHtcblx0XHRcdFx0XHRlcnJvckxvYWRpbmc6ICgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB3aW5kb3cud2dVTFMoJ+aQnOe0ouivjeaxh+S4jeWujOaVtOaIluaXoOaViCcsICfmkJzlsIvoqZ7lvZnkuI3lrozmlbTmiJbnhKHmlYgnKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtYXhpbXVtU2VsZWN0aW9uTGVuZ3RoOiAxMCxcblx0XHRcdFx0bWluaW11bUlucHV0TGVuZ3RoOiAxLFxuXHRcdFx0XHRhamF4OiB7XG5cdFx0XHRcdFx0dXJsOiBtdy51dGlsLndpa2lTY3JpcHQoJ2FwaScpLFxuXHRcdFx0XHRcdGRhdGFUeXBlOiAnanNvbicsXG5cdFx0XHRcdFx0ZGVsYXk6IDEwMCxcblx0XHRcdFx0XHRkYXRhOiAocGFyYW1zKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCB0aXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhcmFtcy50ZXJtKTtcblx0XHRcdFx0XHRcdGlmICghdGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdFx0XHRcdFx0bGlzdDogJ2FsbHBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0YXBmcm9tOiB0aXRsZS50aXRsZSxcblx0XHRcdFx0XHRcdFx0YXBuYW1lc3BhY2U6IHRpdGxlLm5hbWVzcGFjZSxcblx0XHRcdFx0XHRcdFx0YXBsaW1pdDogJzEwJyxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwcm9jZXNzUmVzdWx0czogKGRhdGEpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHM6IGRhdGEucXVlcnkuYWxscGFnZXMubWFwKChwYWdlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChwYWdlLnRpdGxlLCBwYWdlLm5zKS50b1RleHQoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWQ6IHRpdGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogdGl0bGUsXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRlbXBsYXRlU2VsZWN0aW9uOiAoY2hvaWNlKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuICQoJzxhPicpXG5cdFx0XHRcdFx0XHQudGV4dChjaG9pY2UudGV4dClcblx0XHRcdFx0XHRcdC5hdHRyKHtcblx0XHRcdFx0XHRcdFx0aHJlZjogbXcudXRpbC5nZXRVcmwoY2hvaWNlLnRleHQpLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6ICdfYmxhbmsnLFxuXHRcdFx0XHRcdFx0XHRyZWw6ICdub29wZW5lciBub3JlZmVycmVyJyxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0XHQkZm9ybS5maW5kKCdbbmFtZT1uYW1lc3BhY2VyZXN0cmljdGlvbnNdJykuc2VsZWN0Mih7XG5cdFx0XHRcdHdpZHRoOiAnMTAwJScsXG5cdFx0XHRcdG1hdGNoZXI6IE1vcmViaXRzLnNlbGVjdDIubWF0Y2hlcnMud29yZEJlZ2lubmluZyxcblx0XHRcdFx0bGFuZ3VhZ2U6IHtcblx0XHRcdFx0XHRzZWFyY2hpbmc6IE1vcmViaXRzLnNlbGVjdDIucXVlcnlJbnRlcmNlcHRvcixcblx0XHRcdFx0fSxcblx0XHRcdFx0dGVtcGxhdGVSZXN1bHQ6IE1vcmViaXRzLnNlbGVjdDIuaGlnaGxpZ2h0U2VhcmNoTWF0Y2hlcyxcblx0XHRcdFx0cGxhY2Vob2xkZXI6IHdpbmRvdy53Z1VMUygn6YCJ5oup6KaB56aB5q2i55So5oi357yW6L6R55qE5ZG95ZCN56m66Ze0JywgJ+mBuOaTh+imgeemgeatouS9v+eUqOiAhee3qOi8r+eahOWRveWQjeepuumWkycpLFxuXHRcdFx0fSk7XG5cdFx0XHRtdy51dGlsLmFkZENTUyhcblx0XHRcdFx0LyogUmVkdWNlIHBhZGRpbmc7XG5cdFx0XHRcdCAqIEFkanVzdCBmb250IHNpemU7XG5cdFx0XHRcdCAqIFJlbW92ZSBibGFjayBib3JkZXI7XG5cdFx0XHRcdCAqIE1ha2UgdGhlIHRpbnkgY3Jvc3MgbGFyZ2VyXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHQnLnNlbGVjdDItcmVzdWx0cyAuc2VsZWN0Mi1yZXN1bHRzX19vcHRpb257cGFkZGluZy10b3A6MXB4O3BhZGRpbmctYm90dG9tOjFweH0uc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdDItZHJvcGRvd24gLnNlbGVjdDItcmVzdWx0cywuc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdGlvbiAuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVke2ZvbnQtc2l6ZToxM3B4fS5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdC5zZWxlY3QyLWNvbnRhaW5lci0tZm9jdXMgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZXtib3JkZXI6MXB4IHNvbGlkICNhYWF9LnNlbGVjdDItc2VsZWN0aW9uX19jaG9pY2VfX3JlbW92ZXtmb250LXNpemU6MTI1JX0nXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkZm9ybS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfYmxvY2tfb3B0aW9uc1wiXScpLmhpZGUoKTtcblx0XHRcdCRmb3JtLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZF82NFwiXScpLmhpZGUoKTtcblx0XHRcdC8vIENsZWFyIHNlbGVjdDIgb3B0aW9uc1xuXHRcdFx0JGZvcm0uZmluZCgnW25hbWU9cGFnZXJlc3RyaWN0aW9uc10nKS52YWwobnVsbCkudHJpZ2dlcignY2hhbmdlJyk7XG5cdFx0XHQkZm9ybS5maW5kKCdbbmFtZT1uYW1lc3BhY2VyZXN0cmljdGlvbnNdJykudmFsKG51bGwpLnRyaWdnZXIoJ2NoYW5nZScpO1xuXHRcdH1cblx0XHRpZiAoZmllbGRfdGVtcGxhdGVfb3B0aW9ucykge1xuXHRcdFx0W29sZGZpZWxkXSA9ICRmb3JtLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZF90ZW1wbGF0ZV9vcHRpb25zXCJdJyk7XG5cdFx0XHRvbGRmaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmaWVsZF90ZW1wbGF0ZV9vcHRpb25zLnJlbmRlcigpLCBvbGRmaWVsZCk7XG5cdFx0XHRlLnRhcmdldC5mb3JtLnJvb3QucHJldmlld2VyID0gbmV3IE1vcmViaXRzLndpa2kucHJldmlldyhcblx0XHRcdFx0JChlLnRhcmdldC5mb3JtLnJvb3QpLmZpbmQoJyN0d2lua2xlYmxvY2stcHJldmlld2JveCcpLmxhc3QoKVswXVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3RlbXBsYXRlX29wdGlvbnNcIl0nKS5oaWRlKCk7XG5cdFx0fVxuXHRcdGlmIChmaWVsZF90YWdfb3B0aW9ucykge1xuXHRcdFx0W29sZGZpZWxkXSA9ICRmb3JtLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZF90YWdfb3B0aW9uc1wiXScpO1xuXHRcdFx0b2xkZmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZmllbGRfdGFnX29wdGlvbnMucmVuZGVyKCksIG9sZGZpZWxkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3RhZ19vcHRpb25zXCJdJykuaGlkZSgpO1xuXHRcdH1cblx0XHRpZiAoZmllbGRfdW5ibG9ja19vcHRpb25zKSB7XG5cdFx0XHRbb2xkZmllbGRdID0gJGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3VuYmxvY2tfb3B0aW9uc1wiXScpO1xuXHRcdFx0b2xkZmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZmllbGRfdW5ibG9ja19vcHRpb25zLnJlbmRlcigpLCBvbGRmaWVsZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRmb3JtLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZF91bmJsb2NrX29wdGlvbnNcIl0nKS5oaWRlKCk7XG5cdFx0fVxuXHRcdC8vIEFueSBibG9jaywgaW5jbHVkaW5nIHJhbmdlc1xuXHRcdGlmIChUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8pIHtcblx0XHRcdC8vIGZhbHNlIGZvciBhbiBpcCBjb3ZlcmVkIGJ5IGEgcmFuZ2Ugb3IgYSBzbWFsbGVyIHJhbmdlIHdpdGhpbiBhIGxhcmdlciByYW5nZTtcblx0XHRcdC8vIHRydWUgZm9yIGEgdXNlciwgc2luZ2xlIGlwIGJsb2NrLCBvciB0aGUgZXhhY3QgcmFuZ2UgZm9yIGEgcmFuZ2UgYmxvY2tcblx0XHRcdGNvbnN0IHNhbWVVc2VyID0gYmxvY2tlZFVzZXJOYW1lID09PSByZWxldmFudFVzZXJOYW1lO1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoJGJvZHkuZmluZCgnZGl2W25hbWU9XCJjdXJyZW50YmxvY2tcIl0gc3BhbicpLmxhc3QoKVswXSk7XG5cdFx0XHRsZXQgc3RhdHVzU3RyID0gYCR7cmVsZXZhbnRVc2VyTmFtZX3lt7Looqske1xuXHRcdFx0XHRUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8ucGFydGlhbCA9PT0gJydcblx0XHRcdFx0XHQ/IHdpbmRvdy53Z1VMUygn6YOo5YiG5bCB56aBJywgJ+mDqOWIhuWwgemOlicpXG5cdFx0XHRcdFx0OiB3aW5kb3cud2dVTFMoJ+WFqOermeWwgeemgScsICflhajnq5nlsIHpjpYnKVxuXHRcdFx0fWA7XG5cdFx0XHQvLyBSYW5nZSBibG9ja2VkXG5cdFx0XHRpZiAoVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLnJhbmdlc3RhcnQgIT09IFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mby5yYW5nZWVuZCkge1xuXHRcdFx0XHRpZiAoc2FtZVVzZXIpIHtcblx0XHRcdFx0XHRzdGF0dXNTdHIgKz0gd2luZG93LndnVUxTKCfvvIjmrrXlsIHnpoHvvIknLCAn77yI5q615bCB6Y6W77yJJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ2hhbmdlIG9yZGVyXG5cdFx0XHRcdFx0Ly8gTGluayB0byB0aGUgZnVsbCByYW5nZVxuXHRcdFx0XHRcdGNvbnN0ICRyYW5nZWJsb2NrbG9nbGluayA9ICQoJzxzcGFuPicpLmFwcGVuZChcblx0XHRcdFx0XHRcdCQoXG5cdFx0XHRcdFx0XHRcdGA8YSByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdTcGVjaWFsOkxvZycsIHtcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb246ICd2aWV3Jyxcblx0XHRcdFx0XHRcdFx0XHRwYWdlOiBibG9ja2VkVXNlck5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2Jsb2NrJyxcblx0XHRcdFx0XHRcdFx0fSl9XCI+JHtcblx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5pcC5nZXQ2NChyZWxldmFudFVzZXJOYW1lKSA9PT0gYmxvY2tlZFVzZXJOYW1lID8gJy82NCcgOiBibG9ja2VkVXNlck5hbWVcblx0XHRcdFx0XHRcdFx0fTwvYT4pYFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0c3RhdHVzU3RyICs9XG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ++8iOS9jeS6jicsICfvvIjkvY3mlrwnKSArXG5cdFx0XHRcdFx0XHQkcmFuZ2VibG9ja2xvZ2xpbmsuaHRtbCgpICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q615bCB56aB5YaF77yJJywgJ+auteWwgemOluWFp++8iScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLmV4cGlyeSA9PT0gJ2luZmluaXR5Jykge1xuXHRcdFx0XHRzdGF0dXNTdHIgKz0gd2luZG93LndnVUxTKCfvvIjml6DpmZDmnJ/vvIknLCAn77yI54Sh6ZmQ5pyf77yJJyk7XG5cdFx0XHR9IGVsc2UgaWYgKG5ldyBNb3JlYml0cy5kYXRlKFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mby5leHBpcnkpLmlzVmFsaWQoKSkge1xuXHRcdFx0XHRzdGF0dXNTdHIgKz0gYCR7XG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfvvIjnu4jmraLkuo4nLCAn77yI57WC5q2i5pa8JykgK1xuXHRcdFx0XHRcdG5ldyBNb3JlYml0cy5kYXRlKFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mby5leHBpcnkpLmNhbGVuZGFyKCd1dGMnKVxuXHRcdFx0XHR977yJYDtcblx0XHRcdH1cblx0XHRcdGxldCBpbmZvU3RyID0gd2luZG93LndnVUxTKCfmraTooajljZXlsIYnLCAn5q2k6KGo5Zau5bCHJyk7XG5cdFx0XHRpZiAoc2FtZVVzZXIpIHtcblx0XHRcdFx0aW5mb1N0ciArPSB3aW5kb3cud2dVTFMoJ+abtOaUueWwgeemgScsICforormm7TlsIHpjpYnKTtcblx0XHRcdFx0aWYgKFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mby5wYXJ0aWFsID09PSB1bmRlZmluZWQgJiYgcGFydGlhbEJveCkge1xuXHRcdFx0XHRcdGluZm9TdHIgKz0gd2luZG93LndnVUxTKCfkuLrpg6jliIblsIHnpoEnLCAn54K66YOo5YiG5bCB6Y6WJyk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLnBhcnRpYWwgPT09ICcnICYmICFwYXJ0aWFsQm94KSB7XG5cdFx0XHRcdFx0aW5mb1N0ciArPSB3aW5kb3cud2dVTFMoJ+S4uuWFqOermeWwgeemgScsICfngrrlhajnq5nlsIHpjpYnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmZvU3RyICs9ICfjgIInO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5mb1N0ciArPVxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg5LiK6aKd5aSW55qEJywgJ+WKoOS4iumhjeWklueahCcpICtcblx0XHRcdFx0XHQocGFydGlhbEJveCA/ICfpg6jliIYnIDogJycpICtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WwgeemgeOAgicsICflsIHpjpbjgIInKTtcblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKHN0YXR1c1N0ciwgaW5mb1N0cik7XG5cdFx0XHQvLyBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IGJsb2NrIGNvbmRpdGlvbnMgb24gaW50aWFsIGZvcm0gZ2VuZXJhdGlvblxuXHRcdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay51cGRhdGVfZm9ybShlLCBUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8pO1xuXHRcdH1cblx0XHQvLyBUaGlzIGlzIHdoZXJlIFQxNDY2MjggcmVhbGx5IGNvbWVzIGludG8gcGxheTogYSByYW5nZWJsb2NrIHdpbGxcblx0XHQvLyBvbmx5IHJldHVybiB0aGUgY29ycmVjdCBibG9jayBsb2cgaWYgd2dSZWxldmFudFVzZXJOYW1lIGlzIHRoZVxuXHRcdC8vIGV4YWN0IHJhbmdlLCBub3QgbWVyZWx5IGEgZnVudGlvbmFsIGVxdWl2YWxlbnRcblx0XHRpZiAoVHdpbmtsZS5ibG9jay5oYXNCbG9ja0xvZykge1xuXHRcdFx0Ly8gQWRkIG1vcmUgZGV0YWlsc1xuXHRcdFx0Y29uc3QgYmxvY2tsb2dpbmZvID0gW107XG5cdFx0XHRjb25zdCAkYmxvY2tsb2dsaW5rID0gJCgnPHNwYW4+JykuYXBwZW5kKFxuXHRcdFx0XHQkKFxuXHRcdFx0XHRcdGA8YSByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdTcGVjaWFsOkxvZycsIHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3ZpZXcnLFxuXHRcdFx0XHRcdFx0cGFnZTogcmVsZXZhbnRVc2VyTmFtZSxcblx0XHRcdFx0XHRcdHR5cGU6ICdibG9jaycsXG5cdFx0XHRcdFx0fSl9XCI+JHt3aW5kb3cud2dVTFMoJ+WwgeemgeaXpeW/lycsICflsIHpjpbml6XoqownKX08L2E+KWBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdGlmIChUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8pIHtcblx0XHRcdFx0YmxvY2tsb2dpbmZvW2Jsb2NrbG9naW5mby5sZW5ndGhdID0gd2luZG93LndnVUxTKCflsIHnpoHor6bmg4UnLCAn5bCB6Y6W6Kmz5oOFJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBbbGFzdEJsb2NrQWN0aW9uXSA9IFR3aW5rbGUuYmxvY2suYmxvY2tMb2c7XG5cdFx0XHRcdGNvbnN0IGJsb2NrQWN0aW9uID0gbGFzdEJsb2NrQWN0aW9uLmFjdGlvbiA9PT0gJ3VuYmxvY2snID8gVHdpbmtsZS5ibG9jay5ibG9ja0xvZ1sxXSA6IGxhc3RCbG9ja0FjdGlvbjtcblx0XHRcdFx0YmxvY2tsb2dpbmZvW2Jsb2NrbG9naW5mby5sZW5ndGhdID1cblx0XHRcdFx0XHQoYOatpCR7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5pcC5pc1JhbmdlKHJlbGV2YW50VXNlck5hbWUpXG5cdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCdJUOiMg+WbtCcsICdJUOevhOWcjScpXG5cdFx0XHRcdFx0XHRcdDogd2luZG93LndnVUxTKCfnlKjmiLcnLCAn5L2/55So6ICFJylcblx0XHRcdFx0XHR95pu+5ZyoYCxcblx0XHRcdFx0XHQkKCc8Yj4nKS50ZXh0KG5ldyBNb3JlYml0cy5kYXRlKGJsb2NrQWN0aW9uLnRpbWVzdGFtcCkuY2FsZW5kYXIoJ3V0YycpKVswXSxcblx0XHRcdFx0XHRg6KKrJHtibG9ja0FjdGlvbi51c2VyfSR7d2luZG93LndnVUxTKCflsIHnpoEnLCAn5bCB6Y6WJyl9YCxcblx0XHRcdFx0XHQkKCc8Yj4nKS50ZXh0KE1vcmViaXRzLnN0cmluZy5mb3JtYXRUaW1lKGJsb2NrQWN0aW9uLnBhcmFtcy5kdXJhdGlvbikpWzBdKTtcblx0XHRcdFx0aWYgKGxhc3RCbG9ja0FjdGlvbi5hY3Rpb24gPT09ICd1bmJsb2NrJykge1xuXHRcdFx0XHRcdGJsb2NrbG9naW5mb1tibG9ja2xvZ2luZm8ubGVuZ3RoXSA9XG5cdFx0XHRcdFx0XHRg77yMJHtuZXcgTW9yZWJpdHMuZGF0ZShsYXN0QmxvY2tBY3Rpb24udGltZXN0YW1wKS5jYWxlbmRhcigndXRjJyl96Kej5bCBYDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBibG9jayBvciByZWJsb2NrXG5cdFx0XHRcdFx0YmxvY2tsb2dpbmZvW2Jsb2NrbG9naW5mby5sZW5ndGhdID1cblx0XHRcdFx0XHRcdGDvvIwke25ldyBNb3JlYml0cy5kYXRlKGJsb2NrQWN0aW9uLnBhcmFtcy5leHBpcnkpLmNhbGVuZGFyKCd1dGMnKX0ke3dpbmRvdy53Z1VMUygn6L+H5pyfJywgJ+mBjuacnycpfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KCRib2R5LmZpbmQoJ2RpdltuYW1lPVwiaGFzYmxvY2tsb2dcIl0gc3BhbicpLmxhc3QoKVswXSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMud2FybihibG9ja2xvZ2luZm8sICRibG9ja2xvZ2xpbmtbMF0pO1xuXHRcdH1cblx0XHQvLyBNYWtlIHN1cmUgYWxsIHRoZSBmaWVsZHMgYXJlIGNvcnJlY3QgYmFzZWQgb24gaW5pdGlhbCBkZWZhdWx0c1xuXHRcdGlmIChibG9ja0JveCkge1xuXHRcdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfcHJlc2V0KGUpO1xuXHRcdH0gZWxzZSBpZiAodGVtcGxhdGVCb3gpIHtcblx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX3RlbXBsYXRlKGUpO1xuXHRcdH1cblx0fTtcblx0LyoqXG5cdCAqIEtlZXAgYWxwaGFiZXRpemVkIGJ5IGtleSBuYW1lLCBUd2lua2xlLmJsb2NrLmJsb2NrR3JvdXBzIGVzdGFibGlzaGVzXG5cdCAqICAgIHRoZSBvcmRlciB0aGV5IHdpbGwgYXBwZWFyIGluIHRoZSBpbnRlcmZhY2Vcblx0ICpcblx0ICogQmxvY2sgcHJlc2V0IGZvcm1hdCwgYWxsIGtleXMgYWNjZXB0IG9ubHkgJ3RydWUnIChvbWl0IGZvciBmYWxzZSkgZXhjZXB0IHdoZXJlIG5vdGVkOlxuXHQgKiA8dGl0bGUgb2YgYmxvY2sgdGVtcGxhdGU+IDoge1xuXHQgKiAgIGF1dG9ibG9jazogPGF1dG9ibG9jayBhbnkgSVAgYWRkcmVzc2VzIHVzZWQgKGZvciByZWdpc3RlcmVkIHVzZXJzIG9ubHkpPlxuXHQgKiAgIGRpc2FibGV0YWxrOiA8ZGlzYWJsZSB1c2VyIGZyb20gZWRpdGluZyB0aGVpciBvd24gdGFsayBwYWdlIHdoaWxlIGJsb2NrZWQ+XG5cdCAqICAgZXhwaXJ5OiA8c3RyaW5nIC0gZXhwaXJ5IHRpbWVzdGFtcCwgY2FuIGluY2x1ZGUgcmVsYXRpdmUgdGltZXMgbGlrZSBcIjUgbW9udGhzXCIsIFwiMiB3ZWVrc1wiIGV0Yz5cblx0ICogICBmb3JBbm9uT25seTogPHNob3cgYmxvY2sgb3B0aW9uIGluIHRoZSBpbnRlcmZhY2Ugb25seSBpZiB0aGUgcmVsZXZhbnQgdXNlciBpcyBhbiBJUD5cblx0ICogICBmb3JSZWdpc3RlcmVkT25seTogPHNob3cgYmxvY2sgb3B0aW9uIGluIHRoZSBpbnRlcmZhY2Ugb25seSBpZiB0aGUgcmVsZXZhbnQgdXNlciBpcyByZWdpc3RlcmVkPlxuXHQgKiAgIGxhYmVsOiA8c3RyaW5nIC0gbGFiZWwgZm9yIHRoZSBvcHRpb24gb2YgdGhlIGRyb3Bkb3duIGluIHRoZSBpbnRlcmZhY2UgKGtlZXAgYnJpZWYpPlxuXHQgKiAgIG5vZW1haWw6IHByZXZlbnQgdGhlIHVzZXIgZnJvbSBzZW5kaW5nIGVtYWlsIHRocm91Z2ggU3BlY2lhbDpFbWFpbHVzZXJcblx0ICogICBwYWdlUGFyYW06IDxzZXQgaWYgdGhlIGFzc29jaWF0ZWQgYmxvY2sgdGVtcGxhdGUgYWNjZXB0cyBhIHBhZ2UgcGFyYW1ldGVyPlxuXHQgKiAgIHByZXBlbmRSZWFzb246IDxzdHJpbmcgLSBwcmVwZW5kcyB0aGUgdmFsdWUgb2YgJ3JlYXNvbicgdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgcmVhc29uLCBuYW1lbHkgZm9yIHdoZW4gcmV2b2tpbmcgdGFsayBwYWdlIGFjY2Vzcz5cblx0ICogICBub2NyZWF0ZTogPGJsb2NrIGFjY291bnQgY3JlYXRpb24gZnJvbSB0aGUgdXNlcidzIElQIChmb3IgYW5vbnltb3VzIHVzZXJzIG9ubHkpPlxuXHQgKiAgIG5vbnN0YW5kYXJkOiA8dGVtcGxhdGUgZG9lcyBub3QgY29uZm9ybSB0byBzdGV3YXJkc2hpcCBvZiBbW2Vud2lraTpXaWtpUHJvamVjdCBVc2VyIFdhcm5pbmdzXV0gYW5kIG1heSBub3QgYWNjZXB0IHN0YW5kYXJkIHBhcmFtZXRlcnM+XG5cdCAqICAgcmVhc29uOiA8c3RyaW5nIC0gYmxvY2sgcmF0aW9uYWxlLCBhcyB3b3VsZCBhcHBlYXIgaW4gdGhlIGJsb2NrIGxvZyxcblx0ICogICAgICAgICAgICBhbmQgdGhlIGVkaXQgc3VtbWFyeSBmb3Igd2hlbiBhZGRpbmcgYmxvY2sgdGVtcGxhdGUsIHVubGVzcyAnc3VtbWFyeScgaXMgc2V0PlxuXHQgKiAgIHJlYXNvblBhcmFtOiA8c2V0IGlmIHRoZSBhc3NvY2lhdGVkIGJsb2NrIHRlbXBsYXRlIGFjY2VwdHMgYSByZWFzb24gcGFyYW1ldGVyPlxuXHQgKiAgIHNpZzogPHN0cmluZyAtIHNldCB0byB+fn5+IGlmIGJsb2NrIHRlbXBsYXRlIGRvZXMgbm90IGFjY2VwdCBcInRydWVcIiBhcyB0aGUgdmFsdWUsIG9yIHNldCBudWxsIHRvIG9taXQgc2lnIHBhcmFtIGFsdG9nZXRoZXI+XG5cdCAqICAgc3VtbWFyeTogPHN0cmluZyAtIGVkaXQgc3VtbWFyeSBmb3Igd2hlbiBhZGRpbmcgYmxvY2sgdGVtcGxhdGUgdG8gdXNlcidzIHRhbGsgcGFnZSwgaWYgbm90IHNldCwgJ3JlYXNvbicgaXMgdXNlZD5cblx0ICogICBzdXBwcmVzc0FydGljbGVJblN1bW1hcnk6IDxzZXQgdG8gc3VwcHJlc3Mgc2hvd2luZyB0aGUgYXJ0aWNsZSBuYW1lIGluIHRoZSBlZGl0IHN1bW1hcnksIGFzIHdpdGggYXR0YWNrIHBhZ2VzPlxuXHQgKiAgIHRlbXBsYXRlTmFtZTogPHN0cmluZyAtIG5hbWUgb2YgdGVtcGxhdGUgdG8gdXNlIChpbnN0ZWFkIG9mIGtleSBuYW1lKSwgZW50cnkgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIFRlbXBsYXRlcyBsaXN0LlxuXHQgKiAgICAgICAgICAgICAgICAgIChlLmcuIHVzZSBhbm90aGVyIHRlbXBsYXRlIGJ1dCB3aXRoIGRpZmZlcmVudCBibG9jayBvcHRpb25zKT5cblx0ICogICB1c2VJbml0aWFsT3B0aW9uczogPHdoZW4gcHJlc2V0IGlzIGNob3Nlbiwgb25seSBjaGFuZ2UgZ2l2ZW4gYmxvY2sgb3B0aW9ucywgbGVhdmUgb3RoZXJzIGFzIHRoZXkgd2VyZT5cblx0ICpcblx0ICogV0FSTklORzogJ2Fub25vbmx5JyBhbmQgJ2FsbG93dXNlcnRhbGsnIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuXG5cdCAqICAgVG8gZGlzYWJsZSwgc2V0ICdoYXJkYmxvY2snIGFuZCAnZGlzYWJsZXRhbGsnLCByZXNwZWN0aXZlbHlcblx0ICovXG5cdFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mbyA9IHtcblx0XHQvLyB1dy1wcmVmaXhlZFxuXHRcdCd1dy1ibG9jayc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJzEgZGF5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCa55+lJywgJ+WwgemOlumAmuefpScpLFxuXHRcdFx0c3VwcHJlc3NBcnRpY2xlSW5TdW1tYXJ5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J3V3LWJsb2NraW5kZWYnOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICdpbmZpbml0eScsXG5cdFx0XHRmb3JSZWdpc3RlcmVkT25seTogdHJ1ZSxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cGFnZVBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uUGFyYW06IHRydWUsXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpScsICflsIHpjpbpgJrnn6UnKSxcblx0XHRcdHN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCd1dy1ibG9ja25vdGFsayc6IHtcblx0XHRcdGRpc2FibGV0YWxrOiB0cnVlLFxuXHRcdFx0cGFnZVBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uUGFyYW06IHRydWUsXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8muemgeatoue8lui+keiuqOiuuumhtScsICflsIHpjpbpgJrnn6XvvJrnpoHmraLnt6jovK/oqI7oq5bpoIEnKSxcblx0XHRcdHN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCd1dy0zYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIGRheScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfov53lj41bW1FXOjNSUnzlm57pgIDkuI3ov4fkuInljp/liJldXScsICfpgZXlj41bW1FXOjNSUnzlm57pgIDkuI3pgY7kuInljp/liYddXScpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCflsIHnpoHpgJrnn6XvvJrov53lj41bW1FXOjNSUnzlm57pgIDkuI3ov4fkuInljp/liJldXScsICflsIHpjpbpgJrnn6XvvJrpgZXlj41bW1FXOjNSUnzlm57pgIDkuI3pgY7kuInljp/liYddXScpLFxuXHRcdH0sXG5cdFx0J3V3LWFkYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmlaPlj5FbW1FXOlNPQVB85pWj5Y+R5bm/5ZGK5oiW5a6j5LygXV0nLCAn5pWj55m8W1tRVzpTT0FQfOaVo+eZvOW7o+WRiuaIluWuo+WCs11dJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrmlaPlj5FbW1FXOlNPQVB85pWj5Y+R5bm/5ZGK5oiW5a6j5LygXV0nLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya5pWj55m8W1tRVzpTT0FQfOaVo+eZvOW7o+WRiuaIluWuo+WCs11dJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdCd1dy1hdHRhY2tibG9jayc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJzEgZGF5Jyxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdbW1FXOkNJVnzooYzkuLrml6DnpLxdXeaIlltbUVc6TlBBfOS6uui6q+aUu+WHu11dJyxcblx0XHRcdFx0J1tbUVc6Q0lWfOihjOeCuueEoeemrl1d5oiWW1tRVzpOUEF85Lq66Lqr5pS75pOKXV0nXG5cdFx0XHQpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5bCB56aB6YCa55+l77yaW1tRVzpDSVZ86KGM5Li65peg56S8XV3miJZbW1FXOk5QQXzkurrouqvmlLvlh7tdXScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJpbW1FXOkNJVnzooYzngrrnhKHnpq5dXeaIlltbUVc6TlBBfOS6uui6q+aUu+aTil1dJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdCd1dy1jb3B5cmlnaHRibG9jayc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cGFnZVBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+aMgee7rVtbUVc6Q09QWVZJT3zkvrXniq/okZfkvZzmnYNdXScsICfmjIHnuoxbW1FXOkNPUFlWSU985L6154qv6JGX5L2c5qyKXV0nKSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCa55+l77ya5oyB57utW1tRVzpDT1BZVklPfOS+teeKr+iRl+S9nOadg11dJywgJ+WwgemOlumAmuefpe+8muaMgee6jFtbUVc6Q09QWVZJT3zkvrXniq/okZfkvZzmrIpdXScpLFxuXHRcdFx0dGVtcGxhdGVOYW1lOiAndXctYmxvY2tpbmRlZicsXG5cdFx0fSxcblx0XHQndXctZGJsb2NrJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5oyB57utW1tRVzpWQU585Yig6Zmk5YaF5a65XV0nLCAn5oyB57qMW1tRVzpWQU585Yiq6Zmk5YWn5a65XV0nKSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCa55+l77ya5oyB57utW1tRVzpWQU585Yig6Zmk5YaF5a65XV0nLCAn5bCB6Y6W6YCa55+l77ya5oyB57qMW1tRVzpWQU585Yiq6Zmk5YWn5a65XV0nKSxcblx0XHR9LFxuXHRcdCd1dy1oYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCdbW1FXOumqmuaJsHzpqprmibBdXeWFtuS7lueUqOaItycsICdbW1FXOumot+aTvnzpqLfmk75dXeWFtuS7luS9v+eUqOiAhScpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCflsIHnpoHpgJrnn6XvvJpbW1FXOumqmuaJsHzpqprmibBdXeWFtuS7lueUqOaItycsICflsIHpjpbpgJrnn6XvvJpbW1FXOumot+aTvnzpqLfmk75dXeWFtuS7luS9v+eUqOiAhScpLFxuXHRcdH0sXG5cdFx0J3V3LXZibG9jayc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJzEgZGF5Jyxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cGFnZVBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ1tbUVc6VkFOfOegtOWdj11dJywgJ1tbUVc6VkFOfOegtOWjnl1dJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8mltbUVc6VkFOfOegtOWdj11dJywgJ+WwgemOlumAmuefpe+8mltbUVc6VkFOfOegtOWjnl1dJyksXG5cdFx0fSxcblx0XHQndXctaWxsZWdhbGJsb2NrJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5oyB57ut5Yqg5YWl5LiN56ym5ZCI5Lit5Zu95Lu35YC86KeC55qE6Z2e5rOV5YaF5a65JywgJ+aMgee6jOWKoOWFpeS4jeespuWQiOS4reWci+WDueWAvOingOeahOmdnuazleWFp+WuuScpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5bCB56aB6YCa55+l77ya5oyB57ut5Yqg5YWl5LiN56ym5ZCI5Lit5Zu95Lu35YC86KeC55qE6Z2e5rOV5YaF5a65Jyxcblx0XHRcdFx0J+WwgemOlumAmuefpe+8muaMgee6jOWKoOWFpeS4jeespuWQiOS4reWci+WDueWAvOingOeahOmdnuazleWFp+WuuSdcblx0XHRcdCksXG5cdFx0fSxcblx0XHQndXctc29ja2Jsb2NrJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSB3ZWVrJyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5rul55SoW1tRVzpTT0NLfOWkmuS4qui0puWPt11dJywgJ+a/q+eUqFtbUVc6U09DS3zlpJrlgIvos6zomZ9dXScpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCflsIHnpoHpgJrnn6XvvJrmu6XnlKhbW1FXOlNPQ0t85aSa5Liq6LSm5Y+3XV0nLCAn5bCB6Y6W6YCa55+l77ya5r+r55SoW1tRVzpTT0NLfOWkmuWAi+izrOiZn11dJyksXG5cdFx0XHR0ZW1wbGF0ZU5hbWU6ICd1dy1ibG9jaycsXG5cdFx0fSxcblx0XHQvLyB1dy11LXByZWZpeGVkXG5cdFx0J3V3LXVibG9jayc6IHtcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0cmVhc29uOiBge3t1dy11YmxvY2t9fTwhLS0gJHt3aW5kb3cud2dVTFMoJ+S4jeW9k+eUqOaIt+WQjeOAgei9r+WwgeemgScsICfkuI3nlbbkvb/nlKjogIXlkI3nqLEnKX0gLS0+YCxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOeahOeUqOaIt+WQjei/neWPjVtbUVc6VXznlKjmiLflkI3mlrnpkohdXScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrmgqjnmoTkvb/nlKjogIXlkI3nqLHpgZXlj41bW1FXOlV85L2/55So6ICF5ZCN56ix5pa56YedXV0nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0J3V3LXVibG9jay1pbGxlZ2FsJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogYHt7dXctdWJsb2NrLWlsbGVnYWx9fTwhLS0gJHt3aW5kb3cud2dVTFMoJ+S4jeWQiOinhOeahOeUqOaIt+WQjScsICfkuI3lkIjopo/nmoTkvb/nlKjogIXlkI3nqLEnKX0gLS0+YCxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOeahOeUqOaIt+WQjei/neWPjVtbUVc6VXznlKjmiLflkI3mlrnpkohdXScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrmgqjnmoTkvb/nlKjogIXlkI3nqLHpgZXlj41bW1FXOlV85L2/55So6ICF5ZCN56ix5pa56YedXV0nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0J3V3LXVibG9jay1zdWdnZXN0aXZlJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogYHt7dXctdWJsb2NrLXN1Z2dlc3RpdmV9fTwhLS0gJHt3aW5kb3cud2dVTFMoJ+ivr+WvvOOAgea3t+a3huaAp+eUqOaIt+WQjScsICfoqqTlsI7jgIHmt7fmt4bmgKfkvb/nlKjogIXlkI3nqLEnKX0gLS0+YCxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOeahOeUqOaIt+WQjei/neWPjVtbUVc6VXznlKjmiLflkI3mlrnpkohdXScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrmgqjnmoTkvb/nlKjogIXlkI3nqLHpgZXlj41bW1FXOlV85L2/55So6ICF5ZCN56ix5pa56YedXV0nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0J3V3LXVibG9jay1zcGFtJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogYHt7dXctdWJsb2NrLXNwYW19fTwhLS0gJHt3aW5kb3cud2dVTFMoJ+Wuo+S8oOaAp+eUqOaIt+WQjeaIluWuo+S8oOaAp+e8lui+kScsICflrqPlgrPmgKfkvb/nlKjogIXlkI3nqLHmiJblrqPlgrPmgKfnt6jovK8nKX0gLS0+YCxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOeahOeUqOaIt+WQjei/neWPjVtbUVc6VXznlKjmiLflkI3mlrnpkohdXScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrmgqjnmoTkvb/nlKjogIXlkI3nqLHpgZXlj41bW1FXOlV85L2/55So6ICF5ZCN56ix5pa56YedXV0nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0Ly8gb3RoZXIgYmxvY2sgdGVtcGxhdGVzXG5cdFx0J3JhbmdlIGJsb2NrJzoge1xuXHRcdFx0ZXhwaXJ5OiAnMSB3ZWVrJyxcblx0XHRcdHJlYXNvbjogJ3t7cmFuZ2UgYmxvY2t9fScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdG5vbnN0YW5kYXJkOiB0cnVlLFxuXHRcdFx0Zm9yQW5vbk9ubHk6IHRydWUsXG5cdFx0XHRzaWc6ICd+ficuY29uY2F0KCd+ficpLFxuXHRcdH0sXG5cdFx0J2Jsb2NrZWQgcHJveHknOiB7XG5cdFx0XHRleHBpcnk6ICcyIHllYXJzJyxcblx0XHRcdGZvckFub25Pbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRub25zdGFuZGFyZDogdHJ1ZSxcblx0XHRcdGhhcmRibG9jazogdHJ1ZSxcblx0XHRcdHJlYXNvbjogJ3t7YmxvY2tlZCBwcm94eX19Jyxcblx0XHRcdHNpZzogbnVsbCxcblx0XHR9LFxuXHRcdGNoZWNrdXNlcmJsb2NrOiB7XG5cdFx0XHRleHBpcnk6ICcxIHdlZWsnLFxuXHRcdFx0Zm9yQW5vbk9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdG5vbnN0YW5kYXJkOiB0cnVlLFxuXHRcdFx0cmVhc29uOiAne3tjaGVja3VzZXJibG9ja319Jyxcblx0XHRcdHNpZzogJ35+Jy5jb25jYXQoJ35+JyksXG5cdFx0fSxcblx0XHQnY2hlY2t1c2VyYmxvY2stYWNjb3VudCc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRub25zdGFuZGFyZDogdHJ1ZSxcblx0XHRcdHJlYXNvbjogJ3t7Y2hlY2t1c2VyYmxvY2stYWNjb3VudH19Jyxcblx0XHRcdHNpZzogJ35+Jy5jb25jYXQoJ35+JyksXG5cdFx0fSxcblx0XHQnc2Nob29sIGJsb2NrJzoge1xuXHRcdFx0ZXhwaXJ5OiAnMSB3ZWVrJyxcblx0XHRcdGZvckFub25Pbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRub25zdGFuZGFyZDogdHJ1ZSxcblx0XHRcdHJlYXNvbjogJ3t7c2Nob29sIGJsb2NrfX0nLFxuXHRcdFx0c2lnOiAnfn4nLmNvbmNhdCgnfn4nKSxcblx0XHR9LFxuXHRcdCdCb3QgYmxvY2sgbWVzc2FnZSc6IHtcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+acuuWZqOS6uuaVhemanCcsICfmqZ/lmajkurrmlYXpmpwnKSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCa55+l77ya5py65Zmo5Lq65pWF6ZqcJywgJ+WwgemOlumAmuefpe+8muapn+WZqOS6uuaVhemanCcpLFxuXHRcdFx0c2lnOiAnfn4nLmNvbmNhdCgnfn4nKSxcblx0XHR9LFxuXHRcdC8vIG90aGVyIGJsb2NrIHJlYXNvbnNcblx0XHRiaW9ibG9jazoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn6L+d5Y+N55Sf6ICF5Lyg6K6w5pa56ZKIJywgJ+mBleWPjeeUn+iAheWCs+iomOaWuemHnScpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCflsIHnpoHpgJrnn6XvvJrov53lj43nlJ/ogIXkvKDorrDmlrnpkognLCAn5bCB6Y6W6YCa55+l77ya6YGV5Y+N55Sf6ICF5YKz6KiY5pa56YedJyksXG5cdFx0XHR0ZW1wbGF0ZU5hbWU6ICd1dy12YmxvY2snLFxuXHRcdH0sXG5cdFx0dWNibG9jazoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5bGh5qyh5aKe5Yqg5rKh5pyJW1tRVzpSU3zlj6/pnaDmnaXmupBdXeeahOi1hOaWmScsICflsaLmrKHlop7liqDmspLmnIlbW1FXOlJTfOWPr+mdoOS+hua6kF1d55qE6LOH5paZJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrlsaHmrKHlop7liqDmsqHmnIlbW1FXOlJTfOWPr+mdoOadpea6kF1d55qE6LWE5paZJyxcblx0XHRcdFx0J+WwgemOlumAmuefpe+8muWxouasoeWinuWKoOaykuaciVtbUVc6UlN85Y+v6Z2g5L6G5rqQXV3nmoTos4fmlpknXG5cdFx0XHQpLFxuXHRcdFx0dGVtcGxhdGVOYW1lOiAndXctYmxvY2snLFxuXHRcdH0sXG5cdFx0bnBibG9jazoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5Zyo5p2h55uu5Lit5aKe5Yqg5peg5oSP5LmJ5paH5a2XJywgJ+WcqOaineebruS4reWinuWKoOeEoeaEj+e+qeaWh+WtlycpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCflsIHnpoHpgJrnn6XvvJrlnKjmnaHnm67kuK3lop7liqDml6DmhI/kuYnmloflrZcnLCAn5bCB6Y6W6YCa55+l77ya5Zyo5qKd55uu5Lit5aKe5Yqg54Sh5oSP576p5paH5a2XJyksXG5cdFx0XHR0ZW1wbGF0ZU5hbWU6ICd1dy12YmxvY2snLFxuXHRcdH0sXG5cdFx0J3BvaW50LWJsb2NrJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmjIHnu63miZPliLbluqbmk6bovrnnkIMnLCAn5oyB57qM5omT5Yi25bqm5pOm6YKK55CDJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8muaMgee7reaJk+WItuW6puaTpui+ueeQgycsICflsIHpjpbpgJrnn6XvvJrmjIHnuozmiZPliLbluqbmk6bpgornkIMnKSxcblx0XHRcdHRlbXBsYXRlTmFtZTogJ3V3LWJsb2NrJyxcblx0XHR9LFxuXHRcdCdzb2NrLWNvbnRyaWJzJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHJlYXNvblBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCfnoa7orqTkuLpbW1FXOlNPQ0t85YKA5YShXV3miJbnnJ/kurrlgoDlhKEgLSDmoLnmja7nlKjmiLfotKHnjK7noa7lrponLFxuXHRcdFx0XHQn56K66KqN54K6W1tRVzpTT0NLfOWCgOWEoV1d5oiW55yf5Lq65YKA5YShIC0g5qC55pOa5L2/55So6ICF6LKi542756K65a6aJ1xuXHRcdFx0KSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muehruiupOS4ultbUVc6U09DS3zlgoDlhKFdXeaIluecn+S6uuWCgOWEoScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrnorroqo3ngrpbW1FXOlNPQ0t85YKA5YShXV3miJbnnJ/kurrlgoDlhKEnXG5cdFx0XHQpLFxuXHRcdFx0dGVtcGxhdGVOYW1lOiAndXctYmxvY2tpbmRlZicsXG5cdFx0fSxcblx0XHQnc29jay1jdSc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn56Gu6K6k5Li6W1tRVzpTT0NLfOWCgOWEoV1d5oiW55yf5Lq65YKA5YShIC0g55So5oi35p+l5qC456Gu6K6kJyxcblx0XHRcdFx0J+eiuuiqjeeCultbUVc6U09DS3zlgoDlhKFdXeaIluecn+S6uuWCgOWEoSAtIOS9v+eUqOiAheafpeaguOeiuuiqjSdcblx0XHRcdCksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrnoa7orqTkuLpbW1FXOlNPQ0t85YKA5YShXV3miJbnnJ/kurrlgoDlhKEnLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya56K66KqN54K6W1tRVzpTT0NLfOWCgOWEoV1d5oiW55yf5Lq65YKA5YShJ1xuXHRcdFx0KSxcblx0XHRcdHRlbXBsYXRlTmFtZTogJ3V3LWJsb2NraW5kZWYnLFxuXHRcdH0sXG5cdFx0J3V3LXVibG9jay1hdHRhY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICdpbmZpbml0eScsXG5cdFx0XHRmb3JSZWdpc3RlcmVkT25seTogdHJ1ZSxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cmVhc29uOiBge3t1dy11YmxvY2stYXR0YWNrfX08IS0tICR7d2luZG93LndnVUxTKCfmlLvlh7vmgKfnlKjmiLflkI0nLCAn5pS75pOK5oCn5L2/55So6ICF5ZCN56ixJyl9IC0tPmAsXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8muaUu+WHu+aAp+eUqOaIt+WQjScsICflsIHpjpbpgJrnn6XvvJrmlLvmk4rmgKfkvb/nlKjogIXlkI3nqLEnKSxcblx0XHR9LFxuXHRcdC8vIEJlZ2luIHBhcnRpYWwgYmxvY2sgdGVtcGxhdGVzLCBhY2Nlc3NlZCBpbiBUd2lua2xlLmJsb2NrLmJsb2NrR3JvdXBzUGFydGlhbFxuXHRcdCd1dy1wYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIGRheScsXG5cdFx0XHRub2NyZWF0ZTogZmFsc2UsXG5cdFx0XHRwYWdlUGFyYW06IGZhbHNlLFxuXHRcdFx0cmVhc29uUGFyYW06IHRydWUsXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrmgqjlt7LooqvnpoHmraLnvJbovpHmsYLpl7vnmb7np5HnmoTpg6jliIbljLrln58nLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya5oKo5bey6KKr56aB5q2i57eo6Lyv5rGC6IGe55m+56eR55qE6YOo5YiG5Y2A5Z+fJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdCd1dy1wYmxvY2tpbmRlZic6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdG5vY3JlYXRlOiBmYWxzZSxcblx0XHRcdHBhZ2VQYXJhbTogZmFsc2UsXG5cdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOW3suiiq+awuOS5heemgeatoue8lui+keaxgumXu+eZvuenkeeahOmDqOWIhuWMuuWfnycsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrmgqjlt7LooqvmsLjkuYXnpoHmraLnt6jovK/msYLogZ7nmb7np5HnmoTpg6jliIbljYDln58nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuYmxvY2sudHJhbnNmb3JtQmxvY2tQcmVzZXRzID0gKCkgPT4ge1xuXHRcdC8vIE1lcmdlIGN1c3RvbSByZWFzb25cblx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21CbG9ja1JlYXNvbkxpc3QnKSkge1xuXHRcdFx0Y29uc3QgbmV3S2V5ID0gYCR7aXRlbS52YWx1ZX18JHtpdGVtLmxhYmVsfWA7XG5cdFx0XHRUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9bbmV3S2V5XSA9IHtcblx0XHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdFx0Li4uVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2l0ZW0udmFsdWVdLFxuXHRcdFx0XHRyZWFzb246IGl0ZW0ubGFiZWwsXG5cdFx0XHRcdHRlbXBsYXRlTmFtZTogaXRlbS52YWx1ZSxcblx0XHRcdH07XG5cdFx0XHRpZiAoVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2l0ZW0udmFsdWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0VHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2l0ZW0udmFsdWVdID0ge1xuXHRcdFx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdFx0XHRjdXN0b206IHRydWUsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHN1cHBseSBzZW5zaWJsZSBkZWZhdWx0c1xuXHRcdGZvciAoY29uc3QgW3ByZXNldCwgc2V0dGluZ3NdIG9mIE9iamVjdC5lbnRyaWVzKFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mbykpIHtcblx0XHRcdHNldHRpbmdzLnN1bW1hcnkgfHw9IHNldHRpbmdzLnJlYXNvbjtcblx0XHRcdHNldHRpbmdzLnNpZyA9IHNldHRpbmdzLnNpZyA9PT0gdW5kZWZpbmVkID8gJ3llcycgOiBzZXR0aW5ncy5zaWc7XG5cdFx0XHRzZXR0aW5ncy5pbmRlZmluaXRlIHx8PSBNb3JlYml0cy5zdHJpbmcuaXNJbmZpbml0eShzZXR0aW5ncy5leHBpcnkpO1xuXHRcdFx0aWYgKCFUd2lua2xlLmJsb2NrLmlzUmVnaXN0ZXJlZCAmJiBzZXR0aW5ncy5pbmRlZmluaXRlKSB7XG5cdFx0XHRcdHNldHRpbmdzLmV4cGlyeSA9ICcxIGRheSc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXR0aW5ncy5leHBpcnkgfHw9ICcxIGRheSc7XG5cdFx0XHR9XG5cdFx0XHRUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9bcHJlc2V0XSA9IHNldHRpbmdzO1xuXHRcdH1cblx0fTtcblx0Ly8gVGhlc2UgYXJlIHRoZSBncm91cHMgb2YgcHJlc2V0cyBhbmQgZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIuIEZvciBlYWNoIGxpc3QgaXRlbTpcblx0Ly8gICBsYWJlbDogPHN0cmluZywgdGhlIGRlc2NyaXB0aW9uIHRoYXQgd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBkcm9wZG93bj5cblx0Ly8gICB2YWx1ZTogPHN0cmluZywgdGhlIGtleSBvZiBhIHByZXNldCBpbiBibG9ja1ByZXNldHNJbmZvPlxuXHQvLyAgIG1ldGE6IDxib29sZWFuLCBzaG93IGluIHRlbXBsYXRlcyBvbmx5PlxuXHRUd2lua2xlLmJsb2NrLmJsb2NrR3JvdXBzID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aZrumAmuWwgeemgScsICfmma7pgJrlsIHpjpYnKSxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+mAmueUqOWwgeemge+8iOiHquWumuS5ieeQhueUse+8iScsICfpgJrnlKjlsIHpjpbvvIjoh6roqILnkIbnlLHvvIknKSwgdmFsdWU6ICd1dy1ibG9jayd9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5peg6ZmQ5pyf5bCB56aB77yI6Ieq5a6a5LmJ55CG55Sx77yJJywgJ+eEoemZkOacn+WwgemOlu+8iOiHquiogueQhueUse+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAndXctYmxvY2tpbmRlZicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCfnpoHmraLnvJbovpHorqjorrrpobUnLCAn56aB5q2i57eo6Lyv6KiO6KuW6aCBJyksIHZhbHVlOiAndXctYmxvY2tub3RhbGsnLCBtZXRhOiB0cnVlfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+i/neWPjeWbnumAgOS4jei/h+S4ieWOn+WImScsICfpgZXlj43lm57pgIDkuI3pgY7kuInljp/liYcnKSwgdmFsdWU6ICd1dy0zYmxvY2snfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+aVo+WPkeW5v+WRiuaIluWuo+S8oCcsICfmlaPnmbzlu6PlkYrmiJblrqPlgrMnKSwgdmFsdWU6ICd1dy1hZGJsb2NrJ30sXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCfooYzkuLrml6DnpLzmiJbkurrouqvmlLvlh7snLCAn6KGM54K654Sh56au5oiW5Lq66Lqr5pS75pOKJyksIHZhbHVlOiAndXctYXR0YWNrYmxvY2snfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WkmuasoeWKoOWFpeS+teeKr+iRl+S9nOadg+eahOWGheWuuScsICflpJrmrKHliqDlhaXkvrXniq/okZfkvZzmrIrnmoTlhaflrrknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3V3LWNvcHlyaWdodGJsb2NrJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+aXoOaVheWIoOmZpOWGheWuuScsICfnhKHmlYXliKrpmaTlhaflrrknKSwgdmFsdWU6ICd1dy1kYmxvY2snfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+mqmuaJsOeUqOaItycsICfpqLfmk77kvb/nlKjogIUnKSwgdmFsdWU6ICd1dy1oYmxvY2snfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+egtOWdjycsICfnoLTlo54nKSwgdmFsdWU6ICd1dy12YmxvY2snLCBzZWxlY3RlZDogdHJ1ZX0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmjIHnu63liqDlhaXkuI3nrKblkIjkuK3lm73ku7flgLzop4LnmoTpnZ7ms5XlhoXlrrknLCAn5oyB57qM5Yqg5YWl5LiN56ym5ZCI5Lit5ZyL5YO55YC86KeA55qE6Z2e5rOV5YWn5a65JyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1dy1pbGxlZ2FsYmxvY2snLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn5rul55So5aSa5Liq6LSm5Y+3JywgJ+a/q+eUqOWkmuWAi+izrOiZnycpLCB2YWx1ZTogJ3V3LXNvY2tibG9jayd9LFxuXHRcdFx0XHQvLyBvdGhlciBibG9jayByZWFzb25zXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCfov53lj43nlJ/ogIXkvKDorrDmlrnpkognLCAn6YGV5Y+N55Sf6ICF5YKz6KiY5pa56YedJyksIHZhbHVlOiAnYmlvYmxvY2snfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+WxoeasoeWinuWKoOayoeacieWPr+mdoOadpea6kOeahOi1hOaWmScsICflsaLmrKHlop7liqDmspLmnInlj6/pnaDkvobmupDnmoTos4fmlpknKSwgdmFsdWU6ICd1Y2Jsb2NrJ30sXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCflnKjmnaHnm67kuK3lop7liqDml6DmhI/kuYnmloflrZcnLCAn5Zyo5qKd55uu5Lit5aKe5Yqg54Sh5oSP576p5paH5a2XJyksIHZhbHVlOiAnbnBibG9jayd9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn5oyB57ut5omT5Yi25bqm5pOm6L6555CDJywgJ+aMgee6jOaJk+WItuW6puaTpumCiueQgycpLCB2YWx1ZTogJ3BvaW50LWJsb2NrJ30sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+ehruiupOS4uuWCgOWEoeaIluecn+S6uuWCgOWEoe+8iOagueaNrueUqOaIt+i0oeeMruehruWumu+8iScsXG5cdFx0XHRcdFx0XHQn56K66KqN54K65YKA5YSh5oiW55yf5Lq65YKA5YSh77yI5qC55pOa5L2/55So6ICF6LKi542756K65a6a77yJJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dmFsdWU6ICdzb2NrLWNvbnRyaWJzJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn56Gu6K6k5Li65YKA5YSh5oiW55yf5Lq65YKA5YSh77yI55So5oi35p+l5qC456Gu6K6k77yJJyxcblx0XHRcdFx0XHRcdCfnorroqo3ngrrlgoDlhKHmiJbnnJ/kurrlgoDlhKHvvIjkvb/nlKjogIXmn6XmoLjnorroqo3vvIknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogJ3NvY2stY3UnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5py65Zmo5Lq65Y+R55Sf5pWF6Zqc5bm25b+F6aG757Sn5oCl5YGc5q2iJywgJ+apn+WZqOS6uueZvOeUn+aVhemanOS4puW/hemgiOe3iuaApeWBnOatoicpLFxuXHRcdFx0XHRcdHZhbHVlOiAnQm90IGJsb2NrIG1lc3NhZ2UnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGN1c3RvbTogdHJ1ZSxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieWwgeemgeeQhueUsScsICfoh6roqILlsIHpjpbnkIbnlLEnKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+WQjeWwgeemgScsICfkvb/nlKjogIXlkI3nqLHlsIHpjpYnKSxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+i/neWPjeeUqOaIt+WQjeaWuemSiCcsICfpgZXlj43kvb/nlKjogIXlkI3nqLHmlrnph50nKSwgdmFsdWU6ICd1dy11YmxvY2snfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+S4jeWQiOinhOeahOeUqOaIt+WQjScsICfkuI3lkIjopo/nmoTkvb/nlKjogIXlkI3nqLEnKSwgdmFsdWU6ICd1dy11YmxvY2staWxsZWdhbCd9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn5a6j5Lyg5oCn55So5oi35ZCNJywgJ+Wuo+WCs+aAp+S9v+eUqOiAheWQjeeosScpLCB2YWx1ZTogJ3V3LXVibG9jay1zcGFtJ30sXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCfmlLvlh7vmgKfnlKjmiLflkI0nLCAn5pS75pOK5oCn5L2/55So6ICF5ZCN56ixJyksIHZhbHVlOiAndXctdWJsb2NrLWF0dGFjayd9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5re35reG5oCn5oiW6K+v5a+85oCn55So5oi35ZCNJywgJ+a3t+a3huaAp+aIluiqpOWwjuaAp+S9v+eUqOiAheWQjeeosScpLFxuXHRcdFx0XHRcdHZhbHVlOiAndXctdWJsb2NrLXN1Z2dlc3RpdmUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAn5YW25LuW5qih5p2/Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e2xhYmVsOiAncmFuZ2UgYmxvY2snLCB2YWx1ZTogJ3JhbmdlIGJsb2NrJywgZm9yQW5vbk9ubHk6IHRydWV9LFxuXHRcdFx0XHR7bGFiZWw6ICdzY2hvb2wgYmxvY2snLCB2YWx1ZTogJ3NjaG9vbCBibG9jaycsIGZvckFub25Pbmx5OiB0cnVlfSxcblx0XHRcdFx0e2xhYmVsOiAnYmxvY2tlZCBwcm94eScsIHZhbHVlOiAnYmxvY2tlZCBwcm94eScsIGZvckFub25Pbmx5OiB0cnVlfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+afpeaguOWwgeemge+8iOS4u+eUqOaIt++8iScsICfkvb/nlKjogIXmn6XmoLjlsIHpjpbvvIjkuLvkvb/nlKjogIXvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ2NoZWNrdXNlcmJsb2NrJyxcblx0XHRcdFx0XHRmb3JBbm9uT25seTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+afpeaguOWwgeemge+8iOWtkOeUqOaIt++8iScsICfkvb/nlKjogIXmn6XmoLjlsIHpjpbvvIjlrZDkvb/nlKjogIXvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ2NoZWNrdXNlcmJsb2NrLWFjY291bnQnLFxuXHRcdFx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLmJsb2NrLmJsb2NrR3JvdXBzUGFydGlhbCA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfluLjop4Hpg6jliIblsIHnpoHnkIbnlLEnLCAn5bi46KaL6YOo5YiG5bCB6Y6W55CG55SxJyksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgJrnlKjpg6jliIblsIHnpoHvvIjoh6rlrprkuYnnkIbnlLHvvIknLCAn6YCa55So6YOo5YiG5bCB6Y6W77yI6Ieq6KiC55CG55Sx77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1dy1wYmxvY2snLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5peg6ZmQ5pyf6YOo5YiG5bCB56aB77yI6Ieq5a6a5LmJ55CG55Sx77yJJywgJ+eEoemZkOacn+mDqOWIhuWwgemOlu+8iOiHquiogueQhueUse+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAndXctcGJsb2NraW5kZWYnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmZpbHRlcmVkX2Jsb2NrX2dyb3VwcyA9IChncm91cCwgc2hvd190ZW1wbGF0ZSkgPT4ge1xuXHRcdHJldHVybiAkLm1hcChncm91cCwgKGJsb2NrR3JvdXApID0+IHtcblx0XHRcdC8vIEFkZCBjdXN0b20gcmVhc29uXG5cdFx0XHRpZiAoYmxvY2tHcm91cC5jdXN0b20pIHtcblx0XHRcdFx0aWYgKHNob3dfdGVtcGxhdGUpIHtcblx0XHRcdFx0XHRsZXQgdGVtcGxhdGVzID0gJC5tYXAoVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21CbG9ja1JlYXNvbkxpc3QnKSwgKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRcdGlmIChUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9baXRlbS52YWx1ZV0uY3VzdG9tKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLnZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRlbXBsYXRlcyA9IE1vcmViaXRzLmFycmF5LnVuaXEodGVtcGxhdGVzKTtcblx0XHRcdFx0XHRibG9ja0dyb3VwLmxpc3QgPSAkLm1hcCh0ZW1wbGF0ZXMsICh0ZW1wbGF0ZSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5qih5p2/JywgJ+iHquioguaooeadvycpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogdGVtcGxhdGUsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJsb2NrR3JvdXAubGlzdCA9ICQubWFwKFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tQmxvY2tSZWFzb25MaXN0JyksIChpdGVtKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogaXRlbS5sYWJlbCxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IGAke2l0ZW0udmFsdWV9fCR7aXRlbS5sYWJlbH1gLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbGlzdCA9ICQubWFwKGJsb2NrR3JvdXAubGlzdCwgKGJsb2NrUHJlc2V0KSA9PiB7XG5cdFx0XHRcdGlmICghc2hvd190ZW1wbGF0ZSAmJiBibG9ja1ByZXNldC5tZXRhKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN3aXRjaCAoYmxvY2tQcmVzZXQudmFsdWUpIHtcblx0XHRcdFx0XHRjYXNlICdyYW5nZSBibG9jayc6XG5cdFx0XHRcdFx0XHRpZiAoIU1vcmViaXRzLmlwLmlzUmFuZ2UocmVsZXZhbnRVc2VyTmFtZSkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YmxvY2tQcmVzZXQuc2VsZWN0ZWQgPSAhTW9yZWJpdHMuaXAuZ2V0NjQocmVsZXZhbnRVc2VyTmFtZSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYmxvY2tTZXR0aW5ncyA9IFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mb1tibG9ja1ByZXNldC52YWx1ZV07XG5cdFx0XHRcdGxldCByZWdpc3RyYXRpb25SZXN0cmljdDtcblx0XHRcdFx0aWYgKGJsb2NrU2V0dGluZ3MuZm9yUmVnaXN0ZXJlZE9ubHkpIHtcblx0XHRcdFx0XHRyZWdpc3RyYXRpb25SZXN0cmljdCA9IFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJsb2NrU2V0dGluZ3MuZm9yQW5vbk9ubHkpIHtcblx0XHRcdFx0XHRyZWdpc3RyYXRpb25SZXN0cmljdCA9ICFUd2lua2xlLmJsb2NrLmlzUmVnaXN0ZXJlZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWdpc3RyYXRpb25SZXN0cmljdCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCEoYmxvY2tTZXR0aW5ncy50ZW1wbGF0ZU5hbWUgJiYgc2hvd190ZW1wbGF0ZSkgJiYgcmVnaXN0cmF0aW9uUmVzdHJpY3QpIHtcblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZU5hbWUgPSBibG9ja1NldHRpbmdzLnRlbXBsYXRlTmFtZSB8fCBibG9ja1ByZXNldC52YWx1ZTtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0bGFiZWw6IChzaG93X3RlbXBsYXRlID8gYHt7JHt0ZW1wbGF0ZU5hbWV9fX06IGAgOiAnJykgKyBibG9ja1ByZXNldC5sYWJlbCxcblx0XHRcdFx0XHRcdHZhbHVlOiBibG9ja1ByZXNldC52YWx1ZSxcblx0XHRcdFx0XHRcdGRhdGE6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICd0ZW1wbGF0ZS1uYW1lJyxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdGVtcGxhdGVOYW1lLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiAhIWJsb2NrUHJlc2V0LnNlbGVjdGVkLFxuXHRcdFx0XHRcdFx0ZGlzYWJsZWQ6ICEhYmxvY2tQcmVzZXQuZGlzYWJsZWQsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAobGlzdC5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRsYWJlbDogYmxvY2tHcm91cC5sYWJlbCxcblx0XHRcdFx0XHRsaXN0LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV9wcmVzZXQgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHtmb3JtfSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IGtleSA9IGZvcm0ucHJlc2V0LnZhbHVlO1xuXHRcdGlmICgha2V5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2sudXBkYXRlX2Zvcm0oZSwgVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2tleV0pO1xuXHRcdGlmIChmb3JtLnRlbXBsYXRlKSB7XG5cdFx0XHRmb3JtLnRlbXBsYXRlLnZhbHVlID0gVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2tleV0udGVtcGxhdGVOYW1lIHx8IGtleTtcblx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX3RlbXBsYXRlKGUpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfZXhwaXJ5ID0gKGUpID0+IHtcblx0XHRjb25zdCB7ZXhwaXJ5fSA9IGUudGFyZ2V0LmZvcm07XG5cdFx0aWYgKGUudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tJykge1xuXHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGV4cGlyeS5wYXJlbnROb2RlLCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGV4cGlyeS5wYXJlbnROb2RlLCBmYWxzZSk7XG5cdFx0XHRleHBpcnkudmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suc2VlQWxzb3MgPSBbXTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay50b2dnbGVfc2VlX2Fsc29zID0gZnVuY3Rpb24gKCkge1xuXHRcdGNvbnN0IHJlYXNvbiA9IHRoaXMuZm9ybS5yZWFzb24udmFsdWUucmVwbGFjZShcblx0XHRcdG5ldyBSZWdFeHAoYCg8IS0tICko5Y+C6KeBfOWPg+imiykke1R3aW5rbGUuYmxvY2suc2VlQWxzb3Muam9pbign44CBJyl9KCAtLT4pYCksXG5cdFx0XHQnJ1xuXHRcdCk7XG5cdFx0VHdpbmtsZS5ibG9jay5zZWVBbHNvcyA9IFR3aW5rbGUuYmxvY2suc2VlQWxzb3MuZmlsdGVyKChlbCkgPT4ge1xuXHRcdFx0cmV0dXJuIGVsICE9PSB0aGlzLnZhbHVlO1xuXHRcdH0pO1xuXHRcdGlmICh0aGlzLmNoZWNrZWQpIHtcblx0XHRcdFR3aW5rbGUuYmxvY2suc2VlQWxzb3NbVHdpbmtsZS5ibG9jay5zZWVBbHNvcy5sZW5ndGhdID0gdGhpcy52YWx1ZTtcblx0XHR9XG5cdFx0Y29uc3Qgc2VlQWxzb01lc3NhZ2UgPSBUd2lua2xlLmJsb2NrLnNlZUFsc29zLmpvaW4oJ+OAgScpO1xuXHRcdGlmIChUd2lua2xlLmJsb2NrLnNlZUFsc29zLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5mb3JtLnJlYXNvbi52YWx1ZSA9IGAke3JlYXNvbn08IS0tICR7d2luZG93LndnVUxTKCflj4Lop4EnLCAn5Y+D6KaLJyl9JHtzZWVBbHNvTWVzc2FnZX0gLS0+YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5mb3JtLnJlYXNvbi52YWx1ZSA9IHJlYXNvbjtcblx0XHR9XG5cdH07XG5cdC8vIE5vIGRzXG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2sudXBkYXRlX2Zvcm0gPSAoZSwgZGF0YSkgPT4ge1xuXHRcdGNvbnN0IHtmb3JtfSA9IGUudGFyZ2V0O1xuXHRcdGxldCB7ZXhwaXJ5fSA9IGRhdGE7XG5cdFx0Ly8gZG9uJ3Qgb3ZlcnJpZGUgb3JpZ2luYWwgZXhwaXJ5IGlmIHVzZUluaXRpYWxPcHRpb25zIGlzIHNldFxuXHRcdGlmICghZGF0YS51c2VJbml0aWFsT3B0aW9ucykge1xuXHRcdFx0aWYgKERhdGUucGFyc2UoZXhwaXJ5KSkge1xuXHRcdFx0XHRleHBpcnkgPSBuZXcgRGF0ZShleHBpcnkpLnRvR01UU3RyaW5nKCk7XG5cdFx0XHRcdGZvcm0uZXhwaXJ5X3ByZXNldC52YWx1ZSA9ICdjdXN0b20nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9ybS5leHBpcnlfcHJlc2V0LnZhbHVlID0gZGF0YS5leHBpcnkgfHwgJ2N1c3RvbSc7XG5cdFx0XHR9XG5cdFx0XHRmb3JtLmV4cGlyeS52YWx1ZSA9IGV4cGlyeTtcblx0XHRcdGlmIChmb3JtLmV4cGlyeV9wcmVzZXQudmFsdWUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VmlzaWJpbGl0eShmb3JtLmV4cGlyeS5wYXJlbnROb2RlLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VmlzaWJpbGl0eShmb3JtLmV4cGlyeS5wYXJlbnROb2RlLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGJvb2xlYW4tZmxpcHBlZCBvcHRpb25zLCBtb3JlIGF0IFtbbXc6QVBJOkJsb2NrXV1cblx0XHRkYXRhLmRpc2FibGV0YWxrID0gZGF0YS5kaXNhYmxldGFsayA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBkYXRhLmRpc2FibGV0YWxrO1xuXHRcdGRhdGEuaGFyZGJsb2NrID0gZGF0YS5oYXJkYmxvY2sgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogZGF0YS5oYXJkYmxvY2s7XG5cdFx0Ly8gZGlzYWJsZSBhdXRvYmxvY2sgaWYgYmxvY2tpbmcgYSBib3Rcblx0XHRpZiAoVHdpbmtsZS5ibG9jay51c2VySXNCb3QgfHwgL2JvdFxcYi9pLnRlc3QocmVsZXZhbnRVc2VyTmFtZSkpIHtcblx0XHRcdGRhdGEuYXV0b2Jsb2NrID0gZmFsc2U7XG5cdFx0fVxuXHRcdCQoZm9ybSlcblx0XHRcdC5maW5kKCdbbmFtZT1maWVsZF9ibG9ja19vcHRpb25zXScpXG5cdFx0XHQuZmluZCgnOmNoZWNrYm94Jylcblx0XHRcdC5lYWNoKChfaSwgZWwpID0+IHtcblx0XHRcdFx0Ly8gZG9uJ3Qgb3ZlcnJpZGUgb3JpZ2luYWwgb3B0aW9ucyBpZiB1c2VJbml0aWFsT3B0aW9ucyBpcyBzZXRcblx0XHRcdFx0aWYgKGRhdGEudXNlSW5pdGlhbE9wdGlvbnMgJiYgZGF0YVtlbC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChlbC5uYW1lID09PSAnY2xvc2V2aXAnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGNoZWNrID0gZGF0YVtlbC5uYW1lXSA9PT0gJycgfHwgISFkYXRhW2VsLm5hbWVdO1xuXHRcdFx0XHQkKGVsKS5wcm9wKCdjaGVja2VkJywgY2hlY2spO1xuXHRcdFx0fSk7XG5cdFx0aWYgKGRhdGEucHJlcGVuZFJlYXNvbiAmJiBkYXRhLnJlYXNvbikge1xuXHRcdFx0Zm9ybS5yZWFzb24udmFsdWUgPSBgJHtkYXRhLnJlYXNvbn3vvJske2Zvcm0ucmVhc29uLnZhbHVlfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvcm0ucmVhc29uLnZhbHVlID0gZGF0YS5yZWFzb24gfHwgJyc7XG5cdFx0fVxuXHRcdC8vIENsZWFyIGFuZC9vciBzZXQgYW55IHBhcnRpYWwgcGFnZSBvciBuYW1lc3BhY2UgcmVzdHJpY3Rpb25zXG5cdFx0aWYgKGZvcm0ucGFnZXJlc3RyaWN0aW9ucykge1xuXHRcdFx0Y29uc3QgJHBhZ2VTZWxlY3QgPSAkKGZvcm0pLmZpbmQoJ1tuYW1lPXBhZ2VyZXN0cmljdGlvbnNdJyk7XG5cdFx0XHRjb25zdCAkbmFtZXNwYWNlU2VsZWN0ID0gJChmb3JtKS5maW5kKCdbbmFtZT1uYW1lc3BhY2VyZXN0cmljdGlvbnNdJyk7XG5cdFx0XHQvLyBSZXNwZWN0IHVzZUluaXRpYWxPcHRpb25zIGJ5IGNsZWFyaW5nIGRhdGEgd2hlbiBzd2l0Y2hpbmcgcHJlc2V0c1xuXHRcdFx0Ly8gSW4gcHJhY3RpY2UsIHRoaXMgd2lsbCBhbHdheXMgY2xlYXIsIHNpbmNlIG5vIHBhcnRpYWwgcHJlc2V0cyB1c2UgaXRcblx0XHRcdGlmICghZGF0YS51c2VJbml0aWFsT3B0aW9ucykge1xuXHRcdFx0XHQkcGFnZVNlbGVjdC52YWwobnVsbCkudHJpZ2dlcignY2hhbmdlJyk7XG5cdFx0XHRcdCRuYW1lc3BhY2VTZWxlY3QudmFsKG51bGwpLnRyaWdnZXIoJ2NoYW5nZScpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWRkIGFueSBwcmVzZXQgb3B0aW9uczsgaW4gcHJhY3RpY2UsIGp1c3QgdXNlZCBmb3IgcHJpb3IgYmxvY2sgc2V0dGluZ3Ncblx0XHRcdGlmIChkYXRhLnJlc3RyaWN0aW9ucykge1xuXHRcdFx0XHRpZiAoZGF0YS5yZXN0cmljdGlvbnMucGFnZXMgJiYgISRwYWdlU2VsZWN0LnZhbCgpLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IHBhZ2VzID0gZGF0YS5yZXN0cmljdGlvbnMucGFnZXMubWFwKChwcikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHByLnRpdGxlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdC8vIHNpbmNlIHBhZ2UgcmVzdHJpY3Rpb25zIHVzZSBhbiBhamF4IHNvdXJjZSwgd2Vcblx0XHRcdFx0XHQvLyBzaG9ydC1jaXJjdWl0IHRoYXQgYW5kIGp1c3QgYWRkIGEgbmV3IG9wdGlvblxuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuXHRcdFx0XHRcdFx0aWYgKCEkcGFnZVNlbGVjdC5maW5kKGBvcHRpb25bdmFsdWU9JyR7JC5lc2NhcGVTZWxlY3RvcihwYWdlKX0nXWApLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdPcHRpb24gPSBuZXcgT3B0aW9uKHBhZ2UsIHBhZ2UsIHRydWUsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHQkcGFnZVNlbGVjdC5hcHBlbmQobmV3T3B0aW9uKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JHBhZ2VTZWxlY3QudmFsKFsuLi4kcGFnZVNlbGVjdC52YWwoKSwgLi4uZ2VuZXJhdGVBcnJheShwYWdlcyldKS50cmlnZ2VyKCdjaGFuZ2UnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZGF0YS5yZXN0cmljdGlvbnMubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdCRuYW1lc3BhY2VTZWxlY3Rcblx0XHRcdFx0XHRcdC52YWwoWy4uLiRuYW1lc3BhY2VTZWxlY3QudmFsKCksIC4uLmdlbmVyYXRlQXJyYXkoZGF0YS5yZXN0cmljdGlvbnMubmFtZXNwYWNlcyldKVxuXHRcdFx0XHRcdFx0LnRyaWdnZXIoJ2NoYW5nZScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV90ZW1wbGF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3Qge2Zvcm19ID0gZS50YXJnZXQ7XG5cdFx0Y29uc3Qge3ZhbHVlfSA9IGZvcm0udGVtcGxhdGU7XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSBUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9bdmFsdWVdO1xuXHRcdGNvbnN0IGJsb2NrQm94ID0gJChmb3JtKS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1ibG9ja10nKS5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCBwYXJ0aWFsQm94ID0gJChmb3JtKS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1wYXJ0aWFsXScpLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGNvbnN0IHRlbXBsYXRlQm94ID0gJChmb3JtKS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT10ZW1wbGF0ZV0nKS5pcygnOmNoZWNrZWQnKTtcblx0XHQvLyBCbG9jayBmb3JtIGlzIG5vdCBwcmVzZW50XG5cdFx0aWYgKCFibG9ja0JveCkge1xuXHRcdFx0aWYgKHNldHRpbmdzLmluZGVmaW5pdGUgfHwgc2V0dGluZ3Mubm9uc3RhbmRhcmQpIHtcblx0XHRcdFx0aWYgKFR3aW5rbGUuYmxvY2sucHJldl90ZW1wbGF0ZV9leHBpcnkgPT09IG51bGwpIHtcblx0XHRcdFx0XHRUd2lua2xlLmJsb2NrLnByZXZfdGVtcGxhdGVfZXhwaXJ5ID0gZm9ybS50ZW1wbGF0ZV9leHBpcnkudmFsdWUgfHwgJyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9ybS50ZW1wbGF0ZV9leHBpcnkucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHRmb3JtLnRlbXBsYXRlX2V4cGlyeS52YWx1ZSA9ICdpbmZpbml0eSc7XG5cdFx0XHR9IGVsc2UgaWYgKGZvcm0udGVtcGxhdGVfZXhwaXJ5LnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG5cdFx0XHRcdGlmIChUd2lua2xlLmJsb2NrLnByZXZfdGVtcGxhdGVfZXhwaXJ5ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0Zm9ybS50ZW1wbGF0ZV9leHBpcnkudmFsdWUgPSBUd2lua2xlLmJsb2NrLnByZXZfdGVtcGxhdGVfZXhwaXJ5O1xuXHRcdFx0XHRcdFR3aW5rbGUuYmxvY2sucHJldl90ZW1wbGF0ZV9leHBpcnkgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcm0udGVtcGxhdGVfZXhwaXJ5LnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHR9XG5cdFx0XHRpZiAoVHdpbmtsZS5ibG9jay5wcmV2X3RlbXBsYXRlX2V4cGlyeSkge1xuXHRcdFx0XHRmb3JtLmV4cGlyeS52YWx1ZSA9IFR3aW5rbGUuYmxvY2sucHJldl90ZW1wbGF0ZV9leHBpcnk7XG5cdFx0XHR9XG5cdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZm9ybS5ub3RhbGsucGFyZW50Tm9kZSwgIXNldHRpbmdzLm5vbnN0YW5kYXJkKTtcblx0XHRcdC8vIFBhcnRpYWxcblx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VmlzaWJpbGl0eShmb3JtLm5vZW1haWxfdGVtcGxhdGUucGFyZW50Tm9kZSwgcGFydGlhbEJveCk7XG5cdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZm9ybS5ub2NyZWF0ZV90ZW1wbGF0ZS5wYXJlbnROb2RlLCBwYXJ0aWFsQm94KTtcblx0XHR9IGVsc2UgaWYgKHRlbXBsYXRlQm94KSB7XG5cdFx0XHQvLyBPbmx5IHByZXNlbnQgaWYgYmxvY2sgJiYgdGVtcGxhdGUgZm9ybXMgYm90aCB2aXNpYmxlXG5cdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoXG5cdFx0XHRcdGZvcm0uYmxhbmtfZHVyYXRpb24ucGFyZW50Tm9kZSxcblx0XHRcdFx0IXNldHRpbmdzLmluZGVmaW5pdGUgJiYgIXNldHRpbmdzLm5vbnN0YW5kYXJkXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvLyBPbmx5IHBhcnRpY3VsYXJseSByZWxldmFudCBpZiB0ZW1wbGF0ZSBmb3JtIGlzIHByZXNlbnRcblx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZm9ybS5hcnRpY2xlLnBhcmVudE5vZGUsIHNldHRpbmdzICYmICEhc2V0dGluZ3MucGFnZVBhcmFtKTtcblx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZm9ybS5ibG9ja19yZWFzb24ucGFyZW50Tm9kZSwgc2V0dGluZ3MgJiYgISFzZXR0aW5ncy5yZWFzb25QYXJhbSk7XG5cdFx0Ly8gQXBwbHkgcmVhc29uIGZyb20gYmxvY2tQcmVzZXRzSW5mb1xuXHRcdGlmIChzZXR0aW5ncy5yZWFzb25QYXJhbSkge1xuXHRcdFx0Zm9ybS5ibG9ja19yZWFzb24udmFsdWUgPSBUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9bZm9ybS5wcmVzZXQudmFsdWVdLnJlYXNvbiB8fCAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9ybS5ibG9ja19yZWFzb24udmFsdWUgPSAnJztcblx0XHR9XG5cdFx0Ly8gUGFydGlhbCBibG9ja1xuXHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VmlzaWJpbGl0eShmb3JtLmFyZWEucGFyZW50Tm9kZSwgcGFydGlhbEJveCAmJiAhYmxvY2tCb3gpO1xuXHRcdGZvcm0ucm9vdC5wcmV2aWV3ZXIuY2xvc2VQcmV2aWV3KCk7XG5cdH07XG5cdFR3aW5rbGUuYmxvY2sucHJldl90ZW1wbGF0ZV9leHBpcnkgPSBudWxsO1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnByZXZpZXcgPSAoZm9ybSkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdGFydGljbGU6IGZvcm0uYXJ0aWNsZS52YWx1ZSxcblx0XHRcdGJsYW5rX2R1cmF0aW9uOiBmb3JtLmJsYW5rX2R1cmF0aW9uID8gZm9ybS5ibGFua19kdXJhdGlvbi5jaGVja2VkIDogZmFsc2UsXG5cdFx0XHRkaXNhYmxldGFsazogZm9ybS5kaXNhYmxldGFsay5jaGVja2VkIHx8IChmb3JtLm5vdGFsayA/IGZvcm0ubm90YWxrLmNoZWNrZWQgOiBmYWxzZSksXG5cdFx0XHRleHBpcnk6IGZvcm0udGVtcGxhdGVfZXhwaXJ5ID8gZm9ybS50ZW1wbGF0ZV9leHBpcnkudmFsdWUgOiBmb3JtLmV4cGlyeS52YWx1ZSxcblx0XHRcdGhhcmRibG9jazogVHdpbmtsZS5ibG9jay5pc1JlZ2lzdGVyZWQgPyBmb3JtLmF1dG9ibG9jay5jaGVja2VkIDogZm9ybS5oYXJkYmxvY2suY2hlY2tlZCxcblx0XHRcdGluZGVmaW5pdGU6IE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KFxuXHRcdFx0XHRmb3JtLnRlbXBsYXRlX2V4cGlyeSA/IGZvcm0udGVtcGxhdGVfZXhwaXJ5LnZhbHVlIDogZm9ybS5leHBpcnkudmFsdWVcblx0XHRcdCksXG5cdFx0XHRyZWFzb246IGZvcm0uYmxvY2tfcmVhc29uLnZhbHVlLFxuXHRcdFx0dGVtcGxhdGU6IGZvcm0udGVtcGxhdGUudmFsdWUsXG5cdFx0XHRwYXJ0aWFsOiAkKGZvcm0pLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXBhcnRpYWxdJykuaXMoJzpjaGVja2VkJyksXG5cdFx0XHRwYWdlcmVzdHJpY3Rpb25zOiAkKGZvcm0ucGFnZXJlc3RyaWN0aW9ucykudmFsKCkgfHwgW10sXG5cdFx0XHRuYW1lc3BhY2VyZXN0cmljdGlvbnM6ICQoZm9ybS5uYW1lc3BhY2VyZXN0cmljdGlvbnMpLnZhbCgpIHx8IFtdLFxuXHRcdFx0bm9lbWFpbDogZm9ybS5ub2VtYWlsLmNoZWNrZWQgfHwgKGZvcm0ubm9lbWFpbF90ZW1wbGF0ZSA/IGZvcm0ubm9lbWFpbF90ZW1wbGF0ZS5jaGVja2VkIDogZmFsc2UpLFxuXHRcdFx0bm9jcmVhdGU6IGZvcm0ubm9jcmVhdGUuY2hlY2tlZCB8fCAoZm9ybS5ub2NyZWF0ZV90ZW1wbGF0ZSA/IGZvcm0ubm9jcmVhdGVfdGVtcGxhdGUuY2hlY2tlZCA6IGZhbHNlKSxcblx0XHRcdGFyZWE6IGZvcm0uYXJlYS52YWx1ZSxcblx0XHR9O1xuXHRcdGNvbnN0IHRlbXBsYXRlVGV4dCA9IFR3aW5rbGUuYmxvY2suY2FsbGJhY2suZ2V0QmxvY2tOb3RpY2VXaWtpdGV4dChwYXJhbXMpO1xuXHRcdGZvcm0ucHJldmlld2VyLmJlZ2luUmVuZGVyKHRlbXBsYXRlVGV4dCwgYFVzZXJfdGFsazoke3JlbGV2YW50VXNlck5hbWV9L1dpa2l0ZXh0YCk7IC8vIEZvcmNlIHdpa2l0ZXh0L2NvcnJlY3QgdXNlcm5hbWVcblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldElucHV0RGF0YShlLnRhcmdldCk7XG5cdFx0Y29uc3QgJGZvcm0gPSAkKGUudGFyZ2V0KTtcblx0XHRjb25zdCB0b0Jsb2NrID0gJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9YmxvY2tdJykuaXMoJzpjaGVja2VkJyk7XG5cdFx0Y29uc3QgdG9XYXJuID0gJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9dGVtcGxhdGVdJykuaXMoJzpjaGVja2VkJyk7XG5cdFx0Y29uc3QgdG9QYXJ0aWFsID0gJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cGFydGlhbF0nKS5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCB0b1RhZyA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXRhZ10nKS5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCB0b1Byb3RlY3QgPSAkZm9ybS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1wcm90ZWN0XScpLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGNvbnN0IHRvVW5ibG9jayA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXVuYmxvY2tdJykuaXMoJzpjaGVja2VkJyk7XG5cdFx0bGV0IGJsb2Nrb3B0aW9ucyA9IHt9O1xuXHRcdGxldCB0ZW1wbGF0ZW9wdGlvbnMgPSB7fTtcblx0XHRsZXQgdW5ibG9ja29wdGlvbnMgPSB7fTtcblx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnNhdmVGaWVsZHNldCgkZm9ybS5maW5kKCdbbmFtZT1maWVsZF9ibG9ja19vcHRpb25zXScpKTtcblx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnNhdmVGaWVsZHNldCgkZm9ybS5maW5kKCdbbmFtZT1maWVsZF90ZW1wbGF0ZV9vcHRpb25zXScpKTtcblx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnNhdmVGaWVsZHNldCgkZm9ybS5maW5kKCdbbmFtZT1maWVsZF90YWdfb3B0aW9uc10nKSk7XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5zYXZlRmllbGRzZXQoJGZvcm0uZmluZCgnW25hbWU9ZmllbGRfdW5ibG9ja19vcHRpb25zXScpKTtcblx0XHRibG9ja29wdGlvbnMgPSBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnM7XG5cdFx0dW5ibG9ja29wdGlvbnMgPSBUd2lua2xlLmJsb2NrLmZpZWxkX3VuYmxvY2tfb3B0aW9ucztcblx0XHRjb25zdCB0b0Nsb3NldmlwID0gISFibG9ja29wdGlvbnMuY2xvc2V2aXA7XG5cdFx0dGVtcGxhdGVvcHRpb25zID0gVHdpbmtsZS5ibG9jay5maWVsZF90ZW1wbGF0ZV9vcHRpb25zO1xuXHRcdHRlbXBsYXRlb3B0aW9ucy5kaXNhYmxldGFsayA9ICEhKHRlbXBsYXRlb3B0aW9ucy5kaXNhYmxldGFsayB8fCBibG9ja29wdGlvbnMuZGlzYWJsZXRhbGspO1xuXHRcdHRlbXBsYXRlb3B0aW9ucy5oYXJkYmxvY2sgPSAhIWJsb2Nrb3B0aW9ucy5oYXJkYmxvY2s7XG5cdFx0Ly8gcmVtb3ZlIGV4dHJhbmVvdXNcblx0XHRkZWxldGUgYmxvY2tvcHRpb25zLmV4cGlyeV9wcmVzZXQ7XG5cdFx0ZGVsZXRlIGJsb2Nrb3B0aW9ucy5jbG9zZXZpcDtcblx0XHQvLyBQYXJ0aWFsIEFQSSByZXF1aXJlcyB0aGlzIHRvIGJlIGdvbmUsIG5vdCBmYWxzZSBvciAwXG5cdFx0aWYgKHRvUGFydGlhbCkge1xuXHRcdFx0YmxvY2tvcHRpb25zLnBhcnRpYWwgPSB0cnVlO1xuXHRcdFx0dGVtcGxhdGVvcHRpb25zLnBhcnRpYWwgPSB0cnVlO1xuXHRcdH1cblx0XHR0ZW1wbGF0ZW9wdGlvbnMucGFnZXJlc3RyaWN0aW9ucyA9ICRmb3JtLmZpbmQoJ1tuYW1lPXBhZ2VyZXN0cmljdGlvbnNdJykudmFsKCkgfHwgW107XG5cdFx0dGVtcGxhdGVvcHRpb25zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucyA9ICRmb3JtLmZpbmQoJ1tuYW1lPW5hbWVzcGFjZXJlc3RyaWN0aW9uc10nKS52YWwoKSB8fCBbXTtcblx0XHQvLyBGb3JtYXQgZm9yIEFQSSBoZXJlIHJhdGhlciB0aGFuIGluIHNhdmVGaWVsZHNldFxuXHRcdGJsb2Nrb3B0aW9ucy5wYWdlcmVzdHJpY3Rpb25zID0gdGVtcGxhdGVvcHRpb25zLnBhZ2VyZXN0cmljdGlvbnMuam9pbignfCcpO1xuXHRcdGJsb2Nrb3B0aW9ucy5uYW1lc3BhY2VyZXN0cmljdGlvbnMgPSB0ZW1wbGF0ZW9wdGlvbnMubmFtZXNwYWNlcmVzdHJpY3Rpb25zLmpvaW4oJ3wnKTtcblx0XHQvLyB1c2UgYmxvY2sgc2V0dGluZ3MgYXMgd2FybiBvcHRpb25zIHdoZXJlIG5vdCBzdXBwbGllZFxuXHRcdHRlbXBsYXRlb3B0aW9ucy5zdW1tYXJ5IHx8PSBibG9ja29wdGlvbnMucmVhc29uO1xuXHRcdHRlbXBsYXRlb3B0aW9ucy5leHBpcnkgPSB0ZW1wbGF0ZW9wdGlvbnMudGVtcGxhdGVfZXhwaXJ5IHx8IGJsb2Nrb3B0aW9ucy5leHBpcnk7XG5cdFx0dGVtcGxhdGVvcHRpb25zLnByZXNldCA9IHRvQmxvY2sgPyBwYXJhbXMucHJlc2V0IDogbnVsbDtcblx0XHQvLyBDaGVjayB0YWdzXG5cdFx0Ly8gR2l2ZW4gYW4gYXJyYXkgb2YgaW5jb21wYXRpYmxlIHRhZ3MsIGNoZWNrIGlmIHdlIGhhdmUgdHdvIG9yIG1vcmUgc2VsZWN0ZWRcblx0XHRjb25zdCBjaGVja0luY29tcGF0aWJsZSA9IChjb25mbGljdHMsIGV4dHJhKSA9PiB7XG5cdFx0XHRjb25zdCBjb3VudCA9IGNvbmZsaWN0cy5yZWR1Y2UoKHN1bSwgdGFnKSA9PiB7XG5cdFx0XHRcdHJldHVybiAoc3VtICs9IHBhcmFtcy50YWcuaW5jbHVkZXModGFnKSk7XG5cdFx0XHR9LCAwKTtcblx0XHRcdGlmIChjb3VudCA+IDEpIHtcblx0XHRcdFx0bGV0IG1lc3NhZ2UgPSBgJHt3aW5kb3cud2dVTFMoJ+ivt+WcqOS7peS4i+agh+etvuS4reaLqeS4gOS9v+eUqCcsICfoq4vlnKjku6XkuIvmqJnnsaTkuK3mk4fkuIDkvb/nlKgnKX3vvJp7eyR7Y29uZmxpY3RzLmpvaW4oXG5cdFx0XHRcdFx0J31944CBe3snXG5cdFx0XHRcdCl9fX3jgIJgO1xuXHRcdFx0XHRtZXNzYWdlICs9IGV4dHJhIHx8ICcnO1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeShtZXNzYWdlLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVibG9jaycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmICh0b1RhZykge1xuXHRcdFx0aWYgKHBhcmFtcy50YWcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6K+36Iez5bCR6YCJ5oup5LiA5Liq55So5oi36aG15qCH6K6w77yBJywgJ+iri+iHs+WwkemBuOaTh+S4gOWAi+S9v+eUqOiAhemggemdouaomeiomO+8gScpLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVibG9jaycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNoZWNrSW5jb21wYXRpYmxlKFxuXHRcdFx0XHRcdFsnQmxvY2tlZCB1c2VyJywgJ1NvY2twdXBwZXQnXSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQne3tTb2NrcHVwcGV0fX3lt7LmtrXnm5Z7e0Jsb2NrZWQgdXNlcn1955qE5Yqf6IO944CCJyxcblx0XHRcdFx0XHRcdCd7e1NvY2twdXBwZXR9feW3sua2teiTi3t7QmxvY2tlZCB1c2VyfX3nmoTlip/og73jgIInXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGVja0luY29tcGF0aWJsZShcblx0XHRcdFx0XHRbJ0Jsb2NrZWQgdXNlcicsICdTb2NrcHVwcGV0ZWVyJ10sXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J3t7U29ja3B1cHBldGVlcn195bey5ra155uWe3tCbG9ja2VkIHVzZXJ9feeahOWKn+iDveOAgicsXG5cdFx0XHRcdFx0XHQne3tTb2NrcHVwcGV0ZWVyfX3lt7LmtrXok4t7e0Jsb2NrZWQgdXNlcn1955qE5Yqf6IO944CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0Y2hlY2tJbmNvbXBhdGlibGUoXG5cdFx0XHRcdFx0WydTb2NrcHVwcGV0JywgJ1NvY2twdXBwZXRlZXInXSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivt+S7juS4u+i0puWPt+WSjOWIhui6q+i0puWPt+S4remAieaLqeS4gOS4quOAgicsICfoq4vlvp7kuLvos6zomZ/lkozliIbouqvos6zomZ/kuK3pgbjmk4fkuIDlgIvjgIInKVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy50YWcuaW5jbHVkZXMoJ1NvY2twdXBwZXQnKSAmJiBwYXJhbXMuc3BwVXNlcm5hbWUudHJpbSgpID09PSAnJykge1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+aPkOS+m+WCgOWEoei0puWPt+eahOS4u+i0puWPt+eUqOaIt+WQje+8gScsICfoq4vmj5DkvpvlgoDlhKHos6zomZ/nmoTkuLvos6zomZ/kvb/nlKjogIXlkI3nqLHvvIEnKSwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYmxvY2snLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodG9CbG9jaykge1xuXHRcdFx0aWYgKGJsb2Nrb3B0aW9ucy5wYXJ0aWFsKSB7XG5cdFx0XHRcdGlmIChibG9ja29wdGlvbnMuZGlzYWJsZXRhbGsgJiYgIWJsb2Nrb3B0aW9ucy5uYW1lc3BhY2VyZXN0cmljdGlvbnMuaW5jbHVkZXMoJzMnKSkge1xuXHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn6YOo5YiG5bCB56aB5peg5rOV6Zi75q2i57yW6L6R6Ieq5bex55qE6K6o6K666aG177yM6Zmk6Z2e5Lmf5bCB56aB5LqGVXNlciB0YWxr5ZG95ZCN56m66Ze077yBJyxcblx0XHRcdFx0XHRcdFx0J+mDqOWIhuWwgemOlueEoeazlemYu+atoue3qOi8r+iHquW3seeahOiojuirlumgge+8jOmZpOmdnuS5n+WwgemOluS6hlVzZXIgdGFsa+WRveWQjeepuumWk++8gSdcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWJsb2Nrb3B0aW9ucy5uYW1lc3BhY2VyZXN0cmljdGlvbnMgJiYgIWJsb2Nrb3B0aW9ucy5wYWdlcmVzdHJpY3Rpb25zKSB7XG5cdFx0XHRcdFx0aWYgKCFibG9ja29wdGlvbnMubm9lbWFpbCAmJiAhYmxvY2tvcHRpb25zLm5vY3JlYXRlKSB7XG5cdFx0XHRcdFx0XHQvLyBCbGFuayBlbnRyaWVzIHRlY2huaWNhbGx5IGFsbG93ZWRcblx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+ayoeaciemAieaLqemhtemdouaIluWRveWQjeepuumXtO+8jOS5n+ayoeacieWBnOeUqOeUteWtkOmCruS7tuaIluemgeatouWIm+W7uui0puWPt++8m+ivt+mAieaLqeiHs+WwkeS4gOS4qumAiemhueS7peW6lOeUqOmDqOWIhuWwgeemge+8gScsXG5cdFx0XHRcdFx0XHRcdFx0J+aykuaciemBuOaTh+mggemdouaIluWRveWQjeepuumWk++8jOS5n+aykuacieWBnOeUqOmbu+WtkOmDteS7tuaIluemgeatouW7uueri+izrOiZn++8m+iri+mBuOaTh+iHs+WwkeS4gOWAi+mBuOmgheS7peaHieeUqOmDqOWIhuWwgemOlu+8gSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYmxvY2snLFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlsIbopoHov5vooYzlsIHnpoHvvIzkvYbmsqHmnInpmLvmraLku7vkvZXpobXpnaLmiJblkb3lkI3nqbrpl7TnmoTnvJbovpHvvIznoa7lrpropoHnu6fnu63vvJ8nLFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlsIfopoHpgLLooYzlsIHpjpbvvIzkvYbmspLmnInpmLvmraLku7vkvZXpoIHpnaLmiJblkb3lkI3nqbrplpPnmoTnt6jovK/vvIznorrlrpropoHnubznuozvvJ8nXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghYmxvY2tvcHRpb25zLmV4cGlyeSkge1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+aPkOS+m+i/h+acn+aXtumXtO+8gScsICfoq4vmj5DkvpvpgY7mnJ/mmYLplpPvvIEnKSwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYmxvY2snLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIGlmIChNb3JlYml0cy5zdHJpbmcuaXNJbmZpbml0eShibG9ja29wdGlvbnMuZXhwaXJ5KSAmJiAhVHdpbmtsZS5ibG9jay5pc1JlZ2lzdGVyZWQpIHtcblx0XHRcdFx0dm9pZCBtdy5ub3RpZnkod2luZG93LndnVUxTKCfnpoHmraLml6DpmZDmnJ/lsIHnpoFJUOWcsOWdgO+8gScsICfnpoHmraLnhKHpmZDmnJ/lsIHpjpZJUOS9jeWdgO+8gScpLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVibG9jaycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWJsb2Nrb3B0aW9ucy5yZWFzb24pIHtcblx0XHRcdFx0dm9pZCBtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fmj5DkvpvlsIHnpoHnkIbnlLHvvIEnLCAn6KuL5o+Q5L6b5bCB6Y6W55CG55Sx77yBJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChlLnRhcmdldCk7XG5cdFx0XHRjb25zdCBzdGF0dXNFbGVtZW50ID0gbmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+aJp+ihjOWwgeemgScsICfln7fooYzlsIHpjpYnKSk7XG5cdFx0XHRibG9ja29wdGlvbnMuYWN0aW9uID0gJ2Jsb2NrJztcblx0XHRcdGJsb2Nrb3B0aW9ucy51c2VyID0gcmVsZXZhbnRVc2VyTmFtZTtcblx0XHRcdC8vIGJvb2xlYW4tZmxpcHBlZCBvcHRpb25zXG5cdFx0XHRibG9ja29wdGlvbnMuYW5vbm9ubHkgPSBibG9ja29wdGlvbnMuaGFyZGJsb2NrID8gdW5kZWZpbmVkIDogdHJ1ZTtcblx0XHRcdGJsb2Nrb3B0aW9ucy5hbGxvd3VzZXJ0YWxrID0gYmxvY2tvcHRpb25zLmRpc2FibGV0YWxrID8gdW5kZWZpbmVkIDogdHJ1ZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2hlY2sgaWYgYmxvY2sgc3RhdHVzIGNoYW5nZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZm9ybS5cblx0XHRcdCAqIFRoZXJlJ3MgYSBsb3QgdG8gY29uc2lkZXIgaGVyZS4gbGlzdD1ibG9ja3MgcHJvdmlkZXMgdGhlXG5cdFx0XHQgKiBjdXJyZW50IGJsb2NrIHN0YXR1cywgYnV0IHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gaXNzdWVzIHdpdGhcblx0XHRcdCAqIHJlbHlpbmcgb24gaXQuIEZpcnN0LCB0aGUgaWQgZG9lc24ndCB1cGRhdGUgb24gYSByZWJsb2NrLFxuXHRcdFx0ICogbWVhbmluZyB0aGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgY29tcGFyZWQuIFRoaXNcblx0XHRcdCAqIGNhbiBiZSBkb25lIHJvdWdobHkgd2l0aCBKU09OLnN0cmluZ2lmeSAtIHdlIGNhbiB0aGFua2Z1bGx5XG5cdFx0XHQgKiByZWx5IG9uIG9yZGVyIGZyb20gdGhlIHNlcnZlciwgYWx0aG91Z2ggc29ydGluZyB3b3VsZCBiZVxuXHRcdFx0ICogZmluZSBpZiBub3QgLSBidXQgZmFsc2V5IHZhbHVlcyBhcmUgcHJvYmxlbWF0aWMgYW5kIGlzXG5cdFx0XHQgKiBub24taWRlYWwuIE1vcmUgaW1wb3J0YW50bHksIGxpc3Q9YmxvY2tzIHdvbid0IGluZGljYXRlIGlmIGFcblx0XHRcdCAqIG5vbi1ibG9ja2VkIHVzZXIgaXMgYmxvY2tlZCB0aGVuIHVuYmxvY2tlZC4gVGhpcyBzaG91bGQgYmVcblx0XHRcdCAqIGV4Y2VlZGluZ3kgcmFyZSwgYnV0IHJlZ2FyZGxlc3MsIHdlIHRodXMgbmVlZCB0byBjaGVja1xuXHRcdFx0ICogbGlzdD1sb2dldmVudHMsIHdoaWNoIGhhcyBhIG5pY2VseSB1cGRhdGluZyBsb2dpZFxuXHRcdFx0ICogcGFyYW1ldGVyLiBXZSBjYW4ndCByZWx5IGp1c3Qgb24gdGhhdCwgdGhvdWdoLCBzaW5jZSBpdFxuXHRcdFx0ICogZG9lc24ndCBhY2NvdW50IGZvciBibG9ja3MgdGhhdCBoYXZlIGV4cGlyZWQgb24gdGhlaXIgb3duLlxuXHRcdFx0ICogQXMgc3VjaCwgd2UgdXNlIGJvdGguIFVzaW5nIHNvbWUgdGVybmFyaWVzLCB0aGUgbG9naWRcblx0XHRcdCAqIHZhcmlhYmxlcyBhcmUgZmFsc2UgaWYgdGhlcmUncyBubyBsb2dldmVudHMsIHNvIGlmIHRoZXlcblx0XHRcdCAqIGFyZW4ndCBlcXVhbCB3ZSBkZWZpbnRlbHkgaGF2ZSBhIGNoYW5nZWQgZW50cnkgKHNlbmRcblx0XHRcdCAqIGNvbmZpcm1hdGlvbikuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGVpdGhlciB0aGUgdXNlciB3YXNcblx0XHRcdCAqIG5ldmVyIGJsb2NrZWQgKHRoZSBibG9jayBzdGF0dXNlcyB3aWxsIGJlIGVxdWFsLCBub1xuXHRcdFx0ICogY29uZmlybWF0aW9uKSBvciB0aGVyZSdzIG5vIG5ldyBibG9jaywgaW4gd2hpY2ggY2FzZSBlaXRoZXJcblx0XHRcdCAqIGEgYmxvY2sgZXhwaXJlZCAoZGlmZmVyZW50IHN0YXR1c2VzLCBjb25maXJtYXRpb24pIG9yIHRoZVxuXHRcdFx0ICogc2FtZSBibG9jayBpcyBzdGlsbCBhY3RpdmUgKHNhbWUgc3RhdHVzLCBubyBjb25maXJtYXRpb24pLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdFx0Zm9ybWF0OiAnanNvbicsXG5cdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0bGlzdDogJ2Jsb2Nrc3xsb2dldmVudHMnLFxuXHRcdFx0XHRsZXR5cGU6ICdibG9jaycsXG5cdFx0XHRcdGxlbGltaXQ6IDEsXG5cdFx0XHRcdGxldGl0bGU6IGBVc2VyOiR7YmxvY2tvcHRpb25zLnVzZXJ9YCxcblx0XHRcdH07XG5cdFx0XHQvLyBia3VzZXJzIGRvZXNuJ3QgY2F0Y2ggc2luZ2xlIElQcyBibG9ja2VkIGFzIHBhcnQgb2YgYSByYW5nZSBibG9ja1xuXHRcdFx0aWYgKG13LnV0aWwuaXNJUEFkZHJlc3MoYmxvY2tvcHRpb25zLnVzZXIsIHRydWUpKSB7XG5cdFx0XHRcdHF1ZXJ5LmJraXAgPSBibG9ja29wdGlvbnMudXNlcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHF1ZXJ5LmJrdXNlcnMgPSBibG9ja29wdGlvbnMudXNlcjtcblx0XHRcdFx0cXVlcnkubGlzdCArPSAnfHVzZXJzJztcblx0XHRcdFx0cXVlcnkudXNwcm9wID0gJ2dyb3Vwcyc7XG5cdFx0XHRcdHF1ZXJ5LnVzdXNlcnMgPSBibG9ja29wdGlvbnMudXNlcjtcblx0XHRcdFx0cXVlcnkubWV0YSA9ICd0b2tlbnMnO1xuXHRcdFx0XHRxdWVyeS50eXBlID0gJ3VzZXJyaWdodHMnO1xuXHRcdFx0fVxuXHRcdFx0dm9pZCBhcGkuZ2V0KHF1ZXJ5KS50aGVuKChkYXRhKSA9PiB7XG5cdFx0XHRcdGxldCBbYmxvY2tdID0gZGF0YS5xdWVyeS5ibG9ja3M7XG5cdFx0XHRcdC8vIEFzIHdpdGggdGhlIGluaXRpYWwgZGF0YSBmZXRjaCwgaWYgYW4gSVAgaXMgYmxvY2tlZFxuXHRcdFx0XHQvLyAqYW5kKiByYW5nZWJsb2NrZWQsIHRoaXMgd291bGQgb25seSBncmFiIHdoaWNoZXZlclxuXHRcdFx0XHQvLyBibG9jayBpcyBtb3JlIHJlY2VudCwgd2hpY2ggd291bGQgbGlrZWx5IG1lYW4gYVxuXHRcdFx0XHQvLyBtaXNtYXRjaC4gIEhvd2V2ZXIsIGlmIHRoZSByYW5nZWJsb2NrIGlzIHVwZGF0ZWRcblx0XHRcdFx0Ly8gd2hpbGUgZmlsbGluZyBvdXQgdGhlIGZvcm0sIHRoaXMgd29uJ3QgZGV0ZWN0IHRoYXQsXG5cdFx0XHRcdC8vIGJ1dCB0aGF0J3MgcHJvYmFibHkgZmluZS5cblx0XHRcdFx0aWYgKGRhdGEucXVlcnkuYmxvY2tzLmxlbmd0aCA+IDEgJiYgYmxvY2sudXNlciAhPT0gcmVsZXZhbnRVc2VyTmFtZSkge1xuXHRcdFx0XHRcdFssIGJsb2NrXSA9IGRhdGEucXVlcnkuYmxvY2tzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IFtsb2dldmVudHNdID0gZGF0YS5xdWVyeS5sb2dldmVudHM7XG5cdFx0XHRcdGNvbnN0IHVzZXIgPSBkYXRhLnF1ZXJ5LnVzZXJzID8gZGF0YS5xdWVyeS51c2Vyc1swXSA6IG51bGw7XG5cdFx0XHRcdGNvbnN0IGxvZ2lkID0gZGF0YS5xdWVyeS5sb2dldmVudHMubGVuZ3RoID8gbG9nZXZlbnRzLmxvZ2lkIDogZmFsc2U7XG5cdFx0XHRcdGlmIChsb2dpZCAhPT0gVHdpbmtsZS5ibG9jay5ibG9ja0xvZ0lkIHx8ICEhYmxvY2sgIT09ICEhVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvKSB7XG5cdFx0XHRcdFx0bGV0IG1lc3NhZ2UgPSBibG9ja29wdGlvbnMudXNlciArIHdpbmRvdy53Z1VMUygn55qE5bCB56aB54q25oCB5bey6KKr5L+u5pS544CCJywgJ+eahOWwgemOlueLgOaFi+W3suiiq+S/ruaUueOAgicpO1xuXHRcdFx0XHRcdGlmIChibG9jaykge1xuXHRcdFx0XHRcdFx0bWVzc2FnZSArPSB3aW5kb3cud2dVTFMoJ+aWsOeKtuaAge+8micsICfmlrDni4DmhYvvvJonKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWVzc2FnZSArPSB3aW5kb3cud2dVTFMoJ+acgOaWsOaXpeW/l++8micsICfmnIDmlrDml6XoqozvvJonKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGV0IGxvZ0V4cGlyeSA9ICcnO1xuXHRcdFx0XHRcdGlmIChsb2dldmVudHMucGFyYW1zLmR1cmF0aW9uKSB7XG5cdFx0XHRcdFx0XHRpZiAobG9nZXZlbnRzLnBhcmFtcy5kdXJhdGlvbiA9PT0gJ2luZmluaXR5Jykge1xuXHRcdFx0XHRcdFx0XHRsb2dFeHBpcnkgPSB3aW5kb3cud2dVTFMoJ+aXoOmZkOacnycsICfnhKHpmZDmnJ8nKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGV4cGlyeURhdGUgPSBuZXcgTW9yZWJpdHMuZGF0ZShsb2dldmVudHMucGFyYW1zLmV4cGlyeSk7XG5cdFx0XHRcdFx0XHRcdGxvZ0V4cGlyeSArPVxuXHRcdFx0XHRcdFx0XHRcdChleHBpcnlEYXRlLmlzQmVmb3JlKG5ldyBEYXRlKCkpID8gd2luZG93LndnVUxTKCfov4fmnJ/kuo4nLCAn6YGO5pyf5pa8JykgOiAn55u05YiwJykgK1xuXHRcdFx0XHRcdFx0XHRcdGV4cGlyeURhdGUuY2FsZW5kYXIoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gbm8gZHVyYXRpb24sIGFjdGlvbj11bmJsb2NrLCBqdXN0IHNob3cgdGltZXN0YW1wXG5cdFx0XHRcdFx0XHRsb2dFeHBpcnkgPSBg5pa8JHtuZXcgTW9yZWJpdHMuZGF0ZShsb2dldmVudHMudGltZXN0YW1wKS5jYWxlbmRhcigpfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1lc3NhZ2UgKz0gYOeUsSR7bG9nZXZlbnRzLnVzZXJ9JHt3aW5kb3cud2dVTFMoJ+S7peKAnCcsICfku6XjgIwnKX0ke2xvZ2V2ZW50cy5jb21tZW50fSR7d2luZG93LndnVUxTKCfigJ0nLCAn44CNJyl9JHtcblx0XHRcdFx0XHRcdGJsb2NrQWN0aW9uVGV4dFtsb2dldmVudHMuYWN0aW9uXVxuXHRcdFx0XHRcdH0ke2xvZ0V4cGlyeX0ke3dpbmRvdy53Z1VMUygn77yM5L2g5oOz6KaB5Lul5L2g55qE6K6+572u5pu05pS55bCB56aB5ZCX77yfJywgJ++8jOS9oOaDs+imgeS7peS9oOeahOioreWumuiuiuabtOWwgemOluWXju+8nycpfWA7XG5cdFx0XHRcdFx0aWYgKCFjb25maXJtKG1lc3NhZ2UpKSB7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmiafooYzlsIHnpoEnLCAn5Z+36KGM5bCB6Y6WJyksXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn55So5oi35Y+W5raI5pON5L2cJywgJ+S9v+eUqOiAheWPlua2iOaTjeS9nCcpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRibG9ja29wdGlvbnMucmVibG9jayA9IDE7IC8vIFdyaXRpbmcgb3ZlciBhIGJsb2NrIHdpbGwgZmFpbCBvdGhlcndpc2Vcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBncm91cHNDYW5CZVJlbW92ZWQgPSBbXG5cdFx0XHRcdFx0J2F1dG9yZXZpZXdlcicsXG5cdFx0XHRcdFx0J2NvbmZpcm1lZCcsXG5cdFx0XHRcdFx0J3JucnN2ZXJpZnktZXhlbXB0Jyxcblx0XHRcdFx0XHQnbWFzc21lc3NhZ2Utc2VuZGVyJyxcblx0XHRcdFx0XHQncGF0cm9sbGVyJyxcblx0XHRcdFx0XHQndGVtcGxhdGVlZGl0b3InLFxuXHRcdFx0XHRcdCd0cmFuc3dpa2knLFxuXHRcdFx0XHRdO1xuXHRcdFx0XHRsZXQgZ3JvdXBzVG9CZVJlbW92ZWQgPSBbXTtcblx0XHRcdFx0aWYgKHVzZXIgJiYgTW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkoYmxvY2tvcHRpb25zLmV4cGlyeSkpIHtcblx0XHRcdFx0XHRncm91cHNUb0JlUmVtb3ZlZCA9IHVzZXIuZ3JvdXBzLmZpbHRlcigoZ3JvdXApID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBncm91cHNDYW5CZVJlbW92ZWQuaW5jbHVkZXMoZ3JvdXApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGV4ZWN1dGUgYmxvY2tcblx0XHRcdFx0YmxvY2tvcHRpb25zLnRhZ3MgPSBUd2lua2xlLmNoYW5nZVRhZ3M7XG5cdFx0XHRcdGJsb2Nrb3B0aW9ucy50b2tlbiA9IG13LnVzZXIudG9rZW5zLmdldCgnY3NyZlRva2VuJyk7XG5cdFx0XHRcdGNvbnN0IG1iQXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKHdpbmRvdy53Z1VMUygn5omn6KGM5bCB56aBJywgJ+Wft+ihjOWwgemOlicpLCBibG9ja29wdGlvbnMsICgpID0+IHtcblx0XHRcdFx0XHRzdGF0dXNFbGVtZW50LmluZm8oJ+WujOaIkCcpO1xuXHRcdFx0XHRcdGlmICh0b1dhcm4pIHtcblx0XHRcdFx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suaXNzdWVfdGVtcGxhdGUodGVtcGxhdGVvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRvQ2xvc2V2aXApIHtcblx0XHRcdFx0XHRcdGNvbnN0IHZpcFBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHQnUWl1d2VuX3RhbGs65oql5ZGK5b2T5YmN56C05Z2PJyxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflhbPpl63or7fmsYInLCAn6Zec6ZaJ6KuL5rGCJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR2aXBQYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0XHRcdFx0dmlwUGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMoYmxvY2tvcHRpb25zKTtcblx0XHRcdFx0XHRcdHZpcFBhZ2UubG9hZChUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNsb3NlUmVxdWVzdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChncm91cHNUb0JlUmVtb3ZlZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCByaWdodFN0YXR1c0VsZW1lbnQgPSBuZXcgTW9yZWJpdHMuc3RhdHVzKHdpbmRvdy53Z1VMUygn56e76Zmk5p2D6ZmQJywgJ+enu+mZpOasiumZkCcpKTtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0Y29uZmlybShcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivpeeUqOaIt+acieS7peS4i+adg+mZkO+8micsICfoqbLkvb/nlKjogIXmnInku6XkuIvmrIrpmZDvvJonKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRncm91cHNUb0JlUmVtb3ZlZC5qb2luKCfjgIEnKSArXG5cdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ++8jOaCqOaYr+WQpuaDs+imgeWQjOaXtuenu+mZpOi/meS6m+adg+mZkO+8nycsICfvvIzmgqjmmK/lkKbmg7PopoHlkIzmmYLnp7vpmaTpgJnkupvmrIrpmZDvvJ8nKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgcmV2b2tlT3B0aW9ucyA9IHtcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb246ICd1c2VycmlnaHRzJyxcblx0XHRcdFx0XHRcdFx0XHR1c2VyOiBibG9ja29wdGlvbnMudXNlcixcblx0XHRcdFx0XHRcdFx0XHRyZW1vdmU6IGdyb3Vwc1RvQmVSZW1vdmVkLmpvaW4oJ3wnKSxcblx0XHRcdFx0XHRcdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn55So5oi35bey6KKr5peg6ZmQ5pyf5bCB56aBJywgJ+S9v+eUqOiAheW3suiiq+eEoemZkOacn+WwgemOlicpLFxuXHRcdFx0XHRcdFx0XHRcdHRva2VuOiBkYXRhLnF1ZXJ5LnRva2Vucy51c2VycmlnaHRzdG9rZW4sXG5cdFx0XHRcdFx0XHRcdFx0dGFnczogVHdpbmtsZS5jaGFuZ2VUYWdzLFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBtckFwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+enu+mZpOadg+mZkCcsICfnp7vpmaTmrIrpmZAnKSxcblx0XHRcdFx0XHRcdFx0XHRyZXZva2VPcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJpZ2h0U3RhdHVzRWxlbWVudC5pbmZvKGDlt7Lnp7vpmaQke2dyb3Vwc1RvQmVSZW1vdmVkLmpvaW4oJ+OAgScpfWApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0bXJBcGkucG9zdCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmlnaHRTdGF0dXNFbGVtZW50LmVycm9yKHdpbmRvdy53Z1VMUygn55So5oi35Y+W5raI5pON5L2c44CCJywgJ+S9v+eUqOiAheWPlua2iOaTjeS9nOOAgicpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtYkFwaS5wb3N0KCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHRvV2Fybikge1xuXHRcdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGUudGFyZ2V0KTtcblx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suaXNzdWVfdGVtcGxhdGUodGVtcGxhdGVvcHRpb25zKTtcblx0XHR9XG5cdFx0aWYgKHRvVGFnIHx8IHRvUHJvdGVjdCkge1xuXHRcdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGUudGFyZ2V0KTtcblx0XHRcdGNvbnN0IHVzZXJQYWdlID0gYFVzZXI6JHttdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKX1gO1xuXHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHR1c2VyUGFnZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmoIforrDmiJbkv53miqTnlKjmiLfpobUnLCAn5qiZ6KiY5oiW5L+d6K235L2/55So6ICF6aCB6Z2iJylcblx0XHRcdCk7XG5cdFx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdHFpdXdlbl9wYWdlLmxvYWQoVHdpbmtsZS5ibG9jay5jYWxsYmFjay50YWd1c2VycGFnZSk7XG5cdFx0fVxuXHRcdGlmICh0b1VuYmxvY2spIHtcblx0XHRcdGlmICghdW5ibG9ja29wdGlvbnMucmVhc29uKSB7XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6K+35o+Q5L6b6Kej6Zmk5bCB56aB55CG55Sx77yBJywgJ+iri+aPkOS+m+ino+mZpOWwgemOlueQhueUse+8gScpLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVibG9jaycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZS50YXJnZXQpO1xuXHRcdFx0Y29uc3QgdW5ibG9ja1N0YXR1c0VsZW1lbnQgPSBuZXcgTW9yZWJpdHMuc3RhdHVzKHdpbmRvdy53Z1VMUygn5omn6KGM6Kej6Zmk5bCB56aBJywgJ+Wft+ihjOino+mZpOWwgemOlicpKTtcblx0XHRcdHVuYmxvY2tvcHRpb25zLmFjdGlvbiA9ICd1bmJsb2NrJztcblx0XHRcdHVuYmxvY2tvcHRpb25zLnVzZXIgPSBtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKTtcblx0XHRcdC8vIGV4ZWN1dGUgdW5ibG9ja1xuXHRcdFx0dW5ibG9ja29wdGlvbnMudGFncyA9IFR3aW5rbGUuY2hhbmdlVGFncztcblx0XHRcdHVuYmxvY2tvcHRpb25zLnRva2VuID0gbXcudXNlci50b2tlbnMuZ2V0KCdjc3JmVG9rZW4nKTtcblx0XHRcdGNvbnN0IHVuYmxvY2tNYkFwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0d2luZG93LndnVUxTKCfmiafooYzop6PpmaTlsIHnpoEnLCAn5Z+36KGM6Kej6Zmk5bCB6Y6WJyksXG5cdFx0XHRcdHVuYmxvY2tvcHRpb25zLFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dW5ibG9ja1N0YXR1c0VsZW1lbnQuaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0XHR1bmJsb2NrTWJBcGkucG9zdCgpO1xuXHRcdH1cblx0XHRpZiAoIXRvQmxvY2sgJiYgIXRvV2FybiAmJiAhdG9UYWcgJiYgIXRvUHJvdGVjdCAmJiAhdG9VbmJsb2NrKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+e7mVR3aW5rbGXngrnkuovlgZrvvIEnLCAn6KuL57WmVHdpbmtsZem7nuS6i+WBmu+8gScpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay50YWd1c2VycGFnZSA9IChwYWdlb2JqKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdGlmIChwYXJhbXMuYWN0aW9udHlwZS5pbmNsdWRlcygndGFnJykpIHtcblx0XHRcdGNvbnN0IHRhZ3MgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHBhcmFtcy50YWcpIHtcblx0XHRcdFx0bGV0IHRhZ3RleHQgPSBge3ske3RhZ31gO1xuXHRcdFx0XHRzd2l0Y2ggKHRhZykge1xuXHRcdFx0XHRcdGNhc2UgJ0Jsb2NrZWQgdXNlcic6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdTb2NrcHVwcGV0Jzpcblx0XHRcdFx0XHRcdHRhZ3RleHQgKz0gYFxcbnwgMSA9ICR7cGFyYW1zLnNwcFVzZXJuYW1lLnRyaW0oKX1gO1xuXHRcdFx0XHRcdFx0dGFndGV4dCArPSBgXFxufCAyID0gJHtwYXJhbXMuc3BwVHlwZS50cmltKCl9YDtcblx0XHRcdFx0XHRcdGlmIChwYXJhbXMuc3BwRXZpZGVuY2UudHJpbSgpKSB7XG5cdFx0XHRcdFx0XHRcdHRhZ3RleHQgKz0gYFxcbnwgZXZpZGVuY2UgPSAke3BhcmFtcy5zcHBFdmlkZW5jZS50cmltKCl9YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZ3RleHQgKz0gJ1xcbnwgbG9ja2VkID0gbm8nO1xuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxufCBub3RibG9ja2VkID0gbm8nO1xuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxuJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ1NvY2twdXBwZXRlZXInOlxuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxufCAxID0gYmxvY2tlZCc7XG5cdFx0XHRcdFx0XHR0YWd0ZXh0ICs9IGBcXG58IGNoZWNrZWQgPSAke3BhcmFtcy5zcG1DaGVja2VkID8gJ3llcycgOiAnJ31gO1xuXHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5zcG1FdmlkZW5jZS50cmltKCkpIHtcblx0XHRcdFx0XHRcdFx0dGFndGV4dCArPSBgXFxufCBldmlkZW5jZSA9ICR7cGFyYW1zLnNwbUV2aWRlbmNlLnRyaW0oKX1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxuJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+acquefpeeahOeUqOaIt+mhteaooeadv++8gScsICfmnKrnn6XnmoTkvb/nlKjogIXpoIHpnaLmqKHmnb/vvIEnKSwge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVibG9jaycsXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZ3RleHQgKz0gJ319Jztcblx0XHRcdFx0dGFnc1t0YWdzLmxlbmd0aF0gPSB0YWd0ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdGV4dCA9IHRhZ3Muam9pbignXFxuJyk7XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeSh3aW5kb3cud2dVTFMoJ+agh+iusOiiq+awuOS5heWwgeemgeeahOeUqOaIt+mhtScsICfmqJnoqJjooqvmsLjkuYXlsIHpjpbnmoTkvb/nlKjogIXpoIHpnaInKSk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2F2ZSgoKSA9PiB7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKHdpbmRvdy53Z1VMUygn5qCH6K6w55So5oi36aG1JywgJ+aomeiomOS9v+eUqOiAhemggemdoicpLCAn5a6M5oiQJyk7XG5cdFx0XHRcdHN0YXRlbGVtLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+ato+WcqOS/neaKpOmhtemdoicsICfmraPlnKjkv53orbfpoIHpnaInKSk7XG5cdFx0XHRcdHBhZ2VvYmoubG9hZChUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnByb3RlY3R1c2VycGFnZSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5wcm90ZWN0dXNlcnBhZ2UocGFnZW9iaik7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnByb3RlY3R1c2VycGFnZSA9IChwYWdlb2JqKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdGlmIChwYXJhbXMuYWN0aW9udHlwZS5pbmNsdWRlcygncHJvdGVjdCcpKSB7XG5cdFx0XHRpZiAocGFnZW9iai5leGlzdHMoKSkge1xuXHRcdFx0XHRwYWdlb2JqLnNldEVkaXRQcm90ZWN0aW9uKCdzeXNvcCcsICdpbmRlZmluaXRlJyk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0TW92ZVByb3RlY3Rpb24oJ3N5c29wJywgJ2luZGVmaW5pdGUnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlUHJvdGVjdGlvbignc3lzb3AnLCAnaW5kZWZpbml0ZScpO1xuXHRcdFx0fVxuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeSh3aW5kb3cud2dVTFMoJ+iiq+awuOS5heWwgeemgeeahOeUqOaIt+mhtScsICfooqvmsLjkuYXlsIHpjpbnmoTkvb/nlKjogIXpoIHpnaInKSk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmoucHJvdGVjdCgoKSA9PiB7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+d5oqk55So5oi36aG1JywgJ+S/neitt+S9v+eUqOiAhemggemdoicpLFxuXHRcdFx0XHRcdHBhZ2VvYmouZXhpc3RzKCkgPyB3aW5kb3cud2dVTFMoJ+W3suWFqOS/neaKpCcsICflt7Llhajkv53orbcnKSA6IHdpbmRvdy53Z1VMUygn5bey55m957q45L+d5oqkJywgJ+W3sueZvee0meS/neittycpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHN0YXRlbGVtLmluZm8oJ+WFqOmDqOWujOaIkCcpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0YXRlbGVtLmluZm8oJ+WFqOmDqOWujOaIkCcpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5pc3N1ZV90ZW1wbGF0ZSA9IChmb3JtRGF0YSkgPT4ge1xuXHRcdC8vIFVzZSB3Z1JlbGV2YW50VXNlck5hbWUgdG8gZW5zdXJlIHRoZSBibG9jayB0ZW1wbGF0ZSBnb2VzIHRvIGEgc2luZ2xlIElQIGFuZCBub3QgdG8gdGhlXG5cdFx0Ly8gXCJ0YWxrIHBhZ2VcIiBvZiBhbiBJUCByYW5nZSAod2hpY2ggZG9lcyBub3QgZXhpc3QpXG5cdFx0Y29uc3QgdXNlclRhbGtQYWdlID0gYFVzZXJfdGFsazoke213LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpfWA7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0Li4uZm9ybURhdGEsXG5cdFx0XHRtZXNzYWdlRGF0YTogVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2Zvcm1EYXRhLnRlbXBsYXRlXSxcblx0XHRcdHVzZXJ0YWxrX3N1bW1hcnk6IFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mb1tmb3JtRGF0YS5wcmVzZXQgfHwgZm9ybURhdGEudGVtcGxhdGVdLnN1bW1hcnksXG5cdFx0XHRyZWFzb246IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ibG9ja19yZWFzb24sXG5cdFx0XHRkaXNhYmxldGFsazogVHdpbmtsZS5ibG9jay5maWVsZF90ZW1wbGF0ZV9vcHRpb25zLm5vdGFsayxcblx0XHRcdG5vZW1haWw6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ub2VtYWlsX3RlbXBsYXRlLFxuXHRcdFx0bm9jcmVhdGU6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ub2NyZWF0ZV90ZW1wbGF0ZSxcblx0XHR9O1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gdXNlclRhbGtQYWdlO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUyhcblx0XHRcdCflrozmiJDvvIzlsIblnKjlh6Dnp5LlkI7liqDovb3nlKjmiLforqjorrrpobUnLFxuXHRcdFx0J+WujOaIkO+8jOWwh+WcqOW5vuenkuW+jOi8ieWFpeS9v+eUqOiAheiojuirlumggSdcblx0XHQpO1xuXHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZSh1c2VyVGFsa1BhZ2UsIHdpbmRvdy53Z1VMUygn55So5oi36K6o6K666aG15L+u5pS5JywgJ+S9v+eUqOiAheiojuirlumggeS/ruaUuScpKTtcblx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUuYmxvY2suY2FsbGJhY2subWFpbik7XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2xvc2VSZXF1ZXN0ID0gKHZpcFBhZ2UpID0+IHtcblx0XHRjb25zdCBwYXJhbXMgPSB2aXBQYWdlLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdGxldCB0ZXh0ID0gdmlwUGFnZS5nZXRQYWdlVGV4dCgpO1xuXHRcdGNvbnN0IHN0YXR1c0VsZW1lbnQgPSB2aXBQYWdlLmdldFN0YXR1c0VsZW1lbnQoKTtcblx0XHRjb25zdCB1c2VyTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpO1xuXHRcdGNvbnN0IGV4cGlyeVRleHQgPSBNb3JlYml0cy5zdHJpbmcuZm9ybWF0VGltZShwYXJhbXMuZXhwaXJ5KTtcblx0XHRjb25zdCBjb21tZW50ID0gYHt7QmxvY2tlZHwke01vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHBhcmFtcy5leHBpcnkpID8gJ2luZGVmJyA6IGV4cGlyeVRleHR9fX3jgIJgO1xuXHRcdGNvbnN0IHJlcXVlc3RMaXN0ID0gdGV4dC5zcGxpdCgvKD89XFxuPT09Lis9PT1cXHMqXFxuKS8pO1xuXHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdGxldCBoaWRlbmFtZSA9IGZhbHNlO1xuXHRcdGNvbnN0IHZpcFJlID0gbmV3IFJlZ0V4cChcblx0XHRcdGB7e1xcXFxzKltWdl1hbmRhbFxcXFxzKlxcXFx8XFxcXHMqKDFcXFxccyo9XFxcXHMqKT8ke01vcmViaXRzLnBhZ2VOYW1lUmVnZXgoXG5cdFx0XHRcdHVzZXJOYW1lXG5cdFx0XHQpfVxcXFxzKihcXFxcfFxcXFxzKmhpZGVuYW1lXFxcXHMqPVtefF0rKT99fWAsXG5cdFx0XHQnbSdcblx0XHQpO1xuXHRcdGZvciAobGV0IHJlcXVlc3Qgb2YgcmVxdWVzdExpc3QpIHtcblx0XHRcdGlmICh2aXBSZS5leGVjKHJlcXVlc3QpKSB7XG5cdFx0XHRcdGhpZGVuYW1lID0gL1xcfFxccypoaWRlbmFtZVxccyo9W158XSsvLnRlc3QocmVxdWVzdCk7XG5cdFx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnRyaW1FbmQoKTtcblx0XHRcdFx0bGV0IG5ld1RleHQgPSByZXF1ZXN0LnJlcGxhY2UoXG5cdFx0XHRcdFx0L14oXFwqXFxzKuWkhOeQhu+8milbIFxcdF0qKDwhLS0g6Z2e566h55CG5ZOh5YOF5Y+v5qiZ6KiY5bey5Z+36KGM55qE5bCB56aB77yM6Yed5bCN5o+Q5aCx55qE5oSP6KaL6KuL5pS+5Zyo5LiL5LiA6KGMIC0tPik/WyBcXHRdKiQvbSxcblx0XHRcdFx0XHRgJDEke2NvbW1lbnR9LS1+fmAuY29uY2F0KCd+ficpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChyZXF1ZXN0ID09PSBuZXdUZXh0KSB7XG5cdFx0XHRcdFx0bmV3VGV4dCA9IGAke3JlcXVlc3R9XFxuKiDlpITnkIbvvJoke2NvbW1lbnR9LS1+fmAuY29uY2F0KCd+ficpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlcXVlc3QgPSBgJHtuZXdUZXh0fVxcbmA7XG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghZm91bmQpIHtcblx0XHRcdHN0YXR1c0VsZW1lbnQud2Fybih3aW5kb3cud2dVTFMoJ+ayoeacieaJvuWIsOebuOWFs+eahOivt+axgicsICfmspLmnInmib7liLDnm7jpl5znmoToq4vmsYInKSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRleHQgPSByZXF1ZXN0TGlzdC5qb2luKCcnKTtcblx0XHRsZXQgc3VtbWFyeTtcblx0XHRpZiAoaGlkZW5hbWUpIHtcblx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+agh+iusOS4uuW3suWkhOeQhicsICfmqJnoqJjngrrlt7LomZXnkIYnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3VtbWFyeSA9IGAvKiAke3VzZXJOYW1lfSAqLyBgO1xuXHRcdFx0aWYgKE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHBhcmFtcy5leHBpcnkpKSB7XG5cdFx0XHRcdHN1bW1hcnkgKz0gd2luZG93LndnVUxTKCfkuI3pmZDmnJ/lsIHnpoEnLCAn5LiN6ZmQ5pyf5bCB6Y6WJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdW1tYXJ5ICs9IHdpbmRvdy53Z1VMUygn5bCB56aBJywgJ+WwgemOlicpICsgZXhwaXJ5VGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0dmlwUGFnZS5zZXRFZGl0U3VtbWFyeShzdW1tYXJ5KTtcblx0XHR2aXBQYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHR2aXBQYWdlLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdHZpcFBhZ2Uuc2F2ZSgpO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmdldEJsb2NrTm90aWNlV2lraXRleHQgPSAocGFyYW1zKSA9PiB7XG5cdFx0bGV0IHRleHQgPSAne3snO1xuXHRcdGNvbnN0IHNldHRpbmdzID0gVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW3BhcmFtcy50ZW1wbGF0ZV07XG5cdFx0aWYgKHNldHRpbmdzLm5vbnN0YW5kYXJkKSB7XG5cdFx0XHR0ZXh0ICs9IHBhcmFtcy50ZW1wbGF0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGV4dCArPSAnc3Vic3Q6Jy5jb25jYXQocGFyYW1zLnRlbXBsYXRlKTtcblx0XHRcdGlmIChwYXJhbXMuYXJ0aWNsZSAmJiBzZXR0aW5ncy5wYWdlUGFyYW0pIHtcblx0XHRcdFx0dGV4dCArPSBgfHBhZ2U9JHtwYXJhbXMuYXJ0aWNsZX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCEvdGU/bXB8XlxccyokfG1pbi8uZXhlYyhwYXJhbXMuZXhwaXJ5KSkge1xuXHRcdFx0XHRpZiAocGFyYW1zLmluZGVmaW5pdGUpIHtcblx0XHRcdFx0XHR0ZXh0ICs9ICd8aW5kZWY9eWVzJztcblx0XHRcdFx0fSBlbHNlIGlmICghcGFyYW1zLmJsYW5rX2R1cmF0aW9uKSB7XG5cdFx0XHRcdFx0Ly8gTm8gZXhwaXJ5IGNoZWNrc1xuXHRcdFx0XHRcdC8vIEJsb2NrIHRlbXBsYXRlIHdhbnRzIGEgZHVyYXRpb24sIG5vdCBkYXRlXG5cdFx0XHRcdFx0dGV4dCArPSBgfHRpbWU9JHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0VGltZShwYXJhbXMuZXhwaXJ5KX1gOyAvLyBmb3JtYXRUaW1lXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghVHdpbmtsZS5ibG9jay5pc1JlZ2lzdGVyZWQgJiYgIXBhcmFtcy5oYXJkYmxvY2spIHtcblx0XHRcdFx0dGV4dCArPSAnfGFub249eWVzJztcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMucmVhc29uKSB7XG5cdFx0XHRcdHRleHQgKz0gYHxyZWFzb249JHtwYXJhbXMucmVhc29ufWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLmRpc2FibGV0YWxrKSB7XG5cdFx0XHRcdHRleHQgKz0gJ3xub3RhbGs9eWVzJztcblx0XHRcdH1cblx0XHRcdC8vIEN1cnJlbnRseSwgYWxsIHBhcnRpYWwgYmxvY2sgdGVtcGxhdGVzIGFyZSBcInN0YW5kYXJkXCJcblx0XHRcdC8vIEJ1aWxkaW5nIHRoZSB0ZW1wbGF0ZSwgaG93ZXZlciwgdGFrZXMgYSBmYWlyIGJpdCBvZiBsb2dpY1xuXHRcdFx0aWYgKHBhcmFtcy5wYXJ0aWFsKSB7XG5cdFx0XHRcdGlmIChwYXJhbXMucGFnZXJlc3RyaWN0aW9ucy5sZW5ndGggfHwgcGFyYW1zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBtYWtlU2VudGVuY2UgPSAoYXJyYXkpID0+IHtcblx0XHRcdFx0XHRcdGlmIChhcnJheS5sZW5ndGggPCAzKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhcnJheS5qb2luKCflkownKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IGxhc3QgPSBhcnJheS5wb3AoKTtcblx0XHRcdFx0XHRcdHJldHVybiBgJHthcnJheS5qb2luKCfjgIEnKX3lkowke2xhc3R9YDtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHRleHQgKz0gJ3xhcmVhPeafkOS6myc7XG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5wYWdlcmVzdHJpY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGV4dCArPSBg6aCB6Z2i77yIJHttYWtlU2VudGVuY2UoXG5cdFx0XHRcdFx0XHRcdHBhcmFtcy5wYWdlcmVzdHJpY3Rpb25zLm1hcCgocCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBgW1s6JHtwfV1dYDtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCl9YDtcblx0XHRcdFx0XHRcdHRleHQgKz0gcGFyYW1zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucy5sZW5ndGggPyAn77yJ5ZKM5p+Q5LqbJyA6ICfvvIknO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGFyYW1zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIDEgPT4gVGFsaywgMiA9PiBVc2VyLCBldGMuXG5cdFx0XHRcdFx0XHRjb25zdCBuYW1lc3BhY2VOYW1lcyA9IHBhcmFtcy5uYW1lc3BhY2VyZXN0cmljdGlvbnMubWFwKChpZCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVudUZvcm1hdHRlZE5hbWVzcGFjZXNbaWRdO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ZXh0ICs9IGAke1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ1tbSGVscDrlkb3lkI3nqbrpl7R85ZG95ZCN56m66Ze0XV3vvIgnLCAnW1tIZWxwOuWRveWQjeepuumWk3zlkb3lkI3nqbrplpNdXe+8iCcpICtcblx0XHRcdFx0XHRcdFx0bWFrZVNlbnRlbmNlKG5hbWVzcGFjZU5hbWVzKVxuXHRcdFx0XHRcdFx0fe+8iWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5hcmVhKSB7XG5cdFx0XHRcdFx0dGV4dCArPSBgfGFyZWE9JHtwYXJhbXMuYXJlYX1gO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChwYXJhbXMubm9lbWFpbCkge1xuXHRcdFx0XHRcdFx0dGV4dCArPSAnfGVtYWlsPXllcyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwYXJhbXMubm9jcmVhdGUpIHtcblx0XHRcdFx0XHRcdHRleHQgKz0gJ3xhY2NvdW50Y3JlYXRlPXllcyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzZXR0aW5ncy5zaWcpIHtcblx0XHRcdHRleHQgKz0gYHxzaWc9JHtzZXR0aW5ncy5zaWd9YDtcblx0XHR9XG5cdFx0cmV0dXJuIGAke3RleHR9fX1gO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLm1haW4gPSAocGFnZW9iaikgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0Y29uc3QgZGF0ZSA9IG5ldyBNb3JlYml0cy5kYXRlKHBhZ2VvYmouZ2V0TG9hZFRpbWUoKSk7XG5cdFx0Y29uc3Qge21lc3NhZ2VEYXRhfSA9IHBhcmFtcztcblx0XHRsZXQgdGV4dDtcblx0XHRwYXJhbXMuaW5kZWZpbml0ZSA9IE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHBhcmFtcy5leHBpcnkpO1xuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2JsYW5rVGFsa3BhZ2VPbkluZGVmQmxvY2snKSAmJiBwYXJhbXMudGVtcGxhdGUgIT09ICd1dy1sYmxvY2snICYmIHBhcmFtcy5pbmRlZmluaXRlKSB7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5qC55o2u5Y+C5pWw6K6+572u5riF56m66K6o6K666aG15bm25Li65pel5pyf5Yib5bu65pawMue6p+agh+mimCcsXG5cdFx0XHRcdFx0J+agueaTmuWBj+WlveioreWumua4heepuuiojuirlumggeS4pueCuuaXpeacn+W7uueri+aWsDLntJrmqJnpoYwnXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0XHR0ZXh0ID0gYCR7ZGF0ZS5tb250aEhlYWRlcigpfVxcbmA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBkYXRlSGVhZGVyUmVnZXggPSBkYXRlLm1vbnRoSGVhZGVyUmVnZXgoKTtcblx0XHRcdGxldCBkYXRlSGVhZGVyUmVnZXhMYXN0O1xuXHRcdFx0bGV0IGRhdGVIZWFkZXJSZWdleFJlc3VsdDtcblx0XHRcdHdoaWxlICgoZGF0ZUhlYWRlclJlZ2V4TGFzdCA9IGRhdGVIZWFkZXJSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuXHRcdFx0XHRkYXRlSGVhZGVyUmVnZXhSZXN1bHQgPSBkYXRlSGVhZGVyUmVnZXhMYXN0O1xuXHRcdFx0fVxuXHRcdFx0Ly8gSWYgZGF0ZUhlYWRlclJlZ2V4UmVzdWx0IGlzIG51bGwgdGhlbiBsYXN0SGVhZGVySW5kZXggaXMgbmV2ZXIgY2hlY2tlZC4gSWYgaXQgaXMgbm90IG51bGwgYnV0XG5cdFx0XHQvLyBcXG49PSBpcyBub3QgZm91bmQsIHRoZW4gdGhlIGRhdGUgaGVhZGVyIG11c3QgYmUgYXQgdGhlIHZlcnkgc3RhcnQgb2YgdGhlIHBhZ2UuIGxhc3RJbmRleE9mXG5cdFx0XHQvLyByZXR1cm5zIC0xIGluIHRoaXMgY2FzZSwgc28gbGFzdEhlYWRlckluZGV4IGdldHMgc2V0IHRvIDAgYXMgZGVzaXJlZC5cblx0XHRcdGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IHRleHQubGFzdEluZGV4T2YoJ1xcbj09JykgKyAxO1xuXHRcdFx0aWYgKHRleHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0ZXh0ICs9ICdcXG5cXG4nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFkYXRlSGVhZGVyUmVnZXhSZXN1bHQgfHwgZGF0ZUhlYWRlclJlZ2V4UmVzdWx0LmluZGV4ICE9PSBsYXN0SGVhZGVySW5kZXgpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmnKrmib7liLDlvZPmnIjnmoTkuoznuqfmoIfpopjvvIzlsIbliJvlu7rmlrDnmoQnLCAn5pyq5om+5Yiw55W25pyI55qE5LqM57Sa5qiZ6aGM77yM5bCH5bu656uL5paw55qEJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dGV4dCArPSBgJHtkYXRlLm1vbnRoSGVhZGVyKCl9XFxuYDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cGFyYW1zLmV4cGlyeSA9IHBhcmFtcy50ZW1wbGF0ZV9leHBpcnkgPT09IHVuZGVmaW5lZCA/IHBhcmFtcy5leHBpcnkgOiBwYXJhbXMudGVtcGxhdGVfZXhwaXJ5O1xuXHRcdHRleHQgKz0gVHdpbmtsZS5ibG9jay5jYWxsYmFjay5nZXRCbG9ja05vdGljZVdpa2l0ZXh0KHBhcmFtcyk7XG5cdFx0Ly8gYnVpbGQgdGhlIGVkaXQgc3VtbWFyeVxuXHRcdGxldCBzdW1tYXJ5ID0gcGFyYW1zLnVzZXJ0YWxrX3N1bW1hcnk7XG5cdFx0aWYgKG1lc3NhZ2VEYXRhLnN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeSAhPT0gdHJ1ZSAmJiBwYXJhbXMuYXJ0aWNsZSkge1xuXHRcdFx0c3VtbWFyeSArPSBgJHt3aW5kb3cud2dVTFMoJ++8jOS6jicsICfvvIzmlrwnKX1bWzoke3BhcmFtcy5hcnRpY2xlfV1dYDtcblx0XHR9XG5cdFx0cGFnZW9iai5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnkpO1xuXHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hCbG9ja05vdGljZXMnKSk7XG5cdFx0cGFnZW9iai5zYXZlKCk7XG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuYmxvY2ssICdibG9jaycpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5cbi8qISBUd2lua2xlLmpzIC0gZnJpZW5kbHl0YWxrYmFjay5qcyAqL1xuKGZ1bmN0aW9uIGZyaWVuZGx5dGFsa2JhY2soJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0LyoqXG5cdCAqIGZyaWVuZGx5dGFsa2JhY2suanM6IFRhbGtiYWNrIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJUQlwiKVxuXHQgKiBBY3RpdmUgb246IEFueSBwYWdlIHdpdGggcmVsZXZhbnQgdXNlciBuYW1lICh1c2Vyc3BhY2UsIGNvbnRyaWJzLCBldGMuKSBleGNlcHQgSVAgcmFuZ2VzXG5cdCAqIENvbmZpZyBkaXJlY3RpdmVzIGluOiBGcmllbmRseUNvbmZpZ1xuXHQgKi9cblx0VHdpbmtsZS50YWxrYmFjayA9ICgpID0+IHtcblx0XHRpZiAoIW13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRUd2lua2xlLnRhbGtiYWNrLmNhbGxiYWNrLFxuXHRcdFx0J+mAmuWRiicsXG5cdFx0XHQnZnJpZW5kbHktdGFsa2JhY2snLFxuXHRcdFx0d2luZG93LndnVUxTKCflm57lpI3pgJrlkYonLCAn5Zue6KaG6YCa5ZGKJylcblx0XHQpO1xuXHR9O1xuXHRUd2lua2xlLnRhbGtiYWNrLmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgJiZcblx0XHRcdCFjb25maXJtKHdpbmRvdy53Z1VMUygn5oKo5a+C5a+e5Yiw5LqG6KaB6Ieq5bex5Zue5aSN6Ieq5bex55qE56iL5bqm5LmI77yfJywgJ+aCqOWvguWvnuWIsOS6huimgeiHquW3seWbnuimhuiHquW3seeahOeoi+W6pum6vO+8nycpKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgMzUwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCflm57lpI3pgJrlkYonLCAn5Zue6KaG6YCa5ZGKJykpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCflhbPkuo57e3RhbGtiYWNrfX0nLCAn6Zec5pa8e3t0YWxrYmFja319JyksICdUZW1wbGF0ZTpUYWxrYmFjaycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn6YCa5ZGK6K6+572uJywgJ+mAmuWRiuioreWumicpLCAnSDpUVy9QUkVGI3RhbGtiYWNrJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI3RhbGtiYWNrJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS50YWxrYmFjay5ldmFsdWF0ZSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3JhZGlvJyxcblx0XHRcdG5hbWU6ICd0YnRhcmdldCcsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflm57lpI3vvJrmiJHnmoTorqjorrrpobUnLCAn5Zue6KaG77ya5oiR55qE6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdteXRhbGsnLFxuXHRcdFx0XHRcdGNoZWNrZWQ6ICd0cnVlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WbnuWkje+8muWFtuS7lueUqOaIt+eahOiuqOiuuumhtScsICflm57opobvvJrlhbbku5bkvb/nlKjogIXnmoToqI7oq5bpoIEnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3VzZXJ0YWxrJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WbnuWkje+8muWFtuWug+mhtemdoicsICflm57opobvvJrlhbblroPpoIHpnaInKSxcblx0XHRcdFx0XHR2YWx1ZTogJ290aGVyJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mCgOivt+iuqOiuuicsICfpgoDoq4voqI7oq5YnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3NlZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJ+mAmuWRiuadv+mAmuefpScsXG5cdFx0XHRcdFx0dmFsdWU6ICdub3RpY2UnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn4oCc5pyJ5paw6YKu5Lu24oCdJywgJ+OAjOacieaWsOmDteS7tuOAjScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbWFpbCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUudGFsa2JhY2suY2hhbmdlVGFyZ2V0LFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogJ+W3peS9nOWMuicsXG5cdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHR9KTtcblx0XHRjb25zdCBwcmV2aWV3bGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHQkKHByZXZpZXdsaW5rKS5vbignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRUd2lua2xlLnRhbGtiYWNrLnByZXZpZXcocmVzdWx0KTsgLy8gfHJlc3VsdHwgaXMgZGVmaW5lZCBiZWxvd1xuXHRcdH0pO1xuXG5cdFx0cHJldmlld2xpbmsuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuXHRcdHByZXZpZXdsaW5rLnRleHRDb250ZW50ID0gd2luZG93LndnVUxTKCfpooTop4gnLCAn6aCQ6Ka9Jyk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRpZDogJ3RhbGtiYWNrcHJldmlldycsXG5cdFx0XHRsYWJlbDogW3ByZXZpZXdsaW5rXSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdGlkOiAnZnJpZW5kbHl0YWxrYmFjay1wcmV2aWV3Ym94Jyxcblx0XHRcdHN0eWxlOiAnZGlzcGxheTogbm9uZScsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0cmVzdWx0LnByZXZpZXdlciA9IG5ldyBNb3JlYml0cy53aWtpLnByZXZpZXcoJChyZXN1bHQpLmZpbmQoJ2RpdiNmcmllbmRseXRhbGtiYWNrLXByZXZpZXdib3gnKS5sYXN0KClbMF0pO1xuXHRcdC8vIFdlIG11c3QgaW5pdCB0aGVcblx0XHRjb25zdCBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRyZXN1bHQudGJ0YXJnZXRbMF0uZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIHVzZXIgaGFzIG9wdGVkIG91dCBmcm9tIHRhbGtiYWNrXG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRwcm9wOiAnZXh0bGlua3MnLFxuXHRcdFx0dGl0bGVzOiBgVXNlciB0YWxrOiR7bXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyl9YCxcblx0XHRcdGVscXVlcnk6ICd1c2VyanMuaW52YWxpZC9ub1RhbGtiYWNrJyxcblx0XHRcdGVsbGltaXQ6ICcxJyxcblx0XHR9O1xuXHRcdGNvbnN0IHFpdXdlbl9hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+aKk+WPlumAgOWHuumAmuWRiuS/oeaBrycsICfmipPlj5bpgIDlh7rpgJrlkYros4foqIonKSxcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0VHdpbmtsZS50YWxrYmFjay5jYWxsYmFjay5vcHRvdXRTdGF0dXNcblx0XHQpO1xuXHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHR9O1xuXHRUd2lua2xlLnRhbGtiYWNrLm9wdG91dCA9ICcnO1xuXHRUd2lua2xlLnRhbGtiYWNrLmNhbGxiYWNrLm9wdG91dFN0YXR1cyA9IChhcGlvYmopID0+IHtcblx0XHRjb25zdCAkZWwgPSAkKGFwaW9iai5nZXRYTUwoKSkuZmluZCgnZWwnKTtcblx0XHRpZiAoJGVsLmxlbmd0aCkge1xuXHRcdFx0VHdpbmtsZS50YWxrYmFjay5vcHRvdXQgPVxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSArIHdpbmRvdy53Z1VMUygn5LiN5biM5pyb5pS25Yiw5Zue5aSN6YCa5ZGKJywgJ+S4jeW4jOacm+aUtuWIsOWbnuimhumAmuWRiicpO1xuXHRcdFx0Y29uc3QgdXJsID0gJGVsLnRleHQoKTtcblx0XHRcdGNvbnN0IHJlYXNvbiA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgncmVhc29uJywgdXJsKTtcblx0XHRcdFR3aW5rbGUudGFsa2JhY2sub3B0b3V0ICs9IHJlYXNvbiA/IGDvvJoke01vcmViaXRzLnN0cmluZy5hcHBlbmRQdW5jdHVhdGlvbihyZWFzb24pfWAgOiAn44CCJztcblx0XHR9XG5cdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtdGFsa2JhY2stb3B0b3V0LW1lc3NhZ2UnKS50ZXh0KFR3aW5rbGUudGFsa2JhY2sub3B0b3V0KTtcblx0fTtcblx0bGV0IHByZXZfcGFnZSA9ICcnO1xuXHRsZXQgcHJldl9zZWN0aW9uID0gJyc7XG5cdGxldCBwcmV2X21lc3NhZ2UgPSAnJztcblx0VHdpbmtsZS50YWxrYmFjay5jaGFuZ2VUYXJnZXQgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWVzO1xuXHRcdGNvbnN0IHJvb3QgPSBlLnRhcmdldC5mb3JtO1xuXHRcdGNvbnN0IFtvbGRfYXJlYV0gPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocm9vdCwgJ3dvcmtfYXJlYScpO1xuXHRcdGlmIChyb290LnNlY3Rpb24pIHtcblx0XHRcdHByZXZfc2VjdGlvbiA9IHJvb3Quc2VjdGlvbi52YWx1ZTtcblx0XHR9XG5cdFx0aWYgKHJvb3QubWVzc2FnZSkge1xuXHRcdFx0cHJldl9tZXNzYWdlID0gcm9vdC5tZXNzYWdlLnZhbHVlO1xuXHRcdH1cblx0XHRpZiAocm9vdC5wYWdlKSB7XG5cdFx0XHRwcmV2X3BhZ2UgPSByb290LnBhZ2UudmFsdWU7XG5cdFx0fVxuXHRcdGxldCB3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WbnuWkjemAmuWRiuS/oeaBrycsICflm57opobpgJrlkYros4foqIonKSxcblx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdH0pO1xuXHRcdHJvb3QucHJldmlld2VyLmNsb3NlUHJldmlldygpO1xuXHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdGNhc2UgJ3VzZXJ0YWxrJzpcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0XHRcdHN0eWxlOiAnY29sb3I6ICNmMDAnLFxuXHRcdFx0XHRcdGlkOiAndHdpbmtsZS10YWxrYmFjay1vcHRvdXQtbWVzc2FnZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdwYWdlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnlKjmiLfvvIjlv4XloavvvIknLCAn5L2/55So6ICF77yI5b+F5aGr77yJJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfmgqjnlZnoqIDpobXpnaLnmoTnlKjmiLflkI3vvIzlv4XloavjgIInLCAn5oKo55WZ6KiA6aCB6Z2i55qE5L2/55So6ICF5ZCN56ix77yM5b+F5aGr44CCJyksXG5cdFx0XHRcdFx0dmFsdWU6IHByZXZfcGFnZSxcblx0XHRcdFx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NlY3Rpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eroOiKgu+8iOWPr+mAie+8iScsICfnq6Dnr4DvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5oKo55WZ6KiA55qE56ug6IqC5qCH6aKY77yM55WZ56m65YiZ5LiN5Lya5Lqn55Sf56ug6IqC6ZO+5o6l44CCJyxcblx0XHRcdFx0XHRcdCfmgqjnlZnoqIDnmoTnq6Dnr4DmqJnpoYzvvIznlZnnqbrliYfkuI3mnIPnlKLnlJ/nq6Dnr4DpgKPntZDjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogcHJldl9zZWN0aW9uLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdub3RpY2UnOiB7XG5cdFx0XHRcdGNvbnN0IG5vdGljZWJvYXJkID0gd29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bmFtZTogJ25vdGljZWJvYXJkJyxcblx0XHRcdFx0XHRsYWJlbDogJ+mAmuWRiuadv++8micsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtuYm5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFR3aW5rbGUudGFsa2JhY2subm90aWNlYm9hcmRzKSkge1xuXHRcdFx0XHRcdG5vdGljZWJvYXJkLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdGxhYmVsOiBkYXRhLmxhYmVsLFxuXHRcdFx0XHRcdFx0dmFsdWU6IG5ibmFtZSxcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiAhIWRhdGEuZGVmYXVsdFNlbGVjdGVkLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NlY3Rpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eroOiKgu+8iOWPr+mAie+8iScsICfnq6Dnr4DvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+eroOiKguagh+mimO+8jOeVmeepuuWImeS4jeS8muS6p+eUn+eroOiKgumTvuaOpeOAgicsICfnq6Dnr4DmqJnpoYzvvIznlZnnqbrliYfkuI3mnIPnlKLnlJ/nq6Dnr4DpgKPntZDjgIInKSxcblx0XHRcdFx0XHR2YWx1ZTogcHJldl9zZWN0aW9uLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdvdGhlcic6XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGxhYmVsOiAnJyxcblx0XHRcdFx0XHRzdHlsZTogJ2NvbG9yOiAjZjAwJyxcblx0XHRcdFx0XHRpZDogJ3R3aW5rbGUtdGFsa2JhY2stb3B0b3V0LW1lc3NhZ2UnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAncGFnZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5a6M5pW06aG16Z2i5ZCNJywgJ+WujOaVtOmggemdouWQjScpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjnlZnkuIvmtojmga/nmoTlrozmlbTpobXpnaLlkI3vvIzkvovlpoLigJxRaXV3ZW5fdGFsazrpppbpobXigJ3jgIInLFxuXHRcdFx0XHRcdFx0J+aCqOeVmeS4i+ioiuaBr+eahOWujOaVtOmggemdouWQje+8jOS+i+WmguOAjFFpdXdlbl90YWxrOummlumggeOAjeOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcmV2X3BhZ2UsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdzZWN0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnq6DoioLvvIjlj6/pgInvvIknLCAn56ug56+A77yI5Y+v6YG477yJJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aCqOeVmeiogOeahOeroOiKguagh+mimO+8jOeVmeepuuWImeS4jeS8muS6p+eUn+eroOiKgumTvuaOpeOAgicsXG5cdFx0XHRcdFx0XHQn5oKo55WZ6KiA55qE56ug56+A5qiZ6aGM77yM55WZ56m65YmH5LiN5pyD55Si55Sf56ug56+A6YCj57WQ44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dmFsdWU6IHByZXZfc2VjdGlvbixcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWFpbCc6XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NlY3Rpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUteWtkOmCruS7tuS4u+mimO+8iOWPr+mAie+8iScsICfpm7vlrZDpg7Xku7bkuLvpoYzvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+aCqOWPkeWHuueahOeUteWtkOmCruS7tueahOS4u+mimOOAgicsICfmgqjnmbzlh7rnmoTpm7vlrZDpg7Xku7bnmoTkuLvpoYzjgIInKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2VlJzpcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAncGFnZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5a6M5pW06aG16Z2i5ZCNJywgJ+WujOaVtOmggemdouWQjScpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjnlZnkuIvmtojmga/nmoTlrozmlbTpobXpnaLlkI3vvIzkvovlpoLigJxRaXV3ZW5fdGFsazrpppbpobXigJ3jgIInLFxuXHRcdFx0XHRcdFx0J+aCqOeVmeS4i+ioiuaBr+eahOWujOaVtOmggemdouWQje+8jOS+i+WmguOAjFFpdXdlbl90YWxrOummlumggeOAjeOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcmV2X3BhZ2UsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdzZWN0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnq6DoioLvvIjlj6/pgInvvIknLCAn56ug56+A77yI5Y+v6YG477yJJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aCqOeVmeiogOeahOeroOiKguagh+mimO+8jOeVmeepuuWImeS4jeS8muS6p+eUn+eroOiKgumTvuaOpeOAgicsXG5cdFx0XHRcdFx0XHQn5oKo55WZ6KiA55qE56ug56+A5qiZ6aGM77yM55WZ56m65YmH5LiN5pyD55Si55Sf56ug56+A6YCj57WQ44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dmFsdWU6IHByZXZfc2VjdGlvbixcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0LyogY2FzZSAnbXl0YWxrJzogKi9cblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGxhYmVsOiAnJyxcblx0XHRcdFx0XHRzdHlsZTogJ2NvbG9yOiAjZjAwJyxcblx0XHRcdFx0XHRpZDogJ3R3aW5rbGUtdGFsa2JhY2stb3B0b3V0LW1lc3NhZ2UnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAnc2VjdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56ug6IqC77yI5Y+v6YCJ77yJJywgJ+eroOevgO+8iOWPr+mBuO+8iScpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjnlZnoqIDnmoTnq6DoioLmoIfpopjvvIznlZnnqbrliJnkuI3kvJrkuqfnlJ/nq6DoioLpk77mjqXjgIInLFxuXHRcdFx0XHRcdFx0J+aCqOeVmeiogOeahOeroOevgOaomemhjO+8jOeVmeepuuWJh+S4jeacg+eUoueUn+eroOevgOmAo+e1kOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcmV2X3NlY3Rpb24sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWYgKHZhbHVlICE9PSAnbm90aWNlJykge1xuXHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mZhOWKoOS/oeaBr++8iOWPr+mAie+8ie+8micsICfpmYTliqDos4foqIrvvIjlj6/pgbjvvInvvJonKSxcblx0XHRcdFx0bmFtZTogJ21lc3NhZ2UnLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+S8muWcqOWbnuWkjemAmuWRiuaooeadv+S4i+WHuueOsOeahOa2iOaBr++8jOaCqOeahOetvuWQjeS8muiiq+WKoOWcqOacgOWQjuOAgicsXG5cdFx0XHRcdFx0J+acg+WcqOWbnuimhumAmuWRiuaooeadv+S4i+WHuuePvueahOioiuaBr++8jOaCqOeahOewveWQjeacg+iiq+WKoOWcqOacgOW+jOOAgidcblx0XHRcdFx0KSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR3b3JrX2FyZWEgPSB3b3JrX2FyZWEucmVuZGVyKCk7XG5cdFx0cm9vdC5yZXBsYWNlQ2hpbGQod29ya19hcmVhLCBvbGRfYXJlYSk7XG5cdFx0aWYgKHJvb3QubWVzc2FnZSkge1xuXHRcdFx0cm9vdC5tZXNzYWdlLnZhbHVlID0gcHJldl9tZXNzYWdlO1xuXHRcdH1cblx0XHQkYm9keS5maW5kKCcjdHdpbmtsZS10YWxrYmFjay1vcHRvdXQtbWVzc2FnZScpLnRleHQoVHdpbmtsZS50YWxrYmFjay5vcHRvdXQpO1xuXHR9O1xuXHRUd2lua2xlLnRhbGtiYWNrLm5vdGljZWJvYXJkcyA9IHtcblx0XHRhZmZwOiB7XG5cdFx0XHRsYWJlbDogYFFXOkFGL0ZQ77yIJHt3aW5kb3cud2dVTFMoJ+i/h+a7pOWZqOWkhOeQhi/miqXlkYonLCAn6YGO5r++5Zmo6JmV55CGL+WgseWRiicpfe+8iWAsXG5cdFx0XHR0aXRsZTogd2luZG93LndnVUxTKCfov4fmu6TlmajplJnor6/miqXlkYrmnInmlrDlm57lupQnLCAn6YGO5r++5Zmo6Yyv6Kqk5aCx5ZGK5pyJ5paw5Zue5oeJJyksXG5cdFx0XHRjb250ZW50OiBgJHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCfmgqjnmoRbW1FpdXdlbl90YWxrOui/h+a7pOWZqOWkhOeQhi/miqXlkYp86L+H5ruk5Zmo6ZSZ6K+v5oql5ZGKXV3lt7LmnInlm57lupTvvIzor7fliY3lvoDmn6XnnIvjgIInLFxuXHRcdFx0XHQn5oKo55qEW1tRaXV3ZW5fdGFsazrov4fmu6TlmajlpITnkIYv5oql5ZGKfOmBjua/vuWZqOmMr+iqpOWgseWRil1d5bey5pyJ5Zue5oeJ77yM6KuL5YmN5b6A5p+l55yL44CCJ1xuXHRcdFx0KX0tLX5+YC5jb25jYXQoJ35+JyksXG5cdFx0XHRlZGl0U3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5pyJ5YWzW1tRaXV3ZW5fdGFsazrov4fmu6TlmajlpITnkIYv5oql5ZGKfOi/h+a7pOWZqOmUmeivr+aKpeWRil1d55qE6YCa55+lJyxcblx0XHRcdFx0J+aciemXnFtbUWl1d2VuX3RhbGs66L+H5ruk5Zmo5aSE55CGL+aKpeWRinzpgY7mv77lmajpjK/oqqTloLHlkYpdXeeahOmAmuefpSdcblx0XHRcdCksXG5cdFx0XHRkZWZhdWx0U2VsZWN0ZWQ6IHRydWUsXG5cdFx0fSxcblx0XHRzYmw6IHtcblx0XHRcdGxhYmVsOiAnU3BhbS1ibGFja2xpc3QnLFxuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5Z6D5Zy+6ZO+5o6l6buR5ZCN5Y2V6K+35rGC5pyJ5paw5Zue5bqUJywgJ+Weg+WcvumAo+e1kOm7keWQjeWWruiri+axguacieaWsOWbnuaHiScpLFxuXHRcdFx0Y29udGVudDogYCR7d2luZG93LndnVUxTKFxuXHRcdFx0XHQn5oKo55qEW1tRaXV3ZW5fdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6ZO+5o6l6buR5ZCN5Y2V6K+35rGCXV3lt7LmnInlm57lupTvvIzor7fliY3lvoDmn6XnnIvjgIInLFxuXHRcdFx0XHQn5oKo55qEW1tRaXV3ZW5fdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6YCj57WQ6buR5ZCN5Zau6KuL5rGCXV3lt7LmnInlm57mh4nvvIzoq4vliY3lvoDmn6XnnIvjgIInXG5cdFx0XHQpfS0tfn5gLmNvbmNhdCgnfn4nKSxcblx0XHRcdGVkaXRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCfmnInlhbNbW1FpdXdlbl90YWxrOueuoeeQhuWRmOWRiuekuuadv3zlnoPlnL7pk77mjqXpu5HlkI3ljZXor7fmsYJdXeeahOmAmuefpScsXG5cdFx0XHRcdCfmnInpl5xbW1FpdXdlbl90YWxrOueuoeeQhuWRmOWRiuekuuadv3zlnoPlnL7pgKPntZDpu5HlkI3llq7oq4vmsYJdXeeahOmAmuefpSdcblx0XHRcdCksXG5cdFx0fSxcblx0XHRzaGw6IHtcblx0XHRcdGxhYmVsOiAnU3BhbS13aGl0ZWxpc3QnLFxuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5Z6D5Zy+6ZO+5o6l55m95ZCN5Y2V6K+35rGC5pyJ5paw5Zue5bqUJywgJ+Weg+WcvumAo+e1kOeZveWQjeWWruiri+axguacieaWsOWbnuaHiScpLFxuXHRcdFx0Y29udGVudDogYCR7d2luZG93LndnVUxTKFxuXHRcdFx0XHQn5oKo55qEW1tRaXV3ZW5fdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6ZO+5o6l55m95ZCN5Y2V6K+35rGCXV3lt7LmnInlm57lupTvvIzor7fliY3lvoDmn6XnnIvjgIInLFxuXHRcdFx0XHQn5oKo55qEW1tRaXV3ZW5fdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6YCj57WQ55m95ZCN5Zau6KuL5rGCXV3lt7LmnInlm57mh4nvvIzoq4vliY3lvoDmn6XnnIvjgIInXG5cdFx0XHQpfS0tfn5gLmNvbmNhdCgnfn4nKSxcblx0XHRcdGVkaXRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCfmnInlhbNbW1FpdXdlbl90YWxrOueuoeeQhuWRmOWRiuekuuadv3zlnoPlnL7pk77mjqXnmb3lkI3ljZXor7fmsYJdXeeahOmAmuefpScsXG5cdFx0XHRcdCfmnInpl5xbW1FpdXdlbl90YWxrOueuoeeQhuWRmOWRiuekuuadv3zlnoPlnL7pgKPntZDnmb3lkI3llq7oq4vmsYJdXeeahOmAmuefpSdcblx0XHRcdCksXG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS50YWxrYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IFt0YnRhcmdldF0gPSBmb3JtLmdldENoZWNrZWQoJ3RidGFyZ2V0Jyk7XG5cdFx0bGV0IHBhZ2U7XG5cdFx0bGV0IG1lc3NhZ2U7XG5cdFx0Y29uc3Qgc2VjdGlvbiA9IGZvcm0uc2VjdGlvbi52YWx1ZTtcblx0XHRsZXQgZWRpdFN1bW1hcnk7XG5cdFx0aWYgKHRidGFyZ2V0ID09PSAnbm90aWNlJykge1xuXHRcdFx0cGFnZSA9IGZvcm0ubm90aWNlYm9hcmQudmFsdWU7XG5cdFx0XHQoe2VkaXRTdW1tYXJ5fSA9IFR3aW5rbGUudGFsa2JhY2subm90aWNlYm9hcmRzW3BhZ2VdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdXNlcnRhbGssIG90aGVyLCBzZWVcblx0XHRcdHBhZ2UgPSBmb3JtLnBhZ2UgPyBmb3JtLnBhZ2UudmFsdWUgOiBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyk7XG5cdFx0XHRpZiAoZm9ybS5tZXNzYWdlKSB7XG5cdFx0XHRcdG1lc3NhZ2UgPSBmb3JtLm1lc3NhZ2UudmFsdWUudHJpbSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRidGFyZ2V0ID09PSAnbWFpbCcpIHtcblx0XHRcdFx0ZWRpdFN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+mAmuefpe+8muacieaWsOmCruS7ticsICfpgJrnn6XvvJrmnInmlrDpg7Xku7YnKTtcblx0XHRcdH0gZWxzZSBpZiAodGJ0YXJnZXQgPT09ICdzZWUnKSB7XG5cdFx0XHRcdGVkaXRTdW1tYXJ5ID0gYCR7d2luZG93LndnVUxTKCfor7fnnIvnnIsnLCAn6KuL55yL55yLJyl9W1s6JHtwYWdlfSR7c2VjdGlvbiA/IGAjJHtzZWN0aW9ufWAgOiAnJ31dXSR7d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfkuIrnmoTorqjorronLFxuXHRcdFx0XHRcdCfkuIrnmoToqI7oq5YnXG5cdFx0XHRcdCl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHRidGFyZ2V0IG9uZSBvZiBteXRhbGssIHVzZXJ0YWxrLCBvdGhlclxuXHRcdFx0XHRlZGl0U3VtbWFyeSA9IGAke3dpbmRvdy53Z1VMUygn5Zue5aSN6YCa5ZGKJywgJ+WbnuimhumAmuWRiicpfe+8iFtbOmA7XG5cdFx0XHRcdGlmICh0YnRhcmdldCAhPT0gJ290aGVyJyAmJiAhbmV3IFJlZ0V4cChgXlxcXFxzKiR7TW9yZWJpdHMubmFtZXNwYWNlUmVnZXgoMyl9OmAsICdpJykudGVzdChwYWdlKSkge1xuXHRcdFx0XHRcdGVkaXRTdW1tYXJ5ICs9ICdVc2VyIHRhbGs6Jztcblx0XHRcdFx0fVxuXHRcdFx0XHRlZGl0U3VtbWFyeSArPSBgJHtwYWdlICsgKHNlY3Rpb24gPyBgIyR7c2VjdGlvbn1gIDogJycpfV1dKWA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0Y29uc3QgZnVsbFVzZXJUYWxrUGFnZU5hbWUgPSBgJHtcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW213LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlSWRzJykudXNlcl90YWxrXVxuXHRcdH06JHttdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKX1gO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gZnVsbFVzZXJUYWxrUGFnZU5hbWU7XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0J+WbnuWkjemAmuWRiuWujOaIkO+8jOWwhuWcqOWHoOenkuWGheWIt+aWsOmhtemdoicsXG5cdFx0XHQn5Zue6KaG6YCa5ZGK5a6M5oiQ77yM5bCH5Zyo5bm+56eS5YWn6YeN5paw5pW055CG6aCB6Z2iJ1xuXHRcdCk7XG5cdFx0Y29uc3QgdGV4dCA9IGBcXG5cXG4ke1R3aW5rbGUudGFsa2JhY2suZ2V0Tm90aWNlV2lraXRleHQodGJ0YXJnZXQsIHBhZ2UsIHNlY3Rpb24sIG1lc3NhZ2UpWzBdfWA7XG5cdFx0Y29uc3QgdGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKGZ1bGxVc2VyVGFsa1BhZ2VOYW1lLCB3aW5kb3cud2dVTFMoJ+WKoOWFpeWbnuWkjemAmuWRiicsICfliqDlhaXlm57opobpgJrlkYonKSk7XG5cdFx0dGFsa3BhZ2Uuc2V0RWRpdFN1bW1hcnkoZWRpdFN1bW1hcnkpO1xuXHRcdHRhbGtwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHR0YWxrcGFnZS5zZXRBcHBlbmRUZXh0KHRleHQpO1xuXHRcdHRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHR0YWxrcGFnZS5zZXRNaW5vckVkaXQoVHdpbmtsZS5nZXRQcmVmKCdtYXJrVGFsa2JhY2tBc01pbm9yJykpO1xuXHRcdHRhbGtwYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdHRhbGtwYWdlLmFwcGVuZCgpO1xuXHR9O1xuXHRUd2lua2xlLnRhbGtiYWNrLnByZXZpZXcgPSAoZm9ybSkgPT4ge1xuXHRcdGNvbnN0IFt0YnRhcmdldF0gPSBmb3JtLmdldENoZWNrZWQoJ3RidGFyZ2V0Jyk7XG5cdFx0Y29uc3Qgc2VjdGlvbiA9IGZvcm0uc2VjdGlvbi52YWx1ZTtcblx0XHRsZXQgcGFnZTtcblx0XHRsZXQgbWVzc2FnZTtcblx0XHRpZiAodGJ0YXJnZXQgPT09ICdub3RpY2UnKSB7XG5cdFx0XHRwYWdlID0gZm9ybS5ub3RpY2Vib2FyZC52YWx1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdXNlcnRhbGssIG90aGVyLCBzZWVcblx0XHRcdHBhZ2UgPSBmb3JtLnBhZ2UgPyBmb3JtLnBhZ2UudmFsdWUgOiBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyk7XG5cdFx0XHRpZiAoZm9ybS5tZXNzYWdlKSB7XG5cdFx0XHRcdG1lc3NhZ2UgPSBmb3JtLm1lc3NhZ2UudmFsdWUudHJpbSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBbbm90aWNldGV4dF0gPSBUd2lua2xlLnRhbGtiYWNrLmdldE5vdGljZVdpa2l0ZXh0KHRidGFyZ2V0LCBwYWdlLCBzZWN0aW9uLCBtZXNzYWdlKTtcblx0XHRmb3JtLnByZXZpZXdlci5iZWdpblJlbmRlcihub3RpY2V0ZXh0LCBgVXNlcl90YWxrOiR7bXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyl9YCk7IC8vIEZvcmNlIHdpa2l0ZXh0L2NvcnJlY3QgdXNlcm5hbWVcblx0fTtcblxuXHRUd2lua2xlLnRhbGtiYWNrLmdldE5vdGljZVdpa2l0ZXh0ID0gKHRidGFyZ2V0LCBwYWdlLCBzZWN0aW9uLCBtZXNzYWdlKSA9PiB7XG5cdFx0bGV0IHRleHQ7XG5cdFx0bGV0IHRpdGxlO1xuXHRcdGxldCBjb250ZW50O1xuXHRcdGlmICh0YnRhcmdldCA9PT0gJ25vdGljZScpIHtcblx0XHRcdCh7dGl0bGV9ID0gVHdpbmtsZS50YWxrYmFjay5ub3RpY2Vib2FyZHNbcGFnZV0pO1xuXHRcdFx0Y29udGVudCA9IE1vcmViaXRzLnN0cmluZy5zYWZlUmVwbGFjZShUd2lua2xlLnRhbGtiYWNrLm5vdGljZWJvYXJkc1twYWdlXS5jb250ZW50LCAnJFNFQ1RJT04nLCBzZWN0aW9uKTtcblx0XHRcdHRleHQgPSBgPT0gJHt0aXRsZX0gPT1cXG4ke2NvbnRlbnR9YDtcblx0XHR9IGVsc2UgaWYgKHRidGFyZ2V0ID09PSAnc2VlJykge1xuXHRcdFx0dGl0bGUgPSBwYWdlICsgd2luZG93LndnVUxTKCfnmoTnm7jlhbPorqjorronLCAn55qE55u46Zec6KiO6KuWJyk7XG5cdFx0XHRjb250ZW50ID0gJ3t7Jy5jb25jYXQoXG5cdFx0XHRcdCdzdWJzdDonLFxuXHRcdFx0XHRgUGxlYXNlIHNlZXxsb2NhdGlvbj0ke3BhZ2V9JHtzZWN0aW9uID8gYCMke3NlY3Rpb259YCA6ICcnfXxtb3JlPSR7bWVzc2FnZS50cmltKCl9fX1gXG5cdFx0XHQpO1xuXHRcdFx0dGV4dCA9ICd7eycuY29uY2F0KFxuXHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0YFBsZWFzZSBzZWV8bG9jYXRpb249JHtwYWdlfSR7c2VjdGlvbiA/IGAjJHtzZWN0aW9ufWAgOiAnJ318bW9yZT0ke21lc3NhZ2UudHJpbSgpfX19YFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGV4dCA9ICc9PSc7XG5cdFx0XHRpZiAodGJ0YXJnZXQgPT09ICdtYWlsJykge1xuXHRcdFx0XHR0aXRsZSA9IFR3aW5rbGUuZ2V0UHJlZignbWFpbEhlYWRpbmcnKTtcblx0XHRcdFx0Y29udGVudCA9IGB7e1lvdSd2ZSBnb3QgbWFpbHxzdWJqZWN0PSR7c2VjdGlvbn18dHM9fn5gLmNvbmNhdCgnficsICd+fn19Jyk7XG5cdFx0XHRcdHRleHQgKz0gYCR7VHdpbmtsZS5nZXRQcmVmKCdtYWlsSGVhZGluZycpfT09XFxue3tZb3UndmUgZ290IG1haWx8c3ViamVjdD0ke3NlY3Rpb259YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHRidGFyZ2V0IG9uZSBvZiBteXRhbGssIHVzZXJ0YWxrLCBvdGhlclxuXHRcdFx0XHQvLyBjbGVhbiB0YWxrYmFjayBoZWFkaW5nOiBzdHJpcCBzZWN0aW9uIGhlYWRlciBtYXJrZXJzIHRoYXQgd2VyZSBlcnJvbmVvdXNseSBzdWdnZXN0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb25cblx0XHRcdFx0dGl0bGUgPSBUd2lua2xlLmdldFByZWYoJ3RhbGtiYWNrSGVhZGluZycpLnJlcGxhY2UoL15cXHMqPStcXHMqKC4qPylcXHMqPSskXFxzKi8sICckMScpO1xuXHRcdFx0XHRjb250ZW50ID0gYHt7dGFsa2JhY2t8JHtwYWdlfSR7c2VjdGlvbiA/IGB8JHtzZWN0aW9ufWAgOiAnJ31gO1xuXHRcdFx0XHR0ZXh0ICs9IGAke1R3aW5rbGUuZ2V0UHJlZigndGFsa2JhY2tIZWFkaW5nJykucmVwbGFjZShcblx0XHRcdFx0XHQvXlxccyo9K1xccyooLio/KVxccyo9KyRcXHMqLyxcblx0XHRcdFx0XHQnJDEnXG5cdFx0XHRcdCl9PT1cXG57e3RhbGtiYWNrfCR7cGFnZX0ke3NlY3Rpb24gPyBgfCR7c2VjdGlvbn1gIDogJyd9YDtcblx0XHRcdH1cblx0XHRcdGNvbnRlbnQgKz0gJ3x0cz1+ficuY29uY2F0KCd+JywgJ35+fX0nKTtcblx0XHRcdHRleHQgKz0gJ3x0cz1+ficuY29uY2F0KCd+JywgJ35+fX0nKTtcblx0XHRcdGlmIChtZXNzYWdlKSB7XG5cdFx0XHRcdGNvbnRlbnQgKz0gYFxcbiR7bWVzc2FnZX1gO1xuXHRcdFx0XHR0ZXh0ICs9IGBcXG4ke21lc3NhZ2V9ICB+fmAuY29uY2F0KCd+ficpO1xuXHRcdFx0fSBlbHNlIGlmIChUd2lua2xlLmdldFByZWYoJ2luc2VydFRhbGtiYWNrU2lnbmF0dXJlJykpIHtcblx0XHRcdFx0dGV4dCArPSAnXFxufn4nLmNvbmNhdCgnfn4nKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFt0ZXh0LCB0aXRsZSwgY29udGVudF07XG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUudGFsa2JhY2ssICd0YWxrYmFjaycpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQge2dlbmVyYXRlQXJyYXl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZXNwZWVkeS5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVzcGVlZHkoJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0LyoqXG5cdCAqIHR3aW5rbGVzcGVlZHkuanM6IENTRCBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiQ1NEXCIpXG5cdCAqIEFjdGl2ZSBvbjogTm9uLXNwZWNpYWwsIGV4aXN0aW5nIHBhZ2VzXG5cdCAqXG5cdCAqIE5PVEUgRk9SIERFVkVMT1BFUlM6XG5cdCAqICBJZiBhZGRpbmcgYSBuZXcgY3JpdGVyaW9uLCBhZGQgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIHBsYWNlcyBhdCB0aGUgdG9wIG9mXG5cdCAqICB0d2lua2xlY29uZmlnLmpzLlxuXHQgKiAgQWxzbywgY2hlY2sgb3V0IHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgQ1NEIHByZWZlcmVuY2VzIGluIHR3aW5rbGUuanMsXG5cdCAqICBhbmQgYWRkIHlvdXIgbmV3IGNyaXRlcmlvbiB0byB0aG9zZSBpZiB5b3UgdGhpbmsgaXQgd291bGQgYmUgZ29vZC5cblx0ICovXG5cdFR3aW5rbGUuc3BlZWR5ID0gKCkgPT4ge1xuXHRcdC8vIERpc2FibGUgb246XG5cdFx0Ly8gKiBzcGVjaWFsIHBhZ2VzXG5cdFx0Ly8gKiBub24tZXhpc3RlbnQgcGFnZXNcblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA8IDAgfHwgIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLFxuXHRcdFx0d2luZG93LndnVUxTKCfpgJ/liKAnLCAn6YCf5YiqJyksXG5cdFx0XHQndHctY3NkJyxcblx0XHRcdE1vcmViaXRzLnVzZXJJc1N5c29wID8gd2luZG93LndnVUxTKCflv6vpgJ/liKDpmaQnLCAn5b+r6YCf5Yiq6ZmkJykgOiB3aW5kb3cud2dVTFMoJ+ivt+axguW/q+mAn+WIoOmZpCcsICfoq4vmsYLlv6vpgJ/liKrpmaQnKVxuXHRcdCk7XG5cdH07XG5cdC8vIFRoaXMgZnVuY3Rpb24gaXMgcnVuIHdoZW4gdGhlIENTRCB0YWIvaGVhZGVyIGxpbmsgaXMgY2xpY2tlZFxuXHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRUd2lua2xlLnNwZWVkeS5pbml0RGlhbG9nKFxuXHRcdFx0TW9yZWJpdHMudXNlcklzU3lzb3AgPyBUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5ldmFsdWF0ZVN5c29wIDogVHdpbmtsZS5zcGVlZHkuY2FsbGJhY2suZXZhbHVhdGVVc2VyLFxuXHRcdFx0dHJ1ZVxuXHRcdCk7XG5cdH07XG5cdC8vIFVzZWQgYnkgdW5saW5rIGZlYXR1cmVcblx0VHdpbmtsZS5zcGVlZHkuZGlhbG9nID0gbnVsbDtcblx0Ly8gVXNlZCB0aHJvdWdob3V0XG5cdFR3aW5rbGUuc3BlZWR5Lmhhc0NTRCA9ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlbGV0ZS1yZWFzb24nKTtcblx0Ly8gVGhlIHNwZWVkeSBjcml0ZXJpYSBsaXN0IGNhbiBiZSBpbiBvbmUgb2Ygc2V2ZXJhbCBtb2Rlc1xuXHRUd2lua2xlLnNwZWVkeS5tb2RlID0ge1xuXHRcdHN5c29wU2luZ2xlU3VibWl0OiAxLFxuXHRcdC8vIHJhZGlvIGJ1dHRvbnMsIG5vIHN1Ymdyb3Vwcywgc3VibWl0IHdoZW4gXCJTdWJtaXRcIiBidXR0b24gaXMgY2xpY2tlZFxuXHRcdHN5c29wUmFkaW9DbGljazogMixcblx0XHQvLyByYWRpbyBidXR0b25zLCBubyBzdWJncm91cHMsIHN1Ym1pdCB3aGVuIGEgcmFkaW8gYnV0dG9uIGlzIGNsaWNrZWRcblx0XHRzeXNvcE11bHRpcGxlU3VibWl0OiAzLFxuXHRcdC8vIGNoZWNrIGJveGVzLCBzdWJncm91cHMsIFwiU3VibWl0XCIgYnV0dG9uIGFscmVhZHkgcHJlc2VudFxuXHRcdHN5c29wTXVsdGlwbGVSYWRpb0NsaWNrOiA0LFxuXHRcdC8vIGNoZWNrIGJveGVzLCBzdWJncm91cHMsIG5lZWQgdG8gYWRkIGEgXCJTdWJtaXRcIiBidXR0b25cblx0XHR1c2VyTXVsdGlwbGVTdWJtaXQ6IDUsXG5cdFx0Ly8gY2hlY2sgYm94ZXMsIHN1Ymdyb3VwcywgXCJTdWJtaXRcIiBidXR0b24gYWxyZWFkeSBwcmVzc2VudFxuXHRcdHVzZXJNdWx0aXBsZVJhZGlvQ2xpY2s6IDYsXG5cdFx0Ly8gY2hlY2sgYm94ZXMsIHN1Ymdyb3VwcywgbmVlZCB0byBhZGQgYSBcIlN1Ym1pdFwiIGJ1dHRvblxuXHRcdHVzZXJTaW5nbGVTdWJtaXQ6IDcsXG5cdFx0Ly8gcmFkaW8gYnV0dG9ucywgc3ViZ3JvdXBzLCBzdWJtaXQgd2hlbiBcIlN1Ym1pdFwiIGJ1dHRvbiBpcyBjbGlja2VkXG5cdFx0dXNlclNpbmdsZVJhZGlvQ2xpY2s6IDgsXG5cdFx0Ly8gcmFkaW8gYnV0dG9ucywgc3ViZ3JvdXBzLCBzdWJtaXQgd2hlbiBhIHJhZGlvIGJ1dHRvbiBpcyBjbGlja2VkXG5cdFx0Ly8gYXJlIHdlIGluIFwiZGVsZXRlIHBhZ2VcIiBtb2RlP1xuXHRcdC8vIChzeXNvcHMgY2FuIGFjY2VzcyBib3RoIFwiZGVsZXRlIHBhZ2VcIiBbc3lzb3BdIGFuZCBcInRhZyBwYWdlIG9ubHlcIiBbdXNlcl0gbW9kZXMpXG5cdFx0aXNTeXNvcDogKG1vZGUpID0+IHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BTaW5nbGVTdWJtaXQgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlU3VibWl0IHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BSYWRpb0NsaWNrIHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BNdWx0aXBsZVJhZGlvQ2xpY2tcblx0XHRcdCk7XG5cdFx0fSxcblx0XHQvLyBkbyB3ZSBoYXZlIGEgXCJTdWJtaXRcIiBidXR0b24gb25jZSB0aGUgZm9ybSBpcyBjcmVhdGVkP1xuXHRcdGhhc1N1Ym1pdEJ1dHRvbjogKG1vZGUpID0+IHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BTaW5nbGVTdWJtaXQgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlU3VibWl0IHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BNdWx0aXBsZVJhZGlvQ2xpY2sgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS51c2VyTXVsdGlwbGVTdWJtaXQgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS51c2VyTXVsdGlwbGVSYWRpb0NsaWNrIHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUudXNlclNpbmdsZVN1Ym1pdFxuXHRcdFx0KTtcblx0XHR9LFxuXHRcdC8vIGlzIGRiLW11bHRpcGxlIHRoZSBvdXRjb21lIGhlcmU/XG5cdFx0aXNNdWx0aXBsZTogKG1vZGUpID0+IHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUudXNlck11bHRpcGxlU3VibWl0IHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BNdWx0aXBsZVN1Ym1pdCB8fFxuXHRcdFx0XHRtb2RlID09PSBUd2lua2xlLnNwZWVkeS5tb2RlLnVzZXJNdWx0aXBsZVJhZGlvQ2xpY2sgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlUmFkaW9DbGlja1xuXHRcdFx0KTtcblx0XHR9LFxuXHR9O1xuXHQvLyBQcmVwYXJlcyB0aGUgc3BlZWR5IGRlbGV0aW9uIGRpYWxvZyBhbmQgZGlzcGxheXMgaXRcblx0VHdpbmtsZS5zcGVlZHkuaW5pdERpYWxvZyA9IChjYWxsYmFja2Z1bmMpID0+IHtcblx0XHRUd2lua2xlLnNwZWVkeS5kaWFsb2cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KFxuXHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzcGVlZHlXaW5kb3dXaWR0aCcpLFxuXHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzcGVlZHlXaW5kb3dIZWlnaHQnKVxuXHRcdCk7XG5cdFx0Y29uc3Qge2RpYWxvZ30gPSBUd2lua2xlLnNwZWVkeTtcblx0XHRkaWFsb2cuc2V0VGl0bGUod2luZG93LndnVUxTKCfpgInmi6nlv6vpgJ/liKDpmaTnkIbnlLEnLCAn6YG45pOH5b+r6YCf5Yiq6Zmk55CG55SxJykpO1xuXHRcdGRpYWxvZy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0ZGlhbG9nLmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCflv6vpgJ/liKDpmaTmlrnpkognLCAn5b+r6YCf5Yiq6Zmk5pa56YedJyksICdRVzpDU0QnKTtcblx0XHRkaWFsb2cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+mAn+WIoOiuvue9ricsICfpgJ/liKroqK3lrponKSwgJ0g6VFcvUFJFRiNzcGVlZHknKTtcblx0XHRkaWFsb2cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ1R3aW5rbGXluK7liqknLCAnVHdpbmtsZeiqquaYjicpLCAnSDpUVy9ET0Mjc3BlZWR5Jyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oXG5cdFx0XHRjYWxsYmFja2Z1bmMsXG5cdFx0XHRUd2lua2xlLmdldFByZWYoJ3NwZWVkeVNlbGVjdGlvblN0eWxlJykgPT09ICdyYWRpb0NsaWNrJyA/ICdjaGFuZ2UnIDogbnVsbFxuXHRcdCk7XG5cdFx0aWYgKE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj6rmoIforrDvvIzkuI3liKDpmaQnLCAn5Y+q5qiZ6KiY77yM5LiN5Yiq6ZmkJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3RhZ19vbmx5Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICd0YWdfb25seScsXG5cdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+iLpeaCqOWPquaDs+agh+iusOatpOmhtemdouiAjOS4jeaYr+WwhuWFtuWIoOmZpCcsICfoi6Xmgqjlj6rmg7PmqJnoqJjmraTpoIHpnaLogIzkuI3mmK/lsIflhbbliKrpmaQnKSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6ICEoVHdpbmtsZS5zcGVlZHkuaGFzQ1NEIHx8IFR3aW5rbGUuZ2V0UHJlZignZGVsZXRlU3lzb3BEZWZhdWx0VG9EZWxldGUnKSksXG5cdFx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNGb3JtID0gZXZlbnQudGFyZ2V0LmZvcm07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG5cdFx0XHRcdFx0XHRcdC8vIGVuYWJsZS9kaXNhYmxlIHRhbGsgcGFnZSBjaGVja2JveFxuXHRcdFx0XHRcdFx0XHRpZiAoY0Zvcm0udGFsa3BhZ2UpIHtcblx0XHRcdFx0XHRcdFx0XHRjRm9ybS50YWxrcGFnZS5kaXNhYmxlZCA9IGNDaGVja2VkO1xuXHRcdFx0XHRcdFx0XHRcdGNGb3JtLnRhbGtwYWdlLmNoZWNrZWQgPSAhY0NoZWNrZWQgJiYgVHdpbmtsZS5nZXRQcmVmKCdkZWxldGVUYWxrUGFnZU9uRGVsZXRlJyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Ly8gZW5hYmxlL2Rpc2FibGUgcmVkaXJlY3RzIGNoZWNrYm94XG5cdFx0XHRcdFx0XHRcdGNGb3JtLnJlZGlyZWN0cy5kaXNhYmxlZCA9IGNDaGVja2VkO1xuXHRcdFx0XHRcdFx0XHRjRm9ybS5yZWRpcmVjdHMuY2hlY2tlZCA9ICFjQ2hlY2tlZDtcblx0XHRcdFx0XHRcdFx0Ly8gZW5hYmxlL2Rpc2FibGUgZGVsZXRlIG11bHRpcGxlXG5cdFx0XHRcdFx0XHRcdGNGb3JtLmRlbG11bHRpcGxlLmRpc2FibGVkID0gY0NoZWNrZWQ7XG5cdFx0XHRcdFx0XHRcdGNGb3JtLmRlbG11bHRpcGxlLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0Ly8gZW5hYmxlL2Rpc2FibGUgb3BlbiB0YWxrIHBhZ2UgY2hlY2tib3hcblx0XHRcdFx0XHRcdFx0Y0Zvcm0ub3BlbnVzZXJ0YWxrLmRpc2FibGVkID0gY0NoZWNrZWQ7XG5cdFx0XHRcdFx0XHRcdGNGb3JtLm9wZW51c2VydGFsay5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdC8vIGVuYWJsZS9kaXNhYmxlIG5vdGlmeSBjaGVja2JveFxuXHRcdFx0XHRcdFx0XHRjRm9ybS5ub3RpZnkuZGlzYWJsZWQgPSAhY0NoZWNrZWQ7XG5cdFx0XHRcdFx0XHRcdGNGb3JtLm5vdGlmeS5jaGVja2VkID0gY0NoZWNrZWQ7XG5cdFx0XHRcdFx0XHRcdC8vIGVuYWJsZS9kaXNhYmxlIG11bHRpcGxlXG5cdFx0XHRcdFx0XHRcdGNGb3JtLm11bHRpcGxlLmRpc2FibGVkID0gIWNDaGVja2VkO1xuXHRcdFx0XHRcdFx0XHRjRm9ybS5tdWx0aXBsZS5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdC8vIGVuYWJsZSByZXF1ZXN0aW5nIGNyZWF0aW9uIHByb3RlY3Rpb25cblx0XHRcdFx0XHRcdFx0Y0Zvcm0uc2FsdGluZy5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLm1vZGVDaGFuZ2VkKGNGb3JtKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGRlbGV0ZU9wdGlvbnMgPSBmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRuYW1lOiAnZGVsZXRlX29wdGlvbnMnLFxuXHRcdFx0fSk7XG5cdFx0XHRkZWxldGVPcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKDpmaTnm7jlhbPpgInpobknLCAn5Yiq6Zmk55u46Zec6YG46aCFJyksXG5cdFx0XHR9KTtcblx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICUgMiA9PT0gMCAmJiBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAyKSB7XG5cdFx0XHRcdC8vIGhpZGUgb3B0aW9uIGZvciB1c2VyIHBhZ2VzLCB0byBhdm9pZCBhY2NpZGVudGFsbHkgZGVsZXRpbmcgdXNlciB0YWxrIHBhZ2Vcblx0XHRcdFx0ZGVsZXRlT3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKDpmaTorqjorrrpobUnLCAn5Yiq6Zmk6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAndGFsa3BhZ2UnLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiAndGFsa3BhZ2UnLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOaXtumZhOW4puWIoOmZpOatpOmhtemdoueahOiuqOiuuumhteOAgicsICfliKrpmaTmmYLpmYTluLbliKrpmaTmraTpoIHpnaLnmoToqI7oq5bpoIHjgIInKSxcblx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdkZWxldGVUYWxrUGFnZU9uRGVsZXRlJyksXG5cdFx0XHRcdFx0XHRcdGV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRkZWxldGVPcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKDpmaTph43lrprlkJEnLCAn5Yiq6Zmk6YeN5paw5bCO5ZCRJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0XHRuYW1lOiAncmVkaXJlY3RzJyxcblx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5Yig6Zmk5Yiw5q2k6aG155qE6YeN5a6a5ZCR44CCJywgJ+WIqumZpOWIsOatpOmggeeahOmHjeaWsOWwjuWQkeOAgicpLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdkZWxldGVSZWRpcmVjdHNPbkRlbGV0ZScpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdFx0ZGVsZXRlT3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bqU55So5aSa5Liq55CG55Sx5Yig6ZmkJywgJ+aHieeUqOWkmuWAi+eQhueUseWIqumZpCcpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdkZWxtdWx0aXBsZScsXG5cdFx0XHRcdFx0XHRuYW1lOiAnZGVsbXVsdGlwbGUnLFxuXHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfmgqjlj6/pgInmi6nlupTnlKjkuo7or6XpobXnmoTlpJrkuKrnkIbnlLHjgIInLCAn5oKo5Y+v6YG45pOH5oeJ55So5pa86Kmy6aCB55qE5aSa5YCL55CG55Sx44CCJyksXG5cdFx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLm1vZGVDaGFuZ2VkKGV2ZW50LnRhcmdldC5mb3JtKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHRcdGRlbGV0ZU9wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W8gOWQr+eUqOaIt+iuqOiuuumhtScsICfplovllZ/kvb/nlKjogIXoqI7oq5bpoIEnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnb3BlbnVzZXJ0YWxrJyxcblx0XHRcdFx0XHRcdG5hbWU6ICdvcGVudXNlcnRhbGsnLFxuXHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn5q2k6aG555qE6buY6K6k5YC85Li65oKo55qE5byA5ZCv6K6o6K666aG16K6+572u44CC5Zyo5oKo6YCJ5oup5bqU55So5aSa5p2h55CG55Sx5Yig6Zmk5pe25q2k6aG55bCG5L+d5oyB5LiN5Y+Y44CCJyxcblx0XHRcdFx0XHRcdFx0J+atpOmgheeahOmgkOioreWAvOeCuuaCqOeahOmWi+WVn+iojuirlumggeioreWumuOAguWcqOaCqOmBuOaTh+aHieeUqOWkmuaineeQhueUseWIqumZpOaZguatpOmgheWwh+S/neaMgeS4jeiuiuOAgidcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRjaGVja2VkOiBmYWxzZSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNvbnN0IHRhZ09wdGlvbnMgPSBmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdG5hbWU6ICd0YWdfb3B0aW9ucycsXG5cdFx0fSk7XG5cdFx0aWYgKE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHR0YWdPcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDnm7jlhbPpgInpobknLCAn5qiZ6KiY55u46Zec6YG46aCFJyksXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dGFnT3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WmguWPr+iDve+8jOmAmuefpeWIm+W7uuiAhScsICflpoLlj6/og73vvIzpgJrnn6Xlu7rnq4vogIUnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0bmFtZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+S4gOS4qumAmuefpeaooeadv+WwhuS8muiiq+WKoOWFpeWIm+W7uuiAheeahOiuqOiuuumhte+8jOiLpeaCqOWQr+eUqOS6huivpeeQhuaNrueahOmAmuefpeOAgicsXG5cdFx0XHRcdFx0XHQn5LiA5YCL6YCa55+l5qih5p2/5bCH5pyD6KKr5Yqg5YWl5bu656uL6ICF55qE6KiO6KuW6aCB77yM6Iul5oKo5ZWf55So5LqG6Kmy55CG5pOa55qE6YCa55+l44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0Y2hlY2tlZDpcblx0XHRcdFx0XHRcdCFNb3JlYml0cy51c2VySXNTeXNvcCB8fFxuXHRcdFx0XHRcdFx0IShUd2lua2xlLnNwZWVkeS5oYXNDU0QgfHwgVHdpbmtsZS5nZXRQcmVmKCdkZWxldGVTeXNvcERlZmF1bHRUb0RlbGV0ZScpKSxcblx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5riF56m66aG16Z2iJywgJ+a4heepuumggemdoicpLFxuXHRcdFx0XHRcdHZhbHVlOiAnYmxhbmsnLFxuXHRcdFx0XHRcdG5hbWU6ICdibGFuaycsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOagh+iusOaooeadv+WJje+8jOWFiOa4heepuumhtemdou+8jOmAgueUqOS6juS4pemHjeegtOWdj+aIlui0n+mdoueUn+iAheS8oOiusOetieOAgicsXG5cdFx0XHRcdFx0XHQn5Zyo5qiZ6KiY5qih5p2/5YmN77yM5YWI5riF56m66aCB6Z2i77yM6YGp55So5pa85Zq06YeN56C05aOe5oiW6LKg6Z2i55Sf6ICF5YKz6KiY562J44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflkIzml7bmoIforrDku6Xor7fmsYLnmb3nurjkv53miqQnLCAn5ZCM5pmC5qiZ6KiY5Lul6KuL5rGC55m957SZ5L+d6K23JyksXG5cdFx0XHRcdFx0dmFsdWU6ICdzYWx0aW5nJyxcblx0XHRcdFx0XHRuYW1lOiAnc2FsdGluZycsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+mAieWPluWQju+8jOW/q+mAn+WIoOmZpOaooeadv+WQjuWwhumZhOW4piB7e3NhbHR9fSDmoIfnrb7vvIzku6Xor7fmsYLmiafooYzliKDpmaTnmoTnrqHnkIblkZjov5vooYznmb3nurjkv53miqTvvIzku4XlnKjpobXpnaLliJvlu7oz5qyh5Lul5LiK5omN6YCJ5oup5q2k6aG544CCJyxcblx0XHRcdFx0XHRcdCfpgbjlj5blvozvvIzlv6vpgJ/liKrpmaTmqKHmnb/lvozlsIfpmYTluLYge3tzYWx0fX0g5qiZ57Gk77yM5Lul6KuL5rGC5Z+36KGM5Yiq6Zmk55qE566h55CG5ZOh6YCy6KGM55m957SZ5L+d6K2377yM5YOF5Zyo6aCB6Z2i5bu656uLM+asoeS7peS4iuaJjemBuOaTh+atpOmgheOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bqU55So5aSa5Liq55CG55SxJywgJ+aHieeUqOWkmuWAi+eQhueUsScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbXVsdGlwbGUnLFxuXHRcdFx0XHRcdG5hbWU6ICdtdWx0aXBsZScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfmgqjlj6/pgInmi6nlupTnlKjkuo7or6XpobXnmoTlpJrkuKrnkIbnlLHjgIInLCAn5oKo5Y+v6YG45pOH5oeJ55So5pa86Kmy6aCB55qE5aSa5YCL55CG55Sx44CCJyksXG5cdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2subW9kZUNoYW5nZWQoZXZlbnQudGFyZ2V0LmZvcm0pO1xuXHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRpZDogJ3ByaW9yLWRlbGV0aW9uLWNvdW50Jyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WIneWni+WMlkNTROaooeWdl+Wksei0pe+8jOivt+mHjeivle+8jOaIluWwhui/meaKpeWRiue7mVR3aW5rbGXlvIDlj5HogIXjgIInLFxuXHRcdFx0XHQn5Yid5aeL5YyWQ1NE5qih57WE5aSx5pWX77yM6KuL6YeN6Kmm77yM5oiW5bCH6YCZ5aCx5ZGK57WmVHdpbmtsZemWi+eZvOiAheOAgidcblx0XHRcdCksXG5cdFx0fSk7XG5cdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignc3BlZWR5U2VsZWN0aW9uU3R5bGUnKSAhPT0gJ3JhZGlvQ2xpY2snKSB7XG5cdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdFx0XHRjbGFzc05hbWU6ICd0dy1zcGVlZHktc3VibWl0Jyxcblx0XHRcdH0pOyAvLyBSZW5hbWVkIGluIG1vZGVDaGFuZ2VkXG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRkaWFsb2cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdGRpYWxvZy5kaXNwbGF5KCk7XG5cdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2subW9kZUNoYW5nZWQocmVzdWx0KTtcblx0XHQvLyBDaGVjayBmb3IgcHJpb3IgZGVsZXRpb25zLiAgSnVzdCBvbmNlLCB1cG9uIGluaXRcblx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5wcmlvckRlbGV0aW9uQ291bnQoKTtcblx0fTtcblx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2suZ2V0TW9kZSA9IChmb3JtKSA9PiB7XG5cdFx0bGV0IG1vZGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLnVzZXJTaW5nbGVTdWJtaXQ7XG5cdFx0aWYgKGZvcm0udGFnX29ubHkgJiYgIWZvcm0udGFnX29ubHkuY2hlY2tlZCkge1xuXHRcdFx0aWYgKGZvcm0uZGVsbXVsdGlwbGUuY2hlY2tlZCkge1xuXHRcdFx0XHRtb2RlID0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlU3VibWl0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bW9kZSA9IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BTaW5nbGVTdWJtaXQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChmb3JtLm11bHRpcGxlLmNoZWNrZWQpIHtcblx0XHRcdG1vZGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLnVzZXJNdWx0aXBsZVN1Ym1pdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bW9kZSA9IFR3aW5rbGUuc3BlZWR5Lm1vZGUudXNlclNpbmdsZVN1Ym1pdDtcblx0XHR9XG5cdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignc3BlZWR5U2VsZWN0aW9uU3R5bGUnKSA9PT0gJ3JhZGlvQ2xpY2snKSB7XG5cdFx0XHRtb2RlKys7XG5cdFx0fVxuXHRcdHJldHVybiBtb2RlO1xuXHR9O1xuXHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5tb2RlQ2hhbmdlZCA9IChmb3JtKSA9PiB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlID0gbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKTtcblx0XHQvLyBmaXJzdCBmaWd1cmUgb3V0IHdoYXQgbW9kZSB3ZSdyZSBpblxuXHRcdGNvbnN0IG1vZGUgPSBUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5nZXRNb2RlKGZvcm0pO1xuXHRcdGNvbnN0IGlzU3lzb3BNb2RlID0gVHdpbmtsZS5zcGVlZHkubW9kZS5pc1N5c29wKG1vZGUpO1xuXHRcdGlmIChpc1N5c29wTW9kZSkge1xuXHRcdFx0JGJvZHkuZmluZCgnW25hbWU9ZGVsZXRlX29wdGlvbnNdJykuc2hvdygpO1xuXHRcdFx0JGJvZHkuZmluZCgnW25hbWU9dGFnX29wdGlvbnNdJykuaGlkZSgpO1xuXHRcdFx0JGJvZHkuZmluZCgnYnV0dG9uLnR3LXNwZWVkeS1zdWJtaXQnKS50ZXh0KHdpbmRvdy53Z1VMUygn5Yig6Zmk6aG16Z2iJywgJ+WIqumZpOmggemdoicpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JGJvZHkuZmluZCgnW25hbWU9ZGVsZXRlX29wdGlvbnNdJykuaGlkZSgpO1xuXHRcdFx0JGJvZHkuZmluZCgnW25hbWU9dGFnX29wdGlvbnNdJykuc2hvdygpO1xuXHRcdFx0JGJvZHkuZmluZCgnYnV0dG9uLnR3LXNwZWVkeS1zdWJtaXQnKS50ZXh0KHdpbmRvdy53Z1VMUygn5qCH6K6w6aG16Z2iJywgJ+aomeiomOmggemdoicpKTtcblx0XHR9XG5cdFx0Y29uc3Qgd29ya19hcmVhID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0bmFtZTogJ3dvcmtfYXJlYScsXG5cdFx0fSk7XG5cdFx0aWYgKFxuXHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS51c2VyTXVsdGlwbGVSYWRpb0NsaWNrIHx8XG5cdFx0XHRtb2RlID09PSBUd2lua2xlLnNwZWVkeS5tb2RlLnN5c29wTXVsdGlwbGVSYWRpb0NsaWNrXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBldmFsdWF0ZVR5cGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLmlzU3lzb3AobW9kZSkgPyAnZXZhbHVhdGVTeXNvcCcgOiAnZXZhbHVhdGVVc2VyJztcblx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5b2T6YCJ5oup5a6M5oiQ5ZCO77yM5Y2V5Ye777yaJywgJ+eVtumBuOaTh+WujOaIkOW+jO+8jOm7nuaTiu+8micpLFxuXHRcdFx0fSk7XG5cdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2J1dHRvbicsXG5cdFx0XHRcdG5hbWU6ICdzdWJtaXQtbXVsdGlwbGUnLFxuXHRcdFx0XHRsYWJlbDogaXNTeXNvcE1vZGUgPyB3aW5kb3cud2dVTFMoJ+WIoOmZpOmhtemdoicsICfliKrpmaTpoIHpnaInKSA6IHdpbmRvdy53Z1VMUygn5qCH6K6w6aG16Z2iJywgJ+aomeiomOmggemdoicpLFxuXHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tbZXZhbHVhdGVUeXBlXShldmVudCk7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3QgcmFkaW9PckNoZWNrYm94ID0gVHdpbmtsZS5zcGVlZHkubW9kZS5pc011bHRpcGxlKG1vZGUpID8gJ2NoZWNrYm94JyA6ICdyYWRpbyc7XG5cdFx0aWYgKGlzU3lzb3BNb2RlICYmICFUd2lua2xlLnNwZWVkeS5tb2RlLmlzTXVsdGlwbGUobW9kZSkpIHtcblx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ55CG55SxJywgJ+iHquiogueQhueUsScpLFxuXHRcdFx0fSk7XG5cdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogcmFkaW9PckNoZWNrYm94LFxuXHRcdFx0XHRuYW1lOiAnY3NkJyxcblx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LmN1c3RvbVJhdGlvbmFsZSwgbW9kZSksXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0c3dpdGNoIChuYW1lc3BhY2UpIHtcblx0XHRcdGNhc2UgMDpcblx0XHRcdFx0Ly8gYXJ0aWNsZSBhbmQgcHNldWRvIG5hbWVzcGFjZVxuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmnaHnm64nLCAn5qKd55uuJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LmFydGljbGVMaXN0LCBtb2RlKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHQvLyB1c2VyXG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+mhtScsICfkvb/nlKjogIXpoIHpnaInKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6IHJhZGlvT3JDaGVja2JveCxcblx0XHRcdFx0XHRuYW1lOiAnY3NkJyxcblx0XHRcdFx0XHRsaXN0OiBUd2lua2xlLnNwZWVkeS5nZW5lcmF0ZUNzZExpc3QoVHdpbmtsZS5zcGVlZHkudXNlckxpc3QsIG1vZGUpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDM6XG5cdFx0XHRcdC8vIHVzZXIgdGFsa1xuXHRcdFx0XHRpZiAobXcudXRpbC5pc0lQQWRkcmVzcyhtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSkpIHtcblx0XHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5oi36K6o6K666aG1JywgJ+S9v+eUqOiAheiojuirlumggScpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogcmFkaW9PckNoZWNrYm94LFxuXHRcdFx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdFx0XHRsaXN0OiBUd2lua2xlLnNwZWVkeS5nZW5lcmF0ZUNzZExpc3QoVHdpbmtsZS5zcGVlZHkudXNlcnRhbGtMaXN0LCBtb2RlKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgNjpcblx0XHRcdFx0Ly8gZmlsZVxuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlofku7YnLCAn5qqU5qGIJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LmZpbGVMaXN0LCBtb2RlKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghVHdpbmtsZS5zcGVlZHkubW9kZS5pc1N5c29wKG1vZGUpKSB7XG5cdFx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCfmoIforrBDU0QgRjHjgIFGM+OAgUY177yM6K+35L2/55SoVHdpbmtsZeeahOKAnOWbvuadg+KAneWKn+iDveOAgicsXG5cdFx0XHRcdFx0XHRcdCfmqJnoqJhDU0QgRjHjgIFGM+OAgUY177yM6KuL5L2/55SoVHdpbmtsZeeahOOAjOWcluasiuOAjeWKn+iDveOAgidcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDE0OlxuXHRcdFx0XHQvLyBjYXRlZ29yeVxuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliIbnsbsnLCAn5YiG6aGeJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LmNhdGVnb3J5TGlzdCwgbW9kZSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTE4OlxuXHRcdFx0XHQvLyBkcmFmdFxuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogJ+iNieeovycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LmRyYWZ0TGlzdCwgbW9kZSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgbmFtZXNwYWNlICUgMiA9PT0gMSAmJiBuYW1lc3BhY2UgIT09IDM6XG5cdFx0XHRcdC8vIHNob3cgZGItdGFsayBvbiB0YWxrIHBhZ2VzLCBidXQgbm90IHVzZXIgdGFsayBwYWdlc1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCforqjorrrpobUnLCAn6KiO6KuW6aCBJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LnRhbGtMaXN0LCBtb2RlKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIGN1c3RvbSByYXRpb25hbGUgbGl2ZXMgdW5kZXIgZ2VuZXJhbCBjcml0ZXJpYSB3aGVuIHRhZ2dpbmdcblx0XHRsZXQgZ2VuZXJhbENyaXRlcmlhID0gVHdpbmtsZS5zcGVlZHkuZ2VuZXJhbExpc3Q7XG5cdFx0aWYgKCFUd2lua2xlLnNwZWVkeS5tb2RlLmlzU3lzb3AobW9kZSkpIHtcblx0XHRcdGdlbmVyYWxDcml0ZXJpYSA9IFsuLi5Ud2lua2xlLnNwZWVkeS5jdXN0b21SYXRpb25hbGUsIC4uLmdlbmVyYXRlQXJyYXkoZ2VuZXJhbENyaXRlcmlhKV07XG5cdFx0fVxuXHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfluLjop4QnLCAn5bi46KaPJyksXG5cdFx0fSk7XG5cdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRuYW1lOiAnY3NkJyxcblx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChnZW5lcmFsQ3JpdGVyaWEsIG1vZGUpLFxuXHRcdH0pO1xuXHRcdGlmICghVHdpbmtsZS5zcGVlZHkubW9kZS5pc1N5c29wKG1vZGUpKSB7XG5cdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aPkOaKpeS+teadg+mhtemdou+8jOivt+S9v+eUqFR3aW5rbGXnmoTigJzkvrXmnYPigJ3lip/og73jgIInLFxuXHRcdFx0XHRcdCfmj5DloLHkvrXmrIrpoIHpnaLvvIzoq4vkvb/nlKhUd2lua2xl55qE44CM5L615qyK44CN5Yqf6IO944CCJ1xuXHRcdFx0XHQpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0lzUmVkaXJlY3QnKSB8fCBNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRsYWJlbDogJ+mHjeWumuWQkScsXG5cdFx0XHR9KTtcblx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRsaXN0OiBUd2lua2xlLnNwZWVkeS5nZW5lcmF0ZUNzZExpc3QoVHdpbmtsZS5zcGVlZHkucmVkaXJlY3RMaXN0LCBtb2RlKSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCBbb2xkX2FyZWFdID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGZvcm0sICd3b3JrX2FyZWEnKTtcblx0XHRmb3JtLnJlcGxhY2VDaGlsZCh3b3JrX2FyZWEucmVuZGVyKCksIG9sZF9hcmVhKTtcblx0XHQvLyBpZiBzeXNvcCwgY2hlY2sgaWYgQ1NEIGlzIGFscmVhZHkgb24gdGhlIHBhZ2UgYW5kIGZpbGwgaW4gY3VzdG9tIHJhdGlvbmFsZVxuXHRcdGlmIChpc1N5c29wTW9kZSAmJiBUd2lua2xlLnNwZWVkeS5oYXNDU0QpIHtcblx0XHRcdGNvbnN0IFtjdXN0b21PcHRpb25dID0gJGJvZHkuZmluZCgnaW5wdXRbbmFtZT1jc2RdW3ZhbHVlPXJlYXNvbl0nKTtcblx0XHRcdGlmIChjdXN0b21PcHRpb24pIHtcblx0XHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignc3BlZWR5U2VsZWN0aW9uU3R5bGUnKSAhPT0gJ3JhZGlvQ2xpY2snKSB7XG5cdFx0XHRcdFx0Ly8gZm9yY2UgbGlzdGVuZXJzIHRvIHJlLWluaXRcblx0XHRcdFx0XHRjdXN0b21PcHRpb24uY2xpY2soKTtcblx0XHRcdFx0XHRjdXN0b21PcHRpb24ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjdXN0b21PcHRpb24uc3ViZ3JvdXApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGN1c3RvbU9wdGlvbi5zdWJncm91cC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLnZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KFxuXHRcdFx0XHRcdCRib2R5LmZpbmQoJyNkZWxldGUtcmVhc29uJykudGV4dCgpXG5cdFx0XHRcdCkucmVwbGFjZSgvXFwrL2csICcgJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGVubGFyZ2UgRzcgcmFkaW8vY2hlY2tib3ggYW5kIGl0cyBsYWJlbFxuXHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt2YWx1ZT1cImc3XCJdJykgJiYgVHdpbmtsZS5nZXRQcmVmKCdlbmxhcmdlRzdJbnB1dCcpKSB7XG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt2YWx1ZT1cImc3XCJdJykuc3R5bGUgPVxuXHRcdFx0XHQnaGVpZ2h0OiAyZW07IHdpZHRoOiAyZW07IGhlaWdodDogLW1vei1pbml0aWFsOyB3aWR0aDogLW1vei1pbml0aWFsOyAtbW96LXRyYW5zZm9ybTogc2NhbGUoMik7IC1vLXRyYW5zZm9ybTogc2NhbGUoMik7Jztcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3ZhbHVlPVwiZzdcIl0nKS5sYWJlbHNbMF0uc3R5bGUgPSAnZm9udC1zaXplOiAxLjVlbTsgbGluZS1oZWlnaHQ6IDEuNWVtOyc7XG5cdFx0fVxuXHRcdGlmICghaXNTeXNvcE1vZGUgJiYgbXcuY29uZmlnLmdldCgnd2dQYWdlQ29udGVudE1vZGVsJykgIT09ICd3aWtpdGV4dCcpIHtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPXRhZ19vcHRpb25zXScpLmhpZGUoKTtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPXdvcmtfYXJlYV0nKS5lbXB0eSgpO1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IFtcblx0XHRcdFx0d2luZG93LndnVUxTKCdUd2lua2xl5LiN5pSv5oyB5Zyo6aG16Z2i5YaF5a655qih5Z6L5Li6JywgJ1R3aW5rbGXkuI3mlK/mj7TlnKjpoIHpnaLlhaflrrnmqKHlnovngronKSxcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlQ29udGVudE1vZGVsJyksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn55qE6aG16Z2i5LiK5oyC5LiK5b+r6YCf5Yig6Zmk5qih5p2/77yM6K+35Y+C6KeBJywgJ+eahOmggemdouS4iuaOm+S4iuW/q+mAn+WIqumZpOaooeadv++8jOiri+WPg+imiycpLFxuXHRcdFx0XHQkKCc8YT4nKVxuXHRcdFx0XHRcdC5hdHRyKHtcblx0XHRcdFx0XHRcdHRhcmdldDogJ19ibGFuaycsXG5cdFx0XHRcdFx0XHRyZWw6ICdub29wZW5lciBub3JlZmVycmVyJyxcblx0XHRcdFx0XHRcdGhyZWY6IG13LnV0aWwuZ2V0VXJsKCdRVzpTUEVDSUFMU0QnKSxcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn5omL5Yqo5pS+572u5qih5p2/5pe255qE5rOo5oSP5LqL6aG5JywgJ+aJi+WLleaUvue9ruaooeadv+aZgueahOazqOaEj+S6i+mghScpKVswXSxcblx0XHRcdFx0J+OAgicsXG5cdFx0XHRdO1xuXHRcdFx0JGJvZHkuZmluZCgnW25hbWU9d29ya19hcmVhXScpLmFwcGVuZChtZXNzYWdlKTtcblx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZCh0cnVlKTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLnByaW9yRGVsZXRpb25Db3VudCA9ICgpID0+IHtcblx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdFx0bGlzdDogJ2xvZ2V2ZW50cycsXG5cdFx0XHRsZXR5cGU6ICdkZWxldGUnLFxuXHRcdFx0bGVhY3Rpb246ICdkZWxldGUvZGVsZXRlJyxcblx0XHRcdC8vIEp1c3QgcHVyZSBwYWdlIGRlbGV0aW9uLCBubyByZWRpcmVjdCBvdmVyd3JpdGVzIG9yIHJldmRlbFxuXHRcdFx0bGV0aXRsZTogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0bGVwcm9wOiAnJyxcblx0XHRcdC8vIFdlJ3JlIGp1c3QgY291bnRpbmcgd2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSBhYm91dCB0aGUgZW50cmllc1xuXHRcdFx0bGVsaW1pdDogNSxcblx0XHRcdC8vIEEgbGl0dGxlIGJpdCBnb2VzIGEgbG9uZyB3YXlcblx0XHR9O1xuXG5cdFx0bmV3IE1vcmViaXRzLndpa2kuYXBpKHdpbmRvdy53Z1VMUygn5qOA5p+l5LmL5YmN55qE5Yig6ZmkJywgJ+aqouafpeS5i+WJjeeahOWIqumZpCcpLCBxdWVyeSwgKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhcGlvYmouZ2V0UmVzcG9uc2UoKTtcblx0XHRcdGNvbnN0IGRlbENvdW50ID0gcmVzcG9uc2UucXVlcnkubG9nZXZlbnRzLmxlbmd0aDtcblx0XHRcdGlmIChkZWxDb3VudCkge1xuXHRcdFx0XHRsZXQgbWVzc2FnZSA9IHdpbmRvdy53Z1VMUygn6KKr5Yig6ZmkJywgJ+iiq+WIqumZpCcpO1xuXHRcdFx0XHRpZiAocmVzcG9uc2UuY29udGludWUpIHtcblx0XHRcdFx0XHRtZXNzYWdlICs9IHdpbmRvdy53Z1VMUygn6LaF6L+HJywgJ+i2hemBjicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1lc3NhZ2UgKz0gYCR7ZGVsQ291bnR95qyhYDtcblx0XHRcdFx0Ly8gMysgc2VlbXMgcHJvYmxlbWF0aWNcblx0XHRcdFx0aWYgKGRlbENvdW50ID49IDMpIHtcblx0XHRcdFx0XHQkYm9keS5maW5kKCcjcHJpb3ItZGVsZXRpb24tY291bnQnKS5jc3MoJ2NvbG9yJywgJyNmZjAwMDAnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBQcm92aWRlIGEgbGluayB0byBwYWdlIGxvZ3MgKENTRCB0ZW1wbGF0ZXMgaGF2ZSBvbmUgZm9yIHN5c29wcylcblx0XHRcdFx0Y29uc3QgbGluayA9IE1vcmViaXRzLmh0bWxOb2RlKCdhJywgd2luZG93LndnVUxTKCfvvIjml6Xlv5fvvIknLCAn77yI5pel6KqM77yJJykpO1xuXHRcdFx0XHRsaW5rLnNldEF0dHJpYnV0ZShcblx0XHRcdFx0XHQnaHJlZicsXG5cdFx0XHRcdFx0bXcudXRpbC5nZXRVcmwoJ1NwZWNpYWw6TG9nJywge1xuXHRcdFx0XHRcdFx0cGFnZTogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7XG5cdFx0XHRcdGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuXHRcdFx0XHQkYm9keS5maW5kKCcjcHJpb3ItZGVsZXRpb24tY291bnQnKS50ZXh0KG1lc3NhZ2UpOyAvLyBTcGFjZSBiZWZvcmUgbG9nIGxpbmtcblx0XHRcdFx0JGJvZHkuZmluZCgnI3ByaW9yLWRlbGV0aW9uLWNvdW50JykuYXBwZW5kKGxpbmspO1xuXHRcdFx0fVxuXHRcdH0pLnBvc3QoKTtcblx0fTtcblx0VHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0ID0gKGxpc3QsIG1vZGUpID0+IHtcblx0XHQvLyBtb2RlIHN3aXRjaGVzXG5cdFx0Y29uc3QgaXNTeXNvcE1vZGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLmlzU3lzb3AobW9kZSk7XG5cdFx0Y29uc3QgbXVsdGlwbGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLmlzTXVsdGlwbGUobW9kZSk7XG5cdFx0Y29uc3QgaGFzU3VibWl0QnV0dG9uID0gVHdpbmtsZS5zcGVlZHkubW9kZS5oYXNTdWJtaXRCdXR0b24obW9kZSk7XG5cdFx0Y29uc3Qgb3BlblN1Ymdyb3VwSGFuZGxlciA9IChlKSA9PiB7XG5cdFx0XHQkKGUudGFyZ2V0LmZvcm0pLmZpbmQoJ2lucHV0JykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcblx0XHRcdCQoZS50YXJnZXQuZm9ybSkuY2hpbGRyZW4oKS5jc3MoJ2NvbG9yJywgJ2dyYXknKTtcblx0XHRcdCQoZS50YXJnZXQpLnBhcmVudCgpLmNzcygnY29sb3InLCAnYmxhY2snKS5maW5kKCdpbnB1dCcpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xuXHRcdFx0JChlLnRhcmdldCkucGFyZW50KCkuZmluZCgnaW5wdXQ6dGV4dCcpWzBdLmZvY3VzKCk7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH07XG5cdFx0Y29uc3Qgc3VibWl0U3ViZ3JvdXBIYW5kbGVyID0gKGUpID0+IHtcblx0XHRcdGNvbnN0IGV2YWx1YXRlVHlwZSA9IFR3aW5rbGUuc3BlZWR5Lm1vZGUuaXNTeXNvcChtb2RlKSA/ICdldmFsdWF0ZVN5c29wJyA6ICdldmFsdWF0ZVVzZXInO1xuXHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tbZXZhbHVhdGVUeXBlXShlKTtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fTtcblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGxpc3QsIChjcml0RWxlbWVudCkgPT4ge1xuXHRcdFx0Y29uc3QgY3JpdGVyaW9uID0ge1xuXHRcdFx0XHQuLi5jcml0RWxlbWVudCxcblx0XHRcdH07XG5cdFx0XHRpZiAobXVsdGlwbGUpIHtcblx0XHRcdFx0aWYgKGNyaXRlcmlvbi5oaWRlV2hlbk11bHRpcGxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNyaXRlcmlvbi5oaWRlU3ViZ3JvdXBXaGVuTXVsdGlwbGUpIHtcblx0XHRcdFx0XHRjcml0ZXJpb24uc3ViZ3JvdXAgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoY3JpdGVyaW9uLmhpZGVXaGVuU2luZ2xlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNyaXRlcmlvbi5oaWRlU3ViZ3JvdXBXaGVuU2luZ2xlKSB7XG5cdFx0XHRcdFx0Y3JpdGVyaW9uLnN1Ymdyb3VwID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGlzU3lzb3BNb2RlKSB7XG5cdFx0XHRcdGlmIChjcml0ZXJpb24uaGlkZVdoZW5TeXNvcCkge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjcml0ZXJpb24uaGlkZVN1Ymdyb3VwV2hlblN5c29wKSB7XG5cdFx0XHRcdFx0Y3JpdGVyaW9uLnN1Ymdyb3VwID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGNyaXRlcmlvbi5oaWRlV2hlblVzZXIpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY3JpdGVyaW9uLmhpZGVTdWJncm91cFdoZW5Vc2VyKSB7XG5cdFx0XHRcdFx0Y3JpdGVyaW9uLnN1Ymdyb3VwID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnSXNSZWRpcmVjdCcpICYmIGNyaXRlcmlvbi5oaWRlV2hlblJlZGlyZWN0KSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjcml0ZXJpb24uc2hvd0luTmFtZXNwYWNlcyAmJlxuXHRcdFx0XHQhY3JpdGVyaW9uLnNob3dJbk5hbWVzcGFjZXMuaW5jbHVkZXMobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGNyaXRlcmlvbi5oaWRlSW5OYW1lc3BhY2VzICYmXG5cdFx0XHRcdGNyaXRlcmlvbi5oaWRlSW5OYW1lc3BhY2VzLmluY2x1ZGVzKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY3JpdGVyaW9uLnN1Ymdyb3VwICYmICFoYXNTdWJtaXRCdXR0b24pIHtcblx0XHRcdFx0Y3JpdGVyaW9uLnN1Ymdyb3VwID0gZ2VuZXJhdGVBcnJheShjcml0ZXJpb24uc3ViZ3JvdXAsIHtcblx0XHRcdFx0XHR0eXBlOiAnYnV0dG9uJyxcblx0XHRcdFx0XHRuYW1lOiAnc3VibWl0Jyxcblx0XHRcdFx0XHRsYWJlbDogaXNTeXNvcE1vZGUgPyB3aW5kb3cud2dVTFMoJ+WIoOmZpOmhtemdoicsICfliKrpmaTpoIHpnaInKSA6IHdpbmRvdy53Z1VMUygn5qCH6K6w6aG16Z2iJywgJ+aomeiomOmggemdoicpLFxuXHRcdFx0XHRcdGV2ZW50OiBzdWJtaXRTdWJncm91cEhhbmRsZXIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHQvLyBGSVhNRTogZG9lcyB0aGlzIGRvIGFueXRoaW5nP1xuXHRcdFx0XHRjcml0ZXJpb24uZXZlbnQgPSBvcGVuU3ViZ3JvdXBIYW5kbGVyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzU3lzb3BNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9yaWdpbmFsRXZlbnQgPSBjcml0ZXJpb24uZXZlbnQ7XG5cdFx0XHRcdGNyaXRlcmlvbi5ldmVudCA9IChlKSA9PiB7XG5cdFx0XHRcdFx0aWYgKG11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxFdmVudChlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qgbm9ybWFsaXplZENyaXRlcmlvbiA9IFR3aW5rbGUuc3BlZWR5Lm5vcm1hbGl6ZUhhc2hbZS50YXJnZXQudmFsdWVdO1xuXHRcdFx0XHRcdCRib2R5XG5cdFx0XHRcdFx0XHQuZmluZCgnW25hbWU9b3BlbnVzZXJ0YWxrXScpXG5cdFx0XHRcdFx0XHQucHJvcChcblx0XHRcdFx0XHRcdFx0J2NoZWNrZWQnLFxuXHRcdFx0XHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ29wZW5Vc2VyVGFsa1BhZ2VPblNwZWVkeURlbGV0ZScpLmluY2x1ZGVzKG5vcm1hbGl6ZWRDcml0ZXJpb24pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmIChvcmlnaW5hbEV2ZW50KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxFdmVudChlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3JpdGVyaW9uO1xuXHRcdH0pO1xuXHR9O1xuXHRUd2lua2xlLnNwZWVkeS5jdXN0b21SYXRpb25hbGUgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6IGDoh6rlrprkuYnnkIbnlLEke01vcmViaXRzLnVzZXJJc1N5c29wID8gJ++8iOiHquWumuS5ieWIoOmZpOeQhueUse+8iScgOiAnJ31gLFxuXHRcdFx0dmFsdWU6ICdyZWFzb24nLFxuXHRcdFx0dG9vbHRpcDogJ+ivpemhteiHs+WwkeW6lOivpeespuWQiOS4gOadoeW/q+mAn+WIoOmZpOeahOagh+WHhu+8jOW5tuS4lOaCqOW/hemhu+WcqOeQhueUseS4reaPkOWIsOOAgicsXG5cdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRuYW1lOiAncmVhc29uXzEnLFxuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRsYWJlbDogJ+eQhueUse+8micsXG5cdFx0XHRcdHNpemU6IDYwLFxuXHRcdFx0fSxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLnNwZWVkeS5maWxlTGlzdCA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogJ0Yx77ya5piO5pi+5LiN56ym5ZCI5pys56uZ6JGX5L2c5p2D5pa56ZKI55qE5paH5Lu2Jyxcblx0XHRcdHZhbHVlOiAnZjEnLFxuXHRcdFx0dG9vbHRpcDpcblx0XHRcdFx0J+WMheaLrOS7peS4i+aDheWGte+8mjEu5LiK5Lyg5ZCOM+WkqeWGheS7jeeEtuadpea6kOS4jeaYjuOAgeiRl+S9nOadg+S4jeaYjueahOaWh+S7tuOAgjIu5LiK5Lyg6ICF5a6j56ew5oul5pyJ77yM6ICM5Zyo5YW25LuW5p2l5rqQ5om+5Yiw55qE5paH5Lu244CCMy7mlofku7blrqPnp7DnlLHmn5DkvZzogIXkvp3mja7mn5Doh6rnlLHokZfkvZzmnYPljY/orq7lj5HluIPvvIzkvYbmib7kuI3liLDor6Xoh6rnlLHljY/orq7nmoTlo7DmmI7jgII0LuWFtuS7luaYjuaYvuS+teadg+eahOaWh+S7tu+8jOWPr+mZhOWKoOS+teadg+eQhueUseOAgicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogJ0Yy77ya6YeN5aSN5LiU5LiN5YaN6KKr5L2/55So55qE5paH5Lu2Jyxcblx0XHRcdHZhbHVlOiAnZjInLFxuXHRcdFx0dG9vbHRpcDpcblx0XHRcdFx0J+WMheaLrOS7peS4i+aDheWGte+8muS4jueOsOacieaWh+S7tuWujOWFqOebuOWQjO+8iOaIluS4jueOsOacieaWh+S7tuWGheWuueS4gOiHtOS9huWwuuWvuOi+g+Wwj++8ie+8jOS4lOayoeacieWuouingumcgOimge+8iOWmguafkOS6m+WcuuWQiOmcgOS9v+eUqOWwj+WwuuWvuOWbvueJh++8ieeahOaWh+S7tuOAguaIluaYr+iiq+abtOWKoOa4heaZsOeahOaWh+S7tuOAgVNWR+agvOW8j+aWh+S7tuaJgOWPluS7o+eahOaWh+S7tuOAguivt+aPkOaKpeiAheehruWumuaWh+S7tuayoeacieS7u+S9lemhtemdouS9v+eUqOWQjuWGjeaPkOaKpeWIoOmZpO+8jOW5tumZhOazqOWvueW6lOi0qOmHj+abtOWlveeahOaWh+S7tuWQjeOAgicsXG5cdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRuYW1lOiAnZjJfZmlsZW5hbWUnLFxuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRsYWJlbDogJ+aWsOaWh+S7tuWQje+8micsXG5cdFx0XHRcdHRvb2x0aXA6ICflj6/kuI3lkKvigJxGaWxlOuKAneWJjee8gOOAgicsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuc3BlZWR5LmFydGljbGVMaXN0ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiAnQTHvvJrlhoXlrrnnqbrms5vmiJblrozlhajmsqHmnInlhoXlrrnjgIInLFxuXHRcdFx0dmFsdWU6ICdhMScsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5p2h55uu55qE5YaF5a6556y857uf77yM5oiW55Sa6Iez5qC55pys5rKh5pyJ5o+Q5Y+K5p2h55uu5Li75L2T77yM5L2/5p2h55uu5LiN6IO955So5Lul5Yy65YiG5YW25LuW5LqL54mp77yb5oiW5p2h55uu5Y+q5YyF5ous5aSW6YOo6ZO+5o6l44CB5Y+C6KeB44CB5Y+C6ICD5p2l5rqQ44CB5YiG57G744CB5qih5p2/77yM6ICM5rKh5pyJ5paH5a2X5o+P6L+w44CC5raI5q2n5LmJ6aG144CB6YeN5a6a5ZCR6aG15LiN6YCC55So5q2k5p2h44CC6K+35rOo5oSP5pyJ5Lqb55So5oi35Y+v6IO95Lya5aSa5qyh5L+d5a2Y77yM6Iul5q2k57G76aG16Z2i55qE5pyA5ZCO5LiA5qyh57yW6L6R5pe26Ze06LaF6L+HMjTlsI/ml7bvvIzliJnlj6/mj5Dor7flv6vpgJ/liKDpmaTjgIInLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdBMu+8muS4juWFtuS7luadoeebruaIluWFtuWOhuWPsueJiOacrOmHjeWkje+8jOS4lOS4jemAguWQiOS9nOS4uuWFtumHjeWumuWQkeOAgicsXG5cdFx0XHR2YWx1ZTogJ2EyJyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfmnaHnm67liJvlu7rml7bnmoTlhoXlrrnvvIzkuI7lhbbku5bnjrDmnInmnaHnm67vvIjmiJblhbbljoblj7LniYjmnKzvvInlhoXlrrnlrozlhajnm7jlkIzmiJbpnZ7luLjnm7jkvLzvvIzkuJTlkI3np7DkuI3pgILlkIjkvZzkuLrlkI7ogIXnmoTph43lrprlkJHjgILkuI3ljIXmi6zmi4bliIbjgIHlkIjlubbjgIHph43nu4TlkI7kuqfnlJ/nmoTmnaHnm67jgILlpoLmnInnlpHomZHvvIzlj6/ovazkuqTliKDpmaTorqjorrrjgILoi6XlkI7liJvlu7rnmoTmnaHnm67lkI3np7Dlj6/kvZzkuLrph43lrprlkJHvvIzlj6/nm7TmjqXmlLnkuLrph43lrprlkJHvvJvoi6XlhYjliJvlu7rnmoTmnaHnm67lrpzkvZzkuLrlkI7liJvlu7rmnaHnm67nmoTph43lrprlkJHvvIzor7fmj5Dor7fnp7vliqjor7fmsYLjgIInLFxuXHRcdFx0c3ViZ3JvdXA6IHtcblx0XHRcdFx0bmFtZTogJ2EyX3BhZ2VuYW1lJyxcblx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0bGFiZWw6ICfnjrDmnInmnaHnm67lkI3vvJonLFxuXHRcdFx0XHR0b29sdGlwOiAn5LiN6Ieq5Yqo5Yqg5LiK6ZO+5o6l77yM6Iul6ZyA6KaB6K+36Ieq6KGM5Yqg5LiKW1tdXeOAgicsXG5cdFx0XHRcdHNpemU6IDYwLFxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnQTPvvJrpnZ7njrDku6PmsYnor63miJbnv7vor5Hmi5nliqPnmoTmnaHnm64nLFxuXHRcdFx0dmFsdWU6ICdhMycsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5p2h55uu5YaF5a6557ud5aSn6YOo5YiG6Z2e546w5Luj5rGJ6K+t77yM5YyF5ous5pyq57+76K+R55qE5aSW6K+t44CB5pa56KiA5Y+K5paH6KiA5paH77yb5oiW57+76K+R6LSo6YeP5L2O5LiL77yM5Lul6Iez5LqO6Zq+5Lul55CG6Kej5oiW5Ye6546w6L6D5aSa6ZSZ6K+v44CCJyxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLnNwZWVkeS5jYXRlZ29yeUxpc3QgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdPMu+8muepuuWIhuexu+OAgicsXG5cdFx0XHR2YWx1ZTogJ28yJyxcblx0XHRcdHRvb2x0aXA6ICfmsqHmnInmlLblvZXku7vkvZXpobXpnaLjgIHmlofku7bjgIHlrZDliIbnsbvnmoTliIbnsbvjgIJDYXRlZ29yeTror7fli7/liKDpmaTnmoTliIbnsbvkuK3nmoTliIbnsbvkuI3pgILnlKjjgIInLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuc3BlZWR5LmRyYWZ0TGlzdCA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogJ08z77ya5bqf5byD6I2J56i/44CCJyxcblx0XHRcdHZhbHVlOiAnbzMnLFxuXHRcdFx0dG9vbHRpcDogJ+iNieeov+WQjeWtl+epuumXtOWGheWFreS4quaciOWGheaXoOe8lui+keeahOmhtemdouOAgicsXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5zcGVlZHkudXNlckxpc3QgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdPMe+8mueUqOaIt+ivt+axguWIoOmZpOiHquW3seeahOeUqOaIt+mhteOAgicsXG5cdFx0XHR2YWx1ZTogJ28xJyxcblx0XHRcdHRvb2x0aXA6ICfnrqHnkIblkZjpnIDmn6XnnIvnvJbovpHljoblj7LvvIznoa7orqTor6XpobXpnaLkuI3mmK/ku47lhbbku5blkI3lrZfnqbrpl7Tnp7vliqjogIzmnaXjgIInLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuc3BlZWR5LmdlbmVyYWxMaXN0ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzHvvJrmmI7mmL7ov53lj43ms5Xlvovms5Xop4TmiJbov53og4zlhazluo/oia/kv5fnmoTpobXpnaInLFxuXHRcdFx0dmFsdWU6ICdnMScsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5piO5pi+6L+d5Y+N5pyN5Yqh5Zmo5omA5Zyo5Zyw55qE5rOV5b6L5rOV6KeE5Y+K5pyJ5YWz6KeE5a6a77yM5oiW56qB56C056S+5Lya5YWs5bqP6Imv5L+X5bqV57q/77yM5oyJ54Wn5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu95LqS6IGU572R566h55CG6KeE5a6a5bqU5LqI5Yig6Zmk55qE6aG16Z2i44CCJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzLvvJrmsqHmnInlrp7pmYXlhoXlrrnnmoTpobXpnaInLFxuXHRcdFx0dmFsdWU6ICdnMicsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5LuF5YyF5ous5peg5oSP5LmJ5a2X56ym5Liy6ICM5rKh5pyJ5a6e6ZmF5YaF5a6555qE6aG16Z2i44CC55Sx55So5oi35pys5Lq65Yib5bu655qE55So5oi36aG144CB55So5oi36K6o6K666aG177yM5Y+K5LiT5Li65rWL6K+V5o+Q5L6b55qE5rKZ55uS77yM5LiN6YCC55So5q2k5YeG5YiZ44CCJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzPvvJrnuq/nsrnnoLTlnY8nLFxuXHRcdFx0dmFsdWU6ICdnMycsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5YyF5ous5L2G5LiN6ZmQ5LqO5piO5pi+55qE5oG25L2c5Ymn44CB6ZSZ6K+v5L+h5oGv44CB5Lq66Lqr5pS75Ye7562J77yM5Lul5Y+K5riF55CG56e75Yqo56C05Z2P5pe255WZ5LiL55qE6YeN5a6a5ZCR44CC6Iul5pS25Yiw5oiW5Y+R546w5Lil6YeN55qE5Lq66Lqr5pS75Ye75LiO6K+L5q+B77yM566h55CG5ZGY5Y+K5YW25LuW55So5oi35bqU6YCa55+l55uR552j5ZGY6L+b6KGM55uR552j6ZqQ6JeP44CCJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzTvvJrph43mlrDliJvlu7rlt7LooqvliKDpmaTnmoTpobXpnaInLFxuXHRcdFx0dmFsdWU6ICdnNCcsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn6Iul546w5pyJ6aG16Z2i5LiO5pu+5Zyo5Yig6Zmk6K6o6K6677yI5ZCr6aG16Z2i5a2Y5bqf6K6o6K6644CB5paH5Lu25a2Y5bqf6K6o6K665ZKM5L615p2D5a6h5qC477yM5LiN5ZCr5b+r6YCf5Yig6Zmk77yJ5Lit6KKr5Yig6Zmk5YaF5a6555u45ZCM5oiW6Z2e5bi455u45Ly877yM5LiU546w5pyJ5YaF5a655LuN54S26YCC55So5Yig6Zmk6K6o6K665Lit55qE57uT6K6677yM5peg6K665qCH6aKY5piv5ZCm55u45ZCM77yM6YO96YCC55So5pys5qCH5YeG44CC6Iul546w5pyJ6aG16Z2i5qCH6aKY5LiO5bey5Yig54mI5pys5LiN5LiA6Ie077yM5YiZ5o+Q6K+36YCf5Yig6ICF5bqU5LiA5bm25rOo5piO5bey5Yig54mI5pys55qE6aG16Z2i5ZCN77yb6Iul6K+l6aG16Z2i5LmL5YmN6KKr5b+r6YCf5Yig6Zmk77yM6K+35Lul55u45ZCM55CG55Sx6YeN5paw5o+Q6K+36YCf5Yig44CC6Iul546w5pyJ5YaF5a655LiN6YCC55So5Yig6Zmk6K6o6K665Lit55qE57uT6K6677yM5bqU6YeN5paw5o+Q5Ye65Yig6Zmk6K6o6K6644CCJyxcblx0XHRcdHN1Ymdyb3VwOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZzRfcGFnZW5hbWUnLFxuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bGFiZWw6ICflt7LliKDniYjmraTpobXpnaLlkI3vvJonLFxuXHRcdFx0XHRcdHNpemU6IDYwLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHRcdGhpZGVTdWJncm91cFdoZW5NdWx0aXBsZTogdHJ1ZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzXvvJrlm6DmioDmnK/ljp/lm6DliKDpmaTpobXpnaInLFxuXHRcdFx0dmFsdWU6ICdnNScsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5YyF5ous5Lul5LiL5oOF5b2i77ya5Zug56e75Yqo6K+35rGC6ICM5Yig6Zmk6aG16Z2i77yb5Lul6KaG55uW5Yig6Zmk6YeN5a6a5ZCR77yb5Yig6Zmk5peg55So55qETWVkaWFXaWtp6aG16Z2i77yM5Y+K5YW25LuW5oqA5pyv5Zui6Zif5oiW55WM6Z2i566h55CG5ZGY6K6k5Li65pyJ5b+F6KaB5omn6KGM55qE5b+r6YCf5Yig6Zmk5oOF5b2i44CCJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzbvvJrljp/kvZzogIXmj5Dor7fliKDpmaTmiJbmuIXnqbrpobXpnaLvvIzkuJTpobXpnaLljp/kvZzogIXku4XmnInkuIDkuronLFxuXHRcdFx0dmFsdWU6ICdnNicsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn6aG16Z2i5Y6f5L2c6ICF5oyB5ZCI55CG55CG55Sx5o+Q5Ye655qE5b+r6YCf5Yig6Zmk77yb5oiW6aG16Z2i5Y6f5L2c6ICF77yI5a6e6ZmF6LSh54yu6ICF77yJ5riF56m66aG16Z2i77yM5YW25LuW55So5oi35o+Q5Lqk55qE5b+r6YCf5Yig6Zmk44CC6aG16Z2i5Y6f5L2c6ICF77yI5a6e6ZmF6LSh54yu6ICF77yJ5LuF5LiA5Lq65pe25ruh6Laz5pys5YeG5YiZ44CC6Iul6aG16Z2i5a6e6ZmF6LSh54yu6ICF5aSa5LqO5LiA5Lq677yM6K+35oyB5ZCI55CG55CG55Sx5o+Q5Lqk5Yig6Zmk6K6o6K6644CC5ZCO5LiA5oOF5b2i5LiN5YyF5ous55So5oi36aG144CB55So5oi36K6o6K666aG177yM5LiU5bqU5Zyo6aG16Z2i5pyA5ZCO5LiA5qyh57yW6L6RNuWwj+aXtuWQjuaPkOWHuuOAguiiq+WvvOWFpeeahOmhtemdou+8jOWvvOWFpeiAheinhuS4uuWOn+S9nOiAheOAgicsXG5cdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRuYW1lOiAnZzZfcmF0aW9uYWxlJyxcblx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0bGFiZWw6ICfliKDpmaTljp/lm6DvvJonLFxuXHRcdFx0XHRzaXplOiA2MCxcblx0XHRcdH0sXG5cdFx0XHRoaWRlU3ViZ3JvdXBXaGVuU3lzb3A6IHRydWUsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogJ0c377ya5piO5pi+55qE5bm/5ZGK5a6j5LygJyxcblx0XHRcdHZhbHVlOiAnZzcnLFxuXHRcdFx0dG9vbHRpcDpcblx0XHRcdFx0J+W6lOeUqOS6juaYjuaYvueahOW5v+WRiuWuo+S8oO+8jOaIluWPquacieebuOWFs+S6uueJqeOAgee7hOe7h+etieS6i+eJqeiBlOezu+aWueazle+8iOWMheaLrOS9huS4jemZkOS6jueUteivneOAgeWcsOWdgOOAgeeUteWtkOmCrueuseOAgeWNs+aXtumAmuiur+i9r+S7tuiBlOezu+aWueW8j++8iOWmglFR5Y+344CB5b6u5L+h5Y+377yJ44CB56S+5Lqk5aqS5L2T6ZO+5o6l77yJ44CC6Iul5a6j5Lyg6K+t5rCU5LiN5piO5pi+77yM5bu66K6u6L2s5Lqk5Yig6Zmk6K6o6K6644CCJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzjvvJrmnKrliJfmmI7lj6/pnaDmnaXmupDkuJTor63osIPotJ/pnaLnmoTnlJ/ogIXkvKDorrAnLFxuXHRcdFx0dmFsdWU6ICdnOCcsXG5cdFx0XHR0b29sdGlwOiAn5pys5oOF5Ya15LiL5pyJ55qE6aG16Z2i5Lil6YeN5L6154qv5LuW5Lq65ZCN6KqJ5p2D77yM5pyJ5pe25Y+v6IO95L6154qv6ZqQ56eB5p2D77yM5Y+v6IO96ZyA6KaB5o+Q6K+355uR552j44CCJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRznvvJrlraTnq4vpobXpnaInLFxuXHRcdFx0dmFsdWU6ICdnOScsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5YyF5ous5Lul5LiL5Yeg56eN57G75Z6L77yaMS7msqHmnInlr7nlupTmlofku7bnmoTmlofku7bpobXpnaLvvJsyLuayoeacieWvueW6lOavjemhtemdoueahOWtkOmhtemdou+8iOeUqOaIt+mhteWtkOmhtemdoumZpOWklu+8ie+8mzMu5oyH5ZCR5LiN5a2Y5Zyo6aG16Z2i55qE6YeN5a6a5ZCR77ybNC7msqHmnInlr7nlupTlhoXlrrnpobXpnaLnmoTorqjorrrpobXvvIjorqjorrrpobXlrZjmoaPjgIHnlKjmiLforqjorrrpobXvvIzku6Xlj4rlnKjkuLvpobXpnaLmjILmnIl7e0NTRCBQbGFjZWhvbGRlcn195qih5p2/55qE6K6o6K666aG16Zmk5aSW77yJ77ybNS7kuI3lrZjlnKjms6jlhoznlKjmiLfnmoTnlKjmiLfpobXlj4rnlKjmiLfpobXlrZDpobXpnaLvvIjpmo/nlKjmiLfmm7TlkI3kuqfnlJ/nmoTnlKjmiLfpobXph43lrprlkJHpmaTlpJbvvInjgILor7flnKjliKDpmaTml7bms6jmhI/mnInml6DlsIblhoXlrrnnp7voh7Pku5blpITnmoTlv4XopoHjgIInLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuc3BlZWR5LnJlZGlyZWN0TGlzdCA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogJ1Ix77ya5LiN6IO95Y+R5oyl5a6e6ZmF5L2c55So55qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdHZhbHVlOiAncjEnLFxuXHRcdFx0dG9vbHRpcDpcblx0XHRcdFx0J+WMheaLrOS7peS4i+aDheWGte+8mjEu5oyH5ZCR5pys6Lqr5oiW5b6q546v55qE6YeN5a6a5ZCR77yM5aaCQeKGkkLihpJD4oaS4oCm4oCm4oaSQeaIlkHihpJB77yI57mB566A6YeN5a6a5ZCR5LiN6YCC55So5q2k6aG577yJ77ybMi7moLzlvI/plJnor6/nmoTph43lrprlkJHvvIzljIXmi6zmoIfpopjku4XkuLrnuYHkvZPjgIHnuYHnroDmt7fnlKjjgIHmtojmrafkuYnkvb/nlKjnmoTmi6zlvKfmiJbnqbrmoLzplJnor6/jgIHpl7TpmpTlj7fkvb/nlKjplJnor6/vvIjlm6DnsbvmjqjnroDljJblrZfmnKrmlLblvZXoh7PjgIrpgJrnlKjop4TojIPmsYnlrZfooajjgIvlr7zoh7TnmoTnuYHnroDmt7fmnYLmg4XlvaLvvIzmiJbns7vnu5/ml6Dms5Xoh6rliqjov5vooYznuYHnroDlpITnkIbnmoTmg4XlvaLvvIzliJnkuI3pgILnlKjvvInjgILoi6Xph43lrprlkJHpobXpnaLmoIfpopjvvIzkuI7lkIjkuY7lkb3lkI3luLjop4TnmoTnm67moIfpobXpnaLmoIfpopjkuYvpl7TvvIzku4XlrZjlnKjnuYHnroDlrZfkvZPnmoTljLrliKvvvIzogIzkuI3lrZjlnKjor43or63nlKjms5XljLrliKvvvIzliJnkuI3kv53nlZnor6Xph43lrprlkJHjgILlm6Dns7vnu5/ml6Dms5Xoh6rliqjnuYHnroDovazmjaLogIzlv4Xpobvkv53nlZnnmoTph43lrprlkJHpobXpnaLpmaTlpJbjgILlr7nkuo7lhbbku5bmnKrliJflh7rnmoTmg4XlhrXvvIzoi6XnlKjmiLforqTkuLror6Xph43lrprlkJHml6Dms5Xlj5HmjKXlrp7pmYXkvZznlKjvvIzkuJTkvp3mja7luLjor4bmsqHmnInku7vkvZXkuonorq7vvIzlj6/lh63lkIjnkIbnkIbnlLHmj5Dor7fpgJ/liKDvvIznlLHnrqHnkIblkZjliKTmlq3jgILmjIflkJHkuI3lrZjlnKjpobXpnaLnmoTph43lrprlkJHvvIzpgILnlKhHNeWHhuWImeOAgicsXG5cdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRuYW1lOiAncjFfdHlwZScsXG5cdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRsYWJlbDogJ+mAgueUqOexu+Wei++8micsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+ivt+mAieaLqScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+aMh+WQkeacrOi6q+aIluW+queOr+eahOmHjeWumuWQkScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+aMh+WQkeacrOi6q+aIluW+queOr+eahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+agh+mimOe5geeugOa3t+eUqCcsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+agh+mimOe5geeugOa3t+eUqOOAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+a2iOatp+S5ieS9v+eUqOeahOaLrOWPt+aIluepuuagvOmUmeivrycsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+a2iOatp+S5ieS9v+eUqOeahOaLrOWPt+aIluepuuagvOmUmeivr+OAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+mXtOmalOWPt+S9v+eUqOmUmeivrycsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+mXtOmalOWPt+S9v+eUqOmUmeivr+OAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+WFtuS7lueQhueUse+8iOivt+WLvumAieS4iuaWueKAnOW6lOeUqOWkmuS4queQhueUseKAne+8jOW5tuWhq+WGmeiHquWumuS5ieeQhueUse+8iScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogJ1Iy77ya5ZCN56ew5LiO5a+85ZCR55uu5qCH5Luj6KGo5LqL54mp5LiN5LiA6Ie05oiW5LiN5a6M5YWo5LiA6Ie055qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdHZhbHVlOiAncjInLFxuXHRcdFx0dG9vbHRpcDpcblx0XHRcdFx0J+WMheaLrOS9huS4jemZkOS6juS7peS4i+aDheWGte+8mjEu55Sx5Lu75L2V6Z2e5p2h55uu6aG16Z2i77yI6Zmk55So5oi36aG177yJ5a+85ZCR5p2h55uu6aG155qE6YeN5a6a5ZCR77yM5Lul5Y+K55Sx5p2h55uu6aG15a+85ZCR5Lu75L2V6Z2e5p2h55uu6aG16Z2i55qE6YeN5a6a5ZCR44CCMi7mmI7mmL7nrJTor6/nmoTph43lrprlkJHvvIzlpoLlh7rnjrDkuI3luLjop4HnmoTplJnliKvlrZfnrYnjgILvvIjliKvnp7Dph43lrprlkJHkuI3pgILnlKjmraTpobnjgILoi6XlkKvplJnliKvlrZfmiJbmnInnrJTor6/nmoTph43lrprlkJHkvb/nlKjpopHnjofpq5jvvIzmraTnsbvph43lrprlkJHmnInliqnkuo7luK7liqnnlKjmiLflr7vmib7liLDmraPnoa7nmoTpobXpnaLvvIzkuI3pgILnlKjmraTmoIflh4bjgILmnInkuonorq7nmoTmraTnsbvph43lrprlkJHlrpzmj5DkuqTliKDpmaTorqjorrrjgILvvIkzLuaYjuaYvuS4juWvvOWQkeebruagh+aJgOa2teeblueahOS4u+mimOaXoOWFs++8jOaIluavlOWvvOWQkeebruagh+aJgOa2teeblueahOS4u+mimOabtOW5v+azm+eahOmHjeWumuWQkeOAgu+8iOiLpeS4jeaYjuaYvu+8jOWPr+aUueS4uuaPkOS6pOWIoOmZpOiuqOiuuuOAgu+8iScsXG5cdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRuYW1lOiAncjJfdHlwZScsXG5cdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRsYWJlbDogJ+mAgueUqOexu+Wei++8micsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+ivt+mAieaLqScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+eUsemdnuadoeebrumhtemdou+8iOmZpOeUqOaIt+mhte+8ieWvvOWQkeadoeebrumhteeahOmHjeWumuWQkScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+eUsemdnuadoeebrumhtemdou+8iOmZpOeUqOaIt+mhte+8ieWvvOWQkeadoeebrumhteeahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+eUseadoeebrumhteWvvOWQkemdnuadoeebrumhtemdoueahOmHjeWumuWQkScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+eUseadoeebrumhteWvvOWQkeS7u+S9lemdnuadoeebrumhtemdoueahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+aYjuaYvueslOivr+eahOmHjeWumuWQkScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+aYjuaYvueslOivr+eahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+S4juWvvOWQkeebruagh+aXoOWFs+aIluavlOWFtuiMg+WbtOabtOW5v+azm+eahOmHjeWumuWQkScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ+S4juWvvOWQkeebruagh+aXoOWFs+aIluavlOWFtuiMg+WbtOabtOW5v+azm+eahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJ+WFtuS7lueQhueUse+8iOivt+WLvumAieS4iuaWueKAnOW6lOeUqOWkmuS4queQhueUseKAne+8jOW5tuWhq+WGmeiHquWumuS5ieeQhueUse+8iScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0sXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5zcGVlZHkubm9ybWFsaXplSGFzaCA9IHtcblx0XHRyZWFzb246ICdkYicsXG5cdFx0bXVsdGlwbGU6ICdtdWx0aXBsZScsXG5cdFx0J211bHRpcGxlLWZpbmlzaCc6ICdtdWx0aXBsZS1maW5pc2gnLFxuXHRcdGcxOiAnZzEnLFxuXHRcdGcyOiAnZzInLFxuXHRcdGczOiAnZzMnLFxuXHRcdGc0OiAnZzQnLFxuXHRcdGc1OiAnZzUnLFxuXHRcdGc2OiAnZzYnLFxuXHRcdGc3OiAnZzcnLFxuXHRcdGc4OiAnZzgnLFxuXHRcdGc5OiAnZzknLFxuXHRcdGExOiAnYTEnLFxuXHRcdGEyOiAnYTInLFxuXHRcdGEzOiAnYTMnLFxuXHRcdHIxOiAncjEnLFxuXHRcdHIyOiAncjInLFxuXHRcdGYxOiAnZjEnLFxuXHRcdGYyOiAnZjInLFxuXHRcdGYzOiAnZjMnLFxuXHRcdGY0OiAnZjQnLFxuXHRcdGY1OiAnZjUnLFxuXHRcdG8xOiAnbzEnLFxuXHRcdG8yOiAnbzInLFxuXHRcdG8zOiAnbzMnLFxuXHR9O1xuXHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MgPSB7XG5cdFx0Z2V0VGVtcGxhdGVDb2RlQW5kUGFyYW1zOiAocGFyYW1zKSA9PiB7XG5cdFx0XHRsZXQgY29kZTtcblx0XHRcdGxldCBwYXJhbWV0ZXJzO1xuXHRcdFx0bGV0IGk7XG5cdFx0XHRpZiAocGFyYW1zLm5vcm1hbGl6ZWRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0Y29kZSA9ICd7e2RlbGV0ZSc7XG5cdFx0XHRcdHBhcmFtcy51dHBhcmFtcyA9IHt9O1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtpbmRleCwgbm9ybV0gb2YgcGFyYW1zLm5vcm1hbGl6ZWRzLmVudHJpZXMoKSkge1xuXHRcdFx0XHRcdGlmIChub3JtICE9PSAnZGInKSB7XG5cdFx0XHRcdFx0XHRjb2RlICs9IGB8JHtub3JtLnRvVXBwZXJDYXNlKCl9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGFyYW1ldGVycyA9IHBhcmFtcy50ZW1wbGF0ZVBhcmFtc1tpbmRleF0gfHwgW107XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpXyBpbiBwYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHBhcmFtZXRlcnNbaV9dID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0XHRjb2RlICs9IGB8JHtwYXJhbWV0ZXJzW2lfXX1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXJhbXMudXRwYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHQuLi5wYXJhbXMudXRwYXJhbXMsXG5cdFx0XHRcdFx0XHQuLi5Ud2lua2xlLnNwZWVkeS5nZXRVc2VyVGFsa1BhcmFtZXRlcnMobm9ybSwgcGFyYW1ldGVycyksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb2RlICs9ICd9fSc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwYXJhbWV0ZXJzID0gcGFyYW1zLnRlbXBsYXRlUGFyYW1zWzBdIHx8IFtdO1xuXHRcdFx0XHRjb2RlID0gJ3t7ZGVsZXRlJztcblx0XHRcdFx0aWYgKHBhcmFtcy52YWx1ZXNbMF0gIT09ICdyZWFzb24nKSB7XG5cdFx0XHRcdFx0Y29kZSArPSBgfCR7cGFyYW1zLnZhbHVlc1swXX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoaSBpbiBwYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBwYXJhbWV0ZXJzW2ldID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0Y29kZSArPSBgfCR7cGFyYW1ldGVyc1tpXX1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRjb2RlICs9ICd9fSc7XG5cdFx0XHRcdHBhcmFtcy51dHBhcmFtcyA9IFR3aW5rbGUuc3BlZWR5LmdldFVzZXJUYWxrUGFyYW1ldGVycyhwYXJhbXMubm9ybWFsaXplZHNbMF0sIHBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFtjb2RlLCBwYXJhbXMudXRwYXJhbXNdO1xuXHRcdH0sXG5cdFx0cGFyc2VXaWtpdGV4dDogKHRpdGxlLCB3aWtpdGV4dCwgY2FsbGJhY2spID0+IHtcblx0XHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0XHRhY3Rpb246ICdwYXJzZScsXG5cdFx0XHRcdHByb3A6ICd0ZXh0Jyxcblx0XHRcdFx0cHN0OiAndHJ1ZScsXG5cdFx0XHRcdHRleHQ6IHdpa2l0ZXh0LFxuXHRcdFx0XHRjb250ZW50bW9kZWw6ICd3aWtpdGV4dCcsXG5cdFx0XHRcdHRpdGxlLFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHN0YXR1c0luZGljYXRvciA9IG5ldyBNb3JlYml0cy5zdGF0dXMod2luZG93LndnVUxTKCfmnoTpgKDliKDpmaTnkIbnlLEnLCAn5qeL6YCg5Yiq6Zmk55CG55SxJykpO1xuXHRcdFx0Y29uc3QgYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ino+aekOWIoOmZpOaooeadvycsICfop6PmnpDliKrpmaTmqKHmnb8nKSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdChhcGlPYmopID0+IHtcblx0XHRcdFx0XHRjb25zdCByZWFzb24gPSBkZWNvZGVVUklDb21wb25lbnQoXG5cdFx0XHRcdFx0XHQkKGFwaU9iai5nZXRYTUwoKS5xdWVyeVNlbGVjdG9yKCd0ZXh0JykuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUpXG5cdFx0XHRcdFx0XHRcdC5maW5kKCcjZGVsZXRlLXJlYXNvbicpXG5cdFx0XHRcdFx0XHRcdC50ZXh0KClcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL1xcKy9nLCAnICcpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAocmVhc29uKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXNJbmRpY2F0b3IuaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN0YXR1c0luZGljYXRvci53YXJuKHdpbmRvdy53Z1VMUygn5pyq6IO95LuO5Yig6Zmk5qih5p2/55Sf5oiQ5Yig6Zmk55CG55SxJywgJ+acquiDveW+nuWIqumZpOaooeadv+eUn+aIkOWIqumZpOeQhueUsScpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FsbGJhY2socmVhc29uKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0c3RhdHVzSW5kaWNhdG9yXG5cdFx0XHQpO1xuXHRcdFx0YXBpLnBvc3QoKTtcblx0XHR9LFxuXHRcdHN5c29wOiB7XG5cdFx0XHRtYWluOiAocGFyYW1zKSA9PiB7XG5cdFx0XHRcdGxldCByZWFzb247XG5cdFx0XHRcdGlmICghcGFyYW1zLm5vcm1hbGl6ZWRzLmxlbmd0aCAmJiBwYXJhbXMubm9ybWFsaXplZHNbMF0gPT09ICdkYicpIHtcblx0XHRcdFx0XHRyZWFzb24gPSBwcm9tcHQod2luZG93LndnVUxTKCfovpPlhaXliKDpmaTnkIbnlLHvvJonLCAn6Ly45YWl5Yiq6Zmk55CG55Sx77yaJyksICcnKTtcblx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3Muc3lzb3AuZGVsZXRlUGFnZShyZWFzb24sIHBhcmFtcyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgW2NvZGVdID0gVHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLmdldFRlbXBsYXRlQ29kZUFuZFBhcmFtcyhwYXJhbXMpO1xuXHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5wYXJzZVdpa2l0ZXh0KG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSwgY29kZSwgKGRlbGV0ZVJlYXNvbikgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5wcm9tcHRGb3JTdW1tYXJ5KSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZVJlYXNvbiA9IHByb21wdChcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn6L6T5YWl5Yig6Zmk55CG55Sx77yM5oiW5Y2V5Ye756Gu5a6a5Lul5o6l5Y+X6Ieq5Yqo55Sf5oiQ55qE77yaJyxcblx0XHRcdFx0XHRcdFx0XHRcdCfovLjlhaXliKrpmaTnkIbnlLHvvIzmiJbpu57mk4rnorrlrprku6XmjqXlj5foh6rli5XnlJ/miJDnmoTvvJonXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRkZWxldGVSZWFzb25cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5zeXNvcC5kZWxldGVQYWdlKGRlbGV0ZVJlYXNvbiwgcGFyYW1zKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGV0ZVBhZ2U6IChyZWFzb24sIHBhcmFtcykgPT4ge1xuXHRcdFx0XHRjb25zdCB0aGlzcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yig6Zmk6aG16Z2iJywgJ+WIqumZpOmggemdoicpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChyZWFzb24gPT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gTW9yZWJpdHMuc3RhdHVzLmVycm9yKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfor6Lpl67nkIbnlLEnLCAn6Kmi5ZWP55CG55SxJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nOOAgicsICfkvb/nlKjogIXlj5bmtojmk43kvZzjgIInKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIXJlYXNvbiB8fCAhcmVhc29uLnRyaW0oKSkge1xuXHRcdFx0XHRcdHJldHVybiBNb3JlYml0cy5zdGF0dXMuZXJyb3IoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivoumXrueQhueUsScsICfoqaLllY/nkIbnlLEnKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5L2g5LiN57uZ5oiR55CG55Sx4oCm5oiR5bCx4oCm5LiN566h5LqG4oCmJywgJ+S9oOS4jee1puaIkeeQhueUseKApuaIkeWwseKApuS4jeeuoeS6huKApicpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBkZWxldGVNYWluID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXNwYWdlLnNldEVkaXRTdW1tYXJ5KHJlYXNvbik7XG5cdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHRoaXNwYWdlLnNldFdhdGNobGlzdChwYXJhbXMud2F0Y2gpO1xuXHRcdFx0XHRcdHRoaXNwYWdlLmRlbGV0ZVBhZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpc3BhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLmluZm8oJ+WujOaIkCcpO1xuXHRcdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnN5c29wLmRlbGV0ZVRhbGsocGFyYW1zKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Ly8gbG9vayB1cCBpbml0aWFsIGNvbnRyaWJ1dG9yLiBJZiBwcm9tcHRpbmcgdXNlciBmb3IgZGVsZXRpb24gcmVhc29uLCBqdXN0IGRpc3BsYXkgYSBsaW5rLlxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugb3BlbiB0aGUgdGFsayBwYWdlIGRpcmVjdGx5XG5cdFx0XHRcdGlmIChwYXJhbXMub3BlblVzZXJUYWxrKSB7XG5cdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRcdFx0dGhpc3BhZ2UubG9va3VwQ3JlYXRpb24oKCkgPT4ge1xuXHRcdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnN5c29wLm9wZW5Vc2VyVGFsa1BhZ2UodGhpc3BhZ2UpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlTWFpbigpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRlbGV0ZU1haW4oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlbGV0ZVRhbGs6IChwYXJhbXMpID0+IHtcblx0XHRcdFx0Ly8gZGVsZXRlIHRhbGsgcGFnZVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cGFyYW1zLmRlbGV0ZVRhbGtQYWdlICYmXG5cdFx0XHRcdFx0cGFyYW1zLm5vcm1hbGl6ZWQgIT09ICdvMScgJiZcblx0XHRcdFx0XHQhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NhLXRhbGsnKS5jbGFzc0xpc3QuY29udGFpbnMoJ25ldycpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IHRhbGtwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdGAke1xuXHRcdFx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVttdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICsgMV1cblx0XHRcdFx0XHRcdH06JHttdy5jb25maWcuZ2V0KCd3Z1RpdGxlJyl9YCxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yig6Zmk6K6o6K666aG1JywgJ+WIqumZpOiojuirlumggScpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR0YWxrcGFnZS5zZXRFZGl0U3VtbWFyeShgW1tRVzpDU0QjRzl8RzldXTog5a2k56uL6aG16Z2i77ya5bey5Yig6Zmk6aG16Z2i4oCcJHtNb3JlYml0cy5wYWdlTmFtZU5vcm194oCd55qE6K6o6K666aG1YCk7XG5cdFx0XHRcdFx0dGFsa3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHRhbGtwYWdlLmRlbGV0ZVBhZ2UoKTtcblx0XHRcdFx0XHQvLyB0aGlzIGlzIHVnbHksIGJ1dCBiZWNhdXNlIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2Ygd2lraS5hcGksIGl0IGlzIG5lZWRlZFxuXHRcdFx0XHRcdC8vIChvdGhlcndpc2Ugc3VjY2Vzcy9mYWlsdXJlIG1lc3NhZ2VzIGZvciB0aGUgcHJldmlvdXMgYWN0aW9uIHdvdWxkIGJlIHN1cHByZXNzZWQpXG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3Muc3lzb3AuZGVsZXRlUmVkaXJlY3RzKHBhcmFtcyk7XG5cdFx0XHRcdFx0fSwgMTgwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnN5c29wLmRlbGV0ZVJlZGlyZWN0cyhwYXJhbXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZXRlUmVkaXJlY3RzOiAocGFyYW1zKSA9PiB7XG5cdFx0XHRcdC8vIGRlbGV0ZSByZWRpcmVjdHNcblx0XHRcdFx0aWYgKHBhcmFtcy5kZWxldGVSZWRpcmVjdHMpIHtcblx0XHRcdFx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRcdHRpdGxlczogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdFx0cHJvcDogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0XHRyZGxpbWl0OiA1MDAwLCAvLyA1MDAgaXMgbWF4IGZvciBub3JtYWwgdXNlcnMsIDUwMDAgZm9yIGJvdHMgYW5kIHN5c29wc1xuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRjb25zdCBxaXV3ZW5fYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfojrflj5bph43lrprlkJHliJfooajigKYnLCAn5Y+W5b6X6YeN5paw5bCO5ZCR5YiX6KGo4oCmJyksXG5cdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5zeXNvcC5kZWxldGVSZWRpcmVjdHNNYWluLFxuXHRcdFx0XHRcdFx0bmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+WIoOmZpOmHjeWumuWQkScsICfliKrpmaTph43mlrDlsI7lkJEnKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHFpdXdlbl9hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdFx0XHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHByb21wdCBmb3IgcHJvdGVjdCBvbiBHN1xuXHRcdFx0XHRsZXQgJGxpbms7XG5cdFx0XHRcdGxldCAkYmlndGV4dDtcblx0XHRcdFx0aWYgKHBhcmFtcy5ub3JtYWxpemVkID09PSAnZzcnKSB7XG5cdFx0XHRcdFx0JGxpbmsgPSAkKCc8YT4nKVxuXHRcdFx0XHRcdFx0LmF0dHIoJ2hyZWYnLCAnIycpXG5cdFx0XHRcdFx0XHQudGV4dCh3aW5kb3cud2dVTFMoJ+WNleWHu+i/memHjOaWveihjOS/neaKpCcsICfpu57mk4rpgJnoo6Hmlr3ooYzkv53orbcnKSlcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHQnZm9udC1zaXplJzogJzEyNSUnLFxuXHRcdFx0XHRcdFx0XHQnZm9udC13ZWlnaHQnOiAnYm9sZCcsXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0Lm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5kaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLnNldCgnd2dBcnRpY2xlSWQnLCAwKTtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrKCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQkYmlndGV4dCA9ICQoJzxzcGFuPicpXG5cdFx0XHRcdFx0XHQuY3NzKHtcblx0XHRcdFx0XHRcdFx0J2ZvbnQtc2l6ZSc6ICcxMjUlJyxcblx0XHRcdFx0XHRcdFx0J2ZvbnQtd2VpZ2h0JzogJ2JvbGQnLFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn55m957q45L+d5oqk6K+l6aG1JywgJ+eZvee0meS/neitt+ipsumggScpKTtcblx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbygkYmlndGV4dFswXSwgJGxpbmtbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHByb21vdGUgVW5saW5rIHRvb2xcblx0XHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDYpIHtcblx0XHRcdFx0XHQkbGluayA9ICQoJzxhPicpXG5cdFx0XHRcdFx0XHQuYXR0cignaHJlZicsICcjJylcblx0XHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn5Y2V5Ye76L+Z6YeM5YmN5b6A5Y+W5raI6ZO+5YWl5bel5YW3JywgJ+m7nuaTiumAmeijoeWJjeW+gOWPlua2iOmAo+WFpeW3peWFtycpKVxuXHRcdFx0XHRcdFx0LmNzcyh7XG5cdFx0XHRcdFx0XHRcdCdmb250LXdlaWdodCc6ICdib2xkJyxcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQub24oJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnVubGluay5jYWxsYmFjayhcblx0XHRcdFx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ+WPlua2iOWvueW3suWIoOmZpOaWh+S7tiAnLCAn5Y+W5raI5bCN5bey5Yiq6Zmk5qqU5qGIICcpICsgTW9yZWJpdHMucGFnZU5hbWVOb3JtfSDnmoTkvb/nlKhgXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQkYmlndGV4dCA9ICQoJzxzcGFuPicpXG5cdFx0XHRcdFx0XHQuY3NzKHtcblx0XHRcdFx0XHRcdFx0J2ZvbnQtd2VpZ2h0JzogJ2JvbGQnLFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn5Y+W5raI5a+55bey5Yig6Zmk5paH5Lu255qE5L2/55SoJywgJ+WPlua2iOWwjeW3suWIqumZpOaqlOahiOeahOS9v+eUqCcpKTtcblx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbygkYmlndGV4dFswXSwgJGxpbmtbMF0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCRsaW5rID0gJCgnPGE+Jylcblx0XHRcdFx0XHRcdC5hdHRyKCdocmVmJywgJyMnKVxuXHRcdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCfljZXlh7vov5nph4zliY3lvoDlj5bmtojpk77lhaXlt6XlhbcnLCAn6bue5pOK6YCZ6KOh5YmN5b6A5Y+W5raI6YCj5YWl5bel5YW3JykpXG5cdFx0XHRcdFx0XHQuY3NzKHtcblx0XHRcdFx0XHRcdFx0J2ZvbnQtd2VpZ2h0JzogJ2JvbGQnLFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5vbignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUudW5saW5rLmNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Y+W5raI5a+55bey5Yig6Zmk6aG16Z2iICcsICflj5bmtojlsI3lt7LliKrpmaTpoIHpnaIgJykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMucGFnZU5hbWVOb3JtICtcblx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOeahOmTvuaOpScsICcg55qE6YCj57WQJylcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdCRiaWd0ZXh0ID0gJCgnPHNwYW4+JykudGV4dCh3aW5kb3cud2dVTFMoJ+WPlua2iOWvueW3suWIoOmZpOmhtemdoueahOmTvuaOpScsICflj5bmtojlsI3lt7LliKrpmaTpoIHpnaLnmoTpgKPntZAnKSkuY3NzKHtcblx0XHRcdFx0XHRcdCdmb250LXdlaWdodCc6ICdib2xkJyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbygkYmlndGV4dFswXSwgJGxpbmtbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCRsaW5rID0gJCgnPGE+Jylcblx0XHRcdFx0XHQuYXR0cignaHJlZicsIG13LnV0aWwuZ2V0VXJsKCdTcGVjaWFsOlJhbmRvbUluQ2F0ZWdvcnkv5b+r6YCf5Yig6Zmk5YCZ6YCJJykpXG5cdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCfljZXlh7vliY3lvoDkuIvkuIDkuKrlv6vpgJ/liKDpmaTlgJnpgIknLCAn6bue5pOK5YmN5b6A5LiL5LiA5YCL5b+r6YCf5Yiq6Zmk5YCZ6YG4JykpO1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbygn5bel5YW3JywgJGxpbmtbMF0pO1xuXHRcdFx0fSxcblx0XHRcdG9wZW5Vc2VyVGFsa1BhZ2U6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRcdHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpLnVubGluaygpOyAvLyBkb24ndCBuZWVkIGl0IGFueW1vcmVcblx0XHRcdFx0Y29uc3QgdXNlciA9IHBhZ2VvYmouZ2V0Q3JlYXRvcigpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdlZGl0Jyxcblx0XHRcdFx0XHRwcmV2aWV3OiAneWVzJyxcblx0XHRcdFx0XHR2YW5hcnRpY2xlOiBNb3JlYml0cy5wYWdlTmFtZU5vcm0sXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IHRpdGxlID0gYFVzZXIgdGFsazoke3VzZXJ9YDtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHBhcmFtcy5ub3JtYWxpemVkID09PSAnZGInIHx8XG5cdFx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdwcm9tcHRGb3JTcGVlZHlEZWxldGlvblN1bW1hcnknKS5pbmNsdWRlcyhwYXJhbXMubm9ybWFsaXplZClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gcHJvdmlkZSBhIGxpbmsgdG8gdGhlIHVzZXIgdGFsayBwYWdlXG5cdFx0XHRcdFx0Y29uc3QgJGxpbmsgPSAkKCc8YT4nKVxuXHRcdFx0XHRcdFx0LmF0dHIoe1xuXHRcdFx0XHRcdFx0XHRocmVmOiBtdy51dGlsLmdldFVybCh0aXRsZSwgcXVlcnkpLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6ICdfYmxhbmsnLFxuXHRcdFx0XHRcdFx0XHRyZWw6ICdub29wZW5lciBub3JlZmVycmVyJyxcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY3NzKHtcblx0XHRcdFx0XHRcdFx0J2ZvbnQtc2l6ZSc6ICcxMjUlJyxcblx0XHRcdFx0XHRcdFx0J2ZvbnQtd2VpZ2h0JzogJ2JvbGQnLFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn54K55q2k5omT5byAVXNlciB0YWxrOicsICfpu57mraTmiZPplotVc2VyIHRhbGs6JykgKyB1c2VyKTtcblx0XHRcdFx0XHRjb25zdCAkYmlndGV4dCA9ICQoJzxzcGFuPicpXG5cdFx0XHRcdFx0XHQuY3NzKHtcblx0XHRcdFx0XHRcdFx0J2ZvbnQtc2l6ZSc6ICcxMjUlJyxcblx0XHRcdFx0XHRcdFx0J2ZvbnQtd2VpZ2h0JzogJ2JvbGQnLFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn6YCa55+l6aG16Z2i5Yib5bu66ICFJywgJ+mAmuefpemggemdouW7uueri+iAhScpKTtcblx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbygkYmlndGV4dFswXSwgJGxpbmtbMF0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIG9wZW4gdGhlIGluaXRpYWwgY29udHJpYnV0b3IncyB0YWxrIHBhZ2Vcblx0XHRcdFx0XHRjb25zdCBzdGF0dXNJbmRpY2F0b3IgPSBuZXcgTW9yZWJpdHMuc3RhdHVzKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmiZPlvIDnlKjmiLcnLCAn5omT6ZaL5L2/55So6ICFJykgK1xuXHRcdFx0XHRcdFx0XHR1c2VyICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfnmoTorqjorrrpobXnvJbovpHnqpflj6MnLCAn55qE6KiO6KuW6aCB57eo6Lyv6KaW56qXJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aJk+W8gOS4reKApicsICfmiZPplovkuK3igKYnKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0c3dpdGNoIChUd2lua2xlLmdldFByZWYoJ3VzZXJUYWxrUGFnZU1vZGUnKSkge1xuXHRcdFx0XHRcdFx0Y2FzZSAndGFiJzpcblx0XHRcdFx0XHRcdFx0d2luZG93Lm9wZW4obXcudXRpbC5nZXRVcmwodGl0bGUsIHF1ZXJ5KSwgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJyk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnYmxhbmsnOlxuXHRcdFx0XHRcdFx0XHR3aW5kb3cub3Blbihcblx0XHRcdFx0XHRcdFx0XHRtdy51dGlsLmdldFVybCh0aXRsZSwgcXVlcnkpLFxuXHRcdFx0XHRcdFx0XHRcdCdfYmxhbmsnLFxuXHRcdFx0XHRcdFx0XHRcdCdub29wZW5lcixub3JlZmVycmVyLGxvY2F0aW9uPW5vLHRvb2xiYXI9bm8sc3RhdHVzPW5vLGRpcmVjdG9yaWVzPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTEyMDAsaGVpZ2h0PTgwMCdcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHQvKiBjYXNlICd3aW5kb3cnOiAqL1xuXHRcdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0d2luZG93Lm9wZW4oXG5cdFx0XHRcdFx0XHRcdFx0bXcudXRpbC5nZXRVcmwodGl0bGUsIHF1ZXJ5KSxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubmFtZSA9PT0gJ3R3aW5rbGV3YXJud2luZG93JyA/ICdfYmxhbmsnIDogJ3R3aW5rbGV3YXJud2luZG93Jyxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubmFtZSA9PT0gJ3R3aW5rbGV3YXJud2luZG93J1xuXHRcdFx0XHRcdFx0XHRcdFx0PyAnbm9vcGVuZXIsbm9yZWZlcnJlciwnXG5cdFx0XHRcdFx0XHRcdFx0XHQ6ICcnICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnbG9jYXRpb249bm8sdG9vbGJhcj1ubyxzdGF0dXM9bm8sZGlyZWN0b3JpZXM9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MTIwMCxoZWlnaHQ9ODAwJ1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3RhdHVzSW5kaWNhdG9yLmluZm8oJ+WujOaIkCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZXRlUmVkaXJlY3RzTWFpbjogKGFwaW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCB4bWxEb2MgPSBhcGlvYmouZ2V0WE1MKCk7XG5cdFx0XHRcdGNvbnN0ICRzbmFwc2hvdCA9ICQoeG1sRG9jKS5maW5kKCdyZWRpcmVjdHMgcmQnKTtcblx0XHRcdFx0Y29uc3QgdG90YWwgPSAkc25hcHNob3QubGVuZ3RoO1xuXHRcdFx0XHRjb25zdCBzdGF0dXNJbmRpY2F0b3IgPSBhcGlvYmouc3RhdGVsZW07XG5cdFx0XHRcdGlmICghdG90YWwpIHtcblx0XHRcdFx0XHRzdGF0dXNJbmRpY2F0b3IuaW5mbyh3aW5kb3cud2dVTFMoJ+acquWPkeeOsOmHjeWumuWQkScsICfmnKrnmbznj77ph43mlrDlsI7lkJEnKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0YXR1c0luZGljYXRvci5zdGF0dXMoJzAlJyk7XG5cdFx0XHRcdGxldCBjdXJyZW50ID0gMDtcblx0XHRcdFx0Y29uc3Qgb25zdWNjZXNzID0gKGFwaW9iaklubmVyKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgbm93ID0gYCR7TnVtYmVyLnBhcnNlSW50KCgxMDAgKiArK2N1cnJlbnQpIC8gdG90YWwsIDEwKX0lYDtcblx0XHRcdFx0XHRzdGF0dXNJbmRpY2F0b3IudXBkYXRlKG5vdyk7XG5cdFx0XHRcdFx0YXBpb2JqSW5uZXIuc3RhdGVsZW0udW5saW5rKCk7XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnQgPj0gdG90YWwpIHtcblx0XHRcdFx0XHRcdHN0YXR1c0luZGljYXRvci5pbmZvKGAke25vd33vvIjlrozmiJDvvIlgKTtcblx0XHRcdFx0XHRcdE1vcmViaXRzLndpa2kucmVtb3ZlQ2hlY2twb2ludCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hZGRDaGVja3BvaW50KCk7XG5cdFx0XHRcdCRzbmFwc2hvdC5lYWNoKChfa2V5LCB2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHRpdGxlID0gJCh2YWx1ZSkuYXR0cigndGl0bGUnKTtcblx0XHRcdFx0XHRjb25zdCBwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdHRpdGxlLFxuXHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfliKDpmaTph43lrprlkJEgXCInLCAn5Yiq6Zmk6YeN5paw5bCO5ZCRIFwiJykgKyB0aXRsZX1cImBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHBhZ2Uuc2V0RWRpdFN1bW1hcnkoYFtbUVc6Q1NEI0c5fEc5XV06IOWtpOeri+mhtemdou+8mumHjeWumuWQkeWIsOW3suWIoOmZpOmhtemdouKAnCR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfeKAnWApO1xuXHRcdFx0XHRcdHBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHBhZ2UuZGVsZXRlUGFnZShvbnN1Y2Nlc3MpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0fSxcblx0XHR1c2VyOiB7XG5cdFx0XHRtYWluOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0XHRpZiAoIXBhZ2VvYmouZXhpc3RzKCkpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouS4jeWtmOWcqO+8jOWPr+iDveW3suiiq+WIoOmZpCcsICfpoIHpnaLkuI3lrZjlnKjvvIzlj6/og73lt7LooqvliKrpmaQnKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRzdGF0ZWxlbS5zdGF0dXMod2luZG93LndnVUxTKCfmo4Dmn6XpobXpnaLlt7LmnInmoIforrDigKYnLCAn5qqi5p+l6aCB6Z2i5bey5pyJ5qiZ6KiY4oCmJykpO1xuXHRcdFx0XHQvLyBjaGVjayBmb3IgZXhpc3RpbmcgZGVsZXRpb24gdGFnc1xuXHRcdFx0XHRjb25zdCB0ZXh0Tm9TZCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHQvXFx7XFx7XFxzKihkYigtXFx3Kik/fGR8ZGVsZXRlfGRlbGV0ZWJlY2F1c2V8c3BlZWR5fGNzZHzpgJ/liKp86YCf5YigfOW/q+WIoHzlv6vliKopXFxzKihcXHwoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pKik/XFx9XFx9XFxzKi9naSxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGV4dCAhPT0gdGV4dE5vU2QgJiZcblx0XHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+WcqOmhtemdouS4iuaJvuWIsOW/q+mAn+WIoOmZpOaooeadv++8jOimgeenu+mZpOW5tuWKoOWFpeaWsOeahOWQl++8nycsXG5cdFx0XHRcdFx0XHRcdCflnKjpoIHpnaLkuIrmib7liLDlv6vpgJ/liKrpmaTmqKHmnb/vvIzopoHnp7vpmaTkuKbliqDlhaXmlrDnmoTll47vvJ8nXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpOaooeadv+W3suiiq+e9ruS6jumhtemdouS4reOAgicsICflv6vpgJ/liKrpmaTmqKHmnb/lt7Looqvnva7mlrzpoIHpnaLkuK3jgIInKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHQgPSB0ZXh0Tm9TZDtcblx0XHRcdFx0Y29uc3QgY29weXZpbyA9IC8oPzpcXHtcXHtcXHMqKGNvcHl2aW985L615p2DfOS+teasiilbXnt9XSo/XFx9XFx9KS9pLmV4ZWModGV4dCk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRjb3B5dmlvICYmXG5cdFx0XHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCfokZfkvZzmnYPpqozor4HmqKHmnb/lt7Looqvnva7kuo7pobXpnaLkuK3vvIzmgqjmmK/lkKbku43mg7PliqDlhaXkuIDkuKrlv6vpgJ/liKDpmaTmqKHmnb/vvJ8nLFxuXHRcdFx0XHRcdFx0XHQn6JGX5L2c5qyK6amX6K2J5qih5p2/5bey6KKr572u5pa86aCB6Z2i5Lit77yM5oKo5piv5ZCm5LuN5oOz5Yqg5YWl5LiA5YCL5b+r6YCf5Yiq6Zmk5qih5p2/77yfJ1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfpobXpnaLkuK3lt7LmnInokZfkvZzmnYPpqozor4HmqKHmnb/jgIInLCAn6aCB6Z2i5Lit5bey5pyJ6JGX5L2c5qyK6amX6K2J5qih5p2/44CCJykpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB4ZmQgPSAvKD86XFx7XFx7KFtyc2FpZnRjbXZdZmR8bWQxfHByb3Bvc2VkIGRlbGV0aW9uKVtee31dKj9cXH1cXH0pL2kuZXhlYyh0ZXh0KTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHhmZCAmJlxuXHRcdFx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfliKDpmaTnm7jlhbPmqKHmnb97eycsICfliKrpmaTnm7jpl5zmqKHmnb97eycpICtcblx0XHRcdFx0XHRcdFx0eGZkWzFdICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCd9feW3suiiq+e9ruS6jumhtemdouS4re+8jOaCqOaYr+WQpuS7jeaDs+WKoOWFpeS4gOS4quW/q+mAn+WIoOmZpOaooeadv++8nycsXG5cdFx0XHRcdFx0XHRcdFx0J3195bey6KKr572u5pa86aCB6Z2i5Lit77yM5oKo5piv5ZCm5LuN5oOz5Yqg5YWl5LiA5YCL5b+r6YCf5Yiq6Zmk5qih5p2/77yfJ1xuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouW3suiiq+aPkOS6pOiHs+WtmOW6n+iuqOiuuuOAgicsICfpoIHpnaLlt7Looqvmj5DkuqToh7PlrZjlu6LoqI7oq5bjgIInKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGdpdmVuIHRoZSBwYXJhbXMsIGJ1aWxkcyB0aGUgdGVtcGxhdGUgYW5kIGFsc28gYWRkcyB0aGUgdXNlciB0YWxrIHBhZ2UgcGFyYW1ldGVycyB0byB0aGUgcGFyYW1zIHRoYXQgd2VyZSBwYXNzZWQgaW5cblx0XHRcdFx0Ly8gcmV0dXJucyA9PiBbPHN0cmluZz4gd2lraXRleHQsIDxvYmplY3Q+IHV0cGFyYW1zXVxuXHRcdFx0XHRjb25zdCBidWlsZERhdGEgPSBUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MuZ2V0VGVtcGxhdGVDb2RlQW5kUGFyYW1zKHBhcmFtcyk7XG5cdFx0XHRcdGxldCBbY29kZV0gPSBidWlsZERhdGE7XG5cdFx0XHRcdFssIHBhcmFtcy51dHBhcmFtc10gPSBidWlsZERhdGE7XG5cdFx0XHRcdGNvbnN0IHRoaXNwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykpO1xuXHRcdFx0XHQvLyBwYXRyb2wgdGhlIHBhZ2UsIGlmIHJlYWNoZWQgZnJvbSBTcGVjaWFsOk5ld1BhZ2VzXG5cdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ21hcmtTcGVlZHlQYWdlc0FzUGF0cm9sbGVkJykpIHtcblx0XHRcdFx0XHR0aGlzcGFnZS5wYXRyb2woKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBXcmFwIFNEIHRlbXBsYXRlIGluIG5vaW5jbHVkZSB0YWdzIGlmIHdlIGFyZSBpbiB0ZW1wbGF0ZSBzcGFjZS5cblx0XHRcdFx0Ly8gV29uJ3Qgd29yayB3aXRoIHVzZXJib3hlcyBpbiB1c2Vyc3BhY2UsIG9yIGFueSBvdGhlciB0cmFuc2NsdWRlZCBwYWdlIG91dHNpZGUgdGVtcGxhdGUgc3BhY2Vcblx0XHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDEwKSB7XG5cdFx0XHRcdFx0Ly8gVGVtcGxhdGU6XG5cdFx0XHRcdFx0Y29kZSA9IGA8bm9pbmNsdWRlPiR7Y29kZX08L25vaW5jbHVkZT5gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFJlbW92ZSB0YWdzIHRoYXQgYmVjb21lIHN1cGVyZmx1b3VzIHdpdGggdGhpcyBhY3Rpb25cblx0XHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHQvXFx7XFx7XFxzKihbTm5dZXcgdW5yZXZpZXdlZCBhcnRpY2xlfFtVdV1ucmV2aWV3ZWR8W1V1XXNlcnNwYWNlIGRyYWZ0KVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfVxccyovZyxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gNikge1xuXHRcdFx0XHRcdC8vIHJlbW92ZSBcIm1vdmUgdG8gQ29tbW9uc1wiIHRhZyAtIGRlbGV0aW9uLXRhZ2dlZCBmaWxlcyBjYW5ub3QgYmUgbW92ZWQgdG8gQ29tbW9uc1xuXHRcdFx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdFx0XHQvXFx7XFx7KG10Y3woY29weSB8bW92ZSApP3RvID8oc2hhcmV8Y29tbW9ucyl8bW92ZSB0byAocWl1d2VuIHNoYXJlfHdpa2ltZWRpYSBjb21tb25zKXxjb3B5IHRvIChxaXV3ZW4gc2hhcmV8d2lraW1lZGlhIGNvbW1vbnMpKVtefV0qXFx9XFx9L2dpLFxuXHRcdFx0XHRcdFx0Jydcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwYXJhbXMucmVxdWVzdHNhbHQpIHtcblx0XHRcdFx0XHRjb2RlID0gYHt7c2FsdH19XFxuJHtjb2RlfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gR2VuZXJhdGUgZWRpdCBzdW1tYXJ5IGZvciBlZGl0XG5cdFx0XHRcdGxldCBlZGl0c3VtbWFyeTtcblx0XHRcdFx0aWYgKHBhcmFtcy5ub3JtYWxpemVkcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0ZWRpdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+ivt+axguW/q+mAn+WIoOmZpO+8iCcsICfoq4vmsYLlv6vpgJ/liKrpmaTvvIgnKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG5vcm0gb2YgcGFyYW1zLm5vcm1hbGl6ZWRzKSB7XG5cdFx0XHRcdFx0XHRpZiAobm9ybSAhPT0gJ2RiJykge1xuXHRcdFx0XHRcdFx0XHRlZGl0c3VtbWFyeSArPSBgW1tRVzpDU0QjJHtub3JtLnRvVXBwZXJDYXNlKCl9fENTRCAke25vcm0udG9VcHBlckNhc2UoKX1dXeOAgWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVkaXRzdW1tYXJ5ID0gZWRpdHN1bW1hcnkuc2xpY2UoMCwgTWF0aC5tYXgoMCwgZWRpdHN1bW1hcnkubGVuZ3RoIC0gMSkpOyAvLyByZW1vdmUgdHJhaWxpbmcgY29tbWFcblx0XHRcdFx0XHRlZGl0c3VtbWFyeSArPSAn77yJJztcblx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMubm9ybWFsaXplZHNbMF0gPT09ICdkYicpIHtcblx0XHRcdFx0XHRlZGl0c3VtbWFyeSA9XG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivt+axgltbUVc6Q1NEfOW/q+mAn+WIoOmZpF1d77yaJywgJ+iri+axgltbUVc6Q1NEfOW/q+mAn+WIqumZpF1d77yaJykgK1xuXHRcdFx0XHRcdFx0cGFyYW1zLnRlbXBsYXRlUGFyYW1zWzBdWycxJ107XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWRpdHN1bW1hcnkgPSBgJHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6K+35rGC5b+r6YCf5Yig6ZmkJyxcblx0XHRcdFx0XHRcdCfoq4vmsYLlv6vpgJ/liKrpmaQnXG5cdFx0XHRcdFx0KX3vvIhbW1FXOkNTRCMke3BhcmFtcy5ub3JtYWxpemVkc1swXS50b1VwcGVyQ2FzZSgpfXxDU0QgJHtwYXJhbXMubm9ybWFsaXplZHNbMF0udG9VcHBlckNhc2UoKX1dXe+8iWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQmxhbmsgYXR0YWNrIHBhZ2VzXG5cdFx0XHRcdGlmIChwYXJhbXMuYmxhbmspIHtcblx0XHRcdFx0XHR0ZXh0ID0gY29kZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBJbnNlcnQgdGFnIGFmdGVyIHNob3J0IGRlc2NyaXB0aW9uIG9yIGFueSBoYXRub3Rlc1xuXHRcdFx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2l0ZXh0LnBhZ2UodGV4dCk7XG5cdFx0XHRcdFx0dGV4dCA9IHFpdXdlbl9wYWdlLmluc2VydEFmdGVyVGVtcGxhdGVzKGAke2NvZGV9XFxuYCwgVHdpbmtsZS5oYXRub3RlUmVnZXgpLmdldFRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KGVkaXRzdW1tYXJ5KTtcblx0XHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KHBhcmFtcy53YXRjaCk7XG5cdFx0XHRcdHBhZ2VvYmouc2F2ZShUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MudXNlci50YWdDb21wbGV0ZSk7XG5cdFx0XHR9LFxuXHRcdFx0dGFnQ29tcGxldGU6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdC8vIE5vdGlmaWNhdGlvbiB0byBmaXJzdCBjb250cmlidXRvclxuXHRcdFx0XHRpZiAocGFyYW1zLnVzZXJ0YWxrKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSAocGFnZU9iaikgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IGluaXRpYWxDb250cmliID0gcGFnZU9iai5nZXRDcmVhdG9yKCk7XG5cdFx0XHRcdFx0XHQvLyBkaXNhbGxvdyB3YXJuaW5nIHlvdXJzZWxmXG5cdFx0XHRcdFx0XHRpZiAoaW5pdGlhbENvbnRyaWIgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkge1xuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0XHRcdFx0XHRg5oKo77yIJHtpbml0aWFsQ29udHJpYn0ke3dpbmRvdy53Z1VMUygn77yJ5Yib5bu65LqG6K+l6aG177yM6Lez6L+H6YCa55+lJywgJ++8ieW7uueri+S6huipsumgge+8jOi3s+mBjumAmuefpScpfWBcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aW5pdGlhbENvbnRyaWIgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHQvLyBkb24ndCBub3RpZnkgdXNlcnMgd2hlbiB0aGVpciB1c2VyIHRhbGsgcGFnZSBpcyBub21pbmF0ZWRcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdGluaXRpYWxDb250cmliID09PSBtdy5jb25maWcuZ2V0KCd3Z1RpdGxlJykgJiZcblx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gM1xuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfpgJrnn6XpobXpnaLliJvlu7rogIXvvJrnlKjmiLfliJvlu7rkuoboh6rlt7HnmoTorqjorrrpobUnLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+mAmuefpemggemdouW7uueri+iAhe+8muS9v+eUqOiAheW7uueri+S6huiHquW3seeahOiojuirlumggSdcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGluaXRpYWxDb250cmliID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0Ly8gcXVpY2sgaGFjayB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB1bndhbnRlZCBub3RpZmljYXRpb25zLiBTaG91bGQgYWN0dWFsbHkgYmUgY29uZmlndXJhYmxlIG9uIHJlY2lwaWVudCBwYWdlLi4uXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGluaXRpYWxDb250cmliID09PSAnQTIwOTMwNjQtYm90JyAmJiBwYXJhbXMubm9ybWFsaXplZHNbMF0gPT09ICdnMTUnKSB7XG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfpgJrnn6XpobXpnaLliJvlu7rogIXvvJrnlLHmnLrlmajkurrliJvlu7rvvIzot7Pov4fpgJrnn6UnLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+mAmuefpemggemdouW7uueri+iAhe+8mueUseapn+WZqOS6uuW7uueri++8jOi3s+mBjumAmuefpSdcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGluaXRpYWxDb250cmliID0gbnVsbDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRhbGtQYWdlTmFtZSA9IGBVc2VyIHRhbGs6JHtpbml0aWFsQ29udHJpYn1gO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB1c2VydGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHRcdHRhbGtQYWdlTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ+mAmuefpemhtemdouWIm+W7uuiAhe+8iCcsICfpgJrnn6XpoIHpnaLlu7rnq4vogIXvvIgnKSArIGluaXRpYWxDb250cmlife+8iWBcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0bGV0IG5vdGlmeXRleHQ7XG5cdFx0XHRcdFx0XHRcdG5vdGlmeXRleHQgPSAnXFxue3snLmNvbmNhdCgnc3Vic3Q6JywgYGRiLW5vdGljZXx0YXJnZXQ9JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19YCk7XG5cdFx0XHRcdFx0XHRcdG5vdGlmeXRleHQgKz0gXCJ8bm93ZWxjb21lPXllcyd9fS0tfn5cIi5jb25jYXQoJ35+Jyk7XG5cdFx0XHRcdFx0XHRcdGxldCBlZGl0c3VtbWFyeSA9ICfpgJrnn6XvvJonO1xuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLm5vcm1hbGl6ZWRzLmluY2x1ZGVzKCdnMycpKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdHN1bW1hcnkgKz0gJ+S4gOaUu+WHu+aAp+mhtemdoic7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbm8gYXJ0aWNsZSBuYW1lIGluIHN1bW1hcnkgZm9yIEcxMCBkZWxldGlvbnNcblx0XHRcdFx0XHRcdFx0XHRlZGl0c3VtbWFyeSArPSBg6aG16Z2iW1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWRpdHN1bW1hcnkgKz0gJ+W/q+mAn+WIoOmZpOaPkOWQjSc7XG5cdFx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRBcHBlbmRUZXh0KG5vdGlmeXRleHQpO1xuXHRcdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0RWRpdFN1bW1hcnkoZWRpdHN1bW1hcnkpO1xuXHRcdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2UuYXBwZW5kKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBhZGQgdGhpcyBub21pbmF0aW9uIHRvIHRoZSB1c2VyJ3MgdXNlcnNwYWNlIGxvZywgaWYgdGhlIHVzZXIgaGFzIGVuYWJsZWQgaXRcblx0XHRcdFx0XHRcdGlmIChwYXJhbXMubG9nbm9taW5hdGlvbikge1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MudXNlci5hZGRUb0xvZyhwYXJhbXMsIGluaXRpYWxDb250cmliKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IHRoaXNwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShNb3JlYml0cy5wYWdlTmFtZU5vcm0pO1xuXHRcdFx0XHRcdHRoaXNwYWdlLmxvb2t1cENyZWF0aW9uKGNhbGxiYWNrKTtcblx0XHRcdFx0XHQvLyBvciwgaWYgbm90IG5vdGlmeWluZywgYWRkIHRoaXMgbm9taW5hdGlvbiB0byB0aGUgdXNlcidzIHVzZXJzcGFjZSBsb2cgd2l0aG91dCB0aGUgaW5pdGlhbCBjb250cmlidXRvcidzIG5hbWVcblx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMubG9nbm9taW5hdGlvbikge1xuXHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy51c2VyLmFkZFRvTG9nKHBhcmFtcywgbnVsbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBub3RlOiB0aGlzIGNvZGUgaXMgYWxzbyBpbnZva2VkIGZyb20gdHdpbmtsZWltYWdlXG5cdFx0XHQvLyB0aGUgcGFyYW1zIHVzZWQgYXJlOlxuXHRcdFx0Ly8gICBmb3IgQ1NEOiBwYXJhbXMudmFsdWVzLCBwYXJhbXMubm9ybWFsaXplZHMgIChub3RlOiBub3JtYWxpemVkcyBpcyBhbiBhcnJheSlcblx0XHRcdC8vICAgZm9yIERJOiBwYXJhbXMuZnJvbURJID0gdHJ1ZSwgcGFyYW1zLnRlbXBsYXRlbmFtZSwgcGFyYW1zLm5vcm1hbGl6ZWQgIChub3RlOiBub3JtYWxpemVkIGlzIGEgc3RyaW5nKVxuXHRcdFx0YWRkVG9Mb2c6IChwYXJhbXMsIGluaXRpYWxDb250cmliKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHVzbCA9IG5ldyBNb3JlYml0cy51c2Vyc3BhY2VMb2dnZXIoVHdpbmtsZS5nZXRQcmVmKCdzcGVlZHlMb2dQYWdlTmFtZScpKTtcblx0XHRcdFx0dXNsLmluaXRpYWxUZXh0ID0gYOi/meaYr+ivpeeUqOaIt+S9v+eUqFtbSDpUV3xUd2lua2xlXV3nmoTpgJ/liKDmqKHlnZflgZrlh7rnmoRbW1FXOkNTRHzlv6vpgJ/liKDpmaRdXeaPkOWQjeWIl+ihqOOAglxcblxcbuiLpeaCqOS4jeWGjeaDs+S/neeVmeatpOaXpeW/l++8jOivt+WcqFtbJHtUd2lua2xlLmdldFByZWYoXG5cdFx0XHRcdFx0J2NvbmZpZ1BhZ2UnXG5cdFx0XHRcdCl9fOWPguaVsOiuvue9rl1d5Lit5YWz5o6J77yM5bm25L2/55SoW1tRVzpDU0QjTzF8Q1NEIE8xXV3mj5DkuqTlv6vpgJ/liKDpmaTjgIIke1xuXHRcdFx0XHRcdE1vcmViaXRzLnVzZXJJc1N5c29wID8gJ1xcblxcbuatpOaXpeW/l+W5tuS4jeiusOW9leeUqFR3aW5rbGXnm7TmjqXmiafooYznmoTliKDpmaTjgIInIDogJydcblx0XHRcdFx0fWA7XG5cdFx0XHRcdGxldCBhcHBlbmRUZXh0ID0gYCMgW1s6JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV3vvJpgO1xuXHRcdFx0XHRpZiAocGFyYW1zLmZyb21ESSkge1xuXHRcdFx0XHRcdGFwcGVuZFRleHQgKz0gYOWbvueJiFtbUVc6Q1NEIyR7cGFyYW1zLm5vcm1hbGl6ZWQudG9VcHBlckNhc2UoKX18Q1NEICR7cGFyYW1zLm5vcm1hbGl6ZWQudG9VcHBlckNhc2UoKX1dXe+8iHt7dGx8JHtcblx0XHRcdFx0XHRcdHBhcmFtcy50ZW1wbGF0ZW5hbWVcblx0XHRcdFx0XHR9fX3vvIlgO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5ub3JtYWxpemVkcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0YXBwZW5kVGV4dCArPSAn5aSa5Liq55CG55Sx77yIJztcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG5vcm0gb2YgcGFyYW1zLm5vcm1hbGl6ZWRzKSB7XG5cdFx0XHRcdFx0XHRhcHBlbmRUZXh0ICs9IGBbW1FXOkNTRCMke25vcm0udG9VcHBlckNhc2UoKX18JHtub3JtLnRvVXBwZXJDYXNlKCl9XV3jgIFgO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhcHBlbmRUZXh0ID0gYXBwZW5kVGV4dC5zbGljZSgwLCBNYXRoLm1heCgwLCBhcHBlbmRUZXh0Lmxlbmd0aCAtIDEpKTsgLy8gcmVtb3ZlIHRyYWlsaW5nIGNvbW1hXG5cdFx0XHRcdFx0YXBwZW5kVGV4dCArPSAn77yJJztcblx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMubm9ybWFsaXplZHNbMF0gPT09ICdkYicpIHtcblx0XHRcdFx0XHRhcHBlbmRUZXh0ICs9ICfoh6rlrprkuYnnkIbnlLEnO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFwcGVuZFRleHQgKz0gYFtbUVc6Q1NEIyR7cGFyYW1zLm5vcm1hbGl6ZWRzWzBdLnRvVXBwZXJDYXNlKCl9fENTRCAke3BhcmFtcy5ub3JtYWxpemVkc1swXS50b1VwcGVyQ2FzZSgpfV1dYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocGFyYW1zLnJlcXVlc3RzYWx0KSB7XG5cdFx0XHRcdFx0YXBwZW5kVGV4dCArPSB3aW5kb3cud2dVTFMoJ++8m+ivt+axgueZvee6uOS/neaKpCcsICfvvJvoq4vmsYLnmb3ntJnkv53orbcnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaW5pdGlhbENvbnRyaWIpIHtcblx0XHRcdFx0XHRhcHBlbmRUZXh0ICs9IGDvvJvpgJrnn6V7e3VzZXJ8JHtpbml0aWFsQ29udHJpYn19fWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0YXBwZW5kVGV4dCArPSAnIH5+Jy5jb25jYXQoJ34nLCAnfn5cXG4nKTtcblx0XHRcdFx0dXNsLmNoYW5nZVRhZ3MgPSBUd2lua2xlLmNoYW5nZVRhZ3M7XG5cdFx0XHRcdHVzbC5sb2coXG5cdFx0XHRcdFx0YXBwZW5kVGV4dCxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+iusOW9leWvuVtbJywgJ+iomOmMhOWwjVtbJykgK1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMucGFnZU5hbWVOb3JtICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnXV3nmoTlv6vpgJ/liKDpmaTmj5DlkI0nLCAnXV3nmoTlv6vpgJ/liKrpmaTmj5DlkI0nKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSxcblx0XHR9LFxuXHR9O1xuXHQvLyB2YWxpZGF0ZSBzdWJncm91cHMgaW4gdGhlIGZvcm0gcGFzc2VkIGludG8gdGhlIHNwZWVkeSBkZWxldGlvbiB0YWdcblx0VHdpbmtsZS5zcGVlZHkuZ2V0UGFyYW1ldGVycyA9IChmb3JtLCB2YWx1ZXMpID0+IHtcblx0XHRsZXQgcGFyYW1ldGVycyA9IFtdO1xuXHRcdGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50UGFyYW1zID0gW107XG5cdFx0XHRsZXQgcmVkaW1hZ2U7XG5cdFx0XHRzd2l0Y2ggKHZhbHVlKSB7XG5cdFx0XHRcdGNhc2UgJ3JlYXNvbic6XG5cdFx0XHRcdFx0aWYgKGZvcm1bJ2NzZC5yZWFzb25fMSddKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYnJhdGlvbmFsZSA9IGZvcm1bJ2NzZC5yZWFzb25fMSddLnZhbHVlO1xuXHRcdFx0XHRcdFx0aWYgKCFkYnJhdGlvbmFsZSB8fCAhZGJyYXRpb25hbGUudHJpbSgpKSB7XG5cdFx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ55CG55Sx77ya6K+35oyH5a6a55CG55Sx44CCJywgJ+iHquiogueQhueUse+8muiri+aMh+WumueQhueUseOAgicpLCB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVzcGVlZHknLFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVycyA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGN1cnJlbnRQYXJhbXNbJzEnXSA9IGRicmF0aW9uYWxlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnYTInOlxuXHRcdFx0XHRcdGlmIChmb3JtWydjc2QuYTJfcGFnZW5hbWUnXSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3RoZXJwYWdlID0gZm9ybVsnY3NkLmEyX3BhZ2VuYW1lJ10udmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAoIW90aGVycGFnZSB8fCAhb3RoZXJwYWdlLnRyaW0oKSkge1xuXHRcdFx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeShcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ0NTRCBBMu+8muivt+aPkOS+m+eOsOacieadoeebrueahOWQjeensOOAgicsICdDU0QgQTLvvJroq4vmj5Dkvpvnj77mnInmop3nm67nmoTlkI3nqLHjgIInKSxcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3BlZWR5Jyxcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFyYW1zLnBhZ2VuYW1lID0gb3RoZXJwYWdlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZzQnOlxuXHRcdFx0XHRcdGlmIChmb3JtWydjc2QuZzRfcGFnZW5hbWUnXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFnZW5hbWUgPSBmb3JtWydjc2QuZzRfcGFnZW5hbWUnXS52YWx1ZTtcblx0XHRcdFx0XHRcdGlmICghcGFnZW5hbWUgfHwgIXBhZ2VuYW1lLnRyaW0oKSkge1xuXHRcdFx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ0NTRCBHNO+8muivt+aPkOS+m+mhtemdouWQjeensOOAgicsICdDU0QgRzTvvJroq4vmj5DkvpvpoIHpnaLlkI3nqLHjgIInKSwge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3BlZWR5Jyxcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFyYW1zLnBhZ2VuYW1lID0gcGFnZW5hbWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdmMic6XG5cdFx0XHRcdFx0aWYgKGZvcm1bJ2NzZC5mMl9maWxlbmFtZSddKSB7XG5cdFx0XHRcdFx0XHRyZWRpbWFnZSA9IGZvcm1bJ2NzZC5mMl9maWxlbmFtZSddLnZhbHVlO1xuXHRcdFx0XHRcdFx0aWYgKCFyZWRpbWFnZSB8fCAhcmVkaW1hZ2UudHJpbSgpKSB7XG5cdFx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnQ1NEIEYy77ya6K+35o+Q5L6b5Y+m5LiA5paH5Lu255qE5ZCN56ew44CCJywgJ0NTRCBGMu+8muiri+aPkOS+m+WPpuS4gOaqlOahiOeahOWQjeeoseOAgicpLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVzcGVlZHknLFxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVycyA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGN1cnJlbnRQYXJhbXMuZmlsZW5hbWUgPSByZWRpbWFnZS5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRuZXcgUmVnRXhwKGBeXFxcXHMqJHtNb3JlYml0cy5uYW1lc3BhY2VSZWdleCg2KX06YCwgJ2knKSxcblx0XHRcdFx0XHRcdFx0Jydcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyMSc6XG5cdFx0XHRcdFx0aWYgKGZvcm1bJ2NzZC5yMV90eXBlJ10pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlZGlydHlwZSA9IGZvcm1bJ2NzZC5yMV90eXBlJ10udmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAoIXJlZGlydHlwZSkge1xuXHRcdFx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ0NTRCBSMe+8muivt+mAieaLqemAgueUqOexu+Wei+OAgicsICdDU0QgUjHvvJroq4vpgbjmk4fpgannlKjpoZ7liKXjgIInKSwge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3BlZWR5Jyxcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFyYW1zWycxJ10gPSByZWRpcnR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyMic6XG5cdFx0XHRcdFx0aWYgKGZvcm1bJ2NzZC5yMl90eXBlJ10pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlZGlydHlwZSA9IGZvcm1bJ2NzZC5yMl90eXBlJ10udmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAoIXJlZGlydHlwZSkge1xuXHRcdFx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ0NTRCBSMu+8muivt+mAieaLqemAgueUqOexu+Wei+OAgicsICdDU0QgUjLvvJroq4vpgbjmk4fpgannlKjpoZ7liKXjgIInKSwge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3BlZWR5Jyxcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFyYW1zWycxJ10gPSByZWRpcnR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aF0gPSBjdXJyZW50UGFyYW1zO1xuXHRcdH1cblx0XHRyZXR1cm4gcGFyYW1ldGVycztcblx0fTtcblx0Ly8gRnVuY3Rpb24gZm9yIHByb2Nlc3NpbmcgdGFsayBwYWdlIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzXG5cdFR3aW5rbGUuc3BlZWR5LmdldFVzZXJUYWxrUGFyYW1ldGVycyA9IChub3JtYWxpemVkKSA9PiB7XG5cdFx0Y29uc3QgdXRwYXJhbXMgPSBbXTtcblx0XHRzd2l0Y2ggKG5vcm1hbGl6ZWQpIHtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRyZXR1cm4gdXRwYXJhbXM7XG5cdH07XG5cdFR3aW5rbGUuc3BlZWR5LnJlc29sdmVDc2RWYWx1ZXMgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlcyA9IChlLnRhcmdldC5mb3JtID8/IGUudGFyZ2V0KS5nZXRDaGVja2VkKCdjc2QnKTtcblx0XHRpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fpgInmi6nkuIDkuKrnkIbmja7vvIEnLCAn6KuL6YG45pOH5LiA5YCL55CG5pOa77yBJyksIHtcblx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHR0YWc6ICd0d2lua2xlc3BlZWR5Jyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH07XG5cdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLmV2YWx1YXRlU3lzb3AgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IGZvcm0gPSBlLnRhcmdldC5mb3JtID8/IGUudGFyZ2V0O1xuXHRcdGlmIChlLnRhcmdldC50eXBlID09PSAnY2hlY2tib3gnIHx8IGUudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyB8fCBlLnRhcmdldC50eXBlID09PSAnc2VsZWN0Jykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB7dGFnX29ubHl9ID0gZm9ybTtcblx0XHRpZiAodGFnX29ubHkgJiYgdGFnX29ubHkuY2hlY2tlZCkge1xuXHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2suZXZhbHVhdGVVc2VyKGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB2YWx1ZXMgPSBUd2lua2xlLnNwZWVkeS5yZXNvbHZlQ3NkVmFsdWVzKGUpO1xuXHRcdGlmICghdmFsdWVzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG5vcm1hbGl6ZWRzID0gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcblx0XHRcdHJldHVybiBUd2lua2xlLnNwZWVkeS5ub3JtYWxpemVIYXNoW3ZhbHVlXTtcblx0XHR9KTtcblx0XHQvLyBhbmFseXNlIGVhY2ggY3JpdGVyaW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHdhdGNoIHRoZSBwYWdlLCBwcm9tcHQgZm9yIHN1bW1hcnksIG9yIG9wZW4gdXNlciB0YWxrIHBhZ2Vcblx0XHRsZXQgd2F0Y2hQYWdlO1xuXHRcdGxldCBwcm9tcHRGb3JTdW1tYXJ5O1xuXHRcdGZvciAoY29uc3Qgbm9ybSBvZiBub3JtYWxpemVkcykge1xuXHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hTcGVlZHlQYWdlcycpLmluY2x1ZGVzKG5vcm0pKSB7XG5cdFx0XHRcdHdhdGNoUGFnZSA9IFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hTcGVlZHlFeHBpcnknKTtcblx0XHRcdH1cblx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ3Byb21wdEZvclNwZWVkeURlbGV0aW9uU3VtbWFyeScpLmluY2x1ZGVzKG5vcm0pKSB7XG5cdFx0XHRcdHByb21wdEZvclN1bW1hcnkgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHR2YWx1ZXMsXG5cdFx0XHRub3JtYWxpemVkcyxcblx0XHRcdHdhdGNoOiB3YXRjaFBhZ2UsXG5cdFx0XHRkZWxldGVUYWxrUGFnZTogZm9ybS50YWxrcGFnZSAmJiBmb3JtLnRhbGtwYWdlLmNoZWNrZWQsXG5cdFx0XHRkZWxldGVSZWRpcmVjdHM6IGZvcm0ucmVkaXJlY3RzLmNoZWNrZWQsXG5cdFx0XHRvcGVuVXNlclRhbGs6IGZvcm0ub3BlbnVzZXJ0YWxrLmNoZWNrZWQsXG5cdFx0XHRwcm9tcHRGb3JTdW1tYXJ5LFxuXHRcdFx0dGVtcGxhdGVQYXJhbXM6IFR3aW5rbGUuc3BlZWR5LmdldFBhcmFtZXRlcnMoZm9ybSwgdmFsdWVzKSxcblx0XHR9O1xuXHRcdGlmICghcGFyYW1zLnRlbXBsYXRlUGFyYW1zKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnN5c29wLm1haW4ocGFyYW1zKTtcblx0fTtcblx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2suZXZhbHVhdGVVc2VyID0gKGUpID0+IHtcblx0XHRjb25zdCBmb3JtID0gZS50YXJnZXQuZm9ybSA/PyBlLnRhcmdldDtcblx0XHRpZiAoZS50YXJnZXQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlLnRhcmdldC50eXBlID09PSAndGV4dCcgfHwgZS50YXJnZXQudHlwZSA9PT0gJ3NlbGVjdCcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdmFsdWVzID0gVHdpbmtsZS5zcGVlZHkucmVzb2x2ZUNzZFZhbHVlcyhlKTtcblx0XHRpZiAoIXZhbHVlcykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBjb25zdCBtdWx0aXBsZSA9IGZvcm0ubXVsdGlwbGUuY2hlY2tlZDtcblx0XHRjb25zdCBub3JtYWxpemVkcyA9IFtdO1xuXHRcdGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG5cdFx0XHRjb25zdCBub3JtID0gVHdpbmtsZS5zcGVlZHkubm9ybWFsaXplSGFzaFt2YWx1ZV07XG5cdFx0XHRub3JtYWxpemVkc1tub3JtYWxpemVkcy5sZW5ndGhdID0gbm9ybTtcblx0XHR9XG5cdFx0Ly8gYW5hbHlzZSBlYWNoIGNyaXRlcmlvbiB0byBkZXRlcm1pbmUgd2hldGhlciB0byB3YXRjaCB0aGUgcGFnZS9ub3RpZnkgdGhlIGNyZWF0b3Jcblx0XHRsZXQgd2F0Y2hQYWdlID0gZmFsc2U7XG5cdFx0Zm9yIChjb25zdCBub3JtIG9mIG5vcm1hbGl6ZWRzKSB7XG5cdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFNwZWVkeVBhZ2VzJykuaW5jbHVkZXMobm9ybSkpIHtcblx0XHRcdFx0d2F0Y2hQYWdlID0gVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFNwZWVkeUV4cGlyeScpO1xuXHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0Y29udGludWU7IC8vIGJyZWFrXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IG5vdGlmeXVzZXIgPSBmYWxzZTtcblx0XHRpZiAoZm9ybS5ub3RpZnkuY2hlY2tlZCkge1xuXHRcdFx0Zm9yIChjb25zdCBub3JtIG9mIG5vcm1hbGl6ZWRzKSB7XG5cdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ25vdGlmeVVzZXJPblNwZWVkeURlbGV0aW9uTm9taW5hdGlvbicpLmluY2x1ZGVzKG5vcm0pKSB7XG5cdFx0XHRcdFx0bm90aWZ5dXNlciA9IHRydWU7XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdFx0Y29udGludWU7IC8vIGJyZWFrXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY3NkbG9nID0gZmFsc2U7XG5cdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignbG9nU3BlZWR5Tm9taW5hdGlvbnMnKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub3JtIG9mIG5vcm1hbGl6ZWRzKSB7XG5cdFx0XHRcdGlmICghVHdpbmtsZS5nZXRQcmVmKCdub0xvZ09uU3BlZWR5Tm9taW5hdGlvbicpLmluY2x1ZGVzKG5vcm0pKSB7XG5cdFx0XHRcdFx0Y3NkbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0XHRjb250aW51ZTsgLy8gYnJlYWtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdHZhbHVlcyxcblx0XHRcdG5vcm1hbGl6ZWRzLFxuXHRcdFx0d2F0Y2g6IHdhdGNoUGFnZSxcblx0XHRcdHVzZXJ0YWxrOiBub3RpZnl1c2VyLFxuXHRcdFx0bG9nbm9taW5hdGlvbjogY3NkbG9nLFxuXHRcdFx0Ymxhbms6IGZvcm0uYmxhbmsuY2hlY2tlZCxcblx0XHRcdHJlcXVlc3RzYWx0OiBmb3JtLnNhbHRpbmcuY2hlY2tlZCxcblx0XHRcdHRlbXBsYXRlUGFyYW1zOiBUd2lua2xlLnNwZWVkeS5nZXRQYXJhbWV0ZXJzKGZvcm0sIHZhbHVlcyksXG5cdFx0fTtcblx0XHRpZiAoIXBhcmFtcy50ZW1wbGF0ZVBhcmFtcykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5qCH6K6w5a6M5oiQJywgJ+aomeiomOWujOaIkCcpO1xuXHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksIHdpbmRvdy53Z1VMUygn5qCH6K6w6aG16Z2iJywgJ+aomeiomOmggemdoicpKTtcblx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy51c2VyLm1haW4pO1xuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLnNwZWVkeSwgJ3NwZWVkeScpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGVjb3B5dmlvLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWNvcHl2aW8oKSB7XG5cdC8qKlxuXHQgKiB0d2lua2xlY29weXZpby5qczogQ29weXZpbyBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOlx0VGFiIChcIkNvcHl2aW9cIilcblx0ICogQWN0aXZlIG9uOiBFeGlzdGluZywgbm9uLXNwZWNpYWwgcGFnZXMsIGV4Y2VwdCBmb3IgZmlsZSBwYWdlc1xuXHQgKiB3aXRoIG5vIGxvY2FsIGZpbGUgd2hpY2ggYXJlIG5vdCByZWRpcmVjdHNcblx0ICogQ29uZmlnIGRpcmVjdGl2ZXMgaW46ICBUd2lua2xlQ29uZmlnXG5cdCAqL1xuXHRUd2lua2xlLmNvcHl2aW8gPSAoKSA9PiB7XG5cdFx0Ly8gRGlzYWJsZSBvbjpcblx0XHQvLyAqIHNwZWNpYWwgcGFnZXNcblx0XHQvLyAqIG5vbi1leGlzdGVudCBwYWdlc1xuXHRcdC8vICogbm9uLWxvY2FsIGZpbGVzLCB3aGV0aGVyIHRoZXJlIGlzIGEgbG9jYWwgcGFnZSBvciBub3QgKHVubmVlZGVkIGxvY2FsIHBhZ2VzIG9mIG5vbi1sb2NhbCBmaWxlcyBhcmUgZWxpZ2libGUgZm9yIENTRCBGMilcblx0XHQvLyAqIGZpbGUgcGFnZXMgd2l0aG91dCBhY3R1YWwgZmlsZXMgKHRoZXNlIGFyZSBlbGlnaWJsZSBmb3IgQ1NEIEc4KVxuXHRcdGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPCAwIHx8XG5cdFx0XHQhbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSB8fFxuXHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDYgJiZcblx0XHRcdFx0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1zaGFyZWR1cGxvYWQnKSB8fFxuXHRcdFx0XHRcdCghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWltYWdlcGFnZS1zZWN0aW9uLWZpbGVoaXN0b3J5JykgJiYgIU1vcmViaXRzLmlzUGFnZVJlZGlyZWN0KCkpKSlcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFR3aW5rbGUuY29weXZpby5jYWxsYmFjayxcblx0XHRcdHdpbmRvdy53Z1VMUygn5L615p2DJywgJ+S+teasiicpLFxuXHRcdFx0J3R3LWNvcHl2aW8nLFxuXHRcdFx0d2luZG93LndnVUxTKCfmj5DmiqXkvrXmnYPpobXpnaInLCAn5o+Q5aCx5L615qyK6aCB6Z2iJyksXG5cdFx0XHQnJ1xuXHRcdCk7XG5cdH07XG5cdFR3aW5rbGUuY29weXZpby5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgMzUwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmj5DmiqXkvrXmnYPpobXpnaInLCAn5o+Q5aCx5L615qyK6aCB6Z2iJykpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCfkvrXmnYPorr7nva4nLCAn5L615qyK6Kit5a6aJyksICdIOlRXL1BSRUYjY29weXZpbycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXL0RPQyNjb3B5dmlvJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS5jb3B5dmlvLmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAndGV4dGFyZWEnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L615p2D5p2l5rqQ77yaJywgJ+S+teasiuS+hua6kO+8micpLFxuXHRcdFx0bmFtZTogJ3NvdXJjZScsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQnQ1NEIEc0OiDmm77nu4/moLnmja7kvrXmnYPlrqHmoLjliKDpmaTlkI7lj4jph43mlrDliJvlu7rnmoTlhoXlrrknLFxuXHRcdFx0XHRcdFx0J0NTRCBHNDog5pu+57aT5qC55pOa5L615qyK5a+p5qC45Yiq6Zmk5b6M5Y+I6YeN5paw5bu656uL55qE5YWn5a65J1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dmFsdWU6ICdnNCcsXG5cdFx0XHRcdFx0bmFtZTogJ2c0Jyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WQjOaXtuS7pUc05YeG5YiZ5o+Q5oql5b+r6YCf5Yig6ZmkJywgJ+WQjOaZguS7pUc05rqW5YmH5o+Q5aCx5b+r6YCf5Yiq6ZmkJyksXG5cdFx0XHRcdFx0c3ViZ3JvdXA6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2c0X3BhZ2VuYW1lJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YmN5qyh5Yig6Zmk55qE6aG16Z2i5ZCN56ewJywgJ+WJjeasoeWIqumZpOeahOmggemdouWQjeeosScpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+mAieWhq++8jOiLpeWJjeasoeWIoOmZpOeahOmhtemdouWQjeensOS4jeWQjO+8jOivt+aPkOS+mycsXG5cdFx0XHRcdFx0XHRcdFx0J+mBuOWhq++8jOiLpeWJjeasoeWIqumZpOeahOmggemdouWQjeeoseS4jeWQjO+8jOiri+aPkOS+mydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAmuefpemhtemdouWIm+W7uuiAhScsICfpgJrnn6XpoIHpnaLlu7rnq4vogIUnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0bmFtZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOmhtemdouWIm+W7uuiAheiuqOiuuumhteS4iuaUvue9ruS4gOmAmuefpeaooeadv+OAgicsXG5cdFx0XHRcdFx0XHQn5Zyo6aCB6Z2i5bu656uL6ICF6KiO6KuW6aCB5LiK5pS+572u5LiA6YCa55+l5qih5p2/44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdH07XG5cdFR3aW5rbGUuY29weXZpby5jYWxsYmFja3MgPSB7XG5cdFx0dHJ5VGFnZ2luZzogKHBhZ2VvYmopID0+IHtcblx0XHRcdC8vIOWFiOWwneivleagh+iusOmhtemdou+8jOiLpeWPkeeOsOW3sue7j+agh+iusOWImeWBnOatouaPkOaKpVxuXHRcdFx0Y29uc3QgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGlmICh0ZXh0LmluY2x1ZGVzKCd7e0NvcHl2aW98JykpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmVycm9yKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6ZSZ6K+vJywgJ+mMr+iqpCcpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfpobXpnaLlt7Lnu4/moIforrDkvrXmnYPvvIzor7fkurrlt6Xnoa7orqTmmK/lkKblt7Lnu4/mj5DmiqXjgIInLFxuXHRcdFx0XHRcdFx0J+mggemdouW3sue2k+aomeiomOS+teasiu+8jOiri+S6uuW3peeiuuiqjeaYr+WQpuW3sue2k+aPkOWgseOAgidcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRUd2lua2xlLmNvcHl2aW8uY2FsbGJhY2tzLnRhZ2dpbmdBcnRpY2xlKHBhZ2VvYmopO1xuXHRcdFx0XHQvLyBDb250cmlidXRvciBzcGVjaWZpYyBlZGl0c1xuXHRcdFx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpKTtcblx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCkpO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5sb29rdXBDcmVhdGlvbihUd2lua2xlLmNvcHl2aW8uY2FsbGJhY2tzLm1haW4pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0bWFpbjogKHBhZ2VvYmopID0+IHtcblx0XHRcdC8vIHRoaXMgaXMgY29taW5nIGluIGZyb20gbG9va3VwQ3JlYXRpb24uLi4hXG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0Y29uc3QgaW5pdGlhbENvbnRyaWIgPSBwYWdlb2JqLmdldENyZWF0b3IoKTtcblx0XHRcdC8vIEFkZGluZyBkaXNjdXNzaW9uXG5cdFx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdHBhcmFtcy5sb2dwYWdlLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeS+teadg+iusOW9lemhuScsICfliqDlhaXkvrXmrIroqJjpjITpoIUnKVxuXHRcdFx0KTtcblx0XHRcdHFpdXdlbl9wYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUuY29weXZpby5jYWxsYmFja3MuY29weXZpb0xpc3QpO1xuXHRcdFx0Ly8gTm90aWZpY2F0aW9uIHRvIGZpcnN0IGNvbnRyaWJ1dG9yXG5cdFx0XHRpZiAocGFyYW1zLm5vdGlmeSkge1xuXHRcdFx0XHRjb25zdCB1c2VydGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdGBVc2VyIHRhbGs6JHtpbml0aWFsQ29udHJpYn1gLFxuXHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn6YCa55+l6aG16Z2i5Yib5bu66ICF77yIJywgJ+mAmuefpemggemdouW7uueri+iAhe+8iCcpICsgaW5pdGlhbENvbnRyaWJ977yJYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBub3RpZnl0ZXh0ID0gJ1xcbnt7Jy5jb25jYXQoJ3N1YnN0OicsIGBDb3B5dmlvTm90aWNlfCR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfX19YCk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRBcHBlbmRUZXh0KG5vdGlmeXRleHQpO1xuXHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfpgJrnn6XvvJrpobXpnaJbWycsICfpgJrnn6XvvJrpoIHpnaJbWycpICtcblx0XHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ11d55aR5Ly85L6154qv6JGX5L2c5p2DJywgJ11d55aR5Ly85L6154qv54mI5qyKJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ2NvcHl2aW9XYXRjaFVzZXInKSk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5hcHBlbmQoKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHRhZ2dpbmdBcnRpY2xlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGNvbnN0IHJldmlzaW9uSWQgPVxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSB8fCBtdy5jb25maWcuZ2V0KCd3Z0RpZmZOZXdJZCcpIHx8IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpO1xuXHRcdFx0bGV0IHRhZyA9ICd7eycuY29uY2F0KFxuXHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0YENvcHl2aW8vYXV0b3x1cmw9JHtwYXJhbXMuc291cmNlXG5cdFx0XHRcdFx0LnJlcGxhY2UoL2h0dHAvZywgJyYjMTA0O3R0cCcpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL1xcbisvZywgJ1xcbicpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL15cXHMqKFteKl0pL2dtLCAnKiAkMScpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL15cXCogJC9tLCAnJyl9fE9sZFJldmlzaW9uPSR7cmV2aXNpb25JZH19fWBcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0Y29uc3Qgb2xkY3NkID0gdGV4dC5tYXRjaCgvXFx7XFx7XFxzKihkYigtXFx3Kik/fGR8ZGVsZXRlKVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfS9pKTtcblx0XHRcdGlmIChcblx0XHRcdFx0b2xkY3NkICYmXG5cdFx0XHRcdGNvbmZpcm0oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOmhtemdouS4iuaJvuWIsOW/q+mAn+WIoOmZpOaooeadv++8jOimgeS/neeVmeWQl++8n1xcblxcbuW9k+mhtemdouWQjOaXtuS+teeKr+iRl+S9nOadg+WPiOespuWQiOW/q+mAn+WIoOmZpOagh+WHhuaXtu+8jOW6lOivpeS8mOWFiOi1sOW/q+mAn+WIoOmZpOeoi+W6j+OAglxcbuWNleWHu+KAnOehruiupOKAneS7peS/neeVmeW/q+mAn+WIoOmZpOaooeadv++8jOiLpeaCqOiupOS4uuW/q+mAn+WIoOmZpOeQhueUseS4jeWQiO+8jOWNleWHu+KAnOWPlua2iOKAneS7peenu+mZpOW/q+mAn+WIoOmZpOaooeadv+OAgicsXG5cdFx0XHRcdFx0XHQn5Zyo6aCB6Z2i5LiK5om+5Yiw5b+r6YCf5Yiq6Zmk5qih5p2/77yM6KaB5L+d55WZ5ZeO77yfXFxuXFxu55W26aCB6Z2i5ZCM5pmC5L6154qv54mI5qyK5Y+I56ym5ZCI5b+r6YCf5Yiq6Zmk5qiZ5rqW5pmC77yM5oeJ6Kmy5YSq5YWI6LWw5b+r6YCf5Yiq6Zmk56iL5bqP44CCXFxu6bue5pOK44CM56K66KqN44CN5Lul5L+d55WZ5b+r6YCf5Yiq6Zmk5qih5p2/77yM6Iul5oKo6KqN54K65b+r6YCf5Yiq6Zmk55CG55Sx5LiN5ZCI77yM6bue5pOK44CM5Y+W5raI44CN5Lul56e76Zmk5b+r6YCf5Yiq6Zmk5qih5p2/44CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRhZyA9IGAke29sZGNzZFswXX1cXG4ke3RhZ31gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy5nNCkge1xuXHRcdFx0XHRsZXQgc3BlZWR5VGFnID0gJ3t7ZGVsZXRlJztcblx0XHRcdFx0c3BlZWR5VGFnICs9ICd8ZzQnO1xuXHRcdFx0XHRpZiAocGFyYW1zLmc0X3BhZ2VuYW1lKSB7XG5cdFx0XHRcdFx0c3BlZWR5VGFnICs9IGB8JHtwYXJhbXMuZzRfcGFnZW5hbWV9fGMxPVtbU3BlY2lhbDpVbmRlbGV0ZS8ke3BhcmFtcy5nNF9wYWdlbmFtZX1dXWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3BlZWR5VGFnICs9IGB8YzE9W1tTcGVjaWFsOlVuZGVsZXRlLyR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfV1dYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRzcGVlZHlUYWcgKz0gJ319Jztcblx0XHRcdFx0dGFnID0gYCR7c3BlZWR5VGFnfVxcbiR7dGFnfWA7XG5cdFx0XHR9XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRhZyk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHdpbmRvdy53Z1VMUygn5q2k6aG16Z2i55aR5Ly85L6154qv6JGX5L2c5p2DJywgJ+atpOmggemdoueWkeS8vOS+teeKr+eJiOasiicpKTtcblx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCdjb3B5dmlvV2F0Y2hQYWdlJykpO1xuXHRcdFx0Ly8gcGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRwYWdlb2JqLnNhdmUoKTtcblx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ21hcmtDb3B5dmlvUGFnZXNBc1BhdHJvbGxlZCcpKSB7XG5cdFx0XHRcdHBhZ2VvYmoucGF0cm9sKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjb3B5dmlvTGlzdDogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRsZXQgb3V0cHV0ID0gJyc7XG5cdFx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdGNvbnN0IGRhdGVIZWFkZXJSZWdleCA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdGBePT0rXFxcXHMqJHtkYXRlLmdldFVUQ01vbnRoKCkgKyAxfeaciCR7ZGF0ZS5nZXRVVENEYXRlKCl95pelXFxcXHMqPT0rYCxcblx0XHRcdFx0J21nJ1xuXHRcdFx0KTtcblx0XHRcdGlmICghZGF0ZUhlYWRlclJlZ2V4LmV4ZWModGV4dCkpIHtcblx0XHRcdFx0b3V0cHV0ID0gYFxcblxcbj09JHtkYXRlLmdldFVUQ01vbnRoKCkgKyAxfeaciCR7ZGF0ZS5nZXRVVENEYXRlKCl95pelPT1gO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9ICdcXG57eycuY29uY2F0KCdzdWJzdDonLCBgQ29weXZpb1ZGRFJlY29yZHwke213LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKX19fWApO1xuXHRcdFx0cGFnZW9iai5zZXRBcHBlbmRUZXh0KG91dHB1dCk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KGDliqDlhaVbWyR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfV1dYCk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5hcHBlbmQoKTtcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLmNvcHl2aW8uY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZS50YXJnZXQpO1xuXHRcdGlmICghcGFyYW1zLnNvdXJjZS50cmltKCkpIHtcblx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6K+35oyH5a6a5L615p2D5p2l5rqQJywgJ+iri+aMh+WumuS+teasiuS+hua6kCcpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZWNvcHl2aW8nLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZS50YXJnZXQpO1xuXHRcdHBhcmFtcy5sb2dwYWdlID0gJ1FpdXdlbl90YWxrOuS+teadg+aPkOaKpSc7XG5cdFx0TW9yZWJpdHMud2lraS5hZGRDaGVja3BvaW50KCk7XG5cdFx0Ly8gVXBkYXRpbmcgZGF0YSBmb3IgdGhlIGFjdGlvbiBjb21wbGV0ZWQgZXZlbnRcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoXG5cdFx0XHQn5o+Q5oql5a6M5oiQ77yM5bCG5Zyo5Yeg56eS5YaF5Yi35paw6aG16Z2iJyxcblx0XHRcdCfmj5DloLHlrozmiJDvvIzlsIflnKjlub7np5Llhafph43mlrDmlbTnkIbpoIHpnaInXG5cdFx0KTtcblx0XHQvLyBUYWdnaW5nIGZpbGVcblx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeS+teadg+aooeadv+WIsOmhtemdoicsICfliqDlhaXkvrXmrIrmqKHmnb/liLDpoIHpnaInKVxuXHRcdCk7XG5cdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0cWl1d2VuX3BhZ2UubG9hZChUd2lua2xlLmNvcHl2aW8uY2FsbGJhY2tzLnRyeVRhZ2dpbmcpO1xuXHRcdE1vcmViaXRzLndpa2kucmVtb3ZlQ2hlY2twb2ludCgpO1xuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLmNvcHl2aW8sICdjb3B5dmlvJyk7XG59KSgpO1xuXG5leHBvcnQge307XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZXhmZC5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGV4ZmQoKSB7XG5cdC8qKlxuXHQgKiB0d2lua2xleGZkLmpzOiBYRkQgbW9kdWxlXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogVGFiIChcIlhGRFwiKVxuXHQgKiBBY3RpdmUgb246IEV4aXN0aW5nLCBub24tc3BlY2lhbCBwYWdlcyxcblx0ICogZXhjZXB0IGZvciBmaWxlIHBhZ2VzIHdpdGggbm8gbG9jYWwgZmlsZVxuXHQgKiB3aGljaCBhcmUgbm90IHJlZGlyZWN0c1xuXHQgKi9cblx0VHdpbmtsZS54ZmQgPSAoKSA9PiB7XG5cdFx0Ly8gRGlzYWJsZSBvbjpcblx0XHQvLyAqIHNwZWNpYWwgcGFnZXNcblx0XHQvLyAqIG5vbi1leGlzdGVudCBwYWdlc1xuXHRcdC8vICogbm9uLWxvY2FsIGZpbGVzLCB3aGV0aGVyIHRoZXJlIGlzIGEgbG9jYWwgcGFnZSBvciBub3QgKHVubmVlZGVkIGxvY2FsIHBhZ2VzIG9mIGZpbGVzIG9uIFNoYXJlIGFyZSBlbGlnaWJsZSBmb3IgQ1NEIEYyKVxuXHRcdC8vICogZmlsZSBwYWdlcyB3aXRob3V0IGFjdHVhbCBmaWxlc1xuXHRcdGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPCAwIHx8XG5cdFx0XHQhbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSB8fFxuXHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDYgJiZcblx0XHRcdFx0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1zaGFyZWR1cGxvYWQnKSB8fFxuXHRcdFx0XHRcdCghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWltYWdlcGFnZS1zZWN0aW9uLWZpbGVoaXN0b3J5JykgJiYgIU1vcmViaXRzLmlzUGFnZVJlZGlyZWN0KCkpKSlcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFR3aW5rbGUueGZkLmNhbGxiYWNrLFxuXHRcdFx0d2luZG93LndnVUxTKCfmj5DliKAnLCAn5o+Q5YiqJyksXG5cdFx0XHQndHcteGZkJyxcblx0XHRcdHdpbmRvdy53Z1VMUygn5o+Q5Lqk5Yig6Zmk6K6o6K66JywgJ+aPkOS6pOWIqumZpOiojuirlicpXG5cdFx0KTtcblx0fTtcblx0VHdpbmtsZS54ZmQuY3VycmVudFJhdGlvbmFsZSA9IG51bGw7XG5cdC8vIGVycm9yIGNhbGxiYWNrIG9uIE1vcmViaXRzLnN0YXR1cy5vYmplY3Rcblx0VHdpbmtsZS54ZmQucHJpbnRSYXRpb25hbGUgPSAoKSA9PiB7XG5cdFx0aWYgKFR3aW5rbGUueGZkLmN1cnJlbnRSYXRpb25hbGUpIHtcblx0XHRcdE1vcmViaXRzLnN0YXR1cy5wcmludFVzZXJUZXh0KFxuXHRcdFx0XHRUd2lua2xlLnhmZC5jdXJyZW50UmF0aW9uYWxlLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aCqOeahOeQhueUseW3suWcqOS4i+aWueaPkOS+m++8jOiLpeaCqOaDs+mHjeaWsOaPkOS6pO+8jOivt+WwhuWFtuWkjeWItuWIsOS4gOaWsOeql+WPo+S4re+8micsXG5cdFx0XHRcdFx0J+aCqOeahOeQhueUseW3suWcqOS4i+aWueaPkOS+m++8jOiLpeaCqOaDs+mHjeaWsOaPkOS6pO+8jOiri+Wwh+WFtuikh+ijveWIsOS4gOaWsOimlueql+S4re+8midcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdC8vIG9ubHkgbmVlZCB0byBwcmludCB0aGUgcmF0aW9uYWxlIG9uY2Vcblx0XHRcdFR3aW5rbGUueGZkLmN1cnJlbnRSYXRpb25hbGUgPSBudWxsO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS54ZmQuY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgV2luZG93ID0gbmV3IE1vcmViaXRzLnNpbXBsZVdpbmRvdyg2MDAsIDM1MCk7XG5cdFx0V2luZG93LnNldFRpdGxlKHdpbmRvdy53Z1VMUygn5o+Q5Lqk5a2Y5bqf6K6o6K66JywgJ+aPkOS6pOWtmOW7ouiojuirlicpKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5o+Q5Yig6K6+572uJywgJ+aPkOWIquioreWumicpLCAnSDpUVy9QUkVGI3hmZCcpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXL0RPQyN4ZmQnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLnhmZC5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Y29uc3QgY2F0ZWdvcmllcyA9IGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ2NhdGVnb3J5Jyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aPkOS6pOexu+Wei++8micsICfmj5DkuqTpoZ7liKXvvJonKSxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnhmZC5jYWxsYmFjay5jaGFuZ2VfY2F0ZWdvcnksXG5cdFx0fSk7XG5cdFx0Y2F0ZWdvcmllcy5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpobXpnaLlrZjlup/orqjorronLCAn6aCB6Z2i5a2Y5bui6KiO6KuWJyksXG5cdFx0XHRzZWxlY3RlZDogbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMCxcblx0XHRcdHZhbHVlOiAnYWZkJyxcblx0XHR9KTtcblx0XHRjYXRlZ29yaWVzLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aWh+S7tuWtmOW6n+iuqOiuuicsICfmqpTmoYjlrZjlu6LoqI7oq5YnKSxcblx0XHRcdHNlbGVjdGVkOiBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSA2LFxuXHRcdFx0dmFsdWU6ICdmZmQnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflpoLlj6/og73vvIzpgJrnn6XpobXpnaLliJvlu7rogIUnLCAn5aaC5Y+v6IO977yM6YCa55+l6aCB6Z2i5bu656uL6ICFJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdub3RpZnknLFxuXHRcdFx0XHRcdG5hbWU6ICdub3RpZnknLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflnKjpobXpnaLliJvlu7rogIXorqjorrrpobXkuIrmlL7nva7kuIDpgJrnn6XmqKHmnb/jgIInLFxuXHRcdFx0XHRcdFx0J+WcqOmggemdouW7uueri+iAheiojuirlumggeS4iuaUvue9ruS4gOmAmuefpeaooeadv+OAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogJ+W3peS9nOWMuicsXG5cdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0XHQvLyBXZSBtdXN0IGluaXQgdGhlIGNvbnRyb2xzXG5cdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0cmVzdWx0LmNhdGVnb3J5LmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0fTtcblx0VHdpbmtsZS54ZmQuY2FsbGJhY2suY2hhbmdlX2NhdGVnb3J5ID0gKGUpID0+IHtcblx0XHRjb25zdCB7dmFsdWV9ID0gZS50YXJnZXQ7XG5cdFx0Y29uc3Qge2Zvcm19ID0gZS50YXJnZXQ7XG5cdFx0Y29uc3QgW29sZF9hcmVhXSA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhlLnRhcmdldC5mb3JtLCAnd29ya19hcmVhJyk7XG5cdFx0bGV0IHdvcmtfYXJlYSA9IG51bGw7XG5cdFx0Y29uc3Qgb2xkcmVhc29udGV4dGJveCA9IGZvcm0ucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcblx0XHRsZXQgb2xkcmVhc29uID0gb2xkcmVhc29udGV4dGJveCA/IG9sZHJlYXNvbnRleHRib3gudmFsdWUgOiAnJztcblx0XHRjb25zdCBhcHBlbmRSZWFzb25Cb3ggPSAoeGZkX2NhdCkgPT4ge1xuXHRcdFx0c3dpdGNoICh4ZmRfY2F0KSB7XG5cdFx0XHRcdGNhc2UgJ2Z3ZGNzZCc6XG5cdFx0XHRcdFx0b2xkcmVhc29uID0gZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWxldGUtcmVhc29uJykudGV4dENvbnRlbnQpLnJlcGxhY2UoXG5cdFx0XHRcdFx0XHQvXFwrL2csXG5cdFx0XHRcdFx0XHQnICdcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdmYW1lJzpcblx0XHRcdFx0XHRvbGRyZWFzb24gPSBUd2lua2xlLmdldFByZWYoJ2FmZEZhbWVEZWZhdWx0UmVhc29uJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3N1YnN0dWInOlxuXHRcdFx0XHRcdG9sZHJlYXNvbiA9IFR3aW5rbGUuZ2V0UHJlZignYWZkU3Vic3R1YkRlZmF1bHRSZWFzb24nKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAndGV4dGFyZWEnLFxuXHRcdFx0XHRuYW1lOiAneGZkcmVhc29uJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5o+Q5Yig55CG55Sx77yaJywgJ+aPkOWIqueQhueUse+8micpLFxuXHRcdFx0XHR2YWx1ZTogb2xkcmVhc29uLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aCqOWPr+S7peS9v+eUqHdpa2l0ZXh077yMVHdpbmtsZeWwhuiHquWKqOS4uuaCqOWKoOWFpeetvuWQjeOAguiLpeaCqOS9v+eUqOaJuemHj+aPkOWIoOWKn+iDve+8jOWtmOW6n+iuqOiuuumhteWPquS8muS9v+eUqOesrOS4gOasoeaPkOS6pOeahOeQhueUse+8jOS9huS5i+WQjuaCqOS7jemcgOaPkOS+m+S7peeUqOS6juWIoOmZpOmAmuWRiuaooeadv+eahOWPguaVsOOAgicsXG5cdFx0XHRcdFx0J+aCqOWPr+S7peS9v+eUqHdpa2l0ZXh077yMVHdpbmtsZeWwh+iHquWLleeCuuaCqOWKoOWFpeewveWQjeOAguiLpeaCqOS9v+eUqOaJueasoeaPkOWIquWKn+iDve+8jOWtmOW7ouiojuirlumggeWPquacg+S9v+eUqOesrOS4gOasoeaPkOS6pOeahOeQhueUse+8jOS9huS5i+W+jOaCqOS7jemcgOaPkOS+m+S7peeUqOaWvOWIqumZpOmAmuWRiuaooeadv+eahOWPg+aVuOOAgidcblx0XHRcdFx0KSxcblx0XHRcdFx0cGxhY2Vob2xkZXI6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5q2k5YC85Lqm5pi+56S65LqO6aG16Z2i55qE5Yig6Zmk6YCa5ZGK5qih5p2/5YaF77yM5pWF5Yqh5b+F5o+Q5L6b5q2k5YC877yM6YG/5YWN5L2/55So4oCc5ZCM5LiK4oCd562J55So6K+t44CCJyxcblx0XHRcdFx0XHQn5q2k5YC85Lqm6aGv56S65pa86aCB6Z2i55qE5Yiq6Zmk6YCa5ZGK5qih5p2/5YWn77yM5pWF5YuZ5b+F5o+Q5L6b5q2k5YC877yM6YG/5YWN5L2/55So44CM5ZCM5LiK44CN562J55So6Kqe44CCJ1xuXHRcdFx0XHQpLFxuXHRcdFx0fSk7XG5cdFx0XHQvLyBUT0RPIHBvc3NpYmxlIGZ1dHVyZSBcInByZXZpZXdcIiBsaW5rIGhlcmVcblx0XHR9O1xuXG5cdFx0c3dpdGNoICh2YWx1ZSkge1xuXHRcdFx0Y2FzZSAnYWZkJzoge1xuXHRcdFx0XHR3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6aG16Z2i5a2Y5bqf6K6o6K66JywgJ+mggemdouWtmOW7ouiojuirlicpLFxuXHRcdFx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn5L2/55SoJmx0O25vaW5jbHVkZSZndDvljIXoo7nmqKHmnb8nLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ25vaW5jbHVkZScsXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdub2luY2x1ZGUnLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOlxuXHRcdFx0XHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDEwICYmXG5cdFx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlQ29udGVudE1vZGVsJykgIT09ICdTY3JpYnVudG8nLFxuXHRcdFx0XHRcdFx0XHQvLyBUZW1wbGF0ZSBuYW1lc3BhY2Vcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfkvb/lhbbkuI3kvJrlnKjooqvljIXlkKvml7blh7rnjrDjgIInLCAn5L2/5YW25LiN5pyD5Zyo6KKr5YyF5ZCr5pmC5Ye654++44CCJyksXG5cdFx0XHRcdFx0XHRcdGRpc2FibGVkOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VDb250ZW50TW9kZWwnKSA9PT0gJ1NjcmlidW50bycsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBhZmRfY2F0ZWdvcnkgPSB3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRuYW1lOiAneGZkY2F0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgInmi6nmj5DliKDnsbvlnovvvJonLCAn6YG45pOH5o+Q5Yiq6aGe5Yil77yaJyksXG5cdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUueGZkLmNhbGxiYWNrLmNoYW5nZV9hZmRfY2F0ZWdvcnksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRsZXQgYWZkX2NhdCA9ICdkZWxldGUnO1xuXHRcdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdhZmREZWZhdWx0Q2F0ZWdvcnknKSA9PT0gJ3NhbWUnKSB7XG5cdFx0XHRcdFx0aWYgKGxvY2FsU3RvcmFnZS5Ud2lua2xlX2FmZENhdGVnb3J5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGxvY2FsU3RvcmFnZS5Ud2lua2xlX2FmZENhdGVnb3J5ID0gJ2RlbGV0ZSc7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFmZF9jYXQgPSBsb2NhbFN0b3JhZ2UuVHdpbmtsZV9hZmRDYXRlZ29yeTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YWZkX2NhdGVnb3J5LmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yig6ZmkJywgJ+WIqumZpCcpLFxuXHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogYWZkX2NhdCA9PT0gJ2RlbGV0ZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhZmRfY2F0ZWdvcnkuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflkIjlubYnLCAn5ZCI5L21JyksXG5cdFx0XHRcdFx0dmFsdWU6ICdtZXJnZScsXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6IGFmZF9jYXQgPT09ICdtZXJnZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdGd2RDc2RUb1hmZCcpKSB7XG5cdFx0XHRcdFx0YWZkX2NhdGVnb3J5LmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+i9rOS6pOiHquW/q+mAn+WIoOmZpOWAmemAiScsICfovYnkuqToh6rlv6vpgJ/liKrpmaTlgJnpgbgnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnZndkY3NkJyxcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiBhZmRfY2F0ID09PSAnZndkY3NkJyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZmRfY2F0ZWdvcnkuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmibnph4/lhbPms6jluqbmj5DliKAnLCAn5om55qyh6Zec5rOo5bqm5o+Q5YiqJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdmYW1lJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogYWZkX2NhdCA9PT0gJ2ZhbWUnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YWZkX2NhdGVnb3J5LmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5om56YeP5bCP5bCP5L2c5ZOB5o+Q5YigJywgJ+aJueasoeWwj+Wwj+S9nOWTgeaPkOWIqicpLFxuXHRcdFx0XHRcdHZhbHVlOiAnc3Vic3R1YicsXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6IGFmZF9jYXQgPT09ICdzdWJzdHViJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFmZF9jYXRlZ29yeS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aJuemHj+WFtuS7luaPkOWIoCcsICfmibnmrKHlhbbku5bmj5DliKonKSxcblx0XHRcdFx0XHR2YWx1ZTogJ2JhdGNoJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogYWZkX2NhdCA9PT0gJ2JhdGNoJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ21lcmdlaW50bycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5ZCI5bm25Yiw77yaJywgJ+WQiOS9teWIsO+8micpLFxuXHRcdFx0XHRcdGhpZGRlbjogdHJ1ZSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFwcGVuZFJlYXNvbkJveChhZmRfY2F0KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRuYW1lOiAnZndkY3NkcmVhc29uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfovazkuqTnkIbnlLHvvJonLCAn6L2J5Lqk55CG55Sx77yaJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aCqOWPr+S7peS9v+eUqHdpa2l0ZXh077yMVHdpbmtsZeWwhuiHquWKqOS4uuaCqOWKoOWFpeetvuWQjeOAgicsXG5cdFx0XHRcdFx0XHQn5oKo5Y+v5Lul5L2/55Sod2lraXRleHTvvIxUd2lua2xl5bCH6Ieq5YuV54K65oKo5Yqg5YWl57C95ZCN44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0aGlkZGVuOiB0cnVlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhID0gd29ya19hcmVhLnJlbmRlcigpO1xuXHRcdFx0XHRvbGRfYXJlYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3b3JrX2FyZWEsIG9sZF9hcmVhKTtcblx0XHRcdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0XHRcdGV2dC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdFx0XHRmb3JtLnhmZGNhdC5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnZmZkJzpcblx0XHRcdFx0d29ya19hcmVhID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aWh+S7tuWtmOW6n+iuqOiuuicsICfmqpTmoYjlrZjlu6LoqI7oq5YnKSxcblx0XHRcdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFwcGVuZFJlYXNvbkJveCgnZmZkJyk7XG5cdFx0XHRcdHdvcmtfYXJlYSA9IHdvcmtfYXJlYS5yZW5kZXIoKTtcblx0XHRcdFx0b2xkX2FyZWEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod29ya19hcmVhLCBvbGRfYXJlYSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0d29ya19hcmVhID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+acquWumuS5iScsICfmnKrlrprnvqknKSxcblx0XHRcdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYSA9IHdvcmtfYXJlYS5yZW5kZXIoKTtcblx0XHRcdFx0b2xkX2FyZWEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod29ya19hcmVhLCBvbGRfYXJlYSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvLyBSZXR1cm4gdG8gY2hlY2tlZCBzdGF0ZSB3aGVuIHN3aXRjaGluZ1xuXHRcdGZvcm0ubm90aWZ5LmNoZWNrZWQgPSB0cnVlO1xuXHRcdGZvcm0ubm90aWZ5LmRpc2FibGVkID0gZmFsc2U7XG5cdH07XG5cdFR3aW5rbGUueGZkLmNhbGxiYWNrLmNoYW5nZV9hZmRfY2F0ZWdvcnkgPSAoZSkgPT4ge1xuXHRcdHN3aXRjaCAoZS50YXJnZXQudmFsdWUpIHtcblx0XHRcdGNhc2UgJ21lcmdlJzpcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5tZXJnZWludG8ucGFyZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLmZ3ZGNzZHJlYXNvbi5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1lcmdlaW50by5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlubmVySFRNTCA9IHdpbmRvdy53Z1VMUygn5ZCI5bm25Yiw77yaJywgJ+WQiOS9teWIsO+8micpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2Z3ZGNzZCc6XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubWVyZ2VpbnRvLnBhcmVudEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5md2Rjc2RyZWFzb24ucGFyZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1lcmdlaW50by5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlubmVySFRNTCA9ICfmj5DkuqTkurrvvJonO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLnhmZHJlYXNvbi52YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChcblx0XHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVsZXRlLXJlYXNvbicpLnRleHRDb250ZW50XG5cdFx0XHRcdCkucmVwbGFjZSgvXFwrL2csICcgJyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZmFtZSc6XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubWVyZ2VpbnRvLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uZndkY3NkcmVhc29uLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ueGZkcmVhc29uLnZhbHVlID0gVHdpbmtsZS5nZXRQcmVmKCdhZmRGYW1lRGVmYXVsdFJlYXNvbicpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3N1YnN0dWInOlxuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1lcmdlaW50by5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLmZ3ZGNzZHJlYXNvbi5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLnhmZHJlYXNvbi52YWx1ZSA9IFR3aW5rbGUuZ2V0UHJlZignYWZkU3Vic3R1YkRlZmF1bHRSZWFzb24nKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1lcmdlaW50by5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLmZ3ZGNzZHJlYXNvbi5wYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpO1xuXHRcdH1cblx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdhZmREZWZhdWx0Q2F0ZWdvcnknKSA9PT0gJ3NhbWUnKSB7XG5cdFx0XHRsb2NhbFN0b3JhZ2UuVHdpbmtsZV9hZmRDYXRlZ29yeSA9IGUudGFyZ2V0LnZhbHVlO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS54ZmQuY2FsbGJhY2tzID0ge1xuXHRcdGFmZDoge1xuXHRcdFx0bWFpbjogKHRhZ2dpbmdfcGFnZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSB0YWdnaW5nX3BhZ2UuZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdFR3aW5rbGUueGZkLmNhbGxiYWNrcy5hZmQudGFnZ2luZ0FydGljbGUodGFnZ2luZ19wYWdlKTtcblx0XHRcdFx0Ly8gQWRkaW5nIGRpc2N1c3Npb25cblx0XHRcdFx0Y29uc3QgZGlzY3Vzc2lvbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRwYXJhbXMubG9ncGFnZSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeiuqOiuuuWIsOW9k+aXpeWIl+ihqCcsICfliqDlhaXoqI7oq5bliLDnlbbml6XliJfooagnKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRkaXNjdXNzaW9uX3BhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSk7XG5cdFx0XHRcdGRpc2N1c3Npb25fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0ZGlzY3Vzc2lvbl9wYWdlLmxvYWQoVHdpbmtsZS54ZmQuY2FsbGJhY2tzLmFmZC50b2RheXNMaXN0KTtcblx0XHRcdFx0Ly8gTm90aWZpY2F0aW9uIHRvIGZpcnN0IGNvbnRyaWJ1dG9yXG5cdFx0XHRcdGlmIChwYXJhbXMubm90aWZ5KSB7XG5cdFx0XHRcdFx0Ly8gRGlzYWxsb3cgd2FybmluZyB5b3Vyc2VsZlxuXHRcdFx0XHRcdGlmIChwYXJhbXMuY3JlYXRvciA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSB7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfpgJrnn6XpobXpnaLliJvlu7rogIXvvIgnLCAn6YCa55+l6aCB6Z2i5bu656uL6ICF77yIJykgKyBwYXJhbXMuY3JlYXRvcn3vvIlgLFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aCqOWIm+W7uuS6huivpemhte+8jOi3s+i/h+mAmuefpScsICfmgqjlu7rnq4vkuoboqbLpoIHvvIzot7PpgY7pgJrnn6UnKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHBhcmFtcy5jcmVhdG9yID0gbnVsbDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFsa1BhZ2VOYW1lID0gYFVzZXIgdGFsazoke3BhcmFtcy5jcmVhdG9yfWA7XG5cdFx0XHRcdFx0XHRjb25zdCB1c2VydGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHR0YWxrUGFnZU5hbWUsXG5cdFx0XHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn6YCa55+l6aG16Z2i5Yib5bu66ICF77yIJywgJ+mAmuefpemggemdouW7uueri+iAhe+8iCcpICsgcGFyYW1zLmNyZWF0b3J977yJYFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGNvbnN0IG5vdGlmeXRleHQgPSAnXFxue3snXG5cdFx0XHRcdFx0XHRcdC5jb25jYXQoJ3N1YnN0OicpXG5cdFx0XHRcdFx0XHRcdC5jb25jYXQoYEFGRE5vdGV8JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19fX0tLX5+YCwgJ35+Jyk7XG5cdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0QXBwZW5kVGV4dChub3RpZnl0ZXh0KTtcblx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRFZGl0U3VtbWFyeShg6YCa55+l77ya6aG16Z2iW1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXeWtmOW6n+iuqOiuuuaPkOWQjWApO1xuXHRcdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZigneGZkV2F0Y2hVc2VyJykpO1xuXHRcdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5hcHBlbmQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gYWRkIHRoaXMgbm9taW5hdGlvbiB0byB0aGUgdXNlcidzIHVzZXJzcGFjZSBsb2csIGlmIHRoZSB1c2VyIGhhcyBlbmFibGVkIGl0XG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5sb2dub21pbmF0aW9uKSB7XG5cdFx0XHRcdFx0XHRUd2lua2xlLnhmZC5jYWxsYmFja3MuYWRkVG9Mb2cocGFyYW1zLCBwYXJhbXMuY3JlYXRvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIG9yLCBpZiBub3Qgbm90aWZ5aW5nLCBhZGQgdGhpcyBub21pbmF0aW9uIHRvIHRoZSB1c2VyJ3MgdXNlcnNwYWNlIGxvZyB3aXRob3V0IHRoZSBpbml0aWFsIGNvbnRyaWJ1dG9yJ3MgbmFtZVxuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5sb2dub21pbmF0aW9uKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS54ZmQuY2FsbGJhY2tzLmFkZFRvTG9nKHBhcmFtcywgbnVsbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR0YWdnaW5nQXJ0aWNsZTogKHBhZ2VvYmopID0+IHtcblx0XHRcdFx0bGV0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdGxldCB0YWcgPSBge3t2ZmR8JHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uVGV4dChwYXJhbXMueGZkcmVhc29uKX1gO1xuXHRcdFx0XHRpZiAoTW9yZWJpdHMuaXNQYWdlUmVkaXJlY3QoKSkge1xuXHRcdFx0XHRcdHRhZyArPSAnfHInO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZyArPSAnfGRhdGU9e3snLmNvbmNhdCgnc3Vic3Q6JywgJyN0aW1lOlkvbS9kfX19fScpO1xuXHRcdFx0XHRpZiAocGFyYW1zLm5vaW5jbHVkZSkge1xuXHRcdFx0XHRcdHRhZyA9IGA8bm9pbmNsdWRlPiR7dGFnfTwvbm9pbmNsdWRlPmA7XG5cdFx0XHRcdFx0Ly8g5Y+q5pyJ6KGo5qC86ZyA6KaB5Y2V54us5Yqg5Zue6L2m77yM5YW25LuW5oOF5Ya15Yqg5Zue6L2m5Lya56C05Z2P5qih5p2/44CCXG5cdFx0XHRcdFx0aWYgKHRleHQuaW5kZXhPZigne3wnKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0dGFnICs9ICdcXG4nO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YWcgKz0gJ1xcbic7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gVGhlbiwgdGVzdCBpZiB0aGVyZSBhcmUgc3BlZWR5IGRlbGV0aW9uLXJlbGF0ZWQgdGVtcGxhdGVzIG9uIHRoZSBhcnRpY2xlLlxuXHRcdFx0XHRjb25zdCB0ZXh0Tm9TZCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHQvXFx7XFx7XFxzKihkYigtXFx3Kik/fGR8ZGVsZXRlfCg/Omhhbmd8aG9sZClbLSBdP29uKVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfVxccyovZ2ksXG5cdFx0XHRcdFx0Jydcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRleHQgIT09IHRleHROb1NkICYmXG5cdFx0XHRcdFx0Y29uZmlybShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Zyo6aG16Z2i5LiK5om+5Yiw5b+r6YCf5Yig6Zmk5qih5p2/77yM6KaB56e76Zmk5ZCX77yfJywgJ+WcqOmggemdouS4iuaJvuWIsOW/q+mAn+WIqumZpOaooeadv++8jOimgeenu+mZpOWXju+8nycpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0ZXh0ID0gdGV4dE5vU2Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdGV4dE5vTm90TWFuZGFyaW4gPSB0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdFx0L1xce1xce1xccyooTm90TWFuZGFyaW58Tm90Y2hpbmVzZXzpnZ7kuK3mlod86Z2e54++5Luj5ryi6KqefOmdnueOsOS7o+axieivrXzpnZ7nj77ku6PmqJnmupbmvKLoqp586Z2e546w5Luj5qCH5YeG5rGJ6K+tKVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfVxccyovZ2ksXG5cdFx0XHRcdFx0Jydcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRleHQgIT09IHRleHROb05vdE1hbmRhcmluICYmXG5cdFx0XHRcdFx0Y29uZmlybShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+WcqOmhtemdouS4iuaJvuWIsOmdnueOsOS7o+agh+WHhuaxieivreaooeadv++8jOimgeenu+mZpOWQl++8nycsXG5cdFx0XHRcdFx0XHRcdCflnKjpoIHpnaLkuIrmib7liLDpnZ7nj77ku6PmqJnmupbmvKLoqp7mqKHmnb/vvIzopoHnp7vpmaTll47vvJ8nXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0ZXh0ID0gdGV4dE5vTm90TWFuZGFyaW47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdGV4dE5vQWZjID0gdGV4dC5yZXBsYWNlKC97e1xccypBRkMgc3VibWlzc2lvblxccypcXHxcXHMqXFx8W159XSo/fX1cXHMqL2dpLCAnJyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0ZXh0ICE9PSB0ZXh0Tm9BZmMgJiZcblx0XHRcdFx0XHRjb25maXJtKHdpbmRvdy53Z1VMUygn5Zyo6aG16Z2i5LiK5om+5YiwQUZD5o+Q5Lqk5qih5p2/77yM6KaB56e76Zmk5ZCX77yfJywgJ+WcqOmggemdouS4iuaJvuWIsEFGQ+aPkOS6pOaooeadv++8jOimgeenu+mZpOWXju+8nycpKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0ZXh0ID0gdGV4dE5vQWZjO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIE1hcmsgdGhlIHBhZ2UgYXMgcGF0cm9sbGVkLCBpZiB3YW50ZWRcblx0XHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignbWFya1hmZFBhZ2VzQXNQYXRyb2xsZWQnKSkge1xuXHRcdFx0XHRcdHBhZ2VvYmoucGF0cm9sKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gSW5zZXJ0IHRhZyBhZnRlciBzaG9ydCBkZXNjcmlwdGlvbiBvciBhbnkgaGF0bm90ZXNcblx0XHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraXRleHQucGFnZSh0ZXh0KTtcblx0XHRcdFx0dGV4dCA9IHFpdXdlbl9wYWdlLmluc2VydEFmdGVyVGVtcGxhdGVzKHRhZywgVHdpbmtsZS5oYXRub3RlUmVnZXgpLmdldFRleHQoKTtcblx0XHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ+mhtemdouWtmOW6n+iuqOiuuu+8mltbJywgJ+mggemdouWtmOW7ouiojuirlu+8mltbJykgKyBwYXJhbXMubG9ncGFnZX0jJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV1gXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3hmZFdhdGNoUGFnZScpKTtcblx0XHRcdFx0cGFnZW9iai5zYXZlKCk7XG5cdFx0XHR9LFxuXHRcdFx0dG9kYXlzTGlzdDogKHBhZ2VvYmopID0+IHtcblx0XHRcdFx0bGV0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdGxldCB0eXBlID0gJyc7XG5cdFx0XHRcdGxldCB0byA9ICcnO1xuXHRcdFx0XHRzd2l0Y2ggKHBhcmFtcy54ZmRjYXQpIHtcblx0XHRcdFx0XHRjYXNlICdmd2Rjc2QnOlxuXHRcdFx0XHRcdGNhc2UgJ21lcmdlJzpcblx0XHRcdFx0XHRcdHRvID0gcGFyYW1zLm1lcmdlaW50bztcblx0XHRcdFx0XHQvKiBGYWxsIHRocm91Z2ggKi9cblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0dHlwZSA9IHBhcmFtcy54ZmRjYXQ7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgYXBwZW5kID0gdHJ1ZTtcblx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSAnZmFtZSc6XG5cdFx0XHRcdFx0Y2FzZSAnc3Vic3R1Yic6XG5cdFx0XHRcdFx0Y2FzZSAnYmF0Y2gnOiB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb21tZW50VGV4dCA9IGA8IS0tIFR3aW5rbGU6IFVzZXI6JHttdy5jb25maWcuZ2V0KFxuXHRcdFx0XHRcdFx0XHQnd2dVc2VyTmFtZSdcblx0XHRcdFx0XHRcdCl9IOeahCAke3R5cGV9IOaPkOWIoOaPkuWFpeeCue+8jOivt+WLv+abtOaUueaIluenu+mZpOatpOihjO+8jOmZpOmdnuS4jeWGjeS6juatpOmhtemdouaPkOWIoCAtLT5gO1xuXHRcdFx0XHRcdFx0bGV0IG5ld1RleHQgPSBgPT09W1s6JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV09PT1gO1xuXHRcdFx0XHRcdFx0aWYgKHR5cGUgPT09ICdmYW1lJykge1xuXHRcdFx0XHRcdFx0XHRuZXdUZXh0ICs9IGBcXG57e0ZpbmRzb3VyY2VzfCR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfX19YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICh0ZXh0LmluY2x1ZGVzKGNvbW1lbnRUZXh0KSkge1xuXHRcdFx0XHRcdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKGNvbW1lbnRUZXh0LCBgJHtuZXdUZXh0fVxcblxcbiR7Y29tbWVudFRleHR9YCk7XG5cdFx0XHRcdFx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRcdFx0XHRcdGFwcGVuZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2FmZXN1YnN0ID0gJ3NhZmVzdWJzdCc7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFwcGVuZFRleHQgPSBgXFxue3ske3NhZmVzdWJzdH0ke2A6U2FmZUFmZEhlYWR9fVxcbiR7XG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmFtZTogJz09IDMw5aSp5ZCO5LuN5oyC5pyJe3t0bHxub3RhYmlsaXR5fX3mqKHmnb/nmoTmnaHnm64gPT1cXG48c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogc21hbGxlcjtcIj7vvIjlt7LmjIJbW1RlbXBsYXRlOm5vdGFiaWxpdHl85LiN56ym5pS25b2V5qCH5YeG5qih5p2/XV0zMOWkqe+8iTwvc3Bhbj4nLFxuXHRcdFx0XHRcdFx0XHRcdFx0c3Vic3R1Yjpcblx0XHRcdFx0XHRcdFx0XHRcdFx0Jz09IDMw5aSp5ZCO5LuN5oyC5pyJe3t0bHxzdWJzdHVifX3mqKHmnb/nmoTmnaHnm64gPT1cXG48c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogc21hbGxlcjtcIj7vvIjlt7LmjIJbW1RlbXBsYXRlOnN1YnN0dWJ85bCP5bCP5p2h55uu5qih5p2/XV0zMOWkqe+8iTwvc3Bhbj4nLFxuXHRcdFx0XHRcdFx0XHRcdFx0YmF0Y2g6ICc9PSDmibnph4/mj5DliKAgPT0nLFxuXHRcdFx0XHRcdFx0XHRcdH1bdHlwZV1cblx0XHRcdFx0XHRcdFx0fVxcbiR7bmV3VGV4dH1cXG5cXG4ke2NvbW1lbnRUZXh0fVxcbi0tLS1cXG465bu66K6u77ya5Yig6Zmk5YmN6L+w6aG16Z2i77yb55CG55Sx77yaJHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uVGV4dChcblx0XHRcdFx0XHRcdFx0XHRwYXJhbXMueGZkcmVhc29uXG5cdFx0XHRcdFx0XHRcdCl9XFxu5o+Q5oql5Lul5LiKJHtcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRmYW1lOiAnPHU+5LiN56ym5ZCI5pS25b2V5qCH5YeGPC91PuadoeebricsXG5cdFx0XHRcdFx0XHRcdFx0XHRzdWJzdHViOiAnPHU+6ZW/5bqm6L+H55+tPC91PuadoeebricsXG5cdFx0XHRcdFx0XHRcdFx0XHRiYXRjaDogJ+mhtemdoicsXG5cdFx0XHRcdFx0XHRcdFx0fVt0eXBlXVxuXHRcdFx0XHRcdFx0XHR955qE5rGC6Ze757yW6ICF5Y+K5pe26Ze077yaPGJyIGlkPVwibm8tbmV3LXRpdGxlXCI+fn5gLmNvbmNhdCgnfn4nKX1gO1xuXHRcdFx0XHRcdFx0XHRwYWdlb2JqLnNldEFwcGVuZFRleHQoYXBwZW5kVGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHBhZ2VvYmouc2V0QXBwZW5kVGV4dChcblx0XHRcdFx0XHRcdFx0J1xcbnt7Jy5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdFx0J3N1YnN0OicsXG5cdFx0XHRcdFx0XHRcdFx0YERSSXRlbXxUeXBlPSR7dHlwZX18RFJhcnRpY2xlcz0ke1xuXHRcdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMucGFnZU5hbWVOb3JtXG5cdFx0XHRcdFx0XHRcdFx0fXxSZWFzb249JHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uVGV4dChwYXJhbXMueGZkcmVhc29uKX0ke1xuXHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1zLmZ3ZGNzZHJlYXNvbi50cmltKCkgPT09ICcnID8gJycgOiBgPGJyPlxcbui9rOS6pOeQhueUse+8miR7cGFyYW1zLmZ3ZGNzZHJlYXNvbn1gXG5cdFx0XHRcdFx0XHRcdFx0fXxUbz0ke3RvfX19fn5gLmNvbmNhdCgnfn4nKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShg5Yqg5YWlW1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWApO1xuXHRcdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd4ZmRXYXRjaERpc2N1c3Npb24nKSk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0XHRpZiAoYXBwZW5kKSB7XG5cdFx0XHRcdFx0cGFnZW9iai5hcHBlbmQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYWdlb2JqLnNhdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRUd2lua2xlLnhmZC5jdXJyZW50UmF0aW9uYWxlID0gbnVsbDtcblx0XHRcdH0sXG5cdFx0XHRsb29rdXBDcmVhdGlvbjogKHRhcmdldF9wYWdlKSA9PiB7XG5cdFx0XHRcdHRhcmdldF9wYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0Y29uc3QgcGFyYW1zID0gdGFyZ2V0X3BhZ2UuZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdHBhcmFtcy5jcmVhdG9yID0gdGFyZ2V0X3BhZ2UuZ2V0Q3JlYXRvcigpO1xuXHRcdFx0XHQvLyBUYWdnaW5nIHBhZ2Vcblx0XHRcdFx0Y29uc3QgdGFnZ2luZ19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfliqDlhaXlrZjlup/orqjorrrmqKHmnb/liLDpobXpnaInLCAn5Yqg5YWl5a2Y5bui6KiO6KuW5qih5p2/5Yiw6aCB6Z2iJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dGFnZ2luZ19wYWdlLnNldEZvbGxvd1JlZGlyZWN0KGZhbHNlKTtcblx0XHRcdFx0dGFnZ2luZ19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHR0YWdnaW5nX3BhZ2UubG9hZChUd2lua2xlLnhmZC5jYWxsYmFja3MuYWZkLnRyeVRhZ2dpbmcpO1xuXHRcdFx0fSxcblx0XHRcdHRyeVRhZ2dpbmc6ICh0YWdnaW5nX3BhZ2UpID0+IHtcblx0XHRcdFx0Y29uc3Qgc3RhdGVsZW0gPSB0YWdnaW5nX3BhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0XHQvLyBkZWZhdWx0cyB0byAvZG9jIGZvciBsdWEgbW9kdWxlcywgd2hpY2ggbWF5IG5vdCBleGlzdFxuXHRcdFx0XHRpZiAoIXRhZ2dpbmdfcGFnZS5leGlzdHMoKSkge1xuXHRcdFx0XHRcdHN0YXRlbGVtLmVycm9yKHdpbmRvdy53Z1VMUygn6aG16Z2i5LiN5a2Y5Zyo77yM5Y+v6IO95bey6KKr5Yig6ZmkJywgJ+mggemdouS4jeWtmOWcqO+8jOWPr+iDveW3suiiq+WIqumZpCcpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdGV4dCA9IHRhZ2dpbmdfcGFnZS5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRjb25zdCB4ZmQgPSAvKD86XFx7XFx7KFtyc2FpZnRjbXZdZmR8bWQxfHByb3Bvc2VkIGRlbGV0aW9uKVtee31dKj9cXH1cXH0pL2kuZXhlYyh0ZXh0KTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHhmZCAmJlxuXHRcdFx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfliKDpmaTnm7jlhbPmqKHmnb97eycsICfliKrpmaTnm7jpl5zmqKHmnb97eycpICtcblx0XHRcdFx0XHRcdFx0eGZkWzFdICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCd9feW3suiiq+e9ruS6jumhtemdouS4re+8jOaCqOaYr+WQpuS7jeaDs+e7p+e7reaPkOaKpe+8nycsXG5cdFx0XHRcdFx0XHRcdFx0J3195bey6KKr572u5pa86aCB6Z2i5Lit77yM5oKo5piv5ZCm5LuN5oOz57m857qM5o+Q5aCx77yfJ1xuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouW3suiiq+aPkOS6pOiHs+WtmOW6n+iuqOiuuuOAgicsICfpoIHpnaLlt7Looqvmj5DkuqToh7PlrZjlu6LoqI7oq5bjgIInKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGNvcHl2aW8gPSAvKD86XFx7XFx7XFxzKihjb3B5dmlvKVtee31dKj9cXH1cXH0pL2kuZXhlYyh0ZXh0KTtcblx0XHRcdFx0aWYgKGNvcHl2aW8pIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouS4reW3suacieiRl+S9nOadg+mqjOivgeaooeadv+OAgicsICfpoIHpnaLkuK3lt7LmnInokZfkvZzmrIrpqZforYnmqKHmnb/jgIInKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFR3aW5rbGUueGZkLmNhbGxiYWNrcy5hZmQubWFpbih0YWdnaW5nX3BhZ2UpO1xuXHRcdFx0fSxcblx0XHR9LFxuXHRcdGZmZDoge1xuXHRcdFx0bWFpbjogKHRhZ2dpbmdfcGFnZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSB0YWdnaW5nX3BhZ2UuZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdFR3aW5rbGUueGZkLmNhbGxiYWNrcy5mZmQudGFnZ2luZ0ltYWdlKHRhZ2dpbmdfcGFnZSk7XG5cdFx0XHRcdC8vIEFkZGluZyBkaXNjdXNzaW9uXG5cdFx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRwYXJhbXMubG9ncGFnZSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeiuqOiuuuWIsOW9k+aXpeWIl+ihqCcsICfliqDlhaXoqI7oq5bliLDnlbbml6XliJfooagnKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRcdHFpdXdlbl9wYWdlLmxvYWQoVHdpbmtsZS54ZmQuY2FsbGJhY2tzLmZmZC50b2RheXNMaXN0KTtcblx0XHRcdFx0Ly8gTm90aWZpY2F0aW9uIHRvIGZpcnN0IGNvbnRyaWJ1dG9yXG5cdFx0XHRcdGlmIChwYXJhbXMubm90aWZ5KSB7XG5cdFx0XHRcdFx0Ly8gRGlzYWxsb3cgd2FybmluZyB5b3Vyc2VsZlxuXHRcdFx0XHRcdGlmIChwYXJhbXMuY3JlYXRvciA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSB7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfpgJrnn6XpobXpnaLliJvlu7rogIXvvIgnLCAn6YCa55+l6aCB6Z2i5bu656uL6ICF77yIJykgKyBwYXJhbXMuY3JlYXRvcn3vvIlgLFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aCqOWIm+W7uuS6huivpemhte+8jOi3s+i/h+mAmuefpScsICfmgqjlu7rnq4vkuoboqbLpoIHvvIzot7PpgY7pgJrnn6UnKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdGFsa1BhZ2VOYW1lID0gYFVzZXIgdGFsazoke3BhcmFtcy5jcmVhdG9yfWA7XG5cdFx0XHRcdFx0Y29uc3QgdXNlcnRhbGtwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdHRhbGtQYWdlTmFtZSxcblx0XHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn6YCa55+l6aG16Z2i5Yib5bu66ICF77yIJywgJ+mAmuefpemggemdouW7uueri+iAhe+8iCcpICsgcGFyYW1zLmNyZWF0b3J977yJYFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3Qgbm90aWZ5dGV4dCA9ICdcXG57eycuY29uY2F0KCdzdWJzdDonLCBgaWR3fEZpbGU6JHttdy5jb25maWcuZ2V0KCd3Z1RpdGxlJyl9fX1gLCAnLS1+ficsICd+ficpO1xuXHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRBcHBlbmRUZXh0KG5vdGlmeXRleHQpO1xuXHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRFZGl0U3VtbWFyeShg6YCa55+l77ya5paH5Lu2W1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXeWtmOW6n+iuqOiuuuaPkOWQjWApO1xuXHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZigneGZkV2F0Y2hVc2VyJykpO1xuXHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdFx0dXNlcnRhbGtwYWdlLmFwcGVuZCgpO1xuXHRcdFx0XHRcdC8vIGFkZCB0aGlzIG5vbWluYXRpb24gdG8gdGhlIHVzZXIncyB1c2Vyc3BhY2UgbG9nLCBpZiB0aGUgdXNlciBoYXMgZW5hYmxlZCBpdFxuXHRcdFx0XHRcdGlmIChwYXJhbXMubG9nbm9taW5hdGlvbikge1xuXHRcdFx0XHRcdFx0VHdpbmtsZS54ZmQuY2FsbGJhY2tzLmFkZFRvTG9nKHBhcmFtcywgcGFyYW1zLmNyZWF0b3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBvciwgaWYgbm90IG5vdGlmeWluZywgYWRkIHRoaXMgbm9taW5hdGlvbiB0byB0aGUgdXNlcidzIHVzZXJzcGFjZSBsb2cgd2l0aG91dCB0aGUgaW5pdGlhbCBjb250cmlidXRvcidzIG5hbWVcblx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMubG9nbm9taW5hdGlvbikge1xuXHRcdFx0XHRcdFR3aW5rbGUueGZkLmNhbGxiYWNrcy5hZGRUb0xvZyhwYXJhbXMsIG51bGwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0dGFnZ2luZ0ltYWdlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KFxuXHRcdFx0XHRcdGB7e2lmZHwke01vcmViaXRzLnN0cmluZy5mb3JtYXRSZWFzb25UZXh0KHBhcmFtcy54ZmRyZWFzb24pfXxkYXRlPXt7YC5jb25jYXQoXG5cdFx0XHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0XHRcdGAjdGltZTpjfX19fVxcbiR7dGV4dH1gXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn5paH5Lu25a2Y5bqf6K6o6K6677yaW1snLCAn5qqU5qGI5a2Y5bui6KiO6KuW77yaW1snKSArIHBhcmFtcy5sb2dwYWdlfSMke01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWBcblx0XHRcdFx0KTtcblx0XHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZigneGZkV2F0Y2hQYWdlJykpO1xuXHRcdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTsgLy8gaXQgbWlnaHQgYmUgcG9zc2libGUgZm9yIGEgZmlsZSB0byBleGlzdCB3aXRob3V0IGEgZGVzY3JpcHRpb24gcGFnZVxuXHRcdFx0XHRwYWdlb2JqLnNhdmUoKTtcblx0XHRcdH0sXG5cdFx0XHR0b2RheXNMaXN0OiAocGFnZW9iaikgPT4ge1xuXHRcdFx0XHQvLyBjb25zdCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRwYWdlb2JqLnNldEFwcGVuZFRleHQoXG5cdFx0XHRcdFx0J1xcbnt7Jy5jb25jYXQoXG5cdFx0XHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0XHRcdGBJZmRJdGVtfEZpbGVuYW1lPSR7bXcuY29uZmlnLmdldCgnd2dUaXRsZScpfXxVcGxvYWRlcj0ke1xuXHRcdFx0XHRcdFx0XHRwYXJhbXMuY3JlYXRvclxuXHRcdFx0XHRcdFx0fXxSZWFzb249JHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uVGV4dChwYXJhbXMueGZkcmVhc29uKX19fS0tfn5gLmNvbmNhdCgnfn4nKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShg5Yqg5YWlW1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWApO1xuXHRcdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd4ZmRXYXRjaERpc2N1c3Npb24nKSk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0XHRwYWdlb2JqLmFwcGVuZCgoKSA9PiB7XG5cdFx0XHRcdFx0VHdpbmtsZS54ZmQuY3VycmVudFJhdGlvbmFsZSA9IG51bGw7IC8vIGFueSBlcnJvcnMgZnJvbSBub3cgb24gZG8gbm90IG5lZWQgdG8gcHJpbnQgdGhlIHJhdGlvbmFsZSwgYXMgaXQgaXMgc2FmZWx5IHNhdmVkIG9uLXdpa2lcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXG5cdFx0XHRsb29rdXBDcmVhdGlvbjogKHRhcmdldF9wYWdlKSA9PiB7XG5cdFx0XHRcdHRhcmdldF9wYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0Y29uc3QgcGFyYW1zID0gdGFyZ2V0X3BhZ2UuZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdHBhcmFtcy5jcmVhdG9yID0gdGFyZ2V0X3BhZ2UuZ2V0Q3JlYXRvcigpO1xuXHRcdFx0XHQvLyBUYWdnaW5nIGZpbGVcblx0XHRcdFx0Y29uc3QgdGFnZ2luZ19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfliqDlhaXlrZjlup/orqjorrrmqKHmnb/liLDmlofku7bmj4/ov7DpobUnLCAn5Yqg5YWl5a2Y5bui6KiO6KuW5qih5p2/5Yiw5qqU5qGI5o+P6L+w6aCBJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dGFnZ2luZ19wYWdlLnNldEZvbGxvd1JlZGlyZWN0KGZhbHNlKTtcblx0XHRcdFx0dGFnZ2luZ19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHR0YWdnaW5nX3BhZ2UubG9hZChUd2lua2xlLnhmZC5jYWxsYmFja3MuZmZkLnRyeVRhZ2dpbmcpO1xuXHRcdFx0fSxcblx0XHRcdHRyeVRhZ2dpbmc6ICh0YWdnaW5nX3BhZ2UpID0+IHtcblx0XHRcdFx0Y29uc3Qgc3RhdGVsZW0gPSB0YWdnaW5nX3BhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0XHRpZiAoIXRhZ2dpbmdfcGFnZS5leGlzdHMoKSkge1xuXHRcdFx0XHRcdHN0YXRlbGVtLmVycm9yKHdpbmRvdy53Z1VMUygn6aG16Z2i5LiN5a2Y5Zyo77yM5Y+v6IO95bey6KKr5Yig6ZmkJywgJ+mggemdouS4jeWtmOWcqO+8jOWPr+iDveW3suiiq+WIqumZpCcpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdGV4dCA9IHRhZ2dpbmdfcGFnZS5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRjb25zdCB4ZmQgPSAvKD86XFx7XFx7KFtyc2FpZnRjbXZdZmR8bWQxfHByb3Bvc2VkIGRlbGV0aW9uKVtee31dKj9cXH1cXH0pL2kuZXhlYyh0ZXh0KTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHhmZCAmJlxuXHRcdFx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfliKDpmaTnm7jlhbPmqKHmnb97eycsICfliKrpmaTnm7jpl5zmqKHmnb97eycpICtcblx0XHRcdFx0XHRcdFx0eGZkWzFdICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCd9feW3suiiq+e9ruS6jumhtemdouS4re+8jOaCqOaYr+WQpuS7jeaDs+e7p+e7reaPkOaKpe+8nycsXG5cdFx0XHRcdFx0XHRcdFx0J3195bey6KKr572u5pa86aCB6Z2i5Lit77yM5oKo5piv5ZCm5LuN5oOz57m857qM5o+Q5aCx77yfJ1xuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouW3suiiq+aPkOS6pOiHs+WtmOW6n+iuqOiuuuOAgicsICfpoIHpnaLlt7Looqvmj5DkuqToh7PlrZjlu6LoqI7oq5bjgIInKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFR3aW5rbGUueGZkLmNhbGxiYWNrcy5mZmQubWFpbih0YWdnaW5nX3BhZ2UpO1xuXHRcdFx0fSxcblx0XHR9LFxuXHRcdGFkZFRvTG9nOiAocGFyYW1zLCBpbml0aWFsQ29udHJpYikgPT4ge1xuXHRcdFx0Y29uc3QgZWRpdHN1bW1hcnkgPVxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+iusOW9leWvuVtbJywgJ+iomOmMhOWwjVtbJykgK1xuXHRcdFx0XHRNb3JlYml0cy5wYWdlTmFtZU5vcm0gK1xuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ11d55qE5a2Y5bqf6K6o6K665o+Q5ZCNJywgJ11d55qE5a2Y5bui6KiO6KuW5o+Q5ZCNJyk7XG5cdFx0XHRjb25zdCB1c2wgPSBuZXcgTW9yZWJpdHMudXNlcnNwYWNlTG9nZ2VyKFR3aW5rbGUuZ2V0UHJlZigneGZkTG9nUGFnZU5hbWUnKSk7XG5cdFx0XHR1c2wuaW5pdGlhbFRleHQgPSB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdGDov5nmmK/or6XnlKjmiLfkvb/nlKhbW0g6VFd8VHdpbmtsZV1d55qE5o+Q5Yig5qih5Z2X5YGa5Ye655qEW1tRVzpYRkR85a2Y5bqf6K6o6K66XV3mj5DlkI3liJfooajjgIJcXG5cXG7oi6XmgqjkuI3lho3mg7Pkv53nlZnmraTml6Xlv5fvvIzor7flnKhbWyR7VHdpbmtsZS5nZXRQcmVmKFxuXHRcdFx0XHRcdCdjb25maWdQYWdlJ1xuXHRcdFx0XHQpfXzlj4LmlbDorr7nva5dXeS4reWFs+aOie+8jOW5tuS9v+eUqFtbUVc6Q1NEI08xfENTRCBPMV1d5o+Q5Lqk5b+r6YCf5Yig6Zmk44CCYCxcblx0XHRcdFx0YOmAmeaYr+ipsuS9v+eUqOiAheS9v+eUqFtbSDpUV3xUd2lua2xlXV3nmoTmj5DliKrmqKHloYrlgZrlh7rnmoRbW1FXOlhGRHzlrZjlu6LoqI7oq5ZdXeaPkOWQjeWIl+ihqOOAglxcblxcbuiLpeaCqOS4jeWGjeaDs+S/neeVmeatpOaXpeiqjO+8jOiri+WcqFtbJHtUd2lua2xlLmdldFByZWYoXG5cdFx0XHRcdFx0J2NvbmZpZ1BhZ2UnXG5cdFx0XHRcdCl9fOWBj+WlveioreWuml1d5Lit6Zec5o6J77yM5Lim5L2/55SoW1tRVzpDU0QjTzF8Q1NEIE8xXV3mj5DkuqTlv6vpgJ/liKrpmaTjgIJgXG5cdFx0XHQpO1xuXHRcdFx0bGV0IHhmZENhdE5hbWU7XG5cdFx0XHRzd2l0Y2ggKHBhcmFtcy54ZmRjYXQpIHtcblx0XHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCfliKDpmaQnLCAn5Yiq6ZmkJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ21lcmdlJzpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCflkIjlubbliLAnLCAn5ZCI5L215YiwJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Z3ZGNzZCc6XG5cdFx0XHRcdFx0eGZkQ2F0TmFtZSA9IHdpbmRvdy53Z1VMUygn6L2s5Lqk6Ieq5b+r6YCf5Yig6Zmk5YCZ6YCJJywgJ+i9ieS6pOiHquW/q+mAn+WIqumZpOWAmemBuCcpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdmYW1lJzpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCfmibnph4/lhbPms6jluqbmj5DliKAnLCAn5om55qyh6Zec5rOo5bqm5o+Q5YiqJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3N1YnN0dWInOlxuXHRcdFx0XHRcdHhmZENhdE5hbWUgPSB3aW5kb3cud2dVTFMoJ+aJuemHj+Wwj+Wwj+S9nOWTgeaPkOWIoCcsICfmibnmrKHlsI/lsI/kvZzlk4Hmj5DliKonKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnYmF0Y2gnOlxuXHRcdFx0XHRcdHhmZENhdE5hbWUgPSB3aW5kb3cud2dVTFMoJ+aJuemHj+WFtuS7luaPkOWIoCcsICfmibnmrKHlhbbku5bmj5DliKonKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCfmlofku7blrZjlup/orqjorronLCAn5qqU5qGI5a2Y5bui6KiO6KuWJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyBJZiBhIGxvZ2dlZCBmaWxlIGlzIGRlbGV0ZWQgYnV0IGV4aXN0cyBvbiByZW1vdGUgcmVwbywgdGhlIHdpa2lsaW5rIHdpbGwgYmUgYmx1ZSwgc28gcHJvdmlkZSBhIGxpbmsgdG8gdGhlIGxvZ1xuXHRcdFx0bGV0IGFwcGVuZFRleHQgPSBgIyBbWzoke01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWA7XG5cdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gNikge1xuXHRcdFx0XHRhcHBlbmRUZXh0ICs9IGDvvIhbe3tmdWxsdXJsOlNwZWNpYWw6TG9nfHBhZ2U9JHttdy51dGlsLndpa2lVcmxlbmNvZGUoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpXG5cdFx0XHRcdCl9fX0gJHt3aW5kb3cud2dVTFMoJ+aXpeW/lycsICfml6XoqownKX1d77yJYDtcblx0XHRcdH1cblx0XHRcdGFwcGVuZFRleHQgKz0gYO+8miR7eGZkQ2F0TmFtZX1gO1xuXHRcdFx0aWYgKHBhcmFtcy54ZmRjYXQgPT09ICdtZXJnZScpIHtcblx0XHRcdFx0YXBwZW5kVGV4dCArPSBgW1s6JHtwYXJhbXMubWVyZ2VpbnRvfV1dYDtcblx0XHRcdH1cblx0XHRcdGFwcGVuZFRleHQgKz0gJ+OAgic7XG5cdFx0XHRpZiAocGFyYW1zLnhmZHJlYXNvbikge1xuXHRcdFx0XHRhcHBlbmRUZXh0ICs9IGAnJycke1xuXHRcdFx0XHRcdHBhcmFtcy54ZmRjYXQgPT09ICdmd2Rjc2QnID8gd2luZG93LndnVUxTKCfljp/liKDpmaTnkIbmja4nLCAn5Y6f5Yiq6Zmk55CG5pOaJykgOiB3aW5kb3cud2dVTFMoJ+eQhuaNricsICfnkIbmk5onKVxuXHRcdFx0XHR9Jycn77yaJHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uRm9yTG9nKHBhcmFtcy54ZmRyZWFzb24pfWA7XG5cdFx0XHRcdGFwcGVuZFRleHQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oYXBwZW5kVGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLmZ3ZGNzZHJlYXNvbikge1xuXHRcdFx0XHRhcHBlbmRUZXh0ICs9IGAnJycke1xuXHRcdFx0XHRcdHBhcmFtcy54ZmRjYXQgPT09ICdmd2Rjc2QnID8gd2luZG93LndnVUxTKCfovazkuqTnkIbmja4nLCAn6L2J5Lqk55CG5pOaJykgOiB3aW5kb3cud2dVTFMoJ+eQhuaNricsICfnkIbmk5onKVxuXHRcdFx0XHR9Jycn77yaJHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uRm9yTG9nKHBhcmFtcy5md2Rjc2RyZWFzb24pfWA7XG5cdFx0XHRcdGFwcGVuZFRleHQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oYXBwZW5kVGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5pdGlhbENvbnRyaWIpIHtcblx0XHRcdFx0YXBwZW5kVGV4dCArPSBg77yb6YCa55+le3t1c2VyfCR7aW5pdGlhbENvbnRyaWJ9fX1gO1xuXHRcdFx0fVxuXHRcdFx0YXBwZW5kVGV4dCArPSAnIH5+Jy5jb25jYXQoJ35+JywgJ35cXG4nKTtcblx0XHRcdHVzbC5jaGFuZ2VUYWdzID0gVHdpbmtsZS5jaGFuZ2VUYWdzO1xuXHRcdFx0dXNsLmxvZyhhcHBlbmRUZXh0LCBlZGl0c3VtbWFyeSk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS54ZmQuY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZS50YXJnZXQpO1xuXHRcdGlmIChwYXJhbXMueGZkY2F0ID09PSAnbWVyZ2UnICYmIHBhcmFtcy5tZXJnZWludG8udHJpbSgpID09PSAnJykge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fmj5DkvpvlkIjlubbnm67moIfvvIEnLCAn6KuL5o+Q5L6b5ZCI5L2155uu5qiZ77yBJyksIHtcblx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHR0YWc6ICd0d2lua2xleGZkJyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGUudGFyZ2V0KTtcblx0XHRUd2lua2xlLnhmZC5jdXJyZW50UmF0aW9uYWxlID0gcGFyYW1zLnhmZHJlYXNvbjtcblx0XHRNb3JlYml0cy5zdGF0dXMub25FcnJvcihUd2lua2xlLnhmZC5wcmludFJhdGlvbmFsZSk7XG5cdFx0aWYgKCFwYXJhbXMuY2F0ZWdvcnkpIHtcblx0XHRcdE1vcmViaXRzLnN0YXR1cy5lcnJvcign6ZSZ6K+vJywgJ+acquWumuS5ieeahOWKqOS9nCcpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgdGFyZ2V0X3BhZ2U7XG5cdFx0Y29uc3QgZGF0ZSA9IG5ldyBNb3JlYml0cy5kYXRlKCk7IC8vIFhYWDogYXZvaWQgdXNlIG9mIGNsaWVudCBjbG9jaywgc3RpbGwgdXNlZCBieSBUZkQsIEZmRCBhbmQgQ2ZEXG5cdFx0c3dpdGNoIChwYXJhbXMuY2F0ZWdvcnkpIHtcblx0XHRcdGNhc2UgJ2FmZCc6XG5cdFx0XHRcdC8vIEFGRFxuXHRcdFx0XHRwYXJhbXMubG9ncGFnZSA9IGBRaXV3ZW5fdGFsazrlrZjlup/orqjorrov6K6w5b2VLyR7ZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQnLCAndXRjJyl9YDtcblx0XHRcdFx0cGFyYW1zLmxvZ25vbWluYXRpb24gPVxuXHRcdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignbG9nWGZkTm9taW5hdGlvbnMnKSAmJlxuXHRcdFx0XHRcdCFUd2lua2xlLmdldFByZWYoJ25vTG9nT25YZmROb21pbmF0aW9uJykuaW5jbHVkZXMocGFyYW1zLnhmZGNhdCk7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWRkQ2hlY2twb2ludCgpO1xuXHRcdFx0XHQvLyBVcGRhdGluZyBkYXRhIGZvciB0aGUgYWN0aW9uIGNvbXBsZXRlZCBldmVudFxuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IHBhcmFtcy5sb2dwYWdlO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aPkOWQjeWujOaIkO+8jOmHjeWumuWQkeWIsOiuqOiuuumhtScsXG5cdFx0XHRcdFx0J+aPkOWQjeWujOaIkO+8jOmHjeaWsOWwjuWQkeWIsOiojuirlumggSdcblx0XHRcdFx0KTtcblx0XHRcdFx0Ly8gTG9va3VwIGNyZWF0aW9uXG5cdFx0XHRcdHRhcmdldF9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfojrflj5bpobXpnaLliJvlu7rkv6Hmga8nLCAn5Y+W5b6X6aCB6Z2i5bu656uL6LOH6KiKJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dGFyZ2V0X3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z1BhZ2VDb250ZW50TW9kZWwnKSA9PT0gJ3dpa2l0ZXh0Jykge1xuXHRcdFx0XHRcdHRhcmdldF9wYWdlLnNldExvb2t1cE5vblJlZGlyZWN0Q3JlYXRvcih0cnVlKTsgLy8gTG9vayBmb3IgYXV0aG9yIG9mIGZpcnN0IG5vbi1yZWRpcmVjdCByZXZpc2lvblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0X3BhZ2UubG9va3VwQ3JlYXRpb24oVHdpbmtsZS54ZmQuY2FsbGJhY2tzLmFmZC5sb29rdXBDcmVhdGlvbik7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kucmVtb3ZlQ2hlY2twb2ludCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2ZmZCc6IHtcblx0XHRcdFx0Ly8gRkZEXG5cdFx0XHRcdHBhcmFtcy5sb2dwYWdlID0gYFFpdXdlbl90YWxrOuWtmOW6n+iuqOiuui/orrDlvZUvJHtkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCcsICd1dGMnKX1gO1xuXHRcdFx0XHRwYXJhbXMubG9nbm9taW5hdGlvbiA9XG5cdFx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdsb2dYZmROb21pbmF0aW9ucycpICYmICFUd2lua2xlLmdldFByZWYoJ25vTG9nT25YZmROb21pbmF0aW9uJykuaW5jbHVkZXMoJ2ZmZCcpO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFkZENoZWNrcG9pbnQoKTtcblx0XHRcdFx0Ly8gVXBkYXRpbmcgZGF0YSBmb3IgdGhlIGFjdGlvbiBjb21wbGV0ZWQgZXZlbnRcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBwYXJhbXMubG9ncGFnZTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfmj5DlkI3lrozmiJDvvIzph43lrprlkJHliLDorqjorrrpobUnLFxuXHRcdFx0XHRcdCfmj5DlkI3lrozmiJDvvIzph43mlrDlsI7lkJHliLDoqI7oq5bpoIEnXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIExvb2t1cCBjcmVhdGlvblxuXHRcdFx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6I635Y+W6aG16Z2i5Yib5bu65L+h5oGvJywgJ+WPluW+l+mggemdouW7uueri+izh+ioiicpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHFpdXdlbl9wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRMb29rdXBOb25SZWRpcmVjdENyZWF0b3IodHJ1ZSk7IC8vIExvb2sgZm9yIGF1dGhvciBvZiBmaXJzdCBub24tcmVkaXJlY3QgcmV2aXNpb25cblx0XHRcdFx0cWl1d2VuX3BhZ2UubG9va3VwQ3JlYXRpb24oVHdpbmtsZS54ZmQuY2FsbGJhY2tzLmZmZC5sb29rdXBDcmVhdGlvbik7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kucmVtb3ZlQ2hlY2twb2ludCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KCd0d2lua2xleGZk77ya5pyq5a6a5LmJ55qE57G75YirJywge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xleGZkJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS54ZmQsICd4ZmQnKTtcbn0pKCk7XG5cbmV4cG9ydCB7fTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlaW1hZ2UuanMgKi9cbihmdW5jdGlvbiB0d2lua2xlaW1hZ2UoKSB7XG5cdC8qKlxuXHQgKiB0d2lua2xlaW1hZ2UuanM6IEltYWdlIENTRCBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiRElcIilcblx0ICogQWN0aXZlIG9uOiBMb2NhbCBub25yZWRpcmVjdCBmaWxlIHBhZ2VzIChub3Qgb24gU2hhcmUpXG5cdCAqL1xuXHRUd2lua2xlLmltYWdlID0gKCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDYgJiZcblx0XHRcdCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctc2hhcmVkdXBsb2FkJykgJiZcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1pbWFnZXBhZ2Utc2VjdGlvbi1maWxlaGlzdG9yeScpXG5cdFx0KSB7XG5cdFx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0XHRUd2lua2xlLmltYWdlLmNhbGxiYWNrLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WbvuadgycsICflnJbmrIonKSxcblx0XHRcdFx0J3R3LWRpJyxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmj5DkuqTmlofku7blv6vpgJ/liKDpmaQnLCAn5o+Q5Lqk5qqU5qGI5b+r6YCf5Yiq6ZmkJylcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmltYWdlLmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjAwLCAzMzApO1xuXHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+aWh+S7tuW/q+mAn+WIoOmZpOWAmemAiScsICfmqpTmoYjlv6vpgJ/liKrpmaTlgJnpgbgnKSk7XG5cdFx0V2luZG93LnNldFNjcmlwdE5hbWUoJ1R3aW5rbGUnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpOaWuemSiCcsICflv6vpgJ/liKrpmaTmlrnph50nKSwgJ1FXOkNTRCcpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5Zu+5p2D6K6+572uJywgJ+WcluasiuioreWumicpLCAnSDpUVy9QUkVGI2ltYWdlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2ltYWdlJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS5pbWFnZS5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAmuefpeS4iuS8oOiAhScsICfpgJrnn6XkuIrlgrPogIUnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0bmFtZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+iLpeaCqOWcqOagh+iusOWQjOS4gOeUqOaIt+eahOW+iOWkmuaWh+S7tu+8jOivt+WPlua2iOatpOWkjemAieahhuS7pemBv+WFjeWPkemAgei/h+Wkmua2iOaBr+OAgkNTRCBGNeawuOi/nOS4jeS8mumAmuefpeOAgicsXG5cdFx0XHRcdFx0XHQn6Iul5oKo5Zyo5qiZ6KiY5ZCM5LiA5L2/55So6ICF55qE5b6I5aSa5qqU5qGI77yM6KuL5Y+W5raI5q2k5qC45Y+W5pa55aGK5Lul6YG/5YWN55m86YCB6YGO5aSa6KiK5oGv44CCQ1NEIEY15rC46YGg5LiN5pyD6YCa55+l44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdub3RpZnlVc2VyT25EZWxpJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGNvbnN0IGZpZWxkID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mcgOimgeeahOWKqOS9nCcsICfpnIDopoHnmoTli5XkvZwnKSxcblx0XHR9KTtcblx0XHRmaWVsZC5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3JhZGlvJyxcblx0XHRcdG5hbWU6ICd0eXBlJyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aYjuaYvuS+teadg+S5i+aWh+S7tu+8iENTRCBGMe+8iScsICfmmI7poa/kvrXmrIrkuYvmqpTmoYjvvIhDU0QgRjHvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vIHBlcm1pc3Npb24nLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfkuIrkvKDogIXlrqPnp7Dmi6XmnInvvIzogIzlnKjlhbbku5bmnaXmupDmib7liLDnmoTmlofku7bvvIzmiJbku47kvrXmnYPnmoTmnaXmupDojrflj5bnmoTmlofku7bjgIInLFxuXHRcdFx0XHRcdFx0J+S4iuWCs+iAheWuo+eoseaTgeacie+8jOiAjOWcqOWFtuS7luS+hua6kOaJvuWIsOeahOaqlOahiO+8jOaIluW+nuS+teasiueahOS+hua6kOWPluW+l+eahOaqlOahiOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdFx0XHRuYW1lOiAnZjFfc291cmNlJyxcblx0XHRcdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkvrXmnYPmnaXmupDvvJonLCAn5L615qyK5L6G5rqQ77yaJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+adpea6kOS4jeaYju+8iENTRCBGM++8iScsICfkvobmupDkuI3mmI7vvIhDU0QgRjPvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vIHNvdXJjZScsXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+acrOaWh+S7tuW5tuacquazqOaYjuWOn+Wni+WHuuWkhCcsICfmnKzmqpTmoYjkuKbmnKroqLvmmI7ljp/lp4vlh7romZUnKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5pyq55+l6JGX5L2c5p2D5oiW6JGX5L2c5p2D5peg5rOV6KKr5p+l6K+B77yIQ1NEIEYz77yJJyxcblx0XHRcdFx0XHRcdCfmnKrnn6XokZfkvZzmrIrmiJbokZfkvZzmrIrnhKHms5Xooqvmn6XorYnvvIhDU0QgRjPvvIknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vIGxpY2Vuc2UnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmnKzmlofku7bnvLrlsJHokZfkvZzmnYPkv6Hmga/vvIzmiJblo7Dnp7DnmoTokZfkvZzmnYPkv6Hmga/ml6Dms5Xooqvmn6Xor4EnLFxuXHRcdFx0XHRcdFx0J+acrOaqlOahiOe8uuWwkeiRl+S9nOasiuizh+ioiu+8jOaIluiBsueoseeahOiRl+S9nOasiuizh+ioiueEoeazleiiq+afpeitiSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmnaXmupDkuI3mmI7kuJTmnKrnn6XokZfkvZzmnYPmiJbokZfkvZzmnYPml6Dms5Xooqvmn6Xor4HvvIhDU0QgRjPvvIknLFxuXHRcdFx0XHRcdFx0J+S+hua6kOS4jeaYjuS4lOacquefpeiRl+S9nOasiuaIluiRl+S9nOasiueEoeazleiiq+afpeitie+8iENTRCBGM++8iSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm8gc291cmNlIG5vIGxpY2Vuc2UnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmnKzmlofku7blubbmnKrms6jmmI7ljp/lp4vlh7rlpITvvIzkuJTmnKzmlofku7bnvLrlsJHokZfkvZzmnYPkv6Hmga/miJblo7Dnp7DnmoTokZfkvZzmnYPkv6Hmga/ml6Dms5Xooqvmn6Xor4EnLFxuXHRcdFx0XHRcdFx0J+acrOaqlOahiOS4puacquiou+aYjuWOn+Wni+WHuuiZle+8jOS4lOacrOaqlOahiOe8uuWwkeiRl+S9nOasiuizh+ioiuaIluiBsueoseeahOiRl+S9nOasiuizh+ioiueEoeazleiiq+afpeitiSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y+v6KKr5pu/5Luj55qE6Z2e6Ieq55Sx6JGX5L2c5p2D5paH5Lu277yIQ1NEIEY077yJJywgJ+WPr+iiq+abv+S7o+eahOmdnuiHqueUseiRl+S9nOasiuaqlOahiO+8iENTRCBGNO+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAncmVwbGFjZWFibGUgZmFpciB1c2UnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmlofku7bku4XnlKjkuo7mj4/ov7DjgIHor4bliKvmiJbor4Torrrmlofku7bkuK3lsZXnpLrnmoTkuovnianvvIzmiJbku4XnlKjkvZzmj5Llm77vvIzkuJTmu6HotrPku6XkuIvlm5vkuKrmnaHku7bkuYvkuIDjgILoi6Xnu5nlh7rkuoblhbbku5blkIjnkIbkvb/nlKjkvp3mja7vvIzkuI3pgILnlKjmnKzmnaHjgILlpoLlr7nmlofku7bnmoTlj6/mm7/ku6PmgKflrZjlnKjkuonorq7vvIzlupTkuqTmlofku7blrZjlup/orqjorrrlpITnkIbjgILmnKzmnaHkuZ/kuI3pgILnlKjkuo7mraPlnKjmiJbmm77nu4/nlLHmlofku7blrZjlup/orqjorrrlpITnkIbov4fnmoTmlofku7bjgIInLFxuXHRcdFx0XHRcdFx0J+aqlOahiOWDheeUqOaWvOaPj+i/sOOAgei+qOitmOaIluipleirluaqlOahiOS4reWxleekuueahOS6i+eJqe+8jOaIluWDheeUqOS9nOaPkuWclu+8jOS4lOa7v+i2s+S7peS4i+Wbm+WAi+aineS7tuS5i+S4gOOAguiLpee1puWHuuS6huWFtuS7luWQiOeQhuS9v+eUqOS+neaTmu+8jOS4jemBqeeUqOacrOaineOAguWmguWwjeaqlOahiOeahOWPr+abv+S7o+aAp+WtmOWcqOeIreitsO+8jOaHieS6pOaqlOahiOWtmOW7ouiojuirluiZleeQhuOAguacrOaineS5n+S4jemBqeeUqOaWvOato+WcqOaIluabvue2k+eUseaqlOahiOWtmOW7ouiojuirluiZleeQhumBjueahOaqlOahiOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdFx0XHRuYW1lOiAnZjRfdHlwZScsXG5cdFx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAgueUqOexu+Wei++8micsICfpgannlKjpoZ7liKXvvJonKSxcblx0XHRcdFx0XHRcdHN0eWxlOiAnd2lkdGg6IDg1JTsnLFxuXHRcdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K+36YCJ5oupJywgJ+iri+mBuOaThycpLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn5pyJ5YW25LuW6Ieq55Sx6JGX5L2c5p2D5paH5Lu25bGV56S655u45ZCM55qE5LqL54mpJyxcblx0XHRcdFx0XHRcdFx0XHRcdCfmnInlhbbku5boh6rnlLHokZfkvZzmrIrmqpTmoYjlsZXnpLrnm7jlkIznmoTkuovniaknXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJzEnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfmlofku7bmj4/ov7DnmoTmmK/lnKjkuJbmiJblgYflrprlnKjkuJbkurrnianjgIHku43nhLblrZjlnKjnmoTlu7rnrZHjgIHlrqTlpJbpm5XloZHmiJbku43nhLblnKjllK7nmoTllYblk4HvvIzkuJTpooTorqHoh6rooYzmi43mkYTnmoTnhafniYfkuI3lj5fku5bkurrokZfkvZzmnYPkv53miqQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+aqlOahiOaPj+i/sOeahOaYr+WcqOS4luaIluWBh+WumuWcqOS4luS6uueJqeOAgeS7jeeEtuWtmOWcqOeahOW7uuevieOAgeWupOWklumbleWhkeaIluS7jeeEtuWcqOWUrueahOWVhuWTge+8jOS4lOmgkOioiOiHquihjOaLjeaUneeahOebuOeJh+S4jeWPl+S7luS6uuiRl+S9nOasiuS/neittydcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnMicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlofku7bkuLrlj6/oh6rooYznu5jliLbnmoTlnLDlm77miJblm77ooagnLCAn5qqU5qGI54K65Y+v6Ieq6KGM57mq6KO955qE5Zyw5ZyW5oiW5ZyW6KGoJyksXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICczJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn5paH5Lu25p2l6Ieq5ZWG5Lia5Zu+54mH5py65p6E77yI5aaCR2V0dHnvvIknLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+aqlOahiOS+huiHquWVhualreWclueJh+apn+ani++8iOWmgkdldHR577yJJ1xuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICc0Jyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5rKh5pyJ6KKr5p2h55uu5L2/55So55qE6Z2e6Ieq55Sx6JGX5L2c5p2D5paH5Lu277yIQ1NEIEY177yJJyxcblx0XHRcdFx0XHRcdCfmspLmnInooqvmop3nm67kvb/nlKjnmoTpnZ7oh6rnlLHokZfkvZzmrIrmqpTmoYjvvIhDU0QgRjXvvIknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogJ29ycGhhbmVkIGZhaXIgdXNlJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5pys5paH5Lu25Li66Z2e6Ieq55Sx6JGX5L2c5p2D5LiU5rKh5pyJ6KKr5p2h55uu5L2/55SoJyxcblx0XHRcdFx0XHRcdCfmnKzmqpTmoYjngrrpnZ7oh6rnlLHokZfkvZzmrIrkuJTmspLmnInooqvmop3nm67kvb/nlKgnXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5rKh5pyJ5aGr5YaZ5Lu75L2V5ZCI55CG5L2/55So5L6d5o2u55qE6Z2e6Ieq55Sx6JGX5L2c5p2D5paH5Lu277yIQ1NEIEY177yJJyxcblx0XHRcdFx0XHRcdCfmspLmnInloavlr6vku7vkvZXlkIjnkIbkvb/nlKjkvp3mk5rnmoTpnZ7oh6rnlLHokZfkvZzmrIrmqpTmoYjvvIhDU0QgRjXvvIknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vIGZhaXIgdXNlIHJhdGlvbmFsZScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+S4jemAgueUqOS6juacieS6ieiuruS9huWujOaVtOeahOWQiOeQhuS9v+eUqOS+neaNruOAguiLpemdnuiHqueUseiRl+S9nOadg+aWh+S7tuWPquaciemDqOWIhuadoeebrueahOS9v+eUqOS+neaNru+8jOS9huWQjOaXtuiiq+S9v+eUqOS6juacquaPkOS+m+WQiOeQhuS9v+eUqOS+neaNrueahOadoeebru+8jOWImeacrOaWuemSiOS5n+S4jemAgueUqOOAgicsXG5cdFx0XHRcdFx0XHQn5LiN6YGp55So5pa85pyJ54it6K2w5L2G5a6M5pW055qE5ZCI55CG5L2/55So5L6d5pOa44CC6Iul6Z2e6Ieq55Sx6JGX5L2c5qyK5qqU5qGI5Y+q5pyJ6YOo5YiG5qKd55uu55qE5L2/55So5L6d5pOa77yM5L2G5ZCM5pmC6KKr5L2/55So5pa85pyq5o+Q5L6b5ZCI55CG5L2/55So5L6d5pOa55qE5qKd55uu77yM5YmH5pys5pa56Yed5Lmf5LiN6YGp55So44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0V2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdC8vIFdlIG11c3QgaW5pdCB0aGUgcGFyYW1ldGVyc1xuXHRcdGNvbnN0IGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXHRcdGV2dC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdHJlc3VsdC50eXBlWzBdLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0fTtcblx0VHdpbmtsZS5pbWFnZS5jYWxsYmFjay5ldmFsdWF0ZSA9IChldmVudCkgPT4ge1xuXHRcdGxldCB0eXBlO1xuXHRcdGxldCBub3RpZnkgPSBldmVudC50YXJnZXQubm90aWZ5LmNoZWNrZWQ7XG5cdFx0Y29uc3QgdHlwZXMgPSBldmVudC50YXJnZXQudHlwZTtcblx0XHRmb3IgKGNvbnN0IHR5cGVfIG9mIHR5cGVzKSB7XG5cdFx0XHRpZiAodHlwZV8uY2hlY2tlZCkge1xuXHRcdFx0XHR0eXBlID0gdHlwZV8udmFsdWVzO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0bGV0IGNzZGNyaXQ7XG5cdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRjYXNlICdubyBzb3VyY2UnOlxuXHRcdFx0XHRjc2Rjcml0ID0gJ2YzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdubyBsaWNlbnNlJzpcblx0XHRcdFx0Y3NkY3JpdCA9ICdmMyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbm8gc291cmNlIG5vIGxpY2Vuc2UnOlxuXHRcdFx0XHRjc2Rjcml0ID0gJ2YzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdvcnBoYW5lZCBmYWlyIHVzZSc6XG5cdFx0XHRcdGNzZGNyaXQgPSAnZjUnO1xuXHRcdFx0XHRub3RpZnkgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdubyBwZXJtaXNzaW9uJzpcblx0XHRcdFx0Y3NkY3JpdCA9ICdmMSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbm8gZmFpciB1c2UgcmF0aW9uYWxlJzpcblx0XHRcdFx0Y3NkY3JpdCA9ICdmNSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVwbGFjZWFibGUgZmFpciB1c2UnOlxuXHRcdFx0XHRjc2Rjcml0ID0gJ2Y0Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1R3aW5rbGUuaW1hZ2UuY2FsbGJhY2suZXZhbHVhdGXvvJrmnKrnn6XmnaHmrL4nKTtcblx0XHR9XG5cdFx0Y29uc3QgbG9nbm9taW5hdGlvbiA9XG5cdFx0XHRUd2lua2xlLmdldFByZWYoJ2xvZ1NwZWVkeU5vbWluYXRpb25zJykgJiZcblx0XHRcdCFUd2lua2xlLmdldFByZWYoJ25vTG9nT25TcGVlZHlOb21pbmF0aW9uJykuaW5jbHVkZXMoY3NkY3JpdC50b0xvd2VyQ2FzZSgpKTtcblx0XHRjb25zdCB0ZW1wbGF0ZW5hbWUgPSB0eXBlO1xuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdHR5cGUsXG5cdFx0XHR0ZW1wbGF0ZW5hbWUsXG5cdFx0XHRub3JtYWxpemVkOiBjc2Rjcml0LFxuXHRcdFx0bG9nbm9taW5hdGlvbixcblx0XHR9O1xuXHRcdGlmIChjc2Rjcml0ID09PSAnZjEnKSB7XG5cdFx0XHRwYXJhbXMuZjFfc291cmNlID0gZXZlbnQudGFyZ2V0Wyd0eXBlLmYxX3NvdXJjZSddLnZhbHVlO1xuXHRcdH1cblx0XHRpZiAoY3NkY3JpdCA9PT0gJ2Y0Jykge1xuXHRcdFx0Y29uc3QgZjRfdHlwZSA9IGV2ZW50LnRhcmdldFsndHlwZS5mNF90eXBlJ10udmFsdWU7XG5cdFx0XHRpZiAoIWY0X3R5cGUpIHtcblx0XHRcdFx0dm9pZCBtdy5ub3RpZnkod2luZG93LndnVUxTKCdDU0QgRjTvvJror7fpgInmi6npgILnlKjnsbvlnovjgIInLCAnQ1NEIEY077ya6KuL6YG45pOH6YGp55So6aGe5Yil44CCJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWltYWdlJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHBhcmFtcy5mNF90eXBlID0gZjRfdHlwZTtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChldmVudC50YXJnZXQpO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5qCH6K6w5a6M5oiQJywgJ+aomeiomOWujOaIkCcpO1xuXHRcdC8vIFRhZ2dpbmcgaW1hZ2Vcblx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeWIoOmZpOagh+iusCcsICfliqDlhaXliKrpmaTmqJnoqJgnKVxuXHRcdCk7XG5cdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0cWl1d2VuX3BhZ2UubG9hZChUd2lua2xlLmltYWdlLmNhbGxiYWNrcy50YWdnaW5nSW1hZ2UpO1xuXHRcdC8vIE5vdGlmeWluZyB1cGxvYWRlclxuXHRcdGlmIChub3RpZnkpIHtcblx0XHRcdHFpdXdlbl9wYWdlLmxvb2t1cENyZWF0aW9uKFR3aW5rbGUuaW1hZ2UuY2FsbGJhY2tzLnVzZXJOb3RpZmljYXRpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBhZGQgdG8gQ1NEIGxvZyBpZiBkZXNpcmVkXG5cdFx0XHRpZiAobG9nbm9taW5hdGlvbikge1xuXHRcdFx0XHRwYXJhbXMuZnJvbURJID0gdHJ1ZTtcblx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnVzZXIuYWRkVG9Mb2cocGFyYW1zLCBudWxsKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vIGF1dG8tbm90aWZpY2F0aW9uLCBkaXNwbGF5IHdoYXQgd2FzIGdvaW5nIHRvIGJlIGFkZGVkLlxuXHRcdFx0aWYgKHR5cGUgIT09ICdvcnBoYW5lZCBmYWlyIHVzZScpIHtcblx0XHRcdFx0Y29uc3Qgbm90ZURhdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcblx0XHRcdFx0bm90ZURhdGEuYXBwZW5kQ2hpbGQoXG5cdFx0XHRcdFx0ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXG5cdFx0XHRcdFx0XHQne3snLmNvbmNhdCgnc3Vic3Q6JywgYFVwbG9hZHZpb25vdGljZXwke01vcmViaXRzLnBhZ2VOYW1lTm9ybX19fS0tfn5gLCAnfn4nKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0J+aPkOekuicsXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0Wyfov5nkupvlhoXlrrnlupTotLTov5vkuIrkvKDogIXlr7nor53pobXvvJonLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpLCBub3RlRGF0YV0sXG5cdFx0XHRcdFx0XHRbJ+mAmeS6m+WFp+WuueaHieiyvOmAsuS4iuWCs+iAheiojuirlumgge+8micsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJyksIG5vdGVEYXRhXVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuaW1hZ2UuY2FsbGJhY2tzID0ge1xuXHRcdHRhZ2dpbmdJbWFnZTogKHBhZ2VvYmopID0+IHtcblx0XHRcdGxldCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdC8vIHJlbW92ZSB0YWcgLSBkZWxldGlvbi10YWdnZWQgZmlsZXMgY2Fubm90IGJlIG1vdmVkXG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKFxuXHRcdFx0XHQvXFx7XFx7KG10Y3woY29weSB8bW92ZSApP3RvID8oc2hhcmV8Y29tbW9ucyl8bW92ZSB0byAocWl1d2VuIHNoYXJlfHdpa2ltZWRpYSBjb21tb25zKXxjb3B5IHRvIChxaXV3ZW4gc2hhcmV8d2lraW1lZGlhIGNvbW1vbnMpKVtefV0qXFx9XFx9L2dpLFxuXHRcdFx0XHQnJ1xuXHRcdFx0KTtcblx0XHRcdC8vIEFkZGluZyBkaXNjdXNzaW9uXG5cdFx0XHRpZiAocGFyYW1zLnR5cGUgIT09ICdvcnBoYW5lZCBmYWlyIHVzZScpIHtcblx0XHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdCdRaXV3ZW5fdGFsazrlrZjlup/orqjorrov5paH5Lu25b+r6YCf5Yig6Zmk5o+Q5oqlJyxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeW/q+mAn+WIoOmZpOiusOW9lemhuScsICfliqDlhaXlv6vpgJ/liKrpmaToqJjpjITpoIUnKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRcdHFpdXdlbl9wYWdlLmxvYWQoVHdpbmtsZS5pbWFnZS5jYWxsYmFja3MuaW1hZ2VMaXN0KTtcblx0XHRcdH1cblx0XHRcdGxldCB0YWcgPSAnJztcblx0XHRcdHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSAnb3JwaGFuZWQgZmFpciB1c2UnOlxuXHRcdFx0XHRcdHRhZyA9ICd7eycuY29uY2F0KCdzdWJzdDonLCAnb3JwaGFuZWQgZmFpciB1c2V9fVxcbicpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdubyBwZXJtaXNzaW9uJzpcblx0XHRcdFx0XHR0YWcgPSAne3snLmNvbmNhdChcblx0XHRcdFx0XHRcdCdzdWJzdDonLFxuXHRcdFx0XHRcdFx0YCR7cGFyYW1zLnRlbXBsYXRlbmFtZX0vYXV0b3wxPSR7cGFyYW1zLmYxX3NvdXJjZVxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvaHR0cC9nLCAnJiMxMDQ7dHRwJylcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL1xcbisvZywgJ1xcbicpXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9eXFxzKihbXipdKS9nbSwgJyogJDEnKVxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXlxcKiAkL20sICcnKX19fVxcbmBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyZXBsYWNlYWJsZSBmYWlyIHVzZSc6XG5cdFx0XHRcdFx0dGFnID0gJ3t7Jy5jb25jYXQoJ3N1YnN0OicsIGAke3BhcmFtcy50ZW1wbGF0ZW5hbWV9L2F1dG98MT0ke3BhcmFtcy5mNF90eXBlfX19XFxuYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0dGFnID0gJ3t7Jy5jb25jYXQoJ3N1YnN0OicsIGAke3BhcmFtcy50ZW1wbGF0ZW5hbWV9L2F1dG99fVxcbmApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdGV4dE5vU2QgPSB0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdC9cXHtcXHtcXHMqKGRiKC1cXHcqKT98ZHxkZWxldGV8KD86aGFuZ3xob2xkKVstIF0/b24pXFxzKihcXHwoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pKik/XFx9XFx9XFxzKi9naSxcblx0XHRcdFx0Jydcblx0XHRcdCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRleHQgIT09IHRleHROb1NkICYmXG5cdFx0XHRcdGNvbmZpcm0od2luZG93LndnVUxTKCflnKjpobXpnaLkuIrmib7liLDlv6vpgJ/liKDpmaTmqKHmnb/vvIzopoHnp7vpmaTlkJfvvJ8nLCAn5Zyo6aCB6Z2i5LiK5om+5Yiw5b+r6YCf5Yiq6Zmk5qih5p2/77yM6KaB56e76Zmk5ZeO77yfJykpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGV4dCA9IHRleHROb1NkO1xuXHRcdFx0fVxuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dCh0YWcgKyB0ZXh0KTtcblx0XHRcdGxldCBlZGl0U3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn6K+35rGC5b+r6YCf5Yig6Zmk77yIJywgJ+iri+axguW/q+mAn+WIqumZpO+8iCcpO1xuXHRcdFx0ZWRpdFN1bW1hcnkgKz0gYFtbUVc6Q1NEIyR7cGFyYW1zLm5vcm1hbGl6ZWQudG9VcHBlckNhc2UoKX18Q1NEICR7cGFyYW1zLm5vcm1hbGl6ZWQudG9VcHBlckNhc2UoKX1dXWA7XG5cdFx0XHRlZGl0U3VtbWFyeSArPSAn77yJJztcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoZWRpdFN1bW1hcnkpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ2RlbGlXYXRjaFBhZ2UnKSk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZSgpO1xuXHRcdH0sXG5cdFx0dXNlck5vdGlmaWNhdGlvbjogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRjb25zdCBpbml0aWFsQ29udHJpYiA9IHBhZ2VvYmouZ2V0Q3JlYXRvcigpO1xuXHRcdFx0Ly8gZGlzYWxsb3cgd2FybmluZyB5b3Vyc2VsZlxuXHRcdFx0aWYgKGluaXRpYWxDb250cmliID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHtcblx0XHRcdFx0cGFnZW9ialxuXHRcdFx0XHRcdC5nZXRTdGF0dXNFbGVtZW50KClcblx0XHRcdFx0XHQud2Fybihg5oKo77yIJHtpbml0aWFsQ29udHJpYn3vvIkke3dpbmRvdy53Z1VMUygn5Yib5bu65LqG6K+l6aG177yM6Lez6L+H6YCa55+lJywgJ+W7uueri+S6huipsumgge+8jOi3s+mBjumAmuefpScpfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdGFsa1BhZ2VOYW1lID0gYFVzZXIgdGFsazoke2luaXRpYWxDb250cmlifWA7XG5cdFx0XHRcdGNvbnN0IHVzZXJ0YWxrcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0dGFsa1BhZ2VOYW1lLFxuXHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn6YCa55+l5LiK5Lyg6ICFJywgJ+mAmuefpeS4iuWCs+iAhScpfe+8iCR7aW5pdGlhbENvbnRyaWJ977yJYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBub3RpZnl0ZXh0ID0gJ1xcbnt7Jy5jb25jYXQoXG5cdFx0XHRcdFx0J3N1YnN0OicsXG5cdFx0XHRcdFx0YERpLSR7cGFyYW1zLnRlbXBsYXRlbmFtZX0tbm90aWNlfDE9JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19fX0tLX5+YCxcblx0XHRcdFx0XHQnfn4nXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRBcHBlbmRUZXh0KG5vdGlmeXRleHQpO1xuXHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfpgJrnn6XvvJrmlofku7ZbWycsICfpgJrnn6XvvJrmqpTmoYhbWycpICtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ11d5b+r6YCf5Yig6Zmk5o+Q5ZCNJywgJ11d5b+r6YCf5Yiq6Zmk5o+Q5ZCNJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ2RlbGlXYXRjaFVzZXInKSk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5hcHBlbmQoKTtcblx0XHRcdH1cblx0XHRcdC8vIGFkZCB0aGlzIG5vbWluYXRpb24gdG8gdGhlIHVzZXIncyB1c2Vyc3BhY2UgbG9nLCBpZiB0aGUgdXNlciBoYXMgZW5hYmxlZCBpdFxuXHRcdFx0aWYgKHBhcmFtcy5sb2dub21pbmF0aW9uKSB7XG5cdFx0XHRcdHBhcmFtcy5mcm9tREkgPSB0cnVlO1xuXHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MudXNlci5hZGRUb0xvZyhwYXJhbXMsIGluaXRpYWxDb250cmliKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGltYWdlTGlzdDogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHQvLyBjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dChgJHt0ZXh0fVxcbiogW1s6JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV0tLX5+YC5jb25jYXQoJ35+JykpO1xuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShg5Yqg5YWlW1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWApO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZSgpO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuaW1hZ2UsICdpbWFnZScpO1xufSkoKTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQge2FwaX0gZnJvbSAnLi9hcGknO1xuXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGVwcm90ZWN0LmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZXByb3RlY3QoJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0LyoqXG5cdCAqIHR3aW5rbGVwcm90ZWN0LmpzOiBQcm90ZWN0L1JQUCBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiUFBcIi9cIlJQUFwiKVxuXHQgKiBBY3RpdmUgb246IE5vbi1zcGVjaWFsLCBub24tTWVkaWFXaWtpIHBhZ2VzXG5cdCAqL1xuXHQvLyBOb3RlOiBhIGxvdCBvZiBjb2RlIGluIHRoaXMgbW9kdWxlIGlzIHJlLXVzZWQvY2FsbGVkIGJ5IGJhdGNocHJvdGVjdC5cblx0VHdpbmtsZS5wcm90ZWN0ID0gKCkgPT4ge1xuXHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpIDwgMCB8fCBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSA4KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRUd2lua2xlLnByb3RlY3QuY2FsbGJhY2ssXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+S/neaKpCcsICfkv53orbcnKSxcblx0XHRcdCd0dy1ycHAnLFxuXHRcdFx0TW9yZWJpdHMudXNlcklzU3lzb3AgPyB3aW5kb3cud2dVTFMoJ+S/neaKpOmhtemdoicsICfkv53orbfpoIHpnaInKSA6IHdpbmRvdy53Z1VMUygn6K+35rGC5L+d5oqk6aG16Z2iJywgJ+iri+axguS/neitt+mggemdoicpXG5cdFx0KTtcblx0fTtcblx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjIwLCA1MzApO1xuXHRcdFdpbmRvdy5zZXRUaXRsZShcblx0XHRcdE1vcmViaXRzLnVzZXJJc1N5c29wXG5cdFx0XHRcdD8gd2luZG93LndnVUxTKCfmlr3ooYzmiJbor7fmsYLkv53miqTpobXpnaInLCAn5pa96KGM5oiW6KuL5rGC5L+d6K236aCB6Z2iJylcblx0XHRcdFx0OiB3aW5kb3cud2dVTFMoJ+ivt+axguS/neaKpOmhtemdoicsICfoq4vmsYLkv53orbfpoIHpnaInKVxuXHRcdCk7XG5cdFx0V2luZG93LnNldFNjcmlwdE5hbWUoJ1R3aW5rbGUnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+S/neaKpOaWuemSiCcsICfkv53orbfmlrnph50nKSwgJ1FXOlBST1QnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+S/neaKpOiuvue9ricsICfkv53orbfoqK3lrponKSwgJ0g6VFcvUFJFRiNwcm90ZWN0Jyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI3Byb3RlY3QnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suZXZhbHVhdGUpO1xuXHRcdGNvbnN0IGFjdGlvbmZpZWxkID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aTjeS9nOexu+WeiycsICfmk43kvZzpoZ7liKUnKSxcblx0XHR9KTtcblx0XHRpZiAoTW9yZWJpdHMudXNlcklzU3lzb3ApIHtcblx0XHRcdGFjdGlvbmZpZWxkLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdyYWRpbycsXG5cdFx0XHRcdG5hbWU6ICdhY3Rpb250eXBlJyxcblx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5jaGFuZ2VBY3Rpb24sXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkv53miqTpobXpnaInLCAn5L+d6K236aCB6Z2iJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3Byb3RlY3QnLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFjdGlvbmZpZWxkLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAncmFkaW8nLFxuXHRcdFx0bmFtZTogJ2FjdGlvbnR5cGUnLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5jaGFuZ2VBY3Rpb24sXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fmsYLkv53miqTpobXpnaInLCAn6KuL5rGC5L+d6K236aCB6Z2iJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdyZXF1ZXN0Jyxcblx0XHRcdFx0XHR0b29sdGlwOlxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfoi6Xmgqjmg7PlnKhRVzpSRlBQ6K+35rGC5L+d5oqk5q2k6aG1JywgJ+iLpeaCqOaDs+WcqFFXOlJGUFDoq4vmsYLkv53orbfmraTpoIEnKSArXG5cdFx0XHRcdFx0XHQoTW9yZWJpdHMudXNlcklzU3lzb3AgPyAn6ICM5LiN5piv6Ieq6KGM5a6M5oiQ44CCJyA6ICfjgIInKSxcblx0XHRcdFx0XHRjaGVja2VkOiAhTW9yZWJpdHMudXNlcklzU3lzb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnlKjkv53miqTmqKHmnb/moIforrDmraTpobUnLCAn55So5L+d6K235qih5p2/5qiZ6KiY5q2k6aCBJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd0YWcnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5Y+v5Lul55So5q2k5Li66aG16Z2i5Yqg5LiK5ZCI6YCC55qE5L+d5oqk5qih5p2/44CCJywgJ+WPr+S7peeUqOatpOeCuumggemdouWKoOS4iuWQiOmBqeeahOS/neitt+aooeadv+OAgicpLFxuXHRcdFx0XHRcdGRpc2FibGVkOiBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpID09PSAwIHx8IG13LmNvbmZpZy5nZXQoJ3dnUGFnZUNvbnRlbnRNb2RlbCcpID09PSAnU2NyaWJ1bnRvJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupCcsICfpoJDoqK0nKSxcblx0XHRcdG5hbWU6ICdmaWVsZF9wcmVzZXQnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogJzEnLFxuXHRcdFx0bmFtZTogJ2ZpZWxkMScsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiAnMicsXG5cdFx0XHRuYW1lOiAnZmllbGQyJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0XHQvLyBXZSBtdXN0IGluaXQgdGhlIGNvbnRyb2xzXG5cdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0cmVzdWx0LmFjdGlvbnR5cGVbMF0uZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdC8vIGdldCBjdXJyZW50IHByb3RlY3Rpb24gbGV2ZWwgYXN5bmNocm9ub3VzbHlcblx0XHRUd2lua2xlLnByb3RlY3QuZmV0Y2hQcm90ZWN0aW9uTGV2ZWwoKTtcblx0fTtcblx0Ly8gQ3VzdG9taXphYmxlIG5hbWVzcGFjZSBhbmQgRmxhZ2dlZFJldnMgc2V0dGluZ3Ncblx0Ly8gSW4gdGhlb3J5IGl0J2QgYmUgbmljZSB0byBoYXZlIHJlc3RyaWN0aW9ubGV2ZWxzIGRlZmluZWQgaGVyZSxcblx0Ly8gYnV0IHRob3NlIGFyZSBvbmx5IGF2YWlsYWJsZSB2aWEgYSBzaXRlaW5mbyBxdWVyeVxuXHQvLyBMaW1pdCB0ZW1wbGF0ZSBlZGl0b3I7IGEgVHdpbmtsZSByZXN0cmljdGlvbiwgbm90IGEgc2l0ZSBzZXR0aW5nXG5cdGNvbnN0IGlzVGVtcGxhdGUgPSBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAxMCB8fCBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSA4Mjg7XG5cdC8vIENvbnRhaW5zIHRoZSBjdXJyZW50IHByb3RlY3Rpb24gbGV2ZWwgaW4gYW4gb2JqZWN0XG5cdC8vIE9uY2UgZmlsbGVkLCBpdCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2U6XG5cdC8vIHsgZWRpdDogeyBsZXZlbDogXCJzeXNvcFwiLCBleHBpcnk6IDxzb21lIGRhdGU+LCBjYXNjYWRlOiB0cnVlIH0sIC4uLiB9XG5cdFR3aW5rbGUucHJvdGVjdC5jdXJyZW50UHJvdGVjdGlvbkxldmVscyA9IHt9O1xuXHRUd2lua2xlLnByb3RlY3QucHJldmlvdXNQcm90ZWN0aW9uTGV2ZWxzID0ge307XG5cdFR3aW5rbGUucHJvdGVjdC5mZXRjaFByb3RlY3Rpb25MZXZlbCA9ICgpID0+IHtcblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdGluZGV4cGFnZWlkczogdHJ1ZSxcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGxpc3Q6ICdsb2dldmVudHMnLFxuXHRcdFx0bGV0eXBlOiAncHJvdGVjdCcsXG5cdFx0XHRsZXRpdGxlOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRwcm9wOiAnaW5mbycsXG5cdFx0XHRpbnByb3A6ICdwcm90ZWN0aW9ufHdhdGNoZWQnLFxuXHRcdFx0dGl0bGVzOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0fTtcblx0XHR2b2lkIGFwaS5nZXQocGFyYW1zKS50aGVuKChwcm90ZWN0RGF0YSkgPT4ge1xuXHRcdFx0Y29uc3QgW3BhZ2VpZF0gPSBwcm90ZWN0RGF0YS5xdWVyeS5wYWdlaWRzO1xuXHRcdFx0Y29uc3QgcGFnZSA9IHByb3RlY3REYXRhLnF1ZXJ5LnBhZ2VzW3BhZ2VpZF07XG5cdFx0XHRjb25zdCBjdXJyZW50ID0ge307XG5cdFx0XHRjb25zdCBwcmV2aW91cyA9IHt9O1xuXHRcdFx0Ly8gU2F2ZSByZXF1ZXN0ZWQgcGFnZSdzIHdhdGNoZWQgc3RhdHVzIGZvciBsYXRlciBpbiBjYXNlIG5lZWRlZCB3aGVuIGZpbGluZyByZXF1ZXN0XG5cdFx0XHRUd2lua2xlLnByb3RlY3Qud2F0Y2hlZCA9IHBhZ2Uud2F0Y2hsaXN0ZXhwaXJ5IHx8IHBhZ2Uud2F0Y2hlZCA9PT0gJyc7XG5cdFx0XHRmb3IgKGNvbnN0IHByb3RlY3Rpb24gb2YgcGFnZS5wcm90ZWN0aW9uKSB7XG5cdFx0XHRcdGlmIChwcm90ZWN0aW9uLnR5cGUgIT09ICdhZnQnKSB7XG5cdFx0XHRcdFx0Y3VycmVudFtwcm90ZWN0aW9uLnR5cGVdID0ge1xuXHRcdFx0XHRcdFx0bGV2ZWw6IHByb3RlY3Rpb24ubGV2ZWwsXG5cdFx0XHRcdFx0XHRleHBpcnk6IHByb3RlY3Rpb24uZXhwaXJ5LFxuXHRcdFx0XHRcdFx0Y2FzY2FkZTogcHJvdGVjdGlvbi5jYXNjYWRlID09PSAnJyxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBPbmx5IHVzZSB0aGUgbG9nIGV4Y2VwdCB1bnByb3RlY3Rcblx0XHRcdGlmIChwcm90ZWN0RGF0YS5xdWVyeS5sb2dldmVudHMubGVuZ3RoID49IDEgJiYgcHJvdGVjdERhdGEucXVlcnkubG9nZXZlbnRzWzBdLmFjdGlvbiAhPT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0W1R3aW5rbGUucHJvdGVjdC5wcmV2aW91c1Byb3RlY3Rpb25Mb2ddID0gcHJvdGVjdERhdGEucXVlcnkubG9nZXZlbnRzO1xuXHRcdFx0fSBlbHNlIGlmIChwcm90ZWN0RGF0YS5xdWVyeS5sb2dldmVudHMubGVuZ3RoID49IDIpIHtcblx0XHRcdFx0WywgVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZ10gPSBwcm90ZWN0RGF0YS5xdWVyeS5sb2dldmVudHM7XG5cdFx0XHR9XG5cdFx0XHRpZiAoVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3RlY3Rpb24gb2YgVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZy5wYXJhbXMuZGV0YWlscykge1xuXHRcdFx0XHRcdGlmIChwcm90ZWN0aW9uLnR5cGUgIT09ICdhZnQnKSB7XG5cdFx0XHRcdFx0XHRwcmV2aW91c1twcm90ZWN0aW9uLnR5cGVdID0ge1xuXHRcdFx0XHRcdFx0XHRsZXZlbDogcHJvdGVjdGlvbi5sZXZlbCxcblx0XHRcdFx0XHRcdFx0ZXhwaXJ5OiBwcm90ZWN0aW9uLmV4cGlyeSxcblx0XHRcdFx0XHRcdFx0Y2FzY2FkZTogcHJvdGVjdGlvbi5jYXNjYWRlID09PSAnJyxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBzaG93IHRoZSBwcm90ZWN0aW9uIGxldmVsIGFuZCBsb2cgaW5mb1xuXHRcdFx0VHdpbmtsZS5wcm90ZWN0Lmhhc1Byb3RlY3RMb2cgPSAhIXByb3RlY3REYXRhLnF1ZXJ5LmxvZ2V2ZW50cy5sZW5ndGg7XG5cdFx0XHRUd2lua2xlLnByb3RlY3QuY3VycmVudFByb3RlY3Rpb25MZXZlbHMgPSBjdXJyZW50O1xuXHRcdFx0VHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxldmVscyA9IHByZXZpb3VzO1xuXHRcdFx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLnNob3dMb2dBbmRDdXJyZW50UHJvdGVjdEluZm8oKTtcblx0XHR9KTtcblx0fTtcblx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLnNob3dMb2dBbmRDdXJyZW50UHJvdGVjdEluZm8gPSAoKSA9PiB7XG5cdFx0Y29uc3QgY3VycmVudGx5UHJvdGVjdGVkID0gT2JqZWN0LmtleXMoVHdpbmtsZS5wcm90ZWN0LmN1cnJlbnRQcm90ZWN0aW9uTGV2ZWxzKS5sZW5ndGggIT09IDA7XG5cdFx0aWYgKFR3aW5rbGUucHJvdGVjdC5oYXNQcm90ZWN0TG9nIHx8IFR3aW5rbGUucHJvdGVjdC5oYXNTdGFibGVMb2cpIHtcblx0XHRcdGNvbnN0ICRsaW5rTWFya3VwID0gJCgnPHNwYW4+Jyk7XG5cdFx0XHRpZiAoVHdpbmtsZS5wcm90ZWN0Lmhhc1Byb3RlY3RMb2cpIHtcblx0XHRcdFx0JGxpbmtNYXJrdXAuYXBwZW5kKFxuXHRcdFx0XHRcdCQoXG5cdFx0XHRcdFx0XHRgPGEgcmVsPVwibm9vcGVuZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiJHttdy51dGlsLmdldFVybCgnU3BlY2lhbDpMb2cnLCB7XG5cdFx0XHRcdFx0XHRcdGFjdGlvbjogJ3ZpZXcnLFxuXHRcdFx0XHRcdFx0XHRwYWdlOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdwcm90ZWN0Jyxcblx0XHRcdFx0XHRcdH0pfVwiPiR7d2luZG93LndnVUxTKCfkv53miqTml6Xlv5cnLCAn5L+d6K235pel6KqMJyl9PC9hPmBcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5oYXNTdGFibGVMb2cgPyAkKCc8c3Bhbj4nKS5odG1sKCcgJmJ1bGw7ICcpIDogbnVsbFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoJGJvZHkuZmluZCgnZGl2W25hbWU9XCJoYXNwcm90ZWN0bG9nXCJdIHNwYW4nKVswXSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0Y3VycmVudGx5UHJvdGVjdGVkXG5cdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoJ+WFiOWJjeS/neaKpCcsICflhYjliY3kv53orbcnKVxuXHRcdFx0XHRcdDogW1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+atpOmhtemdouabvuWcqCcsICfmraTpoIHpnaLmm77lnKgnKSxcblx0XHRcdFx0XHRcdFx0JChcblx0XHRcdFx0XHRcdFx0XHRgPGI+JHtuZXcgTW9yZWJpdHMuZGF0ZShUd2lua2xlLnByb3RlY3QucHJldmlvdXNQcm90ZWN0aW9uTG9nLnRpbWVzdGFtcCkuY2FsZW5kYXIoXG5cdFx0XHRcdFx0XHRcdFx0XHQndXRjJ1xuXHRcdFx0XHRcdFx0XHRcdCl9PC9iPmBcblx0XHRcdFx0XHRcdFx0KVswXSxcblx0XHRcdFx0XHRcdFx0YOiiqyR7VHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZy51c2VyfSR7d2luZG93LndnVUxTKCfkv53miqQnLCAn5L+d6K23Jyl977yaYCxcblx0XHRcdFx0XHRcdFx0Li4uVHdpbmtsZS5wcm90ZWN0LmZvcm1hdFByb3RlY3Rpb25EZXNjcmlwdGlvbihUd2lua2xlLnByb3RlY3QucHJldmlvdXNQcm90ZWN0aW9uTGV2ZWxzKSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdCRsaW5rTWFya3VwWzBdXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdCgkYm9keS5maW5kKCdkaXZbbmFtZT1cImN1cnJlbnRwcm90XCJdIHNwYW4nKVswXSk7XG5cdFx0bGV0IHByb3RlY3Rpb25Ob2RlID0gW107XG5cdFx0bGV0IHN0YXR1c0xldmVsID0gJ2luZm8nO1xuXHRcdHByb3RlY3Rpb25Ob2RlID0gVHdpbmtsZS5wcm90ZWN0LmZvcm1hdFByb3RlY3Rpb25EZXNjcmlwdGlvbihUd2lua2xlLnByb3RlY3QuY3VycmVudFByb3RlY3Rpb25MZXZlbHMpO1xuXHRcdGlmIChjdXJyZW50bHlQcm90ZWN0ZWQpIHtcblx0XHRcdHN0YXR1c0xldmVsID0gJ3dhcm4nO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zdGF0dXNbc3RhdHVzTGV2ZWxdKHdpbmRvdy53Z1VMUygn5b2T5YmN5L+d5oqk562J57qnJywgJ+ebruWJjeS/neitt+etiee0micpLCBwcm90ZWN0aW9uTm9kZSk7XG5cdH07XG5cdFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5jaGFuZ2VBY3Rpb24gPSAoZSkgPT4ge1xuXHRcdGxldCBmaWVsZF9wcmVzZXQ7XG5cdFx0bGV0IGZpZWxkMTtcblx0XHRsZXQgZmllbGQyO1xuXHRcdHN3aXRjaCAoZS50YXJnZXQudmFsdWVzKSB7XG5cdFx0XHRjYXNlICdwcm90ZWN0Jzpcblx0XHRcdFx0ZmllbGRfcHJlc2V0ID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupCcsICfpoJDoqK0nKSxcblx0XHRcdFx0XHRuYW1lOiAnZmllbGRfcHJlc2V0Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkX3ByZXNldC5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdG5hbWU6ICdjYXRlZ29yeScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCJ5oup6buY6K6k77yaJywgJ+mBuOaTh+mgkOiore+8micpLFxuXHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suY2hhbmdlUHJlc2V0LFxuXHRcdFx0XHRcdGxpc3Q6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJylcblx0XHRcdFx0XHRcdD8gVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlc0FkbWluXG5cdFx0XHRcdFx0XHQ6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVHlwZXNDcmVhdGUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmaWVsZDIgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L+d5oqk6YCJ6aG5JywgJ+S/neitt+mBuOmghScpLFxuXHRcdFx0XHRcdG5hbWU6ICdmaWVsZDInLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0bmFtZTogJ2N1cnJlbnRwcm90Jyxcblx0XHRcdFx0XHRsYWJlbDogJyAnLFxuXHRcdFx0XHR9KTsgLy8gaG9sZHMgdGhlIGN1cnJlbnQgcHJvdGVjdGlvbiBsZXZlbCwgYXMgZmlsbGVkIG91dCBieSB0aGUgYXN5bmMgY2FsbGJhY2tcblx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0bmFtZTogJ2hhc3Byb3RlY3Rsb2cnLFxuXHRcdFx0XHRcdGxhYmVsOiAnICcsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHQvLyBmb3IgZXhpc3RpbmcgcGFnZXNcblx0XHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHtcblx0XHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMuZWRpdG1vZGlmeSxcblx0XHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S/ruaUuee8lui+keadg+mZkCcsICfkv67mlLnnt6jovK/mrIrpmZAnKSxcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnZWRpdG1vZGlmeScsXG5cdFx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+iLpeatpOmhueWFs+mXre+8jOe8lui+keadg+mZkOWwhuS4jeS8muS/ruaUueOAgicsXG5cdFx0XHRcdFx0XHRcdFx0XHQn6Iul5q2k6aCF6Zec6ZaJ77yM57eo6Lyv5qyK6ZmQ5bCH5LiN5pyD5L+u5pS544CCJ1xuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICdlZGl0bGV2ZWwnLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn57yW6L6R5p2D6ZmQ77yaJywgJ+e3qOi8r+asiumZkO+8micpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLmVkaXRsZXZlbCxcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGV2ZWxzLmZpbHRlcihcblx0XHRcdFx0XHRcdFx0Ly8gRmlsdGVyIFRFIG91dHNpZGUgb2YgdGVtcGxhdGVzIGFuZCBtb2R1bGVzXG5cdFx0XHRcdFx0XHRcdChsZXZlbCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBpc1RlbXBsYXRlIHx8IGxldmVsLnZhbHVlICE9PSAndGVtcGxhdGVlZGl0b3InO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZpZWxkMi5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0XHRuYW1lOiAnZWRpdGV4cGlyeScsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnu4jmraLml7bpl7TvvJonLCAn57WC5q2i5pmC6ZaT77yaJyksXG5cdFx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChldmVudC50YXJnZXQudmFsdWUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmRvQ3VzdG9tRXhwaXJ5KGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0JCgnaW5wdXRbbmFtZT1zbWFsbF0nLCAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnZm9ybScpKVswXS5jaGVja2VkID1cblx0XHRcdFx0XHRcdFx0XHRldmVudC50YXJnZXQuc2VsZWN0ZWRJbmRleCA+PSA0OyAvLyAxIG1vbnRoXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQvLyBkZWZhdWx0IGV4cGlyeSBzZWxlY3Rpb24gKDIgZGF5cykgaXMgY29uZGl0aW9uYWxseSBzZXQgaW4gVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmNoYW5nZVByZXNldFxuXHRcdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZW5ndGhzLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZpZWxkMi5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5tb3ZlbW9kaWZ5LFxuXHRcdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L+u5pS556e75Yqo5p2D6ZmQJywgJ+S/ruaUueenu+WLleasiumZkCcpLFxuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdtb3ZlbW9kaWZ5Jyxcblx0XHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn6Iul5q2k6aG56KKr5YWz6Zet77yM56e75Yqo5p2D6ZmQ5bCG5LiN6KKr5L+u5pS544CCJyxcblx0XHRcdFx0XHRcdFx0XHRcdCfoi6XmraTpoIXooqvpl5zplonvvIznp7vli5XmrIrpmZDlsIfkuI3ooqvkv67mlLnjgIInXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ21vdmVsZXZlbCcsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vliqjmnYPpmZDvvJonLCAn56e75YuV5qyK6ZmQ77yaJyksXG5cdFx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMubW92ZWxldmVsLFxuXHRcdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZXZlbHMuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHQvLyBBdXRvY29uZmlybWVkIGlzIHJlcXVpcmVkIGZvciBhIG1vdmUsIHJlZHVuZGFudFxuXHRcdFx0XHRcdFx0XHQobGV2ZWwpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0bGV2ZWwudmFsdWUgIT09ICdhdXRvY29uZmlybWVkJyAmJiAoaXNUZW1wbGF0ZSB8fCBsZXZlbC52YWx1ZSAhPT0gJ3RlbXBsYXRlZWRpdG9yJylcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZpZWxkMi5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0XHRuYW1lOiAnbW92ZWV4cGlyeScsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnu4jmraLml7bpl7TvvJonLCAn57WC5q2i5pmC6ZaT77yaJyksXG5cdFx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChldmVudC50YXJnZXQudmFsdWUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmRvQ3VzdG9tRXhwaXJ5KGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQvLyBkZWZhdWx0IGV4cGlyeSBzZWxlY3Rpb24gKDIgZGF5cykgaXMgY29uZGl0aW9uYWxseSBzZXQgaW4gVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmNoYW5nZVByZXNldFxuXHRcdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZW5ndGhzLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGZvciBub24tZXhpc3RpbmcgcGFnZXNcblx0XHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ2NyZWF0ZWxldmVsJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIm+W7uuadg+mZkO+8micsICflu7rnq4vmrIrpmZDvvJonKSxcblx0XHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5jcmVhdGVsZXZlbCxcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGV2ZWxzLmZpbHRlcihcblx0XHRcdFx0XHRcdFx0Ly8gRmlsdGVyIFRFIGFsd2F5cywgYW5kIGF1dG9jb25maXJtZWQgaW4gbWFpbnNwYWNlXG5cdFx0XHRcdFx0XHRcdChsZXZlbCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBsZXZlbC52YWx1ZSAhPT0gJ3RlbXBsYXRlZWRpdG9yJztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ2NyZWF0ZWV4cGlyeScsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnu4jmraLml7bpl7TvvJonLCAn57WC5q2i5pmC6ZaT77yaJyksXG5cdFx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChldmVudC50YXJnZXQudmFsdWUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmRvQ3VzdG9tRXhwaXJ5KGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQvLyBkZWZhdWx0IGV4cGlyeSBzZWxlY3Rpb24gKGluZGVmaW5pdGUpIGlzIGNvbmRpdGlvbmFsbHkgc2V0IGluIFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5jaGFuZ2VQcmVzZXRcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGVuZ3Rocyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2Nsb3NlJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w6K+35rGC5L+d5oqk6aG16Z2i5Lit55qE6K+35rGCJywgJ+aomeiomOiri+axguS/neitt+mggemdouS4reeahOiri+axgicpLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRuYW1lOiAncHJvdGVjdFJlYXNvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55CG55Sx77yI5L+d5oqk5pel5b+X77yJ77yaJywgJ+eQhueUse+8iOS/neitt+aXpeiqjO+8ie+8micpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpIHx8IG13LmNvbmZpZy5nZXQoJ3dnUGFnZUNvbnRlbnRNb2RlbCcpID09PSAnU2NyaWJ1bnRvJykge1xuXHRcdFx0XHRcdC8vIHRhZ2dpbmcgaXNuJ3QgcmVsZXZhbnQgZm9yIG5vbi1leGlzdGluZyBvciBtb2R1bGUgcGFnZXNcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAndGFnJzpcblx0XHRcdFx0ZmllbGQxID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOmAiemhuScsICfmqJnoqJjpgbjpoIUnKSxcblx0XHRcdFx0XHRuYW1lOiAnZmllbGQxJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdG5hbWU6ICdjdXJyZW50cHJvdCcsXG5cdFx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdFx0fSk7IC8vIGhvbGRzIHRoZSBjdXJyZW50IHByb3RlY3Rpb24gbGV2ZWwsIGFzIGZpbGxlZCBvdXQgYnkgdGhlIGFzeW5jIGNhbGxiYWNrXG5cdFx0XHRcdGZpZWxkMS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdG5hbWU6ICdoYXNwcm90ZWN0bG9nJyxcblx0XHRcdFx0XHRsYWJlbDogJyAnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQxLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bmFtZTogJ3RhZ3R5cGUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAieaLqeS/neaKpOaooeadv++8micsICfpgbjmk4fkv53orbfmqKHmnb/vvJonKSxcblx0XHRcdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvblRhZ3MsXG5cdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLnRhZ3R5cGUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmaWVsZDEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3NtYWxsJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L2/55So5Zu+5qCH77yIc21hbGw9eWVz77yJJywgJ+S9v+eUqOWcluekuu+8iHNtYWxsPXllc++8iScpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+Wwhue7meaooeadv+WKoOS4inxzbWFsbD15ZXPlj4LmlbDvvIzmmL7npLrmiJDlj7PkuIrop5LnmoTkuIDmiormjILplIHjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCflsIfntabmqKHmnb/liqDkuIp8c21hbGw9eWVz5Y+D5pW477yM6aGv56S65oiQ5Y+z5LiK6KeS55qE5LiA5oqK5o6b6Y6W44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ25vaW5jbHVkZScsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqCZsdDtub2luY2x1ZGUmZ3Q75YyF6KO55L+d5oqk5qih5p2/JywgJ+eUqCZsdDtub2luY2x1ZGUmZ3Q75YyF6KO55L+d6K235qih5p2/JyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5bCG5L+d5oqk5qih5p2/5YyF6KO55ZyoJmx0O25vaW5jbHVkZSZndDvkuK0nLFxuXHRcdFx0XHRcdFx0XHRcdCflsIfkv53orbfmqKHmnb/ljIXoo7nlnKgmbHQ7bm9pbmNsdWRlJmd0O+S4rSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMTAsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnc2hvd2V4cGlyeScsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOaooeadv+aYvuekuuWIsOacn+aXtumXtCcsICflnKjmqKHmnb/poa/npLrliLDmnJ/mmYLplpMnKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCflsIbnu5nmqKHmnb/liqDkuIp8ZXhwaXJ55Y+C5pWwJywgJ+Wwh+e1puaooeadv+WKoOS4inxleHBpcnnlj4PmlbgnKSxcblx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aGlkZGVuOiBlLnRhcmdldC52YWx1ZXMgPT09ICd0YWcnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyZXF1ZXN0Jzpcblx0XHRcdFx0ZmllbGRfcHJlc2V0ID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S/neaKpOexu+WeiycsICfkv53orbfpoZ7liKUnKSxcblx0XHRcdFx0XHRuYW1lOiAnZmllbGRfcHJlc2V0Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkX3ByZXNldC5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdG5hbWU6ICdjYXRlZ29yeScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn57G75Z6L5ZKM55CG55Sx77yaJywgJ+mhnuWIpeWSjOeQhueUse+8micpLFxuXHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suY2hhbmdlUHJlc2V0LFxuXHRcdFx0XHRcdGxpc3Q6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJylcblx0XHRcdFx0XHRcdD8gVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlc1xuXHRcdFx0XHRcdFx0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvblR5cGVzQ3JlYXRlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQxID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAiemhuScsICfpgbjpoIUnKSxcblx0XHRcdFx0XHRuYW1lOiAnZmllbGQxJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdG5hbWU6ICdjdXJyZW50cHJvdCcsXG5cdFx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdFx0fSk7IC8vIGhvbGRzIHRoZSBjdXJyZW50IHByb3RlY3Rpb24gbGV2ZWwsIGFzIGZpbGxlZCBvdXQgYnkgdGhlIGFzeW5jIGNhbGxiYWNrXG5cdFx0XHRcdGZpZWxkMS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdG5hbWU6ICdoYXNwcm90ZWN0bG9nJyxcblx0XHRcdFx0XHRsYWJlbDogJyAnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQxLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bmFtZTogJ2V4cGlyeScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pe26ZW/77yaJywgJ+aZgumVt++8micpLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Li05pe2JywgJ+iHqOaZgicpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3RlbXBvcmFyeScsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogJ+awuOS5hScsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnaW5maW5pdHknLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQxLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdFx0XHRsYWJlbDogJ+eQhueUse+8micsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6L+Z546p5oSP5YS/6KKr5rW36LGa5ZCD5o6J5LqG77yBJywgJ+mAmeeOqeaEj+WFkuiiq+a1t+ixmuWQg+aOieS6hu+8gScpLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVwcm90ZWN0Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRsZXQgb2xkZmllbGQ7XG5cdFx0aWYgKGZpZWxkX3ByZXNldCkge1xuXHRcdFx0W29sZGZpZWxkXSA9ICQoZS50YXJnZXQuZm9ybSkuZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3ByZXNldFwiXScpO1xuXHRcdFx0b2xkZmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZmllbGRfcHJlc2V0LnJlbmRlcigpLCBvbGRmaWVsZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoZS50YXJnZXQuZm9ybSkuZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3ByZXNldFwiXScpLmNzcygnZGlzcGxheScsICdub25lJyk7XG5cdFx0fVxuXHRcdGlmIChmaWVsZDEpIHtcblx0XHRcdFtvbGRmaWVsZF0gPSAkKGUudGFyZ2V0LmZvcm0pLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZDFcIl0nKTtcblx0XHRcdG9sZGZpZWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGZpZWxkMS5yZW5kZXIoKSwgb2xkZmllbGQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkKGUudGFyZ2V0LmZvcm0pLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZDFcIl0nKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXHRcdH1cblx0XHRpZiAoZmllbGQyKSB7XG5cdFx0XHRbb2xkZmllbGRdID0gJChlLnRhcmdldC5mb3JtKS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGQyXCJdJyk7XG5cdFx0XHRvbGRmaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmaWVsZDIucmVuZGVyKCksIG9sZGZpZWxkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JChlLnRhcmdldC5mb3JtKS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGQyXCJdJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblx0XHR9XG5cdFx0aWYgKGUudGFyZ2V0LnZhbHVlcyA9PT0gJ3Byb3RlY3QnKSB7XG5cdFx0XHQvLyBmYWtlIGEgY2hhbmdlIGV2ZW50IG9uIHRoZSBwcmVzZXQgZHJvcGRvd25cblx0XHRcdGNvbnN0IGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXHRcdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRlLnRhcmdldC5mb3JtLmNhdGVnb3J5LmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHRcdC8vIHJlZHVjZSB2ZXJ0aWNhbCBoZWlnaHQgb2YgZGlhbG9nXG5cdFx0XHQkKGUudGFyZ2V0LmZvcm0pLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZDJcIl0gc2VsZWN0JykucGFyZW50KCkuY3NzKHtcblx0XHRcdFx0ZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG5cdFx0XHRcdG1hcmdpblJpZ2h0OiAnMC41ZW0nLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIHJlLWFkZCBwcm90ZWN0aW9uIGxldmVsIGFuZCBsb2cgaW5mbywgaWYgaXQncyBhdmFpbGFibGVcblx0XHRUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suc2hvd0xvZ0FuZEN1cnJlbnRQcm90ZWN0SW5mbygpO1xuXHR9O1xuXHQvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYmF0Y2hwcm90ZWN0IGFzIHdlbGxcblx0VHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMgPSB7XG5cdFx0ZWRpdG1vZGlmeTogKGUpID0+IHtcblx0XHRcdGUudGFyZ2V0LmZvcm0uZWRpdGxldmVsLmRpc2FibGVkID0gIWUudGFyZ2V0LmNoZWNrZWQ7XG5cdFx0XHRlLnRhcmdldC5mb3JtLmVkaXRleHBpcnkuZGlzYWJsZWQgPSAhZS50YXJnZXQuY2hlY2tlZCB8fCBlLnRhcmdldC5mb3JtLmVkaXRsZXZlbC52YWx1ZSA9PT0gJ2FsbCc7XG5cdFx0XHRlLnRhcmdldC5mb3JtLmVkaXRsZXZlbC5zdHlsZS5jb2xvciA9IGUudGFyZ2V0LmNoZWNrZWQgPyAnJyA6ICd0cmFuc3BhcmVudCc7XG5cdFx0XHRlLnRhcmdldC5mb3JtLmVkaXRleHBpcnkuc3R5bGUuY29sb3IgPSBlLnRhcmdldC5jaGVja2VkID8gJycgOiAndHJhbnNwYXJlbnQnO1xuXHRcdH0sXG5cdFx0ZWRpdGxldmVsOiAoZSkgPT4ge1xuXHRcdFx0ZS50YXJnZXQuZm9ybS5lZGl0ZXhwaXJ5LmRpc2FibGVkID0gZS50YXJnZXQudmFsdWUgPT09ICdhbGwnO1xuXHRcdH0sXG5cdFx0bW92ZW1vZGlmeTogKGUpID0+IHtcblx0XHRcdC8vIHN5bmMgbW92ZSBzZXR0aW5ncyB3aXRoIGVkaXQgc2V0dGluZ3MgaWYgYXBwbGljYWJsZVxuXHRcdFx0aWYgKGUudGFyZ2V0LmZvcm0ubW92ZWxldmVsLmRpc2FibGVkICYmICFlLnRhcmdldC5mb3JtLmVkaXRsZXZlbC5kaXNhYmxlZCkge1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1vdmVsZXZlbC52YWx1ZSA9IGUudGFyZ2V0LmZvcm0uZWRpdGxldmVsLnZhbHVlO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1vdmVleHBpcnkudmFsdWUgPSBlLnRhcmdldC5mb3JtLmVkaXRleHBpcnkudmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGUudGFyZ2V0LmZvcm0uZWRpdGxldmVsLmRpc2FibGVkKSB7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubW92ZWxldmVsLnZhbHVlID0gJ3N5c29wJztcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5tb3ZlZXhwaXJ5LnZhbHVlID0gJ2luZmluaXR5Jztcblx0XHRcdH1cblx0XHRcdGUudGFyZ2V0LmZvcm0ubW92ZWxldmVsLmRpc2FibGVkID0gIWUudGFyZ2V0LmNoZWNrZWQ7XG5cdFx0XHRlLnRhcmdldC5mb3JtLm1vdmVleHBpcnkuZGlzYWJsZWQgPSAhZS50YXJnZXQuY2hlY2tlZCB8fCBlLnRhcmdldC5mb3JtLm1vdmVsZXZlbC52YWx1ZSA9PT0gJ2FsbCc7XG5cdFx0XHRlLnRhcmdldC5mb3JtLm1vdmVsZXZlbC5zdHlsZS5jb2xvciA9IGUudGFyZ2V0LmNoZWNrZWQgPyAnJyA6ICd0cmFuc3BhcmVudCc7XG5cdFx0XHRlLnRhcmdldC5mb3JtLm1vdmVleHBpcnkuc3R5bGUuY29sb3IgPSBlLnRhcmdldC5jaGVja2VkID8gJycgOiAndHJhbnNwYXJlbnQnO1xuXHRcdH0sXG5cdFx0bW92ZWxldmVsOiAoZSkgPT4ge1xuXHRcdFx0ZS50YXJnZXQuZm9ybS5tb3ZlZXhwaXJ5LmRpc2FibGVkID0gZS50YXJnZXQudmFsdWUgPT09ICdhbGwnO1xuXHRcdH0sXG5cdFx0Y3JlYXRlbGV2ZWw6IChlKSA9PiB7XG5cdFx0XHRlLnRhcmdldC5mb3JtLmNyZWF0ZWV4cGlyeS5kaXNhYmxlZCA9IGUudGFyZ2V0LnZhbHVlID09PSAnYWxsJztcblx0XHR9LFxuXHRcdHRhZ3R5cGU6IChlKSA9PiB7XG5cdFx0XHRlLnRhcmdldC5mb3JtLnNtYWxsLmRpc2FibGVkID0gZS50YXJnZXQudmFsdWUgPT09ICdub25lJyB8fCBlLnRhcmdldC52YWx1ZSA9PT0gJ25vb3AnO1xuXHRcdFx0ZS50YXJnZXQuZm9ybS5ub2luY2x1ZGUuZGlzYWJsZWQgPSBlLnRhcmdldC52YWx1ZSA9PT0gJ25vbmUnIHx8IGUudGFyZ2V0LnZhbHVlID09PSAnbm9vcCc7XG5cdFx0XHRlLnRhcmdldC5mb3JtLnNob3dleHBpcnkuZGlzYWJsZWQgPSBlLnRhcmdldC52YWx1ZSA9PT0gJ25vbmUnIHx8IGUudGFyZ2V0LnZhbHVlID09PSAnbm9vcCc7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5wcm90ZWN0LmRvQ3VzdG9tRXhwaXJ5ID0gKHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGN1c3RvbSA9IHByb21wdChcblx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+i+k+WFpeiHquWumuS5iee7iOatouaXtumXtOOAglxcbuaCqOWPr+S7peS9v+eUqOebuOWvueaXtumXtO+8jOWmguKAnDEgbWludXRl4oCd5oiW4oCcMTkgZGF5c+KAne+8jOaIlue7neWvueaXtumXtOKAnHl5eXltbWRkaGhtbeKAne+8iOWmguKAnDIwMDYwMjAxMTQwNeKAneaYrzIwMDblubQwMuaciDAx5pelMTTvvJowNe+8iFVUQ++8ie+8iScsXG5cdFx0XHRcdCfovLjlhaXoh6roqILntYLmraLmmYLplpPjgIJcXG7mgqjlj6/ku6Xkvb/nlKjnm7jlsI3mmYLplpPvvIzlpoLjgIwxIG1pbnV0ZeOAjeaIluOAjDE5IGRheXPjgI3vvIzmiJbntZXlsI3mmYLplpPjgIx5eXl5bW1kZGhobW3jgI3vvIjlpoLjgIwyMDA2MDIwMTE0MDXjgI3mmK8yMDA25bm0MDLmnIgwMeaXpTE077yaMDXvvIhVVEPvvInvvIknXG5cdFx0XHQpLFxuXHRcdFx0Jydcblx0XHQpO1xuXHRcdGlmIChjdXN0b20pIHtcblx0XHRcdGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuXHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBjdXN0b20pO1xuXHRcdFx0b3B0aW9uLnRleHRDb250ZW50ID0gY3VzdG9tO1xuXHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKG9wdGlvbik7XG5cdFx0XHR0YXJnZXQudmFsdWUgPSBjdXN0b207XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldC5zZWxlY3RlZEluZGV4ID0gMDtcblx0XHR9XG5cdH07XG5cdC8vIE5PVEU6IFRoaXMgbGlzdCBpcyB1c2VkIGJ5IGJhdGNocHJvdGVjdCBhcyB3ZWxsXG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGV2ZWxzID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiAn5YWo6YOoJyxcblx0XHRcdHZhbHVlOiAnYWxsJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7heWFgeiuuOiHquWKqOehruiupOeUqOaItycsICflg4XlhYHoqLHoh6rli5Xnorroqo3kvb/nlKjogIUnKSxcblx0XHRcdHZhbHVlOiAnYXV0b2NvbmZpcm1lZCcsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfku4XmqKHmnb/nvJbovpHlkZjlkoznrqHnkIblkZgnLCAn5YOF5qih5p2/57eo6Lyv5ZOh5ZKM566h55CG5ZOhJyksXG5cdFx0XHR2YWx1ZTogJ3RlbXBsYXRlZWRpdG9yJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7heeuoeeQhuWRmCcsICflg4XnrqHnkIblk6EnKSxcblx0XHRcdHZhbHVlOiAnc3lzb3AnLFxuXHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfku4XlhYHorrjotYTmt7HnlKjmiLcnLCAn5YOF5YWB6Kix6LOH5rex55So5oi2JyksXG5cdFx0XHR2YWx1ZTogJ3JldmlzaW9ucHJvdGVjdGVkJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7heWFgeiuuOijgeWGs+WnlOWRmCcsICflg4XlhYHoqLHoo4Hmsbrlp5Tlk6EnKSxcblx0XHRcdHZhbHVlOiAnb2ZmaWNpYWxwcm90ZWN0ZWQnLFxuXHRcdH0sXG5cdF07XG5cdC8vIGRlZmF1bHQgZXhwaXJ5IHNlbGVjdGlvbiBpcyBjb25kaXRpb25hbGx5IHNldCBpbiBUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suY2hhbmdlUHJlc2V0XG5cdC8vIE5PVEU6IFRoaXMgbGlzdCBpcyB1c2VkIGJ5IGJhdGNocHJvdGVjdCBhcyB3ZWxsXG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGVuZ3RocyA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogJzHlpKknLFxuXHRcdFx0dmFsdWU6ICcxIGRheScsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogJzPlpKknLFxuXHRcdFx0dmFsdWU6ICczIGRheXMnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnMeWRqCcsICcx6YCxJyksXG5cdFx0XHR2YWx1ZTogJzEgd2VlaycsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcy5ZGoJywgJzLpgLEnKSxcblx0XHRcdHZhbHVlOiAnMiB3ZWVrcycsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcx5Liq5pyIJywgJzHlgIvmnIgnKSxcblx0XHRcdHZhbHVlOiAnMSBtb250aCcsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcz5Liq5pyIJywgJzPlgIvmnIgnKSxcblx0XHRcdHZhbHVlOiAnMyBtb250aHMnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnNuS4quaciCcsICc25YCL5pyIJyksXG5cdFx0XHR2YWx1ZTogJzYgbW9udGhzJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnMeW5tCcsXG5cdFx0XHR2YWx1ZTogJzEgeWVhcicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfml6DpmZDmnJ8nLCAn54Sh6ZmQ5pyfJyksXG5cdFx0XHR2YWx1ZTogJ2luZmluaXR5Jyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieKApuKApicsICfoh6roqILigKbigKYnKSxcblx0XHRcdHZhbHVlOiAnY3VzdG9tJyxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvblR5cGVzQWRtaW4gPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Kej6Zmk5L+d5oqkJywgJ+ino+mZpOS/neittycpLFxuXHRcdFx0dmFsdWU6ICd1bnByb3RlY3QnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo5L+d5oqkJywgJ+WFqOS/neittycpLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bi46KeE77yI5YWo77yJJywgJ+W4uOimj++8iOWFqO+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtcHJvdGVjdGVkJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S6ieiuruOAgee8lui+keaImO+8iOWFqO+8iScsICfniK3orbDjgIHnt6jovK/miLDvvIjlhajvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLWRpc3B1dGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aooeadv+S/neaKpCcsICfmqKHmnb/kv53orbcnKSxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mrmOmjjumZqeaooeadv++8iOaooeadv++8iScsICfpq5jpoqjpmqrmqKHmnb/vvIjmqKHmnb/vvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLXRlbXBsYXRlJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfljYrkv53miqQnLCAn5Y2K5L+d6K23JyksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfluLjop4TvvIjljYrvvIknLCAn5bi46KaP77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXByb3RlY3RlZCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmjIHnu63noLTlnY/vvIjljYrvvIknLCAn5oyB57qM56C05aOe77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXZhbmRhbGlzbScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov53lj43nlJ/ogIXkvKDorrDmlrnpkojvvIjljYrvvIknLCAn6YGV5Y+N55Sf6ICF5YKz6KiY5pa56Yed77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLWJscCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflgoDlhKHnoLTlnY/vvIjljYrvvIknLCAn5YKA5YSh56C05aOe77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXNvY2snLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6auY6aOO6Zmp5qih5p2/77yI5Y2K77yJJywgJ+mrmOmiqOmaquaooeadv++8iOWNiu+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtc2VtaS10ZW1wbGF0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfooqvlsIHnpoHnlKjmiLfmu6XnlKjorqjorrrpobXvvIjljYrvvIknLCAn6KKr5bCB56aB5L2/55So6ICF5r+r55So6KiO6KuW6aCB77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXVzZXJ0YWxrJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vliqjkv53miqQnLCAn56e75YuV5L+d6K23JyksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfluLjop4TvvIjnp7vliqjvvIknLCAn5bi46KaP77yI56e75YuV77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S6ieiuruOAgeenu+WKqOaImO+8iOenu+WKqO+8iScsICfniK3orbDjgIHnp7vli5XmiLDvvIjnp7vli5XvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLW1vdmUtZGlzcHV0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vliqjnoLTlnY/vvIjnp7vliqjvvIknLCAn56e75YuV56C05aOe77yI56e75YuV77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlLXZhbmRhbGlzbScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpq5jpo47pmanpobXpnaLvvIjnp7vliqjvvIknLCAn6auY6aKo6Zqq6aCB6Z2i77yI56e75YuV77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlLWluZGVmJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XS5maWx0ZXIoXG5cdFx0KFxuXHRcdFx0Ly8gRmlsdGVyIGZvciB0ZW1wbGF0ZXNcblx0XHRcdHtsYWJlbH1cblx0XHQpID0+IHtcblx0XHRcdHJldHVybiBpc1RlbXBsYXRlIHx8IChsYWJlbCAhPT0gJ+aooeadv+S/neaKpCcgJiYgbGFiZWwgIT09ICfmqKHmnb/kv53orbcnKTtcblx0XHR9XG5cdCk7XG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVHlwZXNDcmVhdGVPbmx5ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eZvee6uOS/neaKpCcsICfnmb3ntJnkv53orbcnKSxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W4uOinhO+8iOeZvee6uO+8iScsICfluLjopo/vvIjnmb3ntJnvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLWNyZWF0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflpJrmrKHph43lpI3liJvlu7rvvIjnmb3nurjvvIknLCAn5aSa5qyh6YeN6KSH5bu656uL77yI55m957SZ77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1jcmVhdGUtcmVwZWF0Jyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aMgee7reegtOWdj++8iOeZvee6uO+8iScsICfmjIHnuoznoLTlo57vvIjnmb3ntJnvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLWNyZWF0ZS12YW5kYWxpc20nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bey5bCB56aB55So5oi355qE55So5oi36aG177yI55m957q477yJJywgJ+W3suWwgeemgeS9v+eUqOiAheeahOS9v+eUqOiAhemgge+8iOeZvee0me+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtY3JlYXRlLXVzZXJwYWdlJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlcyA9IFtcblx0XHQuLi5Ud2lua2xlLnByb3RlY3QucHJvdGVjdGlvblR5cGVzQWRtaW4sXG5cdFx0Li4uVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlc0NyZWF0ZU9ubHksXG5cdF07XG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVHlwZXNDcmVhdGUgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICfop6PpmaTkv53miqQnLFxuXHRcdFx0dmFsdWU6ICd1bnByb3RlY3QnLFxuXHRcdH0sXG5cdFx0Li4uVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlc0NyZWF0ZU9ubHksXG5cdF07XG5cdC8vIE5PVElDRToga2VlcCB0aGlzIHN5bmNoZWQgd2l0aCBbW01lZGlhV2lraTpQcm90ZWN0LWRyb3Bkb3duXV1cblx0Ly8gZXhwaXJ5IHdpbGwgb3ZlcnJpZGUgYW55IGRlZmF1bHRzXG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uUHJlc2V0c0luZm8gPSB7XG5cdFx0J3BwLXByb3RlY3RlZCc6IHtcblx0XHRcdGVkaXQ6ICdzeXNvcCcsXG5cdFx0XHRtb3ZlOiAnc3lzb3AnLFxuXHRcdFx0cmVhc29uOiBudWxsLFxuXHRcdH0sXG5cdFx0J3BwLWRpc3B1dGUnOiB7XG5cdFx0XHRlZGl0OiAnc3lzb3AnLFxuXHRcdFx0bW92ZTogJ3N5c29wJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfnvJbovpHmiJgnLCAn57eo6Lyv5oiwJyksXG5cdFx0fSxcblx0XHQncHAtdGVtcGxhdGUnOiB7XG5cdFx0XHRlZGl0OiAndGVtcGxhdGVlZGl0b3InLFxuXHRcdFx0bW92ZTogJ3RlbXBsYXRlZWRpdG9yJyxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCdbW1FXOkhSVHzpq5jpo47pmanmqKHmnb9dXScsICdbW1FXOkhSVHzpq5jpoqjpmqrmqKHmnb9dXScpLFxuXHRcdFx0dGVtcGxhdGU6ICdub29wJyxcblx0XHR9LFxuXHRcdCdwcC12YW5kYWxpc20nOiB7XG5cdFx0XHRlZGl0OiAnc3lzb3AnLFxuXHRcdFx0bW92ZTogJ3N5c29wJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfooqvoh6rliqjnoa7orqTnlKjmiLfnoLTlnY8nLCAn6KKr6Ieq5YuV56K66KqN5L2/55So6ICF56C05aOeJyksXG5cdFx0fSxcblx0XHQncHAtc29jayc6IHtcblx0XHRcdGVkaXQ6ICdzeXNvcCcsXG5cdFx0XHRtb3ZlOiAnc3lzb3AnLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+aMgee7reeahOWCgOWEoeegtOWdjycsICfmjIHnuoznmoTlgoDlhKHnoLTlo54nKSxcblx0XHR9LFxuXHRcdCdwcC1zZW1pLXZhbmRhbGlzbSc6IHtcblx0XHRcdGVkaXQ6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfooqvmlrDnlKjmiLfnoLTlnY8nLCAn6KKr5paw5L2/55So6ICF56C05aOeJyksXG5cdFx0XHR0ZW1wbGF0ZTogJ3BwLXZhbmRhbGlzbScsXG5cdFx0fSxcblx0XHQncHAtc2VtaS1ibHAnOiB7XG5cdFx0XHRlZGl0OiAnYXV0b2NvbmZpcm1lZCcsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5paw55So5oi36L+d5Y+N55Sf6ICF5Lyg6K6w5pa56ZKIJywgJ+aWsOS9v+eUqOiAhemBleWPjeeUn+iAheWCs+iomOaWuemHnScpLFxuXHRcdH0sXG5cdFx0J3BwLXNlbWktdXNlcnRhbGsnOiB7XG5cdFx0XHRlZGl0OiAnYXV0b2NvbmZpcm1lZCcsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn6KKr5bCB56aB55So5oi35rul55So5YW26K6o6K666aG1JywgJ+iiq+WwgeemgeS9v+eUqOiAhea/q+eUqOWFtuiojuirlumggScpLFxuXHRcdH0sXG5cdFx0J3BwLXNlbWktdGVtcGxhdGUnOiB7XG5cdFx0XHQvLyByZW1vdmVkIGZvciBub3dcblx0XHRcdGVkaXQ6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCdbW1FXOkhSVHzpq5jpo47pmanmqKHmnb9dXScsICdbW1FXOkhSVHzpq5jpoqjpmqrmqKHmnb9dXScpLFxuXHRcdFx0dGVtcGxhdGU6ICdub29wJyxcblx0XHR9LFxuXHRcdCdwcC1zZW1pLXNvY2snOiB7XG5cdFx0XHRlZGl0OiAnYXV0b2NvbmZpcm1lZCcsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5oyB57ut55qE5YKA5YSh56C05Z2PJywgJ+aMgee6jOeahOWCgOWEoeegtOWjnicpLFxuXHRcdFx0dGVtcGxhdGU6ICdwcC1zb2NrJyxcblx0XHR9LFxuXHRcdCdwcC1zZW1pLXByb3RlY3RlZCc6IHtcblx0XHRcdGVkaXQ6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdHJlYXNvbjogbnVsbCxcblx0XHRcdHRlbXBsYXRlOiAncHAtcHJvdGVjdGVkJyxcblx0XHR9LFxuXHRcdCdwcC1tb3ZlJzoge1xuXHRcdFx0bW92ZTogJ3N5c29wJyxcblx0XHRcdHJlYXNvbjogbnVsbCxcblx0XHR9LFxuXHRcdCdwcC1tb3ZlLWRpc3B1dGUnOiB7XG5cdFx0XHRtb3ZlOiAnc3lzb3AnLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+mhtemdouenu+WKqOaImCcsICfpoIHpnaLnp7vli5XmiLAnKSxcblx0XHR9LFxuXHRcdCdwcC1tb3ZlLXZhbmRhbGlzbSc6IHtcblx0XHRcdG1vdmU6ICdzeXNvcCcsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn56e75Yqo56C05Z2PJywgJ+enu+WLleegtOWjnicpLFxuXHRcdH0sXG5cdFx0J3BwLW1vdmUtaW5kZWYnOiB7XG5cdFx0XHRtb3ZlOiAnc3lzb3AnLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+mrmOmjjumZqemhtemdoicsICfpq5jpoqjpmqrpoIHpnaInKSxcblx0XHR9LFxuXHRcdHVucHJvdGVjdDoge1xuXHRcdFx0ZWRpdDogJ2FsbCcsXG5cdFx0XHRtb3ZlOiAnYWxsJyxcblx0XHRcdGNyZWF0ZTogJ2FsbCcsXG5cdFx0XHRyZWFzb246IG51bGwsXG5cdFx0XHR0ZW1wbGF0ZTogJ25vbmUnLFxuXHRcdH0sXG5cdFx0J3BwLWNyZWF0ZSc6IHtcblx0XHRcdGNyZWF0ZTogJ2F1dG9jb25maXJtZWQnLFxuXHRcdFx0cmVhc29uOiBudWxsLFxuXHRcdH0sXG5cdFx0J3BwLWNyZWF0ZS1yZXBlYXQnOiB7XG5cdFx0XHRjcmVhdGU6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCflpJrmrKHph43lpI3liJvlu7onLCAn5aSa5qyh6YeN6KSH5bu656uLJyksXG5cdFx0fSxcblx0XHQncHAtY3JlYXRlLXZhbmRhbGlzbSc6IHtcblx0XHRcdGNyZWF0ZTogJ2F1dG9jb25maXJtZWQnLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+iiq+aWsOeUqOaIt+egtOWdjycsICfooqvmlrDkvb/nlKjogIXnoLTlo54nKSxcblx0XHR9LFxuXHRcdCdwcC1jcmVhdGUtdXNlcnBhZ2UnOiB7XG5cdFx0XHRjcmVhdGU6ICdzeXNvcCcsXG5cdFx0XHRleHBpcnk6ICdpbmZpbml0eScsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn6KKr5rC45LmF5bCB56aB55qE55So5oi36aG1JywgJ+iiq+awuOS5heWwgeemgeeahOS9v+eUqOiAhemggemdoicpLFxuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVGFncyA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfml6DvvIjnp7vpmaTnjrDmnInmqKHmnb/vvIknLCAn54Sh77yI56e76Zmk54++5pyJ5qih5p2/77yJJyksXG5cdFx0XHR2YWx1ZTogJ25vbmUnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5peg77yI5LiN56e76Zmk546w5pyJ5qih5p2/77yJJywgJ+eEoe+8iOS4jeenu+mZpOePvuacieaooeadv++8iScpLFxuXHRcdFx0dmFsdWU6ICdub29wJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAn6YCa55So5qih5p2/Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3twcC1kaXNwdXRlfX06ICR7d2luZG93LndnVUxTKCfkuonorq4nLCAn54it6K2wJyl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLWRpc3B1dGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLXZhbmRhbGlzbX19OiAke3dpbmRvdy53Z1VMUygn56C05Z2PJywgJ+egtOWjnicpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC12YW5kYWxpc20nLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICd7e3BwLXNvY2t9fTog5YKA5YShJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLXNvY2snLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLXRlbXBsYXRlfX06ICR7d2luZG93LndnVUxTKCfpq5jpo47pmanmqKHmnb8nLCAn6auY6aKo6Zqq5qih5p2/Jyl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLXRlbXBsYXRlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3twcC1wcm90ZWN0ZWR9fTogJHt3aW5kb3cud2dVTFMoJ+W4uOinhCcsICfluLjopo8nKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtcHJvdGVjdGVkJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfljYrkv53miqTmqKHmnb8nLCAn5Y2K5L+d6K235qih5p2/JyksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtc2VtaS11c2VydGFsa319OiAke3dpbmRvdy53Z1VMUygn5bCB56aB55qE55So5oi3JywgJ+WwgeemgeeahOS9v+eUqOiAhScpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXVzZXJ0YWxrJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3twcC1zZW1pLWJscH19OiAke3dpbmRvdy53Z1VMUygn55Sf6ICF5Lyg6K6wJywgJ+eUn+iAheWCs+iomCcpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLWJscCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtc2VtaS1pbmRlZn19OiAke3dpbmRvdy53Z1VMUygn6ZW/5pyfJywgJ+mVt+acnycpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLWluZGVmJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vliqjkv53miqTmqKHmnb8nLCAn56e75YuV5L+d6K235qih5p2/JyksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtbW92ZS1kaXNwdXRlfX06ICR7d2luZG93LndnVUxTKCfkuonorq4nLCAn54it6K2wJyl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLW1vdmUtZGlzcHV0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtbW92ZS12YW5kYWxpc219fTogJHt3aW5kb3cud2dVTFMoJ+egtOWdjycsICfnoLTlo54nKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtbW92ZS12YW5kYWxpc20nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLW1vdmUtaW5kZWZ9fTogJHt3aW5kb3cud2dVTFMoJ+mVv+acnycsICfplbfmnJ8nKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtbW92ZS1pbmRlZicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtbW92ZX19OiAke3dpbmRvdy53Z1VMUygn5bi46KeEJywgJ+W4uOimjycpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmNoYW5nZVByZXNldCA9IChlKSA9PiB7XG5cdFx0Y29uc3Qge2Zvcm19ID0gZS50YXJnZXQ7XG5cdFx0Y29uc3QgYWN0aW9udHlwZXMgPSBmb3JtLmFjdGlvbnR5cGU7XG5cdFx0bGV0IGFjdGlvbnR5cGU7XG5cdFx0Zm9yIChjb25zdCBhY3Rpb25fdHlwZV92YWx1ZSBvZiBhY3Rpb250eXBlcykge1xuXHRcdFx0aWYgKCFhY3Rpb25fdHlwZV92YWx1ZS5jaGVja2VkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0YWN0aW9udHlwZSA9IGFjdGlvbl90eXBlX3ZhbHVlLnZhbHVlcztcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoYWN0aW9udHlwZSA9PT0gJ3Byb3RlY3QnKSB7XG5cdFx0XHQvLyBhY3R1YWxseSBwcm90ZWN0aW5nIHRoZSBwYWdlXG5cdFx0XHRjb25zdCBpdGVtID0gVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25QcmVzZXRzSW5mb1tmb3JtLmNhdGVnb3J5LnZhbHVlXTtcblx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSB7XG5cdFx0XHRcdGlmIChpdGVtLmVkaXQpIHtcblx0XHRcdFx0XHRmb3JtLmVkaXRtb2RpZnkuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMuZWRpdG1vZGlmeSh7XG5cdFx0XHRcdFx0XHR0YXJnZXQ6IGZvcm0uZWRpdG1vZGlmeSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmb3JtLmVkaXRsZXZlbC52YWx1ZSA9IGl0ZW0uZWRpdDtcblx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5lZGl0bGV2ZWwoe1xuXHRcdFx0XHRcdFx0dGFyZ2V0OiBmb3JtLmVkaXRsZXZlbCxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3JtLmVkaXRtb2RpZnkuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLmVkaXRtb2RpZnkoe1xuXHRcdFx0XHRcdFx0dGFyZ2V0OiBmb3JtLmVkaXRtb2RpZnksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGl0ZW0ubW92ZSkge1xuXHRcdFx0XHRcdGZvcm0ubW92ZW1vZGlmeS5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5tb3ZlbW9kaWZ5KHtcblx0XHRcdFx0XHRcdHRhcmdldDogZm9ybS5tb3ZlbW9kaWZ5LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZvcm0ubW92ZWxldmVsLnZhbHVlID0gaXRlbS5tb3ZlO1xuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLm1vdmVsZXZlbCh7XG5cdFx0XHRcdFx0XHR0YXJnZXQ6IGZvcm0ubW92ZWxldmVsLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvcm0ubW92ZW1vZGlmeS5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMubW92ZW1vZGlmeSh7XG5cdFx0XHRcdFx0XHR0YXJnZXQ6IGZvcm0ubW92ZW1vZGlmeSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLmVkaXRleHBpcnkudmFsdWUgPSBpdGVtLmV4cGlyeSB8fCAnMSB3ZWVrJztcblx0XHRcdFx0Zm9ybS5tb3ZlZXhwaXJ5LnZhbHVlID0gaXRlbS5leHBpcnkgfHwgJzEgd2Vlayc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoaXRlbS5jcmVhdGUpIHtcblx0XHRcdFx0XHRmb3JtLmNyZWF0ZWxldmVsLnZhbHVlID0gaXRlbS5jcmVhdGU7XG5cdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMuY3JlYXRlbGV2ZWwoe1xuXHRcdFx0XHRcdFx0dGFyZ2V0OiBmb3JtLmNyZWF0ZWxldmVsLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZvcm0uY3JlYXRlZXhwaXJ5LnZhbHVlID0gaXRlbS5jcmVhdGVleHBpcnkgfHwgJzEgd2Vlayc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9ybS5jcmVhdGVleHBpcnkudmFsdWUgPSBpdGVtLmV4cGlyeSB8fCAnMSB3ZWVrJztcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlYXNvbkZpZWxkID0gYWN0aW9udHlwZSA9PT0gJ3Byb3RlY3QnID8gZm9ybS5wcm90ZWN0UmVhc29uIDogZm9ybS5yZWFzb247XG5cdFx0XHRpZiAoaXRlbS5yZWFzb24pIHtcblx0XHRcdFx0cmVhc29uRmllbGQudmFsdWUgPSBpdGVtLnJlYXNvbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlYXNvbkZpZWxkLnZhbHVlID0gJyc7XG5cdFx0XHR9XG5cdFx0XHQvLyBzb3J0IG91dCB0YWdnaW5nIG9wdGlvbnMsIGRpc2FibGVkIGlmIG5vbmV4aXN0ZW50IG9yIGx1YVxuXHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykgJiYgbXcuY29uZmlnLmdldCgnd2dQYWdlQ29udGVudE1vZGVsJykgIT09ICdTY3JpYnVudG8nKSB7XG5cdFx0XHRcdGlmIChmb3JtLmNhdGVnb3J5LnZhbHVlID09PSAndW5wcm90ZWN0Jykge1xuXHRcdFx0XHRcdGZvcm0udGFndHlwZS52YWx1ZSA9ICdub25lJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3JtLnRhZ3R5cGUudmFsdWUgPSBpdGVtLnRlbXBsYXRlID8/IGZvcm0uY2F0ZWdvcnkudmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMudGFndHlwZSh7XG5cdFx0XHRcdFx0dGFyZ2V0OiBmb3JtLnRhZ3R5cGUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoL3RlbXBsYXRlLy50ZXN0KGZvcm0uY2F0ZWdvcnkudmFsdWUpKSB7XG5cdFx0XHRcdFx0Zm9ybS5ub2luY2x1ZGUuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMTApIHtcblx0XHRcdFx0XHRmb3JtLm5vaW5jbHVkZS5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGZvcm0uY2F0ZWdvcnkudmFsdWUgPT09ICd1bnByb3RlY3QnKSB7XG5cdFx0XHQvLyBSUFAgcmVxdWVzdFxuXHRcdFx0Zm9ybS5leHBpcnkudmFsdWUgPSAnJztcblx0XHRcdGZvcm0uZXhwaXJ5LmRpc2FibGVkID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9ybS5leHBpcnkudmFsdWUgPSAnJztcblx0XHRcdGZvcm0uZXhwaXJ5LmRpc2FibGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IGZvcm0gPSBlLnRhcmdldDtcblx0XHRjb25zdCBpbnB1dCA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZm9ybSk7XG5cdFx0bGV0IHRhZ3BhcmFtcztcblx0XHRpZiAoXG5cdFx0XHRpbnB1dC5hY3Rpb250eXBlID09PSAndGFnJyB8fFxuXHRcdFx0KGlucHV0LmFjdGlvbnR5cGUgPT09ICdwcm90ZWN0JyAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpICYmXG5cdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZUNvbnRlbnRNb2RlbCcpICE9PSAnU2NyaWJ1bnRvJylcblx0XHQpIHtcblx0XHRcdHRhZ3BhcmFtcyA9IHtcblx0XHRcdFx0dGFnOiBpbnB1dC50YWd0eXBlLFxuXHRcdFx0XHRyZWFzb246XG5cdFx0XHRcdFx0KGlucHV0LnRhZ3R5cGUgPT09ICdwcC1wcm90ZWN0ZWQnIHx8XG5cdFx0XHRcdFx0XHRpbnB1dC50YWd0eXBlID09PSAncHAtc2VtaS1wcm90ZWN0ZWQnIHx8XG5cdFx0XHRcdFx0XHRpbnB1dC50YWd0eXBlID09PSAncHAtbW92ZScpICYmXG5cdFx0XHRcdFx0aW5wdXQucHJvdGVjdFJlYXNvblxuXHRcdFx0XHRcdFx0PyBpbnB1dC5wcm90ZWN0UmVhc29uXG5cdFx0XHRcdFx0XHQ6IG51bGwsXG5cdFx0XHRcdHNob3dleHBpcnk6IGlucHV0LmFjdGlvbnR5cGUgPT09ICdwcm90ZWN0JyA/IGlucHV0LnNob3dleHBpcnkgOiBudWxsLFxuXHRcdFx0XHRzbWFsbDogaW5wdXQuc21hbGwsXG5cdFx0XHRcdG5vaW5jbHVkZTogaW5wdXQubm9pbmNsdWRlLFxuXHRcdFx0fTtcblx0XHRcdGlmIChpbnB1dC5hY3Rpb250eXBlID09PSAncHJvdGVjdCcpIHtcblx0XHRcdFx0aWYgKGlucHV0LmVkaXRtb2RpZnkpIHtcblx0XHRcdFx0XHR0YWdwYXJhbXMuZXhwaXJ5ID0gaW5wdXQuZWRpdGV4cGlyeTtcblx0XHRcdFx0fSBlbHNlIGlmIChpbnB1dC5tb3ZlbW9kaWZ5KSB7XG5cdFx0XHRcdFx0dGFncGFyYW1zLmV4cGlyeSA9IGlucHV0Lm1vdmVleHBpcnk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgY2xvc2VwYXJhbXMgPSB7fTtcblx0XHRpZiAoaW5wdXQuY2xvc2UpIHtcblx0XHRcdGlmIChpbnB1dC5jYXRlZ29yeSA9PT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0Y2xvc2VwYXJhbXMudHlwZSA9ICd1bnByb3RlY3QnO1xuXHRcdFx0fSBlbHNlIGlmIChtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSB7XG5cdFx0XHRcdGlmIChpbnB1dC5lZGl0bW9kaWZ5KSB7XG5cdFx0XHRcdFx0c3dpdGNoIChpbnB1dC5lZGl0bGV2ZWwpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ29mZmljaWFscHJvdGVjdGVkJzpcblx0XHRcdFx0XHRcdFx0Y2xvc2VwYXJhbXMudHlwZSA9ICdvZmZpY2lhbHByb3RlY3RlZCc7XG5cdFx0XHRcdFx0XHRcdGNsb3NlcGFyYW1zLmV4cGlyeSA9IGlucHV0LmVkaXRleHBpcnk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAncmV2aXNpb25wcm90ZWN0ZWQnOlxuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy50eXBlID0gJ3JldmlzaW9ucHJvdGVjdGVkJztcblx0XHRcdFx0XHRcdFx0Y2xvc2VwYXJhbXMuZXhwaXJ5ID0gaW5wdXQuZWRpdGV4cGlyeTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdzeXNvcCc6XG5cdFx0XHRcdFx0XHRcdGNsb3NlcGFyYW1zLnR5cGUgPSAnZnVsbCc7XG5cdFx0XHRcdFx0XHRcdGNsb3NlcGFyYW1zLmV4cGlyeSA9IGlucHV0LmVkaXRleHBpcnk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAndGVtcGxhdGVlZGl0b3InOlxuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy50eXBlID0gJ3RlbXAnO1xuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy5leHBpcnkgPSBpbnB1dC5lZGl0ZXhwaXJ5O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2F1dG9jb25maXJtZWQnOlxuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy50eXBlID0gJ3NlbWknO1xuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy5leHBpcnkgPSBpbnB1dC5lZGl0ZXhwaXJ5O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0aW5wdXQubW92ZW1vZGlmeSAmJlxuXHRcdFx0XHRcdFsnb2ZmaWNpYWxwcm90ZWN0ZWQnLCAncmV2aXNpb25wcm90ZWN0ZWQnLCAnc3lzb3AnLCAndGVtcGxhdGVlZGl0b3InXS5pbmNsdWRlcyhpbnB1dC5tb3ZlbGV2ZWwpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNsb3NlcGFyYW1zLnR5cGUgPSAnbW92ZSc7XG5cdFx0XHRcdFx0Y2xvc2VwYXJhbXMuZXhwaXJ5ID0gaW5wdXQubW92ZWV4cGlyeTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpbnB1dC5jcmVhdGVsZXZlbCAhPT0gJ2FsbCcpIHtcblx0XHRcdFx0Y2xvc2VwYXJhbXMudHlwZSA9ICdzYWx0Jztcblx0XHRcdFx0Y2xvc2VwYXJhbXMuZXhwaXJ5ID0gaW5wdXQuY3JlYXRlZXhwaXJ5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRzd2l0Y2ggKGlucHV0LmFjdGlvbnR5cGUpIHtcblx0XHRcdGNhc2UgJ3Byb3RlY3QnOiB7XG5cdFx0XHRcdC8vIHByb3RlY3QgdGhlIHBhZ2Vcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5L+d5oqk5a6M5oiQJywgJ+S/neitt+WujOaIkCcpO1xuXHRcdFx0XHRsZXQgc3RhdHVzSW5pdGVkID0gZmFsc2U7XG5cdFx0XHRcdGxldCB0aGlzcGFnZTtcblx0XHRcdFx0Y29uc3QgYWxsRG9uZSA9ICgpID0+IHtcblx0XHRcdFx0XHRpZiAodGhpc3BhZ2UpIHtcblx0XHRcdFx0XHRcdHRoaXNwYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRhZ3BhcmFtcykge1xuXHRcdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrcy50YWdnaW5nUGFnZUluaXRpYWwodGFncGFyYW1zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGNsb3NlcGFyYW1zICYmIGNsb3NlcGFyYW1zLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJwcFBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHQnUWl1d2VuX3RhbGs66aG16Z2i5L+d5oqk6K+35rGCJyxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflhbPpl63or7fmsYInLCAn6Zec6ZaJ6KuL5rGCJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRycHBQYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0XHRcdFx0cnBwUGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMoY2xvc2VwYXJhbXMpO1xuXHRcdFx0XHRcdFx0cnBwUGFnZS5sb2FkKFR3aW5rbGUucHJvdGVjdC5jYWxsYmFja3MuY2xvc2VSZXF1ZXN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IHByb3RlY3RJdCA9IChuZXh0KSA9PiB7XG5cdFx0XHRcdFx0dGhpc3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv53miqTpobXpnaInLCAn5L+d6K236aCB6Z2iJylcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSB7XG5cdFx0XHRcdFx0XHRpZiAoaW5wdXQuZWRpdG1vZGlmeSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzcGFnZS5zZXRFZGl0UHJvdGVjdGlvbihpbnB1dC5lZGl0bGV2ZWwsIGlucHV0LmVkaXRleHBpcnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGlucHV0Lm1vdmVtb2RpZnkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRW5zdXJlIGEgbGV2ZWwgaGFzIGFjdHVhbGx5IGJlZW4gY2hvc2VuXG5cdFx0XHRcdFx0XHRcdGlmIChpbnB1dC5tb3ZlbGV2ZWwpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzcGFnZS5zZXRNb3ZlUHJvdGVjdGlvbihpbnB1dC5tb3ZlbGV2ZWwsIGlucHV0Lm1vdmVleHBpcnkpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5oKo6ZyA6KaB6YCJ5oup5L+d5oqk5bGC57qn77yBJywgJ+aCqOmcgOimgemBuOaTh+S/neitt+WxpOe0mu+8gScpLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlcHJvdGVjdCcsXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzcGFnZS5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFByb3RlY3RlZFBhZ2VzJykpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzcGFnZS5zZXRDcmVhdGVQcm90ZWN0aW9uKGlucHV0LmNyZWF0ZWxldmVsLCBpbnB1dC5jcmVhdGVleHBpcnkpO1xuXHRcdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0V2F0Y2hsaXN0KGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGlucHV0LnByb3RlY3RSZWFzb24pIHtcblx0XHRcdFx0XHRcdHRoaXNwYWdlLnNldEVkaXRTdW1tYXJ5KGlucHV0LnByb3RlY3RSZWFzb24pO1xuXHRcdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlv4XpobvovpPlhaXkv53miqTnkIbnlLHvvIzov5nlsIbooqvorrDlvZXlnKjkv53miqTml6Xlv5fkuK3jgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlv4XpoIjovLjlhaXkv53orbfnkIbnlLHvvIzpgJnlsIfooqvoqJjpjITlnKjkv53orbfml6XoqozkuK3jgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZXByb3RlY3QnLFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXN0YXR1c0luaXRlZCkge1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRcdFx0c3RhdHVzSW5pdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHRoaXNwYWdlLnByb3RlY3QobmV4dCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChpbnB1dC5lZGl0bW9kaWZ5IHx8IGlucHV0Lm1vdmVtb2RpZnkgfHwgIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHtcblx0XHRcdFx0XHRwcm90ZWN0SXQoYWxsRG9uZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dm9pZCBtdy5ub3RpZnkoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCfor7flkYror4lUd2lua2xl6KaB5YGa5LuA5LmI77yBXFxu6Iul5oKo5Y+q5piv5oOz5qCH6K6w6K+l6aG177yM6K+36YCJ5oup5LiK6Z2i55qE4oCc55So5L+d5oqk5qih5p2/5qCH6K6w5q2k6aG14oCd6YCJ6aG544CCJyxcblx0XHRcdFx0XHRcdFx0J+iri+WRiuiotFR3aW5rbGXopoHlgZrku4DpurzvvIFcXG7oi6Xmgqjlj6rmmK/mg7PmqJnoqJjoqbLpoIHvvIzoq4vpgbjmk4fkuIrpnaLnmoTjgIznlKjkv53orbfmqKHmnb/mqJnoqJjmraTpoIHjgI3pgbjpoIXjgIInXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVwcm90ZWN0Jyxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAndGFnJzpcblx0XHRcdFx0Ly8gYXBwbHkgYSBwcm90ZWN0aW9uIHRlbXBsYXRlXG5cdFx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQuZm9sbG93UmVkaXJlY3QgPSBmYWxzZTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKCfmoIforrDlrozmiJAnLCAn5qiZ6KiY5a6M5oiQJyk7XG5cdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5jYWxsYmFja3MudGFnZ2luZ1BhZ2VJbml0aWFsKHRhZ3BhcmFtcyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVxdWVzdCc6IHtcblx0XHRcdFx0Ly8gZmlsZSByZXF1ZXN0IGF0IFJGUFBcblx0XHRcdFx0bGV0IHR5cGVuYW1lO1xuXHRcdFx0XHRsZXQgdHlwZXJlYXNvbjtcblx0XHRcdFx0c3dpdGNoIChpbnB1dC5jYXRlZ29yeSkge1xuXHRcdFx0XHRcdGNhc2UgJ3BwLWRpc3B1dGUnOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXByb3RlY3RlZCc6XG5cdFx0XHRcdFx0XHR0eXBlbmFtZSA9IHdpbmRvdy53Z1VMUygn5YWo5L+d5oqkJywgJ+WFqOS/neittycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtdGVtcGxhdGUnOlxuXHRcdFx0XHRcdFx0dHlwZW5hbWUgPSB3aW5kb3cud2dVTFMoJ+aooeadv+S/neaKpCcsICfmqKHmnb/kv53orbcnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLXZhbmRhbGlzbSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS1kaXNydXB0aXZlJzpcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLXVuc291cmNlZCc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS12YW5kYWxpc20nOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktdXNlcnRhbGsnOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktdGVtcGxhdGUnOiAvLyByZW1vdmVkIGZvciBub3dcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLXNvY2snOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktYmxwJzpcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLXByb3RlY3RlZCc6XG5cdFx0XHRcdFx0XHR0eXBlbmFtZSA9IHdpbmRvdy53Z1VMUygn5Y2K5L+d5oqkJywgJ+WNiuS/neittycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtbW92ZSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtbW92ZS1kaXNwdXRlJzpcblx0XHRcdFx0XHRjYXNlICdwcC1tb3ZlLWluZGVmJzpcblx0XHRcdFx0XHRjYXNlICdwcC1tb3ZlLXZhbmRhbGlzbSc6XG5cdFx0XHRcdFx0XHR0eXBlbmFtZSA9IHdpbmRvdy53Z1VMUygn56e75Yqo5L+d5oqkJywgJ+enu+WLleS/neittycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlJzpcblx0XHRcdFx0XHRjYXNlICdwcC1jcmVhdGUtb2ZmZW5zaXZlJzpcblx0XHRcdFx0XHRjYXNlICdwcC1jcmVhdGUtYmxwJzpcblx0XHRcdFx0XHRjYXNlICdwcC1jcmVhdGUtc2FsdCc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLXVzZXJwYWdlJzpcblx0XHRcdFx0XHRjYXNlICdwcC1jcmVhdGUtcmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdwcC1jcmVhdGUtdmFuZGFsaXNtJzpcblx0XHRcdFx0XHRcdHR5cGVuYW1lID0gd2luZG93LndnVUxTKCfnmb3nurjkv53miqQnLCAn55m957SZ5L+d6K23Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHQvKiBjYXNlICd1bnByb3RlY3QnOiAqL1xuXHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0dHlwZW5hbWUgPSB3aW5kb3cud2dVTFMoJ+ino+mZpOS/neaKpCcsICfop6PpmaTkv53orbcnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN3aXRjaCAoaW5wdXQuY2F0ZWdvcnkpIHtcblx0XHRcdFx0XHRjYXNlICdwcC1kaXNwdXRlJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+S6ieiuruOAgee8lui+keaImCcsICfniK3orbDjgIHnt6jovK/miLAnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLXZhbmRhbGlzbSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS12YW5kYWxpc20nOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLWNyZWF0ZS12YW5kYWxpc20nOlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn5oyB57ut56C05Z2PJywgJ+aMgee6jOegtOWjnicpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtdGVtcGxhdGUnOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktdGVtcGxhdGUnOlxuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlZCBmb3Igbm93XG5cdFx0XHRcdFx0XHR0eXBlcmVhc29uID0gd2luZG93LndnVUxTKCfpq5jpo47pmanmqKHmnb8nLCAn6auY6aKo6Zqq5qih5p2/Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcC1jcmVhdGUtdXNlcnBhZ2UnOlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn6KKr5rC45LmF5bCB56aB55qE55So5oi36aG1JywgJ+iiq+awuOS5heWwgemOlueahOS9v+eUqOiAhemggemdoicpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS11c2VydGFsayc6XG5cdFx0XHRcdFx0XHR0eXBlcmVhc29uID0gd2luZG93LndnVUxTKCflt7LlsIHnpoHnlKjmiLfnmoTorqjorrrpobUnLCAn5bey5bCB6Y6W5L2/55So6ICF55qE6KiO6KuW6aCBJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLXNvY2snOlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn5YKA5YSh56C05Z2PJywgJ+WCgOWEoeegtOWjnicpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS1ibHAnOlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn6L+d5Y+N55Sf6ICF5Lyg6K6w5pa56ZKIJywgJ+mBleWPjeeUn+iAheWCs+iomOaWuemHnScpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtbW92ZS1kaXNwdXRlJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+S6ieiuruOAgeenu+WKqOaImCcsICfniK3orbDjgIHnp7vli5XmiLAnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLW1vdmUtdmFuZGFsaXNtJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+enu+WKqOegtOWdjycsICfnp7vli5XnoLTlo54nKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLW1vdmUtaW5kZWYnOlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn6auY6aOO6Zmp6aG16Z2iJywgJ+mrmOmiqOmaqumggemdoicpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLXJlcGVhdCc6XG5cdFx0XHRcdFx0XHR0eXBlcmVhc29uID0gd2luZG93LndnVUxTKCflpJrmrKHph43lpI3liJvlu7onLCAn5aSa5qyh6YeN6KSH5bu656uLJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9ICcnO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IHJlYXNvbiA9IHR5cGVyZWFzb247XG5cdFx0XHRcdGlmIChpbnB1dC5yZWFzb24gIT09ICcnKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVyZWFzb24gIT09ICcnKSB7XG5cdFx0XHRcdFx0XHRyZWFzb24gKz0gJ++8mic7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJlYXNvbiArPSBpbnB1dC5yZWFzb247XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJlYXNvbiAhPT0gJycpIHtcblx0XHRcdFx0XHRyZWFzb24gPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24ocmVhc29uKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBycHBwYXJhbXMgPSB7XG5cdFx0XHRcdFx0cmVhc29uLFxuXHRcdFx0XHRcdHR5cGVuYW1lLFxuXHRcdFx0XHRcdGNhdGVnb3J5OiBpbnB1dC5jYXRlZ29yeSxcblx0XHRcdFx0XHRleHBpcnk6IGlucHV0LmV4cGlyeSxcblx0XHRcdFx0fTtcblx0XHRcdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0XHRcdGNvbnN0IHJwcE5hbWUgPSAnUWl1d2VuX3RhbGs66aG16Z2i5L+d5oqk6K+35rGCJztcblx0XHRcdFx0Ly8gVXBkYXRpbmcgZGF0YSBmb3IgdGhlIGFjdGlvbiBjb21wbGV0ZWQgZXZlbnRcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBycHBOYW1lO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aPkOWQjeWujOaIkO+8jOmHjeWumuWQkeWIsOiuqOiuuumhtScsXG5cdFx0XHRcdFx0J+aPkOWQjeWujOaIkO+8jOmHjeaWsOWwjuWQkeWIsOiojuirlumggSdcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgcnBwUGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UocnBwTmFtZSwgd2luZG93LndnVUxTKCfor7fmsYLkv53miqTpobXpnaInLCAn6KuL5rGC5L+d6K236aCB6Z2iJykpO1xuXHRcdFx0XHRycHBQYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0XHRycHBQYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhycHBwYXJhbXMpO1xuXHRcdFx0XHRycHBQYWdlLmxvYWQoVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrcy5maWxlUmVxdWVzdCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dm9pZCBtdy5ub3RpZnkoJ3R3aW5rbGVwcm90ZWN0OiDmnKrnn6Xmk43kvZznsbvlnosnLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVwcm90ZWN0Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrcyA9IHtcblx0XHR0YWdnaW5nUGFnZUluaXRpYWw6ICh0YWdwYXJhbXMpID0+IHtcblx0XHRcdGlmICh0YWdwYXJhbXMudGFnID09PSAnbm9vcCcpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCflupTnlKjkv53miqTmqKHmnb8nLCAn5oeJ55So5L+d6K235qih5p2/JyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmsqHku4DkuYjopoHlgZrnmoQnLCAn5rKS5LuA6bq86KaB5YGa55qEJylcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcGFnZU5hbWUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRjb25zdCBwcm90ZWN0ZWRQYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShwYWdlTmFtZSwgd2luZG93LndnVUxTKCfmoIforrDpobXpnaInLCAn5qiZ6KiY6aCB6Z2iJykpO1xuXHRcdFx0cHJvdGVjdGVkUGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnModGFncGFyYW1zKTtcblx0XHRcdHByb3RlY3RlZFBhZ2UubG9hZChUd2lua2xlLnByb3RlY3QuY2FsbGJhY2tzLnRhZ2dpbmdQYWdlKTtcblx0XHR9LFxuXHRcdGdldFRhZ2dlZFBhZ2U6IChwYXJhbXMsIHRleHQpID0+IHtcblx0XHRcdGxldCB0YWc7XG5cdFx0XHRsZXQgc3VtbWFyeTtcblx0XHRcdGNvbnN0IG9sZHRhZ19yZSA9XG5cdFx0XHRcdC8oPzo8bm9pbmNsdWRlPik/WyBcXHRdKlxce1xce1xccyoocHAtW157fV0qP3xwcm90ZWN0ZWR8KD86dHx2fHN8cC18dXNlcnRhbGstdnx1c2VydGFsay1zfHNifG1vdmUpcHJvdGVjdGVkKD86Mik/fHByb3RlY3RlZCB0ZW1wbGF0ZXxwcml2YWN5IHByb3RlY3Rpb24pXFxzKj9cXH1cXH1cXHMqKD86PFxcL25vaW5jbHVkZT4pP1xccyovZ2k7XG5cdFx0XHRjb25zdCByZV9yZXN1bHQgPSBvbGR0YWdfcmUuZXhlYyh0ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0cmVfcmVzdWx0ICYmXG5cdFx0XHRcdChwYXJhbXMudGFnID09PSAnbm9uZScgfHxcblx0XHRcdFx0XHRjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflnKjpobXpnaLkuIrmib7liLB7eycsICflnKjpoIHpnaLkuIrmib7liLB7eycpICtcblx0XHRcdFx0XHRcdFx0cmVfcmVzdWx0WzFdICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCd9fVxcbuWNleWHu+ehruWumuS7peenu+mZpO+8jOaIluWNleWHu+WPlua2iOS7peWPlua2iOaTjeS9nOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J319XFxu6bue5pOK56K65a6a5Lul56e76Zmk77yM5oiW6bue5pOK5Y+W5raI5Lul5Y+W5raI5pON5L2c44CCJ1xuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KSlcblx0XHRcdCkge1xuXHRcdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKG9sZHRhZ19yZSwgJycpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy50YWcgPT09ICdub25lJykge1xuXHRcdFx0XHRzdW1tYXJ5ID0gd2luZG93LndnVUxTKCfnp7vpmaTkv53miqTmqKHmnb8nLCAn56e76Zmk5L+d6K235qih5p2/Jyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQoe3RhZ30gPSBwYXJhbXMpO1xuXHRcdFx0XHRpZiAocGFyYW1zLnJlYXNvbikge1xuXHRcdFx0XHRcdHRhZyArPSBgfHJlYXNvbj0ke3BhcmFtcy5yZWFzb259YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocGFyYW1zLnNob3dleHBpcnkgJiYgcGFyYW1zLmV4cGlyeSAmJiAhTW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkocGFyYW1zLmV4cGlyeSkpIHtcblx0XHRcdFx0XHR0YWcgKz0gJ3xleHBpcnk9e3snLmNvbmNhdCgnc3Vic3Q6JywgYCN0aW1lOmN8JHtwYXJhbXMuZXhwaXJ5fX19YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBhcmFtcy5zbWFsbCkge1xuXHRcdFx0XHRcdHRhZyArPSAnfHNtYWxsPXllcyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKC9eXFxzKiMoPzpyZWRpcmVjdHzph43lrprlkJF86YeN5paw5bCO5ZCRKS9pLnRlc3QodGV4dCkpIHtcblx0XHRcdFx0XHQvLyByZWRpcmVjdCBwYWdlXG5cdFx0XHRcdFx0Ly8gT25seSB0YWcgaWYgbm8ge3tyY2F0IHNoZWxsfX0gaXMgZm91bmRcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHR0ZXh0Lm1hdGNoKFxuXHRcdFx0XHRcdFx0XHQve3soPzpSZWRpcmVjdFsgX11jYXRlZ29yeSBzaGVsbHxSY2F0WyBfXXNoZWxsfFRoaXNbIF9daXMgYSByZWRpcmVjdHzlpJrnp43nsbvlnovph43lrprlkJF85aSa56iu6aGe5Z6L6YeN5a6a5ZCRfOWkmueorumhnuWei+mHjeaWsOWwjuWQkXzlpJrnp43nsbvlnovph43mlrDlr7zlkJF8UjB85YW25LuW6YeN5a6a5ZCRfFJDU3xSZWRpcmVjdFsgX11zaGVsbCkvaVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0XHRcdCflt7LlrZjlnKhSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbCcsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5rKh5LuA5LmI5Y+v5YGa55qEJywgJ+aykuS7gOm6vOWPr+WBmueahCcpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0LyMoPzpyZWRpcmVjdHzph43lrprlkJF86YeN5paw5bCO5ZCRKSA/KFxcW1xcWy4qP1xcXVxcXSkoLiopL2ksXG5cdFx0XHRcdFx0XHRgI1JFRElSRUNUICQxJDJcXG5cXG57eyR7dGFnfX19YFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5ub2luY2x1ZGUpIHtcblx0XHRcdFx0XHRcdHRhZyA9IGA8bm9pbmNsdWRlPnt7JHt0YWd9fX08L25vaW5jbHVkZT5gO1xuXHRcdFx0XHRcdFx0Ly8g5Y+q5pyJ6KGo5qC86ZyA6KaB5Y2V54us5Yqg5Zue6L2m77yM5YW25LuW5oOF5Ya15Yqg5Zue6L2m5Lya56C05Z2P5qih5p2/44CCXG5cdFx0XHRcdFx0XHRpZiAodGV4dC5pbmRleE9mKCd7fCcpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdHRhZyArPSAnXFxuJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGFnID0gYHt7JHt0YWd9fX1cXG5gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBJbnNlcnQgdGFnIGFmdGVyIHNob3J0IGRlc2NyaXB0aW9uIG9yIGFueSBoYXRub3Rlc1xuXHRcdFx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2l0ZXh0LnBhZ2UodGV4dCk7XG5cdFx0XHRcdFx0dGV4dCA9IHFpdXdlbl9wYWdlLmluc2VydEFmdGVyVGVtcGxhdGVzKHRhZywgVHdpbmtsZS5oYXRub3RlUmVnZXgpLmdldFRleHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdW1tYXJ5ID0gYOWKoOWFpXt7JHtwYXJhbXMudGFnfX19YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRleHQsXG5cdFx0XHRcdHN1bW1hcnksXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0dGFnZ2luZ1BhZ2U6IChwcm90ZWN0ZWRQYWdlKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwcm90ZWN0ZWRQYWdlLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0Y29uc3QgdGV4dCA9IHByb3RlY3RlZFBhZ2UuZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IG5ld1ZlcnNpb24gPSBUd2lua2xlLnByb3RlY3QuY2FsbGJhY2tzLmdldFRhZ2dlZFBhZ2UocGFyYW1zLCB0ZXh0KTtcblx0XHRcdGlmIChuZXdWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cHJvdGVjdGVkUGFnZS5nZXRTdGF0dXNFbGVtZW50KCkuaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHByb3RlY3RlZFBhZ2Uuc2V0RWRpdFN1bW1hcnkobmV3VmVyc2lvbi5zdW1tYXJ5KTtcblx0XHRcdHByb3RlY3RlZFBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cHJvdGVjdGVkUGFnZS5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFBQVGFnZ2VkUGFnZXMnKSk7XG5cdFx0XHRwcm90ZWN0ZWRQYWdlLnNldFBhZ2VUZXh0KG5ld1ZlcnNpb24udGV4dCk7XG5cdFx0XHRwcm90ZWN0ZWRQYWdlLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHByb3RlY3RlZFBhZ2Uuc3VwcHJlc3NQcm90ZWN0V2FybmluZygpOyAvLyBubyBuZWVkIHRvIGxldCBhZG1pbnMga25vdyB0aGV5IGFyZSBlZGl0aW5nIHRocm91Z2ggcHJvdGVjdGlvblxuXHRcdFx0cHJvdGVjdGVkUGFnZS5zYXZlKCk7XG5cdFx0fSxcblx0XHRmaWxlUmVxdWVzdDogKHJwcFBhZ2UpID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHJwcFBhZ2UuZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRsZXQgdGV4dCA9IHJwcFBhZ2UuZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IHN0YXR1c0VsZW1lbnQgPSBycHBQYWdlLmdldFN0YXR1c0VsZW1lbnQoKTtcblx0XHRcdGNvbnN0IHJwcFJlID0gbmV3IFJlZ0V4cChcblx0XHRcdFx0YD09PVxcXFxzKihcXFxcW1xcXFxbKT9cXFxccyo6P1xcXFxzKiR7TW9yZWJpdHMuc3RyaW5nLmVzY2FwZVJlZ0V4cChNb3JlYml0cy5wYWdlTmFtZU5vcm0pfVxcXFxzKihcXFxcXVxcXFxdKT9cXFxccyo9PT1gLFxuXHRcdFx0XHQnbSdcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB0YWcgPSBycHBSZS5leGVjKHRleHQpO1xuXHRcdFx0Y29uc3QgcnBwTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdHJwcExpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgbXcudXRpbC5nZXRVcmwocnBwUGFnZS5nZXRQYWdlTmFtZSgpKSk7XG5cdFx0XHRycHBMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHJwcFBhZ2UuZ2V0UGFnZU5hbWUoKSkpO1xuXHRcdFx0aWYgKHRhZykge1xuXHRcdFx0XHRzdGF0dXNFbGVtZW50LmVycm9yKFtcblx0XHRcdFx0XHRycHBMaW5rLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bey5pyJ5a+55q2k6aG16Z2i55qE5L+d5oqk5o+Q5ZCN77yM5Y+W5raI5pON5L2c44CCJywgJ+W3suacieWwjeatpOmggemdoueahOS/neitt+aPkOWQje+8jOWPlua2iOaTjeS9nOOAgicpLFxuXHRcdFx0XHRdKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IG5ld3RhZyA9IGA9PT0gW1s6JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV0gPT09XFxuYDtcblx0XHRcdGlmIChuZXcgUmVnRXhwKGBeJHttdy51dGlsLmVzY2FwZVJlZ0V4cChuZXd0YWcpLnJlcGxhY2UoL1xccysvZywgJ1xcXFxzKicpfWAsICdtJykudGVzdCh0ZXh0KSkge1xuXHRcdFx0XHRzdGF0dXNFbGVtZW50LmVycm9yKFtcblx0XHRcdFx0XHRycHBMaW5rLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bey5pyJ5a+55q2k6aG16Z2i55qE5L+d5oqk5o+Q5ZCN77yM5Y+W5raI5pON5L2c44CCJywgJ+W3suacieWwjeatpOmggemdoueahOS/neitt+aPkOWQje+8jOWPlua2iOaTjeS9nOOAgicpLFxuXHRcdFx0XHRdKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHdvcmRzO1xuXHRcdFx0c3dpdGNoIChwYXJhbXMuZXhwaXJ5KSB7XG5cdFx0XHRcdGNhc2UgJ3RlbXBvcmFyeSc6XG5cdFx0XHRcdFx0d29yZHMgPSB3aW5kb3cud2dVTFMoJ+S4tOaXticsICfoh6jmmYInKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnaW5maW5pdHknOlxuXHRcdFx0XHRcdHdvcmRzID0gJ+awuOS5hSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0d29yZHMgPSAnJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHdvcmRzICs9IHBhcmFtcy50eXBlbmFtZTtcblx0XHRcdG5ld3RhZyArPSBgKiA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogOTAlXCI+JHt3aW5kb3cud2dVTFMoJ+W9k+WJjeS/neaKpOeKtuaAgScsICfnm67liY3kv53orbfni4DmhYsnKX3vvJp7e3Byb3RlY3Rpb24gc3RhdHVzfCR7XG5cdFx0XHRcdC9bPV0vLnRlc3QoTW9yZWJpdHMucGFnZU5hbWVOb3JtKSA/ICcxPScgOiAnJ1xuXHRcdFx0fSR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfX19PC9zcGFuPlxcbmA7XG5cdFx0XHRuZXd0YWcgKz0gYCR7XG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn6K+35rGCJywgJ+iri+axgicpICtcblx0XHRcdFx0TW9yZWJpdHMuc3RyaW5nLnRvVXBwZXJDYXNlRmlyc3RDaGFyKHdvcmRzKSArXG5cdFx0XHRcdChwYXJhbXMucmVhc29uID09PSAnJyA/ICfjgIInIDogYO+8miR7TW9yZWJpdHMuc3RyaW5nLmZvcm1hdFJlYXNvblRleHQocGFyYW1zLnJlYXNvbil9YClcblx0XHRcdH0tLX5+YC5jb25jYXQoJ35+Jyk7XG5cdFx0XHRsZXQgcmVnO1xuXHRcdFx0aWYgKHBhcmFtcy5jYXRlZ29yeSA9PT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0cmVnID0gLyg9PVxccyror7fmsYLop6PpmaTkv53miqRcXHMqPT0pLztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlZyA9IC8oe3tcXHMqXFwvaGVhZGVyXFxzKn19KS87XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvcmlnaW5hbFRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UocmVnLCBgJDFcXG4ke25ld3RhZ31cXG5gKTtcblx0XHRcdGlmICh0ZXh0Lmxlbmd0aCA9PT0gb3JpZ2luYWxUZXh0TGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGxpbmtub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRsaW5rbm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBtdy51dGlsLmdldFVybCgnSGVscDpUd2lua2xlL+S/ruWkjVJGUFAnKSk7XG5cdFx0XHRcdGxpbmtub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHdpbmRvdy53Z1VMUygn5aaC5L2V5L+u5aSNUkZQUCcsICflpoLkvZXkv67lvqlSRlBQJykpKTtcblx0XHRcdFx0c3RhdHVzRWxlbWVudC5lcnJvcihbXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aXoOazleWcqFFXOlJGUFDkuIrmib7liLDnm7jlhbPlrprkvY3ngrnmoIforrDvvIzopoHkv67lpI3mraTpl67popjvvIzor7flj4Lop4EnLFxuXHRcdFx0XHRcdFx0J+eEoeazleWcqFFXOlJGUFDkuIrmib7liLDnm7jpl5zlrprkvY3pu57mqJnoqJjvvIzopoHkv67lvqnmraTllY/poYzvvIzoq4vlj4PoposnXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRsaW5rbm9kZSxcblx0XHRcdFx0XHQn44CCJyxcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHN0YXR1c0VsZW1lbnQuc3RhdHVzKCfliqDlhaXmlrDmj5DlkI3igKYnKTtcblx0XHRcdHJwcFBhZ2Uuc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdGAvKiAke01vcmViaXRzLnBhZ2VOYW1lTm9ybX0gKi8gJHt3aW5kb3cud2dVTFMoJ+ivt+axguWvuScsICfoq4vmsYLlsI0nKX1bWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dJHtcblx0XHRcdFx0XHRwYXJhbXMudHlwZW5hbWVcblx0XHRcdFx0fWBcblx0XHRcdCk7XG5cdFx0XHRycHBQYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHJwcFBhZ2Uuc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRycHBQYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdHJwcFBhZ2Uuc2F2ZSgoKSA9PiB7XG5cdFx0XHRcdC8vIFdhdGNoIHRoZSBwYWdlIGJlaW5nIHJlcXVlc3RlZFxuXHRcdFx0XHRjb25zdCB3YXRjaFByZWYgPSBUd2lua2xlLmdldFByZWYoJ3dhdGNoUmVxdWVzdGVkUGFnZXMnKTtcblx0XHRcdFx0Ly8gYWN0aW9uPXdhdGNoIGhhcyBubyB3YXkgdG8gcmVseSBvbiB1c2VyIHByZWZlcmVuY2VzIChUMjYyOTEyKSwgc28gd2UgZG8gaXQgbWFudWFsbHkuXG5cdFx0XHRcdC8vIFRoZSB3YXRjaGRlZmF1bHQgcHJlZiBhcHBlYXJzIHRvIHJlbGlhYmx5IHJldHVybiAnMScgKHN0cmluZyksXG5cdFx0XHRcdC8vIGJ1dCB0aGF0J3Mgbm90IGNvbnNpc3RlbnQgYW1vbmcgcHJlZnMgc28gbWlnaHQgYXMgd2VsbCBiZSBcImNvcnJlY3RcIlxuXHRcdFx0XHRjb25zdCB3YXRjaCA9XG5cdFx0XHRcdFx0d2F0Y2hQcmVmICE9PSAnbm8nICYmXG5cdFx0XHRcdFx0KHdhdGNoUHJlZiAhPT0gJ2RlZmF1bHQnIHx8ICEhTnVtYmVyLnBhcnNlSW50KG13LnVzZXIub3B0aW9ucy5nZXQoJ3dhdGNoZGVmYXVsdCcpLCAxMCkpO1xuXHRcdFx0XHRpZiAod2F0Y2gpIHtcblx0XHRcdFx0XHRjb25zdCB3YXRjaF9xdWVyeSA9IHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3dhdGNoJyxcblx0XHRcdFx0XHRcdHRpdGxlczogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdFx0dG9rZW46IG13LnVzZXIudG9rZW5zLmdldCgnd2F0Y2hUb2tlbicpLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Ly8gT25seSBhZGQgdGhlIGV4cGlyeSBpZiBwYWdlIGlzIHVud2F0Y2hlZCBvciBhbHJlYWR5IHRlbXBvcmFyaWx5IHdhdGNoZWRcblx0XHRcdFx0XHRpZiAoVHdpbmtsZS5wcm90ZWN0LndhdGNoZWQgIT09IHRydWUgJiYgd2F0Y2hQcmVmICE9PSAnZGVmYXVsdCcgJiYgd2F0Y2hQcmVmICE9PSAneWVzJykge1xuXHRcdFx0XHRcdFx0d2F0Y2hfcXVlcnkuZXhwaXJ5ID0gd2F0Y2hQcmVmO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+Wwhuivt+axguS/neaKpOeahOmhtemdouWKoOWFpeWIsOebkeinhuWIl+ihqCcsICflsIfoq4vmsYLkv53orbfnmoTpoIHpnaLliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHRcdHdhdGNoX3F1ZXJ5XG5cdFx0XHRcdFx0KS5wb3N0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Y2xvc2VSZXF1ZXN0OiAocnBwUGFnZSkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcnBwUGFnZS5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGxldCB0ZXh0ID0gcnBwUGFnZS5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0Y29uc3Qgc3RhdHVzRWxlbWVudCA9IHJwcFBhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0Y29uc3Qgc2VjdGlvbnMgPSB0ZXh0LnNwbGl0KC8oPz1cXG49PVxccyror7fmsYLop6PpmaTkv53miqRcXHMqPT0pLyk7XG5cdFx0XHRpZiAoc2VjdGlvbnMubGVuZ3RoICE9PSAyKSB7XG5cdFx0XHRcdGNvbnN0IGxpbmtub2RlMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdFx0bGlua25vZGUyLnNldEF0dHJpYnV0ZSgnaHJlZicsIG13LnV0aWwuZ2V0VXJsKCdIZWxwOlR3aW5rbGUv5L+u5aSNUkZQUCcpKTtcblx0XHRcdFx0bGlua25vZGUyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCflpoLkvZXkv67lpI1SRlBQJykpO1xuXHRcdFx0XHRzdGF0dXNFbGVtZW50LmVycm9yKFtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5peg5rOV5ZyoUVc6UkZQUOS4iuaJvuWIsOebuOWFs+WumuS9jeeCueagh+iusO+8jOimgeS/ruWkjeatpOmXrumimO+8jOivt+WPguingScsXG5cdFx0XHRcdFx0XHQn54Sh5rOV5ZyoUVc6UkZQUOS4iuaJvuWIsOebuOmXnOWumuS9jem7nuaomeiomO+8jOimgeS/ruW+qeatpOWVj+mhjO+8jOiri+WPg+imiydcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGxpbmtub2RlMixcblx0XHRcdFx0XHQn44CCJyxcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBzZWN0aW9uVGV4dDtcblx0XHRcdGxldCBleHBpcnlUZXh0ID0gJyc7XG5cdFx0XHRpZiAocGFyYW1zLnR5cGUgPT09ICd1bnByb3RlY3QnKSB7XG5cdFx0XHRcdFssIHNlY3Rpb25UZXh0XSA9IHNlY3Rpb25zO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0W3NlY3Rpb25UZXh0XSA9IHNlY3Rpb25zO1xuXHRcdFx0XHRleHBpcnlUZXh0ID0gTW9yZWJpdHMuc3RyaW5nLmZvcm1hdFRpbWUocGFyYW1zLmV4cGlyeSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZXF1ZXN0TGlzdCA9IHNlY3Rpb25UZXh0LnNwbGl0KC8oPz1cXG49PT0uKz09PVxccypcXG4pLyk7XG5cdFx0XHRsZXQgZm91bmQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IHJwcFJlID0gbmV3IFJlZ0V4cChcblx0XHRcdFx0YD09PVxcXFxzKihcXFxcW1xcXFxbKT9cXFxccyo6P1xcXFxzKiR7TW9yZWJpdHMucGFnZU5hbWVSZWdleChNb3JlYml0cy5wYWdlTmFtZU5vcm0pfVxcXFxzKihcXFxcXVxcXFxdKT9cXFxccyo9PT1gLFxuXHRcdFx0XHQnbSdcblx0XHRcdCk7XG5cdFx0XHRmb3IgKGxldCByZXF1ZXN0IG9mIHJlcXVlc3RMaXN0KSB7XG5cdFx0XHRcdGlmIChycHBSZS5leGVjKHJlcXVlc3QpKSB7XG5cdFx0XHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QudHJpbUVuZCgpO1xuXHRcdFx0XHRcdGlmIChwYXJhbXMudHlwZSA9PT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0XHRcdHJlcXVlc3QgKz0gJ1xcbjoge3tSRlBQfGlzdW59feOAgi0tfn4nLmNvbmNhdCgnfn5cXG4nKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVxdWVzdCArPSBgXFxuOiB7e1JGUFB8JHtwYXJhbXMudHlwZX18JHtcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkocGFyYW1zLmV4cGlyeSkgPyAnaW5maW5pdHknIDogZXhwaXJ5VGV4dFxuXHRcdFx0XHRcdFx0fX1944CCLS1+fmAuY29uY2F0KCd+flxcbicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghZm91bmQpIHtcblx0XHRcdFx0c3RhdHVzRWxlbWVudC53YXJuKHdpbmRvdy53Z1VMUygn5rKh5pyJ5om+5Yiw55u45YWz55qE6K+35rGCJywgJ+aykuacieaJvuWIsOebuOmXnOeahOiri+axgicpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy50eXBlID09PSAndW5wcm90ZWN0Jykge1xuXHRcdFx0XHR0ZXh0ID0gc2VjdGlvbnNbMF0gKyByZXF1ZXN0TGlzdC5qb2luKCcnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRleHQgPSByZXF1ZXN0TGlzdC5qb2luKCcnKSArIHNlY3Rpb25zWzFdO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHN1bW1hcnkgPSAnJztcblx0XHRcdGlmIChwYXJhbXMudHlwZSA9PT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0Wywgc2VjdGlvblRleHRdID0gc2VjdGlvbnM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRbc2VjdGlvblRleHRdID0gc2VjdGlvbnM7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ3NlbWknOlxuXHRcdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+WNiuS/neaKpCcsICfljYrkv53orbcnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndGVtcCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn5qih5p2/5L+d5oqkJywgJ+aooeadv+S/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdlY3AnOlxuXHRcdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+W7tuS8uOehruiupOS/neaKpCcsICflu7bkvLjnorroqo3kv53orbcnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZnVsbCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn5YWo5L+d5oqkJywgJ+WFqOS/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyZXZpc2lvbnByb3RlY3RlZCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn54mI5pys5L+d5oqkJywgJ+eJiOacrOS/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdvZmZpY2lhbHByb3RlY3RlZCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn6KOB5aeU5Lya5L+d5oqkJywgJ+ijgeWnlOacg+S/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdtb3ZlJzpcblx0XHRcdFx0XHRzdW1tYXJ5ID0gd2luZG93LndnVUxTKCfnp7vliqjkv53miqQnLCAn56e75YuV5L+d6K23Jyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3NhbHQnOlxuXHRcdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+eZvee6uOS/neaKpCcsICfnmb3ntJnkv53orbcnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndW5wcm90ZWN0Jzpcblx0XHRcdFx0XHRzdW1tYXJ5ID0gd2luZG93LndnVUxTKCfop6PpmaTkv53miqQnLCAn6Kej6Zmk5L+d6K23Jyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0c3RhdHVzRWxlbWVudC53YXJuKHdpbmRvdy53Z1VMUygn5pyq55+l5L+d5oqk57G75Z6LJywgJ+acquefpeS/neitt+mhnuWIpScpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoTW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkocGFyYW1zLmV4cGlyeSkpIHtcblx0XHRcdFx0c3VtbWFyeSA9IGV4cGlyeVRleHQgKyBzdW1tYXJ5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3VtbWFyeSArPSBleHBpcnlUZXh0O1xuXHRcdFx0fVxuXHRcdFx0cnBwUGFnZS5zZXRFZGl0U3VtbWFyeShgLyogJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19ICovICR7c3VtbWFyeX1gKTtcblx0XHRcdHJwcFBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cnBwUGFnZS5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRcdHJwcFBhZ2Uuc2F2ZSgpO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUucHJvdGVjdC5mb3JtYXRQcm90ZWN0aW9uRGVzY3JpcHRpb24gPSAocHJvdGVjdGlvbkxldmVscykgPT4ge1xuXHRcdGNvbnN0IHByb3RlY3Rpb25Ob2RlID0gW107XG5cdFx0aWYgKE9iamVjdC5rZXlzKHByb3RlY3Rpb25MZXZlbHMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0W3Byb3RlY3Rpb25Ob2RlW3Byb3RlY3Rpb25Ob2RlLmxlbmd0aF1dID0gJCgnPGI+JykudGV4dCh3aW5kb3cud2dVTFMoJ+aXoOS/neaKpCcsICfnhKHkv53orbcnKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoY29uc3QgW3R5cGUsIHNldHRpbmdzXSBvZiBPYmplY3QuZW50cmllcyhwcm90ZWN0aW9uTGV2ZWxzKSkge1xuXHRcdFx0XHRsZXQgbGFiZWw7XG5cdFx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRcdGNhc2UgJ2VkaXQnOlxuXHRcdFx0XHRcdFx0bGFiZWwgPSB3aW5kb3cud2dVTFMoJ+e8lui+kScsICfnt6jovK8nKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21vdmUnOlxuXHRcdFx0XHRcdFx0bGFiZWwgPSB3aW5kb3cud2dVTFMoJ+enu+WKqCcsICfnp7vli5UnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NyZWF0ZSc6XG5cdFx0XHRcdFx0XHRsYWJlbCA9IHdpbmRvdy53Z1VMUygn5Yib5bu6JywgJ+W7uueriycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndXBsb2FkJzpcblx0XHRcdFx0XHRcdGxhYmVsID0gd2luZG93LndnVUxTKCfkuIrkvKAnLCAn5LiK5YKzJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0bGFiZWwgPSB0eXBlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IGxldmVsO1xuXHRcdFx0XHRzd2l0Y2ggKHNldHRpbmdzLmxldmVsKSB7XG5cdFx0XHRcdFx0Y2FzZSAnb2ZmaWNpYWxwcm90ZWN0ZWQnOlxuXHRcdFx0XHRcdFx0bGV2ZWwgPSB3aW5kb3cud2dVTFMoJ+S7heWFgeiuuOijgeWGs+WnlOWRmCcsICflg4XlhYHoqLHoo4Hmsbrlp5Tlk6EnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JldmlzaW9ucHJvdGVjdGVkJzpcblx0XHRcdFx0XHRcdGxldmVsID0gd2luZG93LndnVUxTKCfku4XlhYHorrjotYTmt7HnlKjmiLcnLCAn5YOF5YWB6Kix6LOH5rex55So5oi2Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdhdXRvY29uZmlybWVkJzpcblx0XHRcdFx0XHRcdGxldmVsID0gd2luZG93LndnVUxTKCfku4XlhYHorrjoh6rliqjnoa7orqTnlKjmiLcnLCAn5YOF5YWB6Kix6Ieq5YuV56K66KqN5L2/55So6ICFJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd0ZW1wbGF0ZWVkaXRvcic6XG5cdFx0XHRcdFx0XHRsZXZlbCA9IHdpbmRvdy53Z1VMUygn5LuF5qih5p2/57yW6L6R5ZGY5ZKM566h55CG5ZGYJywgJ+WDheaooeadv+e3qOi8r+WToeWSjOeuoeeQhuWToScpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3lzb3AnOlxuXHRcdFx0XHRcdFx0bGV2ZWwgPSB3aW5kb3cud2dVTFMoJ+S7heeuoeeQhuWRmCcsICflg4XnrqHnkIblk6EnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHQoe2xldmVsfSA9IHNldHRpbmdzKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFtwcm90ZWN0aW9uTm9kZVtwcm90ZWN0aW9uTm9kZS5sZW5ndGhdXSA9ICQoJzxiPicpLnRleHQoYCR7bGFiZWx977yaJHtsZXZlbH1gKTtcblx0XHRcdFx0aWYgKE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHNldHRpbmdzLmV4cGlyeSkpIHtcblx0XHRcdFx0XHRwcm90ZWN0aW9uTm9kZVtwcm90ZWN0aW9uTm9kZS5sZW5ndGhdID0gd2luZG93LndnVUxTKCfvvIjml6DpmZDmnJ/vvIknLCAn77yI54Sh6ZmQ5pyf77yJJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHJvdGVjdGlvbk5vZGVbcHJvdGVjdGlvbk5vZGUubGVuZ3RoXSA9XG5cdFx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ++8iOi/h+acn++8micsICfvvIjpgY7mnJ/vvJonKSArIG5ldyBNb3JlYml0cy5kYXRlKHNldHRpbmdzLmV4cGlyeSkuY2FsZW5kYXIoJ3V0Yycpfe+8iWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNldHRpbmdzLmNhc2NhZGUpIHtcblx0XHRcdFx0XHRwcm90ZWN0aW9uTm9kZVtwcm90ZWN0aW9uTm9kZS5sZW5ndGhdID0gd2luZG93LndnVUxTKCfvvIjov57plIHvvIknLCAn77yI6YCj6Y6W77yJJyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHByb3RlY3Rpb25Ob2RlO1xuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLnByb3RlY3QsICdwcm90ZWN0Jyk7XG59KShqUXVlcnkpO1xuXG5leHBvcnQge307XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gZnJpZW5kbHl0YWcuanMgKi9cbihmdW5jdGlvbiBmcmllbmRseXRhZygkKSB7XG5cdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHQvKipcblx0ICogZnJpZW5kbHl0YWcuanM6IFRhZyBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiVGFnXCIpXG5cdCAqIEFjdGl2ZSBvbjogRXhpc3RpbmcgYXJ0aWNsZXMgYW5kIGRyYWZ0czsgZmlsZSBwYWdlcyB3aXRoIGEgY29ycmVzcG9uZGluZyBmaWxlXG5cdCAqIHdoaWNoIGlzIGxvY2FsIChub3Qgb24gU2hhcmUpOyBhbGwgcmVkaXJlY3RzXG5cdCAqL1xuXHRUd2lua2xlLnRhZyA9ICgpID0+IHtcblx0XHQvLyByZWRpcmVjdCB0YWdnaW5nXG5cdFx0aWYgKE1vcmViaXRzLmlzUGFnZVJlZGlyZWN0KCkpIHtcblx0XHRcdFR3aW5rbGUudGFnLm1vZGUgPSB3aW5kb3cud2dVTFMoJ+mHjeWumuWQkScsICfph43mlrDlsI7lkJEnKTtcblx0XHRcdFR3aW5rbGUudGFnLm1vZGVFbiA9ICdyZWRpcmVjdCc7XG5cdFx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0XHRUd2lua2xlLnRhZy5jYWxsYmFjayxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmoIforrAnLCAn5qiZ6KiYJyksXG5cdFx0XHRcdCdmcmllbmRseS10YWcnLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+agh+iusOmHjeWumuWQkScsICfmqJnoqJjph43mlrDlsI7lkJEnKVxuXHRcdFx0KTtcblx0XHRcdC8vIGZpbGUgdGFnZ2luZ1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSA2ICYmXG5cdFx0XHQhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LXNoYXJlZHVwbG9hZCcpICYmXG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctaW1hZ2VwYWdlLXNlY3Rpb24tZmlsZWhpc3RvcnknKVxuXHRcdCkge1xuXHRcdFx0VHdpbmtsZS50YWcubW9kZSA9IHdpbmRvdy53Z1VMUygn5paH5Lu2JywgJ+aqlOahiCcpO1xuXHRcdFx0VHdpbmtsZS50YWcubW9kZUVuID0gJ2ZpbGUnO1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFx0VHdpbmtsZS50YWcuY2FsbGJhY2ssXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5qCH6K6wJywgJ+aomeiomCcpLFxuXHRcdFx0XHQnZnJpZW5kbHktdGFnJyxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmoIforrDmlofku7YnLCAn5qiZ6KiY5qqU5qGIJylcblx0XHRcdCk7XG5cdFx0XHQvLyBhcnRpY2xlL2RyYWZ0IHRhZ2dpbmdcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0KFswLCAxMThdLmluY2x1ZGVzKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykpICYmIG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpKSB8fFxuXHRcdFx0TW9yZWJpdHMucGFnZU5hbWVOb3JtID09PSBUd2lua2xlLmdldFByZWYoJ3NhbmRib3hQYWdlJylcblx0XHQpIHtcblx0XHRcdFR3aW5rbGUudGFnLm1vZGUgPSB3aW5kb3cud2dVTFMoJ+adoeebricsICfmop3nm64nKTtcblx0XHRcdFR3aW5rbGUudGFnLm1vZGVFbiA9ICdhcnRpY2xlJztcblx0XHRcdC8vIENhbid0IHJlbW92ZSB0YWdzIHdoZW4gbm90IHZpZXdpbmcgY3VycmVudCB2ZXJzaW9uXG5cdFx0XHRUd2lua2xlLnRhZy5jYW5SZW1vdmUgPVxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSA9PT0gbXcuY29uZmlnLmdldCgnd2dSZXZpc2lvbklkJykgJiZcblx0XHRcdFx0Ly8gRGlzYWJsZWQgb24gbGF0ZXN0IGRpZmYgYmVjYXVzZSB0aGUgZGlmZiBzbGlkZXIgY291bGQgYmUgdXNlZCB0byBzbGlkZVxuXHRcdFx0XHQvLyBhd2F5IGZyb20gdGhlIGxhdGVzdCBkaWZmIHdpdGhvdXQgY2F1c2luZyB0aGUgc2NyaXB0IHRvIHJlbG9hZFxuXHRcdFx0XHQhbXcuY29uZmlnLmdldCgnd2dEaWZmTmV3SWQnKTtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdFR3aW5rbGUudGFnLmNhbGxiYWNrLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+agh+iusCcsICfmqJnoqJgnKSxcblx0XHRcdFx0J2ZyaWVuZGx5LXRhZycsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5qCH6K6w5p2h55uuJywgJ+aomeiomOaineebricpXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS50YWcuY2hlY2tlZFRhZ3MgPSBbXTtcblx0VHdpbmtsZS50YWcuY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgV2luZG93ID0gbmV3IE1vcmViaXRzLnNpbXBsZVdpbmRvdyg2MzAsIFR3aW5rbGUudGFnLm1vZGVFbiA9PT0gJ2FydGljbGUnID8gNTAwIDogNDAwKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5qCH6K6w6K6+572uJywgJ+aomeiomOioreWumicpLCAnSDpUVy9QUkVGI3RhZycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXL0RPQyN0YWcnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLnRhZy5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+etm+mAieagh+iusOWIl+ihqO+8micsICfnr6npgbjmqJnoqJjliJfooajvvJonKSxcblx0XHRcdG5hbWU6ICdxdWlja2ZpbHRlcicsXG5cdFx0XHRzaXplOiAnMzAnLFxuXHRcdFx0ZXZlbnQ6IGZ1bmN0aW9uIGV2ZW50KCkge1xuXHRcdFx0XHQvLyBmbHVzaCB0aGUgRE9NIG9mIGFsbCBleGlzdGluZyB1bmRlcmxpbmUgc3BhbnNcblx0XHRcdFx0JGFsbENoZWNrYm94RGl2cy5maW5kKCcuc2VhcmNoLWhpdCcpLmVhY2goKF9pLCBlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbGFiZWxfZWxlbWVudCA9IGUucGFyZW50RWxlbWVudDtcblx0XHRcdFx0XHQvLyBUaGlzIHdvdWxkIGNvbnZlcnQgPGxhYmVsPkhlbGxvIDxzcGFuIGNsYXNzPXNlYXJjaC1oaXQ+d288L3NwYW4+cmxkPC9sYWJlbD5cblx0XHRcdFx0XHQvLyB0byA8bGFiZWw+SGVsbG8gd29ybGQ8L2xhYmVsPlxuXHRcdFx0XHRcdGxhYmVsX2VsZW1lbnQuaW5uZXJIVE1MID0gbGFiZWxfZWxlbWVudC50ZXh0Q29udGVudDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICh0aGlzLnZhbHVlKSB7XG5cdFx0XHRcdFx0JGFsbENoZWNrYm94RGl2cy5oaWRlKCk7XG5cdFx0XHRcdFx0JGFsbEhlYWRlcnMuaGlkZSgpO1xuXHRcdFx0XHRcdGNvbnN0IHNlYXJjaFN0cmluZyA9IHRoaXMudmFsdWU7XG5cdFx0XHRcdFx0Y29uc3Qgc2VhcmNoUmVnZXggPSBuZXcgUmVnRXhwKG13LnV0aWwuZXNjYXBlUmVnRXhwKHNlYXJjaFN0cmluZyksICdpJyk7XG5cdFx0XHRcdFx0JGFsbENoZWNrYm94RGl2cy5maW5kKCdsYWJlbCcpLmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbGFiZWxfdGV4dCA9IGVsZW1lbnQudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRjb25zdCBzZWFyY2hIaXQgPSBzZWFyY2hSZWdleC5leGVjKGxhYmVsX3RleHQpO1xuXHRcdFx0XHRcdFx0aWYgKHNlYXJjaEhpdCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IFt0ZXh0bm9kZV0gPSBlbGVtZW50LmNoaWxkTm9kZXM7XG5cdFx0XHRcdFx0XHRcdHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh0ZXh0bm9kZSk7XG5cdFx0XHRcdFx0XHRcdHJhbmdlLnNldFN0YXJ0KHRleHRub2RlLCBzZWFyY2hIaXQuaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRyYW5nZS5zZXRFbmQodGV4dG5vZGUsIHNlYXJjaEhpdC5pbmRleCArIHNlYXJjaFN0cmluZy5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBbdW5kZXJsaW5lX3NwYW5dID0gJCgnPHNwYW4+Jylcblx0XHRcdFx0XHRcdFx0XHQuYWRkQ2xhc3MoJ3NlYXJjaC1oaXQnKVxuXHRcdFx0XHRcdFx0XHRcdC5jc3MoJ3RleHQtZGVjb3JhdGlvbicsICd1bmRlcmxpbmUnKTtcblx0XHRcdFx0XHRcdFx0cmFuZ2Uuc3Vycm91bmRDb250ZW50cyh1bmRlcmxpbmVfc3Bhbik7XG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsgLy8gc2hvd1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCRhbGxDaGVja2JveERpdnMuc2hvdygpO1xuXHRcdFx0XHRcdCRhbGxIZWFkZXJzLnNob3coKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9KTtcblx0XHRzd2l0Y2ggKFR3aW5rbGUudGFnLm1vZGVFbikge1xuXHRcdFx0Y2FzZSAnYXJ0aWNsZSc6XG5cdFx0XHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+adoeebrue7tOaKpOagh+iusCcsICfmop3nm67ntq3orbfmqJnoqJgnKSk7XG5cdFx0XHRcdC8vIEJ1aWxkIHNvcnRpbmcgYW5kIGxvb2t1cCBvYmplY3QgZmxhdE9iamVjdCwgd2hpY2ggaXMgYWx3YXlzXG5cdFx0XHRcdC8vIG5lZWRlZCBidXQgYWxzbyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBhbHBoYWJldGljYWwgbGlzdFxuXHRcdFx0XHQvLyBXb3VsZCBiZSBpbmZpbml0ZWx5IGJldHRlciB3aXRoIE9iamVjdC52YWx1ZXNcblx0XHRcdFx0VHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0ID0ge307XG5cdFx0XHRcdGZvciAoY29uc3QgZ3JvdXAgb2YgVHdpbmtsZS50YWcuYXJ0aWNsZS50YWdMaXN0KSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzdWJncm91cCBvZiBncm91cC52YWx1ZSkge1xuXHRcdFx0XHRcdFx0aWYgKHN1Ymdyb3VwLnZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBzdWJncm91cC52YWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFtpdGVtLnRhZ10gPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogaXRlbS5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdGV4Y2x1ZGVNSTogISFpdGVtLmV4Y2x1ZGVNSSxcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnRhZy5hcnRpY2xlLmZsYXRPYmplY3Rbc3ViZ3JvdXAudGFnXSA9IHtcblx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc3ViZ3JvdXAuZGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRcdFx0ZXhjbHVkZU1JOiAhIXN1Ymdyb3VwLmV4Y2x1ZGVNSSxcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdG5hbWU6ICdzb3J0b3JkZXInLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+afpeeci+WIl+ihqO+8micsICfmqqLoppbliJfooajvvJonKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5oKo5Y+v5Lul5ZyoVHdpbmtsZeWPguaVsOiuvue9ru+8iEg6VFcvUFJFRu+8ieS4reabtOaUueatpOmhueOAgicsXG5cdFx0XHRcdFx0XHQn5oKo5Y+v5Lul5ZyoVHdpbmtsZeWBj+WlveioreWumu+8iEg6VFcvUFJFRu+8ieS4reabtOaUueatpOmgheOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLnRhZy51cGRhdGVTb3J0T3JkZXIsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdjYXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmjInnsbvlnosnLCAn5oyJ6aGe5YilJyksXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiBUd2lua2xlLmdldFByZWYoJ3RhZ0FydGljbGVTb3J0T3JkZXInKSA9PT0gJ2NhdCcsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdhbHBoYScsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn5oyJ5a2X5q+NJyxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IFR3aW5rbGUuZ2V0UHJlZigndGFnQXJ0aWNsZVNvcnRPcmRlcicpID09PSAnYWxwaGEnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFUd2lua2xlLnRhZy5jYW5SZW1vdmUpIHtcblx0XHRcdFx0XHRjb25zdCBkaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRcdFx0ZGl2RWxlbWVudC5pbm5lckhUTUwgPSB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6KaB56e76Zmk546w5pyJ57u05oqk5qCH6K6w77yM6K+35LuO5b2T5YmN5p2h55uu54mI5pys5Lit5omT5byA4oCc5qCH6K6w4oCd6I+c5Y2VJyxcblx0XHRcdFx0XHRcdCfopoHnp7vpmaTnj77mnInntq3orbfmqJnoqJjvvIzoq4vlvp7nm67liY3mop3nm67niYjmnKzkuK3miZPplovjgIzmqJnoqJjjgI3pgbjllq4nXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICd1bnRhZ25vdGljZScsXG5cdFx0XHRcdFx0XHRsYWJlbDogZGl2RWxlbWVudCxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0YWdXb3JrQXJlYScsXG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiAnbW9yZWJpdHMtc2Nyb2xsYm94Jyxcblx0XHRcdFx0XHRzdHlsZTogJ21heC1oZWlnaHQ6IDI4ZW0nLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflpoLlj6/og73vvIzlkIjlubblhaV7e211bHRpcGxlIGlzc3Vlc319Jyxcblx0XHRcdFx0XHRcdFx0XHQn5aaC5Y+v6IO977yM5ZCI5L215YWle3ttdWx0aXBsZSBpc3N1ZXN9fSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdncm91cCcsXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdncm91cCcsXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6Iul5Yqg5YWle3ttdWx0aXBsZSBpc3N1ZXN9feaUr+aMgeeahOS4ieS4quS7peS4iueahOaooeadv++8jOaJgOacieaUr+aMgeeahOaooeadv+mDveS8muiiq+WQiOW5tuWFpXt7bXVsdGlwbGUgaXNzdWVzfX3mqKHmnb/kuK3jgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfoi6XliqDlhaV7e211bHRpcGxlIGlzc3Vlc3195pSv5o+055qE5LiJ5YCL5Lul5LiK55qE5qih5p2/77yM5omA5pyJ5pSv5o+055qE5qih5p2/6YO95pyD6KKr5ZCI5L215YWle3ttdWx0aXBsZSBpc3N1ZXN9feaooeadv+S4reOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdncm91cEJ5RGVmYXVsdCcpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bGFiZWw6ICfnkIbnlLHvvJonLFxuXHRcdFx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfpmYTliqDkuo7nvJbovpHmkZjopoHnmoTlj6/pgInnkIbnlLHvvIzkvovlpoLmjIflh7rmnaHnm67lhoXlrrnnmoTlk6rkupvpg6jliIbmnInpl67popjmiJbnp7vpmaTmqKHmnb/nmoTnkIbnlLHvvIzkvYboi6XnkIbnlLHlvojplb/liJnlupTor6Xlj5HooajlnKjorqjorrrpobXjgIInLFxuXHRcdFx0XHRcdFx0J+mZhOWKoOaWvOe3qOi8r+aRmOimgeeahOWPr+mBuOeQhueUse+8jOS+i+WmguaMh+WHuuaineebruWFp+WuueeahOWTquS6m+mDqOWIhuacieWVj+mhjOaIluenu+mZpOaooeadv+eahOeQhueUse+8jOS9huiLpeeQhueUseW+iOmVt+WJh+aHieipsueZvOihqOWcqOiojuirlumggeOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHNpemU6ICc4MCcsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2ZpbGUnOlxuXHRcdFx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmlofku7bnu7TmiqTmoIforrAnLCAn5qqU5qGI57at6K235qiZ6KiYJykpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGdyb3VwIG9mIFR3aW5rbGUudGFnLmZpbGVMaXN0KSB7XG5cdFx0XHRcdFx0aWYgKGdyb3VwLmJ1aWxkRmlsZW5hbWUpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgZWwgb2YgZ3JvdXAudmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0ZWwuc3ViZ3JvdXAgPSB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmm7/mjaLnmoTmlofku7bvvJonLCAn5pu/5o+b55qE5qqU5qGI77yaJyksXG5cdFx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+i+k+WFpeabv+aNouatpOaWh+S7tueahOaWh+S7tuWQjeensO+8iOW/heWhq++8iScsXG5cdFx0XHRcdFx0XHRcdFx0XHQn6Ly45YWl5pu/5o+b5q2k5qqU5qGI55qE5qqU5qGI5ZCN56ix77yI5b+F5aGr77yJJ1xuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogYCR7ZWwudmFsdWUucmVwbGFjZSgvIC9nLCAnXycpfUZpbGVgLFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRcdGxhYmVsOiBncm91cC5rZXksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICd0YWdzJyxcblx0XHRcdFx0XHRcdGxpc3Q6IGdyb3VwLnZhbHVlLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2N1c3RvbUZpbGVUYWdMaXN0JykubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnmqKHmnb8nLCAn6Ieq6KiC5qih5p2/JyksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICd0YWdzJyxcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tRmlsZVRhZ0xpc3QnKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JlZGlyZWN0Jzoge1xuXHRcdFx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfph43lrprlkJHmoIforrAnLCAn6YeN5paw5bCO5ZCR5qiZ6KiYJykpO1xuXHRcdFx0XHRjb25zdCBpID0gMTtcblx0XHRcdFx0Zm9yIChjb25zdCBncm91cCBvZiBUd2lua2xlLnRhZy5yZWRpcmVjdExpc3QpIHtcblx0XHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRcdGlkOiBgdGFnSGVhZGVyJHtpfWAsXG5cdFx0XHRcdFx0XHRsYWJlbDogZ3JvdXAua2V5LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0XHRuYW1lOiAndGFncycsXG5cdFx0XHRcdFx0XHRsaXN0OiBncm91cC52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbS50YWcsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7eyR7aXRlbS50YWd9fX3vvJoke2l0ZW0uZGVzY3JpcHRpb259YCxcblx0XHRcdFx0XHRcdFx0XHRzdWJncm91cDogaXRlbS5zdWJncm91cCxcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2N1c3RvbVJlZGlyZWN0VGFnTGlzdCcpLmxlbmd0aCkge1xuXHRcdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5qih5p2/JywgJ+iHquioguaooeadvycpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0XHRuYW1lOiAndGFncycsXG5cdFx0XHRcdFx0XHRsaXN0OiBUd2lua2xlLmdldFByZWYoJ2N1c3RvbVJlZGlyZWN0VGFnTGlzdCcpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dm9pZCBtdy5ub3RpZnkoYFR3aW5rbGUudGFn77ya5pyq55+l5qih5byPICR7VHdpbmtsZS50YWcubW9kZX1gLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ2ZyaWVuZGx5dGFnJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhdHJvbGxpbmsnKS5sZW5ndGgpIHtcblx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOmhtemdouS4uuW3suW3oeafpScsICfmqJnoqJjpoIHpnaLngrrlt7Llt6Hmn6UnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAncGF0cm9sJyxcblx0XHRcdFx0XHRcdG5hbWU6ICdwYXRyb2wnLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdtYXJrVGFnZ2VkUGFnZXNBc1BhdHJvbGxlZCcpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0XHRjbGFzc05hbWU6ICd0dy10YWctc3VibWl0Jyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0XHQvLyBmb3IgcXVpY2sgZmlsdGVyOlxuXHRcdCRhbGxDaGVja2JveERpdnMgPSAkKHJlc3VsdCkuZmluZCgnW25hbWUkPXRhZ3NdJykucGFyZW50KCk7XG5cdFx0JGFsbEhlYWRlcnMgPSAkKHJlc3VsdCkuZmluZCgnaDUnKTtcblx0XHRyZXN1bHQucXVpY2tmaWx0ZXIuZm9jdXMoKTsgLy8gcGxhY2UgY3Vyc29yIGluIHRoZSBxdWljayBmaWx0ZXIgZmllbGQgYXMgc29vbiBhcyB3aW5kb3cgaXMgb3BlbmVkXG5cdFx0cmVzdWx0LnF1aWNrZmlsdGVyLmF1dG9jb21wbGV0ZSA9ICdvZmYnOyAvLyBkaXNhYmxlIGJyb3dzZXIgc3VnZ2VzdGlvbnNcblx0XHRyZXN1bHQucXVpY2tmaWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuXHRcdFx0aWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG5cdFx0XHRcdC8vIHByZXZlbnQgZW50ZXIga2V5IGZyb20gYWNjaWRlbnRhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm1cblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKFR3aW5rbGUudGFnLm1vZGVFbiA9PT0gJ2FydGljbGUnKSB7XG5cdFx0XHRUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3MgPSBbXTtcblx0XHRcdGlmIChUd2lua2xlLnRhZy5jYW5SZW1vdmUpIHtcblx0XHRcdFx0Ly8gTG9vayBmb3IgZXhpc3RpbmcgbWFpbnRlbmFuY2UgdGFncyBpbiB0aGUgbGVhZCBzZWN0aW9uIGFuZCBwdXQgdGhlbSBpbiBhcnJheVxuXHRcdFx0XHQvLyBBbGwgdGFncyBhcmUgSFRNTCB0YWJsZSBlbGVtZW50cyB0aGF0IGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgLm13LXBhcnNlci1vdXRwdXQsXG5cdFx0XHRcdC8vIGV4Y2VwdCB3aGVuIHRoZXkgYXJlIHdpdGhpbiB7e211bHRpcGxlIGlzc3Vlc319XG5cdFx0XHRcdCRib2R5XG5cdFx0XHRcdFx0LmZpbmQoJy5tdy1wYXJzZXItb3V0cHV0Jylcblx0XHRcdFx0XHQuY2hpbGRyZW4oKVxuXHRcdFx0XHRcdC5lYWNoKChfaSwgZSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gYnJlYWsgb3V0IG9uIGVuY291bnRlcmluZyB0aGUgZmlyc3QgaGVhZGluZywgd2hpY2ggbWVhbnMgd2UgYXJlIG5vXG5cdFx0XHRcdFx0XHQvLyBsb25nZXIgaW4gdGhlIGxlYWQgc2VjdGlvblxuXHRcdFx0XHRcdFx0aWYgKGUudGFnTmFtZSA9PT0gJ0gyJykge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBUaGUgYWJpbGl0eSB0byByZW1vdmUgdGFncyBkZXBlbmRzIG9uIHRoZSB0ZW1wbGF0ZSdzIHt7YW1ib3h9fSB8bmFtZT1cblx0XHRcdFx0XHRcdC8vIHBhcmFtZXRlciBiZWFyaW5nIHRoZSB0ZW1wbGF0ZSdzIGNvcnJlY3QgbmFtZSAocHJlZmVyYWJseSkgb3IgYSBuYW1lIHRoYXQgYXRcblx0XHRcdFx0XHRcdC8vIGxlYXN0IHJlZGlyZWN0cyB0byB0aGUgYWN0dWFsIG5hbWVcblx0XHRcdFx0XHRcdC8vIEFsbCB0YWdzIGhhdmUgdGhlaXIgZmlyc3QgY2xhc3MgbmFtZSBhcyBcImJveC1cIiArIHRlbXBsYXRlIG5hbWVcblx0XHRcdFx0XHRcdGlmIChlLmNsYXNzTmFtZS5pbmRleE9mKCdib3gtJykgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKGUuY2xhc3NMaXN0WzBdID09PSAnYm94LemXrumimOadoeebricpIHtcblx0XHRcdFx0XHRcdFx0XHQkKGUpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZmluZCgnLmFtYm94Jylcblx0XHRcdFx0XHRcdFx0XHRcdC5lYWNoKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0WzBdLmluZGV4T2YoJ2JveC0nKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJveFRhZyA9IGVsZW1lbnQuY2xhc3NMaXN0WzBdLnNsaWNlKCdib3gtJy5sZW5ndGgpLnJlcGxhY2UoL18vZywgJyAnKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3NbVHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzLmxlbmd0aF0gPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ym94VGFnO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gY29udGludWVcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRhZyA9IGUuY2xhc3NMaXN0WzBdLnNsaWNlKCdib3gtJy5sZW5ndGgpLnJlcGxhY2UoL18vZywgJyAnKTtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzW1R3aW5rbGUudGFnLmFscmVhZHlQcmVzZW50VGFncy5sZW5ndGhdID0gdGFnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHQvLyB7e1VuY2F0ZWdvcml6ZWR9fSBhbmQge3tJbXByb3ZlIGNhdGVnb3JpZXN9fSBhcmUgdXN1YWxseSBwbGFjZWQgYXQgdGhlIGVuZFxuXHRcdFx0XHRpZiAoJGJvZHkuZmluZCgnLmJveC1VbmNhdGVnb3JpemVkJykubGVuZ3RoKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzW1R3aW5rbGUudGFnLmFscmVhZHlQcmVzZW50VGFncy5sZW5ndGhdID0gJ1VuY2F0ZWdvcml6ZWQnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgkYm9keS5maW5kKCcuYm94LUltcHJvdmVfY2F0ZWdvcmllcycpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFR3aW5rbGUudGFnLmFscmVhZHlQcmVzZW50VGFnc1tUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3MubGVuZ3RoXSA9ICdJbXByb3ZlIGNhdGVnb3JpZXMnO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBBZGQgc3RhdHVzIHRleHQgbm9kZSBhZnRlciBTdWJtaXQgYnV0dG9uXG5cdFx0XHRjb25zdCBzdGF0dXNOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0c3RhdHVzTm9kZS5zdHlsZS5mb250U2l6ZSA9ICc5MCUnO1xuXHRcdFx0c3RhdHVzTm9kZS5pZCA9ICd0dy10YWctc3RhdHVzJztcblx0XHRcdFR3aW5rbGUudGFnLnN0YXR1cyA9IHtcblx0XHRcdFx0Ly8gaW5pdGlhbCBzdGF0ZTsgZGVmaW5lZCBsaWtlIHRoaXMgYmVjYXVzZSB0aGVzZSBuZWVkIHRvIGJlIGF2YWlsYWJsZSBmb3IgcmVmZXJlbmNlXG5cdFx0XHRcdC8vIGluIHRoZSBjbGljayBldmVudCBoYW5kbGVyXG5cdFx0XHRcdG51bUFkZGVkOiAwLFxuXHRcdFx0XHRudW1SZW1vdmVkOiAwLFxuXHRcdFx0fTtcblx0XHRcdCRib2R5LmZpbmQoJ2J1dHRvbi50dy10YWctc3VibWl0JykuYWZ0ZXIoc3RhdHVzTm9kZSk7XG5cdFx0XHQvLyBmYWtlIGEgY2hhbmdlIGV2ZW50IG9uIHRoZSBzb3J0IGRyb3Bkb3duLCB0byBpbml0aWFsaXplIHRoZSB0YWcgbGlzdFxuXHRcdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRcdHJlc3VsdC5zb3J0b3JkZXIuZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZWRpcmVjdHMgYW5kIGZpbGVzOiBBZGQgYSBsaW5rIHRvIGVhY2ggdGVtcGxhdGUncyBkZXNjcmlwdGlvbiBwYWdlXG5cdFx0XHRmb3IgKGNvbnN0IGNoZWNrYm94IG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhyZXN1bHQsICd0YWdzJykpIHtcblx0XHRcdFx0Z2VuZXJhdGVMaW5rcyhjaGVja2JveCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyAkYWxsQ2hlY2tib3hEaXZzIGFuZCAkYWxsSGVhZGVycyBhcmUgZGVmaW5lZCBnbG9iYWxseSwgcmF0aGVyIHRoYW4gaW4gdGhlXG5cdC8vIHF1aWNrZmlsdGVyIGV2ZW50IGZ1bmN0aW9uLCB0byBhdm9pZCBoYXZpbmcgdG8gcmVjb21wdXRlIHRoZW0gb24gZXZlcnkga2V5ZG93blxuXHRsZXQgJGFsbENoZWNrYm94RGl2cztcblx0bGV0ICRhbGxIZWFkZXJzO1xuXHRUd2lua2xlLnRhZy51cGRhdGVTb3J0T3JkZXIgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHtmb3JtfSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHNvcnRvcmRlciA9IGUudGFyZ2V0LnZhbHVlO1xuXHRcdFR3aW5rbGUudGFnLmNoZWNrZWRUYWdzID0gZm9ybS5nZXRDaGVja2VkKCd0YWdzJyk7XG5cdFx0Y29uc3QgY29udGFpbmVyID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdHR5cGU6ICdmcmFnbWVudCcsXG5cdFx0fSk7XG5cdFx0Ly8gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBjaGVja2JveCwgd2l0aCBhcHByb3ByaWF0ZSBzdWJncm91cCBpZiBuZWVkZWRcblx0XHRjb25zdCBtYWtlQ2hlY2tib3ggPSAodGFnLCBkZXNjcmlwdGlvbikgPT4ge1xuXHRcdFx0Y29uc3QgY2hlY2tib3ggPSB7XG5cdFx0XHRcdHZhbHVlOiB0YWcsXG5cdFx0XHRcdGxhYmVsOiBge3ske3RhZ319fTogJHtkZXNjcmlwdGlvbn1gLFxuXHRcdFx0fTtcblx0XHRcdGlmIChUd2lua2xlLnRhZy5jaGVja2VkVGFncy5pbmNsdWRlcyh0YWcpKSB7XG5cdFx0XHRcdGNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoICh0YWcpIHtcblx0XHRcdFx0Y2FzZSAnRXhwZXJ0IG5lZWRlZCc6XG5cdFx0XHRcdFx0Y2hlY2tib3guc3ViZ3JvdXAgPSBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdleHBlcnQnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflk6rkuKrpoobln5/nmoTkuJPlrrbvvIjlv4XloavvvInvvJonLCAn5ZOq5YCL6aCY5Z+f55qE5bCI5a6277yI5b+F5aGr77yJ77yaJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5b+F5aGr77yM5Y+v5Y+C6ICDIENhdGVnb3J5OumcgOimgeS4k+S4muS6uuWjq+WFs+azqOeahOmhtemdoiDkvb/nlKjnjrDlrZjnmoTliIbnsbvjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCflv4XloavvvIzlj6/lj4PogIMgQ2F0ZWdvcnk66ZyA6KaB5bCI5qWt5Lq65aOr6Zec5rOo55qE6aCB6Z2iIOS9v+eUqOePvuWtmOeahOWIhumhnuOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdleHBlcnQyJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5ZOq5Liq6aKG5Z+f55qE5LiT5a6277yaJywgJ+WTquWAi+mgmOWfn+eahOWwiOWutu+8micpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mAie+8jOWPr+WPguiAgyBDYXRlZ29yeTrpnIDopoHkuJPkuJrkurrlo6vlhbPms6jnmoTpobXpnaIg5L2/55So546w5a2Y55qE5YiG57G744CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6YG477yM5Y+v5Y+D6ICDIENhdGVnb3J5OumcgOimgeWwiOalreS6uuWjq+mXnOazqOeahOmggemdoiDkvb/nlKjnj77lrZjnmoTliIbpoZ7jgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnZXhwZXJ0MycsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WTquS4qumihuWfn+eahOS4k+Wutu+8micsICflk6rlgIvpoJjln5/nmoTlsIjlrrbvvJonKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflj6/pgInvvIzlj6/lj4LogIMgQ2F0ZWdvcnk66ZyA6KaB5LiT5Lia5Lq65aOr5YWz5rOo55qE6aG16Z2iIOS9v+eUqOeOsOWtmOeahOWIhuexu+OAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mBuO+8jOWPr+WPg+iAgyBDYXRlZ29yeTrpnIDopoHlsIjmpa3kurrlo6vpl5zms6jnmoTpoIHpnaIg5L2/55So54++5a2Y55qE5YiG6aGe44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdNZXJnZSc6XG5cdFx0XHRcdGNhc2UgJ01lcmdlIGZyb20nOlxuXHRcdFx0XHRjYXNlICdNZXJnZSB0byc6IHtcblx0XHRcdFx0XHRsZXQgb3RoZXJUYWdOYW1lID0gJ01lcmdlJztcblx0XHRcdFx0XHRzd2l0Y2ggKHRhZykge1xuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgZnJvbSc6XG5cdFx0XHRcdFx0XHRcdG90aGVyVGFnTmFtZSA9ICdNZXJnZSB0byc7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgdG8nOlxuXHRcdFx0XHRcdFx0XHRvdGhlclRhZ05hbWUgPSAnTWVyZ2UgZnJvbSc7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gbm8gZGVmYXVsdFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNoZWNrYm94LnN1Ymdyb3VwID0gW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnbWVyZ2VUYXJnZXQnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhbbku5bmnaHnm67vvJonLCAn5YW25LuW5qKd55uu77yaJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5aaC5oyH5a6a5aSa5Liq5p2h55uu77yM6K+355So566h6YGT56ym5YiG6ZqU77ya5p2h55uu55SyfOadoeebruS5mScsXG5cdFx0XHRcdFx0XHRcdFx0J+WmguaMh+WumuWkmuWAi+aineebru+8jOiri+eUqOeuoemBk+espuWIhumalO+8muaineebrueUsnzmop3nm67kuZknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogJ21lcmdlVGFnT3RoZXInLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGDnlKh7eyR7b3RoZXJUYWdOYW1lfSR7d2luZG93LndnVUxTKCd9feagh+iusOWFtuS7luadoeebricsICd9feaomeiomOWFtuS7luaineebricpfWAsXG5cdFx0XHRcdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQn5LuF5Zyo5Y+q6L6T5YWl5LqG5LiA5Liq5p2h55uu5ZCN5pe25Y+v55SoJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0J+WDheWcqOWPqui8uOWFpeS6huS4gOWAi+aineebruWQjeaZguWPr+eUqCdcblx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0Y2hlY2tib3guc3ViZ3JvdXBbY2hlY2tib3guc3ViZ3JvdXAubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ21lcmdlUmVhc29uJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRg5ZCI5bm255CG55Sx77yI5Lya6KKr6LS05LiKJHt0YWcgPT09ICdNZXJnZSB0bycgPyAn5YW25LuWJyA6ICfov5knfeadoeebrueahOiuqOiuuumhte+8ie+8mmAsXG5cdFx0XHRcdFx0XHRcdFx0YOWQiOS9teeQhueUse+8iOacg+iiq+iyvOS4iiR7dGFnID09PSAnTWVyZ2UgdG8nID8gJ+WFtuS7licgOiAn6YCZJ33mop3nm67nmoToqI7oq5bpoIHvvInvvJpgXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6YCJ77yM5L2G5by654OI5o6o6I2Q44CC5aaC5LiN6ZyA6KaB6K+355WZ56m644CC5LuF5Zyo5Y+q6L6T5YWl5LqG5LiA5Liq5p2h55uu5ZCN5pe25Y+v55So44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6YG477yM5L2G5by354OI5o6o6Jam44CC5aaC5LiN6ZyA6KaB6KuL55WZ56m644CC5YOF5Zyo5Y+q6Ly45YWl5LqG5LiA5YCL5qKd55uu5ZCN5pmC5Y+v55So44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSAnTWlzc2luZyBpbmZvcm1hdGlvbic6XG5cdFx0XHRcdFx0Y2hlY2tib3guc3ViZ3JvdXAgPSB7XG5cdFx0XHRcdFx0XHRuYW1lOiAnbWlzc2luZ0luZm9ybWF0aW9uJyxcblx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnvLrlsJHnmoTlhoXlrrnvvIjlv4XloavvvInvvJonLCAn57y65bCR55qE5YWn5a6577yI5b+F5aGr77yJ77yaJyksXG5cdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+W/heWhq++8jOaYvuekuuS4uuKAnOe8uuWwkeacieWFs+KApuKApueahOS/oeaBr+OAguKAnScsICflv4XloavvvIzpoa/npLrngrrjgIznvLrlsJHmnInpl5zigKbigKbnmoTos4foqIrjgILjgI0nKSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdOb3RhYmlsaXR5Jzpcblx0XHRcdFx0XHRjaGVja2JveC5zdWJncm91cCA9IHtcblx0XHRcdFx0XHRcdG5hbWU6ICdub3RhYmlsaXR5Jyxcblx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl9fe+8miR7d2luZG93LndnVUxTKCfpgJrnlKjnmoTlhbPms6jluqbmjIflvJUnLCAn6YCa55So55qE6Zec5rOo5bqm5oyH5byVJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ25vbmUnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl8QXN0cm99fe+8miR7d2luZG93LndnVUxTKCflpKnkvZMnLCAn5aSp6auUJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ0FzdHJvJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fEJpb2dyYXBoaWVzfX3vvJoke3dpbmRvdy53Z1VMUygn5Lq654mp5Lyg6K6wJywgJ+S6uueJqeWCs+iomCcpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdCaW9ncmFwaGllcycsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxCb29rfX3vvJoke3dpbmRvdy53Z1VMUygn5Lmm57GNJywgJ+abuOexjScpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdCb29rJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fEN5Y2xvbmV9fe+8miR7d2luZG93LndnVUxTKCfmsJTml4snLCAn5rCj5peLJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ0N5Y2xvbmUnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl8RmljdGlvbn1977yaJHt3aW5kb3cud2dVTFMoJ+iZmuaehOS6i+eJqScsICfomZvmp4vkuovniaknKX1gLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnRmljdGlvbicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxHZW9ncmFwaGljfX3vvJoke3dpbmRvdy53Z1VMUygn5Zyw55CG54m55b6BJywgJ+WcsOeQhueJueW+tScpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdHZW9ncmFwaGljJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fEdlb21ldHJ5fX3vvJoke3dpbmRvdy53Z1VMUygn5Yeg5L2V5Zu+5b2iJywgJ+W5vuS9leWcluW9oicpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdHZW9tZXRyeScsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxJbnZlbnRpb259fe+8miR7d2luZG93LndnVUxTKCflj5HmmI7jgIHnoJTnqbYnLCAn55m85piO44CB56CU56m2Jyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ0ludmVudGlvbicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxNdXNpY31977yaJHt3aW5kb3cud2dVTFMoJ+mfs+S5kCcsICfpn7PmqIInKX1gLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnTXVzaWMnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl8TnVtYmVyc31977yaJHt3aW5kb3cud2dVTFMoJ+aVsOWtlycsICfmlbjlrZcnKX1gLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnTnVtYmVycycsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxPcmdhbml6YXRpb25zfX3vvJoke3dpbmRvdy53Z1VMUygn57uE57uHJywgJ+e1hOe5lCcpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdPcmdhbml6YXRpb25zJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fFByb3BlcnR5fX3vvJoke3dpbmRvdy53Z1VMUygn5oCn6LSo6KGoJywgJ+aAp+izquihqCcpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdQcm9wZXJ0eScsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogJ3t7Tm90YWJpbGl0eXxUcmFmZmljfX3vvJrkuqTpgJonLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnVHJhZmZpYycsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxXZWJ9fe+8miR7d2luZG93LndnVUxTKCfnvZHnq5njgIHnvZHnu5zlhoXlrrknLCAn57ay56uZ44CB57ay6Lev5YWn5a65Jyl977yI6Z2e5q2j5byP5oyH5byV77yJYCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ1dlYicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1JlcXVlc3RlZCBtb3ZlJzpcblx0XHRcdFx0XHRjaGVja2JveC5zdWJncm91cCA9IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ21vdmVUYXJnZXQnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlrDlkI3np7DvvJonLCAn5paw5ZCN56ix77yaJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnbW92ZVJlYXNvbicsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+enu+WKqOeQhueUse+8iOS8muiiq+eymOi0tOivpeadoeebrueahOiuqOiuuumhte+8ie+8micsXG5cdFx0XHRcdFx0XHRcdFx0J+enu+WLleeQhueUse+8iOacg+iiq+iyvOS4iuipsuaineebrueahOiojuirlumgge+8ie+8midcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflj6/pgInvvIzkvYblvLrng4jmjqjojZDjgILlpoLkuI3pnIDopoHor7fnlZnnqbrjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCflj6/pgbjvvIzkvYblvLfng4jmjqjolqbjgILlpoLkuI3pnIDopoHoq4vnlZnnqbrjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1NwbGl0Jzpcblx0XHRcdFx0XHRjaGVja2JveC5zdWJncm91cCA9IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3RhcmdldDEnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpobXpnaLlkI0x77yaJywgJ+mggemdouWQjTHvvJonKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCflj6/pgInjgIInLCAn5Y+v6YG444CCJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAndGFyZ2V0MicsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mhtemdouWQjTLvvJonLCAn6aCB6Z2i5ZCNMu+8micpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WPr+mAieOAgicsICflj6/pgbjjgIInKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICd0YXJnZXQzJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6aG16Z2i5ZCNM++8micsICfpoIHpnaLlkI0z77yaJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5Y+v6YCJ44CCJywgJ+WPr+mBuOOAgicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdDbGVhbnVwJzpcblx0XHRcdFx0XHRjaGVja2JveC5zdWJncm91cCA9IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2NsZWFudXBSZWFzb24nLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogJ+mcgOimgea4heeQhueahOeQhueUsScsXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6YCJ77yM5L2G5by654OI5o6o6I2Q44CC5aaC5LiN6ZyA6KaB6K+355WZ56m644CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6YG477yM5L2G5by354OI5o6o6Jam44CC5aaC5LiN6ZyA6KaB6KuL55WZ56m644CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNoZWNrYm94O1xuXHRcdH07XG5cdFx0Y29uc3QgbWFrZUNoZWNrYm94ZXNGb3JBbHJlYWR5UHJlc2VudFRhZ3MgPSAoKSA9PiB7XG5cdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdGlkOiAndGFnSGVhZGVyMCcsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W3suaUvue9rueahOe7tOaKpOagh+iusCcsICflt7LmlL7nva7nmoTntq3orbfmqJnoqJgnKSxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3Qgc3ViZGl2ID0gY29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRpZDogJ3RhZ1N1YmRpdjAnLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjaGVja2JveGVzID0gW107XG5cdFx0XHRjb25zdCB1bkNoZWNrZWRUYWdzID0gZS50YXJnZXQuZm9ybS5nZXRVbmNoZWNrZWQoJ2V4aXN0aW5nVGFncycpO1xuXHRcdFx0Zm9yIChjb25zdCB0YWcgb2YgVHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzKSB7XG5cdFx0XHRcdGNvbnN0IGNoZWNrYm94ID0ge1xuXHRcdFx0XHRcdHZhbHVlOiB0YWcsXG5cdFx0XHRcdFx0bGFiZWw6IGB7eyR7dGFnfX19JHtcblx0XHRcdFx0XHRcdFR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFt0YWddXG5cdFx0XHRcdFx0XHRcdD8gYDogJHtUd2lua2xlLnRhZy5hcnRpY2xlLmZsYXRPYmplY3RbdGFnXS5kZXNjcmlwdGlvbn1gXG5cdFx0XHRcdFx0XHRcdDogJydcblx0XHRcdFx0XHR9YCxcblx0XHRcdFx0XHRjaGVja2VkOiAhdW5DaGVja2VkVGFncy5pbmNsdWRlcyh0YWcpLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjaGVja2JveGVzW2NoZWNrYm94ZXMubGVuZ3RoXSA9IGNoZWNrYm94O1xuXHRcdFx0fVxuXHRcdFx0c3ViZGl2LmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICdleGlzdGluZ1RhZ3MnLFxuXHRcdFx0XHRsaXN0OiBjaGVja2JveGVzLFxuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRpZiAoc29ydG9yZGVyID09PSAnY2F0Jykge1xuXHRcdFx0Ly8gY2F0ZWdvcmljYWwgc29ydCBvcmRlclxuXHRcdFx0Ly8gZnVuY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSB0YWdzIGFuZCBjcmVhdGUgYSBjaGVja2JveCBmb3IgZWFjaCBvbmVcblx0XHRcdGNvbnN0IGRvQ2F0ZWdvcnlDaGVja2JveGVzID0gKHN1YmRpdiwgc3ViZ3JvdXApID0+IHtcblx0XHRcdFx0Y29uc3QgY2hlY2tib3hlcyA9IFtdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2Ygc3ViZ3JvdXApIHtcblx0XHRcdFx0XHRpZiAoIVR3aW5rbGUudGFnLmFscmVhZHlQcmVzZW50VGFncy5pbmNsdWRlcyhpdGVtLnRhZykpIHtcblx0XHRcdFx0XHRcdGNoZWNrYm94ZXNbY2hlY2tib3hlcy5sZW5ndGhdID0gbWFrZUNoZWNrYm94KGl0ZW0udGFnLCBpdGVtLmRlc2NyaXB0aW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0c3ViZGl2LmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRuYW1lOiAndGFncycsXG5cdFx0XHRcdFx0bGlzdDogY2hlY2tib3hlcyxcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXHRcdFx0aWYgKFR3aW5rbGUudGFnLmFscmVhZHlQcmVzZW50VGFncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG1ha2VDaGVja2JveGVzRm9yQWxyZWFkeVByZXNlbnRUYWdzKCk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgaSA9IDE7XG5cdFx0XHQvLyBnbyB0aHJvdWdoIGVhY2ggY2F0ZWdvcnkgYW5kIHN1Yi1jYXRlZ29yeSBhbmQgYXBwZW5kIGxpc3RzIG9mIGNoZWNrYm94ZXNcblx0XHRcdGZvciAoY29uc3QgZ3JvdXAgb2YgVHdpbmtsZS50YWcuYXJ0aWNsZS50YWdMaXN0KSB7XG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdGlkOiBgdGFnSGVhZGVyJHtpfWAsXG5cdFx0XHRcdFx0bGFiZWw6IGdyb3VwLmtleSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IHN1YmRpdiA9IGNvbnRhaW5lci5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGlkOiBgdGFnU3ViZGl2JHtpKyt9YCxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChncm91cC52YWx1ZVswXS50YWcpIHtcblx0XHRcdFx0XHRkb0NhdGVnb3J5Q2hlY2tib3hlcyhzdWJkaXYsIGdyb3VwLnZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHN1Ymdyb3VwIG9mIGdyb3VwLnZhbHVlKSB7XG5cdFx0XHRcdFx0XHRzdWJkaXYuYXBwZW5kKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBbTW9yZWJpdHMuaHRtbE5vZGUoJ2InLCBzdWJncm91cC5rZXkpXSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0ZG9DYXRlZ29yeUNoZWNrYm94ZXMoc3ViZGl2LCBzdWJncm91cC52YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGFscGhhYmV0aWNhbCBzb3J0IG9yZGVyXG5cdFx0XHRpZiAoVHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bWFrZUNoZWNrYm94ZXNGb3JBbHJlYWR5UHJlc2VudFRhZ3MoKTtcblx0XHRcdFx0Y29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0aWQ6ICd0YWdIZWFkZXIxJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj6/nlKjnmoTnu7TmiqTmoIforrAnLCAn5Y+v55So55qE57at6K235qiZ6KiYJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQXZvaWQgcmVwZWF0ZWRseSByZXNvcnRpbmdcblx0XHRcdFR3aW5rbGUudGFnLmFydGljbGUuYWxwaGFiZXRpY2FsTGlzdCB8fD0gT2JqZWN0LmtleXMoVHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0KS5zb3J0KCk7XG5cdFx0XHRjb25zdCBjaGVja2JveGVzID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBUd2lua2xlLnRhZy5hcnRpY2xlLmFscGhhYmV0aWNhbExpc3QpIHtcblx0XHRcdFx0aWYgKCFUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3MuaW5jbHVkZXModGFnKSkge1xuXHRcdFx0XHRcdGNoZWNrYm94ZXNbY2hlY2tib3hlcy5sZW5ndGhdID0gbWFrZUNoZWNrYm94KHRhZywgVHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0W3RhZ10uZGVzY3JpcHRpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ3RhZ3MnLFxuXHRcdFx0XHRsaXN0OiBjaGVja2JveGVzLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIGFwcGVuZCBhbnkgY3VzdG9tIHRhZ3Ncblx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21UYWdMaXN0JykubGVuZ3RoKSB7XG5cdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieaooeadvycsICfoh6roqILmqKHmnb8nKSxcblx0XHRcdH0pO1xuXHRcdFx0Y29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICd0YWdzJyxcblx0XHRcdFx0bGlzdDogVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21UYWdMaXN0JykubWFwKChlbCkgPT4ge1xuXHRcdFx0XHRcdGVsLmNoZWNrZWQgPSBUd2lua2xlLnRhZy5jaGVja2VkVGFncy5pbmNsdWRlcyhlbC52YWx1ZSk7XG5cdFx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0XHR9KSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCAkd29ya2FyZWEgPSAkKGZvcm0pLmZpbmQoJyN0YWdXb3JrQXJlYScpO1xuXHRcdGNvbnN0IHJlbmRlcmVkID0gY29udGFpbmVyLnJlbmRlcigpO1xuXHRcdCR3b3JrYXJlYS5lbXB0eSgpLmFwcGVuZChyZW5kZXJlZCk7XG5cdFx0Ly8gZm9yIHF1aWNrIGZpbHRlcjpcblx0XHQkYWxsQ2hlY2tib3hEaXZzID0gJHdvcmthcmVhLmZpbmQoJ1tuYW1lPXRhZ3NdLCBbbmFtZT1leGlzdGluZ1RhZ3NdJykucGFyZW50KCk7XG5cdFx0JGFsbEhlYWRlcnMgPSAkd29ya2FyZWEuZmluZCgnaDUsIC5xdWlja2Zvcm1EZXNjcmlwdGlvbicpO1xuXHRcdGZvcm0ucXVpY2tmaWx0ZXIudmFsdWUgPSAnJzsgLy8gY2xlYXIgc2VhcmNoLCBiZWNhdXNlIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgbm90IHByZXNlcnZlZCBvdmVyIG1vZGUgY2hhbmdlXG5cdFx0Zm9ybS5xdWlja2ZpbHRlci5mb2N1cygpO1xuXHRcdC8vIHN0eWxlIGFkanVzdG1lbnRzXG5cdFx0JHdvcmthcmVhLmZpbmQoJ2g1JykuY3NzKHtcblx0XHRcdCdmb250LXNpemUnOiAnMTEwJScsXG5cdFx0fSk7XG5cdFx0JHdvcmthcmVhLmZpbmQoJ2g1Om5vdCg6Zmlyc3QtY2hpbGQpJykuY3NzKHtcblx0XHRcdCdtYXJnaW4tdG9wJzogJzFlbScsXG5cdFx0fSk7XG5cdFx0JHdvcmthcmVhLmZpbmQoJ2RpdicpLmZpbHRlcignOmhhcyhzcGFuLnF1aWNrZm9ybURlc2NyaXB0aW9uKScpLmNzcyh7XG5cdFx0XHQnbWFyZ2luLXRvcCc6ICcwLjRlbScsXG5cdFx0fSk7XG5cdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMoZm9ybSwgJ2V4aXN0aW5nVGFncycpKSB7XG5cdFx0XHRnZW5lcmF0ZUxpbmtzKGNoZWNrYm94KTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMoZm9ybSwgJ3RhZ3MnKSkge1xuXHRcdFx0Z2VuZXJhdGVMaW5rcyhjaGVja2JveCk7XG5cdFx0fVxuXHRcdC8vIHRhbGx5IHRhZ3MgYWRkZWQvcmVtb3ZlZCwgdXBkYXRlIHN0YXR1c05vZGUgdGV4dFxuXHRcdGNvbnN0IHN0YXR1c05vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdHctdGFnLXN0YXR1cycpO1xuXHRcdCRib2R5LmZpbmQoJ1tuYW1lPXRhZ3NdLCBbbmFtZT1leGlzdGluZ1RhZ3NdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHRoaXMubmFtZSA9PT0gJ3RhZ3MnKSB7XG5cdFx0XHRcdFR3aW5rbGUudGFnLnN0YXR1cy5udW1BZGRlZCArPSB0aGlzLmNoZWNrZWQgPyAxIDogLTE7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMubmFtZSA9PT0gJ2V4aXN0aW5nVGFncycpIHtcblx0XHRcdFx0VHdpbmtsZS50YWcuc3RhdHVzLm51bVJlbW92ZWQgKz0gdGhpcy5jaGVja2VkID8gLTEgOiAxO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZmlyc3RQYXJ0ID0gYOWKoOWFpSR7VHdpbmtsZS50YWcuc3RhdHVzLm51bUFkZGVkfSR7d2luZG93LndnVUxTKCfkuKrmoIforrAnLCAn5YCL5qiZ6KiYJyl9YDtcblx0XHRcdGNvbnN0IHNlY29uZFBhcnQgPSBg56e76ZmkJHtUd2lua2xlLnRhZy5zdGF0dXMubnVtUmVtb3ZlZH0ke3dpbmRvdy53Z1VMUygn5Liq5qCH6K6wJywgJ+WAi+aomeiomCcpfWA7XG5cdFx0XHRzdGF0dXNOb2RlLnRleHRDb250ZW50ID1cblx0XHRcdFx0KFR3aW5rbGUudGFnLnN0YXR1cy5udW1BZGRlZCA/IGAgICR7Zmlyc3RQYXJ0fWAgOiAnJykgK1xuXHRcdFx0XHQoVHdpbmtsZS50YWcuc3RhdHVzLm51bVJlbW92ZWQgPyAoVHdpbmtsZS50YWcuc3RhdHVzLm51bUFkZGVkID8gJ++8mycgOiAnICAnKSArIHNlY29uZFBhcnQgOiAnJyk7XG5cdFx0fSk7XG5cdH07XG5cdC8qKlxuXHQgKiBBZGRzIGEgbGluayB0byBlYWNoIHRlbXBsYXRlJ3MgZGVzY3JpcHRpb24gcGFnZVxuXHQgKlxuXHQgKiBAcGFyYW0ge01vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50fSBjaGVja2JveCAgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZW1wbGF0ZVxuXHQgKi9cblx0Y29uc3QgZ2VuZXJhdGVMaW5rcyA9IChjaGVja2JveCkgPT4ge1xuXHRcdGNvbnN0IGxpbmsgPSBNb3JlYml0cy5odG1sTm9kZSgnYScsICc+Jyk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3RhZy10ZW1wbGF0ZS1saW5rJyk7XG5cdFx0Y29uc3QgdGFnbmFtZSA9IGNoZWNrYm94LnZhbHVlcztcblx0XHRsaW5rLnNldEF0dHJpYnV0ZShcblx0XHRcdCdocmVmJyxcblx0XHRcdG13LnV0aWwuZ2V0VXJsKFxuXHRcdFx0XHQodGFnbmFtZS5pbmNsdWRlcygnOicpID8gJycgOiAnVGVtcGxhdGU6JykgK1xuXHRcdFx0XHRcdCh0YWduYW1lLmluY2x1ZGVzKCd8JykgPyB0YWduYW1lLnNsaWNlKDAsIHRhZ25hbWUuaW5kZXhPZignfCcpKSA6IHRhZ25hbWUpXG5cdFx0XHQpXG5cdFx0KTtcblx0XHRsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuXHRcdCQoY2hlY2tib3gpLnBhcmVudCgpLmFwcGVuZChbJ1xcdTAwQTAnLCBsaW5rXSk7XG5cdH07XG5cdC8vIFRhZ3MgZm9yIEFSVElDTEVTIHN0YXJ0IGhlcmVcblx0VHdpbmtsZS50YWcuYXJ0aWNsZSA9IHt9O1xuXHQvLyBUYWdzIGFycmFuZ2VkIGJ5IGNhdGVnb3J5OyB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGFscGhhYmV0aWNhbCBsaXN0LFxuXHQvLyBidXQgdGFncyBzaG91bGQgYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHdpdGhpbiB0aGUgY2F0ZWdvcmllc1xuXHQvLyBleGNsdWRlTUk6IHRydWUgaW5kaWNhdGUgYSB0YWcgdGhhdCAqZG9lcyBub3QqIHdvcmsgaW5zaWRlIHt7bXVsdGlwbGUgaXNzdWVzfX1cblx0Ly8gQWRkIG5ldyBjYXRlZ29yaWVzIHdpdGggZGlzY3JldGlvbiAtIHRoZSBsaXN0IGlzIGxvbmcgZW5vdWdoIGFzIGlzIVxuXHRUd2lua2xlLnRhZy5hcnRpY2xlLnRhZ0xpc3QgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+a4heeQhuWSjOe7tOaKpOaooeadvycsICfmuIXnkIblkozntq3orbfmqKHmnb8nKSxcblx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5bi46KeE5riF55CGJywgJ+W4uOimj+a4heeQhicpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0NsZWFudXAnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflj6/og73pnIDopoHov5vooYzmuIXnkIbvvIzku6XnrKblkIjmsYLpl7vnmb7np5HnmoTotKjph4/moIflh4YnLFxuXHRcdFx0XHRcdFx0XHRcdCflj6/og73pnIDopoHpgLLooYzmuIXnkIbvvIzku6XnrKblkIjmsYLogZ7nmb7np5HnmoTos6rph4/mqJnmupYnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdDbGVhbnVwIHJld3JpdGUnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfkuI3nrKblkIjmsYLpl7vnmb7np5HnmoTotKjph4/moIflh4bvvIzpnIDopoHlrozlhajph43lhpknLFxuXHRcdFx0XHRcdFx0XHRcdCfkuI3nrKblkIjmsYLogZ7nmb7np5HnmoTos6rph4/mqJnmupbvvIzpnIDopoHlrozlhajph43lr6snXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdDbGVhbnVwLWphcmdvbicsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WMheWQq+i/h+WkmuihjOivneaIluS4k+S4muacr+ivre+8jOWPr+iDvemcgOimgeeugOWMluaIluaPkOWHuui/m+S4gOatpeino+mHiicsXG5cdFx0XHRcdFx0XHRcdFx0J+WMheWQq+mBjuWkmuihjOipseaIluWwiOalreihk+iqnu+8jOWPr+iDvemcgOimgeewoeWMluaIluaPkOWHuumAsuS4gOatpeino+mHiydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0NvcHkgZWRpdCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+mcgOimgee8luS/ru+8jOS7peehruS/neaWh+azleOAgeeUqOivjeOAgeivreawlOOAgeagvOW8j+OAgeagh+eCueetieS9v+eUqOaBsOW9kycsXG5cdFx0XHRcdFx0XHRcdFx0J+mcgOimgee3qOS/ru+8jOS7peeiuuS/neaWh+azleOAgeeUqOipnuOAgeiqnuawo+OAgeagvOW8j+OAgeaomem7nuetieS9v+eUqOaBsOeVtidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCflj6/og73lpJrkvZnnmoTlhoXlrrknLCAn5Y+v6IO95aSa6aSY55qE5YWn5a65JyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQ29weXBhc3RlJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5YaF5a655Y+v6IO95piv5LuO5p+Q5Liq5p2l5rqQ5aSE5ou36LSd5ZCO57KY6LS0Jyxcblx0XHRcdFx0XHRcdFx0XHQn5YWn5a655Y+v6IO95piv5b6e5p+Q5YCL5L6G5rqQ6JmV5ou36LKd5b6M6LK85LiKJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnRXh0ZXJuYWwgbGlua3MnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfkvb/nlKjlpJbpg6jpk77mjqXnmoTmlrnlvI/lj6/og73kuI3nrKblkIjmsYLpl7vnmb7np5HnmoTmlrnpkognLFxuXHRcdFx0XHRcdFx0XHRcdCfkvb/nlKjlpJbpg6jpgKPntZDnmoTmlrnlvI/lj6/og73kuI3nrKblkIjmsYLogZ7nmb7np5HnmoTmlrnph50nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdOb24tZnJlZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDvei/h+WkmuaIluS4jeW9k+WcsOS9v+eUqOS6huWPl+iRl+S9nOadg+S/neaKpOeahOaWh+Wtl+OAgeWbvuWDj+aIluWkmuWqkuS9k+aWh+S7ticsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDvemBjuWkmuaIluS4jeeVtuWcsOS9v+eUqOS6huWPl+eJiOasiuS/neitt+eahOaWh+Wtl+OAgeWcluWDj+aIluWkmuWqkumrlOaqlOahiCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCfnu5PmnoTlkozlr7zoqIAnLCAn57WQ5qeL5ZKM5bCO6KiAJyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTGVhZCB0b28gbG9uZycsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+WvvOiogOmDqOWIhuS5n+iuuOi/h+S6juWGl+mVvycsICflsI7oqIDpg6jliIbkuZ/oqLHpgY7mlrzlhpfplbcnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0xlYWQgdG9vIHNob3J0Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5a+86KiA6YOo5YiG5Lmf6K645LiN6Laz5Lul5qaC5ous5YW25YaF5a65JywgJ+WwjuiogOmDqOWIhuS5n+ioseS4jei2s+S7peamguaLrOWFtuWFp+WuuScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnVmVyeSBsb25nJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5Y+v6IO96L+H5LqO5YaX6ZW/JywgJ+WPr+iDvemBjuaWvOWGl+mVtycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+iZmuaehOS9nOWTgeebuOWFs+a4heeQhicsICfomZvmp4vkvZzlk4Hnm7jpl5zmuIXnkIYnKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdJbi11bml2ZXJzZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+S9v+eUqOWwj+ivtOaVheS6i+WGheeahOingueCueaPj+i/sOS4gOS4quiZmuaehOS6i+eJqScsXG5cdFx0XHRcdFx0XHRcdFx0J+S9v+eUqOWwj+iqquaVheS6i+WFp+eahOingOm7nuaPj+i/sOS4gOWAi+iZm+ani+S6i+eJqSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0xvbmcgcGxvdCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+WPr+iDveWMheWQq+i/h+S6juivpue7hueahOWJp+aDheaRmOimgScsICflj6/og73ljIXlkKvpgY7mlrzoqbPntLDnmoTliofmg4XmkZjopoEnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5bi46KeE5p2h55uu6Zeu6aKYJywgJ+W4uOimj+aineebruWVj+mhjCcpLFxuXHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogJ+mHjeimgeaAp+WSjOefpeWQjeW6picsXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTm90YWJpbGl0eScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+WPr+iDveS4jeespuWQiOmAmueUqOWFs+azqOW6puaMh+W8lScsICflj6/og73kuI3nrKblkIjpgJrnlKjpl5zms6jluqbmjIflvJUnKSxcblx0XHRcdFx0XHRcdFx0ZXhjbHVkZU1JOiB0cnVlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTm90YWJpbGl0eSBVbnJlZmVyZW5jZWQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflj6/og73lhbflpIflhbPms6jluqbvvIzkvYbpnIDopoHmnaXmupDliqDku6XlvbDmmL4nLFxuXHRcdFx0XHRcdFx0XHRcdCflj6/og73lhbflgpnpl5zms6jluqbvvIzkvYbpnIDopoHkvobmupDliqDku6XlvbDpoa8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5YaZ5L2c6aOO5qC8JywgJ+Wvq+S9nOmiqOagvCcpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0FkdmVydCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+exu+S8vOW5v+WRiuaIluWuo+S8oOaAp+WGheWuuScsICfpoZ7kvLzlu6PlkYrmiJblrqPlgrPmgKflhaflrrknKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0ZhbnBvdicsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+exu+S8vOeIseWlveiAhee9kemhtScsICfpoZ7kvLzmhJvlpb3ogIXntrLpoIEnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0hvdy10bycsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+WMheWQq+aMh+WNl+aIluaVmeWtpuWGheWuuScsICfljIXlkKvmjIfljZfmiJbmlZnlrbjlhaflrrknKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0luYXBwcm9wcmlhdGUgcGVyc29uJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5L2/55So5LiN6YCC5b2T55qE56ys5LiA5Lq656ew5ZKM56ys5LqM5Lq656ewJyxcblx0XHRcdFx0XHRcdFx0XHQn5L2/55So5LiN6YGp55W255qE56ys5LiA5Lq656ix5ZKM56ys5LqM5Lq656ixJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTmV3c3JlbGVhc2UnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfpmIXor7votbfmnaXlg4/mmK/mlrDpl7vnqL/lj4rljIXlkKvov4fluqbnmoTlrqPkvKDmgKfor63osIMnLFxuXHRcdFx0XHRcdFx0XHRcdCfplrHoroDotbfkvoblg4/mmK/mlrDogZ7nqL/lj4rljIXlkKvpgY7luqbnmoTlrqPlgrPmgKfoqp7oqr8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdQcm9zZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+S9v+eUqOS6huaXpeacn+aIluaXtumXtOWIl+ihqOW8j+iusOi/sO+8jOmcgOimgeaUueWGmeS4uui/nui0r+eahOWPmei/sOaAp+aWh+WtlycsXG5cdFx0XHRcdFx0XHRcdFx0J+S9v+eUqOS6huaXpeacn+aIluaZgumWk+WIl+ihqOW8j+iomOi/sO+8jOmcgOimgeaUueWvq+eCuumAo+iyq+eahOaVmOi/sOaAp+aWh+Wtlydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1JldmlldycsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+mYheivu+i1t+adpeexu+S8vOivhOiuuu+8jOmcgOimgea4heeQhicsICfplrHoroDotbfkvobpoZ7kvLzoqZXoq5bvvIzpnIDopoHmuIXnkIYnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1RvbmUnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfor63osIPmiJbpo47moLzlj6/og73kuI3pgILlkIjnmb7np5HlhajkuabnmoTlhpnkvZzmlrnlvI8nLFxuXHRcdFx0XHRcdFx0XHRcdCfoqp7oqr/miJbpoqjmoLzlj6/og73kuI3pganlkIjnmb7np5Hlhajmm7jnmoTlr6vkvZzmlrnlvI8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5YaF5a65JywgJ+WFp+WuuScpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7dGFnOiAnTWlzc2luZyBpbmZvcm1hdGlvbicsIGRlc2NyaXB0aW9uOiAn57y65bCR5b+F6KaB55qE5L+h5oGvJ30sIC8vIHRoZXNlIHRocmVlIGhhdmUgYSBzdWJncm91cCB3aXRoIHNldmVyYWwgb3B0aW9uc1xuXHRcdFx0XHRcdFx0e3RhZzogJ1N1YnN0dWInLCBkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfov4fkuo7nn63lsI8nLCAn6YGO5pa855+t5bCPJyksIGV4Y2x1ZGVNSTogdHJ1ZX0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1VuZW5jeWNsb3BlZGljJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5Y+v6IO95LiN6YCC5ZCI5YaZ5YWl55m+56eR5YWo5LmmJywgJ+WPr+iDveS4jemBqeWQiOWvq+WFpeeZvuenkeWFqOabuCcpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+S/oeaBr+WSjOe7huiKgicsICfos4foqIrlkozntLDnr4AnKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdFeHBlcnQgbmVlZGVkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB57K+6YCa5oiW54af5oKJ5pys5Li76aKY55qE5LiT5Lia5Lq65aOr77yI5LiT5a6277yJ5Y+C5LiO5Y+K5Y2P5Yqp57yW6L6RJyxcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB57K+6YCa5oiW54af5oKJ5pys5Li76aGM55qE5bCI5qWt5Lq65aOr77yI5bCI5a6277yJ5Y+D6IiH5Y+K5Y2U5Yqp57eo6LyvJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnT3Zlcmx5IGRldGFpbGVkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5YyF5ZCr5aSq5aSa6L+H5bqm57uG6IqC5YaF5a65JywgJ+WMheWQq+WkquWkmumBjuW6pue0sOevgOWFp+WuuScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnVHJpdmlhJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5bqU6YG/5YWN5pyJ6ZmI5YiX5p2C6aG544CB55CQ56KO6LWE5paZ55qE6YOo5YiGJyxcblx0XHRcdFx0XHRcdFx0XHQn5oeJ6YG/5YWN5pyJ6Zmz5YiX6Zuc6aCF44CB55Gj56KO6LOH5paZ55qE6YOo5YiGJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+aXtumXtOaApycsICfmmYLplpPmgKcnKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdDdXJyZW50Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn6K6w6L+w5paw6Ze75Yqo5oCBJywgJ+iomOi/sOaWsOiBnuWLleaFiycpLFxuXHRcdFx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdVcGRhdGUnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflvZPliY3mnaHnm67miJbnq6DoioLpnIDopoHmm7TmlrAnLCAn55W25YmN5qKd55uu5oiW56ug56+A6ZyA6KaB5pu05pawJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5a6i6KeC5oCn5ZKM5LqL5a6e5YeG56Gu5oCnJywgJ+WuouingOaAp+WSjOS6i+Wvpua6lueiuuaApycpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0F1dG9iaW9ncmFwaHknLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnsbvkvLzkuIDnr4foh6rkvKDvvIzmiJblhoXlrrnkuLvopoHnlLHmnaHnm67mj4/ov7DnmoTlvZPkuovkurrmiJbnu4Tnu4fmkrDlhpnjgIHnvJbovpEnLFxuXHRcdFx0XHRcdFx0XHRcdCfpoZ7kvLzkuIDnr4foh6rlgrPvvIzmiJblhaflrrnkuLvopoHnlLHmop3nm67mj4/ov7DnmoTnlbbkuovkurrmiJbntYTnuZTmkrDlr6vjgIHnt6jovK8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdDT0knLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfkuLvopoHotKHnjK7ogIXkuI7mnKzmnaHnm67miYDlrqPmiaznmoTlhoXlrrnlj6/og73lrZjlnKjliKnnm4rlhrLnqoEnLFxuXHRcdFx0XHRcdFx0XHRcdCfkuLvopoHosqLnjbvogIXoiIfmnKzmop3nm67miYDlrqPmj5rnmoTlhaflrrnlj6/og73lrZjlnKjliKnnm4rooZ3nqoEnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdEaXNwdXRlZCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+WGheWuueeWkeasoOWHhuehru+8jOacieW+heafpeivgScsICflhaflrrnnlpHmrKDmupbnorrvvIzmnInlvoXmn6XorYknKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0dsb2JhbGl6ZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+S7heWFt+acieS4gOmDqOWIhuWcsOWMuueahOS/oeaBr+aIluingueCuScsICflg4XlhbfmnInkuIDpg6jliIblnLDljYDnmoTos4foqIrmiJbop4Dpu54nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0hvYXgnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfnnJ/lrp7mgKfooqvotKjnlpEnLCAn55yf5a+m5oCn6KKr6LOq55aRJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdQT1YnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflrqLop4LmgKfmnInkuonorq7jgILlhoXlrrnjgIHor63osIPlj6/og73luKbmnInmmI7mmL7nmoTkuKrkurrop4LngrnmiJblnLDmlrnoibLlvaknLFxuXHRcdFx0XHRcdFx0XHRcdCflrqLop4DmgKfmnInniK3orbDjgILlhaflrrnjgIHoqp7oqr/lj6/og73luLbmnInmmI7poa/nmoTlgIvkurrop4Dpu57miJblnLDmlrnoibLlvaknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdTZWxmLWNvbnRyYWRpY3RvcnknLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflhoXlrrnoh6rnm7jnn5vnm74nLCAn5YWn5a656Ieq55u455+b55u+JyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdXZWFzZWwnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfor63kuYnmqKHmo7HkuKTlj6/ogIzmjZ/lj4rlhbblrqLop4LmgKfmiJblh4bnoa7mgKcnLFxuXHRcdFx0XHRcdFx0XHRcdCfoqp7mhI/mqKHmo7Hlhanlj6/ogIzmkI3lj4rlhbblrqLop4DmgKfmiJbmupbnorrmgKcnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5Y+v5L6b5p+l6K+B5ZKM5p2l5rqQJywgJ+WPr+S+m+afpeitieWSjOS+hua6kCcpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0JMUGRpc3B1dGUnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflj6/og73ov53lj43kuobmsYLpl7vnmb7np5HlhbPkuo7nlJ/ogIXkvKDorrDnmoTmlrnpkognLFxuXHRcdFx0XHRcdFx0XHRcdCflj6/og73pgZXlj43kuobmsYLogZ7nmb7np5Hpl5zmlrznlJ/ogIXlgrPoqJjnmoTmlrnph50nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdCTFBzb3VyY2VzJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn55Sf6ICF5Lyg6K6w6ZyA6KaB6KGl5YWF5pu05aSa5Y+v5L6b5p+l6K+B55qE5p2l5rqQJyxcblx0XHRcdFx0XHRcdFx0XHQn55Sf6ICF5YKz6KiY6ZyA6KaB6KOc5YWF5pu05aSa5Y+v5L6b5p+l6K2J55qE5L6G5rqQJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQkxQIHVuc291cmNlZCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+eUn+iAheS8oOiusOayoeacieWIl+WHuuS7u+S9leWPguiAg+aIluadpea6kCcsXG5cdFx0XHRcdFx0XHRcdFx0J+eUn+iAheWCs+iomOaykuacieWIl+WHuuS7u+S9leWPg+iAg+aIluS+hua6kCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0NpdGVjaGVjaycsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDveWMheWQq+S4jemAgueUqOaIluiiq+absuino+eahOW8leeUqOi1hOaWme+8jOmDqOWIhuWGheWuueeahOWHhuehruaAp+aXoOazleiiq+ivgeWunicsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDveWMheWQq+S4jemBqeeUqOaIluiiq+absuino+eahOW8leeUqOizh+aWme+8jOmDqOWIhuWFp+WuueeahOa6lueiuuaAp+eEoeazleiiq+itieWvpidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ01vcmUgZm9vdG5vdGVzIG5lZWRlZCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WboOS4uuaWh+WGheW8leeUqOS4jei2s++8jOmDqOWIhuWtl+WPpeeahOadpea6kOS7jeeEtuS4jeaYjicsXG5cdFx0XHRcdFx0XHRcdFx0J+WboOeCuuaWh+WFp+W8leeUqOS4jei2s++8jOmDqOWIhuWtl+WPpeeahOS+hua6kOS7jeeEtuS4jeaYjidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ05vIGZvb3Rub3RlcycsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WboOS4uuayoeacieWGheaWh+W8leeUqOiAjOadpea6kOS7jeeEtuS4jeaYjicsXG5cdFx0XHRcdFx0XHRcdFx0J+WboOeCuuaykuacieWFp+aWh+W8leeUqOiAjOS+hua6kOS7jeeEtuS4jeaYjidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ09uZXNvdXJjZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+aegeWkp+aIluWujOWFqOWcsOS+nei1luS6juafkOS4quWNleS4gOeahOadpea6kCcsXG5cdFx0XHRcdFx0XHRcdFx0J+alteWkp+aIluWujOWFqOWcsOS+neiztOaWvOafkOWAi+WWruS4gOeahOS+hua6kCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ09yaWdpbmFsIHJlc2VhcmNoJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5Y+v6IO95YyF5ZCr5Y6f5Yib56CU56m25oiW5pyq5p+l6K+B5YaF5a65JywgJ+WPr+iDveWMheWQq+WOn+WJteeglOeptuaIluacquafpeitieWFp+WuuScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnUHJpbWFyeXNvdXJjZXMnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfkvp3otZbnrKzkuIDmiYvmnaXmupAnLCAn5L6d6LO056ys5LiA5omL5L6G5rqQJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdSZWZpbXByb3ZlJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn6ZyA6KaB6KGl5YWF5pu05aSa5p2l5rqQJywgJ+mcgOimgeijnOWFheabtOWkmuS+hua6kCcpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnVW5yZWZlcmVuY2VkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5rKh5pyJ5YiX5Ye65Lu75L2V5Y+C6ICD5oiW5p2l5rqQJywgJ+aykuacieWIl+WHuuS7u+S9leWPg+iAg+aIluS+hua6kCcpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogd2luZG93LndnVUxTKCflhbfkvZPlhoXlrrnpl67popgnLCAn5YW36auU5YWn5a655ZWP6aGMJyksXG5cdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+ivreiogCcsICfoqp7oqIAnKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdOb3RNYW5kYXJpbicsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WMheWQq+i/h+WkmuS4jeaYr+eOsOS7o+agh+WHhuaxieivreeahOWGheWuuScsXG5cdFx0XHRcdFx0XHRcdFx0J+WMheWQq+mBjuWkmuS4jeaYr+ePvuS7o+aomea6lua8ouiqnueahOWFp+WuuSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0ZXhjbHVkZU1JOiB0cnVlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnUm91Z2ggdHJhbnNsYXRpb24nLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfnv7vor5Hlk4HotKjkuI3kvbMnLCAn57+76K2v5ZOB6LOq5LiN5L2zJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn6ZO+5o6lJywgJ+mAo+e1kCcpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0RlYWQgZW5kJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB5Yqg5LiK5YaF6YOo6ZO+5o6l5Lul5p6E562R55m+56eR5YWo5Lmm55qE6ZO+5o6l572R57ucJyxcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB5Yqg5LiK5YWn6YOo6YCj57WQ5Lul5qeL56+J55m+56eR5YWo5pu455qE6YCj57WQ57ay57WhJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnT3JwaGFuJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5rKh5pyJ5oiW5Y+q5pyJ5b6I5bCR6ZO+5YWl6aG16Z2iJywgJ+aykuacieaIluWPquacieW+iOWwkemAo+WFpemggemdoicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnT3ZlcmxpbmtlZCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WQq+aciei/h+WkmuOAgemHjeWkjeOAgeaIluS4jeW/heimgeeahOWGhemDqOmTvuaOpScsXG5cdFx0XHRcdFx0XHRcdFx0J+WQq+aciemBjuWkmuOAgemHjeikh+OAgeaIluS4jeW/heimgeeahOWFp+mDqOmAo+e1kCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1VuZGVybGlua2VkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB5pu05aSa5YaF6YOo6ZO+5o6l5Lul5p6E562R55m+56eR5YWo5Lmm55qE6ZO+5o6l572R57ucJyxcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB5pu05aSa5YWn6YOo6YCj57WQ5Lul5qeL56+J55m+56eR5YWo5pu455qE6YCj57WQ57ay57WhJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+WPguiAg+aKgOacrycsICflj4PogIPmioDooZMnKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdDaXRhdGlvbiBzdHlsZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+W8leeUqOmcgOimgei/m+ihjOa4heeQhicsICflvJXnlKjpnIDopoHpgLLooYzmuIXnkIYnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCfliIbnsbsnLCAn5YiG6aGeJyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnSW1wcm92ZSBjYXRlZ29yaWVzJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn6ZyA6KaB5pu05aSa6aG16Z2i5YiG57G7JywgJ+mcgOimgeabtOWkmumggemdouWIhumhnicpLFxuXHRcdFx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdVbmNhdGVnb3JpemVkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn57y65bCR6aG16Z2i5YiG57G7JywgJ+e8uuWwkemggemdouWIhumhnicpLFxuXHRcdFx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+WQiOW5tuOAgeaLhuWIhuOAgeenu+WKqCcsICflkIjkvbXjgIHmi4bliIbjgIHnp7vli5UnKSxcblx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICdNZXJnZSBmcm9tJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflu7rorq7lsIbpobXpnaLlubblhaXmraTpobXpnaInLCAn5bu66K2w5bCH6aCB6Z2i5L215YWl5q2k6aCB6Z2iJyksXG5cdFx0XHRcdFx0ZXhjbHVkZU1JOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAnTWVyZ2UgdG8nLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+W7uuiuruWwhuatpOmhtemdouW5tuWFpemhtemdoicsICflu7rorbDlsIfmraTpoIHpnaLkvbXlhaXpoIHpnaInKSxcblx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICdNZXJnZScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5bu66K6u5q2k6aG16Z2i5LiO6aG16Z2i5ZCI5bm2JywgJ+W7uuitsOatpOmggemdouiIh+mggemdouWQiOS9tScpLFxuXHRcdFx0XHRcdGV4Y2x1ZGVNSTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ1JlcXVlc3RlZCBtb3ZlJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflu7rorq7lsIbmraTpobXpnaLnp7vliqjliLDmlrDlkI3np7AnLCAn5bu66K2w5bCH5q2k6aCB6Z2i56e75YuV5Yiw5paw5ZCN56ixJyksXG5cdFx0XHRcdFx0ZXhjbHVkZU1JOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAnU3BsaXQnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+W7uuiuruWwhuatpOmhtemdouWIhuWJsuS4uuWkmuS4qumhtemdoicsICflu7rorbDlsIfmraTpoIHpnaLliIblibLngrrlpJrlgIvpoIHpnaInKSxcblx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdF07XG5cdC8vIFRhZ3MgZm9yIFJFRElSRUNUUyBzdGFydCBoZXJlXG5cdC8vIE5vdCBieSBwb2xpY3ksIGJ1dCB0aGUgbGlzdCByb3VnaGx5IGFwcHJveGltYXRlcyBpdGVtcyB3aXRoID41MDBcblx0Ly8gdHJhbnNjbHVzaW9ucyBmcm9tIFRlbXBsYXRlOlIgdGVtcGxhdGUgaW5kZXhcblx0VHdpbmtsZS50YWcucmVkaXJlY3RMaXN0ID0gW1xuXHRcdHtcblx0XHRcdGtleTogJ+W4uOeUqOaooeadvycsXG5cdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+WQiOW5tumHjeWumuWQkScsICflkIjkvbXph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+S/neaMgemhtemdoumimOWQjeiHs+ebuOW6lOS4u+adoeebru+8jOS7pOmhtemdouWGheWuueWcqOWQiOW5tuWQjuS7jeiDveS/neWtmOWFtue8lui+keWOhuWPsicsXG5cdFx0XHRcdFx0XHQn5L+d5oyB6aCB6Z2i6aGM5ZCN6Iez55u45oeJ5Li75qKd55uu77yM5Luk6aCB6Z2i5YWn5a655Zyo5ZCI5L215b6M5LuN6IO95YSy5a2Y5YW257eo6Lyv5q235Y+yJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn566A57mB6YeN5a6a5ZCRJywgJ+ewoee5gemHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+W8leWvvOeugOS9k+iHs+e5geS9k++8jOaIlue5geS9k+iHs+eugOS9kycsICflvJXlsI7nsKHpq5Toh7PnuYHpq5TvvIzmiJbnuYHpq5Toh7PnsKHpq5QnKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCflhbPms6jluqbph43lrprlkJEnLCAn6Zec5rOo5bqm6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfnvLrkuY/lhbPms6jluqbnmoTlrZDkuLvpopjlkJHmnInlhbPms6jluqbnmoTmr43kuLvpopjnmoTph43lrprlkJEnLFxuXHRcdFx0XHRcdFx0J+e8uuS5j+mXnOazqOW6pueahOWtkOS4u+mhjOWQkeaciemXnOazqOW6pueahOavjeS4u+mhjOeahOmHjeWumuWQkSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5qih5p2/6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfmjIflkJHmqKHmnb/nmoTph43lrprlkJHpobXpnaInLCAn5oyH5ZCR5qih5p2/55qE6YeN5a6a5ZCR6aCB6Z2iJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5Yir5ZCN6YeN5a6a5ZCRJywgJ+WIpeWQjemHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5qCH6aKY55qE5YW25LuW5ZCN56ew44CB56yU5ZCN44CB57uw5Y+344CB5ZCM5LmJ5a2X562JJyxcblx0XHRcdFx0XHRcdCfmqJnpoYznmoTlhbbku5blkI3nqLHjgIHnrYblkI3jgIHntr3omZ/jgIHlkIznvqnlrZfnrYknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfor5HlkI3ph43lrprlkJEnLCAn6K2v5ZCN6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfkurrnianjgIHkvZzlk4HnrYnlkITpobnkuovniannmoTlhbbku5bnv7vor5HlkI3np7AnLFxuXHRcdFx0XHRcdFx0J+S6uueJqeOAgeS9nOWTgeetieWQhOmgheS6i+eJqeeahOWFtuS7lue/u+itr+WQjeeosSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+e8qeWGmemHjeWumuWQkScsICfnuK7lr6vph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfmoIfpopjnvKnlhpknLCAn5qiZ6aGM57iu5a+rJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5ou85YaZ6YeN5a6a5ZCRJywgJ+aLvOWvq+mHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+agh+mimOeahOWFtuS7luS4jeWQjOaLvOWGmScsICfmqJnpoYznmoTlhbbku5bkuI3lkIzmi7zlr6snKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfplJnlrZfph43lrprlkJEnLCAn6Yyv5a2X6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn57qg5q2j5qCH6aKY55qE5bi46KeB6ZSZ6K+v5ou85YaZ5oiW6K+v5qSNJywgJ+ezvuato+aomemhjOeahOW4uOimi+mMr+iqpOaLvOWvq+aIluiqpOakjScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+aXp+WQjemHjeWumuWQkScsICfoiIrlkI3ph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WwhuS6i+eJqeaXqeWJjeeahOWQjeensOW8leWvvOiHs+abtOaUueWQjueahOS4u+mimCcsXG5cdFx0XHRcdFx0XHQn5bCH5LqL54mp5pep5YmN55qE5ZCN56ix5byV5bCO6Iez5pu05pS55b6M55qE5Li76aGMJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICflhajlkI3ph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+agh+mimOeahOWujOaVtOaIluabtOWujOaVtOWQjeensCcsICfmqJnpoYznmoTlrozmlbTmiJbmm7TlrozmlbTlkI3nqLEnKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+efreWQjemHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflrozmlbTmoIfpopjlkI3np7DmiJbkurrnianlhajlkI3nmoTpg6jliIbjgIHkuI3lrozmlbTnmoTlkI3np7DmiJbnroDnp7AnLFxuXHRcdFx0XHRcdFx0J+WujOaVtOaomemhjOWQjeeoseaIluS6uueJqeWFqOWQjeeahOmDqOWIhuOAgeS4jeWujOaVtOeahOWQjeeoseaIluewoeeosSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5aeT5rCP6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ+S6uueJqeWnk+awjycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICflkI3lrZfph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAn5Lq654mp5Lq65ZCNJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+acrOWQjemHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246ICfkurrnianmnKzlkI0nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn6Z2e5Lit5paH6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfpnZ7kuK3mlofmoIfpopgnLCAn6Z2e5Lit5paH5qiZ6aGMJyksXG5cdFx0XHRcdFx0c3ViZ3JvdXA6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2FsdExhbmdGcm9tJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICfmnKzph43mlrDlsI7lkJHnmoToqp7oqIDvvIjlj6/pgbjvvIknLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOlxuXHRcdFx0XHRcdFx0XHRcdCfovLjlhaXph43mlrDlsI7lkJHlkI3nqLHmiYDkvb/nlKjoqp7oqIDnmoRJU08gNjM55Luj56K877yM5L6L5aaCZW7ku6Pooajoi7Hoqp7vvIzku6Pnorzlj6/lj4PoposgVGVtcGxhdGU6SVNPXzYzOV9uYW1lJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+aXpeaWh+mHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5pel6K+t5ZCN56ewJywgJ+aXpeiqnuWQjeeosScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogJ+WBtueUqOaooeadvycsXG5cdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn6KeS6Imy6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfnlLXop4bliafjgIHnlLXlvbHjgIHkuabnsY3nrYnkvZzlk4HnmoTop5LoibInLCAn6Zu76KaW5YqH44CB6Zu75b2x44CB5pu457GN562J5L2c5ZOB55qE6KeS6ImyJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn56ug6IqC6YeN5a6a5ZCRJywgJ+eroOevgOmHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+WvvOWQkeiHs+i+g+mrmOWvhuW6pue7hOe7h+eahOmhtemdoicsICflsI7lkJHoh7PovIPpq5jlr4bluqbntYTnuZTnmoTpoIHpnaInKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+WIl+ihqOmHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5a+85ZCR6Iez5L2O5a+G5bqm55qE5YiX6KGoJywgJ+WwjuWQkeiHs+S9juWvhuW6pueahOWIl+ihqCcpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5Y+v6IO95oCn6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WvvOWQkeiHs+W9k+WJjeaPkOS+m+WGheWuueabtOS4uuivpuWwveeahOebruagh+mhtemdoicsXG5cdFx0XHRcdFx0XHQn5bCO5ZCR6Iez55W25YmN5o+Q5L6b5YWn5a655pu054K66Kmz55uh55qE55uu5qiZ6aCB6Z2iJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5YWz6IGU5a2X6YeN5a6a5ZCRJywgJ+mXnOiBr+Wtl+mHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+agh+mimOWQjeensOWFs+iBlOWtlycsICfmqJnpoYzlkI3nqLHpl5zoga/lrZcnKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfmnaHnm67or7fmsYLph43lrprlkJEnLCAn5qKd55uu6KuL5rGC6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn6ZyA6KaB54us56uL5p2h55uu55qE6aG16Z2iJywgJ+mcgOimgeeNqOeri+aineebrueahOmggemdoicpLFxuXHRcdFx0XHRcdHN1Ymdyb3VwOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdyZXFBcnRpY2xlTGFuZycsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn5aSW6Kqe6Kqe6KiA5Luj56K877yaJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogJ+S9v+eUqElTTyA2Mznku6PnorzvvIzlj6/lj4PoposgVGVtcGxhdGU6SVNPXzYzOV9uYW1lJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdyZXFBcnRpY2xlVGl0bGUnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogJ+WkluiqnumggemdouWQjeeose+8micsXG5cdFx0XHRcdFx0XHRcdHNpemU6IDYwLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+W/q+aNt+aWueW8j+mHjeWumuWQkScsICfmjbflvpHph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfmsYLpl7vnmb7np5Hlv6vmjbfmlrnlvI8nLCAn5rGC6IGe55m+56eR5b+r5o235pa55byPJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+mynOeUqOaooeadvycsICfprq7nlKjmqKHmnb8nKSxcblx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn6K+N57uE6YeN5a6a5ZCRJywgJ+ipnue1hOmHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5bCG6K+N57uEL+ivjee7hC/miJDor63mjIflkJHliIfpopjnmoTmnaHnm67lj4rmgbDlvZPnq6DoioInLFxuXHRcdFx0XHRcdFx0J+Wwh+ipnue1hC/oqZ7ntYQv5oiQ6Kqe5oyH5ZCR5YiH6aGM55qE5qKd55uu5Y+K5oGw55W256ug56+AJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5raI5q2n5LmJ6aG16YeN5a6a5ZCRJywgJ+a2iOatp+e+qemggemHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+aMh+WQkea2iOatp+S5iemhtScsICfmjIflkJHmtojmrafnvqnpoIEnKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+Wfn+WQjemHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5Z+f5ZCNJywgJ+e2suWfn+WQjeeosScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5bm05Luj6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfkuo7lubTku73mnaHnm67lr7zlkJHoh7PlubTku6PmnaHnm64nLCAn5pa85bm05Lu95qKd55uu5bCO5ZCR6Iez5bm05Luj5qKd55uuJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn55So5oi35qGG5qih5p2/6YeN5a6a5ZCRJywgJ+eUqOaItuahhuaooeadv+mHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+ahhuaooeadvycsICfnlKjmiLbmoYbmqKHmnb8nKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+mHjeWumuWQkeaooeadv+eUqOmHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5a+85ZCR6Iez6YeN5a6a5ZCR5qih5p2/JywgJ+WwjuWQkeiHs+mHjeWumuWQkeaooeadvycpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAnRVhJRumHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygnSlBFR+WbvuWDj+aWh+S7tuWMheWQq0VYSUbkv6Hmga8nLCAnSlBFR+WcluaqlOWMheWQq0VYSUbos4foqIonKSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XTtcblx0Ly8gbWFpbnRlbmFuY2UgdGFncyBmb3IgRklMRVMgc3RhcnQgaGVyZVxuXHRUd2lua2xlLnRhZy5maWxlTGlzdCA9IFtcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn6JGX5L2c5p2D5ZKM5p2l5rqQ6Zeu6aKY5qCH562+JywgJ+iRl+S9nOasiuWSjOS+hua6kOWVj+mhjOaomeexpCcpLFxuXHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3tOb24tZnJlZSByZWR1Y2V9fe+8miR7d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+mdnuS9juWIhui+qOeOh+eahOWQiOeQhuS9v+eUqOWbvuWDj++8iOaIlui/h+mVv+eahOmfs+mikeWJqui+keetie+8iScsXG5cdFx0XHRcdFx0XHQn6Z2e5L2O6Kej5p6Q5bqm55qE5ZCI55CG5L2/55So5ZyW5YOP77yI5oiW6YGO6ZW355qE6Z+z6aC75Ymq6Lyv562J77yJJ1xuXHRcdFx0XHRcdCl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ05vbi1mcmVlIHJlZHVjZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+a4heeQhuagh+etvicsICfmuIXnkIbmqJnnsaQnKSxcblx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7V2F0ZXJtYXJrfX3vvJoke3dpbmRvdy53Z1VMUygn5Zu+5YOP5YyF5ZCr5LqG5rC05Y2wJywgJ+WcluWDj+WMheWQq+S6hua1ruawtOWNsCcpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdXYXRlcm1hcmsnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e1JlbmFtZSBtZWRpYX1977yaJHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5paH5Lu25bqU6K+l5qC55o2u5paH5Lu25ZCN56ew5oyH5byV6KKr6YeN5ZG95ZCNJyxcblx0XHRcdFx0XHRcdCfmqpTmoYjmh4noqbLmoLnmk5rmqpTmoYjlkI3nqLHmjIflvJXooqvph43mlrDlkb3lkI0nXG5cdFx0XHRcdFx0KX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAnUmVuYW1lIG1lZGlhJyxcblx0XHRcdFx0XHRzdWJncm91cDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiAncmVuYW1lbWVkaWFOZXduYW1lJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5paw5ZCN56ew77yaJywgJ+aWsOWQjeeose+8micpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+i+k+WFpeWbvuWDj+eahOaWsOWQjeensO+8iOWPr+mAie+8iScsICfovLjlhaXlnJblg4/nmoTmlrDlkI3nqLHvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdyZW5hbWVtZWRpYVJlYXNvbicsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn5Y6f5Zug77yaJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfovpPlhaXph43lkb3lkI3nmoTljp/lm6DvvIjlj6/pgInvvIknLCAn6Ly45YWl6YeN5paw5ZG95ZCN55qE5Y6f5Zug77yI5Y+v6YG477yJJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7U2hvdWxkIGJlIFNWR31977yaJHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQnUE5H44CBR0lG44CBSlBFR+aWh+S7tuW6lOivpemHjeWItuaIkOefoumHj+WbvuW9oicsXG5cdFx0XHRcdFx0XHQnUE5H44CBR0lG44CBSlBFR+aqlOahiOaHieipsumHjeijveaIkOWQkemHj+WcluW9oidcblx0XHRcdFx0XHQpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdTaG91bGQgYmUgU1ZHJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5paH5Lu25Y+W5Luj5qCH562+JywgJ+aqlOahiOWPluS7o+aomeexpCcpLFxuXHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3tPYnNvbGV0ZX1977yaJHt3aW5kb3cud2dVTFMoJ+acieaWsOeJiOacrOWPr+eUqOeahOi/h+aXtuaWh+S7ticsICfmnInmlrDniYjmnKzlj6/nlKjnmoTpgY7mmYLmqpTmoYgnKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAnT2Jzb2xldGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e1ZlY3RvciB2ZXJzaW9uIGF2YWlsYWJsZX1977yaJHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5pyJ55+i6YeP5Zu+5b2i5Y+v55So55qE6Z2e55+i6YeP5Zu+5b2i5paH5Lu2Jyxcblx0XHRcdFx0XHRcdCfmnInlkJHph4/lnJblvaLlj6/nlKjnmoTpnZ7lkJHph4/lnJblvaLmqpTmoYgnXG5cdFx0XHRcdFx0KX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAnVmVjdG9yIHZlcnNpb24gYXZhaWxhYmxlJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0XHRidWlsZEZpbGVuYW1lOiB0cnVlLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUudGFnLmNhbGxiYWNrcyA9IHtcblx0XHRhcnRpY2xlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Ly8gUmVtb3ZlIHRhZ3MgdGhhdCBiZWNvbWUgc3VwZXJmbHVvdXMgd2l0aCB0aGlzIGFjdGlvblxuXHRcdFx0bGV0IHBhZ2VUZXh0ID0gcGFnZW9ialxuXHRcdFx0XHQuZ2V0UGFnZVRleHQoKVxuXHRcdFx0XHQucmVwbGFjZShcblx0XHRcdFx0XHQvXFx7XFx7XFxzKihbTm5dZXcgdW5yZXZpZXdlZCBhcnRpY2xlfFtVdV1ucmV2aWV3ZWR8W1V1XXNlcnNwYWNlIGRyYWZ0KVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfVxccyovZyxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdC8qKlxuXHRcdFx0ICogU2F2ZXMgdGhlIHBhZ2UgZm9sbG93aW5nIHRoZSByZW1vdmFsIG9mIHRhZ3MgaWYgYW55LiBUaGUgbGFzdCBzdGVwLlxuXHRcdFx0ICogQ2FsbGVkIGZyb20gcmVtb3ZlVGFncygpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHBvc3RSZW1vdmFsID0gKCkgPT4ge1xuXHRcdFx0XHRpZiAocGFyYW1zLnRhZ3NUb1JlbW92ZS5sZW5ndGgpIHtcblx0XHRcdFx0XHQvLyBSZW1vdmUgZW1wdHkge3ttdWx0aXBsZSBpc3N1ZXN9fSBpZiBmb3VuZFxuXHRcdFx0XHRcdHBhZ2VUZXh0ID0gcGFnZVRleHQucmVwbGFjZShcblx0XHRcdFx0XHRcdC9cXHtcXHsobXVsdGlwbGUgP2lzc3Vlc3xhcnRpY2xlID9pc3N1ZXN8bWl8YWl8aXNzdWVzfOWkmuWAi+WVj+mhjHzlpJrkuKrpl67poph85ZWP6aGM5qKd55uufOmXrumimOadoeebrnzmlbjlgIvllY/poYx85pWw5Liq6Zeu6aKYKVxccypcXHxcXHMqXFx9XFx9XFxuPy9pbSxcblx0XHRcdFx0XHRcdCcnXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHQvLyBSZW1vdmUgc2luZ2xlLWVsZW1lbnQge3ttdWx0aXBsZSBpc3N1ZXN9fSBpZiBmb3VuZFxuXHRcdFx0XHRcdHBhZ2VUZXh0ID0gcGFnZVRleHQucmVwbGFjZShcblx0XHRcdFx0XHRcdC9cXHtcXHsoPzptdWx0aXBsZSA/aXNzdWVzfGFydGljbGUgP2lzc3Vlc3xtaXxhaXxpc3N1ZXN85aSa5YCL5ZWP6aGMfOWkmuS4qumXrumimHzllY/poYzmop3nm6586Zeu6aKY5p2h55uufOaVuOWAi+WVj+mhjHzmlbDkuKrpl67popgpXFxzKlxcfFxccyooXFx7XFx7KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKStcXH1cXH0pXFxzKlxcfVxcfS9pbSxcblx0XHRcdFx0XHRcdCckMSdcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIEJ1aWxkIGVkaXQgc3VtbWFyeVxuXHRcdFx0XHRjb25zdCBtYWtlU2VudGVuY2UgPSAoYXJyYXkpID0+IHtcblx0XHRcdFx0XHRpZiAoYXJyYXkubGVuZ3RoIDwgMykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGFycmF5LmpvaW4oJ+WSjCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBsYXN0ID0gYXJyYXkucG9wKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGAke2FycmF5LmpvaW4oJ+OAgScpfeWSjCR7bGFzdH1gO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBtYWtlVGVtcGxhdGVMaW5rID0gKHRhZykgPT4ge1xuXHRcdFx0XHRcdGxldCB0ZXh0ID0gJ3t7W1snO1xuXHRcdFx0XHRcdC8vIGlmIGl0IGlzIGEgY3VzdG9tIHRhZyB3aXRoIGEgcGFyYW1ldGVyXG5cdFx0XHRcdFx0aWYgKHRhZy5pbmNsdWRlcygnfCcpKSB7XG5cdFx0XHRcdFx0XHR0YWcgPSB0YWcuc2xpY2UoMCwgdGFnLmluZGV4T2YoJ3wnKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRleHQgKz0gdGFnLmluY2x1ZGVzKCc6JykgPyB0YWcgOiBgVGVtcGxhdGU6JHt0YWd9fCR7dGFnfWA7XG5cdFx0XHRcdFx0cmV0dXJuIGAke3RleHR9XV19fWA7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGxldCBzdW1tYXJ5VGV4dDtcblx0XHRcdFx0Y29uc3QgYWRkZWRUYWdzID0gcGFyYW1zLnRhZ3MubWFwKG1ha2VUZW1wbGF0ZUxpbmspO1xuXHRcdFx0XHRjb25zdCByZW1vdmVkVGFncyA9IHBhcmFtcy50YWdzVG9SZW1vdmUubWFwKG1ha2VUZW1wbGF0ZUxpbmspO1xuXHRcdFx0XHRpZiAoYWRkZWRUYWdzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHN1bW1hcnlUZXh0ID0gYOWKoOWFpSR7bWFrZVNlbnRlbmNlKGFkZGVkVGFncyl9YDtcblx0XHRcdFx0XHRzdW1tYXJ5VGV4dCArPSByZW1vdmVkVGFncy5sZW5ndGggPyBg5Lim56e76ZmkJHttYWtlU2VudGVuY2UocmVtb3ZlZFRhZ3MpfWAgOiAnJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdW1tYXJ5VGV4dCA9IGDnp7vpmaQke21ha2VTZW50ZW5jZShyZW1vdmVkVGFncyl9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdW1tYXJ5VGV4dCArPSB3aW5kb3cud2dVTFMoJ+agh+iusCcsICfmqJnoqJgnKTtcblx0XHRcdFx0aWYgKHBhcmFtcy5yZWFzb24pIHtcblx0XHRcdFx0XHRzdW1tYXJ5VGV4dCArPSBg77yaJHtwYXJhbXMucmVhc29ufWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gYXZvaWQgdHJ1bmNhdGVkIHN1bW1hcmllc1xuXHRcdFx0XHRpZiAoc3VtbWFyeVRleHQubGVuZ3RoID4gNDk5KSB7XG5cdFx0XHRcdFx0c3VtbWFyeVRleHQgPSBzdW1tYXJ5VGV4dC5yZXBsYWNlKC9cXFtcXFtbXnxdK1xcfChbXlxcXV0rKVxcXVxcXS9nLCAnJDEnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHBhZ2VUZXh0KTtcblx0XHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShzdW1tYXJ5VGV4dCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoVGFnZ2VkUGFnZXMnKSk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0TWlub3JFZGl0KFR3aW5rbGUuZ2V0UHJlZignbWFya1RhZ2dlZFBhZ2VzQXNNaW5vcicpKTtcblx0XHRcdFx0cGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ25vY3JlYXRlJyk7XG5cdFx0XHRcdHBhZ2VvYmouc2F2ZSgoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gc3BlY2lhbCBmdW5jdGlvbnMgZm9yIG1lcmdlIHRhZ3Ncblx0XHRcdFx0XHRpZiAocGFyYW1zLm1lcmdlUmVhc29uKSB7XG5cdFx0XHRcdFx0XHQvLyBwb3N0IHRoZSByYXRpb25hbGUgb24gdGhlIHRhbGsgcGFnZSAob25seSBvcGVyYXRlcyBpbiBtYWluIG5hbWVzcGFjZSlcblx0XHRcdFx0XHRcdGNvbnN0IHRhbGtwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdFx0YFRhbGs6JHtwYXJhbXMuZGlzY3Vzc0FydGljbGV9YCxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflsIbnkIbnlLHotLTov5vorqjorrrpobUnLCAn5bCH55CG55Sx6LK86YCy6KiO6KuW6aCBJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR0YWxrcGFnZS5zZXROZXdTZWN0aW9uVGV4dChgJHtwYXJhbXMubWVyZ2VSZWFzb24udHJpbSgpfSB+fmAuY29uY2F0KCd+ficpKTtcblx0XHRcdFx0XHRcdHRhbGtwYWdlLnNldE5ld1NlY3Rpb25UaXRsZShg6K+35rGC5LiOW1ske3BhcmFtcy5ub25EaXNjdXNzQXJ0aWNsZX1dXeWQiOW5tmApO1xuXHRcdFx0XHRcdFx0dGFsa3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdFx0dGFsa3BhZ2Uuc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hNZXJnZURpc2N1c3Npb25zJykpO1xuXHRcdFx0XHRcdFx0dGFsa3BhZ2Uuc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0XHRcdFx0dGFsa3BhZ2UubmV3U2VjdGlvbigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGFyYW1zLm1lcmdlVGFnT3RoZXIpIHtcblx0XHRcdFx0XHRcdC8vIHRhZyB0aGUgdGFyZ2V0IHBhZ2UgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdFx0XHRsZXQgb3RoZXJUYWdOYW1lID0gJ01lcmdlJztcblx0XHRcdFx0XHRcdGlmIChwYXJhbXMubWVyZ2VUYWcgPT09ICdNZXJnZSBmcm9tJykge1xuXHRcdFx0XHRcdFx0XHRvdGhlclRhZ05hbWUgPSAnTWVyZ2UgdG8nO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMubWVyZ2VUYWcgPT09ICdNZXJnZSB0bycpIHtcblx0XHRcdFx0XHRcdFx0b3RoZXJUYWdOYW1lID0gJ01lcmdlIGZyb20nO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3QgbmV3UGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0XHR0YWdzOiBbb3RoZXJUYWdOYW1lXSxcblx0XHRcdFx0XHRcdFx0dGFnc1RvUmVtb3ZlOiBbXSxcblx0XHRcdFx0XHRcdFx0dGFnc1RvUmVtYWluOiBbXSxcblx0XHRcdFx0XHRcdFx0bWVyZ2VUYXJnZXQ6IE1vcmViaXRzLnBhZ2VOYW1lTm9ybSxcblx0XHRcdFx0XHRcdFx0ZGlzY3Vzc0FydGljbGU6IHBhcmFtcy5kaXNjdXNzQXJ0aWNsZSxcblx0XHRcdFx0XHRcdFx0dGFsa0Rpc2N1c3Npb25UaXRsZTogcGFyYW1zLnRhbGtEaXNjdXNzaW9uVGl0bGUsXG5cdFx0XHRcdFx0XHRcdHRhbGtEaXNjdXNzaW9uVGl0bGVMaW5rZWQ6IHBhcmFtcy50YWxrRGlzY3Vzc2lvblRpdGxlTGlua2VkLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGNvbnN0IG90aGVycGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0XHRcdHBhcmFtcy5tZXJnZVRhcmdldCxcblx0XHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfmoIforrDlhbbku5bpobXpnaLvvIgnLCAn5qiZ6KiY5YW25LuW6aCB6Z2i77yIJykgKyBwYXJhbXMubWVyZ2VUYXJnZXR977yJYFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdG90aGVycGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMobmV3UGFyYW1zKTtcblx0XHRcdFx0XHRcdG90aGVycGFnZS5sb2FkKFR3aW5rbGUudGFnLmNhbGxiYWNrcy5hcnRpY2xlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gc3BlY2lhbCBmdW5jdGlvbnMgZm9yIHJlcXVlc3RlZCBtb3ZlIHRhZ3Ncblx0XHRcdFx0XHRpZiAocGFyYW1zLm1vdmVSZWFzb24pIHtcblx0XHRcdFx0XHRcdC8vIHBvc3QgdGhlIHJhdGlvbmFsZSBvbiB0aGUgdGFsayBwYWdlIChvbmx5IG9wZXJhdGVzIGluIG1haW4gbmFtZXNwYWNlKVxuXHRcdFx0XHRcdFx0bGV0IG1vdmVUYWxrcGFnZVRleHQgPSAnXFxuXFxue3snLmNvbmNhdCgnc3Vic3Q6JywgYFJNfDE9JHtwYXJhbXMubW92ZVJlYXNvbi50cmltKCl9YCk7XG5cdFx0XHRcdFx0XHRpZiAocGFyYW1zLm1vdmVUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0bW92ZVRhbGtwYWdlVGV4dCArPSBgfDI9JHtwYXJhbXMubW92ZVRhcmdldH1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bW92ZVRhbGtwYWdlVGV4dCArPSAnfX0nO1xuXHRcdFx0XHRcdFx0Y29uc3QgbW92ZVRhbGtwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdFx0YFRhbGs6JHtwYXJhbXMuZGlzY3Vzc0FydGljbGV9YCxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflsIbnkIbnlLHotLTov5vorqjorrrpobUnLCAn5bCH55CG55Sx6LK86YCy6KiO6KuW6aCBJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRtb3ZlVGFsa3BhZ2Uuc2V0QXBwZW5kVGV4dChtb3ZlVGFsa3BhZ2VUZXh0KTtcblx0XHRcdFx0XHRcdG1vdmVUYWxrcGFnZS5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfor7fmsYLnp7vliqgnLCAn6KuL5rGC56e75YuVJykgK1xuXHRcdFx0XHRcdFx0XHRcdChwYXJhbXMubW92ZVRhcmdldCA/IGDoh7NbWyR7cGFyYW1zLm1vdmVUYXJnZXR9XV1gIDogJycpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0bW92ZVRhbGtwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0XHRcdG1vdmVUYWxrcGFnZS5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRcdFx0XHRtb3ZlVGFsa3BhZ2UuYXBwZW5kKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKHBhcmFtcy5wYXRyb2wpIHtcblx0XHRcdFx0XHRwYWdlb2JqLnBhdHJvbCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZW1vdmVzIHRoZSBleGlzdGluZyB0YWdzIHRoYXQgd2VyZSBkZXNlbGVjdGVkIChpZiBhbnkpXG5cdFx0XHQgKiBDYWxscyBwb3N0UmVtb3ZhbCgpIHdoZW4gZG9uZVxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCByZW1vdmVUYWdzID0gKCkgPT4ge1xuXHRcdFx0XHRpZiAocGFyYW1zLnRhZ3NUb1JlbW92ZS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRwb3N0UmVtb3ZhbCgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+enu+mZpOWPlua2iOmAieaLqeeahOW3suWtmOWcqOagh+iusCcsICfnp7vpmaTlj5bmtojpgbjmk4fnmoTlt7LlrZjlnKjmqJnoqJgnKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBnZXRSZWRpcmVjdHNGb3IgPSBbXTtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSB0YWdzIGZyb20gdGhlIHBhZ2UgdGV4dCwgaWYgZm91bmQgaW4gaXRzIHByb3BlciBuYW1lLFxuXHRcdFx0XHQvLyBvdGhlcndpc2UgbW92ZXMgaXQgdG8gYGdldFJlZGlyZWN0c0ZvcmAgYXJyYXkgZWFybWFya2luZyBpdCBmb3Jcblx0XHRcdFx0Ly8gbGF0ZXIgcmVtb3ZhbFxuXHRcdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBwYXJhbXMudGFnc1RvUmVtb3ZlKSB7XG5cdFx0XHRcdFx0Y29uc3QgdGFnX3JlID0gbmV3IFJlZ0V4cChgXFxcXHtcXFxceyR7TW9yZWJpdHMucGFnZU5hbWVSZWdleCh0YWcpfVxcXFxzKihcXFxcfFtefV0rKT9cXFxcfVxcXFx9XFxcXG4/YCk7XG5cdFx0XHRcdFx0aWYgKHRhZ19yZS50ZXN0KHBhZ2VUZXh0KSkge1xuXHRcdFx0XHRcdFx0cGFnZVRleHQgPSBwYWdlVGV4dC5yZXBsYWNlKHRhZ19yZSwgJycpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRnZXRSZWRpcmVjdHNGb3JbZ2V0UmVkaXJlY3RzRm9yLmxlbmd0aF0gPSBgVGVtcGxhdGU6JHt0YWd9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFnZXRSZWRpcmVjdHNGb3IubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cG9zdFJlbW92YWwoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUmVtb3ZlIHRhZ3Mgd2hpY2ggYXBwZWFyIGluIHBhZ2UgdGV4dCBhcyByZWRpcmVjdHNcblx0XHRcdFx0Y29uc3QgYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6I635Y+W5qih5p2/6YeN5a6a5ZCRJywgJ+WPluW+l+aooeadv+mHjeaWsOWwjuWQkScpLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRcdHByb3A6ICdsaW5rc2hlcmUnLFxuXHRcdFx0XHRcdFx0dGl0bGVzOiBnZXRSZWRpcmVjdHNGb3Iuam9pbignfCcpLFxuXHRcdFx0XHRcdFx0cmVkaXJlY3RzOiAxLFxuXHRcdFx0XHRcdFx0bGhuYW1lc3BhY2U6ICcxMCcsXG5cdFx0XHRcdFx0XHRsaHNob3c6ICdyZWRpcmVjdCcsXG5cdFx0XHRcdFx0XHRsaGxpbWl0OiAnbWF4JywgLy8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdChhcGlvYmopID0+IHtcblx0XHRcdFx0XHRcdCQoYXBpb2JqLnJlc3BvbnNlWE1MKVxuXHRcdFx0XHRcdFx0XHQuZmluZCgncGFnZScpXG5cdFx0XHRcdFx0XHRcdC5lYWNoKChfaWR4LCBwYWdlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHJlbW92ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHQkKHBhZ2UpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZmluZCgnbGgnKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB0YWcgPSAkKGVsZW1lbnQpLmF0dHIoJ3RpdGxlJykuc2xpY2UoOSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRhZ19yZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YFxcXFx7XFxcXHske01vcmViaXRzLnBhZ2VOYW1lUmVnZXgoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0YWdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpfVxcXFxzKihcXFxcfCg/OlxcXFx7XFxcXHtbXnt9XSpcXFxcfVxcXFx9fFtee31dKSopP1xcXFx9XFxcXH1cXFxcbj9gXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0YWdfcmUudGVzdChwYWdlVGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYWdlVGV4dCA9IHBhZ2VUZXh0LnJlcGxhY2UodGFnX3JlLCAnJyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVtb3ZlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBicmVhayBvdXQgb2YgJC5lYWNoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFyZW1vdmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5peg5rOV5Zyo6aG16Z2i5LiK5om+5Yiwe3snLCAn54Sh5rOV5Zyo6aCB6Z2i5LiK5om+5Yiwe3snKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JChwYWdlKS5hdHRyKCd0aXRsZScpLnNsaWNlKDkpICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ3194oCm4oCm6Lez6L+HJywgJ3194oCm4oCm6Lez6YGOJylcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHBvc3RSZW1vdmFsKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhcGkucG9zdCgpO1xuXHRcdFx0fTtcblx0XHRcdGlmICghcGFyYW1zLnRhZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdHJlbW92ZVRhZ3MoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHRhZ1JlO1xuXHRcdFx0bGV0IHRhZ1RleHQgPSAnJztcblx0XHRcdGxldCB0YWdzID0gW107XG5cdFx0XHRjb25zdCBncm91cGFibGVUYWdzID0gW107XG5cdFx0XHRjb25zdCBncm91cGFibGVFeGlzdGluZ1RhZ3MgPSBbXTtcblx0XHRcdC8vIEV4ZWN1dGVzIGZpcnN0OiBhZGRpdGlvbiBvZiBzZWxlY3RlZCB0YWdzXG5cdFx0XHQvKipcblx0XHRcdCAqIFVwZGF0ZXMgYHRhZ1RleHRgIHdpdGggdGhlIHN5bnRheCBvZiBgdGFnTmFtZWAgdGVtcGxhdGUgd2l0aCBpdHMgcGFyYW1ldGVyc1xuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFkZFRhZyA9ICh0YWdOYW1lKSA9PiB7XG5cdFx0XHRcdGxldCBjdXJyZW50VGFnID0gJyc7XG5cdFx0XHRcdGlmICh0YWdOYW1lID09PSAnVW5jYXRlZ29yaXplZCcgfHwgdGFnTmFtZSA9PT0gJ0ltcHJvdmUgY2F0ZWdvcmllcycpIHtcblx0XHRcdFx0XHRwYWdlVGV4dCArPSBgXFxuXFxue3ske3RhZ05hbWV9fHRpbWU9e3tgLmNvbmNhdCgnc3Vic3Q6JywgJyN0aW1lOmN9fX19Jyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudFRhZyArPSBge3ske3RhZ05hbWV9YDtcblx0XHRcdFx0XHQvLyBmaWxsIGluIG90aGVyIHBhcmFtZXRlcnMsIGJhc2VkIG9uIHRoZSB0YWdcblx0XHRcdFx0XHRzd2l0Y2ggKHRhZ05hbWUpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ0V4cGVydCBuZWVkZWQnOlxuXHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8c3ViamVjdD0ke3BhcmFtcy5leHBlcnR9YDtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5leHBlcnQyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfHN1YmplY3QyPSR7cGFyYW1zLmV4cGVydDJ9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLmV4cGVydDMpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8c3ViamVjdDM9JHtwYXJhbXMuZXhwZXJ0M31gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UnOlxuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgdG8nOlxuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgZnJvbSc6XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJhbXMubWVyZ2VUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBub3JtYWxpemUgdGhlIG1lcmdlIHRhcmdldCBmb3Igbm93IGFuZCBsYXRlclxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5tZXJnZVRhcmdldCA9IE1vcmViaXRzLnN0cmluZy50b1VwcGVyQ2FzZUZpcnN0Q2hhcihcblx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5tZXJnZVRhcmdldC5yZXBsYWNlKC9fL2csICcgJylcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwke3BhcmFtcy5tZXJnZVRhcmdldH1gO1xuXHRcdFx0XHRcdFx0XHRcdC8vIGxpbmsgdG8gdGhlIGNvcnJlY3Qgc2VjdGlvbiBvbiB0aGUgdGFsayBwYWdlLCBmb3IgYXJ0aWNsZSBzcGFjZSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0KHBhcmFtcy5tZXJnZVJlYXNvbiB8fCBwYXJhbXMuZGlzY3Vzc0FydGljbGUpXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXBhcmFtcy5kaXNjdXNzQXJ0aWNsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBkaXNjdXNzQXJ0aWNsZSBpcyB0aGUgYXJ0aWNsZSB3aG9zZSB0YWxrIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkaXNjdXNzaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5kaXNjdXNzQXJ0aWNsZSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGFnTmFtZSA9PT0gJ01lcmdlIHRvJyA/IHBhcmFtcy5tZXJnZVRhcmdldCA6IG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gbm9uRGlzY3Vzc0FydGljbGUgaXMgdGhlIGFydGljbGUgd2hpY2ggd29uJ3QgaGF2ZSB0aGUgZGlzY3Vzc2lvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbXMubm9uRGlzY3Vzc0FydGljbGUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRhZ05hbWUgPT09ICdNZXJnZSB0bycgPyBtdy5jb25maWcuZ2V0KCd3Z1RpdGxlJykgOiBwYXJhbXMubWVyZ2VUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtcy50YWxrRGlzY3Vzc2lvblRpdGxlID1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivt+axguS4jicsICfoq4vmsYLoiIcnKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1zLm5vbkRpc2N1c3NBcnRpY2xlICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WQiOW5ticsICflkIjkvbUnKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHxkaXNjdXNzPVRhbGs6JHtwYXJhbXMuZGlzY3Vzc0FydGljbGV9IyR7cGFyYW1zLnRhbGtEaXNjdXNzaW9uVGl0bGV9YDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdNaXNzaW5nIGluZm9ybWF0aW9uJzpcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDE9JHtwYXJhbXMubWlzc2luZ0luZm9ybWF0aW9ufWA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnTm90YWJpbGl0eSc6XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJhbXMubm90YWJpbGl0eSAhPT0gJ25vbmUnKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDM9JHtwYXJhbXMubm90YWJpbGl0eX1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnUmVxdWVzdGVkIG1vdmUnOlxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLm1vdmVUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBub3JtYWxpemUgdGhlIG1vdmUgdGFyZ2V0IGZvciBub3cgYW5kIGxhdGVyXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW1zLm1vdmVUYXJnZXQgPSBNb3JlYml0cy5zdHJpbmcudG9VcHBlckNhc2VGaXJzdENoYXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRwYXJhbXMubW92ZVRhcmdldC5yZXBsYWNlKC9fL2csICcgJylcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5kaXNjdXNzQXJ0aWNsZSA9IG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKTtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8JHtwYXJhbXMubW92ZVRhcmdldH1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnU3BsaXQnOlxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLnRhcmdldDEpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8MT0ke3BhcmFtcy50YXJnZXQxfWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy50YXJnZXQyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDI9JHtwYXJhbXMudGFyZ2V0Mn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJhbXMudGFyZ2V0Mykge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwzPSR7cGFyYW1zLnRhcmdldDN9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ0NsZWFudXAnOlxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLmNsZWFudXBSZWFzb24pIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8cmVhc29uPSR7cGFyYW1zLmNsZWFudXBSZWFzb259YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJyZW50VGFnICs9ICd8dGltZT17eycuY29uY2F0KCdzdWJzdDonLCAnI3RpbWU6Y319fX1cXG4nKTtcblx0XHRcdFx0XHR0YWdUZXh0ICs9IGN1cnJlbnRUYWc7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHQvKipcblx0XHRcdCAqIEFkZHMgdGhlIHRhZ3Mgd2hpY2ggZ28gb3V0c2lkZSB7e211bHRpcGxlIGlzc3Vlc319LCBlaXRoZXIgYmVjYXVzZVxuXHRcdFx0ICogdGhlc2UgdGFncyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHt7bXVsdGlwbGUgaXNzdWVzfX0gb3IgYmVjYXVzZVxuXHRcdFx0ICoge3ttdWx0aXBsZSBpc3N1ZXN9fSBpcyBub3QgYmVpbmcgYWRkZWQgdG8gdGhlIHBhZ2UgYXQgYWxsXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFkZFVuZ3JvdXBlZFRhZ3MgPSAoKSA9PiB7XG5cdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcblx0XHRcdFx0XHRhZGRUYWcodGFnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBJbnNlcnQgdGFnIGFmdGVyIHNob3J0IGRlc2NyaXB0aW9uIG9yIGFueSBoYXRub3Rlcyxcblx0XHRcdFx0Ly8gYXMgd2VsbCBhcyBkZWxldGlvbi9wcm90ZWN0aW9uLXJlbGF0ZWQgdGVtcGxhdGVzXG5cdFx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2l0ZXh0LnBhZ2UocGFnZVRleHQpO1xuXHRcdFx0XHRjb25zdCB0ZW1wbGF0ZXNBZnRlciA9XG5cdFx0XHRcdFx0Ly8gUHJvdGVjdGlvbiB0ZW1wbGF0ZXNcblx0XHRcdFx0XHQvLyBDU0Rcblx0XHRcdFx0XHQvLyBBZkRcblx0XHRcdFx0XHRgJHtUd2lua2xlLmhhdG5vdGVSZWdleH1wcHxwcC0uKj98KD86RGVsZXRlfERiLXJlYXNvbnxEfERlbGV0ZWJlY2F1c2V8RGJ86YCf5YigfOmAn+WIqnxTcGVlZHl8U0R85b+r5YigfOW/q+WIqnxDU0QpfFtyc2FpZnRjbXZdZmR8dmZkLSg/OmJ8cXxzfHNvdXJjZXx2fHdpa3QpfCg/Ouenu+WKqOWIsOe7tOWfunznp7vli5XliLDntq3ln7opKD865pWZ56eR5LmmfOaVmeenkeabuHzor63lvZV86Kqe6YyEfOaWh+W6k3zmlofluqt85a+85ri4fOWwjumBinzor43lhbh86Kme5YW4KWA7XG5cdFx0XHRcdHBhZ2VUZXh0ID0gcWl1d2VuX3BhZ2UuaW5zZXJ0QWZ0ZXJUZW1wbGF0ZXModGFnVGV4dCwgdGVtcGxhdGVzQWZ0ZXIpLmdldFRleHQoKTtcblx0XHRcdFx0cmVtb3ZlVGFncygpO1xuXHRcdFx0fTtcblx0XHRcdC8vIFNlcGFyYXRlIHRhZ3MgaW50byBncm91cGFibGUgb25lcyAoYGdyb3VwYWJsZVRhZ3NgKSBhbmQgbm9uLWdyb3VwYWJsZSBvbmVzIChgdGFnc2ApXG5cdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBwYXJhbXMudGFncykge1xuXHRcdFx0XHR0YWdSZSA9IG5ldyBSZWdFeHAoYFxcXFx7XFxcXHske3RhZ30oXFxcXHx8XFxcXH1cXFxcfSlgLCAnaW0nKTtcblx0XHRcdFx0Ly8gcmVnZXggY2hlY2sgZm9yIHByZWV4aXN0ZW5jZSBvZiB0YWcgY2FuIGJlIHNraXBwZWQgaWYgaW4gY2FuUmVtb3ZlIG1vZGVcblx0XHRcdFx0aWYgKFR3aW5rbGUudGFnLmNhblJlbW92ZSB8fCAhdGFnUmUuZXhlYyhwYWdlVGV4dCkpIHtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHR0YWcgPT09ICdOb3RhYmlsaXR5JyAmJlxuXHRcdFx0XHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDAgfHxcblx0XHRcdFx0XHRcdFx0Y29uZmlybShcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn6K+l6aG16Z2i5LiN5piv5p2h55uu77yM5oKo5LuN6KaB5o+Q5oql5Yiw5YWz5rOo5bqm5o+Q5oql5ZCX77yfJyxcblx0XHRcdFx0XHRcdFx0XHRcdCfoqbLpoIHpnaLkuI3mmK/mop3nm67vvIzmgqjku43opoHmj5DloLHliLDpl5zms6jluqbmj5DloLHll47vvJ8nXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQpKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHQnUWl1d2VuX3RhbGs65a2Y5bqf6K6o6K66L+WFs+azqOW6puaPkOaKpScsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg5YWl5YWz5rOo5bqm6K6w5b2V6aG5JywgJ+WKoOWFpemXnOazqOW6puiomOmMhOmghScpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSk7XG5cdFx0XHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0XHRcdHFpdXdlbl9wYWdlLmxvYWQoVHdpbmtsZS50YWcuY2FsbGJhY2tzLm5vdGFiaWxpdHlMaXN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gY29uZGl0aW9uIFR3aW5rbGUudGFnLmFydGljbGUudGFnc1t0YWddIHRvIGVuc3VyZSB0aGF0IGl0cyBub3QgYSBjdXN0b20gdGFnXG5cdFx0XHRcdFx0Ly8gQ3VzdG9tIHRhZ3MgYXJlIGFzc3VtZWQgbm9uLWdyb3VwYWJsZSwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGV0aGVyIE1JIHRlbXBsYXRlIHN1cHBvcnRzIHRoZW1cblx0XHRcdFx0XHRpZiAoVHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0W3RhZ10gJiYgIVR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFt0YWddLmV4Y2x1ZGVNSSkge1xuXHRcdFx0XHRcdFx0Z3JvdXBhYmxlVGFnc1tncm91cGFibGVUYWdzLmxlbmd0aF0gPSB0YWc7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhZ3NbdGFncy5sZW5ndGhdID0gdGFnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0YWcgPT09ICdNZXJnZSBmcm9tJykge1xuXHRcdFx0XHRcdHRhZ3NbdGFncy5sZW5ndGhdID0gdGFnO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WcqOmhtemdouS4iuaJvuWIsHt7JywgJ+WcqOmggemdouS4iuaJvuWIsHt7JykgKyB0YWcgKyB3aW5kb3cud2dVTFMoJ3194oCm4oCm6Lez6L+HJywgJ3194oCm4oCm6Lez6YGOJylcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdC8vIGRvbid0IGRvIGFueXRoaW5nIGVsc2Ugd2l0aCBtZXJnZSB0YWdzXG5cdFx0XHRcdFx0aWYgKFsnTWVyZ2UnLCAnTWVyZ2UgdG8nXS5pbmNsdWRlcyh0YWcpKSB7XG5cdFx0XHRcdFx0XHRwYXJhbXMubWVyZ2VUYXJnZXQgPSBudWxsO1xuXHRcdFx0XHRcdFx0cGFyYW1zLm1lcmdlUmVhc29uID0gbnVsbDtcblx0XHRcdFx0XHRcdHBhcmFtcy5tZXJnZVRhZ090aGVyID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFRvLWJlLXJldGFpbmVkIGV4aXN0aW5nIHRhZ3MgdGhhdCBhcmUgZ3JvdXBhYmxlXG5cdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBwYXJhbXMudGFnc1RvUmVtYWluKSB7XG5cdFx0XHRcdC8vIElmIHRoZSB0YWcgaXMgdW5rbm93biB0byB1cywgd2UgY29uc2lkZXIgaXQgbm9uLWdyb3VwYWJsZVxuXHRcdFx0XHRpZiAoVHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0W3RhZ10gJiYgIVR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFt0YWddLmV4Y2x1ZGVNSSkge1xuXHRcdFx0XHRcdGdyb3VwYWJsZUV4aXN0aW5nVGFnc1tncm91cGFibGVFeGlzdGluZ1RhZ3MubGVuZ3RoXSA9IHRhZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbWlUZXN0ID1cblx0XHRcdFx0L1xce1xceyhtdWx0aXBsZSA/aXNzdWVzfGFydGljbGUgP2lzc3Vlc3xtaXxhaXxpc3N1ZXN85aSa5YCL5ZWP6aGMfOWkmuS4qumXrumimHzllY/poYzmop3nm6586Zeu6aKY5p2h55uufOaVuOWAi+WVj+mhjHzmlbDkuKrpl67popgpXFxzKlxcfFtefV0rXFx7L2ltLmV4ZWMoXG5cdFx0XHRcdFx0cGFnZVRleHRcblx0XHRcdFx0KTtcblx0XHRcdGlmIChtaVRlc3QgJiYgZ3JvdXBhYmxlVGFncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+h5oGvJywgJ+izh+ioiicpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfliqDlhaXmlK/mjIHnmoTmoIforrDlhaXlt7LlrZjlnKjnmoR7e211bHRpcGxlIGlzc3Vlc319Jyxcblx0XHRcdFx0XHRcdCfliqDlhaXmlK/mj7TnmoTmqJnoqJjlhaXlt7LlrZjlnKjnmoR7e211bHRpcGxlIGlzc3Vlc319J1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0dGFnVGV4dCA9ICcnO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBncm91cGFibGVUYWdzKSB7XG5cdFx0XHRcdFx0YWRkVGFnKHRhZyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbWlSZWdleCA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0YChcXFxce1xcXFx7XFxcXHMqJHttaVRlc3RbMV19XFxcXHMqKD86XFxcXHwoPzpcXFxce1xcXFx7W157fV0qXFxcXH1cXFxcfXxbXnt9XSkqKT8pXFxcXH1cXFxcfVxcXFxzKmAsXG5cdFx0XHRcdFx0J2ltJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRwYWdlVGV4dCA9IHBhZ2VUZXh0LnJlcGxhY2UobWlSZWdleCwgYCQxJHt0YWdUZXh0fX19XFxuYCk7XG5cdFx0XHRcdHRhZ1RleHQgPSAnJztcblx0XHRcdFx0YWRkVW5ncm91cGVkVGFncygpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbXMuZ3JvdXAgJiYgIW1pVGVzdCAmJiBncm91cGFibGVFeGlzdGluZ1RhZ3MubGVuZ3RoICsgZ3JvdXBhYmxlVGFncy5sZW5ndGggPj0gMikge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeaUr+aMgeeahOagh+iusOWFpXt7bXVsdGlwbGUgaXNzdWVzfX0nLCAn5Yqg5YWl5pSv5o+055qE5qiZ6KiY5YWle3ttdWx0aXBsZSBpc3N1ZXN9fScpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRhZ1RleHQgKz0gJ3t7TXVsdGlwbGUgaXNzdWVzfFxcbic7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBBZGRzIG5ld2x5IGFkZGVkIHRhZ3MgdG8gTUlcblx0XHRcdFx0ICovXG5cdFx0XHRcdGNvbnN0IGFkZE5ld1RhZ3NUb01JID0gKCkgPT4ge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIGdyb3VwYWJsZVRhZ3MpIHtcblx0XHRcdFx0XHRcdGFkZFRhZyh0YWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0YWdUZXh0ICs9ICd9fVxcbic7XG5cdFx0XHRcdFx0YWRkVW5ncm91cGVkVGFncygpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBnZXRSZWRpcmVjdHNGb3IgPSBbXTtcblx0XHRcdFx0Ly8gUmVwb3NpdGlvbiB0aGUgdGFncyBvbiB0aGUgcGFnZSBpbnRvIHt7bXVsdGlwbGUgaXNzdWVzfX0sIGlmIGZvdW5kIHdpdGggaXRzXG5cdFx0XHRcdC8vIHByb3BlciBuYW1lLCBlbHNlIG1vdmVzIGl0IHRvIGBnZXRSZWRpcmVjdHNGb3JgIGFycmF5IHRvIGJlIGhhbmRsZWQgbGF0ZXJcblx0XHRcdFx0Zm9yIChjb25zdCB0YWcgb2YgZ3JvdXBhYmxlRXhpc3RpbmdUYWdzKSB7XG5cdFx0XHRcdFx0Y29uc3QgdGFnX3JlID0gbmV3IFJlZ0V4cChgKFxcXFx7XFxcXHske01vcmViaXRzLnBhZ2VOYW1lUmVnZXgodGFnKX1cXFxccyooXFxcXHxbXn1dKyk/XFxcXH1cXFxcfVxcXFxuPylgKTtcblx0XHRcdFx0XHRpZiAodGFnX3JlLnRlc3QocGFnZVRleHQpKSB7XG5cdFx0XHRcdFx0XHR0YWdUZXh0ICs9IHRhZ19yZS5leGVjKHBhZ2VUZXh0KVsxXTtcblx0XHRcdFx0XHRcdHBhZ2VUZXh0ID0gcGFnZVRleHQucmVwbGFjZSh0YWdfcmUsICcnKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Z2V0UmVkaXJlY3RzRm9yW2dldFJlZGlyZWN0c0Zvci5sZW5ndGhdID0gYFRlbXBsYXRlOiR7dGFnfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZ2V0UmVkaXJlY3RzRm9yLmxlbmd0aCkge1xuXHRcdFx0XHRcdGFkZE5ld1RhZ3NUb01JKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+iOt+WPluaooeadv+mHjeWumuWQkScsICflj5blvpfmqKHmnb/ph43mlrDlsI7lkJEnKSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHRwcm9wOiAnbGlua3NoZXJlJyxcblx0XHRcdFx0XHRcdHRpdGxlczogZ2V0UmVkaXJlY3RzRm9yLmpvaW4oJ3wnKSxcblx0XHRcdFx0XHRcdHJlZGlyZWN0czogMSxcblx0XHRcdFx0XHRcdGxobmFtZXNwYWNlOiAnMTAnLFxuXHRcdFx0XHRcdFx0bGhzaG93OiAncmVkaXJlY3QnLFxuXHRcdFx0XHRcdFx0bGhsaW1pdDogJ21heCcsIC8vIDUwMCBpcyBtYXggZm9yIG5vcm1hbCB1c2VycywgNTAwMCBmb3IgYm90cyBhbmQgc3lzb3BzXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQoYXBpb2JqKSA9PiB7XG5cdFx0XHRcdFx0XHQkKGFwaW9iai5yZXNwb25zZVhNTClcblx0XHRcdFx0XHRcdFx0LmZpbmQoJ3BhZ2UnKVxuXHRcdFx0XHRcdFx0XHQuZWFjaCgoX2lkeCwgcGFnZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdCQocGFnZSlcblx0XHRcdFx0XHRcdFx0XHRcdC5maW5kKCdsaCcpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZWFjaCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRhZyA9ICQoZWxlbWVudCkuYXR0cigndGl0bGUnKS5zbGljZSg5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGFnX3JlID0gbmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRgKFxcXFx7XFxcXHske01vcmViaXRzLnBhZ2VOYW1lUmVnZXgodGFnKX1cXFxccyooXFxcXHxbXn1dKik/XFxcXH1cXFxcfVxcXFxuPylgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0YWdfcmUudGVzdChwYWdlVGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0YWdUZXh0ICs9IHRhZ19yZS5leGVjKHBhZ2VUZXh0KVsxXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYWdlVGV4dCA9IHBhZ2VUZXh0LnJlcGxhY2UodGFnX3JlLCAnJyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTsgLy8gYnJlYWsgb3V0IG9mICQuZWFjaFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICghZm91bmQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfml6Dms5XlnKjpobXpnaLkuIrmib7liLB7eycsICfnhKHms5XlnKjpoIHpnaLkuIrmib7liLB7eycpICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkKHBhZ2UpLmF0dHIoJ3RpdGxlJykuc2xpY2UoOSkgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnfX3igKbigKbot7Pov4cnLCAnfX3igKbigKbot7PpgY4nKVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0YWRkTmV3VGFnc1RvTUkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFwaS5wb3N0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0YWdzID0gWy4uLnRhZ3MsIC4uLmdyb3VwYWJsZVRhZ3NdO1xuXHRcdFx0XHRhZGRVbmdyb3VwZWRUYWdzKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRub3RhYmlsaXR5TGlzdDogKHBhZ2VvYmopID0+IHtcblx0XHRcdHBhZ2VvYmouc2V0QXBwZW5kVGV4dCgnXFxue3snLmNvbmNhdCgnc3Vic3Q6JywgYEZhbWVpdGVtfHRpdGxlPSR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfX19YCkpO1xuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShg5Yqg5YWlW1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWApO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouYXBwZW5kKCk7XG5cdFx0fSxcblx0XHRyZWRpcmVjdDogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRsZXQgcGFnZVRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRsZXQgdGFnUmU7XG5cdFx0XHRsZXQgdGFnVGV4dCA9ICcnO1xuXHRcdFx0bGV0IHN1bW1hcnlUZXh0ID0gJ+WKoOWFpSc7XG5cdFx0XHRjb25zdCB0YWdzID0gW107XG5cdFx0XHRsZXQgaTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBwYXJhbXMudGFncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR0YWdSZSA9IG5ldyBSZWdFeHAoYChcXFxce1xcXFx7JHtwYXJhbXMudGFnc1tpXX0oXFxcXHx8XFxcXH1cXFxcfSkpYCwgJ2ltJyk7XG5cdFx0XHRcdGlmICh0YWdSZS5leGVjKHBhZ2VUZXh0KSkge1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WcqOmHjeWumuWQkeS4iuaJvuWIsHt7JywgJ+WcqOmHjeaWsOWwjuWQkeS4iuaJvuWIsHt7JykgK1xuXHRcdFx0XHRcdFx0XHRwYXJhbXMudGFnc1tpXSArXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnfX3igKbigKbot7Pov4cnLCAnfX3igKbigKbot7PpgY4nKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFnc1t0YWdzLmxlbmd0aF0gPSBwYXJhbXMudGFnc1tpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gdXNlZCBpbiBBcnJheSNmb3JFYWNoXG5cdFx0XHRjb25zdCBhZGRUYWcgPSAodGFnTmFtZSwgdGFnSW5kZXgpID0+IHtcblx0XHRcdFx0dGFnVGV4dCArPSBgXFxue3ske3RhZ05hbWV9YDtcblx0XHRcdFx0aWYgKHRhZ05hbWUgPT09ICfpnZ7kuK3mlofph43lrprlkJEnKSB7XG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5hbHRMYW5nRnJvbSkge1xuXHRcdFx0XHRcdFx0dGFnVGV4dCArPSBgfDE9JHtwYXJhbXMuYWx0TGFuZ0Zyb219YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0KHRhZ05hbWUgPT09ICfmnaHnm67or7fmsYLph43lrprlkJEnIHx8IHRhZ05hbWUgPT09ICfmop3nm67oq4vmsYLph43lrprlkJEnKSAmJlxuXHRcdFx0XHRcdHBhcmFtcy5yZXFBcnRpY2xlTGFuZyAmJlxuXHRcdFx0XHRcdHBhcmFtcy5yZXFBcnRpY2xlVGl0bGVcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGFnVGV4dCArPSBgfDE9JHtwYXJhbXMucmVxQXJ0aWNsZUxhbmd9YDtcblx0XHRcdFx0XHR0YWdUZXh0ICs9IGB8Mj0ke3BhcmFtcy5yZXFBcnRpY2xlVGl0bGV9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWdUZXh0ICs9ICd9fSc7XG5cdFx0XHRcdGlmICh0YWdJbmRleCA+IDApIHtcblx0XHRcdFx0XHRpZiAodGFnSW5kZXggPT09IHRhZ3MubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0c3VtbWFyeVRleHQgKz0gJ+WSjCc7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0YWdJbmRleCA8IHRhZ3MubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0c3VtbWFyeVRleHQgKz0gJ+OAgSc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN1bW1hcnlUZXh0ICs9IGB7e1tbOiR7dGFnTmFtZS5pbmNsdWRlcygnOicpID8gdGFnTmFtZSA6IGBUZW1wbGF0ZToke3RhZ05hbWV9fCR7dGFnTmFtZX1gfV1dfX1gO1xuXHRcdFx0fTtcblx0XHRcdGlmICghdGFncy5sZW5ndGgpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmsqHmnInmoIfnrb7lj6/kvpvmoIforrAnLCAn5rKS5pyJ5qiZ57Gk5Y+v5L6b5qiZ6KiYJylcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRhZ3Muc29ydCgpO1xuXHRcdFx0Zm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuXHRcdFx0XHRhZGRUYWcodGFnKTtcblx0XHRcdH1cblx0XHRcdC8vIENoZWNrIGZvciBhbGwgUmNhdCBzaGVsbCByZWRpcmVjdHMgKGZyb20gIzQzMylcblx0XHRcdGlmIChwYWdlVGV4dC5tYXRjaCgve3soPzpyZWRyfHRoaXMgaXMgYSByZWRpcmVjdHxyKD86ZWRpcmVjdCk/KD86Lj9jYXQuKik/WyBfXT9zaCkvaSkpIHtcblx0XHRcdFx0Ly8gUmVnZXggaW5zcGlyZWQgYnkgW1tVc2VyOktlcGhpci9nYWRnZXRzL3NhZ2l0dGFyaXVzLmpzXV0gKFtbU3BlY2lhbDpQZXJtYUxpbmsvODMxNDAyODkzXV0pXG5cdFx0XHRcdGNvbnN0IG9sZFRhZ3MgPSBwYWdlVGV4dC5tYXRjaCgvKFxccyp7e1tBLVphLXpcXHNdK1xcfCg/OlxccyoxPSk/KSgoPzpbXnx7fV18e3tbXn1dK319KSspKH19KVxccyovaSk7XG5cdFx0XHRcdHBhZ2VUZXh0ID0gcGFnZVRleHQucmVwbGFjZShvbGRUYWdzWzBdLCBvbGRUYWdzWzFdICsgdGFnVGV4dCArIG9sZFRhZ3NbMl0gKyBvbGRUYWdzWzNdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEZvbGQgYW55IHByZS1leGlzdGluZyBSY2F0cyBpbnRvIHRhZ2xpc3QgYW5kIHVuZGVyIFJjYXRzaGVsbFxuXHRcdFx0XHRjb25zdCBwYWdlVGFncyA9IHBhZ2VUZXh0Lm1hdGNoKC9cXHMqe3suKz/ph43lrprlkJEuKj99fS9naW0pO1xuXHRcdFx0XHRsZXQgb2xkUGFnZVRhZ3MgPSAnJztcblx0XHRcdFx0aWYgKHBhZ2VUYWdzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgcGFnZVRhZyBvZiBwYWdlVGFncykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFnZVJlID0gbmV3IFJlZ0V4cChNb3JlYml0cy5zdHJpbmcuZXNjYXBlUmVnRXhwKHBhZ2VUYWcpLCAnaW1nJyk7XG5cdFx0XHRcdFx0XHRwYWdlVGV4dCA9IHBhZ2VUZXh0LnJlcGxhY2UocGFnZVJlLCAnJyk7XG5cdFx0XHRcdFx0XHRwYWdlVGFnID0gcGFnZVRhZy50cmltKCk7XG5cdFx0XHRcdFx0XHRvbGRQYWdlVGFncyArPSBgXFxuJHtwYWdlVGFnfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHBhZ2VUZXh0ICs9IGBcXG57e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfCR7dGFnVGV4dH0ke29sZFBhZ2VUYWdzfVxcbn19YDtcblx0XHRcdH1cblx0XHRcdHN1bW1hcnlUZXh0ICs9XG5cdFx0XHRcdCh0YWdzLmxlbmd0aCA+IDAgPyB3aW5kb3cud2dVTFMoJ+agh+iusCcsICfmqJnoqJgnKSA6ICd7e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfX0nKSArXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yiw6YeN5a6a5ZCRJywgJ+WIsOmHjeaWsOWwjuWQkScpO1xuXHRcdFx0Ly8gYXZvaWQgdHJ1bmNhdGVkIHN1bW1hcmllc1xuXHRcdFx0aWYgKHN1bW1hcnlUZXh0Lmxlbmd0aCA+IDQ5OSkge1xuXHRcdFx0XHRzdW1tYXJ5VGV4dCA9IHN1bW1hcnlUZXh0LnJlcGxhY2UoL1xcW1xcW1tefF0rXFx8KFteXFxdXSspXFxdXFxdL2csICckMScpO1xuXHRcdFx0fVxuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dChwYWdlVGV4dCk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnlUZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFRhZ2dlZFBhZ2VzJykpO1xuXHRcdFx0cGFnZW9iai5zZXRNaW5vckVkaXQoVHdpbmtsZS5nZXRQcmVmKCdtYXJrVGFnZ2VkUGFnZXNBc01pbm9yJykpO1xuXHRcdFx0cGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ25vY3JlYXRlJyk7XG5cdFx0XHRwYWdlb2JqLnNhdmUoKTtcblx0XHRcdGlmIChwYXJhbXMucGF0cm9sKSB7XG5cdFx0XHRcdHBhZ2VvYmoucGF0cm9sKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmaWxlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0bGV0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0bGV0IHN1bW1hcnkgPSAn5Yqg5YWlJztcblx0XHRcdC8vIEFkZCBtYWludGVuYW5jZSB0YWdzXG5cdFx0XHRpZiAocGFyYW1zLnRhZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdGxldCB0YWd0ZXh0ID0gJyc7XG5cdFx0XHRcdGxldCBjdXJyZW50VGFnO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBwYXJhbXMudGFncykge1xuXHRcdFx0XHRcdC8vIHdoZW4gb3RoZXIgY29tbW9ucy1yZWxhdGVkIHRhZ3MgYXJlIHBsYWNlZCwgcmVtb3ZlIFwibW92ZSB0byBTaGFyZVwiIHRhZ1xuXHRcdFx0XHRcdGlmIChbJ0tlZXAgbG9jYWwnLCAnTm93IFFpdXdlbiBTaGFyZScsICdEbyBub3QgbW92ZSB0byBRaXV3ZW4gU2hhcmUnXS5pbmNsdWRlcyh0YWcpKSB7XG5cdFx0XHRcdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHQve3sobXRjfChjb3B5IHxtb3ZlICk/dG8gP3NoYXJlfG1vdmUgdG8gcWl1d2VuIHNoYXJlfGNvcHkgdG8gcWl1d2VuIHNoYXJlKVtefV0qfX0vZ2ksXG5cdFx0XHRcdFx0XHRcdCcnXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGFnID09PSAnVmVjdG9yIHZlcnNpb24gYXZhaWxhYmxlJykge1xuXHRcdFx0XHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0L1xce1xceygoY29udmVydCB0byB8Y29udmVydHRvfHNob3VsZCBiZSB8c2hvdWxkYmV8dG8pP3N2Z3xiYWRwbmd8dmVjdG9yaXplKVtefV0qXFx9XFx9L2dpLFxuXHRcdFx0XHRcdFx0XHQnJ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y3VycmVudFRhZyA9IHRhZztcblx0XHRcdFx0XHRzd2l0Y2ggKHRhZykge1xuXHRcdFx0XHRcdFx0Y2FzZSAnTm93IENvbW1vbnMnOlxuXHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnID0gYHN1YnN0OiR7Y3VycmVudFRhZ31gOyAvLyBzdWJzdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLm5vd2NvbW1vbnNOYW1lICE9PSAnJykge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwxPSR7cGFyYW1zLm5vd2NvbW1vbnNOYW1lfWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdLZWVwIGxvY2FsJzpcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5rZWVwbG9jYWxOYW1lICE9PSAnJykge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwxPSR7cGFyYW1zLmtlZXBsb2NhbE5hbWV9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLmtlZXBsb2NhbFJlYXNvbiAhPT0gJycpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8cmVhc29uPSR7cGFyYW1zLmtlZXBsb2NhbFJlYXNvbn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnUmVuYW1lIG1lZGlhJzpcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5yZW5hbWVtZWRpYU5ld25hbWUgIT09ICcnKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDE9JHtwYXJhbXMucmVuYW1lbWVkaWFOZXduYW1lfWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5yZW5hbWVtZWRpYVJlYXNvbiAhPT0gJycpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8Mj0ke3BhcmFtcy5yZW5hbWVtZWRpYVJlYXNvbn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnVmVjdG9yIHZlcnNpb24gYXZhaWxhYmxlJzpcblx0XHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0XHRcdGNhc2UgJ09ic29sZXRlJzpcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDE9JHtwYXJhbXNbYCR7dGFnLnJlcGxhY2UoLyAvZywgJ18nKX1GaWxlYF19YDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdEbyBub3QgbW92ZSB0byBDb21tb25zJzpcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfHJlYXNvbj0ke3BhcmFtcy5Eb05vdE1vdmVUb0NvbW1vbnNfcmVhc29ufWA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnQ29weSB0byBXaWtpbWVkaWEgQ29tbW9ucyc6XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHxodW1hbj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX1gO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gZG9uJ3QgY2FyZVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGN1cnJlbnRUYWcgPSBge3ske2N1cnJlbnRUYWd9fX1cXG5gO1xuXHRcdFx0XHRcdHRhZ3RleHQgKz0gY3VycmVudFRhZztcblx0XHRcdFx0XHRzdW1tYXJ5ICs9IGB7eyR7dGFnfX1944CBYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXRhZ3RleHQpIHtcblx0XHRcdFx0XHRwYWdlb2JqXG5cdFx0XHRcdFx0XHQuZ2V0U3RhdHVzRWxlbWVudCgpXG5cdFx0XHRcdFx0XHQud2Fybih3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nO+8jOayoeS7gOS5iOimgeWBmueahCcsICfkvb/nlKjogIXlj5bmtojmk43kvZzvvIzmspLku4DpurzopoHlgZrnmoQnKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHQgPSB0YWd0ZXh0ICsgdGV4dDtcblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnkuc2xpY2UoMCwgTWF0aC5tYXgoMCwgc3VtbWFyeS5sZW5ndGggLSAxKSkpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoVGFnZ2VkUGFnZXMnKSk7XG5cdFx0XHRwYWdlb2JqLnNldE1pbm9yRWRpdChUd2lua2xlLmdldFByZWYoJ21hcmtUYWdnZWRQYWdlc0FzTWlub3InKSk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZSgpO1xuXHRcdFx0aWYgKHBhcmFtcy5wYXRyb2wpIHtcblx0XHRcdFx0cGFnZW9iai5wYXRyb2woKTtcblx0XHRcdH1cblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLnRhZy5jYWxsYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHBhcmFtcyA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZm9ybSk7XG5cdFx0Ly8gVmFsaWRhdGlvblxuXHRcdC8vIEdpdmVuIGFuIGFycmF5IG9mIGluY29tcGF0aWJsZSB0YWdzLCBjaGVjayBpZiB3ZSBoYXZlIHR3byBvciBtb3JlIHNlbGVjdGVkXG5cdFx0Y29uc3QgY2hlY2tJbmNvbXBhdGlibGUgPSAoY29uZmxpY3RzLCBleHRyYSkgPT4ge1xuXHRcdFx0Y29uc3QgY291bnQgPSBjb25mbGljdHMucmVkdWNlKChzdW0sIHRhZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gKHN1bSArPSBwYXJhbXMudGFncy5pbmNsdWRlcyh0YWcpKTtcblx0XHRcdH0sIDApO1xuXHRcdFx0aWYgKGNvdW50ID4gMSkge1xuXHRcdFx0XHRsZXQgbWVzc2FnZSA9IGAke3dpbmRvdy53Z1VMUygn6K+35Zyo5Lul5LiL5qCH562+5Lit5oup5LiA5L2/55SoJywgJ+iri+WcqOS7peS4i+aomeexpOS4reaTh+S4gOS9v+eUqCcpfe+8mnt7JHtjb25mbGljdHMuam9pbihcblx0XHRcdFx0XHQnfX3jgIF7eydcblx0XHRcdFx0KX19feOAgmA7XG5cdFx0XHRcdG1lc3NhZ2UgKz0gZXh0cmEgfHwgJyc7XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KG1lc3NhZ2UsIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAnZnJpZW5kbHl0YWcnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHQvLyBHaXZlbiBhIHRhZywgZW5zdXJlIGFuIGFzc29jaWF0ZSBwYXJhbWV0ZXIgaXMgcHJlc2VudFxuXHRcdC8vIE1heWJlIGp1c3Qgc29jayB0aGlzIGF3YXkgaW4gZWFjaCBmdW5jdGlvbj8/P1xuXHRcdGNvbnN0IGNoZWNrUGFyYW1ldGVyID0gKHRhZywgcGFyYW1ldGVyLCBkZXNjcmlwdGlvbiA9ICfnkIbnlLEnKSA9PiB7XG5cdFx0XHRpZiAocGFyYW1zLnRhZ3MuaW5jbHVkZXModGFnKSAmJiBwYXJhbXNbcGFyYW1ldGVyXS50cmltKCkgPT09ICcnKSB7XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KGAke3dpbmRvdy53Z1VMUygn5oKo5b+F6aG75oyH5a6aJywgJ+aCqOW/hemgiOaMh+WumicpfXt7JHt0YWd9fX3nmoQke2Rlc2NyaXB0aW9ufeOAgmAsIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAnZnJpZW5kbHl0YWcnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHQvLyBXZSBjb3VsZCB0aGVvcmV0aWNhbGx5IHB1dCB0aGVtIGFsbCBjaGVja0luY29tcGF0aWJsZSBjYWxscyBpbiBhXG5cdFx0Ly8gZm9yRWFjaCBsb29wLCBidXQgaXQncyBwcm9iYWJseSBjbGVhcmVyIG5vdCB0byBoYXZlIFtbYXJyYXkgb25lXSxcblx0XHQvLyBbYXJyYXkgdHdvXV0gZGV2b2lkIG9mIGNvbnRleHQuIExpa2V3aXNlLCBhbGwgdGhlIGNoZWNrUGFyYW1ldGVyXG5cdFx0Ly8gY2FsbHMgY291bGQgYmUgaW4gb25lIGlmLCBidXQgY291bGQgYmUgc2ltaWxhcmx5IGNvbmZ1c2luZy5cblx0XHRzd2l0Y2ggKFR3aW5rbGUudGFnLm1vZGVFbikge1xuXHRcdFx0Y2FzZSAnYXJ0aWNsZSc6XG5cdFx0XHRcdHBhcmFtcy50YWdzVG9SZW1vdmUgPSBmb3JtLmdldFVuY2hlY2tlZCgnZXhpc3RpbmdUYWdzJyk7IC8vIG5vdCBpbiBgaW5wdXRgXG5cdFx0XHRcdHBhcmFtcy50YWdzVG9SZW1haW4gPSBwYXJhbXMuZXhpc3RpbmdUYWdzIHx8IFtdOyAvLyBjb250YWluZXIgbm90IGNyZWF0ZWQgaWYgbm9uZSBwcmVzZW50XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRwYXJhbXMudGFncy5pbmNsdWRlcygnTWVyZ2UnKSB8fFxuXHRcdFx0XHRcdHBhcmFtcy50YWdzLmluY2x1ZGVzKCdNZXJnZSBmcm9tJykgfHxcblx0XHRcdFx0XHRwYXJhbXMudGFncy5pbmNsdWRlcygnTWVyZ2UgdG8nKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRjaGVja0luY29tcGF0aWJsZShcblx0XHRcdFx0XHRcdFx0WydNZXJnZScsICdNZXJnZSBmcm9tJywgJ01lcmdlIHRvJ10sXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6Iul6ZyA6KaB5aSa5qyh5ZCI5bm277yM6K+35L2/55Soe3tNZXJnZX195bm255So566h6YGT56ym5YiG6ZqU5p2h55uu5ZCN77yI5L2G5Zyo6L+Z56eN5oOF5b2i5LitVHdpbmtsZeS4jeiDveiHquWKqOagh+iusOWFtuS7luadoeebru+8ieOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+iLpemcgOimgeWkmuasoeWQiOS9te+8jOiri+S9v+eUqHt7TWVyZ2V9feS4pueUqOeuoemBk+espuWIhumalOaineebruWQje+8iOS9huWcqOmAmeeoruaDheW9ouS4rVR3aW5rbGXkuI3og73oh6rli5XmqJnoqJjlhbbku5bmop3nm67vvInjgIInXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFwYXJhbXMubWVyZ2VUYXJnZXQpIHtcblx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+ivt+aMh+WumuS9v+eUqOS6jm1lcmdl5qih5p2/5Lit55qE5Y+m5LiA5Liq6aG16Z2i5qCH6aKY44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn6KuL5oyH5a6a5L2/55So5pa8bWVyZ2XmqKHmnb/kuK3nmoTlj6bkuIDlgIvpoIHpnaLmqJnpoYzjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAnZnJpZW5kbHl0YWcnLFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKHBhcmFtcy5tZXJnZVRhZ090aGVyIHx8IHBhcmFtcy5tZXJnZVJlYXNvbikgJiYgcGFyYW1zLm1lcmdlVGFyZ2V0LmluY2x1ZGVzKCd8JykpIHtcblx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+W9k+WJjei/mOS4jeaUr+aMgeWcqOS4gOasoeWQiOW5tuS4reagh+iusOWkmuS4quadoeebru+8jOS4juW8gOWQr+WFs+S6juWkmuS4quadoeebrueahOiuqOiuuuOAguivt+S4jeimgeWLvumAieKAnOagh+iusOWFtuS7luadoeebruKAneW5tua4heepuuKAnOeQhueUseKAneahhuWQjuWGjeaPkOS6pOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+ebruWJjemChOS4jeaUr+aPtOWcqOS4gOasoeWQiOS9teS4reaomeiomOWkmuWAi+aineebru+8jOiIh+mWi+WVn+mXnOaWvOWkmuWAi+aineebrueahOiojuirluOAguiri+S4jeimgeWLvumBuOOAjOaomeiomOWFtuS7luaineebruOAjeS4pua4heepuuOAjOeQhueUseOAjeahhuW+jOWGjeaPkOS6pOOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHR0YWc6ICdmcmllbmRseXRhZycsXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRjaGVja1BhcmFtZXRlcihcblx0XHRcdFx0XHRcdCdNaXNzaW5nIGluZm9ybWF0aW9uJyxcblx0XHRcdFx0XHRcdCdtaXNzaW5nSW5mb3JtYXRpb24nLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfnvLrlsJHnmoTlhoXlrrknLCAn57y65bCR55qE5YWn5a65Jylcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY2hlY2tQYXJhbWV0ZXIoJ0V4cGVydCBuZWVkZWQnLCAnZXhwZXJ0Jywgd2luZG93LndnVUxTKCfkuJPlrrbpoobln58nLCAn5bCI5a626aCY5Z+fJykpKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZmlsZSc6XG5cdFx0XHRcdC8vIFNpbGx5IHRvIHByb3ZpZGUgdGhlIHNhbWUgc3RyaW5nIHRvIGVhY2ggb2YgdGhlc2Vcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGNoZWNrUGFyYW1ldGVyKCdPYnNvbGV0ZScsICdPYnNvbGV0ZUZpbGUnLCB3aW5kb3cud2dVTFMoJ+abv+aNoueahOaWh+S7tuWQjeensCcsICfmm7/mj5vnmoTmqpTmoYjlkI3nqLEnKSkgfHxcblx0XHRcdFx0XHRjaGVja1BhcmFtZXRlcihcblx0XHRcdFx0XHRcdCdWZWN0b3IgdmVyc2lvbiBhdmFpbGFibGUnLFxuXHRcdFx0XHRcdFx0J1ZlY3Rvcl92ZXJzaW9uX2F2YWlsYWJsZUZpbGUnLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmm7/mjaLnmoTmlofku7blkI3np7AnLCAn5pu/5o+b55qE5qqU5qGI5ZCN56ixJylcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY2hlY2tQYXJhbWV0ZXIoJ0RvIG5vdCBtb3ZlIHRvIENvbW1vbnMnLCAnRG9Ob3RNb3ZlVG9Db21tb25zX3JlYXNvbicpKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVkaXJlY3QnOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KGBUd2lua2xlLnRhZ++8muacquefpeaooeW8jyAke1R3aW5rbGUudGFnLm1vZGV9YCwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICdmcmllbmRseXRhZycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Ly8gRmlsZS9yZWRpcmVjdDogcmV0dXJuIGlmIG5vIHRhZ3Mgc2VsZWN0ZWRcblx0XHQvLyBBcnRpY2xlOiByZXR1cm4gaWYgbm8gdGFnIGlzIHNlbGVjdGVkIGFuZCBubyBhbHJlYWR5IHByZXNlbnQgdGFnIGlzIGRlc2VsZWN0ZWRcblx0XHRpZiAocGFyYW1zLnRhZ3MubGVuZ3RoID09PSAwICYmIChUd2lua2xlLnRhZy5tb2RlRW4gIT09ICdhcnRpY2xlJyB8fCBwYXJhbXMudGFnc1RvUmVtb3ZlLmxlbmd0aCA9PT0gMCkpIHtcblx0XHRcdHZvaWQgbXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5b+F6aG76YCJ5oup6Iez5bCR5LiA5Liq5qCH6K6w77yBJywgJ+W/hemgiOmBuOaTh+iHs+WwkeS4gOWAi+aomeiomO+8gScpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAnZnJpZW5kbHl0YWcnLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBNb3JlYml0cy5wYWdlTmFtZU5vcm07XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0J+agh+iusOWujOaIkO+8jOWwhuWcqOWHoOenkuWGheWIt+aWsOmhtemdoicsXG5cdFx0XHQn5qiZ6KiY5a6M5oiQ77yM5bCH5Zyo5bm+56eS5YWn6YeN5paw5pW055CG6aCB6Z2iJ1xuXHRcdCk7XG5cdFx0aWYgKFR3aW5rbGUudGFnLm1vZGVFbiA9PT0gJ3JlZGlyZWN0Jykge1xuXHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQuZm9sbG93UmVkaXJlY3QgPSBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0TW9yZWJpdHMucGFnZU5hbWVOb3JtLFxuXHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjmoIforrAnLCAn5q2j5Zyo5qiZ6KiYJykgKyBUd2lua2xlLnRhZy5tb2RlXG5cdFx0KTtcblx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUudGFnLmNhbGxiYWNrc1tUd2lua2xlLnRhZy5tb2RlRW5dKTtcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS50YWcsICd0YWcnKTtcbn0pKGpRdWVyeSk7XG5cbmV4cG9ydCB7fTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IHtnZW5lcmF0ZUFycmF5fSBmcm9tICdleHQuZ2FkZ2V0LlV0aWwnO1xuXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGVzdHViLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZXN0dWIoJCkge1xuXHQvKipcblx0ICogdHdpbmtsZXN0dWIuanM6IFRhZyBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiU3R1YlwiKVxuXHQgKiBBY3RpdmUgb246IEV4aXN0aW5nIGFydGljbGVzXG5cdCAqIENvbmZpZyBkaXJlY3RpdmVzIGluOiBGcmllbmRseUNvbmZpZ1xuXHQgKiBOb3RlOiBjdXN0b21pc2VkIGZyaWVuZGx5dGFnIG1vZHVsZVxuXHQgKi9cblx0VHdpbmtsZS5zdHViID0gKCkgPT4ge1xuXHRcdGlmIChNb3JlYml0cy5pc1BhZ2VSZWRpcmVjdCgpKSB7XG5cdFx0XHQvLyBTa2lwXG5cdFx0XHQvLyBhcnRpY2xlL2RyYWZ0IGFydGljbGUgdGFnZ2luZ1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQoWzAsIDExOF0uaW5jbHVkZXMobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSkgJiYgbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJykpIHx8XG5cdFx0XHRNb3JlYml0cy5wYWdlTmFtZU5vcm0gPT09IFR3aW5rbGUuZ2V0UHJlZignc2FuZGJveFBhZ2UnKVxuXHRcdCkge1xuXHRcdFx0VHdpbmtsZS5zdHViLm1vZGUgPSAn5p2h55uuJztcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoVHdpbmtsZS5zdHViLmNhbGxiYWNrLCAn5bCP5L2c5ZOBJywgJ2ZyaWVuZGx5LXRhZycsICfmoIforrDlsI/kvZzlk4EnKTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuc3R1Yi5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRpZiAoTW9yZWJpdHMuaXNQYWdlUmVkaXJlY3QoKSkge1xuXHRcdFx0Ly8gU2tpcFxuXHRcdFx0Ly8gYXJ0aWNsZS9kcmFmdCBhcnRpY2xlIHRhZ2dpbmdcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0KChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAwIHx8IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDExOCkgJiZcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJykpIHx8XG5cdFx0XHRNb3JlYml0cy5wYWdlTmFtZU5vcm0gPT09IFR3aW5rbGUuZ2V0UHJlZignc2FuZGJveFBhZ2UnKVxuXHRcdCkge1xuXHRcdFx0VHdpbmtsZS5zdHViLm1vZGUgPSB3aW5kb3cud2dVTFMoJ+adoeebricsICfmop3nm64nKTtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdFR3aW5rbGUuc3R1Yi5jYWxsYmFjayxcblx0XHRcdFx0J+Wwj+S9nOWTgScsXG5cdFx0XHRcdCdmcmllbmRseS10YWcnLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+agh+iusOWwj+S9nOWTgScsICfmqJnoqJjlsI/kvZzlk4EnKVxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuc3R1Yi5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYzMCwgVHdpbmtsZS5zdHViLm1vZGUgPT09ICdhcnRpY2xlJyA/IDQ1MCA6IDQwMCk7XG5cdFx0V2luZG93LnNldFNjcmlwdE5hbWUoJ1R3aW5rbGUnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+Wwj+S9nOWTgeiqquaYjicsICflsI/kvZzlk4Hor7TmmI4nKSwgJ1FXOuWwj+S9nOWTgScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5bCP5L2c5ZOB6K6+572uJywgJ+Wwj+S9nOWTgeioreWumicpLCAnSDpUVy9QUkVGI3N0dWInKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ1R3aW5rbGXluK7liqknLCAnVHdpbmtsZeiqquaYjicpLCAnSDpUVy9ET0Mjc3R1YicpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUuc3R1Yi5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYXRyb2xsaW5rJykubGVuZ3RoKSB7XG5cdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDpobXpnaLkuLrlt7Llt6Hmn6UnLCAn5qiZ6KiY6aCB6Z2i54K65bey5beh5p+lJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3BhdHJvbFBhZ2UnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ3BhdHJvbFBhZ2UnLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdtYXJrU3R1YmJlZFBhZ2VzQXNQYXRyb2xsZWQnKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHN3aXRjaCAoVHdpbmtsZS5zdHViLm1vZGUpIHtcblx0XHRcdGNhc2UgJ+aineebric6XG5cdFx0XHRjYXNlICfmnaHnm64nOlxuXHRcdFx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmnaHnm67lsI/kvZzlk4HmoIforrAnLCAn5qKd55uu5bCP5L2c5ZOB5qiZ6KiYJykpO1xuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NvcnRvcmRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5p+l55yL5YiX6KGo77yaJywgJ+aqouimluWIl+ihqO+8micpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XlnKhUd2lua2xl5Y+C5pWw6K6+572u77yISDpUVy9QUkVG77yJ5Lit5pu05pS55q2k6aG544CCJyxcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XlnKhUd2lua2xl5YGP5aW96Kit5a6a77yISDpUVy9QUkVG77yJ5Lit5pu05pS55q2k6aCF44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuc3R1Yi51cGRhdGVTb3J0T3JkZXIsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdjYXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmjInnsbvlnosnLCAn5oyJ6aGe5YilJyksXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiBUd2lua2xlLmdldFByZWYoJ3N0dWJBcnRpY2xlU29ydE9yZGVyJykgPT09ICdjYXQnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnYWxwaGEnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogJ+aMieWtl+avjScsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiBUd2lua2xlLmdldFByZWYoJ3N0dWJBcnRpY2xlU29ydE9yZGVyJykgPT09ICdhbHBoYScsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0YWdXb3JrQXJlYScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KGBUd2lua2xlLnN0dWLvvJrmnKrnn6XmqKHlvI8gJHtUd2lua2xlLnN0dWIubW9kZX1gLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVzdHViJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0XHRpZiAoWyfmnaHnm64nLCAn5qKd55uuJ10uaW5jbHVkZXMoVHdpbmtsZS5zdHViLm1vZGUpKSB7XG5cdFx0XHQvLyBmYWtlIGEgY2hhbmdlIGV2ZW50IG9uIHRoZSBzb3J0IGRyb3Bkb3duLCB0byBpbml0aWFsaXplIHRoZSB0YWcgbGlzdFxuXHRcdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRcdHJlc3VsdC5zb3J0b3JkZXIuZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5zdHViLmNoZWNrZWRUYWdzID0gW107XG5cdFR3aW5rbGUuc3R1Yi51cGRhdGVTb3J0T3JkZXIgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHNvcnRvcmRlciA9IGUudGFyZ2V0LnZhbHVlO1xuXHRcdFR3aW5rbGUuc3R1Yi5jaGVja2VkVGFncyA9IGUudGFyZ2V0LmZvcm0uZ2V0Q2hlY2tlZCgnYXJ0aWNsZVRhZ3MnKTtcblx0XHRpZiAoIVR3aW5rbGUuc3R1Yi5jaGVja2VkVGFncykge1xuXHRcdFx0VHdpbmtsZS5zdHViLmNoZWNrZWRUYWdzID0gW107XG5cdFx0fVxuXHRcdGNvbnN0IGNvbnRhaW5lciA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHR0eXBlOiAnZnJhZ21lbnQnLFxuXHRcdH0pO1xuXHRcdC8vIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgY2hlY2tib3gsIHdpdGggYXBwcm9wcmlhdGUgc3ViZ3JvdXAgaWYgbmVlZGVkXG5cdFx0Y29uc3QgbWFrZUNoZWNrYm94ID0gKHRhZywgZGVzY3JpcHRpb24pID0+IHtcblx0XHRcdGNvbnN0IGNoZWNrYm94ID0ge1xuXHRcdFx0XHR2YWx1ZTogdGFnLFxuXHRcdFx0XHRsYWJlbDogYHt7JHt0YWd9fX06ICR7ZGVzY3JpcHRpb259YCxcblx0XHRcdH07XG5cdFx0XHRpZiAoVHdpbmtsZS5zdHViLmNoZWNrZWRUYWdzLmluY2x1ZGVzKHRhZykpIHtcblx0XHRcdFx0Y2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY2hlY2tib3g7XG5cdFx0fTtcblx0XHQvLyBhcHBlbmQgYW55IGN1c3RvbSB0YWdzXG5cdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tU3R1Ykxpc3QnKS5sZW5ndGgpIHtcblx0XHRcdGNvbnRhaW5lci5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5qih5p2/JywgJ+iHquioguaooeadvycpLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjdXN0b21jaGVja2JveGVzID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21TdHViTGlzdCcpKSB7XG5cdFx0XHRcdGN1c3RvbWNoZWNrYm94ZXNbY3VzdG9tY2hlY2tib3hlcy5sZW5ndGhdID0gbWFrZUNoZWNrYm94KGl0ZW0udmFsdWUsIGl0ZW0ubGFiZWwpO1xuXHRcdFx0fVxuXHRcdFx0Y29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICdhcnRpY2xlVGFncycsXG5cdFx0XHRcdGxpc3Q6IGN1c3RvbWNoZWNrYm94ZXMsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gY2F0ZWdvcmljYWwgc29ydCBvcmRlclxuXHRcdGlmIChzb3J0b3JkZXIgPT09ICdjYXQnKSB7XG5cdFx0XHQvLyBmdW5jdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIHRhZ3MgYW5kIGNyZWF0ZSBhIGNoZWNrYm94IGZvciBlYWNoIG9uZVxuXHRcdFx0Y29uc3QgZG9DYXRlZ29yeUNoZWNrYm94ZXMgPSAoc3ViZGl2LCBhcnJheSkgPT4ge1xuXHRcdFx0XHRjb25zdCBjaGVja2JveGVzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIGFycmF5KSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVzY3JpcHRpb24gPSBUd2lua2xlLnN0dWIuYXJ0aWNsZS50YWdzW3RhZ107XG5cdFx0XHRcdFx0Y2hlY2tib3hlc1tjaGVja2JveGVzLmxlbmd0aF0gPSBtYWtlQ2hlY2tib3godGFnLCBkZXNjcmlwdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3ViZGl2LmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRuYW1lOiAnYXJ0aWNsZVRhZ3MnLFxuXHRcdFx0XHRcdGxpc3Q6IGNoZWNrYm94ZXMsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHRcdGxldCBpID0gMDtcblx0XHRcdC8vIGdvIHRocm91Z2ggZWFjaCBjYXRlZ29yeSBhbmQgc3ViLWNhdGVnb3J5IGFuZCBhcHBlbmQgbGlzdHMgb2YgY2hlY2tib3hlc1xuXHRcdFx0Zm9yIChjb25zdCBbdGl0bGUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKFR3aW5rbGUuc3R1Yi5hcnRpY2xlLnRhZ0NhdGVnb3JpZXMpKSB7XG5cdFx0XHRcdGNvbnN0IHRpdGxlTmFtZSA9IFR3aW5rbGUuc3R1Yi5hcnRpY2xlLnRhZ0NhdGVnb3JpZXNIZWFkZXJbdGl0bGVdO1xuXHRcdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRpZDogYHRhZ0hlYWRlciR7aX1gLFxuXHRcdFx0XHRcdGxhYmVsOiB0aXRsZU5hbWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBzdWJkaXYgPSBjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogYHRhZ1N1YmRpdiR7aSsrfWAsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkge1xuXHRcdFx0XHRcdGRvQ2F0ZWdvcnlDaGVja2JveGVzKHN1YmRpdiwgY29udGVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBbc3VidGl0bGUsIHN1YmNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRlbnQpKSB7XG5cdFx0XHRcdFx0XHRzdWJkaXYuYXBwZW5kKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBbTW9yZWJpdHMuaHRtbE5vZGUoJ2InLCBzdWJ0aXRsZSldLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRkb0NhdGVnb3J5Q2hlY2tib3hlcyhzdWJkaXYsIHN1YmNvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gYWxwaGFiZXRpY2FsIHNvcnQgb3JkZXJcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY2hlY2tib3hlcyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBbdGFnLCBkZXNjcmlwdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoVHdpbmtsZS5zdHViLmFydGljbGUudGFncykpIHtcblx0XHRcdFx0Y2hlY2tib3hlc1tjaGVja2JveGVzLmxlbmd0aF0gPSBtYWtlQ2hlY2tib3godGFnLCBkZXNjcmlwdGlvbik7XG5cdFx0XHR9XG5cdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ2FydGljbGVUYWdzJyxcblx0XHRcdFx0bGlzdDogY2hlY2tib3hlcyxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCAkd29ya2FyZWEgPSAkKGUudGFyZ2V0LmZvcm0pLmZpbmQoJ2RpdiN0YWdXb3JrQXJlYScpO1xuXHRcdGNvbnN0IHJlbmRlcmVkID0gY29udGFpbmVyLnJlbmRlcigpO1xuXHRcdCR3b3JrYXJlYS5lbXB0eSgpLmFwcGVuZChyZW5kZXJlZCk7XG5cdFx0Ly8gc3R5bGUgYWRqdXN0bWVudHNcblx0XHQkd29ya2FyZWEuZmluZCgnaDUnKS5jc3Moe1xuXHRcdFx0J2ZvbnQtc2l6ZSc6ICcxMTAlJyxcblx0XHR9KTtcblx0XHQkd29ya2FyZWEuZmluZCgnaDU6bm90KDpmaXJzdC1jaGlsZCknKS5jc3Moe1xuXHRcdFx0J21hcmdpbi10b3AnOiAnMWVtJyxcblx0XHR9KTtcblx0XHQkd29ya2FyZWEuZmluZCgnZGl2JykuZmlsdGVyKCc6aGFzKHNwYW4ucXVpY2tmb3JtRGVzY3JpcHRpb24pJykuY3NzKHtcblx0XHRcdCdtYXJnaW4tdG9wJzogJzAuNGVtJyxcblx0XHR9KTtcblx0XHQvLyBhZGQgYSBsaW5rIHRvIGVhY2ggdGVtcGxhdGUncyBkZXNjcmlwdGlvbiBwYWdlXG5cdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMoZS50YXJnZXQuZm9ybSwgJ2FydGljbGVUYWdzJykpIHtcblx0XHRcdGNvbnN0ICRjaGVja2JveCA9ICQoY2hlY2tib3gpO1xuXHRcdFx0Y29uc3QgbGluayA9IE1vcmViaXRzLmh0bWxOb2RlKCdhJywgJz4nKTtcblx0XHRcdGxpbmsuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0YWctdGVtcGxhdGUtbGluaycpO1xuXHRcdFx0bGluay5zZXRBdHRyaWJ1dGUoXG5cdFx0XHRcdCdocmVmJyxcblx0XHRcdFx0bXcudXRpbC5nZXRVcmwoYFRlbXBsYXRlOiR7TW9yZWJpdHMuc3RyaW5nLnRvVXBwZXJDYXNlRmlyc3RDaGFyKGNoZWNrYm94LnZhbHVlcyl9YClcblx0XHRcdCk7XG5cdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuXHRcdFx0bGluay5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdub29wZW5lciBub3JlZmVycmVyJyk7XG5cdFx0XHQkY2hlY2tib3gucGFyZW50KCkuYXBwZW5kKFsnXFx1MDBBMCcsIGxpbmtdKTtcblx0XHR9XG5cdH07XG5cdC8vIFRhZ3MgZm9yIEFSVElDTEVTIHN0YXJ0IGhlcmVcblx0VHdpbmtsZS5zdHViLmFydGljbGUgPSB7fTtcblx0Ly8gQSBsaXN0IG9mIGFsbCBhcnRpY2xlIHRhZ3MsIGluIGFscGhhYmV0aWNhbCBvcmRlclxuXHQvLyBUbyBlbnN1cmUgdGFncyBhcHBlYXIgaW4gdGhlIGRlZmF1bHQgXCJjYXRlZ29yaXplZFwiIHZpZXcsIGFkZCB0aGVtIHRvIHRoZSB0YWdDYXRlZ29yaWVzIGhhc2ggYmVsb3cuXG5cdFR3aW5rbGUuc3R1Yi5hcnRpY2xlLnRhZ3MgPSB7XG5cdFx0J2FjdG9yLXN0dWInOiAn5ryU5ZGYJyxcblx0XHQnYXNpYS1zdHViJzogJ+S6mua0sicsXG5cdFx0J2Jpby1zdHViJzogJ+S6uueJqScsXG5cdFx0J2Jpb2xvZ3ktc3R1Yic6ICfnlJ/nianlraYnLFxuXHRcdCdjaGVtLXN0dWInOiAn5YyW5a2mJyxcblx0XHQnZXVyb3BlLXN0dWInOiAn5qyn5rSyJyxcblx0XHQnZXhwYW5kIGxpc3QnOiAn5pyq5a6M5oiQ5YiX6KGoJyxcblx0XHQnZm9vZC1zdHViJzogJ+mjn+eJqScsXG5cdFx0J2ZyYW5jZS1nZW8tc3R1Yic6ICfms5Xlm73lnLDnkIYnLFxuXHRcdCdnZW8tc3R1Yic6ICflnLDnkIbkvY3nva4nLFxuXHRcdCdoaXN0LXN0dWInOiAn5Y6G5Y+y5oiW5Y6G5Y+y5a2mJyxcblx0XHQnSlAtc3R1Yic6ICfml6XmnKwnLFxuXHRcdCdsaXQtc3R1Yic6ICfmloflraYnLFxuXHRcdCdtYXRoLXN0dWInOiAn5pWw5a2mJyxcblx0XHQnbWVkLXN0dWInOiAn5Yy75a2mJyxcblx0XHQnbWlsLXN0dWInOiAn5Yab5LqLJyxcblx0XHQnbW92aWUtc3R1Yic6ICfnlLXlvbEnLFxuXHRcdCdtdXNpYy1zdHViJzogJ+mfs+S5kCcsXG5cdFx0J3BoeXNpY3Mtc3R1Yic6ICfniannkIblraYnLFxuXHRcdCdwb2xpdGljLXN0dWInOiAn5pS/5rK7Jyxcblx0XHQncmVsaWdpb24tc3R1Yic6ICflrpfmlZknLFxuXHRcdCdzY2llbmNlLXN0dWInOiAn56eR5a2mJyxcblx0XHQnc3BvcnQtc3R1Yic6ICfkvZPogrInLFxuXHRcdHN0dWI6ICfpgJrnlKjlsI/kvZzlk4EnLFxuXHRcdCdzd2l0emVybGFuZC1zdHViJzogJ+eRnuWjqycsXG5cdFx0J3RlY2gtc3R1Yic6ICfnp5HmioAnLFxuXHRcdCd0cmFuc3Atc3R1Yic6ICfkuqTpgJonLFxuXHRcdCdUVi1zdHViJzogJ+eUteinhicsXG5cdFx0J1VLLXN0dWInOiAn6Iux5Zu9Jyxcblx0XHQnVVMtYmlvLXN0dWInOiAn576O5Zu95Lq654mpJyxcblx0XHQnVVMtZ2VvLXN0dWInOiAn576O5Zu95Zyw55CGJyxcblx0XHQnVVMtc3R1Yic6ICfnvo7lm70nLFxuXHRcdCd3ZWF0aGVyLXN0dWInOiAn5aSp5rCU5ZKM54m55Yir55qE5aSp5rCU5LqL5Lu2Jyxcblx0fTtcblx0Ly8gQSBsaXN0IG9mIHRhZ3MgaW4gb3JkZXIgb2YgY2F0ZWdvcnlcblx0Ly8gVGFncyBzaG91bGQgYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHdpdGhpbiB0aGUgY2F0ZWdvcmllc1xuXHQvLyBBZGQgbmV3IGNhdGVnb3JpZXMgd2l0aCBkaXNjcmV0aW9uIC0gdGhlIGxpc3QgaXMgbG9uZyBlbm91Z2ggYXMgaXMhXG5cdFR3aW5rbGUuc3R1Yi5hcnRpY2xlLnRhZ0NhdGVnb3JpZXNIZWFkZXIgPSB7XG5cdFx0Z2VuZXJhbDogJ+mAmueUqOaooeadvycsXG5cdFx0Z2VvOiAn5Zu95a625ZKM5Zyw55CGJyxcblx0XHRvdGhlcnM6ICfmnYLpobknLFxuXHRcdGJpbzogJ+S6uueJqScsXG5cdFx0c2NpZW5jZTogJ+enkeWtpicsXG5cdFx0c3BvcnQ6ICfkvZPogrInLFxuXHRcdHRlY2g6ICfmioDmnK8nLFxuXHRcdGFydDogJ+iJuuacrycsXG5cdH07XG5cdFR3aW5rbGUuc3R1Yi5hcnRpY2xlLnRhZ0NhdGVnb3JpZXMgPSB7XG5cdFx0Z2VuZXJhbDogWydzdHViJywgJ2V4cGFuZCBsaXN0J10sXG5cdFx0Z2VvOiBbXG5cdFx0XHQnYXNpYS1zdHViJyxcblx0XHRcdCdldXJvcGUtc3R1YicsXG5cdFx0XHQnZnJhbmNlLWdlby1zdHViJyxcblx0XHRcdCdnZW8tc3R1YicsXG5cdFx0XHQnSlAtc3R1YicsXG5cdFx0XHQnc3dpdHplcmxhbmQtc3R1YicsXG5cdFx0XHQnVUstc3R1YicsXG5cdFx0XHQnVVMtYmlvLXN0dWInLFxuXHRcdFx0J1VTLWdlby1zdHViJyxcblx0XHRcdCdVUy1zdHViJyxcblx0XHRdLFxuXHRcdG90aGVyczogWydmb29kLXN0dWInLCAnaGlzdC1zdHViJywgJ21pbC1zdHViJywgJ3BvbGl0aWMtc3R1YicsICdyZWxpZ2lvbi1zdHViJywgJ3RyYW5zcC1zdHViJ10sXG5cdFx0YmlvOiBbJ2FjdG9yLXN0dWInLCAnYmlvLXN0dWInLCAnVVMtYmlvLXN0dWInXSxcblx0XHRzY2llbmNlOiBbJ2Jpb2xvZ3ktc3R1YicsICdjaGVtLXN0dWInLCAnbWF0aC1zdHViJywgJ21lZC1zdHViJywgJ3BoeXNpY3Mtc3R1YicsICdzY2llbmNlLXN0dWInLCAnd2VhdGhlci1zdHViJ10sXG5cdFx0c3BvcnQ6IFsnc3BvcnQtc3R1YiddLFxuXHRcdHRlY2g6IFsndGVjaC1zdHViJ10sXG5cdFx0YXJ0OiBbJ2FjdG9yLXN0dWInLCAnbGl0LXN0dWInLCAnbW92aWUtc3R1YicsICdtdXNpYy1zdHViJywgJ1RWLXN0dWInXSxcblx0fTtcblx0Ly8gVGFncyBmb3IgUkVESVJFQ1RTIHN0YXJ0IGhlcmVcblx0VHdpbmtsZS5zdHViLmNhbGxiYWNrcyA9IHtcblx0XHRtYWluOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGxldCB0YWdSZTtcblx0XHRcdGxldCBzdW1tYXJ5VGV4dCA9ICfliqDlhaUnO1xuXHRcdFx0bGV0IHRhZ3MgPSBbXTtcblx0XHRcdGNvbnN0IGdyb3VwYWJsZVRhZ3MgPSBbXTtcblx0XHRcdGxldCBpO1xuXHRcdFx0Ly8gUmVtb3ZlIHRhZ3MgdGhhdCBiZWNvbWUgc3VwZXJmbHVvdXMgd2l0aCB0aGlzIGFjdGlvblxuXHRcdFx0bGV0IHBhZ2VUZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIHByZWV4aXN0aW5nIHRhZ3MgYW5kIHNlcGFyYXRlIHRhZ3MgaW50byBncm91cGFibGUgYW5kIG5vbi1ncm91cGFibGUgYXJyYXlzXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLnRhZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dGFnUmUgPSBuZXcgUmVnRXhwKGAoXFxcXHtcXFxceyR7cGFyYW1zLnRhZ3NbaV19KFxcXFx8fFxcXFx9XFxcXH0pKWAsICdpbScpO1xuXHRcdFx0XHRpZiAodGFnUmUuZXhlYyhwYWdlVGV4dCkpIHtcblx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+h5oGvJywgJ+izh+ioiicpLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRg5Zyo6aG16Z2i5LiK5om+5Yiwe3ske3BhcmFtcy50YWdzW2ldfX194oCm4oCm6Lez6L+HYCxcblx0XHRcdFx0XHRcdFx0YOWcqOmggemdouS4iuaJvuWIsHt7JHtwYXJhbXMudGFnc1tpXX19feKApuKApui3s+mBjmBcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRhZ3MgPSBbLi4udGFncywgLi4uZ2VuZXJhdGVBcnJheShwYXJhbXMudGFnc1tpXSldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YWdzID0gWy4uLnRhZ3MsIC4uLmdyb3VwYWJsZVRhZ3NdO1xuXHRcdFx0dGFncy5zb3J0KCk7XG5cdFx0XHRjb25zdCB0b3RhbFRhZ3MgPSB0YWdzLmxlbmd0aDtcblx0XHRcdGNvbnN0IGFkZFRhZyA9ICh0YWdOYW1lLCB0YWdJbmRleCkgPT4ge1xuXHRcdFx0XHRwYWdlVGV4dCArPSBgXFxue3ske3RhZ05hbWV9fX1gO1xuXHRcdFx0XHRpZiAodGFnSW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0aWYgKHRhZ0luZGV4ID09PSB0b3RhbFRhZ3MgLSAxKSB7XG5cdFx0XHRcdFx0XHRzdW1tYXJ5VGV4dCArPSAn5ZKMJztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRhZ0luZGV4IDwgdG90YWxUYWdzIC0gMSkge1xuXHRcdFx0XHRcdFx0c3VtbWFyeVRleHQgKz0gJ+OAgSc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN1bW1hcnlUZXh0ICs9ICd7e1tbJztcblx0XHRcdFx0c3VtbWFyeVRleHQgKz0gdGFnTmFtZS5pbmNsdWRlcygnOicpID8gdGFnTmFtZSA6IGBUZW1wbGF0ZToke3RhZ05hbWV9fCR7dGFnTmFtZX1gO1xuXHRcdFx0XHRzdW1tYXJ5VGV4dCArPSAnXV19fSc7XG5cdFx0XHR9O1xuXHRcdFx0Zm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuXHRcdFx0XHRhZGRUYWcodGFnKTtcblx0XHRcdH1cblx0XHRcdHN1bW1hcnlUZXh0ICs9IHdpbmRvdy53Z1VMUygn5qCH6K6w5YiwJywgJ+aomeiomOWIsCcpICsgVHdpbmtsZS5zdHViLm1vZGU7XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHBhZ2VUZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoc3VtbWFyeVRleHQpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoU3R1YmJlZFBhZ2VzJykpO1xuXHRcdFx0cGFnZW9iai5zZXRNaW5vckVkaXQoVHdpbmtsZS5nZXRQcmVmKCdtYXJrU3R1YmJlZFBhZ2VzQXNNaW5vcicpKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdub2NyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5zYXZlKCk7XG5cdFx0XHRpZiAocGFyYW1zLnBhdHJvbCkge1xuXHRcdFx0XHRwYWdlb2JqLnBhdHJvbCgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuc3R1Yi5jYWxsYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHBhcmFtcyA9IHt9O1xuXHRcdGlmIChmb3JtLnBhdHJvbFBhZ2UpIHtcblx0XHRcdHBhcmFtcy5wYXRyb2wgPSBmb3JtLnBhdHJvbFBhZ2UuY2hlY2tlZDtcblx0XHR9XG5cdFx0c3dpdGNoIChUd2lua2xlLnN0dWIubW9kZSkge1xuXHRcdFx0Y2FzZSAn5qKd55uuJzpcblx0XHRcdGNhc2UgJ+adoeebric6XG5cdFx0XHRcdHBhcmFtcy50YWdzID0gZm9ybS5nZXRDaGVja2VkKCdhcnRpY2xlVGFncycpO1xuXHRcdFx0XHRwYXJhbXMuZ3JvdXAgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeShgVHdpbmtsZS5zdHVi77ya5pyq55+l5qih5byPICR7VHdpbmtsZS5zdHViLm1vZGV9YCwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3R1YicsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWYgKCFwYXJhbXMudGFncy5sZW5ndGgpIHtcblx0XHRcdHZvaWQgbXcubm90aWZ5KCflv4XpobvpgInmi6noh7PlsJHkuIDkuKrmoIforrDvvIEnLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZXN0dWInLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0J+agh+iusOWujOaIkO+8jOWwhuWcqOWHoOenkuWGheWIt+aWsOmhtemdoicsXG5cdFx0XHQn5qiZ6KiY5a6M5oiQ77yM5bCH5Zyo5bm+56eS5YWn6YeN5paw5pW055CG6aCB6Z2iJ1xuXHRcdCk7XG5cdFx0aWYgKFR3aW5rbGUuc3R1Yi5tb2RlID09PSAn6YeN5a6a5ZCRJykge1xuXHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQuZm9sbG93UmVkaXJlY3QgPSBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjmoIforrAnLCAn5q2j5Zyo5qiZ6KiYJykgKyBUd2lua2xlLnN0dWIubW9kZVxuXHRcdCk7XG5cdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0c3dpdGNoIChUd2lua2xlLnN0dWIubW9kZSkge1xuXHRcdFx0Y2FzZSAn5qKd55uuJzpcblx0XHRcdGNhc2UgJ+adoeebric6XG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICfph43lrprlkJEnOlxuXHRcdFx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUuc3R1Yi5jYWxsYmFja3MubWFpbik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdGNhc2UgJ+aWh+S7tic6XG5cdFx0XHRjYXNlICfmqpTmoYgnOlxuXHRcdFx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUuc3R1Yi5jYWxsYmFja3MuZmlsZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dm9pZCBtdy5ub3RpZnkoYFR3aW5rbGUuc3R1Yu+8muacquefpeaooeW8jyAke1R3aW5rbGUuc3R1Yi5tb2RlfWAsIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZXN0dWInLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLnN0dWIsICdzdHViJyk7XG59KShqUXVlcnkpO1xuXG5leHBvcnQge307XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWRpZmYuanMgKi9cbihmdW5jdGlvbiB0d2lua2xlZGlmZigkKSB7XG5cdC8qKlxuXHQgKiB0d2lua2xlZGlmZi5qczogRGlmZiBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgb24gbm9uLWRpZmYgcGFnZXMgKFwiTGFzdFwiKTtcblx0ICogdGFicyBvbiBkaWZmIHBhZ2VzIChcIlNpbmNlXCIsIFwiU2luY2UgbWluZVwiLCBcIkN1cnJlbnRcIilcblx0ICogQWN0aXZlIG9uOiBFeGlzdGluZyBub24tc3BlY2lhbCBwYWdlc1xuXHQgKi9cblx0VHdpbmtsZS5kaWZmID0gKCkgPT4ge1xuXHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpIDwgMCB8fCAhbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0bXcudXRpbC5nZXRVcmwobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLCB7XG5cdFx0XHRcdGRpZmY6ICdjdXInLFxuXHRcdFx0XHRvbGRpZDogJ3ByZXYnLFxuXHRcdFx0fSksXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+acgOWQjicsICfmnIDlvownKSxcblx0XHRcdCd0dy1sYXN0ZGlmZicsXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+aYvuekuuacgOWQjuS/ruaUuScsICfpoa/npLrmnIDlvozkv67mlLknKVxuXHRcdCk7XG5cdFx0Ly8gU2hvdyBhZGRpdGlvbmFsIHRhYnMgb25seSBvbiBkaWZmIHBhZ2VzXG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnRGlmZk5ld0lkJykpIHtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRUd2lua2xlLmRpZmYuZXZhbHVhdGUoZmFsc2UpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQn6Ieq5LiKJyxcblx0XHRcdFx0J3R3LXNpbmNlJyxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmmL7npLrkuI7kuIrkuIDkv67orqLniYjmnKzpl7TnmoTlt67lvIInLCAn6aGv56S66IiH5LiK5LiA5L+u6KiC54mI5pys6ZaT55qE5beu55WwJylcblx0XHRcdCk7XG5cdFx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0VHdpbmtsZS5kaWZmLmV2YWx1YXRlKHRydWUpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQn6Ieq5oiRJyxcblx0XHRcdFx0J3R3LXNpbmNlbWluZScsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5pi+56S65LiO5oiR5YGa5Ye655qE5L+u6K6i54mI5pys55qE5beu5byCJywgJ+mhr+ekuuiIh+aIkeWBmuWHuueahOS/ruiogueJiOacrOeahOW3rueVsCcpXG5cdFx0XHQpO1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFx0bXcudXRpbC5nZXRVcmwobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLCB7XG5cdFx0XHRcdFx0ZGlmZjogJ2N1cicsXG5cdFx0XHRcdFx0b2xkaWQ6IG13LmNvbmZpZy5nZXQoJ3dnRGlmZk5ld0lkJyksXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+W9k+WJjScsICfnm67liY0nKSxcblx0XHRcdFx0J3R3LWN1cmRpZmYnLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aYvuekuuS4juW9k+WJjeeJiOacrOmXtOeahOW3ruW8gicsICfpoa/npLroiIfnm67liY3niYjmnKzplpPnmoTlt67nlbAnKVxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuZGlmZi5ldmFsdWF0ZSA9IChtZSkgPT4ge1xuXHRcdGxldCB1c2VyO1xuXHRcdGlmIChtZSkge1xuXHRcdFx0dXNlciA9IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1kaWZmLW50aXRsZTInKTtcblx0XHRcdGlmICghbm9kZSkge1xuXHRcdFx0XHQvLyBub3RoaW5nIHRvIGRvP1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR1c2VyID0gJChub2RlKS5maW5kKCdhJykuZmlyc3QoKS50ZXh0KCk7XG5cdFx0fVxuXHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0cHJvcDogJ3JldmlzaW9ucycsXG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHR0aXRsZXM6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdHJ2bGltaXQ6IDEsXG5cdFx0XHRydnByb3A6IFsnaWRzJywgJ3VzZXInXSxcblx0XHRcdHJ2c3RhcnRpZDogbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJykgLSAxLFxuXHRcdFx0cnZ1c2VyOiB1c2VyLFxuXHRcdH07XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWNvbnRlbnQtdGV4dCcpKTtcblx0XHRjb25zdCBxaXV3ZW5fYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0d2luZG93LndnVUxTKCfmipPlj5bmnIDliJ3otKHnjK7ogIXkv6Hmga8nLCAn5oqT5Y+W5pyA5Yid6LKi54276ICF6LOH6KiKJyksXG5cdFx0XHRxdWVyeSxcblx0XHRcdFR3aW5rbGUuZGlmZi5jYWxsYmFja3MubWFpblxuXHRcdCk7XG5cdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSB7XG5cdFx0XHR1c2VyLFxuXHRcdH07XG5cdFx0cWl1d2VuX2FwaS5wb3N0KCk7XG5cdH07XG5cdFR3aW5rbGUuZGlmZi5jYWxsYmFja3MgPSB7XG5cdFx0bWFpbjogKHNlbGYpID0+IHtcblx0XHRcdGNvbnN0IHhtbERvYyA9IHNlbGYucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCByZXZpZCA9ICQoeG1sRG9jKS5maW5kKCdyZXYnKS5hdHRyKCdyZXZpZCcpO1xuXHRcdFx0aWYgKCFyZXZpZCkge1xuXHRcdFx0XHRzZWxmLnN0YXRlbGVtLmVycm9yKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyq5om+5Yiw5ZCI6YCC55qE5pep5pyf54mI5pys77yM5oiWICcsICfmnKrmib7liLDlkIjpgannmoTml6nmnJ/niYjmnKzvvIzmiJYgJykgK1xuXHRcdFx0XHRcdFx0c2VsZi5wYXJhbXMudXNlciArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJyDmmK/llK/kuIDotKHnjK7ogIXjgILlj5bmtojjgIInLCAnIOaYr+WUr+S4gOiyoueNu+iAheOAguWPlua2iOOAgicpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxvY2F0aW9uID0gbXcudXRpbC5nZXRVcmwobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLCB7XG5cdFx0XHRcdGRpZmY6IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpLFxuXHRcdFx0XHRvbGRpZDogcmV2aWQsXG5cdFx0XHR9KTtcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLmRpZmYsICdkaWZmJyk7XG59KShqUXVlcnkpO1xuXG5leHBvcnQge307XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZXVubGluay5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGV1bmxpbmsoJCkge1xuXHQvKipcblx0ICogdHdpbmtsZXVubGluay5qczogVW5saW5rIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJVbmxpbmtcIilcblx0ICogQWN0aXZlIG9uOiBOb24tc3BlY2lhbCBwYWdlcywgZXhjZXB0IFFpdXdlbjrmspnnm5Jcblx0ICovXG5cdFR3aW5rbGUudW5saW5rID0gKCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPCAwIHx8XG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgPT09IFR3aW5rbGUuZ2V0UHJlZignc2FuZGJveFBhZ2UnKSB8fFxuXHRcdFx0IU1vcmViaXRzLnVzZXJJc1N5c29wXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRUd2lua2xlLnVubGluay5jYWxsYmFjayxcblx0XHRcdHdpbmRvdy53Z1VMUygn5raI6ZO+JywgJ+a2iOmAoycpLFxuXHRcdFx0J3R3LXVubGluaycsXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WPlua2iOWIsOacrOmhteeahOmTvuaOpScsICflj5bmtojliLDmnKzpoIHnmoTpgKPntZAnKVxuXHRcdCk7XG5cdH07XG5cdC8vIHRoZSBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIGludm9raW5nIHVubGluayBmcm9tIGFkbWluIHNwZWVkeVxuXHRUd2lua2xlLnVubGluay5jYWxsYmFjayA9IChwcmVzZXRSZWFzb24pID0+IHtcblx0XHRjb25zdCBmaWxlU3BhY2UgPSBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSA2O1xuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjAwLCA0NDApO1xuXHRcdFdpbmRvdy5zZXRUaXRsZShcblx0XHRcdHdpbmRvdy53Z1VMUygn5Y+W5raI6ZO+5YWlJywgJ+WPlua2iOmAo+WFpScpICtcblx0XHRcdFx0KGZpbGVTcGFjZSA/IHdpbmRvdy53Z1VMUygn5ZKM5qih5p2/44CB5paH5Lu25L2/55SoJywgJ+WSjOaooeadv+OAgeaqlOahiOS9v+eUqCcpIDogJycpXG5cdFx0KTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn6ZO+5YWl6K6+572uJywgJ+mAo+WFpeioreWumicpLCAnSDpUVy9QUkVGI3VubGluaycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXL0RPQyN1bmxpbmsnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLnVubGluay5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Ly8gcHJlcGVuZCBzb21lIGRvY3VtZW50YXRpb246IGZpbGVzIGFyZSBjb21tZW50ZWQgb3V0LCB3aGlsZSBhbnlcblx0XHQvLyBkaXNwbGF5IHRleHQgaXMgcHJlc2VydmVkIGZvciBsaW5rcyAob3RoZXJ3aXNlIHRoZSBsaW5rIGl0c2VsZiBpcyB1c2VkKVxuXHRcdGNvbnN0IGxpbmtUZXh0QmVmb3JlID0gTW9yZWJpdHMuaHRtbE5vZGUoXG5cdFx0XHQnY29kZScsXG5cdFx0XHRgW1ske2ZpbGVTcGFjZSA/ICc6JyA6ICcnfSR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfSR7d2luZG93LndnVUxTKCd86ZO+5o6l5paH5a2XXV0nLCAnfOmAo+e1kOaWh+Wtl11dJyl9YFxuXHRcdCk7XG5cdFx0Y29uc3QgbGlua1RleHRBZnRlciA9IE1vcmViaXRzLmh0bWxOb2RlKCdjb2RlJywgd2luZG93LndnVUxTKCfpk77mjqXmloflrZcnLCAn6YCj57WQ5paH5a2XJykpO1xuXHRcdGNvbnN0IGxpbmtQbGFpbkJlZm9yZSA9IE1vcmViaXRzLmh0bWxOb2RlKCdjb2RlJywgYFtbJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV1gKTtcblx0XHRjb25zdCBsaW5rVGVtcGxhdGVCZWZvcmUgPSBNb3JlYml0cy5odG1sTm9kZSgnY29kZScsIGB7eyR7bXcuY29uZmlnLmdldCgnd2dUaXRsZScpfX19YCk7XG5cdFx0bGV0IGxpbmtQbGFpbkFmdGVyO1xuXHRcdGlmIChmaWxlU3BhY2UpIHtcblx0XHRcdGxpbmtQbGFpbkFmdGVyID0gTW9yZWJpdHMuaHRtbE5vZGUoJ2NvZGUnLCBgPCEtLSBbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dIC0tPmApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsaW5rUGxhaW5BZnRlciA9IE1vcmViaXRzLmh0bWxOb2RlKCdjb2RlJywgTW9yZWJpdHMucGFnZU5hbWVOb3JtKTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBub2RlIG9mIFtsaW5rVGV4dEJlZm9yZSwgbGlua1RleHRBZnRlciwgbGlua1BsYWluQmVmb3JlLCBsaW5rUGxhaW5BZnRlciwgbGlua1RlbXBsYXRlQmVmb3JlXSkge1xuXHRcdFx0bm9kZS5zdHlsZS5mb250RmFtaWx5ID0gJ21vbm9zcGFjZSc7XG5cdFx0XHRub2RlLnN0eWxlLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuXHRcdH1cblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdHN0eWxlOiAnbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQtc3R5bGU6IG5vcm1hbCcsXG5cdFx0XHRsYWJlbDogW1xuXHRcdFx0XHRgJHtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6L+Z5Liq5bel5YW35Y+v5Lul5Y+W5raI5omA5pyJ5oyH5ZCR6K+l6aG155qE6ZO+5o6l77yI4oCc6ZO+5YWl4oCd77yJJyxcblx0XHRcdFx0XHRcdCfpgJnlgIvlt6Xlhbflj6/ku6Xlj5bmtojmiYDmnInmjIflkJHoqbLpoIHnmoTpgKPntZDvvIjjgIzpgKPlhaXjgI3vvIknXG5cdFx0XHRcdFx0KSArXG5cdFx0XHRcdFx0KGZpbGVTcGFjZVxuXHRcdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J++8jOaIlumAmui/h+WKoOWFpTwhLS0gLS0+5rOo6YeK5qCH6K6w6ZqQ6JeP5omA5pyJ5a+55q2k5paH5Lu255qE5L2/55SoJyxcblx0XHRcdFx0XHRcdFx0XHQn77yM5oiW6YCP6YGO5Yqg5YWlPCEtLSAtLT7ms6jph4vmqJnoqJjpmrHol4/miYDmnInlsI3mraTmqpTmoYjnmoTkvb/nlKgnXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogJycpXG5cdFx0XHRcdH3jgILkvovlpoLvvJpgLFxuXHRcdFx0XHRsaW5rVGV4dEJlZm9yZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCflsIbkvJrlj5jmiJAnLCAn5bCH5pyD6K6K5oiQJyksXG5cdFx0XHRcdGxpbmtUZXh0QWZ0ZXIsXG5cdFx0XHRcdCfvvIwnLFxuXHRcdFx0XHRsaW5rUGxhaW5CZWZvcmUsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCG5Lya5Y+Y5oiQJywgJ+Wwh+acg+iuiuaIkCcpLFxuXHRcdFx0XHRsaW5rUGxhaW5BZnRlcixcblx0XHRcdFx0J++8jCcsXG5cdFx0XHRcdGxpbmtUZW1wbGF0ZUJlZm9yZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCflsIbkvJrooqvnp7vpmaQnLCAn5bCH5pyD6KKr56e76ZmkJyksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn44CC6K+35bCP5b+D5L2/55So44CCJywgJ+OAguiri+Wwj+W/g+S9v+eUqOOAgicpLFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHRsYWJlbDogJ+eQhueUse+8micsXG5cdFx0XHR2YWx1ZTogcHJlc2V0UmVhc29uIHx8ICcnLFxuXHRcdFx0c2l6ZTogNjAsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRsaXN0OiAnYmFja2xpbmtzJyxcblx0XHRcdGJsdGl0bGU6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdGJsbGltaXQ6ICdtYXgnLFxuXHRcdFx0Ly8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdGJsbmFtZXNwYWNlOiBUd2lua2xlLmdldFByZWYoJ3VubGlua05hbWVzcGFjZXMnKSxcblx0XHRcdHJhd2NvbnRpbnVlOiB0cnVlLFxuXHRcdFx0Zm9ybWF0OiAnanNvbicsXG5cdFx0fTtcblx0XHRpZiAoZmlsZVNwYWNlKSB7XG5cdFx0XHRxdWVyeS5saXN0ICs9ICd8aW1hZ2V1c2FnZSc7XG5cdFx0XHRxdWVyeS5pdXRpdGxlID0gcXVlcnkuYmx0aXRsZTtcblx0XHRcdHF1ZXJ5Lml1bGltaXQgPSBxdWVyeS5ibGxpbWl0O1xuXHRcdFx0cXVlcnkuaXVuYW1lc3BhY2UgPSBxdWVyeS5ibG5hbWVzcGFjZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cXVlcnkuYmxmaWx0ZXJyZWRpciA9ICdub25yZWRpcmVjdHMnO1xuXHRcdH1cblx0XHRjb25zdCBxaXV3ZW5fYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0d2luZG93LndnVUxTKCfmipPlj5bpk77lhaUnLCAn5oqT5Y+W6YCj5YWlJyksXG5cdFx0XHRxdWVyeSxcblx0XHRcdFR3aW5rbGUudW5saW5rLmNhbGxiYWNrcy5kaXNwbGF5LmJhY2tsaW5rc1xuXHRcdCk7XG5cdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSB7XG5cdFx0XHRmb3JtLFxuXHRcdFx0V2luZG93LFxuXHRcdFx0aW1hZ2U6IGZpbGVTcGFjZSxcblx0XHR9O1xuXHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHRcdGNvbnN0IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRyb290LnN0eWxlLnBhZGRpbmcgPSAnMTVweCc7IC8vIGp1c3Qgc28gaXQgZG9lc24ndCBsb29rIGJyb2tlblxuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KHJvb3QpO1xuXHRcdHFpdXdlbl9hcGkuc3RhdGVsZW0uc3RhdHVzKHdpbmRvdy53Z1VMUygn5Yqg6L295Lit4oCm4oCmJywgJ+i8ieWFpeS4reKApuKApicpKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyb290KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHR9O1xuXHRUd2lua2xlLnVubGluay5jYWxsYmFjay5ldmFsdWF0ZSA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IGZvcm0gPSBldmVudC50YXJnZXQ7XG5cdFx0Y29uc3QgaW5wdXQgPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0SW5wdXREYXRhKGZvcm0pO1xuXHRcdGlmICghaW5wdXQucmVhc29uKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+aCqOW/hemhu+aMh+WumuWPlua2iOmTvuWFpeeahOeQhueUseOAgicsICfmgqjlv4XpoIjmjIflrprlj5bmtojpgKPlhaXnmoTnkIbnlLHjgIInKSwge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3R3aW5rbGV1bmxpbmsnLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlucHV0LmJhY2tsaW5rcyB8fD0gW107XG5cdFx0aW5wdXQuaW1hZ2V1c2FnZSB8fD0gW107XG5cdFx0Y29uc3QgcGFnZXMgPSBNb3JlYml0cy5hcnJheS51bmlxKFsuLi5pbnB1dC5iYWNrbGlua3MsIC4uLmlucHV0LmltYWdldXNhZ2VdKTtcblx0XHRpZiAoIXBhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5oKo5b+F6aG76Iez5bCR6YCJ5oup5LiA5Liq6KaB5Y+W5raI6ZO+5YWl55qE6aG16Z2i44CCJywgJ+aCqOW/hemgiOiHs+WwkemBuOaTh+S4gOWAi+imgeWPlua2iOmAo+WFpeeahOmggemdouOAgicpLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGV1bmxpbmsnLFxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdGNvbnN0IHVubGlua2VyID0gbmV3IE1vcmViaXRzLmJhdGNoT3BlcmF0aW9uKFxuXHRcdFx0YOWPlua2iCR7XG5cdFx0XHRcdGlucHV0LmJhY2tsaW5rcy5sZW5ndGhcblx0XHRcdFx0XHQ/IHdpbmRvdy53Z1VMUygn6ZO+5YWlJywgJ+mAo+WFpScpICtcblx0XHRcdFx0XHRcdChpbnB1dC5pbWFnZXVzYWdlLmxlbmd0aCA/IHdpbmRvdy53Z1VMUygn5LiO5paH5Lu25L2/55SoJywgJ+iIh+aqlOahiOS9v+eUqCcpIDogJycpXG5cdFx0XHRcdFx0OiB3aW5kb3cud2dVTFMoJ+aWh+S7tuS9v+eUqCcsICfmqpTmoYjkvb/nlKgnKVxuXHRcdFx0fWBcblx0XHQpO1xuXHRcdHVubGlua2VyLnNldE9wdGlvbigncHJlc2VydmVJbmRpdmlkdWFsU3RhdHVzTGluZXMnLCB0cnVlKTtcblx0XHR1bmxpbmtlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0cmVhc29uOiBpbnB1dC5yZWFzb24sXG5cdFx0XHR1bmxpbmtlcixcblx0XHR9O1xuXHRcdHVubGlua2VyLnJ1bigocGFnZU5hbWUpID0+IHtcblx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0cGFnZU5hbWUsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5Zyo6aG16Z2i4oCcJywgJ+WcqOmggemdouOAjCcpICsgcGFnZU5hbWUgKyB3aW5kb3cud2dVTFMoJ+KAneS4reWPlua2iOmTvuWFpScsICfjgI3kuK3lj5bmtojpgKPlhaUnKVxuXHRcdFx0KTtcblx0XHRcdHFpdXdlbl9wYWdlLnNldEJvdEVkaXQodHJ1ZSk7IC8vIHVubGluayBjb25zaWRlcmVkIGEgZmxvb2R5IG9wZXJhdGlvblxuXHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHtcblx0XHRcdFx0ZG9CYWNrbGlua3M6IGlucHV0LmJhY2tsaW5rcy5pbmNsdWRlcyhwYWdlTmFtZSksXG5cdFx0XHRcdGRvSW1hZ2V1c2FnZTogaW5wdXQuaW1hZ2V1c2FnZS5pbmNsdWRlcyhwYWdlTmFtZSksXG5cdFx0XHRcdC4uLnBhcmFtcyxcblx0XHRcdH0pO1xuXHRcdFx0cWl1d2VuX3BhZ2UubG9hZChUd2lua2xlLnVubGluay5jYWxsYmFja3MudW5saW5rQmFja2xpbmtzKTtcblx0XHR9KTtcblx0fTtcblx0VHdpbmtsZS51bmxpbmsuY2FsbGJhY2tzID0ge1xuXHRcdGRpc3BsYXk6IHtcblx0XHRcdGJhY2tsaW5rczogKGFwaW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCByZXNwb25zZSA9IGFwaW9iai5nZXRSZXNwb25zZSgpO1xuXHRcdFx0XHRsZXQgaGF2ZWNvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0bGV0IGxpc3Q7XG5cdFx0XHRcdGxldCBuYW1lc3BhY2VzO1xuXHRcdFx0XHRsZXQgaTtcblx0XHRcdFx0aWYgKGFwaW9iai5wYXJhbXMuaW1hZ2UpIHtcblx0XHRcdFx0XHRjb25zdCBpbWFnZXVzYWdlID0gcmVzcG9uc2UucXVlcnkuaW1hZ2V1c2FnZS5zb3J0KFR3aW5rbGUuc29ydEJ5TmFtZXNwYWNlKTtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGltYWdldXNhZ2UubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0XHRcdC8vIExhYmVsIG1hZGUgYnkgVHdpbmtsZS5nZW5lcmF0ZUJhdGNoUGFnZUxpbmtzXG5cdFx0XHRcdFx0XHRsaXN0W2xpc3QubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogaW1hZ2V1c2FnZVtpXS50aXRsZSxcblx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsaXN0Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlofku7bkvb/nlKgnLCAn5qqU5qGI5L2/55SoJyksXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG5hbWVzcGFjZXMgPSBbXTtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgdiBvZiBUd2lua2xlLmdldFByZWYoJ3VubGlua05hbWVzcGFjZXMnKSkge1xuXHRcdFx0XHRcdFx0XHRuYW1lc3BhY2VzW25hbWVzcGFjZXMubGVuZ3RoXSA9XG5cdFx0XHRcdFx0XHRcdFx0diA9PT0gJzAnXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IHdpbmRvdy53Z1VMUygn77yI5p2h55uu77yJJywgJ++8iOaineebru+8iScpXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3ZdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflt7LpgInmi6nnmoTlkb3lkI3nqbrpl7TvvJonLCAn5bey6YG45pOH55qE5ZG95ZCN56m66ZaT77yaJykgKyBuYW1lc3BhY2VzLmpvaW4oJ+OAgScpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+aCqOWPr+WcqFR3aW5rbGXlj4LmlbDorr7nva7kuK3mm7TmlLnnm7jlhbPpgInpobnvvIzor7flj4Lop4FbW0g6VFcvUFJFRl1dJyxcblx0XHRcdFx0XHRcdFx0XHQn5oKo5Y+v5ZyoVHdpbmtsZeWBj+WlveioreWumuS4reabtOaUueebuOmXnOmBuOmghe+8jOiri+WPg+imi1tbSDpUVy9QUkVGXV0nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGlmIChyZXNwb25zZVsncXVlcnktY29udGludWUnXSAmJiByZXNwb25zZVsncXVlcnktY29udGludWUnXS5pbWFnZXVzYWdlKSB7XG5cdFx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOlxuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmmL7npLrliY0nLCAn6aGv56S65YmNJykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0bXcubGFuZ3VhZ2UuY29udmVydE51bWJlcihsaXN0Lmxlbmd0aCkgK1xuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkuKrmlofku7bkvb/nlKjjgIInLCAn5YCL5qqU5qGI5L2/55So44CCJyksXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhajpgIknLCAn5YWo6YG4JyksXG5cdFx0XHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdpbWFnZXVzYWdlJykpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhajkuI3pgIknLCAn5YWo5LiN6YG4JyksXG5cdFx0XHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdpbWFnZXVzYWdlJykpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiAnaW1hZ2V1c2FnZScsXG5cdFx0XHRcdFx0XHRcdHNoaWZ0Q2xpY2tTdXBwb3J0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRsaXN0LFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRoYXZlY29udGVudCA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pyq5om+5Yiw5paH5Lu25L2/55So44CCJywgJ+acquaJvuWIsOaqlOahiOS9v+eUqOOAgicpLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGJhY2tsaW5rcyA9IHJlc3BvbnNlLnF1ZXJ5LmJhY2tsaW5rcy5zb3J0KFR3aW5rbGUuc29ydEJ5TmFtZXNwYWNlKTtcblx0XHRcdFx0aWYgKGJhY2tsaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBiYWNrbGlua3MubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0XHRcdC8vIExhYmVsIG1hZGUgYnkgVHdpbmtsZS5nZW5lcmF0ZUJhdGNoUGFnZUxpbmtzXG5cdFx0XHRcdFx0XHRsaXN0W2xpc3QubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogYmFja2xpbmtzW2ldLnRpdGxlLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mTvuWFpScsICfpgKPlhaUnKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRuYW1lc3BhY2VzID0gW107XG5cdFx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIFR3aW5rbGUuZ2V0UHJlZigndW5saW5rTmFtZXNwYWNlcycpKSB7XG5cdFx0XHRcdFx0XHRuYW1lc3BhY2VzW25hbWVzcGFjZXMubGVuZ3RoXSA9XG5cdFx0XHRcdFx0XHRcdHYgPT09ICcwJ1xuXHRcdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCfvvIjmnaHnm67vvIknLCAn77yI5qKd55uu77yJJylcblx0XHRcdFx0XHRcdFx0XHQ6IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3ZdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLmZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bey6YCJ5oup55qE5ZG95ZCN56m66Ze077yaJywgJ+W3sumBuOaTh+eahOWRveWQjeepuumWk++8micpICsgbmFtZXNwYWNlcy5qb2luKCfjgIEnKSxcblx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+aCqOWPr+WcqFR3aW5rbGXlj4LmlbDorr7nva7kuK3mm7TmlLnnm7jlhbPpgInpobnvvIzor7flj4Lop4FbW0g6VFcvUFJFRl1dJyxcblx0XHRcdFx0XHRcdFx0J+aCqOWPr+WcqFR3aW5rbGXlgY/lpb3oqK3lrprkuK3mm7TmlLnnm7jpl5zpgbjpoIXvvIzoq4vlj4PopotbW0g6VFcvUFJFRl1dJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAocmVzcG9uc2VbJ3F1ZXJ5LWNvbnRpbnVlJ10gJiYgcmVzcG9uc2VbJ3F1ZXJ5LWNvbnRpbnVlJ10uYmFja2xpbmtzKSB7XG5cdFx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLmZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOlxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pi+56S65YmNJywgJ+mhr+ekuuWJjScpICtcblx0XHRcdFx0XHRcdFx0XHRtdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKGxpc3QubGVuZ3RoKSArXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkuKrpk77lhaXjgIInLCAn5YCL6YCj5YWl44CCJyksXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnYnV0dG9uJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WFqOmAiScsICflhajpgbgnKSxcblx0XHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHQkKE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhlLnRhcmdldC5mb3JtLCAnYmFja2xpbmtzJykpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnYnV0dG9uJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WFqOS4jemAiScsICflhajkuI3pgbgnKSxcblx0XHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHQkKE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhlLnRhcmdldC5mb3JtLCAnYmFja2xpbmtzJykpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICdiYWNrbGlua3MnLFxuXHRcdFx0XHRcdFx0c2hpZnRDbGlja1N1cHBvcnQ6IHRydWUsXG5cdFx0XHRcdFx0XHRsaXN0LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGhhdmVjb250ZW50ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLmZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pyq5om+5Yiw6ZO+5YWl44CCJywgJ+acquaJvuWIsOmAo+WFpeOAgicpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChoYXZlY29udGVudCkge1xuXHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXBpb2JqLnBhcmFtcy5mb3JtLnJlbmRlcigpO1xuXHRcdFx0XHRhcGlvYmoucGFyYW1zLldpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0XHRcdGZvciAoY29uc3QgbGluayBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocmVzdWx0LCAnYmFja2xpbmtzJykpIHtcblx0XHRcdFx0XHRUd2lua2xlLmdlbmVyYXRlQmF0Y2hQYWdlTGlua3MobGluayk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBsaW5rIG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhyZXN1bHQsICdpbWFnZXVzYWdlJykpIHtcblx0XHRcdFx0XHRUd2lua2xlLmdlbmVyYXRlQmF0Y2hQYWdlTGlua3MobGluayk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fSxcblx0XHR1bmxpbmtCYWNrbGlua3M6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRsZXQgb2xkdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpdGV4dC5wYWdlKG9sZHRleHQpO1xuXHRcdFx0bGV0IHN1bW1hcnlUZXh0ID0gJyc7XG5cdFx0XHRsZXQgd2FybmluZ1N0cmluZyA9IGZhbHNlO1xuXHRcdFx0bGV0IHRleHQ7XG5cdFx0XHQvLyByZW1vdmUgaW1hZ2UgdXNhZ2VzXG5cdFx0XHRpZiAocGFyYW1zLmRvSW1hZ2V1c2FnZSkge1xuXHRcdFx0XHR0ZXh0ID0gcWl1d2VuX3BhZ2UuY29tbWVudE91dEltYWdlKG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKSwgd2luZG93LndnVUxTKCfms6jph4onLCAn5rOo6YeLJykpLmdldFRleHQoKTtcblx0XHRcdFx0Ly8gZGlkIHdlIGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXM/XG5cdFx0XHRcdGlmICh0ZXh0ID09PSBvbGR0ZXh0KSB7XG5cdFx0XHRcdFx0d2FybmluZ1N0cmluZyA9IHdpbmRvdy53Z1VMUygn5paH5Lu25L2/55SoJywgJ+aqlOahiOS9v+eUqCcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN1bW1hcnlUZXh0ID0gd2luZG93LndnVUxTKCfms6jph4rmlofku7bkvb/nlKgnLCAn5rOo6YeL5qqU5qGI5L2/55SoJyk7XG5cdFx0XHRcdFx0b2xkdGV4dCA9IHRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIHJlbW92ZSBiYWNrbGlua3Ncblx0XHRcdGlmIChwYXJhbXMuZG9CYWNrbGlua3MpIHtcblx0XHRcdFx0dGV4dCA9IHFpdXdlbl9wYWdlLnJlbW92ZUxpbmsoTW9yZWJpdHMucGFnZU5hbWVOb3JtKS5nZXRUZXh0KCk7XG5cdFx0XHRcdHRleHQgPSBxaXV3ZW5fcGFnZS5yZW1vdmVUZW1wbGF0ZShtdy5jb25maWcuZ2V0KCd3Z1RpdGxlJykpLmdldFRleHQoKTtcblx0XHRcdFx0Ly8gZGlkIHdlIGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXM/XG5cdFx0XHRcdGlmICh0ZXh0ID09PSBvbGR0ZXh0KSB7XG5cdFx0XHRcdFx0d2FybmluZ1N0cmluZyA9IHdhcm5pbmdTdHJpbmdcblx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCflj5bmtojpk77lhaXmiJbmlofku7bkvb/nlKgnLCAn5Y+W5raI6YCj5YWl5oiW5qqU5qGI5L2/55SoJylcblx0XHRcdFx0XHRcdDogd2luZG93LndnVUxTKCflj5bmtojpk77lhaUnLCAn5Y+W5raI6YCj5YWlJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3VtbWFyeVRleHQgPSAoc3VtbWFyeVRleHQgPyBgJHtzdW1tYXJ5VGV4dH0gLyBgIDogJycpICsgd2luZG93LndnVUxTKCflj5bmtojpk77nu5PliLAnLCAn5Y+W5raI6YCj57WQ5YiwJyk7XG5cdFx0XHRcdFx0b2xkdGV4dCA9IHRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh3YXJuaW5nU3RyaW5nKSB7XG5cdFx0XHRcdC8vIG5vdGhpbmcgdG8gZG8hXG5cdFx0XHRcdHBhZ2VvYmpcblx0XHRcdFx0XHQuZ2V0U3RhdHVzRWxlbWVudCgpXG5cdFx0XHRcdFx0LmVycm9yKGAke3dpbmRvdy53Z1VMUygn5pyq6IO95Zyo6aG16Z2i5LiK5om+5YiwJywgJ+acquiDveWcqOmggemdouS4iuaJvuWIsCcpICsgd2FybmluZ1N0cmluZ33jgIJgKTtcblx0XHRcdFx0cGFyYW1zLnVubGlua2VyLndvcmtlckZhaWx1cmUocGFnZW9iaik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRzdW1tYXJ5VGV4dCArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfigJwnLCAn44CMJykgK1xuXHRcdFx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfigJ3vvJonLCAn44CN77yaJykgK1xuXHRcdFx0XHRcdHBhcmFtcy5yZWFzb25cblx0XHRcdCk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdub2NyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5zYXZlKHBhcmFtcy51bmxpbmtlci53b3JrZXJTdWNjZXNzLCBwYXJhbXMudW5saW5rZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS51bmxpbmssICd1bmxpbmsnKTtcbn0pKGpRdWVyeSk7XG5cbmV4cG9ydCB7fTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGVmbHVmZi5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVmbHVmZigkKSB7XG5cdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHQvKipcblx0ICogdHdpbmtsZWZsdWZmLmpzOiBSZXZlcnQvcm9sbGJhY2sgbW9kdWxlXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogTGlua3Mgb24gY29udHJpYnV0aW9ucyxcblx0ICogcmVjZW50IGNoYW5nZXMsIGhpc3RvcnksIGFuZCBkaWZmIHBhZ2VzXG5cdCAqIEFjdGl2ZSBvbjogRGlmZiBwYWdlcywgaGlzdG9yeSBwYWdlcyxcblx0ICogU3BlY2lhbDpSZWNlbnRDaGFuZ2VzKExpbmtlZCksIGFuZCBTcGVjaWFsOkNvbnRyaWJ1dGlvbnNcblx0ICovXG5cdC8qKlxuXHQgKiBUd2lua2xlZmx1ZmYgcmV2ZXJ0IGFuZCBhbnRpdmFuZGFsaXNtIHV0aWxpdHlcblx0ICovXG5cdFR3aW5rbGUuZmx1ZmYgPSAoKSA9PiB7XG5cdFx0Ly8gT25seSBwcm9jZWVkIGlmIHRoZSB1c2VyIGNhbiBhY3R1YWxseSBlZGl0IHRoZSBwYWdlIGluIHF1ZXN0aW9uLlxuXHRcdC8vIHdnSXNQcm9iYWJseUVkaXRhYmxlIHNob3VsZCB0YWtlXG5cdFx0Ly8gY2FyZSBvZiBuYW1lc3BhY2UvY29udGVudE1vZGVsIHJlc3RyaWN0aW9ucyBhcyB3ZWxsIGFzIGV4cGxpY2l0XG5cdFx0Ly8gcHJvdGVjdGlvbnM7IGl0IHdvbid0IHRha2UgY2FyZSBvZiBjYXNjYWRpbmcgb3IgVGl0bGVCbGFja2xpc3QuXG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnSXNQcm9iYWJseUVkaXRhYmxlJykpIHtcblx0XHRcdC8vIHdnRGlmZk9sZElkIGluY2x1ZGVkIGZvciBjbGFyaXR5IGluIGlmIGVsc2UgbG9vcFxuXHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnRGlmZk5ld0lkJykgfHwgbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSkge1xuXHRcdFx0XHQvLyBSZWxvYWQgYWxvbmdzaWRlIHRoZSByZXZpc2lvbiBzbGlkZXJcblx0XHRcdFx0bXcuaG9vaygnd2lraXBhZ2UuZGlmZicpLmFkZCgoKSA9PiB7XG5cdFx0XHRcdFx0VHdpbmtsZS5mbHVmZi5hZGRMaW5rcy5kaWZmKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ3ZpZXcnICYmXG5cdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUmV2aXNpb25JZCcpICYmXG5cdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpICE9PSBtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKVxuXHRcdFx0KSB7XG5cdFx0XHRcdFR3aW5rbGUuZmx1ZmYuYWRkTGlua3Mub2xkaWQoKTtcblx0XHRcdH0gZWxzZSBpZiAobXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ2hpc3RvcnknKSB7XG5cdFx0XHRcdFR3aW5rbGUuZmx1ZmYuYWRkTGlua3MuaGlzdG9yeSgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gLTEpIHtcblx0XHRcdFR3aW5rbGUuZmx1ZmYuc2tpcFRhbGsgPSAhVHdpbmtsZS5nZXRQcmVmKCdvcGVuVGFsa1BhZ2VPbkF1dG9SZXZlcnQnKTtcblx0XHRcdFR3aW5rbGUuZmx1ZmYucm9sbGJhY2tJblBsYWNlID0gVHdpbmtsZS5nZXRQcmVmKCdyb2xsYmFja0luUGxhY2UnKTtcblx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnQ29udHJpYnV0aW9ucycpIHtcblx0XHRcdFx0VHdpbmtsZS5mbHVmZi5hZGRMaW5rcy5jb250cmlidXRpb25zKCk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnUmVjZW50Y2hhbmdlcycgfHxcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ1JlY2VudGNoYW5nZXNsaW5rZWQnXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gUmVsb2FkIHdpdGggcmVjZW50IGNoYW5nZXMgdXBkYXRlc1xuXHRcdFx0XHQvLyBzdHJ1Y3R1cmVkQ2hhbmdlRmlsdGVycy51aS5pbml0aWFsaXplZCBpcyBqdXN0IG9uIGxvYWRcblx0XHRcdFx0bXcuaG9vaygnd2lraXBhZ2UuY29udGVudCcpLmFkZCgoaXRlbSkgPT4ge1xuXHRcdFx0XHRcdGlmIChpdGVtLmlzKCdkaXYnKSkge1xuXHRcdFx0XHRcdFx0VHdpbmtsZS5mbHVmZi5hZGRMaW5rcy5yZWNlbnRjaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdC8vIEEgbGlzdCBvZiB1c2VybmFtZXMsIHVzdWFsbHkgb25seSBib3RzLCB0aGF0IHZhbmRhbGlzbSByZXZlcnQgaXMganVtcGVkXG5cdC8vIG92ZXI7IHRoYXQgaXMsIGlmIHZhbmRhbGlzbSByZXZlcnQgd2FzIGNob3NlbiBvbiBzdWNoIHVzZXJuYW1lLCB0aGVuIGl0c1xuXHQvLyB0YXJnZXQgaXMgb24gdGhlIHJldmlzaW9uIGJlZm9yZS4gIFRoaXMgaXMgZm9yIGhhbmRsaW5nIHF1aWNrIGJvdHMgdGhhdFxuXHQvLyBtYWtlcyBlZGl0cyBzZWNvbmRzIGFmdGVyIHRoZSBvcmlnaW5hbCBlZGl0IGlzIG1hZGUuICBUaGlzIG9ubHkgYWZmZWN0c1xuXHQvLyB2YW5kYWxpc20gcm9sbGJhY2s7IGZvciBnb29kIGZhaXRoIHJvbGxiYWNrLCBpdCB3aWxsIHN0b3AsIGluZGljYXRpbmcgYSBib3Rcblx0Ly8gaGFzIG5vIGZhaXRoLCBhbmQgZm9yIG5vcm1hbCByb2xsYmFjaywgaXQgd2lsbCByb2xsYmFjayB0aGF0IGVkaXQuXG5cdFR3aW5rbGUuZmx1ZmYudHJ1c3RlZEJvdHMgPSBbXTtcblx0VHdpbmtsZS5mbHVmZi5za2lwVGFsayA9IG51bGw7XG5cdFR3aW5rbGUuZmx1ZmYucm9sbGJhY2tJblBsYWNlID0gbnVsbDtcblx0Ly8gU3RyaW5nIHRvIGluc2VydCB3aGVuIGEgdXNlcm5hbWUgaXMgaGlkZGVuXG5cdFR3aW5rbGUuZmx1ZmYuaGlkZGVuTmFtZSA9IHdpbmRvdy53Z1VMUygn5bey6ZqQ6JeP55qE55So5oi3JywgJ+W3sumaseiXj+eahOS9v+eUqOiAhScpO1xuXHQvLyBDb25zb2xpZGF0ZWQgY29uc3RydWN0aW9uIG9mIGZsdWZmIGxpbmtzXG5cdFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIgPSB7XG5cdFx0c3BhblRhZzogKGNvbG9yLCBjb250ZW50KSA9PiB7XG5cdFx0XHRjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0c3Bhbi5zdHlsZS5jb2xvciA9IGNvbG9yO1xuXHRcdFx0c3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSk7XG5cdFx0XHRyZXR1cm4gc3Bhbjtcblx0XHR9LFxuXHRcdGJ1aWxkTGluazogKGNvbG9yLCB0ZXh0KSA9PiB7XG5cdFx0XHRjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0bGluay5hcHBlbmRDaGlsZChUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyLnNwYW5UYWcoJ0JsYWNrJywgJ1snKSk7XG5cdFx0XHRsaW5rLmFwcGVuZENoaWxkKFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIuc3BhblRhZyhjb2xvciwgdGV4dCkpO1xuXHRcdFx0bGluay5hcHBlbmRDaGlsZChUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyLnNwYW5UYWcoJ0JsYWNrJywgJ10nKSk7XG5cdFx0XHRsaW5rLmhyZWYgPSAnIyc7XG5cdFx0XHRyZXR1cm4gbGluaztcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBbdmFuZGFsPW51bGxdIC0gVXNlcm5hbWUgb2YgdGhlIGVkaXRvciBiZWluZyByZXZlcnRlZFxuXHRcdCAqIFByb3ZpZGUgYSBmYWxzZXkgdmFsdWUgaWYgdGhlIHVzZXJuYW1lIGlzIGhpZGRlbiwgZGVmYXVsdHMgdG8gbnVsbFxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5saW5lIC0gVHJ1ZSB0byBjcmVhdGUgdHdvIGxpbmtzIGluIGEgc3BhbiwgZmFsc2Vcblx0XHQgKiB0byBjcmVhdGUgdGhyZWUgbGlua3MgaW4gYSBkaXYgKG9wdGlvbmFsKVxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW3Jldj13Z0N1clJldmlzaW9uSWRdIC0gUmV2aXNpb24gSUQgYmVpbmcgcmV2ZXJ0ZWQgKG9wdGlvbmFsKVxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBbcGFnZT13Z1BhZ2VOYW1lXSAtIFBhZ2UgYmVpbmcgcmV2ZXJ0ZWQgKG9wdGlvbmFsKVxuXHRcdCAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSByZXZOb2RlXG5cdFx0ICovXG5cdFx0cm9sbGJhY2tMaW5rczogKHZhbmRhbCwgaW5saW5lLCByZXYsIHBhZ2UpID0+IHtcblx0XHRcdHZhbmRhbCB8fD0gbnVsbDtcblx0XHRcdGNvbnN0IGVsZW0gPSBpbmxpbmUgPyAnc3BhbicgOiAnZGl2Jztcblx0XHRcdGNvbnN0IHJldk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW0pO1xuXHRcdFx0cmV2ID0gTnVtYmVyLnBhcnNlSW50KHJldiwgMTApO1xuXHRcdFx0aWYgKHJldikge1xuXHRcdFx0XHRyZXZOb2RlLnNldEF0dHJpYnV0ZSgnaWQnLCBgdHctcmV2ZXJ0JHtyZXZ9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXZOb2RlLnNldEF0dHJpYnV0ZSgnaWQnLCAndHctcmV2ZXJ0Jyk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBub3JtTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0cm9uZycpO1xuXHRcdFx0Y29uc3QgdmFuZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHJvbmcnKTtcblx0XHRcdGNvbnN0IG5vcm1MaW5rID0gVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5idWlsZExpbmsoJ1N0ZWVsQmx1ZScsICflm57pgIAnKTtcblx0XHRcdGNvbnN0IHZhbmRMaW5rID0gVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5idWlsZExpbmsoJ1JlZCcsIHdpbmRvdy53Z1VMUygn56C05Z2PJywgJ+egtOWjnicpKTtcblx0XHRcdCQobm9ybUxpbmspLm9uKCdjbGljaycsIChlKSA9PiB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0VHdpbmtsZS5mbHVmZi5yZXZlcnQoJ25vcm0nLCB2YW5kYWwsIHJldiwgcGFnZSk7XG5cdFx0XHRcdFR3aW5rbGUuZmx1ZmYuZGlzYWJsZUxpbmtzKHJldk5vZGUpO1xuXHRcdFx0fSk7XG5cdFx0XHQkKHZhbmRMaW5rKS5vbignY2xpY2snLCAoZSkgPT4ge1xuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFR3aW5rbGUuZmx1ZmYucmV2ZXJ0KCd2YW5kJywgdmFuZGFsLCByZXYsIHBhZ2UpO1xuXHRcdFx0XHRUd2lua2xlLmZsdWZmLmRpc2FibGVMaW5rcyhyZXZOb2RlKTtcblx0XHRcdH0pO1xuXHRcdFx0dmFuZE5vZGUuYXBwZW5kQ2hpbGQodmFuZExpbmspO1xuXHRcdFx0bm9ybU5vZGUuYXBwZW5kQ2hpbGQobm9ybUxpbmspO1xuXHRcdFx0Y29uc3Qgc2VwYXJhdG9yID0gaW5saW5lID8gJyAnIDogJyB8fCAnO1xuXHRcdFx0cmV2Tm9kZS5hcHBlbmRDaGlsZChub3JtTm9kZSk7XG5cdFx0XHRyZXZOb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlcGFyYXRvcikpO1xuXHRcdFx0cmV2Tm9kZS5hcHBlbmRDaGlsZCh2YW5kTm9kZSk7XG5cdFx0XHRyZXR1cm4gcmV2Tm9kZTtcblx0XHR9LFxuXHRcdC8vIEJ1aWxkIFtyZXN0b3JlIHRoaXMgcmV2aXNpb25dIGxpbmtzXG5cdFx0cmVzdG9yZVRoaXNSZXZpc2lvbkxpbms6IChyZXZpc2lvblJlZiwgaW5saW5lKSA9PiB7XG5cdFx0XHQvLyBJZiBub3QgYSBzcGVjaWZpYyByZXZpc2lvbiBudW1iZXIsIHNob3VsZCBiZSB3Z0RpZmZOZXdJZC93Z0RpZmZPbGRJZC93Z1JldmlzaW9uSWRcblx0XHRcdHJldmlzaW9uUmVmID0gdHlwZW9mIHJldmlzaW9uUmVmID09PSAnbnVtYmVyJyA/IHJldmlzaW9uUmVmIDogbXcuY29uZmlnLmdldChyZXZpc2lvblJlZik7XG5cdFx0XHRjb25zdCBlbGVtID0gaW5saW5lID8gJ3NwYW4nIDogJ2Rpdic7XG5cdFx0XHRjb25zdCByZXZlcnRUb1JldmlzaW9uTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbSk7XG5cdFx0XHRyZXZlcnRUb1JldmlzaW9uTm9kZS5zZXRBdHRyaWJ1dGUoJ2lkJywgYHR3LXJldmVydC10by0ke3JldmlzaW9uUmVmfWApO1xuXHRcdFx0cmV2ZXJ0VG9SZXZpc2lvbk5vZGUuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcblx0XHRcdGNvbnN0IHJldmVydFRvUmV2aXNpb25MaW5rID0gVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5idWlsZExpbmsoXG5cdFx0XHRcdCdTYWRkbGVCcm93bicsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5oGi5aSN5q2k54mI5pysJywgJ+aBouW+qeatpOeJiOacrCcpXG5cdFx0XHQpO1xuXHRcdFx0JChyZXZlcnRUb1JldmlzaW9uTGluaykub24oJ2NsaWNrJywgKGUpID0+IHtcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRUd2lua2xlLmZsdWZmLnJldmVydFRvUmV2aXNpb24ocmV2aXNpb25SZWYpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoaW5saW5lKSB7XG5cdFx0XHRcdHJldmVydFRvUmV2aXNpb25Ob2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJykpO1xuXHRcdFx0fVxuXHRcdFx0cmV2ZXJ0VG9SZXZpc2lvbk5vZGUuYXBwZW5kQ2hpbGQocmV2ZXJ0VG9SZXZpc2lvbkxpbmspO1xuXHRcdFx0cmV0dXJuIHJldmVydFRvUmV2aXNpb25Ob2RlO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuZmx1ZmYuYWRkTGlua3MgPSB7XG5cdFx0Y29udHJpYnV0aW9uczogKCkgPT4ge1xuXHRcdFx0Ly8gJCgnc3AtY29udHJpYnV0aW9ucy1mb290ZXItYW5vbi1yYW5nZScpIHJlbGllcyBvbiB0aGUgZm1ib3hcblx0XHRcdC8vIGlkIGluIFtbTWVkaWFXaWtpOlNwLWNvbnRyaWJ1dGlvbnMtZm9vdGVyLWFub24tcmFuZ2VdXSBhbmRcblx0XHRcdC8vIGlzIHVzZWQgdG8gc2hvdyByb2xsYmFjay92YW5kYWxpc20gbGlua3MgZm9yIElQIHJhbmdlc1xuXHRcdFx0Y29uc3QgaXNSYW5nZSA9ICEhJGJvZHkuZmluZCgnI3NwLWNvbnRyaWJ1dGlvbnMtZm9vdGVyLWFub24tcmFuZ2UnKVswXTtcblx0XHRcdGlmIChtdy5jb25maWcuZXhpc3RzKCd3Z1JlbGV2YW50VXNlck5hbWUnKSB8fCBpc1JhbmdlKSB7XG5cdFx0XHRcdC8vIEdldCB0aGUgdXNlcm5hbWUgdGhlc2UgY29udHJpYnV0aW9ucyBhcmUgZm9yXG5cdFx0XHRcdGxldCB1c2VybmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzaG93Um9sbGJhY2tMaW5rcycpLmluY2x1ZGVzKCdjb250cmlicycpIHx8XG5cdFx0XHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSAhPT0gdXNlcm5hbWUgJiZcblx0XHRcdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignc2hvd1JvbGxiYWNrTGlua3MnKS5pbmNsdWRlcygnb3RoZXJzJykpIHx8XG5cdFx0XHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSA9PT0gdXNlcm5hbWUgJiYgVHdpbmtsZS5nZXRQcmVmKCdzaG93Um9sbGJhY2tMaW5rcycpLmluY2x1ZGVzKCdtaW5lJykpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0ICRsaXN0ID0gJGJvZHlcblx0XHRcdFx0XHRcdC5maW5kKCcjbXctY29udGVudC10ZXh0Jylcblx0XHRcdFx0XHRcdC5maW5kKCd1bCBsaTpoYXMoc3Bhbi5tdy11Y3RvcCk6aGFzKC5tdy1jaGFuZ2VzbGlzdC1kaWZmKScpO1xuXHRcdFx0XHRcdCRsaXN0LmVhY2goKF9rZXksIGN1cnJlbnQpID0+IHtcblx0XHRcdFx0XHRcdC8vIHJldmlkIGlzIGFsc28gYXZhaWxhYmxlIGluIHRoZSBocmVmIG9mIGJvdGhcblx0XHRcdFx0XHRcdC8vIC5tdy1jaGFuZ2VzbGlzdC1kYXRlIG9yIC5tdy1jaGFuZ2VzbGlzdC1kaWZmXG5cdFx0XHRcdFx0XHRjb25zdCBwYWdlID0gJChjdXJyZW50KS5maW5kKCcubXctY29udHJpYnV0aW9ucy10aXRsZScpLnRleHQoKTtcblx0XHRcdFx0XHRcdC8vIEdldCB1c2VybmFtZSBmb3IgSVAgcmFuZ2VzICh3Z1JlbGV2YW50VXNlck5hbWUgaXMgbnVsbClcblx0XHRcdFx0XHRcdGlmIChpc1JhbmdlKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFRoZSA6bm90IGlzIHBvc3NpYmx5IHVubmVjZXNzYXJ5LCBhcyBpdCBhcHBlYXJzIHRoYXRcblx0XHRcdFx0XHRcdFx0Ly8gLm13LXVzZXJsaW5rIGlzIHNpbXBseSBub3QgcHJlc2VudCBpZiB0aGUgdXNlcm5hbWUgaXMgaGlkZGVuXG5cdFx0XHRcdFx0XHRcdHVzZXJuYW1lID0gJChjdXJyZW50KS5maW5kKCcubXctdXNlcmxpbms6bm90KC5oaXN0b3J5LWRlbGV0ZWQpJykudGV4dCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly8gSXQncyB1bmxpa2VseSwgYnV0IHdlIGNhbid0IGVhc2lseSBjaGVjayBmb3IgcmV2ZGVsJ2QgdXNlcm5hbWVzXG5cdFx0XHRcdFx0XHQvLyBzaW5jZSBvbmx5IGEgc3Ryb25nIGVsZW1lbnQgaXMgcHJvdmlkZWQsIHdpdGggbm8gZWFzeSBzZWxlY3RvclxuXHRcdFx0XHRcdFx0Y3VycmVudC5hcHBlbmRDaGlsZChcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5yb2xsYmFja0xpbmtzKHVzZXJuYW1lLCB0cnVlLCBjdXJyZW50LmRhdGFzZXQubXdSZXZpZCwgcGFnZSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlY2VudGNoYW5nZXM6ICgpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lJykgPT09ICdSZWNlbnRjaGFuZ2VzJyAmJlxuXHRcdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignc2hvd1JvbGxiYWNrTGlua3MnKS5pbmNsdWRlcygncmVjZW50Y2hhbmdlcycpKSB8fFxuXHRcdFx0XHQobXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ1JlY2VudGNoYW5nZXNsaW5rZWQnICYmXG5cdFx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzaG93Um9sbGJhY2tMaW5rcycpLmluY2x1ZGVzKCdyZWNlbnRjaGFuZ2VzbGlua2VkJykpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gTGF0ZXN0IGFuZCByZXZlcnRhYmxlIChub3QgcGFnZSBjcmVhdGlvbnMsIGxvZ3MsIGNhdGVnb3JpemF0aW9ucywgZXRjLilcblx0XHRcdFx0bGV0ICRsaXN0ID0gJGJvZHkuZmluZCgnLm13LWNoYW5nZXNsaXN0IC5tdy1jaGFuZ2VzbGlzdC1sYXN0Lm13LWNoYW5nZXNsaXN0LXNyYy1tdy1lZGl0Jyk7XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgdG9wLWxldmVsIGhlYWRlciBpZiBcImdyb3VwIGNoYW5nZXNcIiBwcmVmZXJlbmNlIGlzIHVzZWRcblx0XHRcdFx0Ly8gYW5kIGZpbmQgb25seSBpbmRpdmlkdWFsIGxpbmVzIG9yIG5lc3RlZCBsaW5lc1xuXHRcdFx0XHQkbGlzdCA9ICRsaXN0XG5cdFx0XHRcdFx0Lm5vdCgnLm13LXJjZmlsdGVycy11aS1oaWdobGlnaHRzLWVuaGFuY2VkLXRvcGxldmVsJylcblx0XHRcdFx0XHQuZmluZCgnLm13LWNoYW5nZXNsaXN0LWxpbmUtaW5uZXIsIHRkLm13LWVuaGFuY2VkLXJjLW5lc3RlZCcpO1xuXHRcdFx0XHQkbGlzdC5lYWNoKChfa2V5LCBjdXJyZW50KSA9PiB7XG5cdFx0XHRcdFx0Ly8gVGhlIDpub3QgaXMgcG9zc2libHkgdW5uZWNlc3NhcnksIGFzIGl0IGFwcGVhcnMgdGhhdFxuXHRcdFx0XHRcdC8vIC5tdy11c2VybGluayBpcyBzaW1wbHkgbm90IHByZXNlbnQgaWYgdGhlIHVzZXJuYW1lIGlzIGhpZGRlblxuXHRcdFx0XHRcdGNvbnN0IHZhbmRhbCA9ICQoY3VycmVudCkuZmluZCgnLm13LXVzZXJsaW5rOm5vdCguaGlzdG9yeS1kZWxldGVkKScpLnRleHQoKTtcblx0XHRcdFx0XHRjb25zdCBocmVmID0gJChjdXJyZW50KS5maW5kKCcubXctY2hhbmdlc2xpc3QtZGlmZicpLmF0dHIoJ2hyZWYnKTtcblx0XHRcdFx0XHRjb25zdCByZXYgPSBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2RpZmYnLCBocmVmKTtcblx0XHRcdFx0XHRjb25zdCBwYWdlID0gY3VycmVudC5kYXRhc2V0LnRhcmdldFBhZ2U7XG5cdFx0XHRcdFx0Y3VycmVudC5hcHBlbmRDaGlsZChUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyLnJvbGxiYWNrTGlua3ModmFuZGFsLCB0cnVlLCByZXYsIHBhZ2UpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoaXN0b3J5OiAoKSA9PiB7XG5cdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdzaG93Um9sbGJhY2tMaW5rcycpLmluY2x1ZGVzKCdoaXN0b3J5JykpIHtcblx0XHRcdFx0Ly8gQWxsIHJldnNcblx0XHRcdFx0Y29uc3QgaGlzdExpc3QgPSAkYm9keS5maW5kKCcjcGFnZWhpc3RvcnkgbGknKS50b0FycmF5KCk7XG5cdFx0XHRcdC8vIE9uIGZpcnN0IHBhZ2Ugb2YgcmVzdWx0cywgc28gYWRkIHJldmVydC9yb2xsYmFja1xuXHRcdFx0XHQvLyBsaW5rcyB0byB0aGUgdG9wIHJldmlzaW9uXG5cdFx0XHRcdGlmICghJGJvZHkuZmluZCgnYS5tdy1maXJzdGxpbmsnKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBmaXJzdCA9IGhpc3RMaXN0LnNoaWZ0KCk7XG5cdFx0XHRcdFx0Y29uc3QgdmFuZGFsID0gJChmaXJzdCkuZmluZCgnLm13LXVzZXJsaW5rOm5vdCguaGlzdG9yeS1kZWxldGVkKScpLnRleHQoKTtcblx0XHRcdFx0XHQvLyBDaGVjayBmb3IgZmlyc3QgdXNlcm5hbWUgZGlmZmVyZW50IHRoYW4gdGhlIHRvcCB1c2VyLFxuXHRcdFx0XHRcdC8vIG9ubHkgYXBwbHkgcm9sbGJhY2sgbGlua3MgaWYvd2hlbiBmb3VuZFxuXHRcdFx0XHRcdC8vIGZvciBmYXN0ZXIgdGhhbiBldmVyeVxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBoaXN0TGlzdCkge1xuXHRcdFx0XHRcdFx0aWYgKCQoaXRlbSkuZmluZCgnLm13LXVzZXJsaW5rJykudGV4dCgpICE9PSB2YW5kYWwpIHtcblx0XHRcdFx0XHRcdFx0Zmlyc3QuYXBwZW5kQ2hpbGQoVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5yb2xsYmFja0xpbmtzKHZhbmRhbCwgdHJ1ZSkpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gb2xkaWRcblx0XHRcdFx0Zm9yIChjb25zdCByZXYgb2YgaGlzdExpc3QpIHtcblx0XHRcdFx0XHQvLyBGcm9tIHJlc3RvcmVUaGlzUmV2aXNpb24sIG5vbi10cmFuc2ZlcmFibGVcblx0XHRcdFx0XHQvLyBJZiB0aGUgdGV4dCBoYXMgYmVlbiByZXZkZWwnZCwgaXQgZ2V0cyB3cmFwcGVkIGluIGEgc3BhbiB3aXRoIC5oaXN0b3J5LWRlbGV0ZWQsXG5cdFx0XHRcdFx0Ly8gYW5kIGhyZWYgd2lsbCBiZSB1bmRlZmluZWQgKGFuZCB0aHVzIG9sZGlkIGlzIE5hTilcblx0XHRcdFx0XHRjb25zdCB7aHJlZn0gPSByZXYucXVlcnlTZWxlY3RvcignLm13LWNoYW5nZXNsaXN0LWRhdGUnKTtcblx0XHRcdFx0XHRjb25zdCBvbGRpZCA9IE51bWJlci5wYXJzZUludChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ29sZGlkJywgaHJlZiksIDEwKTtcblx0XHRcdFx0XHRpZiAoIU51bWJlci5pc05hTihvbGRpZCkpIHtcblx0XHRcdFx0XHRcdHJldi5hcHBlbmRDaGlsZChUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyLnJlc3RvcmVUaGlzUmV2aXNpb25MaW5rKG9sZGlkLCB0cnVlKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkaWZmOiAoKSA9PiB7XG5cdFx0XHQvLyBBdXRvZmlsbCB1c2VyIHRhbGsgbGlua3Mgb24gZGlmZnMgd2l0aCB2YW5hcnRpY2xlIGZvciBlYXN5IHdhcm5pbmcsIGJ1dCBkb24ndCBhdXRvd2FyblxuXHRcdFx0Y29uc3Qgd2FybkZyb21UYWxrID0gKHh0aXRsZSkgPT4ge1xuXHRcdFx0XHRjb25zdCB0YWxrTGluayA9ICQoYCNtdy1kaWZmLSR7eHRpdGxlfTIgLm13LXVzZXJ0b29sbGlua3MgYWApLmZpcnN0KCk7XG5cdFx0XHRcdGlmICh0YWxrTGluay5sZW5ndGgpIHtcblx0XHRcdFx0XHRsZXQgZXh0cmFQYXJhbXMgPSBgdmFuYXJ0aWNsZT0ke213LnV0aWwucmF3dXJsZW5jb2RlKE1vcmViaXRzLnBhZ2VOYW1lTm9ybSl9Jm5vYXV0b3dhcm49dHJ1ZWA7XG5cdFx0XHRcdFx0Ly8gZGlmZklEcyBmb3IgdmFuYXJ0aWNsZXJldmlkXG5cdFx0XHRcdFx0ZXh0cmFQYXJhbXMgKz0gJyZ2YW5hcnRpY2xlcmV2aWQ9Jztcblx0XHRcdFx0XHRleHRyYVBhcmFtcyArPSB4dGl0bGUgPT09ICdvdGl0bGUnID8gbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSA6IG13LmNvbmZpZy5nZXQoJ3dnRGlmZk5ld0lkJyk7XG5cdFx0XHRcdFx0Y29uc3QgaHJlZiA9IHRhbGtMaW5rLmF0dHIoJ2hyZWYnKTtcblx0XHRcdFx0XHRpZiAoaHJlZi5pbmNsdWRlcygnPycpKSB7XG5cdFx0XHRcdFx0XHR0YWxrTGluay5hdHRyKCdocmVmJywgYCR7aHJlZn0mJHtleHRyYVBhcmFtc31gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGFsa0xpbmsuYXR0cignaHJlZicsIGAke2hyZWZ9PyR7ZXh0cmFQYXJhbXN9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Ly8gT2xkZXIgcmV2aXNpb25cblx0XHRcdHdhcm5Gcm9tVGFsaygnb3RpdGxlJyk7IC8vIEFkZCBxdWljay13YXJuIGxpbmsgdG8gdXNlciB0YWxrIGxpbmtcblx0XHRcdC8vIERvbid0IGxvYWQgaWYgdGhlcmUncyBhIHNpbmdsZSByZXZpc2lvbiBvciB3ZWlyZCBkaWZmIChjdXIgb24gbGF0ZXN0KVxuXHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJykgJiYgbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSAhPT0gbXcuY29uZmlnLmdldCgnd2dEaWZmTmV3SWQnKSkge1xuXHRcdFx0XHQvLyBBZGQgYSBbcmVzdG9yZSB0aGlzIHJldmlzaW9uXSBsaW5rIHRvIHRoZSBvbGRlciByZXZpc2lvblxuXHRcdFx0XHRjb25zdCBvbGRUaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1kaWZmLW90aXRsZTEnKS5wYXJlbnROb2RlO1xuXHRcdFx0XHRjb25zdCByZXZlcnRUb1JldmlzaW9uID0gVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5yZXN0b3JlVGhpc1JldmlzaW9uTGluaygnd2dEaWZmT2xkSWQnKTtcblx0XHRcdFx0b2xkVGl0bGUuaW5zZXJ0QmVmb3JlKHJldmVydFRvUmV2aXNpb24sIG9sZFRpdGxlLmZpcnN0Q2hpbGQpO1xuXHRcdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21SZXZlcnRTdW1tYXJ5JykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHJldmVydFRvUmV2aXNpb24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyB8fCAnKSk7XG5cdFx0XHRcdFx0Y29uc3QgcmV2ZXJ0c3VtbWFyeSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICdyZXZlcnRzdW1tYXJ5Jyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXZlcnRzdW1tYXJ5LmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAieaLqeWbnumAgOeQhueUsScsICfpgbjmk4flm57pgIDnkIbnlLEnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQkKFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tUmV2ZXJ0U3VtbWFyeScpKS5lYWNoKChfLCBlKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXZlcnRzdW1tYXJ5LmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogZS5sYWJlbCxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IGUudmFsdWUsXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXZlcnRUb1JldmlzaW9uLmFwcGVuZENoaWxkKHJldmVydHN1bW1hcnkucmVuZGVyKCkuY2hpbGROb2Rlc1swXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIE5ld2VyIHJldmlzaW9uXG5cdFx0XHR3YXJuRnJvbVRhbGsoJ250aXRsZScpOyAvLyBBZGQgcXVpY2std2FybiBsaW5rIHRvIHVzZXIgdGFsayBsaW5rXG5cdFx0XHQvLyBBZGQgZWl0aGVyIHJlc3RvcmUgb3Igcm9sbGJhY2sgbGlua3MgdG8gdGhlIG5ld2VyIHJldmlzaW9uXG5cdFx0XHQvLyBEb24ndCBzaG93IGlmIHRoZXJlJ3MgYSBzaW5nbGUgcmV2aXNpb24gb3Igd2VpcmQgZGlmZiAocHJldiBvbiBmaXJzdClcblx0XHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlmZmVyZW5jZXMtbmV4dGxpbmsnKSkge1xuXHRcdFx0XHQvLyBOb3QgbGF0ZXN0IHJldmlzaW9uLCBhZGQgW3Jlc3RvcmUgdGhpcyByZXZpc2lvbl0gbGluayB0byBuZXdlciByZXZpc2lvblxuXHRcdFx0XHRjb25zdCBuZXdUaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1kaWZmLW50aXRsZTEnKS5wYXJlbnROb2RlO1xuXHRcdFx0XHRuZXdUaXRsZS5pbnNlcnRCZWZvcmUoXG5cdFx0XHRcdFx0VHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5yZXN0b3JlVGhpc1JldmlzaW9uTGluaygnd2dEaWZmTmV3SWQnKSxcblx0XHRcdFx0XHRuZXdUaXRsZS5maXJzdENoaWxkXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3Nob3dSb2xsYmFja0xpbmtzJykuaW5jbHVkZXMoJ2RpZmYnKSAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0RpZmZPbGRJZCcpICYmXG5cdFx0XHRcdChtdy5jb25maWcuZ2V0KCd3Z0RpZmZPbGRJZCcpICE9PSBtdy5jb25maWcuZ2V0KCd3Z0RpZmZOZXdJZCcpIHx8XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RpZmZlcmVuY2VzLXByZXZsaW5rJykpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gTm9ybWFsbHkgLm13LXVzZXJsaW5rIGlzIGEgbGluaywgYnV0IGlmIHRoZVxuXHRcdFx0XHQvLyB1c2VybmFtZSBpcyBoaWRkZW4sIGl0IHdpbGwgYmUgYSBzcGFuIHdpdGhcblx0XHRcdFx0Ly8gLmhpc3RvcnktZGVsZXRlZCBhcyB3ZWxsLiBXaGVuIGEgc3lzb3Agdmlld3MgdGhlXG5cdFx0XHRcdC8vIGhpZGRlbiBjb250ZW50LCB0aGUgc3BhbiBjb250YWlucyB0aGUgdXNlcm5hbWUgaW4gYVxuXHRcdFx0XHQvLyBsaW5rIGVsZW1lbnQsIHdoaWNoIHdpbGwgKmp1c3QqIGhhdmVcblx0XHRcdFx0Ly8gLm13LXVzZXJsaW5rLiBUaGUgYmVsb3cgdGh1cyBmaW5kcyB0aGUgZmlyc3Rcblx0XHRcdFx0Ly8gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLCB3aGljaCBpZiBoaWRkZW4gaXMgdGhlIHNwYW5cblx0XHRcdFx0Ly8gYW5kIHRodXMgdGV4dCByZXR1cm5zIHVuZGVmaW5lZC4gVGVjaG5pY2FsbHksIHRoaXNcblx0XHRcdFx0Ly8gaXMgYSBwbGFjZSB3aGVyZSBzeXNvcHMgKmNvdWxkKiBoYXZlIG1vcmVcblx0XHRcdFx0Ly8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIHRoZW0gKGFzIGFib3ZlLCB2aWFcblx0XHRcdFx0Ly8gJnVuaGlkZT0xKSwgc2luY2UgdGhlIHVzZXJuYW1lIHdpbGwgYmUgYXZhaWxhYmxlIGJ5XG5cdFx0XHRcdC8vIGNoZWNraW5nIGEubXctdXNlcmxpbmsgaW5zdGVhZCwgYnV0IHJldmVydCgpIHdpbGxcblx0XHRcdFx0Ly8gbmVlZCByZXdvcmtpbmcgYXJvdW5kIHVzZXJIaWRkZW5cblx0XHRcdFx0Y29uc3QgdmFuZGFsID0gJGJvZHkuZmluZCgnI213LWRpZmYtbnRpdGxlMicpLmZpbmQoJy5tdy11c2VybGluaycpWzBdLnRleHQ7XG5cdFx0XHRcdGNvbnN0IG50aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1kaWZmLW50aXRsZTEnKS5wYXJlbnROb2RlO1xuXHRcdFx0XHRudGl0bGUuaW5zZXJ0QmVmb3JlKFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIucm9sbGJhY2tMaW5rcyh2YW5kYWwpLCBudGl0bGUuZmlyc3RDaGlsZCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbGRpZDogKCkgPT4ge1xuXHRcdFx0Ly8gQWRkIGEgW3Jlc3RvcmUgdGhpcyByZXZpc2lvbl0gbGluayBvbiBvbGQgcmV2aXNpb25zXG5cdFx0XHRjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1yZXZpc2lvbi1pbmZvJykucGFyZW50Tm9kZTtcblx0XHRcdHRpdGxlLmluc2VydEJlZm9yZShUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyLnJlc3RvcmVUaGlzUmV2aXNpb25MaW5rKCd3Z1JldmlzaW9uSWQnKSwgdGl0bGUuZmlyc3RDaGlsZCk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5mbHVmZi5kaXNhYmxlTGlua3MgPSAocGFyZW50Tm9kZSkgPT4ge1xuXHRcdC8vIEFycmF5LmZyb20gbm90IGF2YWlsYWJsZSBpbiBJRTExIDooXG5cdFx0JChwYXJlbnROb2RlKVxuXHRcdFx0LmNoaWxkcmVuKClcblx0XHRcdC5lYWNoKChfaSwgbm9kZSkgPT4ge1xuXHRcdFx0XHRub2RlLmlubmVySFRNTCA9IG5vZGUudGV4dENvbnRlbnQ7IC8vIEZlZWxzIGxpa2UgY2hlYXRpbmdcblx0XHRcdFx0JChub2RlKS5jc3MoJ2ZvbnQtd2VpZ2h0JywgJ25vcm1hbCcpLmNzcygnY29sb3InLCAnZGFya2dyYXknKTtcblx0XHRcdH0pO1xuXHR9O1xuXHRUd2lua2xlLmZsdWZmLnJldmVydCA9ICh0eXBlLCB2YW5kYWwsIHJldiwgcGFnZSkgPT4ge1xuXHRcdGlmIChtdy51dGlsLmlzSVB2NkFkZHJlc3ModmFuZGFsKSkge1xuXHRcdFx0dmFuZGFsID0gTW9yZWJpdHMuc2FuaXRpemVJUHY2KHZhbmRhbCk7XG5cdFx0fVxuXHRcdGNvbnN0IHBhZ2VuYW1lID0gcGFnZSB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0Y29uc3QgcmV2aWQgPSByZXYgfHwgbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyk7XG5cdFx0bGV0IHN1bW1hcnkgPSAnJztcblx0XHRpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ3JldmVydHN1bW1hcnknKVswXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzdW1tYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ3JldmVydHN1bW1hcnknKVswXS52YWx1ZTtcblx0XHR9XG5cdFx0aWYgKFR3aW5rbGUuZmx1ZmYucm9sbGJhY2tJblBsYWNlKSB7XG5cdFx0XHRjb25zdCBub3RpZnlTdGF0dXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeShub3RpZnlTdGF0dXMsIHtcblx0XHRcdFx0YXV0b0hpZGU6IGZhbHNlLFxuXHRcdFx0XHR0aXRsZTogYOWbnumAgCR7cGFnZX1gLFxuXHRcdFx0XHR0YWc6IGB0d2lua2xlZmx1ZmZfJHtyZXZ9YCwgLy8gU2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBnaXZlbiBkaXNhYmxlTGlua1xuXHRcdFx0fSk7XG5cblx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KG5vdGlmeVN0YXR1cyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1jb250ZW50LXRleHQnKSk7XG5cdFx0XHQkYm9keS5maW5kKCcjY2F0bGlua3MnKS5yZW1vdmUoKTtcblx0XHR9XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0dHlwZSxcblx0XHRcdHVzZXI6IHZhbmRhbCxcblx0XHRcdHVzZXJIaWRkZW46ICF2YW5kYWwsXG5cdFx0XHRwYWdlbmFtZSxcblx0XHRcdHJldmlkLFxuXHRcdFx0c3VtbWFyeSxcblx0XHR9O1xuXHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0cHJvcDogWydpbmZvJywgJ3JldmlzaW9ucyddLFxuXHRcdFx0dGl0bGVzOiBwYWdlbmFtZSxcblx0XHRcdGludGVzdGFjdGlvbnM6ICdlZGl0Jyxcblx0XHRcdHJ2bGltaXQ6IFR3aW5rbGUuZ2V0UHJlZigncmV2ZXJ0TWF4UmV2aXNpb25zJyksXG5cdFx0XHRydnByb3A6IFsnaWRzJywgJ3RpbWVzdGFtcCcsICd1c2VyJ10sXG5cdFx0XHRjdXJ0aW1lc3RhbXA6ICcnLFxuXHRcdFx0bWV0YTogJ3Rva2VucycsXG5cdFx0XHR0eXBlOiAnY3NyZicsXG5cdFx0fTtcblx0XHRjb25zdCBxaXV3ZW5fYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0d2luZG93LndnVUxTKCfmipPlj5bovoPml6nkv67orqLniYjmnKzkv6Hmga8nLCAn5oqT5Y+W6LyD5pep5L+u6KiC54mI5pys6LOH6KiKJyksXG5cdFx0XHRxdWVyeSxcblx0XHRcdFR3aW5rbGUuZmx1ZmYuY2FsbGJhY2tzLm1haW5cblx0XHQpO1xuXHRcdHFpdXdlbl9hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHR9O1xuXHRUd2lua2xlLmZsdWZmLnJldmVydFRvUmV2aXNpb24gPSAob2xkcmV2KSA9PiB7XG5cdFx0bGV0IHN1bW1hcnkgPSAnJztcblx0XHRpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ3JldmVydHN1bW1hcnknKVswXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzdW1tYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ3JldmVydHN1bW1hcnknKVswXS52YWx1ZTtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWNvbnRlbnQtdGV4dCcpKTtcblx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdHByb3A6IFsnaW5mbycsICdyZXZpc2lvbnMnXSxcblx0XHRcdHRpdGxlczogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0cnZsaW1pdDogMSxcblx0XHRcdHJ2c3RhcnRpZDogb2xkcmV2LFxuXHRcdFx0cnZwcm9wOiBbJ2lkcycsICd1c2VyJ10sXG5cdFx0XHRmb3JtYXQ6ICd4bWwnLFxuXHRcdFx0Y3VydGltZXN0YW1wOiAnJyxcblx0XHRcdG1ldGE6ICd0b2tlbnMnLFxuXHRcdFx0dHlwZTogJ2NzcmYnLFxuXHRcdH07XG5cdFx0Y29uc3QgcWl1d2VuX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdHdpbmRvdy53Z1VMUygn5oqT5Y+W6L6D5pep5L+u6K6i54mI5pys5L+h5oGvJywgJ+aKk+WPlui8g+aXqeS/ruiogueJiOacrOizh+ioiicpLFxuXHRcdFx0cXVlcnksXG5cdFx0XHRUd2lua2xlLmZsdWZmLmNhbGxiYWNrcy50b1JldmlzaW9uXG5cdFx0KTtcblx0XHRxaXV3ZW5fYXBpLnBhcmFtcyA9IHtcblx0XHRcdHJldjogb2xkcmV2LFxuXHRcdFx0c3VtbWFyeSxcblx0XHR9O1xuXHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHR9O1xuXHRUd2lua2xlLmZsdWZmLmNhbGxiYWNrcyA9IHtcblx0XHR0b1JldmlzaW9uOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWxEb2MgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCBsYXN0cmV2aWQgPSBOdW1iZXIucGFyc2VJbnQoJCh4bWxEb2MpLmZpbmQoJ3BhZ2UnKS5hdHRyKCdsYXN0cmV2aWQnKSwgMTApO1xuXHRcdFx0Y29uc3QgdG91Y2hlZCA9ICQoeG1sRG9jKS5maW5kKCdwYWdlJykuYXR0cigndG91Y2hlZCcpO1xuXHRcdFx0Y29uc3QgbG9hZHRpbWVzdGFtcCA9ICQoeG1sRG9jKS5maW5kKCdhcGknKS5hdHRyKCdjdXJ0aW1lc3RhbXAnKTtcblx0XHRcdGNvbnN0IGNzcmZ0b2tlbiA9ICQoeG1sRG9jKS5maW5kKCd0b2tlbnMnKS5hdHRyKCdjc3JmdG9rZW4nKTtcblx0XHRcdGNvbnN0IHJldmVydFRvUmV2SUQgPSBOdW1iZXIucGFyc2VJbnQoJCh4bWxEb2MpLmZpbmQoJ3JldicpLmF0dHIoJ3JldmlkJyksIDEwKTtcblx0XHRcdGNvbnN0IHJldmVydFRvVXNlciA9ICQoeG1sRG9jKS5maW5kKCdyZXYnKS5hdHRyKCd1c2VyJyk7XG5cdFx0XHRjb25zdCByZXZlcnRUb1VzZXJIaWRkZW4gPSB0eXBlb2YgJCh4bWxEb2MpLmZpbmQoJ3JldicpLmF0dHIoJ3VzZXJoaWRkZW4nKSA9PT0gJ3N0cmluZyc7XG5cdFx0XHRpZiAocmV2ZXJ0VG9SZXZJRCAhPT0gYXBpb2JqLnBhcmFtcy5yZXYpIHtcblx0XHRcdFx0YXBpb2JqLnN0YXRlbGVtLmVycm9yKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmipPlj5bliLDnmoTkv67orqLniYjmnKzkuI7or7fmsYLnmoTkv67orqLniYjmnKzkuI3nrKbvvIzlj5bmtojjgIInLFxuXHRcdFx0XHRcdFx0J+aKk+WPluWIsOeahOS/ruiogueJiOacrOiIh+iri+axgueahOS/ruiogueJiOacrOS4jeespu+8jOWPlua2iOOAgidcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9wdGlvbmFsX3N1bW1hcnkgPSBwcm9tcHQoXG5cdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn6K+36L6T5YWl5Zue6YCA55CG55Sx77yaJywgJ+iri+i8uOWFpeWbnumAgOeQhueUse+8micpfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCxcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy5zdW1tYXJ5XG5cdFx0XHQpOyAvLyBwYWRkZWQgb3V0IHRvIHdpZGVuIHByb21wdCBpbiBGaXJlZm94XG5cdFx0XHRpZiAob3B0aW9uYWxfc3VtbWFyeSA9PT0gbnVsbCkge1xuXHRcdFx0XHRhcGlvYmouc3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfnlLHnlKjmiLflj5bmtojjgIInLCAn55Sx5L2/55So6ICF5Y+W5raI44CCJykpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzdW1tYXJ5ID0gVHdpbmtsZS5mbHVmZi5mb3JtYXRTdW1tYXJ5KFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WbnumAgOWIsOeUsSRVU0VS5YGa5Ye655qE5L+u6K6i54mI5pysJywgJ+WbnumAgOWIsOeUsSRVU0VS5YGa5Ye655qE5L+u6KiC54mI5pysJykgKyByZXZlcnRUb1JldklELFxuXHRcdFx0XHRyZXZlcnRUb1VzZXJIaWRkZW4gPyBudWxsIDogcmV2ZXJ0VG9Vc2VyLFxuXHRcdFx0XHRvcHRpb25hbF9zdW1tYXJ5XG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRcdGFjdGlvbjogJ2VkaXQnLFxuXHRcdFx0XHR0aXRsZTogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRzdW1tYXJ5LFxuXHRcdFx0XHR0YWdzOiBUd2lua2xlLmNoYW5nZVRhZ3MsXG5cdFx0XHRcdHRva2VuOiBjc3JmdG9rZW4sXG5cdFx0XHRcdHVuZG86IGxhc3RyZXZpZCxcblx0XHRcdFx0dW5kb2FmdGVyOiByZXZlcnRUb1JldklELFxuXHRcdFx0XHRiYXNldGltZXN0YW1wOiB0b3VjaGVkLFxuXHRcdFx0XHRzdGFydHRpbWVzdGFtcDogbG9hZHRpbWVzdGFtcCxcblx0XHRcdFx0bWlub3I6IFR3aW5rbGUuZ2V0UHJlZignbWFya1JldmVydGVkUGFnZXNBc01pbm9yJykuaW5jbHVkZXMoJ3RvcmV2JykgPyB0cnVlIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRib3Q6IHRydWUsXG5cdFx0XHR9O1xuXHRcdFx0Ly8gSGFuZGxlIHdhdGNoaW5nLCBwb3NzaWJsZSBleHBpcnlcblx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ3dhdGNoUmV2ZXJ0ZWRQYWdlcycpLmluY2x1ZGVzKCd0b3JldicpKSB7XG5cdFx0XHRcdGNvbnN0IHdhdGNoT3JFeHBpcnkgPSBUd2lua2xlLmdldFByZWYoJ3dhdGNoUmV2ZXJ0ZWRFeHBpcnknKTtcblx0XHRcdFx0aWYgKCF3YXRjaE9yRXhwaXJ5IHx8IHdhdGNoT3JFeHBpcnkgPT09ICdubycpIHtcblx0XHRcdFx0XHRxdWVyeS53YXRjaGxpc3QgPSAnbm9jaGFuZ2UnO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHdhdGNoT3JFeHBpcnkgPT09ICdkZWZhdWx0JyB8fCB3YXRjaE9yRXhwaXJ5ID09PSAncHJlZmVyZW5jZXMnKSB7XG5cdFx0XHRcdFx0cXVlcnkud2F0Y2hsaXN0ID0gJ3ByZWZlcmVuY2VzJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWVyeS53YXRjaGxpc3QgPSAnd2F0Y2gnO1xuXHRcdFx0XHRcdC8vIG51bWJlciBhbGxvd2VkIGJ1dCBub3QgdXNlZCBpbiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtc1xuXHRcdFx0XHRcdGlmICh0eXBlb2Ygd2F0Y2hPckV4cGlyeSA9PT0gJ3N0cmluZycgJiYgd2F0Y2hPckV4cGlyeSAhPT0gJ3llcycpIHtcblx0XHRcdFx0XHRcdHF1ZXJ5LndhdGNobGlzdGV4cGlyeSA9IHdhdGNoT3JFeHBpcnk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9ICflm57pgIDlrozmiJAnO1xuXHRcdFx0Y29uc3QgcWl1d2VuX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0d2luZG93LndnVUxTKCfkv53lrZjlm57pgIDlhoXlrrknLCAn5YSy5a2Y5Zue6YCA5YWn5a65JyksXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRUd2lua2xlLmZsdWZmLmNhbGxiYWNrcy5jb21wbGV0ZSxcblx0XHRcdFx0YXBpb2JqLnN0YXRlbGVtXG5cdFx0XHQpO1xuXHRcdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSBhcGlvYmoucGFyYW1zO1xuXHRcdFx0cWl1d2VuX2FwaS5wb3N0KCk7XG5cdFx0fSxcblx0XHRtYWluOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWxEb2MgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRpZiAoJCh4bWxEb2MpLmZpbmQoJ2FjdGlvbnMnKS5hdHRyKCdlZGl0JykgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRhcGlvYmouc3RhdGVsZW0uZXJyb3IoXCJVbmFibGUgdG8gZWRpdCB0aGUgcGFnZSwgaXQncyBwcm9iYWJseSBwcm90ZWN0ZWQuXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBsYXN0cmV2aWQgPSBOdW1iZXIucGFyc2VJbnQoJCh4bWxEb2MpLmZpbmQoJ3BhZ2UnKS5hdHRyKCdsYXN0cmV2aWQnKSwgMTApO1xuXHRcdFx0Y29uc3QgdG91Y2hlZCA9ICQoeG1sRG9jKS5maW5kKCdwYWdlJykuYXR0cigndG91Y2hlZCcpO1xuXHRcdFx0Y29uc3QgbG9hZHRpbWVzdGFtcCA9ICQoeG1sRG9jKS5maW5kKCdhcGknKS5hdHRyKCdjdXJ0aW1lc3RhbXAnKTtcblx0XHRcdGNvbnN0IGNzcmZ0b2tlbiA9ICQoeG1sRG9jKS5maW5kKCd0b2tlbnMnKS5hdHRyKCdjc3JmdG9rZW4nKTtcblx0XHRcdGNvbnN0IHJldnMgPSAkKHhtbERvYykuZmluZCgncmV2Jyk7XG5cdFx0XHRjb25zdCB7c3RhdGVsZW19ID0gYXBpb2JqO1xuXHRcdFx0Y29uc3Qge3BhcmFtc30gPSBhcGlvYmo7XG5cdFx0XHRpZiAocmV2cy5sZW5ndGggPCAxKSB7XG5cdFx0XHRcdHN0YXRlbGVtLmVycm9yKHdpbmRvdy53Z1VMUygn5rKh5pyJ5YW25a6D5L+u6K6i54mI5pys77yM5peg5rOV5Zue6YCAJywgJ+aykuacieWFtuWug+S/ruiogueJiOacrO+8jOeEoeazleWbnumAgCcpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgW3RvcF0gPSByZXZzO1xuXHRcdFx0Y29uc3QgbGFzdHVzZXIgPSB0b3AuZ2V0QXR0cmlidXRlKCd1c2VyJyk7XG5cdFx0XHRpZiAobGFzdHJldmlkIDwgcGFyYW1zLnJldmlkKSB7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5lcnJvcihcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+mUmeivrycsICfpjK/oqqQnKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdCfku47mnI3liqHlmajojrflj5bnmoTmnIDmlrDkv67orqLniYjmnKxJRCAnLFxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHJldmlkKSxcblx0XHRcdFx0XHRcdFx0JyDlsI/kuo7nm67liY3miYDmmL7npLrnmoTkv67orqLniYjmnKxJROOAgui/meWPr+iDveaEj+WRs+edgOW9k+WJjeS/ruiuoueJiOacrOW3suiiq+WIoOmZpOOAgeacjeWKoeWZqOW7tui/n+OAgeaIluaKk+WPluWIsOS6huWdj+aOieeahOS/oeaBr+OAguWPlua2iOOAgicsXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHQn5b6e5Ly65pyN5Zmo5Y+W5b6X55qE5pyA5paw5L+u6KiC54mI5pysSUQgJyxcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIGxhc3RyZXZpZCksXG5cdFx0XHRcdFx0XHRcdCcg5bCP5pa855uu5YmN5omA6aGv56S655qE5L+u6KiC54mI5pysSUTjgILpgJnlj6/og73mhI/lkbPokZfnlbbliY3kv67oqILniYjmnKzlt7LooqvliKrpmaTjgIHkvLrmnI3lmajlu7bpgbLjgIHmiJbmk7flj5bliLDkuoblo57mjonnmoTos4foqIrjgILlj5bmtojjgIInLFxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVXNlZCBmb3IgdXNlci1mYWNpbmcgYWxlcnRzLCBtZXNzYWdlcywgZXRjLiwgbm90IGVkaXRzIG9yIHN1bW1hcmllc1xuXHRcdFx0bGV0IHVzZXJOb3JtID0gcGFyYW1zLnVzZXIgfHwgVHdpbmtsZS5mbHVmZi5oaWRkZW5OYW1lO1xuXHRcdFx0bGV0IGluZGV4ID0gMTtcblx0XHRcdGlmIChwYXJhbXMucmV2aWQgPT09IGxhc3RyZXZpZCkge1xuXHRcdFx0XHQvLyBFeHBlY3RlZCByZXZpc2lvbiBpcyB0aGUgc2FtZSwgc28gdGhlIHVzZXJzIG11c3QgbWF0Y2g7XG5cdFx0XHRcdC8vIHRoaXMgYWxsb3dzIHN5c29wcyB0byBrbm93IHdoZXRoZXIgdGhlIHVzZXJzIGFyZSB0aGUgc2FtZVxuXHRcdFx0XHRwYXJhbXMudXNlciA9IGxhc3R1c2VyO1xuXHRcdFx0XHR1c2VyTm9ybSA9IHBhcmFtcy51c2VyIHx8IFR3aW5rbGUuZmx1ZmYuaGlkZGVuTmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdCforablkYonLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0J+acgOaWsOS/ruiuoueJiOacrCAnLFxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHJldmlkKSxcblx0XHRcdFx0XHRcdFx0JyDkuI7miJHku6znmoTkv67orqLniYjmnKwgJyxcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHBhcmFtcy5yZXZpZCksXG5cdFx0XHRcdFx0XHRcdCfkuI3lkIwnLFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0J+acgOaWsOS/ruiogueJiOacrCAnLFxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHJldmlkKSxcblx0XHRcdFx0XHRcdFx0JyDoiIfmiJHlgJHnmoTkv67oqILniYjmnKwgJyxcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHBhcmFtcy5yZXZpZCksXG5cdFx0XHRcdFx0XHRcdCcg5LiN5ZCMJyxcblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChsYXN0dXNlciA9PT0gcGFyYW1zLnVzZXIpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG5cdFx0XHRcdFx0XHRjYXNlICd2YW5kJzpcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8od2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksIFtcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+acgOaWsOS/ruiuoueJiOacrOeUsSAnLCAn5pyA5paw5L+u6KiC54mI5pys55SxICcpLFxuXHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCB1c2VyTm9ybSksXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0JyDlgZrlh7rvvIzlm6DmiJHku6zlgYflrprnoLTlnY/vvIznu6fnu63lm57pgIDmk43kvZzjgIInLFxuXHRcdFx0XHRcdFx0XHRcdFx0JyDlgZrlh7rvvIzlm6DmiJHlgJHlgYflrprnoLTlo57vvIznubznuozlm57pgIDmk43kvZzjgIInXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oJ+aPkOekuicsIFtcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+acgOaWsOS/ruiuoueJiOacrOeUsSAnLCAn5pyA5paw5L+u6KiC54mI5pys55SxICcpLFxuXHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCB1c2VyTm9ybSksXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCcg5YGa5Ye677yM5L2G5oiR5Lus6L+Y5piv5LiN5Zue6YCA5LqG44CCJywgJyDlgZrlh7rvvIzkvYbmiJHlgJHpgoTmmK/kuI3lm57pgIDkuobjgIInKSxcblx0XHRcdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0cGFyYW1zLnR5cGUgPT09ICd2YW5kJyAmJiAvLyBPa2F5IHRvIHRlc3Qgb24gdXNlciBzaW5jZSBpdCB3aWxsIGVpdGhlciBmYWlsIG9yIHN5c29wIHdpbGwgY29ycmVjdGx5IGFjY2VzcyBpdFxuXHRcdFx0XHRcdC8vIEJlc2lkZXMsIG5vbmUgb2YgdGhlIHRydXN0ZWQgYm90cyBhcmUgZ29pbmcgdG8gYmUgcmV2ZGVsJ2Rcblx0XHRcdFx0XHRUd2lua2xlLmZsdWZmLnRydXN0ZWRCb3RzLmluY2x1ZGVzKHRvcC5nZXRBdHRyaWJ1dGUoJ3VzZXInKSkgJiZcblx0XHRcdFx0XHRyZXZzLmxlbmd0aCA+IDEgJiZcblx0XHRcdFx0XHRyZXZzWzFdLmdldEF0dHJpYnV0ZSgncmV2aWQnKSA9PT0gcGFyYW1zLnJldmlkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHQn5pyA5paw5L+u6K6i54mI5pys55SxICcsXG5cdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIGxhc3R1c2VyKSxcblx0XHRcdFx0XHRcdFx0XHQn77yM5LiA5Liq5Y+v5L+h55qE5py65Zmo5Lq65YGa5Ye677yM5L2G5LmL5YmN55qE54mI5pys6KKr6K6k5Li65piv56C05Z2P77yM57un57ut5Zue6YCA5pON5L2c44CCJyxcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdCfmnIDmlrDkv67oqILniYjmnKznlLEgJyxcblx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHVzZXIpLFxuXHRcdFx0XHRcdFx0XHRcdCfvvIzkuIDlgIvlj6/kv6HnmoTmqZ/lmajkurrlgZrlh7rvvIzkvYbkuYvliY3nmoTniYjmnKzooqvoqo3ngrrmmK/noLTlo57vvIznubznuozlm57pgIDmk43kvZzjgIInLFxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpbmRleCA9IDI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmVycm9yKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfplJnor68nLCAn6Yyv6KqkJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHQn5pyA5paw5L+u6K6i54mI5pys55SxICcsXG5cdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIGxhc3R1c2VyKSxcblx0XHRcdFx0XHRcdFx0XHQnIOWBmuWHuu+8jOaJgOS7pei/meS4quS/ruiuoueJiOacrOWPr+iDveW3sue7j+iiq+WbnumAgOS6hu+8jOWPlua2iOWbnumAgOaTjeS9nOOAgicsXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHQn5pyA5paw5L+u6KiC54mI5pys55SxICcsXG5cdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIGxhc3R1c2VyKSxcblx0XHRcdFx0XHRcdFx0XHQnIOWBmuWHuu+8jOaJgOS7pemAmeWAi+S/ruiogueJiOacrOWPr+iDveW3sue2k+iiq+WbnumAgOS6hu+8jOWPlua2iOWbnumAgOaTjeS9nOOAgicsXG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKFR3aW5rbGUuZmx1ZmYudHJ1c3RlZEJvdHMuaW5jbHVkZXMocGFyYW1zLnVzZXIpKSB7XG5cdFx0XHRcdHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcblx0XHRcdFx0XHRjYXNlICd2YW5kJzpcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKHdpbmRvdy53Z1VMUygn5L+h5oGvJywgJ+izh+ioiicpLCBbXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCG5a+5ICcsICflsIflsI0gJyksXG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCB1c2VyTm9ybSksXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQnIOaJp+ihjOegtOWdj+WbnumAgO+8jOi/meaYr+S4gOS4quWPr+S/oeeahOacuuWZqOS6uu+8jOaIkeS7rOWBh+WumuaCqOimgeWbnumAgOWJjeS4gOS4quS/ruiuoueJiOacrOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0JyDln7fooYznoLTlo57lm57pgIDvvIzpgJnmmK/kuIDlgIvlj6/kv6HnmoTmqZ/lmajkurrvvIzmiJHlgJHlgYflrprmgqjopoHlm57pgIDliY3kuIDlgIvkv67oqILniYjmnKzjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdGluZGV4ID0gMjtcblx0XHRcdFx0XHRcdHBhcmFtcy51c2VyID0gcmV2c1sxXS5nZXRBdHRyaWJ1dGUoJ3VzZXInKTtcblx0XHRcdFx0XHRcdHBhcmFtcy51c2VySGlkZGVuID0gcmV2c1sxXS5nZXRBdHRyaWJ1dGUoJ3VzZXJoaWRkZW4nKSA9PT0gJyc7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHQvKiBjYXNlICdub3JtJzogKi9cblx0XHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29udCA9IGNvbmZpcm0oXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6YCJ5oup5LqG5bi46KeE5Zue6YCA77yM5L2G5pyA5paw5L+u5pS55piv55Sx5LiA5Liq5Y+v5L+h55qE5py65Zmo5Lq677yIJyxcblx0XHRcdFx0XHRcdFx0XHQn6YG45pOH5LqG5bi46KaP5Zue6YCA77yM5L2G5pyA5paw5L+u5pS55piv55Sx5LiA5YCL5Y+v5L+h55qE5qmf5Zmo5Lq677yIJ1xuXHRcdFx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdFx0XHR1c2VyTm9ybSArXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J++8ieWBmuWHuueahOOAguehruWumuS7peWbnumAgOWJjeS4gOS4quS/ruiuoueJiOacrO+8jOWPlua2iOS7peWbnumAgOacuuWZqOS6uueahOS/ruaUuScsXG5cdFx0XHRcdFx0XHRcdFx0XHQn77yJ5YGa5Ye655qE44CC56K65a6a5Lul5Zue6YCA5YmN5LiA5YCL5L+u6KiC54mI5pys77yM5Y+W5raI5Lul5Zue6YCA5qmf5Zmo5Lq655qE5L+u5pS5J1xuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRpZiAoY29udCkge1xuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyh3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSwgW1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCG5a+5ICcsICflsIflsI0gJyksXG5cdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHVzZXJOb3JtKSxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQnIOaJp+ihjOW4uOinhOWbnumAgO+8jOi/meaYr+S4gOS4quWPr+S/oeeahOacuuWZqOS6uu+8jOWfuuS6juehruiupO+8jOaIkeS7rOWwhuWbnumAgOWJjeS4gOS4quS/ruiuoueJiOacrOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0XHQnIOWft+ihjOW4uOimj+WbnumAgO+8jOmAmeaYr+S4gOWAi+WPr+S/oeeahOapn+WZqOS6uu+8jOWfuuaWvOeiuuiqje+8jOaIkeWAkeWwh+WbnumAgOWJjeS4gOWAi+S/ruiogueJiOacrOOAgidcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdFx0aW5kZXggPSAyO1xuXHRcdFx0XHRcdFx0XHRwYXJhbXMudXNlciA9IHJldnNbMV0uZ2V0QXR0cmlidXRlKCd1c2VyJyk7XG5cdFx0XHRcdFx0XHRcdHBhcmFtcy51c2VySGlkZGVuID0gcmV2c1sxXS5nZXRBdHRyaWJ1dGUoJ3VzZXJoaWRkZW4nKSA9PT0gJyc7XG5cdFx0XHRcdFx0XHRcdHVzZXJOb3JtID0gcGFyYW1zLnVzZXIgfHwgVHdpbmtsZS5mbHVmZi5oaWRkZW5OYW1lO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oJ+aPkOekuicsIFtcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WwhuWvuSAnLCAn5bCH5bCNICcpLFxuXHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCB1c2VyTm9ybSksXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0JyDmiafooYzluLjop4Tlm57pgIDvvIzov5nmmK/kuIDkuKrlj6/kv6HnmoTmnLrlmajkurrvvIzln7rkuo7noa7orqTvvIzmiJHku6zku43lsIblm57pgIDov5nkuKrkv67orqLniYjmnKzjgIInLFxuXHRcdFx0XHRcdFx0XHRcdFx0JyDln7fooYzluLjopo/lm57pgIDvvIzpgJnmmK/kuIDlgIvlj6/kv6HnmoTmqZ/lmajkurrvvIzln7rmlrznorroqo3vvIzmiJHlgJHku43lsIflm57pgIDpgJnlgIvkv67oqILniYjmnKzjgIInXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0bGV0IGNvdW50ID0gMDtcblx0XHRcdGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHJldnMubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0Kytjb3VudDtcblx0XHRcdFx0aWYgKHJldnNbaV0uZ2V0QXR0cmlidXRlKCd1c2VyJykgIT09IHBhcmFtcy51c2VyKSB7XG5cdFx0XHRcdFx0Zm91bmQgPSBpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZvdW5kKSB7XG5cdFx0XHRcdHN0YXRlbGVtLmVycm9yKFtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+acquaJvuWIsOS5i+WJjeeahOS/ruiuoueJiOacrO+8jOWPr+iDvSAnLCAn5pyq5om+5Yiw5LmL5YmN55qE5L+u6KiC54mI5pys77yM5Y+v6IO9ICcpLFxuXHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCB1c2VyTm9ybSksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0JyDmmK/llK/kuIDotKHnjK7ogIXvvIzmiJbov5nkuKrnlKjmiLfov57nu63lgZrlh7rkuobotoXov4cgJyxcblx0XHRcdFx0XHRcdCcg5piv5ZSv5LiA6LKi54276ICF77yM5oiW6YCZ5YCL55So5oi26YCj57qM5YGa5Ye65LqG6LaF6YGOICdcblx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdG13Lmxhbmd1YWdlLmNvbnZlcnROdW1iZXIoVHdpbmtsZS5nZXRQcmVmKCdyZXZlcnRNYXhSZXZpc2lvbnMnKSkgK1xuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCcg5qyh57yW6L6R44CCJywgJyDmrKHnt6jovK/jgIInKSxcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICghY291bnQpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmVycm9yKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6ZSZ6K+vJywgJ+mMr+iqpCcpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmiJHku6zlsIbopoHlm57pgIAw5Liq5L+u6K6i54mI5pys77yM6L+Z5rKh5pyJ5oSP5LmJ77yM5omA5Lul5Y+W5raI5Zue6YCA5pON5L2c44CC5Y+v6IO95piv5Zug5Li66L+Z5Liq5L+u6K6i54mI5pys5bey57uP6KKr5Zue6YCA77yM5L2G5L+u6K6i54mI5pysSUTku43mmK/kuIDmoLfnmoTjgIInLFxuXHRcdFx0XHRcdFx0J+aIkeWAkeWwh+imgeWbnumAgDDlgIvkv67oqILniYjmnKzvvIzpgJnmspLmnInmhI/nvqnvvIzmiYDku6Xlj5bmtojlm57pgIDmk43kvZzjgILlj6/og73mmK/lm6DngrrpgJnlgIvkv67oqILniYjmnKzlt7LntpPooqvlm57pgIDvvIzkvYbkv67oqILniYjmnKxJROS7jeaYr+S4gOaoo+eahOOAgidcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGdvb2RfcmV2aXNpb24gPSByZXZzW2ZvdW5kXTtcblx0XHRcdGxldCB1c2VySGFzQWxyZWFkeUNvbmZpcm1lZEFjdGlvbiA9IGZhbHNlO1xuXHRcdFx0aWYgKHBhcmFtcy50eXBlICE9PSAndmFuZCcgJiYgY291bnQgPiAxKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHRcdHVzZXJOb3JtICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCcg6L+e57ut5YGa5Ye65LqGICcsICcg6YCj57qM5YGa5Ye65LqGICcpICtcblx0XHRcdFx0XHRcdFx0bXcubGFuZ3VhZ2UuY29udmVydE51bWJlcihjb3VudCkgK1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJyDmrKHnvJbovpHvvIzmmK/lkKbopoHlhajpg6jlm57pgIDvvJ8nLCAnIOasoee3qOi8r++8jOaYr+WQpuimgeWFqOmDqOWbnumAgO+8nycpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbygn5o+Q56S6Jywgd2luZG93LndnVUxTKCfnlKjmiLflj5bmtojmk43kvZwnLCAn5L2/55So6ICF5Y+W5raI5pON5L2cJykpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR1c2VySGFzQWxyZWFkeUNvbmZpcm1lZEFjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRwYXJhbXMuY291bnQgPSBjb3VudDtcblx0XHRcdHBhcmFtcy5nb29kaWQgPSBnb29kX3JldmlzaW9uLmdldEF0dHJpYnV0ZSgncmV2aWQnKTtcblx0XHRcdHBhcmFtcy5nb29kdXNlciA9IGdvb2RfcmV2aXNpb24uZ2V0QXR0cmlidXRlKCd1c2VyJyk7XG5cdFx0XHRwYXJhbXMuZ29vZHVzZXJIaWRkZW4gPSBnb29kX3JldmlzaW9uLmdldEF0dHJpYnV0ZSgndXNlcmhpZGRlbicpID09PSAnJztcblx0XHRcdHN0YXRlbGVtLnN0YXR1cyhbXG5cdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCBtdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKGNvdW50KSksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygnIOS4quS/ruiuoueJiOacrOS5i+WJjeeUsSAnLCAnIOWAi+S/ruiogueJiOacrOS5i+WJjeeUsSAnKSxcblx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHBhcmFtcy5nb29kdXNlckhpZGRlbiA/IFR3aW5rbGUuZmx1ZmYuaGlkZGVuTmFtZSA6IHBhcmFtcy5nb29kdXNlciksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygnIOWBmuWHuueahOS/ruiuoueJiOacrCAnLCAnIOWBmuWHuueahOS/ruiogueJiOacrCAnKSxcblx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHBhcmFtcy5nb29kaWQpLFxuXHRcdFx0XSk7XG5cdFx0XHRsZXQgc3VtbWFyeTtcblx0XHRcdGxldCBleHRyYV9zdW1tYXJ5O1xuXHRcdFx0c3dpdGNoIChwYXJhbXMudHlwZSkge1xuXHRcdFx0XHRjYXNlICd2YW5kJzpcblx0XHRcdFx0XHRzdW1tYXJ5ID0gVHdpbmtsZS5mbHVmZi5mb3JtYXRTdW1tYXJ5KFxuXHRcdFx0XHRcdFx0YOWbnumAgCRVU0VS5YGa5Ye655qEJHtwYXJhbXMuY291bnR9JHt3aW5kb3cud2dVTFMoJ+asoee8lui+ke+8jOWIsOeUsScsICfmrKHnt6jovK/vvIzliLDnlLEnKX0ke1xuXHRcdFx0XHRcdFx0XHRwYXJhbXMuZ29vZHVzZXJIaWRkZW4gPyBUd2lua2xlLmZsdWZmLmhpZGRlbk5hbWUgOiBwYXJhbXMuZ29vZHVzZXJcblx0XHRcdFx0XHRcdH0ke3dpbmRvdy53Z1VMUygn5YGa5Ye655qE5pyA5ZCO5L+u6K6i54mI5pysICcsICflgZrlh7rnmoTmnIDlvozkv67oqILniYjmnKwgJyl9YCxcblx0XHRcdFx0XHRcdHBhcmFtcy51c2VySGlkZGVuID8gbnVsbCA6IHBhcmFtcy51c2VyXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0LyogY2FzZSAnbm9ybSc6ICovXG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdvZmZlclJlYXNvbk9uTm9ybWFsUmV2ZXJ0JykpIHtcblx0XHRcdFx0XHRcdGV4dHJhX3N1bW1hcnkgPSBwcm9tcHQoXG5cdFx0XHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn5Y+v6YCJ55qE57yW6L6R5pGY6KaB77yaJywgJ+WPr+mBuOeahOe3qOi8r+aRmOimge+8micpfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAsXG5cdFx0XHRcdFx0XHRcdHBhcmFtcy5zdW1tYXJ5XG5cdFx0XHRcdFx0XHQpOyAvLyBwYWRkZWQgb3V0IHRvIHdpZGVuIHByb21wdCBpbiBGaXJlZm94XG5cdFx0XHRcdFx0XHRpZiAoZXh0cmFfc3VtbWFyeSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nOOAgicsICfkvb/nlKjogIXlj5bmtojmk43kvZzjgIInKSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHVzZXJIYXNBbHJlYWR5Q29uZmlybWVkQWN0aW9uID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3VtbWFyeSA9IFR3aW5rbGUuZmx1ZmYuZm9ybWF0U3VtbWFyeShcblx0XHRcdFx0XHRcdGDlm57pgIAkVVNFUuWBmuWHuueahCR7cGFyYW1zLmNvdW50fSR7d2luZG93LndnVUxTKCfmrKHnvJbovpEnLCAn5qyh57eo6LyvJyl9YCxcblx0XHRcdFx0XHRcdHBhcmFtcy51c2VySGlkZGVuID8gbnVsbCA6IHBhcmFtcy51c2VyLFxuXHRcdFx0XHRcdFx0ZXh0cmFfc3VtbWFyeVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignY29uZmlybU9uRmx1ZmYnKSAmJlxuXHRcdFx0XHQhdXNlckhhc0FscmVhZHlDb25maXJtZWRBY3Rpb24gJiZcblx0XHRcdFx0IWNvbmZpcm0od2luZG93LndnVUxTKCflm57pgIDpobXpnaLvvJrmgqjnoa7lrprlkJfvvJ8nLCAn5Zue6YCA6aCB6Z2i77ya5oKo56K65a6a5ZeO77yfJykpXG5cdFx0XHQpIHtcblx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfnlKjmiLflj5bmtojmk43kvZzjgIInLCAn5L2/55So6ICF5Y+W5raI5pON5L2c44CCJykpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBEZWNpZGUgd2hldGhlciB0byBub3RpZnkgdGhlIHVzZXIgb24gc3VjY2Vzc1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhVHdpbmtsZS5mbHVmZi5za2lwVGFsayAmJlxuXHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ29wZW5UYWxrUGFnZScpLmluY2x1ZGVzKHBhcmFtcy50eXBlKSAmJlxuXHRcdFx0XHQhcGFyYW1zLnVzZXJIaWRkZW4gJiZcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpICE9PSBwYXJhbXMudXNlclxuXHRcdFx0KSB7XG5cdFx0XHRcdHBhcmFtcy5ub3RpZnlVc2VyID0gdHJ1ZTtcblx0XHRcdFx0Ly8gUGFzcyBhbG9uZyB0byB0aGUgd2FybiBtb2R1bGVcblx0XHRcdFx0cGFyYW1zLnZhbnRpbWVzdGFtcCA9IHRvcC5nZXRBdHRyaWJ1dGUoJ3RpbWVzdGFtcCcpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRcdGFjdGlvbjogJ2VkaXQnLFxuXHRcdFx0XHR0aXRsZTogcGFyYW1zLnBhZ2VuYW1lLFxuXHRcdFx0XHRzdW1tYXJ5LFxuXHRcdFx0XHR0YWdzOiBUd2lua2xlLmNoYW5nZVRhZ3MsXG5cdFx0XHRcdHRva2VuOiBjc3JmdG9rZW4sXG5cdFx0XHRcdHVuZG86IGxhc3RyZXZpZCxcblx0XHRcdFx0dW5kb2FmdGVyOiBwYXJhbXMuZ29vZGlkLFxuXHRcdFx0XHRiYXNldGltZXN0YW1wOiB0b3VjaGVkLFxuXHRcdFx0XHRzdGFydHRpbWVzdGFtcDogbG9hZHRpbWVzdGFtcCxcblx0XHRcdFx0bWlub3I6IFR3aW5rbGUuZ2V0UHJlZignbWFya1JldmVydGVkUGFnZXNBc01pbm9yJykuaW5jbHVkZXMocGFyYW1zLnR5cGUpID8gdHJ1ZSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0Ym90OiB0cnVlLFxuXHRcdFx0fTtcblx0XHRcdC8vIEhhbmRsZSB3YXRjaGluZywgcG9zc2libGUgZXhwaXJ5XG5cdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFJldmVydGVkUGFnZXMnKS5pbmNsdWRlcyhwYXJhbXMudHlwZSkpIHtcblx0XHRcdFx0Y29uc3Qgd2F0Y2hPckV4cGlyeSA9IFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hSZXZlcnRlZEV4cGlyeScpO1xuXHRcdFx0XHRpZiAoIXdhdGNoT3JFeHBpcnkgfHwgd2F0Y2hPckV4cGlyeSA9PT0gJ25vJykge1xuXHRcdFx0XHRcdHF1ZXJ5LndhdGNobGlzdCA9ICdub2NoYW5nZSc7XG5cdFx0XHRcdH0gZWxzZSBpZiAod2F0Y2hPckV4cGlyeSA9PT0gJ2RlZmF1bHQnIHx8IHdhdGNoT3JFeHBpcnkgPT09ICdwcmVmZXJlbmNlcycpIHtcblx0XHRcdFx0XHRxdWVyeS53YXRjaGxpc3QgPSAncHJlZmVyZW5jZXMnO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXJ5LndhdGNobGlzdCA9ICd3YXRjaCc7XG5cdFx0XHRcdFx0Ly8gbnVtYmVyIGFsbG93ZWQgYnV0IG5vdCB1c2VkIGluIFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB3YXRjaE9yRXhwaXJ5ID09PSAnc3RyaW5nJyAmJiB3YXRjaE9yRXhwaXJ5ICE9PSAneWVzJykge1xuXHRcdFx0XHRcdFx0cXVlcnkud2F0Y2hsaXN0ZXhwaXJ5ID0gd2F0Y2hPckV4cGlyeTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghVHdpbmtsZS5mbHVmZi5yb2xsYmFja0luUGxhY2UpIHtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBwYXJhbXMucGFnZW5hbWU7XG5cdFx0XHR9XG5cdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSAn5Zue6YCA5a6M5oiQJztcblx0XHRcdGNvbnN0IHFpdXdlbl9hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+d5a2Y5Zue6YCA5YaF5a65JywgJ+WEsuWtmOWbnumAgOWFp+WuuScpLFxuXHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0VHdpbmtsZS5mbHVmZi5jYWxsYmFja3MuY29tcGxldGUsXG5cdFx0XHRcdHN0YXRlbGVtXG5cdFx0XHQpO1xuXHRcdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSBwYXJhbXM7XG5cdFx0XHRxaXV3ZW5fYXBpLnBvc3QoKTtcblx0XHR9LFxuXHRcdGNvbXBsZXRlOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHQvLyBUT0RPIE1vc3Qgb2YgdGhpcyBpcyBjb3B5LXBhc3RlZCBmcm9tIE1vcmViaXRzLndpa2kucGFnZSNmblNhdmVTdWNjZXNzLiBVbmlmeSBpdFxuXHRcdFx0Y29uc3QgeG1sID0gYXBpb2JqLmdldFhNTCgpO1xuXHRcdFx0Y29uc3QgJGVkaXQgPSAkKHhtbCkuZmluZCgnZWRpdCcpO1xuXHRcdFx0aWYgKCQoeG1sKS5maW5kKCdjYXB0Y2hhJykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRhcGlvYmouc3RhdGVsZW0uZXJyb3IoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfkuI3og73lm57pgIDvvIzlm6DmnI3liqHlmajopoHmsYLmgqjovpPlhaXpqozor4HnoIHjgIInLCAn5LiN6IO95Zue6YCA77yM5Zug5Ly65pyN5Zmo6KaB5rGC5oKo6Ly45YWl6amX6K2J56K844CCJylcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAoJGVkaXQuYXR0cignbm9jaGFuZ2UnKSA9PT0gJycpIHtcblx0XHRcdFx0YXBpb2JqLnN0YXRlbGVtLmVycm9yKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfopoHlm57pgIDliLDnmoTniYjmnKzkuI7lvZPliY3niYjmnKznm7jlkIzvvIzmsqHku4DkuYjopoHlgZrnmoQnLFxuXHRcdFx0XHRcdFx0J+imgeWbnumAgOWIsOeahOeJiOacrOiIh+ebruWJjeeJiOacrOebuOWQjO+8jOaykuS7gOm6vOimgeWBmueahCdcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhcGlvYmouc3RhdGVsZW0uaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdGNvbnN0IHtwYXJhbXN9ID0gYXBpb2JqO1xuXHRcdFx0XHRpZiAocGFyYW1zLm5vdGlmeVVzZXIgJiYgIXBhcmFtcy51c2VySGlkZGVuKSB7XG5cdFx0XHRcdFx0Ly8gbm90aWZ5VXNlciBvbmx5IGZyb20gbWFpbiwgbm90IGZyb20gdG9SZXZpc2lvblxuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKHdpbmRvdy53Z1VMUygn5L+h5oGvJywgJ+izh+ioiicpLCBbXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+W8gOWQr+eUqOaItyAnLCAn6ZaL5ZWf5L2/55So6ICFICcpLFxuXHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHBhcmFtcy51c2VyKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOeahOiuqOiuuumhtScsICcg55qE6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0Y29uc3Qgd2luZG93UXVlcnkgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogYFVzZXIgdGFsazoke3BhcmFtcy51c2VyfWAsXG5cdFx0XHRcdFx0XHRhY3Rpb246ICdlZGl0Jyxcblx0XHRcdFx0XHRcdHByZXZpZXc6ICd5ZXMnLFxuXHRcdFx0XHRcdFx0dmFuYXJ0aWNsZTogcGFyYW1zLnBhZ2VuYW1lLnJlcGxhY2UoL18vZywgJyAnKSxcblx0XHRcdFx0XHRcdHZhbmFydGljbGVyZXZpZDogcGFyYW1zLnJldmlkLFxuXHRcdFx0XHRcdFx0dmFudGltZXN0YW1wOiBwYXJhbXMudmFudGltZXN0YW1wLFxuXHRcdFx0XHRcdFx0dmFuYXJ0aWNsZWdvb2RyZXZpZDogcGFyYW1zLmdvb2RpZCxcblx0XHRcdFx0XHRcdHR5cGU6IHBhcmFtcy50eXBlLFxuXHRcdFx0XHRcdFx0Y291bnQ6IHBhcmFtcy5jb3VudCxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHN3aXRjaCAoVHdpbmtsZS5nZXRQcmVmKCd1c2VyVGFsa1BhZ2VNb2RlJykpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ3RhYic6XG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5vcGVuKG13LnV0aWwuZ2V0VXJsKCcnLCB3aW5kb3dRdWVyeSksICdfYmxhbmsnLCAnbm9vcGVuZXIsbm9yZWZlcnJlcicpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2JsYW5rJzpcblx0XHRcdFx0XHRcdFx0d2luZG93Lm9wZW4oXG5cdFx0XHRcdFx0XHRcdFx0bXcudXRpbC5nZXRVcmwoJycsIHdpbmRvd1F1ZXJ5KSxcblx0XHRcdFx0XHRcdFx0XHQnX2JsYW5rJyxcblx0XHRcdFx0XHRcdFx0XHQnbm9vcGVuZXIsbm9yZWZlcnJlcixsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHN0YXR1cz1ubyxkaXJlY3Rvcmllcz1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0xMjAwLGhlaWdodD04MDAnXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0LyogY2FzZSAnd2luZG93JzogKi9cblx0XHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5vcGVuKFxuXHRcdFx0XHRcdFx0XHRcdG13LnV0aWwuZ2V0VXJsKCcnLCB3aW5kb3dRdWVyeSksXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93Lm5hbWUgPT09ICd0d2lua2xld2FybndpbmRvdycgPyAnX2JsYW5rJyA6ICd0d2lua2xld2FybndpbmRvdycsXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93Lm5hbWUgPT09ICd0d2lua2xld2FybndpbmRvdydcblx0XHRcdFx0XHRcdFx0XHRcdD8gJ25vb3BlbmVyLG5vcmVmZXJyZXIsJ1xuXHRcdFx0XHRcdFx0XHRcdFx0OiAnJyArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2xvY2F0aW9uPW5vLHRvb2xiYXI9bm8sc3RhdHVzPW5vLGRpcmVjdG9yaWVzPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTEyMDAsaGVpZ2h0PTgwMCdcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0fTtcblx0Ly8gSWYgYnVpbHRJblN0cmluZyBjb250YWlucyB0aGUgc3RyaW5nIFwiJFVTRVJcIiwgaXQgd2lsbCBiZSByZXBsYWNlZFxuXHQvLyBieSBhbiBhcHByb3ByaWF0ZSB1c2VyIGxpbmsgaWYgYSB1c2VyIG5hbWUgaXMgcHJvdmlkZWRcblx0VHdpbmtsZS5mbHVmZi5mb3JtYXRTdW1tYXJ5ID0gKGJ1aWx0SW5TdHJpbmcsIHVzZXJOYW1lLCBjdXN0b21TdHJpbmcpID0+IHtcblx0XHRsZXQgcmVzdWx0ID0gYnVpbHRJblN0cmluZztcblx0XHQvLyBhcHBlbmQgdXNlcidzIGN1c3RvbSByZWFzb25cblx0XHRpZiAoY3VzdG9tU3RyaW5nKSB7XG5cdFx0XHRyZXN1bHQgKz0gYO+8miR7TW9yZWJpdHMuc3RyaW5nLnRvVXBwZXJDYXNlRmlyc3RDaGFyKGN1c3RvbVN0cmluZyl9YDtcblx0XHR9XG5cdFx0Ly8gZmluZCBudW1iZXIgb2YgVVRGLTggYnl0ZXMgdGhlIHJlc3VsdGluZyBzdHJpbmcgdGFrZXMgdXAsIGFuZCBwb3NzaWJseSBhZGRcblx0XHQvLyBhIGNvbnRyaWJ1dGlvbnMgb3IgY29udHJpYnV0aW9ucyt0YWxrIGxpbmsgaWYgaXQgZG9lc24ndCBwdXNoIHRoZSBlZGl0IHN1bW1hcnlcblx0XHQvLyBvdmVyIHRoZSA0OTktYnl0ZSBsaW1pdFxuXHRcdGlmICgvXFwkVVNFUi8udGVzdChidWlsdEluU3RyaW5nKSkge1xuXHRcdFx0aWYgKHVzZXJOYW1lKSB7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdExlbiA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChyZXN1bHQucmVwbGFjZSgnJFVTRVInLCAnJykpKS5sZW5ndGg7XG5cdFx0XHRcdGNvbnN0IGNvbnRyaWJzTGluayA9IGBbW1NwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3VzZXJOYW1lfXwke3VzZXJOYW1lfV1dYDtcblx0XHRcdFx0Y29uc3QgY29udHJpYnNMZW4gPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoY29udHJpYnNMaW5rKSkubGVuZ3RoO1xuXHRcdFx0XHRpZiAocmVzdWx0TGVuICsgY29udHJpYnNMZW4gPD0gNDk5KSB7XG5cdFx0XHRcdFx0Y29uc3QgdGFsa0xpbmsgPSBg77yIW1tVc2VyIHRhbGs6JHt1c2VyTmFtZX0ke3dpbmRvdy53Z1VMUygnfOiuqOiuul1d77yJJywgJ3zoqI7oq5ZdXe+8iScpfWA7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdExlbiArIGNvbnRyaWJzTGVuICsgdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHRhbGtMaW5rKSkubGVuZ3RoIDw9IDQ5OSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ID0gTW9yZWJpdHMuc3RyaW5nLnNhZmVSZXBsYWNlKHJlc3VsdCwgJyRVU0VSJywgY29udHJpYnNMaW5rICsgdGFsa0xpbmspO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSBNb3JlYml0cy5zdHJpbmcuc2FmZVJlcGxhY2UocmVzdWx0LCAnJFVTRVInLCBjb250cmlic0xpbmspO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHQgPSBNb3JlYml0cy5zdHJpbmcuc2FmZVJlcGxhY2UocmVzdWx0LCAnJFVTRVInLCB1c2VyTmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdCA9IE1vcmViaXRzLnN0cmluZy5zYWZlUmVwbGFjZShyZXN1bHQsICckVVNFUicsIFR3aW5rbGUuZmx1ZmYuaGlkZGVuTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuZmx1ZmYsICdmbHVmZicpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5cbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWJhdGNoZGVsZXRlLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWJhdGNoZGVsZXRlKCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdC8qKlxuXHQgKiB0d2lua2xlYmF0Y2hkZWxldGUuanM6IEJhdGNoIGRlbGV0ZSBtb2R1bGUgKHN5c29wcyBvbmx5KVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJELWJhdGNoXCIpXG5cdCAqIEFjdGl2ZSBvbjogRXhpc3Rpbmcgbm9uLWFydGljbGVzLCBhbmQgU3BlY2lhbDpQcmVmaXhJbmRleFxuXHQgKi9cblx0VHdpbmtsZS5iYXRjaGRlbGV0ZSA9ICgpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRNb3JlYml0cy51c2VySXNTeXNvcCAmJlxuXHRcdFx0KChtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSAmJiBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID4gMCkgfHxcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ1ByZWZpeGluZGV4JyB8fFxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnQnJva2VuUmVkaXJlY3RzJylcblx0XHQpIHtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2ssXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5om55YigJywgJ+aJueWIqicpLFxuXHRcdFx0XHQndHctYmF0Y2gnLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WIoOmZpOatpOWIhuexu+aIlumhtemdouS4reeahOaJgOaciemTvuaOpScsICfliKrpmaTmraTliIbpoZ7miJbpoIHpnaLkuK3nmoTmiYDmnInpgKPntZAnKVxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUudW5saW5rQ2FjaGUgPSB7fTtcblx0Ly8gSGFzIHRoZSBzdWJwYWdlcyBsaXN0IGJlZW4gbG9hZGVkP1xuXHRsZXQgc3VicGFnZXNMb2FkZWQ7XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0c3VicGFnZXNMb2FkZWQgPSBmYWxzZTtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgNDAwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmibnph4/liKDpmaQnLCAn5om55qyh5Yiq6ZmkJykpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2JhdGNoZGVsZXRlJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOmhtemdoicsICfliKrpmaTpoIHpnaInKSxcblx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlX3BhZ2UnLFxuXHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlJyxcblx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfliKDpmaTlhbPogZTnmoTorqjorrrpobXvvIjnlKjmiLforqjorrrpobXpmaTlpJbvvIknLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+WIqumZpOmXnOiBr+eahOiojuirlumgge+8iOS9v+eUqOiAheiojuirlumggemZpOWklu+8iSdcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdkZWxldGVfdGFsaycsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdkZWxldGVfdGFsaycsXG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOWIsOW3suWIoOmhtemdoueahOmHjeWumuWQkemhtScsICfliKrpmaTliLDlt7LliKrpoIHpnaLnmoTph43mlrDlsI7lkJHpoIHpnaInKSxcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlX3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdkZWxldGVfcmVkaXJlY3RzJyxcblx0XHRcdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yig6Zmk5bey5Yig6aG16Z2i55qE5a2Q6aG16Z2iJywgJ+WIqumZpOW3suWIqumggemdoueahOWtkOmggemdoicpLFxuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdkZWxldGVfc3VicGFnZXMnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlX3N1YnBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0XHRjaGVja2VkOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFjay50b2dnbGVTdWJwYWdlcyxcblx0XHRcdFx0XHRcdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOW3suWIoOWtkOmhtemdoueahOiuqOiuuumhtScsICfliKrpmaTlt7LliKrlrZDpoIHpnaLnmoToqI7oq5bpoIEnKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlX3N1YnBhZ2VfdGFsa3MnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlX3N1YnBhZ2VfdGFsa3MnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCfliKDpmaTliLDlt7LliKDlrZDpobXpnaLnmoTph43lrprlkJHpobUnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J+WIqumZpOWIsOW3suWIquWtkOmggemdoueahOmHjeaWsOWwjuWQkemggemdoidcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdkZWxldGVfc3VicGFnZV9yZWRpcmVjdHMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlX3N1YnBhZ2VfcmVkaXJlY3RzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQn5Y+W5raI5omA5pyJ5bey5Yig6aG16Z2i55qE6ZO+5YWl77yI5LuF5aSE55CG5p2h55uu5ZG95ZCN56m66Ze077yJJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCflj5bmtojmiYDmnInlt7LliKrpoIHpnaLnmoTpgKPlhaXvvIjlg4XomZXnkIbmop3nm67lkb3lkI3nqbrplpPvvIknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiAndW5saW5rX3N1YnBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3VubGlua19zdWJwYWdlcycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj5bmtojpk77lhaXvvIjku4XlpITnkIbmnaHnm67lkb3lkI3nqbrpl7TvvIknLCAn5Y+W5raI6YCj5YWl77yI5YOF6JmV55CG5qKd55uu5ZG95ZCN56m66ZaT77yJJyksXG5cdFx0XHRcdFx0bmFtZTogJ3VubGlua19wYWdlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3VubGluaycsXG5cdFx0XHRcdFx0Y2hlY2tlZDogZmFsc2UsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vpmaTmlofku7bkvb/nlKjvvIjmiYDmnInlkb3lkI3nqbrpl7TvvIknLCAn56e76Zmk5qqU5qGI5L2/55So77yI5omA5pyJ5ZG95ZCN56m66ZaT77yJJyksXG5cdFx0XHRcdFx0bmFtZTogJ3VubGlua19maWxlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3VubGlua19maWxlJyxcblx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdG5hbWU6ICdjb21tb25fcmVhc29uJyxcblx0XHRcdGxhYmVsOiAn5bi455So55CG55Sx77yaJyxcblx0XHRcdHN0eWxlOiAnd2lkdGg6IDg1JTsnLFxuXHRcdFx0bGlzdDogVHdpbmtsZS5iYXRjaGRlbGV0ZS5kZWxldGVyZWFzb25saXN0LFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2suY2hhbmdlX2NvbW1vbl9yZWFzb24sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0bGFiZWw6ICfnkIbnlLHvvJonLFxuXHRcdFx0c2l6ZTogNzUsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRwcm9wOiAncmV2aXNpb25zfGluZm98aW1hZ2VpbmZvJyxcblx0XHRcdGlucHJvcDogJ3Byb3RlY3Rpb24nLFxuXHRcdFx0cnZwcm9wOiAnc2l6ZXx1c2VyJyxcblx0XHR9O1xuXHRcdC8vIE9uIGNhdGVnb3JpZXNcblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMTQpIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdjYXRlZ29yeW1lbWJlcnMnO1xuXHRcdFx0cXVlcnkuZ2NtdGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRxdWVyeS5nY21saW1pdCA9IFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hNYXgnKTtcblx0XHRcdC8vIE9uIFNwZWNpYWw6UHJlZml4SW5kZXhcblx0XHR9IGVsc2UgaWYgKG13LmNvbmZpZy5nZXQoJ3dnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lJykgPT09ICdQcmVmaXhpbmRleCcpIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdhbGxwYWdlcyc7XG5cdFx0XHRxdWVyeS5nYXBsaW1pdCA9IFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hNYXgnKTtcblx0XHRcdGlmIChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ByZWZpeCcpKSB7XG5cdFx0XHRcdHF1ZXJ5LmdhcG5hbWVzcGFjZSA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnbmFtZXNwYWNlJyk7XG5cdFx0XHRcdHF1ZXJ5LmdhcHByZWZpeCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgncHJlZml4Jyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsZXQgcGF0aFNwbGl0ID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLnBhdGhuYW1lKS5zcGxpdCgnLycpO1xuXHRcdFx0XHRpZiAocGF0aFNwbGl0Lmxlbmd0aCA8IDMgfHwgcGF0aFNwbGl0WzJdICE9PSAnU3BlY2lhbDrliY3nvIDntKLlvJUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHRpdGxlU3BsaXQgPSBwYXRoU3BsaXRbM10uc3BsaXQoJzonKTtcblx0XHRcdFx0cXVlcnkuZ2FwbmFtZXNwYWNlID0gbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKVt0aXRsZVNwbGl0WzBdLnRvTG93ZXJDYXNlKCldO1xuXHRcdFx0XHRpZiAodGl0bGVTcGxpdC5sZW5ndGggPCAyIHx8IHF1ZXJ5LmdhcG5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cXVlcnkuZ2FwbmFtZXNwYWNlID0gMDsgLy8gYXJ0aWNsZSBuYW1lc3BhY2Vcblx0XHRcdFx0XHRxdWVyeS5nYXBwcmVmaXggPSBwYXRoU3BsaXQuc3BsaWNlKDMpLmpvaW4oJy8nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXRoU3BsaXQgPSBwYXRoU3BsaXQuc3BsaWNlKDQpO1xuXHRcdFx0XHRcdHBhdGhTcGxpdC5zcGxpY2UoMCwgMCwgdGl0bGVTcGxpdC5zcGxpY2UoMSkuam9pbignOicpKTtcblx0XHRcdFx0XHRxdWVyeS5nYXBwcmVmaXggPSBwYXRoU3BsaXQuam9pbignLycpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBPbiBTcGVjaWFsOkJyb2tlblJlZGlyZWN0c1xuXHRcdH0gZWxzZSBpZiAobXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ0Jyb2tlblJlZGlyZWN0cycpIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdxdWVyeXBhZ2UnO1xuXHRcdFx0cXVlcnkuZ3FwcGFnZSA9ICdCcm9rZW5SZWRpcmVjdHMnO1xuXHRcdFx0cXVlcnkuZ3FwbGltaXQgPSBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4Jyk7XG5cdFx0XHQvLyBPbiBub3JtYWwgcGFnZXNcblx0XHR9IGVsc2Uge1xuXHRcdFx0cXVlcnkuZ2VuZXJhdG9yID0gJ2xpbmtzJztcblx0XHRcdHF1ZXJ5LnRpdGxlcyA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRcdHF1ZXJ5LmdwbGxpbWl0ID0gVHdpbmtsZS5nZXRQcmVmKCdiYXRjaE1heCcpO1xuXHRcdH1cblx0XHRjb25zdCBzdGF0dXNkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRzdGF0dXNkaXYuc3R5bGUucGFkZGluZyA9ICcxNXB4JzsgLy8ganVzdCBzbyBpdCBkb2Vzbid0IGxvb2sgYnJva2VuXG5cdFx0V2luZG93LnNldENvbnRlbnQoc3RhdHVzZGl2KTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChzdGF0dXNkaXYpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5wYWdlcyA9IHt9O1xuXHRcdGNvbnN0IHN0YXRlbGVtID0gbmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+aKk+WPlumhtemdouWIl+ihqCcsICfmipPlj5bpoIHpnaLliJfooagnKSk7XG5cdFx0Y29uc3QgcWl1d2VuX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg6L295Lit4oCmJywgJ+i8ieWFpeS4reKApicpLFxuXHRcdFx0cXVlcnksXG5cdFx0XHQoYXBpb2JqKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHhtbCA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdFx0Y29uc3QgJHBhZ2VzID0gJCh4bWwpLmZpbmQoJ3BhZ2UnKS5maWx0ZXIoJzpub3QoW21pc3NpbmddKScpOyAvLyA6bm90KFtpbWFnZXJlcG9zaXRvcnk9XCJzaGFyZWRcIl0pXG5cdFx0XHRcdCRwYWdlcy5lYWNoKChfaW5kZXgsIHBhZ2UpID0+IHtcblx0XHRcdFx0XHRjb25zdCAkcGFnZSA9ICQocGFnZSk7XG5cdFx0XHRcdFx0Y29uc3QgbnMgPSAkcGFnZS5hdHRyKCducycpO1xuXHRcdFx0XHRcdGNvbnN0IHRpdGxlID0gJHBhZ2UuYXR0cigndGl0bGUnKTtcblx0XHRcdFx0XHRjb25zdCBpc1JlZGlyID0gJHBhZ2UuYXR0cigncmVkaXJlY3QnKSA9PT0gJyc7XG5cdFx0XHRcdFx0Y29uc3QgJGVkaXRwcm90ID0gJHBhZ2UuZmluZCgncHJbdHlwZT1cImVkaXRcIl1bbGV2ZWw9XCJzeXNvcFwiXScpO1xuXHRcdFx0XHRcdGNvbnN0IGlzUHJvdGVjdGVkID0gJGVkaXRwcm90Lmxlbmd0aCA+IDA7XG5cdFx0XHRcdFx0Y29uc3Qgc2l6ZSA9ICRwYWdlLmZpbmQoJ3JldicpLmF0dHIoJ3NpemUnKTtcblx0XHRcdFx0XHRjb25zdCBtZXRhZGF0YSA9IFtdO1xuXHRcdFx0XHRcdGlmIChpc1JlZGlyKSB7XG5cdFx0XHRcdFx0XHRtZXRhZGF0YVttZXRhZGF0YS5sZW5ndGhdID0gd2luZG93LndnVUxTKCfph43lrprlkJEnLCAn6YeN5paw5bCO5ZCRJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpc1Byb3RlY3RlZCkge1xuXHRcdFx0XHRcdFx0bWV0YWRhdGFbbWV0YWRhdGEubGVuZ3RoXSA9XG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5YWo5L+d5oqk77yMJywgJ+WFqOS/neitt++8jCcpICtcblx0XHRcdFx0XHRcdFx0KCRlZGl0cHJvdC5hdHRyKCdleHBpcnknKSA9PT0gJ2luZmluaXR5J1xuXHRcdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCfml6DpmZDmnJ8nLCAn54Sh6ZmQ5pyfJylcblx0XHRcdFx0XHRcdFx0XHQ6IGAke25ldyBNb3JlYml0cy5kYXRlKCRlZGl0cHJvdC5hdHRyKCdleHBpcnknKSkuY2FsZW5kYXIoJ3V0YycpfSAoVVRDKWApICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfov4fmnJ8nLCAn6YGO5pyfJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChucyA9PT0gJzYnKSB7XG5cdFx0XHRcdFx0XHQvLyBtaW1pYyB3aGF0IGRlbGltYWdlcyB1c2VkIHRvIHNob3cgZm9yIGZpbGVzXG5cdFx0XHRcdFx0XHRtZXRhZGF0YVttZXRhZGF0YS5sZW5ndGhdID1cblx0XHRcdFx0XHRcdFx0KHdpbmRvdy53Z1VMUygn5LiK5Lyg6ICF77yaJywgJ+S4iuWCs+iAhe+8micpICsgJHBhZ2UuZmluZCgnaWknKS5hdHRyKCd1c2VyJyksXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyA5ZCO57yW6L6R77yaJywgJ+acgOW+jOe3qOi8r++8micpICsgJHBhZ2UuZmluZCgncmV2JykuYXR0cigndXNlcicpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWV0YWRhdGFbbWV0YWRhdGEubGVuZ3RoXSA9IG13Lmxhbmd1YWdlLmNvbnZlcnROdW1iZXIoc2l6ZSkgKyB3aW5kb3cud2dVTFMoJ+Wtl+iKgicsICfkvY3lhYPntYQnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5wYWdlc1t0aXRsZV0gPSB7XG5cdFx0XHRcdFx0XHRsYWJlbDogdGl0bGUgKyAobWV0YWRhdGEubGVuZ3RoID8gYO+8iCR7bWV0YWRhdGEuam9pbign77yMJyl977yJYCA6ICcnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiB0aXRsZSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzdHlsZTogaXNQcm90ZWN0ZWQgPyAnY29sb3I6ICNmMDAnIDogJycsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IGZvcm1fID0gYXBpb2JqLnBhcmFtcy5mb3JtO1xuXHRcdFx0XHRmb3JtXy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W+heWIoOmZpOmhtemdoicsICflvoXliKrpmaTpoIHpnaInKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvcm1fLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2J1dHRvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo6YCJJywgJ+WFqOmBuCcpLFxuXHRcdFx0XHRcdGV2ZW50OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHQkKHJlc3VsdClcblx0XHRcdFx0XHRcdFx0LmZpbmQoJ2lucHV0W25hbWU9cGFnZXNdOm5vdCg6Y2hlY2tlZCknKVxuXHRcdFx0XHRcdFx0XHQuZWFjaCgoXywgZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGUuY2xpY2soKTsgLy8gY2hlY2sgaXQsIGFuZCBpbnZva2UgY2xpY2sgZXZlbnQgc28gdGhhdCBzdWJncm91cCBjYW4gYmUgc2hvd25cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBDaGVjayBhbnkgdW5jaGVja2VkIHN1YnBhZ2VzIHRvb1xuXHRcdFx0XHRcdFx0JGJvZHkuZmluZCgnaW5wdXRbbmFtZT1cInBhZ2VzLnN1YnBhZ2VzXCJdJykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtXy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WFqOS4jemAiScsICflhajkuI3pgbgnKSxcblx0XHRcdFx0XHRldmVudDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0JChyZXN1bHQpXG5cdFx0XHRcdFx0XHRcdC5maW5kKCdpbnB1dFtuYW1lPXBhZ2VzXTpjaGVja2VkJylcblx0XHRcdFx0XHRcdFx0LmVhY2goKF8sIGUpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRlLmNsaWNrKCk7IC8vIHVuY2hlY2sgaXQsIGFuZCBpbnZva2UgY2xpY2sgZXZlbnQgc28gdGhhdCBzdWJncm91cCBjYW4gYmUgaGlkZGVuXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGZvcm1fLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRuYW1lOiAncGFnZXMnLFxuXHRcdFx0XHRcdGlkOiAndHctZGJhdGNoLXBhZ2VzJyxcblx0XHRcdFx0XHRzaGlmdENsaWNrU3VwcG9ydDogdHJ1ZSxcblx0XHRcdFx0XHRsaXN0OiBPYmplY3QudmFsdWVzKFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXMpLm1hcCgoZSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGU7XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtXy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gZm9ybV8ucmVuZGVyKCk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuV2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRcdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocmVzdWx0LCAncGFnZXMnKSkge1xuXHRcdFx0XHRcdGdlbmVyYXRlQXJyb3dMaW5rcyhjaGVja2JveCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzdGF0ZWxlbVxuXHRcdCk7XG5cdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSB7XG5cdFx0XHRmb3JtLFxuXHRcdFx0V2luZG93LFxuXHRcdH07XG5cdFx0cWl1d2VuX2FwaS5wb3N0KCk7XG5cdH07XG5cdGNvbnN0IGdlbmVyYXRlQXJyb3dMaW5rcyA9IChjaGVja2JveCkgPT4ge1xuXHRcdGNvbnN0IGxpbmsgPSBNb3JlYml0cy5odG1sTm9kZSgnYScsICcgPicpO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0dy1kYmF0Y2gtcGFnZS1saW5rJyk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBtdy51dGlsLmdldFVybChjaGVja2JveC52YWx1ZSkpO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdub29wZW5lciBub3JlZmVycmVyJyk7XG5cdFx0Y2hlY2tib3gubmV4dEVsZW1lbnRTaWJsaW5nLmFwcGVuZChsaW5rKTtcblx0fTtcblx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5nZW5lcmF0ZU5ld1BhZ2VMaXN0ID0gKGZvcm0pID0+IHtcblx0XHQvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgY2hlY2tlZCBwYWdlcyBpbiBUd2lua2xlLmJhdGNoZGVsZXRlLnBhZ2VzIG9iamVjdFxuXHRcdGNvbnN0IGVsZW1lbnRzID0gZm9ybS5lbGVtZW50cy5wYWdlcztcblx0XHRpZiAoZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkge1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG11bHRpcGxlIHBhZ2VzXG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcblx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5wYWdlc1tlbGVtZW50LnZhbHVlXS5jaGVja2VkID0gZWxlbWVudC5jaGVja2VkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZWxlbWVudHMgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlXG5cdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLnBhZ2VzW2VsZW1lbnRzLnZhbHVlXS5jaGVja2VkID0gZWxlbWVudHMuY2hlY2tlZDtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0bmFtZTogJ3BhZ2VzJyxcblx0XHRcdGlkOiAndHctZGJhdGNoLXBhZ2VzJyxcblx0XHRcdHNoaWZ0Q2xpY2tTdXBwb3J0OiB0cnVlLFxuXHRcdFx0bGlzdDogT2JqZWN0LnZhbHVlcyhUd2lua2xlLmJhdGNoZGVsZXRlLnBhZ2VzKS5tYXAoKGUpID0+IHtcblx0XHRcdFx0cmV0dXJuIGU7XG5cdFx0XHR9KSxcblx0XHR9KS5yZW5kZXIoKTtcblx0fTtcblx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5kZWxldGVyZWFzb25saXN0ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivt+mAieaLqScsICfoq4vpgbjmk4cnKSxcblx0XHRcdHZhbHVlOiAnJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdHNu+8muWOn+S9nOiAheaPkOivt+WIoOmZpOaIlua4heepuumhtemdou+8jOS4lOmhtemdouWOn+S9nOiAheS7heacieS4gOS6uicsXG5cdFx0XHRcdCdHNu+8muWOn+S9nOiAheaPkOiri+WIqumZpOaIlua4heepuumggemdou+8jOS4lOmggemdouWOn+S9nOiAheWDheacieS4gOS6uidcblx0XHRcdCksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tRVzpDU0QjRzZ8RzZdXe+8muWOn+S9nOiAheaPkOivt+WIoOmZpOaIlua4heepuumhtemdou+8jOS4lOmhtemdouWOn+S9nOiAheS7heacieS4gOS6uicsXG5cdFx0XHRcdCdbW1FXOkNTRCNHNnxHNl1d77ya5Y6f5L2c6ICF5o+Q6KuL5Yiq6Zmk5oiW5riF56m66aCB6Z2i77yM5LiU6aCB6Z2i5Y6f5L2c6ICF5YOF5pyJ5LiA5Lq6J1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdHOe+8muWtpOeri+mhtemdou+8jOavlOWmguayoeacieS4u+mhtemdoueahOiuqOiuuumhteOAgeaMh+WQkeepuumhtemdoueahOmHjeWumuWQkeetiScsXG5cdFx0XHRcdCdHOe+8muWtpOeri+mggemdou+8jOavlOWmguaykuacieS4u+mggemdoueahOiojuirlumggeOAgeaMh+WQkeepuumggemdoueahOmHjeaWsOWwjuWQkeetiSdcblx0XHRcdCksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCdbW1FXOkNTRCNHOXxHOV1d77ya5a2k56uL6aG16Z2iJywgJ1tbUVc6Q1NEI0c5fEc5XV3vvJrlraTnq4vpoIHpnaInKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ1Ix77ya5LiN6IO95Y+R5oyl5a6e6ZmF5L2c55So55qE6YeN5a6a5ZCR44CCJywgJ1Ix77ya5LiN6IO955m85o+u5a+m6Zqb5L2c55So55qE6YeN5a6a5ZCR44CCJyksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tRVzpDU0QjUjF8UjFdXe+8muS4jeiDveWPkeaMpeWunumZheS9nOeUqOeahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdCdbW1FXOkNTRCNSMXxSMV1d77ya5LiN6IO955m85o+u5a+m6Zqb5L2c55So55qE6YeN5a6a5ZCR44CCJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdSMu+8muWQjeensOS4juWvvOWQkeebruagh+S7o+ihqOS6i+eJqeS4jeS4gOiHtOaIluS4jeWujOWFqOS4gOiHtOeahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdCdSMu+8muWQjeeoseiIh+WwjuWQkeebruaomeS7o+ihqOS6i+eJqeS4jeS4gOiHtOaIluS4jeWujOWFqOS4gOiHtOeahOmHjeWumuWQkeOAgidcblx0XHRcdCksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tRVzpDU0QjUjJ8UjJdXe+8muWQjeensOS4juWvvOWQkeebruagh+S7o+ihqOS6i+eJqeS4jeS4gOiHtOaIluS4jeWujOWFqOS4gOiHtOeahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdCdbW1FXOkNTRCNSMnxSMl1d77ya5ZCN56ix6IiH5bCO5ZCR55uu5qiZ5Luj6KGo5LqL54mp5LiN5LiA6Ie05oiW5LiN5a6M5YWo5LiA6Ie055qE6YeN5a6a5ZCR44CCJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ0Y077ya5Y+v6KKr5pu/5Luj55qE5ZCI55CG5L2/55So5paH5Lu2JywgJ0Y077ya5Y+v6KKr5pu/5Luj55qE5ZCI55CG5L2/55So5qqU5qGIJyksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCdbW1FXOkNTRCNGNHxGNF1d77ya5Y+v6KKr5pu/5Luj55qE5ZCI55CG5L2/55So5paH5Lu2JywgJ1tbUVc6Q1NEI0Y0fEY0XV3vvJrlj6/ooqvmm7/ku6PnmoTlkIjnkIbkvb/nlKjmqpTmoYgnKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdGNe+8muayoeacieiiq+adoeebruS9v+eUqOeahOmdnuiHqueUseiRl+S9nOadg+aWh+S7tuOAgeayoeacieWhq+WGmeS7u+S9leWQiOeQhuS9v+eUqOS+neaNrueahOmdnuiHqueUseiRl+S9nOadg+aWh+S7ticsXG5cdFx0XHRcdCdGNe+8muaykuacieiiq+aineebruS9v+eUqOeahOmdnuiHqueUseeJiOasiuaqlOahiOOAgeaykuacieWhq+Wvq+S7u+S9leWQiOeQhuS9v+eUqOS+neaTmueahOmdnuiHqueUseeJiOasiuaqlOahiCdcblx0XHRcdCksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tRVzpDU0QjRjV8RjVdXe+8muayoeacieiiq+adoeebruS9v+eUqOeahOmdnuiHqueUseiRl+S9nOadg+aWh+S7tuOAgeayoeacieWhq+WGmeS7u+S9leWQiOeQhuS9v+eUqOS+neaNrueahOmdnuiHqueUseiRl+S9nOadg+aWh+S7ticsXG5cdFx0XHRcdCdbW1FXOkNTRCNGNXxGNV1d77ya5rKS5pyJ6KKr5qKd55uu5L2/55So55qE6Z2e6Ieq55Sx54mI5qyK5qqU5qGI44CB5rKS5pyJ5aGr5a+r5Lu75L2V5ZCI55CG5L2/55So5L6d5pOa55qE6Z2e6Ieq55Sx54mI5qyK5qqU5qGIJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdPMe+8mueUqOaIt+ivt+axguWIoOmZpOiHquW3seeahOeUqOaIt+mhteaIluWFtuWtkOmhtemdoicsXG5cdFx0XHRcdCdPMe+8muS9v+eUqOiAheiri+axguWIqumZpOiHquW3seeahOS9v+eUqOiAhemggemdouaIluWFtuWtkOmggemdoidcblx0XHRcdCksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tRVzpDU0QjTzF8TzFdXe+8mueUqOaIt+ivt+axguWIoOmZpOiHquW3seeahFtbSGVscDrnlKjmiLfpobV855So5oi36aG1XV3miJblhbblrZDpobXpnaLjgIInLFxuXHRcdFx0XHQnW1tRVzpDU0QjTzF8TzFdXe+8muS9v+eUqOiAheiri+axguWIqumZpOiHquW3seeahFtbSGVscDrnlKjmiLfpobV85L2/55So6ICF6aCB6Z2iXV3miJblhbblrZDpoIHpnaLjgIInXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnTzLvvJrnqbrnmoTliIbnsbvvvIjmsqHmnInmnaHnm67kuZ/msqHmnInlrZDliIbnsbvvvIknLCAnTzLvvJrnqbrnmoTliIbpoZ7vvIjmspLmnInmop3nm67kuZ/mspLmnInlrZDliIbpoZ7vvIknKSxcblx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdbW1FXOkNTRCNPMnxPMl1d77ya56m655qE5YiG57G777yI5rKh5pyJ5p2h55uu5Lmf5rKh5pyJ5a2Q5YiG57G777yJ44CCJyxcblx0XHRcdFx0J1tbUVc6Q1NEI08yfE8yXV3vvJrnqbrnmoTliIbpoZ7vvIjmspLmnInmop3nm67kuZ/mspLmnInlrZDliIbpoZ7vvInjgIInXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnTzPvvJrlup/lvIPojYnnqL8nLCAnTzPvvJrlu6Lmo4TojYnnqL8nKSxcblx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ1tbUVc6Q1NEI08zfE8zXV3vvJrlup/lvIPojYnnqL/jgIInLCAnW1tRVzpDU0QjTzN8TzNdXe+8muW7ouajhOiNieeov+OAgicpLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2suY2hhbmdlX2NvbW1vbl9yZWFzb24gPSAoZSkgPT4ge1xuXHRcdGlmIChlLnRhcmdldC5mb3JtLnJlYXNvbi52YWx1ZSAhPT0gJycpIHtcblx0XHRcdGUudGFyZ2V0LmZvcm0ucmVhc29uLnZhbHVlID0gTW9yZWJpdHMuc3RyaW5nLmFwcGVuZFB1bmN0dWF0aW9uKGUudGFyZ2V0LmZvcm0ucmVhc29uLnZhbHVlKTtcblx0XHR9XG5cdFx0ZS50YXJnZXQuZm9ybS5yZWFzb24udmFsdWUgKz0gZS50YXJnZXQudmFsdWU7XG5cdFx0ZS50YXJnZXQudmFsdWUgPSAnJztcblx0fTtcblx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFjay50b2dnbGVTdWJwYWdlcyA9IChlKSA9PiB7XG5cdFx0Y29uc3Qge2Zvcm19ID0gZS50YXJnZXQ7XG5cdFx0bGV0IG5ld1BhZ2VMaXN0O1xuXHRcdGlmIChlLnRhcmdldC5jaGVja2VkKSB7XG5cdFx0XHRmb3JtLmRlbGV0ZV9zdWJwYWdlX3JlZGlyZWN0cy5jaGVja2VkID0gZm9ybS5kZWxldGVfcmVkaXJlY3RzLmNoZWNrZWQ7XG5cdFx0XHRmb3JtLmRlbGV0ZV9zdWJwYWdlX3RhbGtzLmNoZWNrZWQgPSBmb3JtLmRlbGV0ZV90YWxrLmNoZWNrZWQ7XG5cdFx0XHRmb3JtLnVubGlua19zdWJwYWdlcy5jaGVja2VkID0gZm9ybS51bmxpbmtfcGFnZS5jaGVja2VkO1xuXHRcdFx0Ly8gSWYgbGlzdHMgb2Ygc3VicGFnZXMgd2VyZSBhbHJlYWR5IGxvYWRlZCBvbmNlLCB0aGV5IGFyZVxuXHRcdFx0Ly8gYXZhaWxhYmxlIHdpdGhvdXQgdXNlIG9mIGFueSBBUEkgY2FsbHNcblx0XHRcdGlmIChzdWJwYWdlc0xvYWRlZCkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGVsIG9mIFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXMpIHtcblx0XHRcdFx0XHQvLyBHZXQgYmFjayB0aGUgc3ViZ3JvdXAgZnJvbSBzdWJncm91cF8sIHdoZXJlIHdlIHNhdmVkIGl0XG5cdFx0XHRcdFx0aWYgKGVsLnN1Ymdyb3VwID09PSBudWxsICYmIGVsLnN1Ymdyb3VwXykge1xuXHRcdFx0XHRcdFx0ZWwuc3ViZ3JvdXAgPSBlbC5zdWJncm91cF87XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdG5ld1BhZ2VMaXN0ID0gVHdpbmtsZS5iYXRjaGRlbGV0ZS5nZW5lcmF0ZU5ld1BhZ2VMaXN0KGZvcm0pO1xuXHRcdFx0XHQkYm9keS5maW5kKCcjdHctZGJhdGNoLXBhZ2VzJykucmVwbGFjZVdpdGgobmV3UGFnZUxpc3QpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGNoZWNrYm94IG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhuZXdQYWdlTGlzdCwgJ3BhZ2VzJykpIHtcblx0XHRcdFx0XHRnZW5lcmF0ZUFycm93TGlua3MoY2hlY2tib3gpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgY2hlY2tib3ggb2YgTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKG5ld1BhZ2VMaXN0LCAncGFnZXMuc3VicGFnZXMnKSkge1xuXHRcdFx0XHRcdGdlbmVyYXRlQXJyb3dMaW5rcyhjaGVja2JveCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Ly8gUHJvY2VlZCB3aXRoIEFQSSBjYWxscyB0byBnZXQgbGlzdCBvZiBzdWJwYWdlc1xuXHRcdFx0Y29uc3QgbG9hZGluZ1RleHQgPSBgPHN0cm9uZyBpZD1cImRiYXRjaC1zdWJwYWdlLWxvYWRpbmdcIj4ke3dpbmRvdy53Z1VMUygn5Yqg6L295LitLi4uJywgJ+i8ieWFpeS4rS4uLicpfTwvc3Ryb25nPmA7XG5cdFx0XHQkKGUudGFyZ2V0KS5hZnRlcihsb2FkaW5nVGV4dCk7XG5cdFx0XHRjb25zdCBwYWdlcyA9ICQoZm9ybS5wYWdlcylcblx0XHRcdFx0Lm1hcCgoX2ksIGVsKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsLnZhbHVlO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZ2V0KCk7XG5cdFx0XHRjb25zdCBzdWJwYWdlTGlzdGVyID0gbmV3IE1vcmViaXRzLmJhdGNoT3BlcmF0aW9uKCk7XG5cdFx0XHRzdWJwYWdlTGlzdGVyLnNldE9wdGlvbignY2h1bmtTaXplJywgVHdpbmtsZS5nZXRQcmVmKCdiYXRjaENodW5rcycpKTtcblx0XHRcdHN1YnBhZ2VMaXN0ZXIuc2V0UGFnZUxpc3QocGFnZXMpO1xuXHRcdFx0c3VicGFnZUxpc3Rlci5ydW4oXG5cdFx0XHRcdChwYWdlTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHBhZ2VUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhZ2VOYW1lKTtcblx0XHRcdFx0XHQvLyBObyBuZWVkIHRvIGxvb2sgZm9yIHN1YnBhZ2VzIGluIG1haW4vZmlsZS9tZWRpYXdpa2kgc3BhY2Vcblx0XHRcdFx0XHRpZiAoWzAsIDYsIDhdLmluY2x1ZGVzKHBhZ2VUaXRsZS5uYW1lc3BhY2UpKSB7XG5cdFx0XHRcdFx0XHRzdWJwYWdlTGlzdGVyLndvcmtlclN1Y2Nlc3MoKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcWl1d2VuX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo6I635Y+WICcsICfmraPlnKjlj5blvpcgJykgKyBwYWdlTmFtZSArIHdpbmRvdy53Z1VMUygnIOeahOWtkOmhtemdoicsICcg55qE5a2Q6aCB6Z2iJyksXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRcdFx0cHJvcDogJ3JldmlzaW9uc3xpbmZvfGltYWdlaW5mbycsXG5cdFx0XHRcdFx0XHRcdGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0cnZwcm9wOiAnc2l6ZScsXG5cdFx0XHRcdFx0XHRcdGlucHJvcDogJ3Byb3RlY3Rpb24nLFxuXHRcdFx0XHRcdFx0XHRnYXBwcmVmaXg6IGAke3BhZ2VUaXRsZS50aXRsZX0vYCxcblx0XHRcdFx0XHRcdFx0Z2FwbmFtZXNwYWNlOiBwYWdlVGl0bGUubmFtZXNwYWNlLFxuXHRcdFx0XHRcdFx0XHRnYXBsaW1pdDogJ21heCcsXG5cdFx0XHRcdFx0XHRcdHBhZ2VOYW1lRnVsbDogcGFnZU5hbWUsIC8vIE5vdCB1c2VkIGJ5IEFQSSwgYnV0IGFkZGVkIGZvciBhY2Nlc3MgaW4gb25TdWNjZXNzKClcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQoYXBpb2JqKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHhtbCA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdFx0XHRcdFx0Y29uc3QgJHBhZ2VzID0gJCh4bWwpLmZpbmQoJ3BhZ2UnKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VicGFnZUxpc3QgPSBbXTtcblx0XHRcdFx0XHRcdFx0JHBhZ2VzLmVhY2goKF9pbmRleCwgcGFnZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0ICRwYWdlID0gJChwYWdlKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBucyA9ICRwYWdlLmF0dHIoJ25zJyk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGl0bGUgPSAkcGFnZS5hdHRyKCd0aXRsZScpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlzUmVkaXIgPSAkcGFnZS5hdHRyKCdyZWRpcmVjdCcpID09PSAnJztcblx0XHRcdFx0XHRcdFx0XHRjb25zdCAkZWRpdHByb3QgPSAkcGFnZS5maW5kKCdwclt0eXBlPVwiZWRpdFwiXVtsZXZlbD1cInN5c29wXCJdJyk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaXNQcm90ZWN0ZWQgPSAkZWRpdHByb3QubGVuZ3RoID4gMDtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzaXplID0gJHBhZ2UuZmluZCgncmV2JykuYXR0cignc2l6ZScpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1ldGFkYXRhID0gW107XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGlzUmVkaXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGFkYXRhW21ldGFkYXRhLmxlbmd0aF0gPSAncmVkaXJlY3QnO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAoaXNQcm90ZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGFkYXRhW21ldGFkYXRhLmxlbmd0aF0gPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WFqOS/neaKpO+8jCcsICflhajkv53orbfvvIwnKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCgkZWRpdHByb3QuYXR0cignZXhwaXJ5JykgPT09ICdpbmZpbml0eSdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IHdpbmRvdy53Z1VMUygn5peg6ZmQ5pyfJywgJ+eEoemZkOacnycpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBgJHtuZXcgTW9yZWJpdHMuZGF0ZSgkZWRpdHByb3QuYXR0cignZXhwaXJ5JykpLmNhbGVuZGFyKCd1dGMnKX0gKFVUQylgKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6L+H5pyfJywgJ+mBjuacnycpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRpZiAobnMgPT09ICc2Jykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gbWltaWMgd2hhdCBkZWxpbWFnZXMgdXNlZCB0byBzaG93IGZvciBmaWxlc1xuXHRcdFx0XHRcdFx0XHRcdFx0bWV0YWRhdGFbbWV0YWRhdGEubGVuZ3RoXSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh3aW5kb3cud2dVTFMoJ+S4iuS8oOiAhe+8micsICfkuIrlgrPogIXvvJonKSArICRwYWdlLmZpbmQoJ2lpJykuYXR0cigndXNlcicpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+acgOWQjue8lui+ke+8micsICfmnIDlvoznt6jovK/vvJonKSArICRwYWdlLmZpbmQoJ3JldicpLmF0dHIoJ3VzZXInKSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGFkYXRhW21ldGFkYXRhLmxlbmd0aF0gPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKHNpemUpICsgd2luZG93LndnVUxTKCflrZfoioInLCAn5L2N5YWD57WEJyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHN1YnBhZ2VMaXN0W3N1YnBhZ2VMaXN0Lmxlbmd0aF0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogdGl0bGUgKyAobWV0YWRhdGEubGVuZ3RoID8gYCAoJHttZXRhZGF0YS5qb2luKCc7ICcpfSlgIDogJycpLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHRpdGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdHN0eWxlOiBpc1Byb3RlY3RlZCA/ICdjb2xvcjogI2YwMCcgOiAnJyxcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKHN1YnBhZ2VMaXN0Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHBhZ2VOYW1lXyA9IGFwaW9iai5xdWVyeS5wYWdlTmFtZUZ1bGw7XG5cdFx0XHRcdFx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5wYWdlc1twYWdlTmFtZV9dLnN1Ymdyb3VwID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdzdWJwYWdlcycsXG5cdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICdkYmF0Y2gtc3VicGFnZXMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0c2hpZnRDbGlja1N1cHBvcnQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0OiBzdWJwYWdlTGlzdCxcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHN1YnBhZ2VMaXN0ZXIud29ya2VyU3VjY2VzcygpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG51bGwgLyogc3RhdHVzRWxlbWVudCAqLyxcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0c3VicGFnZUxpc3Rlci53b3JrZXJGYWlsdXJlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRxaXV3ZW5fYXBpLnBvc3QoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdC8vIExpc3QgJ2VtIG9uIHRoZSBpbnRlcmZhY2Vcblx0XHRcdFx0XHRuZXdQYWdlTGlzdCA9IFR3aW5rbGUuYmF0Y2hkZWxldGUuZ2VuZXJhdGVOZXdQYWdlTGlzdChmb3JtKTtcblx0XHRcdFx0XHQkYm9keS5maW5kKCcjdHctZGJhdGNoLXBhZ2VzJykucmVwbGFjZVdpdGgobmV3UGFnZUxpc3QpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hlY2tib3ggb2YgTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKG5ld1BhZ2VMaXN0LCAncGFnZXMnKSkge1xuXHRcdFx0XHRcdFx0Z2VuZXJhdGVBcnJvd0xpbmtzKGNoZWNrYm94KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMobmV3UGFnZUxpc3QsICdwYWdlcy5zdWJwYWdlcycpKSB7XG5cdFx0XHRcdFx0XHRnZW5lcmF0ZUFycm93TGlua3MoY2hlY2tib3gpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdWJwYWdlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIFwiTG9hZGluZy4uLiBcIiB0ZXh0XG5cdFx0XHRcdFx0JGJvZHkuZmluZCgnI2RiYXRjaC1zdWJwYWdlLWxvYWRpbmcnKS5yZW1vdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKCFlLnRhcmdldC5jaGVja2VkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVsIG9mIFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXMpIHtcblx0XHRcdFx0aWYgKGVsLnN1Ymdyb3VwKSB7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHN1Ymdyb3VwIGFmdGVyIHNhdmluZyBpdHMgY29udGVudHMgaW4gc3ViZ3JvdXBfXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGVhc2lseSBpZiB1c2VyIGRlY2lkZXMgdG9cblx0XHRcdFx0XHQvLyBkZWxldGUgdGhlIHN1YnBhZ2VzIGFnYWluXG5cdFx0XHRcdFx0ZWwuc3ViZ3JvdXBfID0gZWwuc3ViZ3JvdXA7XG5cdFx0XHRcdFx0ZWwuc3ViZ3JvdXAgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRuZXdQYWdlTGlzdCA9IFR3aW5rbGUuYmF0Y2hkZWxldGUuZ2VuZXJhdGVOZXdQYWdlTGlzdChmb3JtKTtcblx0XHRcdCRib2R5LmZpbmQoJyN0dy1kYmF0Y2gtcGFnZXMnKS5yZXBsYWNlV2l0aChuZXdQYWdlTGlzdCk7XG5cdFx0XHRmb3IgKGNvbnN0IGNoZWNrYm94IG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhuZXdQYWdlTGlzdCwgJ3BhZ2VzJykpIHtcblx0XHRcdFx0Z2VuZXJhdGVBcnJvd0xpbmtzKGNoZWNrYm94KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2suZXZhbHVhdGUgPSAoZXZlbnQpID0+IHtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+aJuemHj+WIoOmZpOW3suWujOaIkCcsICfmibnmrKHliKrpmaTlt7LlrozmiJAnKTtcblx0XHRjb25zdCBmb3JtID0gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnN0IG51bVByb3RlY3RlZCA9ICQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGZvcm0sICdwYWdlcycpKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIGVsZW1lbnQuY2hlY2tlZCAmJiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS5jb2xvciA9PT0gJ3JlZCc7XG5cdFx0fSkubGVuZ3RoO1xuXHRcdGlmIChcblx0XHRcdG51bVByb3RlY3RlZCA+IDAgJiZcblx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aCqOato+imgeWIoOmZpCAnLCAn5oKo5q2j6KaB5Yiq6ZmkICcpICtcblx0XHRcdFx0XHRtdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKG51bVByb3RlY3RlZCkgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOS4quWFqOS/neaKpOmhtemdou+8jOaCqOehruWumuWQl++8nycsICcg5YCL5YWo5L+d6K236aCB6Z2i77yM5oKo56K65a6a5ZeO77yfJylcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcGFnZXMgPSBmb3JtLmdldENoZWNrZWQoJ3BhZ2VzJyk7XG5cdFx0Y29uc3Qgc3VicGFnZXMgPSBmb3JtLmdldENoZWNrZWQoJ3BhZ2VzLnN1YnBhZ2VzJyk7XG5cdFx0Y29uc3QgcmVhc29uID0gZm9ybS5yZWFzb24udmFsdWU7XG5cdFx0Y29uc3QgZGVsZXRlX3BhZ2UgPSBmb3JtLmRlbGV0ZV9wYWdlLmNoZWNrZWQ7XG5cdFx0bGV0IGRlbGV0ZV90YWxrO1xuXHRcdGxldCBkZWxldGVfcmVkaXJlY3RzO1xuXHRcdGxldCBkZWxldGVfc3VicGFnZXM7XG5cdFx0bGV0IGRlbGV0ZV9zdWJwYWdlX3JlZGlyZWN0cztcblx0XHRsZXQgZGVsZXRlX3N1YnBhZ2VfdGFsa3M7XG5cdFx0bGV0IHVubGlua19zdWJwYWdlcztcblx0XHRpZiAoZGVsZXRlX3BhZ2UpIHtcblx0XHRcdGRlbGV0ZV90YWxrID0gZm9ybS5kZWxldGVfdGFsay5jaGVja2VkO1xuXHRcdFx0ZGVsZXRlX3JlZGlyZWN0cyA9IGZvcm0uZGVsZXRlX3JlZGlyZWN0cy5jaGVja2VkO1xuXHRcdFx0ZGVsZXRlX3N1YnBhZ2VzID0gZm9ybS5kZWxldGVfc3VicGFnZXMuY2hlY2tlZDtcblx0XHRcdGlmIChkZWxldGVfc3VicGFnZXMpIHtcblx0XHRcdFx0ZGVsZXRlX3N1YnBhZ2VfcmVkaXJlY3RzID0gZm9ybS5kZWxldGVfc3VicGFnZV9yZWRpcmVjdHMuY2hlY2tlZDtcblx0XHRcdFx0ZGVsZXRlX3N1YnBhZ2VfdGFsa3MgPSBmb3JtLmRlbGV0ZV9zdWJwYWdlX3RhbGtzLmNoZWNrZWQ7XG5cdFx0XHRcdHVubGlua19zdWJwYWdlcyA9IGZvcm0udW5saW5rX3N1YnBhZ2VzLmNoZWNrZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IHVubGlua19wYWdlID0gZm9ybS51bmxpbmtfcGFnZS5jaGVja2VkO1xuXHRcdGNvbnN0IHVubGlua19maWxlID0gZm9ybS51bmxpbmtfZmlsZS5jaGVja2VkO1xuXHRcdGlmICghcmVhc29uKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+aCqOmcgOimgee7meWHuuS4gOS4queQhueUsScsICfmgqjpnIDopoHntablh7rkuIDlgIvnkIbnlLEnKSwge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3R3aW5rbGViYXRjaGRlbGV0ZScsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRpZiAoIXBhZ2VzKSB7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuZXJyb3IoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn6ZSZ6K+vJywgJ+mMr+iqpCcpLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ayoeacieimgeWIoOmZpOeahOWGheWuue+8jOS4reatoicsICfmspLmnInopoHliKrpmaTnmoTlhaflrrnvvIzkuK3mraInKVxuXHRcdFx0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcGFnZURlbGV0ZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oXG5cdFx0XHRkZWxldGVfcGFnZVxuXHRcdFx0XHQ/IHdpbmRvdy53Z1VMUygn5q2j5Zyo5Yig6Zmk6aG16Z2iJywgJ+ato+WcqOWIqumZpOmggemdoicpXG5cdFx0XHRcdDogd2luZG93LndnVUxTKCfmraPlnKjlkK/liqjopoHmsYLnmoTku7vliqEnLCAn5q2j5Zyo5ZWf5YuV6KaB5rGC55qE5Lu75YuZJylcblx0XHQpO1xuXHRcdHBhZ2VEZWxldGVyLnNldE9wdGlvbignY2h1bmtTaXplJywgVHdpbmtsZS5nZXRQcmVmKCdiYXRjaENodW5rcycpKTtcblx0XHQvLyB3ZSBvbmx5IG5lZWQgdGhlIGluaXRpYWwgc3RhdHVzIGxpbmVzIGlmIHdlJ3JlIGRlbGV0aW5nIHRoZSBwYWdlcyBpbiB0aGUgcGFnZXMgYXJyYXlcblx0XHRwYWdlRGVsZXRlci5zZXRPcHRpb24oJ3ByZXNlcnZlSW5kaXZpZHVhbFN0YXR1c0xpbmVzJywgZGVsZXRlX3BhZ2UpO1xuXHRcdHBhZ2VEZWxldGVyLnNldFBhZ2VMaXN0KHBhZ2VzKTtcblx0XHRwYWdlRGVsZXRlci5ydW4oXG5cdFx0XHQocGFnZU5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0XHRcdHBhZ2U6IHBhZ2VOYW1lLFxuXHRcdFx0XHRcdGRlbGV0ZV9wYWdlLFxuXHRcdFx0XHRcdGRlbGV0ZV90YWxrLFxuXHRcdFx0XHRcdGRlbGV0ZV9yZWRpcmVjdHMsXG5cdFx0XHRcdFx0dW5saW5rX3BhZ2UsXG5cdFx0XHRcdFx0dW5saW5rX2ZpbGU6IHVubGlua19maWxlICYmIG5ldyBSZWdFeHAoYF4ke01vcmViaXRzLm5hbWVzcGFjZVJlZ2V4KDYpfTpgLCAnaScpLnRlc3QocGFnZU5hbWUpLFxuXHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHRwYWdlRGVsZXRlcixcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdHBhZ2VOYW1lLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo5Yig6Zmk6aG16Z2iICcsICfmraPlnKjliKrpmaTpoIHpnaIgJykgKyBwYWdlTmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0aWYgKGRlbGV0ZV9wYWdlKSB7XG5cdFx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0RWRpdFN1bW1hcnkoYCR7cmVhc29ufe+8iOaJuemHj++8iWApO1xuXHRcdFx0XHRcdHFpdXdlbl9wYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0XHRxaXV3ZW5fcGFnZS5zdXBwcmVzc1Byb3RlY3RXYXJuaW5nKCk7XG5cdFx0XHRcdFx0cWl1d2VuX3BhZ2UuZGVsZXRlUGFnZShUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrcy5kb0V4dHJhcywgcGFnZURlbGV0ZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFja3MuZG9FeHRyYXMocWl1d2VuX3BhZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRpZiAoZGVsZXRlX3N1YnBhZ2VzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3VicGFnZURlbGV0ZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpOWtkOmhtemdoicsICfmraPlnKjliKrpmaTlrZDpoIHpnaInKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0c3VicGFnZURlbGV0ZXIuc2V0T3B0aW9uKCdjaHVua1NpemUnLCBUd2lua2xlLmdldFByZWYoJ2JhdGNoQ2h1bmtzJykpO1xuXHRcdFx0XHRcdHN1YnBhZ2VEZWxldGVyLnNldE9wdGlvbigncHJlc2VydmVJbmRpdmlkdWFsU3RhdHVzTGluZXMnLCB0cnVlKTtcblx0XHRcdFx0XHRzdWJwYWdlRGVsZXRlci5zZXRQYWdlTGlzdChzdWJwYWdlcyk7XG5cdFx0XHRcdFx0c3VicGFnZURlbGV0ZXIucnVuKChwYWdlTmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0XHRwYWdlOiBwYWdlTmFtZSxcblx0XHRcdFx0XHRcdFx0ZGVsZXRlX3BhZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZV90YWxrOiBkZWxldGVfc3VicGFnZV90YWxrcyxcblx0XHRcdFx0XHRcdFx0ZGVsZXRlX3JlZGlyZWN0czogZGVsZXRlX3N1YnBhZ2VfcmVkaXJlY3RzLFxuXHRcdFx0XHRcdFx0XHR1bmxpbmtfcGFnZTogdW5saW5rX3N1YnBhZ2VzLFxuXHRcdFx0XHRcdFx0XHR1bmxpbmtfZmlsZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHRcdFx0cGFnZURlbGV0ZXI6IHN1YnBhZ2VEZWxldGVyLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdFx0cGFnZU5hbWUsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo5Yig6Zmk5a2Q6aG16Z2iICcsICfmraPlnKjliKrpmaTlrZDpoIHpnaIgJykgKyBwYWdlTmFtZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHFpdXdlbl9wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0RWRpdFN1bW1hcnkoYCR7cmVhc29ufe+8iOaJuemHj++8iWApO1xuXHRcdFx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdFx0cWl1d2VuX3BhZ2Uuc3VwcHJlc3NQcm90ZWN0V2FybmluZygpO1xuXHRcdFx0XHRcdFx0cWl1d2VuX3BhZ2UuZGVsZXRlUGFnZShUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrcy5kb0V4dHJhcywgcGFnZURlbGV0ZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHQpO1xuXHR9O1xuXHRUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrcyA9IHtcblx0XHQvLyB0aGlzIHN0dXBpZCBwYXJhbWV0ZXIgbmFtZSBpcyBhIHRlbXBvcmFyeSB0aGluZyB1bnRpbCBJIGltcGxlbWVudCBhbiBvdmVyaGF1bFxuXHRcdC8vIG9mIE1vcmViaXRzLndpa2kuKiBjYWxsYmFjayBwYXJhbWV0ZXJzXG5cdFx0ZG9FeHRyYXM6ICh0aGluZ1dpdGhQYXJhbWV0ZXJzKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSB0aGluZ1dpdGhQYXJhbWV0ZXJzLnBhcmVudFxuXHRcdFx0XHQ/IHRoaW5nV2l0aFBhcmFtZXRlcnMucGFyZW50LmdldENhbGxiYWNrUGFyYW1ldGVycygpXG5cdFx0XHRcdDogdGhpbmdXaXRoUGFyYW1ldGVycy5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdC8vIHRoZSBpbml0aWFsIGJhdGNoIG9wZXJhdGlvbidzIGpvYiBpcyB0byBkZWxldGUgdGhlIHBhZ2UsIGFuZCB0aGF0IGhhc1xuXHRcdFx0Ly8gc3VjY2VlZGVkIGJ5IG5vd1xuXHRcdFx0cGFyYW1zLnBhZ2VEZWxldGVyLndvcmtlclN1Y2Nlc3ModGhpbmdXaXRoUGFyYW1ldGVycyk7XG5cdFx0XHRsZXQgcXVlcnk7XG5cdFx0XHRsZXQgcWl1d2VuX2FwaTtcblx0XHRcdGlmIChwYXJhbXMudW5saW5rX3BhZ2UpIHtcblx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS51bmxpbmtDYWNoZSA9IHt9O1xuXHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0bGlzdDogJ2JhY2tsaW5rcycsXG5cdFx0XHRcdFx0YmxmaWx0ZXJyZWRpcjogJ25vbnJlZGlyZWN0cycsXG5cdFx0XHRcdFx0YmxuYW1lc3BhY2U6IFswXSxcblx0XHRcdFx0XHRibHRpdGxlOiBwYXJhbXMucGFnZSxcblx0XHRcdFx0XHRibGxpbWl0OiAnbWF4JywgLy8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRxaXV3ZW5fYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo6I635Y+W6ZO+5YWlJywgJ+ato+WcqOWPluW+l+mAo+WFpScpLFxuXHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2tzLnVubGlua0JhY2tsaW5rc01haW5cblx0XHRcdFx0KTtcblx0XHRcdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSBwYXJhbXM7XG5cdFx0XHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy51bmxpbmtfZmlsZSkge1xuXHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0bGlzdDogJ2ltYWdldXNhZ2UnLFxuXHRcdFx0XHRcdGl1dGl0bGU6IHBhcmFtcy5wYWdlLFxuXHRcdFx0XHRcdGl1bGltaXQ6ICdtYXgnLCAvLyA1MDAgaXMgbWF4IGZvciBub3JtYWwgdXNlcnMsIDUwMDAgZm9yIGJvdHMgYW5kIHN5c29wc1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHFpdXdlbl9hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjojrflj5bmlofku7bpk77lhaUnLCAn5q2j5Zyo5Y+W5b6X5qqU5qGI6YCj5YWlJyksXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFja3MudW5saW5rSW1hZ2VJbnN0YW5jZXNNYWluXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHFpdXdlbl9hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdFx0XHRxaXV3ZW5fYXBpLnBvc3QoKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMuZGVsZXRlX3BhZ2UpIHtcblx0XHRcdFx0aWYgKHBhcmFtcy5kZWxldGVfcmVkaXJlY3RzKSB7XG5cdFx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHR0aXRsZXM6IHBhcmFtcy5wYWdlLFxuXHRcdFx0XHRcdFx0cHJvcDogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0XHRyZGxpbWl0OiAnbWF4JywgLy8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cWl1d2VuX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo6I635Y+W6YeN5a6a5ZCRJywgJ+ato+WcqOWPluW+l+mHjeaWsOWwjuWQkScpLFxuXHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrcy5kZWxldGVSZWRpcmVjdHNNYWluXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRxaXV3ZW5fYXBpLnBhcmFtcyA9IHBhcmFtcztcblx0XHRcdFx0XHRxaXV3ZW5fYXBpLnBvc3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocGFyYW1zLmRlbGV0ZV90YWxrKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFnZVRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFyYW1zLnBhZ2UpO1xuXHRcdFx0XHRcdGlmIChwYWdlVGl0bGUgJiYgcGFnZVRpdGxlLm5hbWVzcGFjZSAlIDIgPT09IDAgJiYgcGFnZVRpdGxlLm5hbWVzcGFjZSAhPT0gMikge1xuXHRcdFx0XHRcdFx0cGFnZVRpdGxlLm5hbWVzcGFjZSsrOyAvLyBub3cgcGFnZVRpdGxlIGlzIHRoZSB0YWxrIHBhZ2UgdGl0bGUhXG5cdFx0XHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0XHR0aXRsZXM6IHBhZ2VUaXRsZS50b1RleHQoKSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRxaXV3ZW5fYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOajgOafpeiuqOiuuumhtemdouaYr+WQpuWtmOWcqCcsICfmraPlnKjmqqLmn6XoqI7oq5bpoIHpnaLmmK/lkKblrZjlnKgnKSxcblx0XHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2tzLmRlbGV0ZVRhbGtcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxaXV3ZW5fYXBpLnBhcmFtcyA9IHBhcmFtcztcblx0XHRcdFx0XHRcdHFpdXdlbl9hcGkucGFyYW1zLnRhbGtQYWdlID0gcGFnZVRpdGxlLnRvVGV4dCgpO1xuXHRcdFx0XHRcdFx0cWl1d2VuX2FwaS5wb3N0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkZWxldGVSZWRpcmVjdHNNYWluOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCBwYWdlcyA9ICQoeG1sKVxuXHRcdFx0XHQuZmluZCgncmQnKVxuXHRcdFx0XHQubWFwKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gJChlbGVtZW50KS5hdHRyKCd0aXRsZScpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZ2V0KCk7XG5cdFx0XHRpZiAoIXBhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWRpcmVjdERlbGV0ZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo5Yig6Zmk5YiwICcsICfmraPlnKjliKrpmaTliLAgJykgK1xuXHRcdFx0XHRcdGFwaW9iai5wYXJhbXMucGFnZSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCcg55qE6YeN5a6a5ZCRJywgJyDnmoTph43mlrDlsI7lkJEnKVxuXHRcdFx0KTtcblx0XHRcdHJlZGlyZWN0RGVsZXRlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hDaHVua3MnKSk7XG5cdFx0XHRyZWRpcmVjdERlbGV0ZXIuc2V0UGFnZUxpc3QocGFnZXMpO1xuXHRcdFx0cmVkaXJlY3REZWxldGVyLnJ1bigocGFnZU5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHBhZ2VOYW1lLCB3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpCAnLCAn5q2j5Zyo5Yiq6ZmkICcpICsgcGFnZU5hbWUpO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0XHRgW1tRVzpDU0QjRzl8RzldXTogJHt3aW5kb3cud2dVTFMoJ+aMh+WQkeW3suWIoOmhtemdouKAnCcsICfmjIflkJHlt7LliKrpoIHpnaLjgIwnKX0ke2FwaW9iai5wYXJhbXMucGFnZX0ke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfigJ3nmoTph43lrprlkJEnLFxuXHRcdFx0XHRcdFx0J+OAjeeahOmHjeaWsOWwjuWQkSdcblx0XHRcdFx0XHQpfWBcblx0XHRcdFx0KTtcblx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5kZWxldGVQYWdlKHJlZGlyZWN0RGVsZXRlci53b3JrZXJTdWNjZXNzLCByZWRpcmVjdERlbGV0ZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGRlbGV0ZVRhbGs6IChhcGlvYmopID0+IHtcblx0XHRcdGNvbnN0IHhtbCA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdGNvbnN0IGV4aXN0cyA9ICQoeG1sKS5maW5kKCdwYWdlOm5vdChbbWlzc2luZ10pJykubGVuZ3RoID4gMDtcblx0XHRcdGlmICghZXhpc3RzKSB7XG5cdFx0XHRcdC8vIG5vIHRhbGsgcGFnZTsgZm9yZ2V0IGFib3V0IGl0XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRhcGlvYmoucGFyYW1zLnRhbGtQYWdlLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpOmhtemdoiAnLCAn5q2j5Zyo5Yiq6Zmk6aCB6Z2iICcpICtcblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLnBhZ2UgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOeahOiuqOiuuumhtScsICcg55qE6KiO6KuW6aCBJylcblx0XHRcdCk7XG5cdFx0XHRwYWdlLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRgW1tRVzpDU0QjRzl8RzldXTogJHt3aW5kb3cud2dVTFMoJ+W3suWIoOmhtemdouKAnCcsICflt7LliKrpoIHpnaLjgIwnKX0ke2FwaW9iai5wYXJhbXMucGFnZX0ke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn4oCd55qEW1tIZWxwOuiuqOiuuumhtXzorqjorrrpobVdXScsXG5cdFx0XHRcdFx0J+OAjeeahFtbSGVscDroqI7oq5bpoIF86KiO6KuW6aCBXV0nXG5cdFx0XHRcdCl9YFxuXHRcdFx0KTtcblx0XHRcdHBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZS5kZWxldGVQYWdlKCk7XG5cdFx0fSxcblx0XHR1bmxpbmtCYWNrbGlua3NNYWluOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCBwYWdlcyA9ICQoeG1sKVxuXHRcdFx0XHQuZmluZCgnYmwnKVxuXHRcdFx0XHQubWFwKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gJChlbGVtZW50KS5hdHRyKCd0aXRsZScpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZ2V0KCk7XG5cdFx0XHRpZiAoIXBhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB1bmxpbmtlciA9IG5ldyBNb3JlYml0cy5iYXRjaE9wZXJhdGlvbihcblx0XHRcdFx0YOato+WcqOWPlua2iOWIsCAke2FwaW9iai5wYXJhbXMucGFnZX0ke3dpbmRvdy53Z1VMUygnIOeahOmTvuWFpScsICcg55qE6YCj5YWlJyl9YFxuXHRcdFx0KTtcblx0XHRcdHVubGlua2VyLnNldE9wdGlvbignY2h1bmtTaXplJywgVHdpbmtsZS5nZXRQcmVmKCdiYXRjaENodW5rcycpKTtcblx0XHRcdHVubGlua2VyLnNldFBhZ2VMaXN0KHBhZ2VzKTtcblx0XHRcdHVubGlua2VyLnJ1bigocGFnZU5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdHBhZ2VOYW1lLFxuXHRcdFx0XHRcdGDmraPlnKjlj5bmtoggJHtwYWdlTmFtZX0ke3dpbmRvdy53Z1VMUygnIOS4iueahOmTvuWFpScsICcg5LiK55qE6YCj5YWlJyl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRcdFx0Li4uYXBpb2JqLnBhcmFtcyxcblx0XHRcdFx0fTtcblx0XHRcdFx0cGFyYW1zLnRpdGxlID0gcGFnZU5hbWU7XG5cdFx0XHRcdHBhcmFtcy51bmxpbmtlciA9IHVubGlua2VyO1xuXHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0cWl1d2VuX3BhZ2UubG9hZChUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrcy51bmxpbmtCYWNrbGlua3MpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHR1bmxpbmtCYWNrbGlua3M6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0aWYgKCFwYWdlb2JqLmV4aXN0cygpKSB7XG5cdFx0XHRcdC8vIHdlIHByb2JhYmx5IGp1c3QgZGVsZXRlZCBpdCwgYXMgYSByZWN1cnNpdmUgYmFja2xpbmtcblx0XHRcdFx0cGFyYW1zLnVubGlua2VyLndvcmtlclN1Y2Nlc3MocGFnZW9iaik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCB0ZXh0O1xuXHRcdFx0aWYgKHBhcmFtcy50aXRsZSBpbiBUd2lua2xlLmJhdGNoZGVsZXRlLnVubGlua0NhY2hlKSB7XG5cdFx0XHRcdHRleHQgPSBUd2lua2xlLmJhdGNoZGVsZXRlLnVubGlua0NhY2hlW3BhcmFtcy50aXRsZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb2xkX3RleHQgPSB0ZXh0O1xuXHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraXRleHQucGFnZSh0ZXh0KTtcblx0XHRcdHRleHQgPSBxaXV3ZW5fcGFnZS5yZW1vdmVMaW5rKHBhcmFtcy5wYWdlKS5nZXRUZXh0KCk7XG5cdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLnVubGlua0NhY2hlW3BhcmFtcy50aXRsZV0gPSB0ZXh0O1xuXHRcdFx0aWYgKHRleHQgPT09IG9sZF90ZXh0KSB7XG5cdFx0XHRcdC8vIE5vdGhpbmcgdG8gZG8sIHJldHVyblxuXHRcdFx0XHRwYXJhbXMudW5saW5rZXIud29ya2VyU3VjY2VzcyhwYWdlb2JqKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0d2luZG93LndnVUxTKCflj5bmtojliLDlt7LliKDpobXpnaInLCAn5Y+W5raI5Yiw5bey5Yiq6aCB6Z2iJykgKyBwYXJhbXMucGFnZSArIHdpbmRvdy53Z1VMUygn55qE6ZO+5YWlJywgJ+eahOmAo+WFpScpXG5cdFx0XHQpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdFx0cGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ25vY3JlYXRlJyk7XG5cdFx0XHRwYWdlb2JqLnNldE1heENvbmZsaWN0UmV0cmllcygxMCk7XG5cdFx0XHRwYWdlb2JqLnNhdmUocGFyYW1zLnVubGlua2VyLndvcmtlclN1Y2Nlc3MsIHBhcmFtcy51bmxpbmtlci53b3JrZXJGYWlsdXJlKTtcblx0XHR9LFxuXHRcdHVubGlua0ltYWdlSW5zdGFuY2VzTWFpbjogKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgeG1sID0gYXBpb2JqLnJlc3BvbnNlWE1MO1xuXHRcdFx0Y29uc3QgcGFnZXMgPSAkKHhtbClcblx0XHRcdFx0LmZpbmQoJ2l1Jylcblx0XHRcdFx0Lm1hcCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuICQoZWxlbWVudCkuYXR0cigndGl0bGUnKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmdldCgpO1xuXHRcdFx0aWYgKCFwYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdW5saW5rZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oXG5cdFx0XHRcdGDmraPlnKjlj5bmtojliLAgJHthcGlvYmoucGFyYW1zLnBhZ2V9JHt3aW5kb3cud2dVTFMoJyDnmoTpk77lhaUnLCAnIOeahOmAo+WFpScpfWBcblx0XHRcdCk7XG5cdFx0XHR1bmxpbmtlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hDaHVua3MnKSk7XG5cdFx0XHR1bmxpbmtlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0XHR1bmxpbmtlci5ydW4oKHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRwYWdlTmFtZSxcblx0XHRcdFx0XHRg5Y+W5raIICR7cGFnZU5hbWV9JHt3aW5kb3cud2dVTFMoJyDnmoTmlofku7bkvb/nlKgnLCAnIOeahOaqlOahiOS9v+eUqCcpfWBcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0XHRcdC4uLmFwaW9iai5wYXJhbXMsXG5cdFx0XHRcdH07XG5cdFx0XHRcdHBhcmFtcy50aXRsZSA9IHBhZ2VOYW1lO1xuXHRcdFx0XHRwYXJhbXMudW5saW5rZXIgPSB1bmxpbmtlcjtcblx0XHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRcdHFpdXdlbl9wYWdlLmxvYWQoVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFja3MudW5saW5rSW1hZ2VJbnN0YW5jZXMpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHR1bmxpbmtJbWFnZUluc3RhbmNlczogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRpZiAoIXBhZ2VvYmouZXhpc3RzKCkpIHtcblx0XHRcdFx0Ly8gd2UgcHJvYmFibHkganVzdCBkZWxldGVkIGl0LCBhcyBhIHJlY3Vyc2l2ZSBiYWNrbGlua1xuXHRcdFx0XHRwYXJhbXMudW5saW5rZXIud29ya2VyU3VjY2VzcyhwYWdlb2JqKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBwYXJhbXMucGFnZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4ke01vcmViaXRzLm5hbWVzcGFjZVJlZ2V4KDYpfTpgKSwgJycpO1xuXHRcdFx0bGV0IHRleHQ7XG5cdFx0XHRpZiAocGFyYW1zLnRpdGxlIGluIFR3aW5rbGUuYmF0Y2hkZWxldGUudW5saW5rQ2FjaGUpIHtcblx0XHRcdFx0dGV4dCA9IFR3aW5rbGUuYmF0Y2hkZWxldGUudW5saW5rQ2FjaGVbcGFyYW1zLnRpdGxlXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvbGRfdGV4dCA9IHRleHQ7XG5cdFx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpdGV4dC5wYWdlKHRleHQpO1xuXHRcdFx0dGV4dCA9IHFpdXdlbl9wYWdlXG5cdFx0XHRcdC5jb21tZW50T3V0SW1hZ2UoaW1hZ2UsIHdpbmRvdy53Z1VMUygn5Zug5paH5Lu25bey5Yig77yM5pWF5rOo6KejJywgJ+WboOaqlOahiOW3suWIqu+8jOaVheiou+inoycpKVxuXHRcdFx0XHQuZ2V0VGV4dCgpO1xuXHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS51bmxpbmtDYWNoZVtwYXJhbXMudGl0bGVdID0gdGV4dDtcblx0XHRcdGlmICh0ZXh0ID09PSBvbGRfdGV4dCkge1xuXHRcdFx0XHRwYWdlb2JqXG5cdFx0XHRcdFx0LmdldFN0YXR1c0VsZW1lbnQoKVxuXHRcdFx0XHRcdC5lcnJvcihcblx0XHRcdFx0XHRcdGDlnKggJHtwYWdlb2JqLmdldFBhZ2VOYW1lKCl9IOS4iuWPlua2iCAke2ltYWdlfSR7d2luZG93LndnVUxTKCcg55qE5paH5Lu25L2/55So5aSx6LSlJywgJyDnmoTmqpTmoYjkvb/nlKjlpLHmlZcnKX1gXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0cGFyYW1zLnVubGlua2VyLndvcmtlckZhaWx1cmUocGFnZW9iaik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5Y+W5raI5L2/55So5bey6KKr5Yig6Zmk5paH5Lu2JywgJ+WPlua2iOS9v+eUqOW3suiiq+WIqumZpOaqlOahiCcpICtcblx0XHRcdFx0XHRpbWFnZSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfvvIzlm6DkuLrvvJonLCAn77yM5Zug54K677yaJykgK1xuXHRcdFx0XHRcdHBhcmFtcy5yZWFzb25cblx0XHRcdCk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2V0TWF4Q29uZmxpY3RSZXRyaWVzKDEwKTtcblx0XHRcdHBhZ2VvYmouc2F2ZShwYXJhbXMudW5saW5rZXIud29ya2VyU3VjY2VzcywgcGFyYW1zLnVubGlua2VyLndvcmtlckZhaWx1cmUpO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuYmF0Y2hkZWxldGUsICdiYXRjaGRlbGV0ZScpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGViYXRjaHVuZGVsZXRlLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWJhdGNodW5kZWxldGUoJCkge1xuXHQvKipcblx0ICogdHdpbmtsZWJhdGNodW5kZWxldGUuanM6IEJhdGNoIHVuZGVsZXRlIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJVbmQtYmF0Y2hcIilcblx0ICogQWN0aXZlIG9uOiBFeGlzdGluZyB1c2VyIGFuZCBwcm9qZWN0IHBhZ2VzXG5cdCAqL1xuXHRUd2lua2xlLmJhdGNodW5kZWxldGUgPSAoKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0IU1vcmViaXRzLnVzZXJJc1N5c29wIHx8XG5cdFx0XHQhbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSB8fFxuXHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgIT09IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlSWRzJykudXNlciAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpLnByb2plY3QpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRUd2lua2xlLmJhdGNodW5kZWxldGUuY2FsbGJhY2ssXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+aJueWkjScsICfmibnlvqknKSxcblx0XHRcdCd0dy1iYXRjaC11bmRlbCcsXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WPjeWIoOmZpOmhtemdoicsICflj43liKrpmaTpoIHpnaInKVxuXHRcdCk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2h1bmRlbGV0ZS5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgNDAwKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+aJuemHj+WPjeWIoOmZpCcsICfmibnmrKHlj43liKrpmaQnKSk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2JhdGNodW5kZWxldGUnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLmJhdGNodW5kZWxldGUuY2FsbGJhY2suZXZhbHVhdGUpO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoi6XlrZjlnKjlt7LliKDpmaTnmoTorqjorrrpobXvvIzkuZ/mgaLlpI0nLCAn6Iul5a2Y5Zyo5bey5Yiq6Zmk55qE6KiO6KuW6aCB77yM5Lmf5oGi5b6pJyksXG5cdFx0XHRcdFx0bmFtZTogJ3VuZGVsX3RhbGsnLFxuXHRcdFx0XHRcdHZhbHVlOiAndW5kZWxfdGFsaycsXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0bGFiZWw6ICfnkIbnlLHvvJonLFxuXHRcdFx0c2l6ZTogNjAsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc3RhdHVzZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0c3RhdHVzZGl2LnN0eWxlLnBhZGRpbmcgPSAnMTVweCc7IC8vIGp1c3Qgc28gaXQgZG9lc24ndCBsb29rIGJyb2tlblxuXHRcdFdpbmRvdy5zZXRDb250ZW50KHN0YXR1c2Rpdik7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoc3RhdHVzZGl2KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0Z2VuZXJhdG9yOiAnbGlua3MnLFxuXHRcdFx0cHJvcDogJ2luZm8nLFxuXHRcdFx0aW5wcm9wOiAncHJvdGVjdGlvbicsXG5cdFx0XHR0aXRsZXM6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdGdwbGxpbWl0OiBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4JyksXG5cdFx0fTtcblx0XHRjb25zdCBzdGF0ZWxlbSA9IG5ldyBNb3JlYml0cy5zdGF0dXMod2luZG93LndnVUxTKCfmipPlj5bpobXpnaLliJfooagnLCAn5oqT5Y+W6aCB6Z2i5YiX6KGoJykpO1xuXHRcdGNvbnN0IHFpdXdlbl9hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOi9veS4reKApicsICfovInlhaXkuK3igKYnKSxcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0KGFwaW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRcdGNvbnN0ICRwYWdlcyA9ICQoeG1sKS5maW5kKCdwYWdlW21pc3NpbmddJyk7XG5cdFx0XHRcdGNvbnN0IGxpc3QgPSBbXTtcblx0XHRcdFx0JHBhZ2VzLmVhY2goKF9pbmRleCwgcGFnZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0ICRwYWdlID0gJChwYWdlKTtcblx0XHRcdFx0XHRjb25zdCB0aXRsZSA9ICRwYWdlLmF0dHIoJ3RpdGxlJyk7XG5cdFx0XHRcdFx0Y29uc3QgJGVkaXRwcm90ID0gJHBhZ2UuZmluZCgncHJbdHlwZT1cImNyZWF0ZVwiXVtsZXZlbD1cInN5c29wXCJdJyk7XG5cdFx0XHRcdFx0Y29uc3QgaXNQcm90ZWN0ZWQgPSAkZWRpdHByb3QubGVuZ3RoID4gMDtcblx0XHRcdFx0XHRsaXN0W2xpc3QubGVuZ3RoXSA9IHtcblx0XHRcdFx0XHRcdGxhYmVsOlxuXHRcdFx0XHRcdFx0XHR0aXRsZSArXG5cdFx0XHRcdFx0XHRcdChpc1Byb3RlY3RlZFxuXHRcdFx0XHRcdFx0XHRcdD8gYO+8iCR7d2luZG93LndnVUxTKCflhajkv53miqTvvIwnLCAn5YWo5L+d6K2377yMJyl9JHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0JGVkaXRwcm90LmF0dHIoJ2V4cGlyeScpID09PSAnaW5maW5pdHknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoJ+aXoOmZkOacnycsICfnhKHpmZDmnJ8nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogYCR7bmV3IE1vcmViaXRzLmRhdGUoJGVkaXRwcm90LmF0dHIoJ2V4cGlyeScpKS5jYWxlbmRhcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3V0Yydcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCl9IChVVEMpJHt3aW5kb3cud2dVTFMoJ+i/h+acnycsICfpgY7mnJ8nKX1gXG5cdFx0XHRcdFx0XHRcdFx0XHR977yJYFxuXHRcdFx0XHRcdFx0XHRcdDogJycpLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHRpdGxlLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdHN0eWxlOiBpc1Byb3RlY3RlZCA/ICdjb2xvcjogI2YwMCcgOiAnJyxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5b6F5oGi5aSN6aG16Z2iJywgJ+W+heaBouW+qemggemdoicpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2J1dHRvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo6YCJJywgJ+WFqOmBuCcpLFxuXHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0JChNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMoZS50YXJnZXQuZm9ybSwgJ3BhZ2VzJykpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2J1dHRvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo5LiN6YCJJywgJ+WFqOS4jemBuCcpLFxuXHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0JChNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMoZS50YXJnZXQuZm9ybSwgJ3BhZ2VzJykpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bmFtZTogJ3BhZ2VzJyxcblx0XHRcdFx0XHRzaGlmdENsaWNrU3VwcG9ydDogdHJ1ZSxcblx0XHRcdFx0XHRsaXN0LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhcGlvYmoucGFyYW1zLmZvcm0ucmVuZGVyKCk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuV2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRcdH0sXG5cdFx0XHRzdGF0ZWxlbVxuXHRcdCk7XG5cdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSB7XG5cdFx0XHRmb3JtLFxuXHRcdFx0V2luZG93LFxuXHRcdH07XG5cdFx0cWl1d2VuX2FwaS5wb3N0KCk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2h1bmRlbGV0ZS5jYWxsYmFjay5ldmFsdWF0ZSA9IChldmVudCkgPT4ge1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5Y+N5Yig6Zmk5bey5a6M5oiQJywgJ+WPjeWIqumZpOW3suWujOaIkCcpO1xuXHRcdGNvbnN0IG51bVByb3RlY3RlZCA9ICQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGV2ZW50LnRhcmdldCwgJ3BhZ2VzJykpLmZpbHRlcigoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRyZXR1cm4gZWxlbWVudC5jaGVja2VkICYmIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLmNvbG9yID09PSAncmVkJztcblx0XHR9KS5sZW5ndGg7XG5cdFx0aWYgKFxuXHRcdFx0bnVtUHJvdGVjdGVkID4gMCAmJlxuXHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5oKo5q2j6KaB5Y+N5Yig6ZmkICcsICfmgqjmraPopoHlj43liKrpmaQgJykgK1xuXHRcdFx0XHRcdG51bVByb3RlY3RlZCArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCcg5Liq5YWo5L+d5oqk6aG16Z2i77yM5oKo56Gu5a6a5ZCX77yfJywgJyDlgIvlhajkv53orbfpoIHpnaLvvIzmgqjnorrlrprll47vvJ8nKVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBwYWdlcyA9IGV2ZW50LnRhcmdldC5nZXRDaGVja2VkKCdwYWdlcycpO1xuXHRcdGNvbnN0IHJlYXNvbiA9IGV2ZW50LnRhcmdldC5yZWFzb24udmFsdWU7XG5cdFx0Y29uc3QgdW5kZWxfdGFsayA9IGV2ZW50LnRhcmdldC5yZWFzb24udmFsdWU7XG5cdFx0aWYgKCFyZWFzb24pIHtcblx0XHRcdHZvaWQgbXcubm90aWZ5KCfmgqjpnIDopoHmjIflrprnkIbnlLHjgIInLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZWJhdGNodW5kZWxldGUnLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZXZlbnQudGFyZ2V0KTtcblx0XHRpZiAoIXBhZ2VzKSB7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuZXJyb3IoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn6ZSZ6K+vJywgJ+mMr+iqpCcpLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ayoeS7gOS5iOimgeWPjeWIoOmZpOeahO+8jOWPlua2iOaTjeS9nCcsICfmspLku4DpurzopoHlj43liKrpmaTnmoTvvIzlj5bmtojmk43kvZwnKVxuXHRcdFx0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcGFnZVVuZGVsZXRlciA9IG5ldyBNb3JlYml0cy5iYXRjaE9wZXJhdGlvbih3aW5kb3cud2dVTFMoJ+WPjeWIoOmZpOmhtemdoicsICflj43liKrpmaTpoIHpnaInKSk7XG5cdFx0cGFnZVVuZGVsZXRlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hDaHVua3MnKSk7XG5cdFx0cGFnZVVuZGVsZXRlci5zZXRPcHRpb24oJ3ByZXNlcnZlSW5kaXZpZHVhbFN0YXR1c0xpbmVzJywgdHJ1ZSk7XG5cdFx0cGFnZVVuZGVsZXRlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0cGFnZVVuZGVsZXRlci5ydW4oKHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRcdHBhZ2U6IHBhZ2VOYW1lLFxuXHRcdFx0XHR1bmRlbF90YWxrLFxuXHRcdFx0XHRyZWFzb24sXG5cdFx0XHRcdHBhZ2VVbmRlbGV0ZXIsXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHBhZ2VOYW1lLCB3aW5kb3cud2dVTFMoJ+WPjeWIoOmZpOmhtemdoicsICflj43liKrpmaTpoIHpnaInKSArIHBhZ2VOYW1lKTtcblx0XHRcdHFpdXdlbl9wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0cWl1d2VuX3BhZ2Uuc2V0RWRpdFN1bW1hcnkoYCR7cmVhc29ufSAo5om56YePKWApO1xuXHRcdFx0cWl1d2VuX3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cWl1d2VuX3BhZ2Uuc3VwcHJlc3NQcm90ZWN0V2FybmluZygpO1xuXHRcdFx0cWl1d2VuX3BhZ2Uuc2V0TWF4UmV0cmllcygzKTsgLy8gdGVtcG9yYXJ5IGluY3JlYXNlIGZyb20gMiB0byBtYWtlIGJhdGNodW5kZWxldGUgbW9yZSBsaWtlbHkgdG8gc3VjY2VlZFxuXHRcdFx0cWl1d2VuX3BhZ2UudW5kZWxldGVQYWdlKFR3aW5rbGUuYmF0Y2h1bmRlbGV0ZS5jYWxsYmFja3MuZG9FeHRyYXMsIHBhZ2VVbmRlbGV0ZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0fSk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2h1bmRlbGV0ZS5jYWxsYmFja3MgPSB7XG5cdFx0Ly8gdGhpcyBzdHVwaWQgcGFyYW1ldGVyIG5hbWUgaXMgYSB0ZW1wb3JhcnkgdGhpbmcgdW50aWwgSSBpbXBsZW1lbnQgYW4gb3ZlcmhhdWxcblx0XHQvLyBvZiBNb3JlYml0cy53aWtpLiogY2FsbGJhY2sgcGFyYW1ldGVyc1xuXHRcdGRvRXh0cmFzOiAodGhpbmdXaXRoUGFyYW1ldGVycykgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gdGhpbmdXaXRoUGFyYW1ldGVycy5wYXJlbnRcblx0XHRcdFx0PyB0aGluZ1dpdGhQYXJhbWV0ZXJzLnBhcmVudC5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKVxuXHRcdFx0XHQ6IHRoaW5nV2l0aFBhcmFtZXRlcnMuZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHQvLyB0aGUgaW5pdGlhbCBiYXRjaCBvcGVyYXRpb24ncyBqb2IgaXMgdG8gZGVsZXRlIHRoZSBwYWdlLCBhbmQgdGhhdCBoYXNcblx0XHRcdC8vIHN1Y2NlZWRlZCBieSBub3dcblx0XHRcdHBhcmFtcy5wYWdlVW5kZWxldGVyLndvcmtlclN1Y2Nlc3ModGhpbmdXaXRoUGFyYW1ldGVycyk7XG5cdFx0XHRsZXQgcXVlcnk7XG5cdFx0XHRsZXQgcWl1d2VuX2FwaTtcblx0XHRcdGlmIChwYXJhbXMudW5kZWxfdGFsaykge1xuXHRcdFx0XHRjb25zdCB0YWxrcGFnZW5hbWUgPSBuZXcgbXcuVGl0bGUocGFyYW1zLnBhZ2UpLmdldFRhbGtQYWdlKCkuZ2V0UHJlZml4ZWRUZXh0KCk7XG5cdFx0XHRcdGlmICh0YWxrcGFnZW5hbWUgIT09IHBhcmFtcy5wYWdlKSB7XG5cdFx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHRwcm9wOiAnZGVsZXRlZHJldmlzaW9ucycsXG5cdFx0XHRcdFx0XHRkcnZwcm9wOiAnaWRzJyxcblx0XHRcdFx0XHRcdGRydmxpbWl0OiAxLFxuXHRcdFx0XHRcdFx0dGl0bGVzOiB0YWxrcGFnZW5hbWUsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRxaXV3ZW5fYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmo4Dmn6XorqjorrrpobXnmoTlt7LliKDniYjmnKwnLCAn5qqi5p+l6KiO6KuW6aCB55qE5bey5Yiq54mI5pysJyksXG5cdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFR3aW5rbGUuYmF0Y2h1bmRlbGV0ZS5jYWxsYmFja3MudW5kZWxldGVUYWxrXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRxaXV3ZW5fYXBpLnBhcmFtcyA9IHBhcmFtcztcblx0XHRcdFx0XHRxaXV3ZW5fYXBpLnBhcmFtcy50YWxrUGFnZSA9IHRhbGtwYWdlbmFtZTtcblx0XHRcdFx0XHRxaXV3ZW5fYXBpLnBvc3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0dW5kZWxldGVUYWxrOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCBleGlzdHMgPSAkKHhtbCkuZmluZCgncGFnZTpub3QoW21pc3NpbmddKScpLmxlbmd0aCA+IDA7XG5cdFx0XHRjb25zdCBkZWxyZXZzID0gJCh4bWwpLmZpbmQoJ3JldicpLmF0dHIoJ3JldmlkJyk7XG5cdFx0XHRpZiAoZXhpc3RzIHx8ICFkZWxyZXZzKSB7XG5cdFx0XHRcdC8vIHBhZ2UgZXhpc3RzIG9yIGhhcyBubyBkZWxldGVkIHJldmlzaW9uczsgZm9yZ2V0IGFib3V0IGl0XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRhcGlvYmoucGFyYW1zLnRhbGtQYWdlLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOWPjeWIoOmZpCcsICfmraPlnKjlj43liKrpmaQnKSArIGFwaW9iai5wYXJhbXMucGFnZSArIHdpbmRvdy53Z1VMUygn55qE6K6o6K666aG1JywgJ+eahOiojuirlumggScpXG5cdFx0XHQpO1xuXHRcdFx0cGFnZS5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0d2luZG93LndnVUxTKCflj43liKDpmaTigJwnLCAn5Y+N5Yiq6Zmk44CMJykgK1xuXHRcdFx0XHRcdGFwaW9iai5wYXJhbXMucGFnZSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfigJ3nmoRbW0hlbHA66K6o6K666aG1fOiuqOiuuumhtV1dJywgJ+OAjeeahFtbSGVscDroqI7oq5bpoIF86KiO6KuW6aCBXV0nKVxuXHRcdFx0KTtcblx0XHRcdHBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZS51bmRlbGV0ZVBhZ2UoKTtcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLmJhdGNodW5kZWxldGUsICdiYXRjaHVuZGVsZXRlJyk7XG59KShqUXVlcnkpO1xuXG5leHBvcnQge307XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcblxuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlYmF0Y2hwcm90ZWN0LmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWJhdGNocHJvdGVjdCgkKSB7XG5cdC8qKlxuXHQgKiB0d2lua2xlYmF0Y2hwcm90ZWN0LmpzOiBCYXRjaCBwcm90ZWN0IG1vZHVsZSAoc3lzb3BzIG9ubHkpXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogVGFiIChcIlAtYmF0Y2hcIilcblx0ICogQWN0aXZlIG9uOiBFeGlzdGluZyBwcm9qZWN0IHBhZ2VzIGFuZCB1c2VyIHBhZ2VzO1xuXHQgKiBleGlzdGluZyBhbmQgbm9uLWV4aXN0aW5nIGNhdGVnb3JpZXM7IFNwZWNpYWw6UHJlZml4SW5kZXhcblx0ICovXG5cdFR3aW5rbGUuYmF0Y2hwcm90ZWN0ID0gKCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdE1vcmViaXRzLnVzZXJJc1N5c29wICYmXG5cdFx0XHQoKG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykgPiAwICYmIFsyLCA0XS5pbmNsdWRlcyhtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpKSkgfHxcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMTQgfHxcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ1ByZWZpeGluZGV4Jylcblx0XHQpIHtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoVHdpbmtsZS5iYXRjaHByb3RlY3QuY2FsbGJhY2ssICfmibnkv50nLCAndHctcGJhdGNoJywgJ+aJuemHj+S/neaKpOmTvuWHuumhtemdoicpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5iYXRjaHByb3RlY3QudW5saW5rQ2FjaGUgPSB7fTtcblx0VHdpbmtsZS5iYXRjaHByb3RlY3QuY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgV2luZG93ID0gbmV3IE1vcmViaXRzLnNpbXBsZVdpbmRvdyg2MDAsIDQwMCk7XG5cdFx0V2luZG93LnNldFRpdGxlKCfmibnkv50nKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKCfkv53miqTmlrnpkognLCAnUVc6UFJPVCcpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5biu5Yqp5paH5qGjJywgJ+W5q+WKqeaWh+aqlCcpLCAnSDpUVy9ET0Mj5L+d5oqkJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCfpl67popjlj43ppognLCAn5ZWP6aGM5Y+N6aWLJyksICdIVDpUVycpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUuYmF0Y2hwcm90ZWN0LmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLmVkaXRtb2RpZnksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJ+S/ruaUuee8lui+keS/neaKpCcsXG5cdFx0XHRcdFx0dmFsdWU6ICdlZGl0bW9kaWZ5Jyxcblx0XHRcdFx0XHRuYW1lOiAnZWRpdG1vZGlmeScsXG5cdFx0XHRcdFx0dG9vbHRpcDogJ+S7hemZkOeOsOaciemhtemdouOAgicsXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRuYW1lOiAnZWRpdGxldmVsJyxcblx0XHRcdGxhYmVsOiAn57yW6L6R5p2D6ZmQ77yaJyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5lZGl0bGV2ZWwsXG5cdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvbkxldmVscyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdG5hbWU6ICdlZGl0ZXhwaXJ5Jyxcblx0XHRcdGxhYmVsOiAn57uI5q2i5pe26Ze077yaJyxcblx0XHRcdGV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ2N1c3RvbScpIHtcblx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuZG9DdXN0b21FeHBpcnkoZXZlbnQudGFyZ2V0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGVuZ3RocywgLy8gRGVmYXVsdCAoMiBkYXlzKSBzZXQgYWZ0ZXIgcmVuZGVyXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5tb3ZlbW9kaWZ5LFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICfkv67mlLnnp7vliqjkv53miqQnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbW92ZW1vZGlmeScsXG5cdFx0XHRcdFx0bmFtZTogJ21vdmVtb2RpZnknLFxuXHRcdFx0XHRcdHRvb2x0aXA6ICfku4XpmZDnjrDmnInpobXpnaLjgIInLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ21vdmVsZXZlbCcsXG5cdFx0XHRsYWJlbDogJ+enu+WKqOadg+mZkO+8micsXG5cdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMubW92ZWxldmVsLFxuXHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZXZlbHMuZmlsdGVyKFxuXHRcdFx0XHQvLyBBdXRvY29uZmlybWVkIGlzIHJlcXVpcmVkIGZvciBhIG1vdmUsIHJlZHVuZGFudFxuXHRcdFx0XHQocHJvdExldmVsKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3RMZXZlbC52YWx1ZSAhPT0gJ2F1dG9jb25maXJtZWQnO1xuXHRcdFx0XHR9XG5cdFx0XHQpLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ21vdmVleHBpcnknLFxuXHRcdFx0bGFiZWw6ICfnu4jmraLml7bpl7TvvJonLFxuXHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoZXZlbnQudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tJykge1xuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5kb0N1c3RvbUV4cGlyeShldmVudC50YXJnZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZW5ndGhzLCAvLyBEZWZhdWx0ICgyIGRheXMpIHNldCBhZnRlciByZW5kZXJcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRldmVudC50YXJnZXQuZm9ybS5jcmVhdGVsZXZlbC5kaXNhYmxlZCA9ICFldmVudC50YXJnZXQuY2hlY2tlZDtcblx0XHRcdFx0ZXZlbnQudGFyZ2V0LmZvcm0uY3JlYXRlZXhwaXJ5LmRpc2FibGVkID1cblx0XHRcdFx0XHQhZXZlbnQudGFyZ2V0LmNoZWNrZWQgfHwgZXZlbnQudGFyZ2V0LmZvcm0uY3JlYXRlbGV2ZWwudmFsdWUgPT09ICdhbGwnO1xuXHRcdFx0XHRldmVudC50YXJnZXQuZm9ybS5jcmVhdGVsZXZlbC5zdHlsZS5jb2xvciA9IGV2ZW50LnRhcmdldC5jaGVja2VkID8gJycgOiAndHJhbnNwYXJlbnQnO1xuXHRcdFx0XHRldmVudC50YXJnZXQuZm9ybS5jcmVhdGVleHBpcnkuc3R5bGUuY29sb3IgPSBldmVudC50YXJnZXQuY2hlY2tlZCA/ICcnIDogJ3RyYW5zcGFyZW50Jztcblx0XHRcdH0sXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJ+S/ruaUueWIm+W7uuS/neaKpCcsXG5cdFx0XHRcdFx0dmFsdWU6ICdjcmVhdGVtb2RpZnknLFxuXHRcdFx0XHRcdG5hbWU6ICdjcmVhdGVtb2RpZnknLFxuXHRcdFx0XHRcdHRvb2x0aXA6ICfku4XpmZDkuI3lrZjlnKjnmoTpobXpnaLjgIInLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ2NyZWF0ZWxldmVsJyxcblx0XHRcdGxhYmVsOiAn5Yib5bu65p2D6ZmQ77yaJyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5jcmVhdGVsZXZlbCxcblx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGV2ZWxzLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ2NyZWF0ZWV4cGlyeScsXG5cdFx0XHRsYWJlbDogJ+e7iOatouaXtumXtO+8micsXG5cdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChldmVudC50YXJnZXQudmFsdWUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmRvQ3VzdG9tRXhwaXJ5KGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvbkxlbmd0aHMsIC8vIERlZmF1bHQgKGluZGVmaW5pdGUpIHNldCBhZnRlciByZW5kZXJcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdGxhYmVsOiAnJywgLy8gaG9yaXpvbnRhbCBydWxlXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0bGFiZWw6ICfnkIbnlLHvvIjkv53miqTml6Xlv5fvvIknLFxuXHRcdFx0c2l6ZTogNjAsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRwcm9wOiAncmV2aXNpb25zfGluZm98aW1hZ2VpbmZvJyxcblx0XHRcdHJ2cHJvcDogJ3NpemV8dXNlcicsXG5cdFx0XHRpbnByb3A6ICdwcm90ZWN0aW9uJyxcblx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdH07XG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDE0KSB7XG5cdFx0XHQvLyBjYXRlZ29yaWVzXG5cdFx0XHRxdWVyeS5nZW5lcmF0b3IgPSAnY2F0ZWdvcnltZW1iZXJzJztcblx0XHRcdHF1ZXJ5LmdjbXRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdFx0cXVlcnkuZ2NtbGltaXQgPSBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4Jyk7XG5cdFx0fSBlbHNlIGlmIChtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnUHJlZml4aW5kZXgnKSB7XG5cdFx0XHRxdWVyeS5nZW5lcmF0b3IgPSAnYWxscGFnZXMnO1xuXHRcdFx0cXVlcnkuZ2FwbmFtZXNwYWNlID1cblx0XHRcdFx0bXcudXRpbC5nZXRQYXJhbVZhbHVlKCduYW1lc3BhY2UnKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbbmFtZT1uYW1lc3BhY2VdJylbMF0udmFsdWU7XG5cdFx0XHRxdWVyeS5nYXBwcmVmaXggPVxuXHRcdFx0XHRtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ByZWZpeCcpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9cHJlZml4XScpWzBdLnZhbHVlO1xuXHRcdFx0cXVlcnkuZ2FwbGltaXQgPSBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4Jyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdsaW5rcyc7XG5cdFx0XHRxdWVyeS50aXRsZXMgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRxdWVyeS5ncGxsaW1pdCA9IFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hNYXgnKTtcblx0XHR9XG5cdFx0Y29uc3Qgc3RhdHVzZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0c3RhdHVzZGl2LnN0eWxlLnBhZGRpbmcgPSAnMTVweCc7IC8vIGp1c3Qgc28gaXQgZG9lc24ndCBsb29rIGJyb2tlblxuXHRcdFdpbmRvdy5zZXRDb250ZW50KHN0YXR1c2Rpdik7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoc3RhdHVzZGl2KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdGNvbnN0IHN0YXRlbGVtID0gbmV3IE1vcmViaXRzLnN0YXR1cygn5oqT5Y+W6aG16Z2i5YiX6KGoJyk7XG5cdFx0Y29uc3QgcWl1d2VuX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdCfliqDovb3kuK3igKbigKYnLFxuXHRcdFx0cXVlcnksXG5cdFx0XHQoYXBpb2JqKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXBpb2JqLmdldFJlc3BvbnNlKCk7XG5cdFx0XHRcdGNvbnN0IHBhZ2VzID0gKHJlc3BvbnNlLnF1ZXJ5ICYmIHJlc3BvbnNlLnF1ZXJ5LnBhZ2VzKSB8fCBbXTtcblx0XHRcdFx0Y29uc3QgbGlzdCA9IFtdO1xuXHRcdFx0XHRwYWdlcy5zb3J0KFR3aW5rbGUuc29ydEJ5TmFtZXNwYWNlKTtcblx0XHRcdFx0Zm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YWRhdGEgPSBbXTtcblx0XHRcdFx0XHRjb25zdCBtaXNzaW5nID0gISFwYWdlLm1pc3Npbmc7XG5cdFx0XHRcdFx0bGV0IGVkaXRQcm90O1xuXHRcdFx0XHRcdGlmIChtaXNzaW5nKSB7XG5cdFx0XHRcdFx0XHRtZXRhZGF0YVttZXRhZGF0YS5sZW5ndGhdID0gJ+mhtemdouS4jeWtmOWcqCc7XG5cdFx0XHRcdFx0XHRlZGl0UHJvdCA9IHBhZ2UucHJvdGVjdGlvblxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKChwcm90ZWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHByb3RlY3Rpb24udHlwZSA9PT0gJ2NyZWF0ZScgJiYgcHJvdGVjdGlvbi5sZXZlbCA9PT0gJ3N5c29wJztcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnBvcCgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAocGFnZS5yZWRpcmVjdCkge1xuXHRcdFx0XHRcdFx0XHRtZXRhZGF0YVttZXRhZGF0YS5sZW5ndGhdID0gJ+mHjeWumuWQkSc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAocGFnZS5ucyA9PT0gNikge1xuXHRcdFx0XHRcdFx0XHRtZXRhZGF0YVttZXRhZGF0YS5sZW5ndGhdID1cblx0XHRcdFx0XHRcdFx0XHQoYOS4iuS8oOiAhe+8miR7cGFnZS5pbWFnZWluZm9bMF0udXNlcn1gLCBg5pyA5ZCO57yW6L6R6ICF77yaJHtwYWdlLnJldmlzaW9uc1swXS51c2VyfWApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bWV0YWRhdGFbbWV0YWRhdGEubGVuZ3RoXSA9IGAke213Lmxhbmd1YWdlLmNvbnZlcnROdW1iZXIocGFnZS5yZXZpc2lvbnNbMF0uc2l6ZSl95a2X6IqCYDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVkaXRQcm90ID0gcGFnZS5wcm90ZWN0aW9uXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoKHByb3RlY3Rpb24pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJvdGVjdGlvbi50eXBlID09PSAnZWRpdCcgJiYgcHJvdGVjdGlvbi5sZXZlbCA9PT0gJ3N5c29wJztcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnBvcCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZWRpdFByb3QpIHtcblx0XHRcdFx0XHRcdG1ldGFkYXRhW21ldGFkYXRhLmxlbmd0aF0gPSBgJHttaXNzaW5nID8gJ+eZvee6uCcgOiAnJ33lhajkv53miqQke1xuXHRcdFx0XHRcdFx0XHRlZGl0UHJvdC5leHBpcnkgPT09ICdpbmZpbml0eSdcblx0XHRcdFx0XHRcdFx0XHQ/ICfvvIjmsLjkuYXvvIknXG5cdFx0XHRcdFx0XHRcdFx0OiBg77yIJHtuZXcgTW9yZWJpdHMuZGF0ZShlZGl0UHJvdC5leHBpcnkpLmNhbGVuZGFyKCd1dGMnKX0gKFVUQynov4fmnJ/vvIlgXG5cdFx0XHRcdFx0XHR9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qge3RpdGxlfSA9IHBhZ2U7XG5cdFx0XHRcdFx0bGlzdFtsaXN0Lmxlbmd0aF0gPSB7XG5cdFx0XHRcdFx0XHRsYWJlbDogdGl0bGUgKyAobWV0YWRhdGEubGVuZ3RoID4gMCA/IGAgKCR7bWV0YWRhdGEuam9pbignOyAnKX0pYCA6ICcnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiB0aXRsZSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzdHlsZTogZWRpdFByb3QgPyAnY29sb3I6ICNmMDAnIDogJycsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6ICflvoXkv53miqTpobXpnaInLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiAn5YWo6YCJJyxcblx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHQkKE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhldmVudC50YXJnZXQuZm9ybSwgJ3BhZ2VzJykpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiAn5YWo5LiN6YCJJyxcblx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHQkKE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhldmVudC50YXJnZXQuZm9ybSwgJ3BhZ2VzJykpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdG5hbWU6ICdwYWdlcycsXG5cdFx0XHRcdFx0c2hpZnRDbGlja1N1cHBvcnQ6IHRydWUsXG5cdFx0XHRcdFx0bGlzdCxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0XHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0XHRcdC8vIFNldCBkZWZhdWx0c1xuXHRcdFx0XHRyZXN1bHQuZWRpdGV4cGlyeS52YWx1ZSA9ICcyIGRheXMnO1xuXHRcdFx0XHRyZXN1bHQubW92ZWV4cGlyeS52YWx1ZSA9ICcyIGRheXMnO1xuXHRcdFx0XHRyZXN1bHQuY3JlYXRlZXhwaXJ5LnZhbHVlID0gJ2luZmluaXR5Jztcblx0XHRcdFx0Zm9yIChjb25zdCBsaW5rcyBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocmVzdWx0LCAn5Liq6aG16Z2iJykpIHtcblx0XHRcdFx0XHRUd2lua2xlLmdlbmVyYXRlQXJyb3dMaW5rcyhsaW5rcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzdGF0ZWxlbVxuXHRcdCk7XG5cdFx0cWl1d2VuX2FwaS5wb3N0KCk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2hwcm90ZWN0LmN1cnJlbnRQcm90ZWN0Q291bnRlciA9IDA7XG5cdFR3aW5rbGUuYmF0Y2hwcm90ZWN0LmN1cnJlbnRwcm90ZWN0b3IgPSAwO1xuXHRUd2lua2xlLmJhdGNocHJvdGVjdC5jYWxsYmFjay5ldmFsdWF0ZSA9IChldmVudCkgPT4ge1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9ICfmibnph4/kv53miqTlrozmiJAnO1xuXHRcdGNvbnN0IGZvcm0gPSBldmVudC50YXJnZXQ7XG5cdFx0Y29uc3QgbnVtUHJvdGVjdGVkID0gJChNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMoZm9ybSwgJ+S4qumhtemdoicpKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIGVsZW1lbnQuY2hlY2tlZCAmJiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS5jb2xvciA9PT0gJyNmMDAnO1xuXHRcdH0pLmxlbmd0aDtcblx0XHRpZiAoXG5cdFx0XHRudW1Qcm90ZWN0ZWQgPiAwICYmXG5cdFx0XHQhY29uZmlybShg5oKo5Y2z5bCG5a+5JHttdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKG51bVByb3RlY3RlZCl95Liq5YWo5L+d5oqk6aG16Z2i6L+b6KGM5pON5L2c44CC5oKo56Gu5a6a5ZCX77yfYClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgaW5wdXQgPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0SW5wdXREYXRhKGZvcm0pO1xuXHRcdGlmICghaW5wdXQucmVhc29uKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSgn5oKo5b+F6aG757uZ5Ye65LiA5Liq55CG55Sx44CCJywge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3R3aW5rbGViYXRjaHByb3RlY3QnLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0aWYgKGlucHV0LnBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmVycm9yKCdFcnJvcicsICflvoXkv53miqTpobXpnaLkuI3lrZjlnKjvvIznqIvluo/nu4jmraInKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgYmF0Y2hPcGVyYXRpb24gPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oJ+W6lOeUqOS/neaKpOiuvue9ricpO1xuXHRcdGJhdGNoT3BlcmF0aW9uLnNldE9wdGlvbignY2h1bmtTaXplJywgVHdpbmtsZS5nZXRQcmVmKCdiYXRjaENodW5rcycpKTtcblx0XHRiYXRjaE9wZXJhdGlvbi5zZXRPcHRpb24oJ3ByZXNlcnZlSW5kaXZpZHVhbFN0YXR1c0xpbmVzJywgdHJ1ZSk7XG5cdFx0YmF0Y2hPcGVyYXRpb24uc2V0UGFnZUxpc3QoaW5wdXQucGFnZXMpO1xuXHRcdGJhdGNoT3BlcmF0aW9uLnJ1bigocGFnZU5hbWUpID0+IHtcblx0XHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdHRpdGxlczogcGFnZU5hbWUsXG5cdFx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHFpdXdlbl9hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdGDmraPlnKjmo4Dmn6XpobXpnaLigJwke3BhZ2VOYW1lfeKAneaYr+WQpuWtmOWcqGAsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRUd2lua2xlLmJhdGNocHJvdGVjdC5jYWxsYmFja3MubWFpbixcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0YmF0Y2hPcGVyYXRpb24ud29ya2VyRmFpbHVyZVxuXHRcdFx0KTtcblx0XHRcdHFpdXdlbl9hcGkucGFyYW1zID0ge1xuXHRcdFx0XHRwYWdlOiBwYWdlTmFtZSxcblx0XHRcdFx0YmF0Y2hPcGVyYXRpb24sXG5cdFx0XHRcdC4uLmlucHV0LFxuXHRcdFx0fTtcblx0XHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHRcdH0pO1xuXHR9O1xuXHRUd2lua2xlLmJhdGNocHJvdGVjdC5jYWxsYmFja3MgPSB7XG5cdFx0bWFpbjogKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhcGlvYmouZ2V0UmVzcG9uc2UoKTtcblx0XHRcdGlmIChyZXNwb25zZS5xdWVyeS5ub3JtYWxpemVkKSB7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMucGFnZSA9IHJlc3BvbnNlLnF1ZXJ5Lm5vcm1hbGl6ZWRbMF0udG87XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBleGlzdHMgPSAhcmVzcG9uc2UucXVlcnkucGFnZXNbMF0ubWlzc2luZztcblx0XHRcdGNvbnN0IHBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKGFwaW9iai5wYXJhbXMucGFnZSwgYOato+WcqOS/neaKpCR7YXBpb2JqLnBhcmFtcy5wYWdlfWApO1xuXHRcdFx0bGV0IHRha2VuQWN0aW9uID0gZmFsc2U7XG5cdFx0XHRpZiAoZXhpc3RzICYmIGFwaW9iai5wYXJhbXMuZWRpdG1vZGlmeSkge1xuXHRcdFx0XHRwYWdlLnNldEVkaXRQcm90ZWN0aW9uKGFwaW9iai5wYXJhbXMuZWRpdGxldmVsLCBhcGlvYmoucGFyYW1zLmVkaXRleHBpcnkpO1xuXHRcdFx0XHR0YWtlbkFjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXhpc3RzICYmIGFwaW9iai5wYXJhbXMubW92ZW1vZGlmeSkge1xuXHRcdFx0XHRwYWdlLnNldE1vdmVQcm90ZWN0aW9uKGFwaW9iai5wYXJhbXMubW92ZWxldmVsLCBhcGlvYmoucGFyYW1zLm1vdmVleHBpcnkpO1xuXHRcdFx0XHR0YWtlbkFjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWV4aXN0cyAmJiBhcGlvYmoucGFyYW1zLmNyZWF0ZW1vZGlmeSkge1xuXHRcdFx0XHRwYWdlLnNldENyZWF0ZVByb3RlY3Rpb24oYXBpb2JqLnBhcmFtcy5jcmVhdGVsZXZlbCwgYXBpb2JqLnBhcmFtcy5jcmVhdGVleHBpcnkpO1xuXHRcdFx0XHR0YWtlbkFjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRha2VuQWN0aW9uKSB7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdGDmraPlnKjkv53miqTigJwke2FwaW9iai5wYXJhbXMucGFnZX1gLFxuXHRcdFx0XHRcdGDigJ3pobXpnaIke2V4aXN0cyA/ICflrZjlnKgnIDogJ+S4jeWtmOWcqCd977yb5peg5LqL5Y+v5YGa77yM6Lez6L+HYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhcGlvYmoucGFyYW1zLmJhdGNoT3BlcmF0aW9uLndvcmtlckZhaWx1cmUoYXBpb2JqKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cGFnZS5zZXRFZGl0U3VtbWFyeShhcGlvYmoucGFyYW1zLnJlYXNvbik7XG5cdFx0XHRwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2UucHJvdGVjdChhcGlvYmoucGFyYW1zLmJhdGNoT3BlcmF0aW9uLndvcmtlclN1Y2Nlc3MsIGFwaW9iai5wYXJhbXMuYmF0Y2hPcGVyYXRpb24ud29ya2VyRmFpbHVyZSk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5iYXRjaHByb3RlY3QsICdiYXRjaHByb3RlY3QnKTtcbn0pKGpRdWVyeSk7XG5cbmV4cG9ydCB7fTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGVjbG9zZS5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVjbG9zZSgkKSB7XG5cdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHQvKipcblx0ICogdHdpbmtsZWNsb3NlLmpzOiBYRkQgY2xvc2luZyBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBMaW5rcyBhZnRlciBzZWN0aW9uIGhlYWRpbmdcblx0ICogQWN0aXZlIG9uOiBBZkQgZGF0ZWQgYXJjaGl2ZSBwYWdlc1xuXHQgKiBDb25maWcgZGlyZWN0aXZlcyBpbjogVHdpbmtsZUNvbmZpZ1xuXHQgKi9cblx0VHdpbmtsZS5jbG9zZSA9ICgpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRUd2lua2xlLmdldFByZWYoJ1hmZENsb3NlJykgPT09ICdoaWRlJyB8fFxuXHRcdFx0IS9eUWl1d2VuKFtfIF10YWxrKT865a2Y5bqf6K6o6K66XFwv6K6w5b2VKD86XFwvXFxkKyl7M30kLy50ZXN0KG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSlcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bXcuaG9vaygnd2lraXBhZ2UuY29udGVudCcpLmFkZCgoaXRlbSkgPT4ge1xuXHRcdFx0aWYgKGl0ZW0uYXR0cignaWQnKSA9PT0gJ213LWNvbnRlbnQtdGV4dCcpIHtcblx0XHRcdFx0VHdpbmtsZS5jbG9zZS5hZGRMaW5rcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHRUd2lua2xlLmNsb3NlLmFkZExpbmtzID0gKCkgPT4ge1xuXHRcdGNvbnN0IHNwYW5UYWcgPSAoY29sb3IsIGNvbnRlbnQpID0+IHtcblx0XHRcdGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHRzcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7XG5cdFx0XHRzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTtcblx0XHRcdHJldHVybiBzcGFuO1xuXHRcdH07XG5cdFx0JGJvZHlcblx0XHRcdC5maW5kKFxuXHRcdFx0XHQnaDE6aGFzKC5tdy1oZWFkbGluZSksaDI6aGFzKC5tdy1oZWFkbGluZSksaDM6aGFzKC5tdy1oZWFkbGluZSksaDQ6aGFzKC5tdy1oZWFkbGluZSksaDU6aGFzKC5tdy1oZWFkbGluZSksaDY6aGFzKC5tdy1oZWFkbGluZSknLFxuXHRcdFx0XHQnI2JvZHlDb250ZW50J1xuXHRcdFx0KVxuXHRcdFx0LmVhY2goKGluZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdGVsZW1lbnQuZGF0YXNldC5zZWN0aW9uID0gaW5kZXggKyAxO1xuXHRcdFx0fSk7XG5cdFx0Y29uc3Qgc2VsZWN0b3IgPSAnOmhhcygubXctaGVhZGxpbmUgYTpvbmx5LW9mLXR5cGUpOm5vdCg6aGFzKCsgZGl2Lk5hdkZyYW1lKSknO1xuXHRcdGNvbnN0IHRpdGxlcyA9ICRib2R5LmZpbmQoJyNib2R5Q29udGVudCcpLmZpbmQoYGgyJHtzZWxlY3Rvcn06bm90KDpoYXMoKyBwICsgaDMpKSwgaDMke3NlbGVjdG9yfWApOyAvLyByZWFsbHkgbmVlZHMgdG8gd29yayBvblxuXHRcdGNvbnN0IGRlbE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHJvbmcnKTtcblx0XHRjb25zdCBkZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdGRlbExpbmsuYXBwZW5kQ2hpbGQoc3BhblRhZygnQmxhY2snLCAnWycpKTtcblx0XHRkZWxMaW5rLmFwcGVuZENoaWxkKHNwYW5UYWcoJ1JlZCcsIHdpbmRvdy53Z1VMUygn5YWz6Zet6K6o6K66JywgJ+mXnOmWieiojuirlicpKSk7XG5cdFx0ZGVsTGluay5hcHBlbmRDaGlsZChzcGFuVGFnKCdCbGFjaycsICddJykpO1xuXHRcdGRlbE5vZGUuYXBwZW5kQ2hpbGQoZGVsTGluayk7XG5cdFx0Zm9yIChjb25zdCBjdXJyZW50IG9mIHRpdGxlcykge1xuXHRcdFx0Y29uc3QgaGVhZGxpbmVocmVmID0gJChjdXJyZW50KVxuXHRcdFx0XHQuZmluZCgnLm13LWhlYWRsaW5lIGE6bm90KC5leHQtZGlzY3Vzc2lvbnRvb2xzLWluaXQtc2VjdGlvbi1zdWJzY3JpYmUtbGluayknKVxuXHRcdFx0XHQuYXR0cignaHJlZicpO1xuXHRcdFx0aWYgKGhlYWRsaW5laHJlZiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGxldCB0aXRsZSA9IG51bGw7XG5cdFx0XHRcdGlmIChoZWFkbGluZWhyZWYuaW5jbHVkZXMoJ3JlZGxpbms9MScpKSB7XG5cdFx0XHRcdFx0dGl0bGUgPSBoZWFkbGluZWhyZWYuc2xpY2UoMTksIC0yMik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgbSA9IGhlYWRsaW5laHJlZi5tYXRjaCgvXFwvd2lraVxcLyhbXj9dKykvLCAnJDEnKTtcblx0XHRcdFx0XHRpZiAobSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0WywgdGl0bGVdID0gbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRpdGxlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0dGl0bGUgPSBkZWNvZGVVUklDb21wb25lbnQodGl0bGUpO1xuXHRcdFx0XHRcdHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXy9nLCAnICcpOyAvLyBOb3JtYWxpemUgZm9yIHVzaW5nIGluIGludGVyZmFjZSBhbmQgc3VtbWFyeVxuXHRcdFx0XHRcdGNvbnN0IHBhZ2Vub3RleGlzdCA9ICQoY3VycmVudCkuZmluZCgnLm13LWhlYWRsaW5lIGEnKS5oYXNDbGFzcygnbmV3Jyk7XG5cdFx0XHRcdFx0Y29uc3Qge3NlY3Rpb259ID0gY3VycmVudC5kYXRhc2V0O1xuXHRcdFx0XHRcdGNvbnN0IFtub2RlXSA9IGN1cnJlbnQucXVlcnlTZWxlY3RvckFsbCgnLm13LWhlYWRsaW5lJyk7XG5cdFx0XHRcdFx0bm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpKTtcblx0XHRcdFx0XHRjb25zdCB0bXBOb2RlID0gZGVsTm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG5cdFx0XHRcdFx0dG1wTm9kZS5maXJzdENoaWxkLmhyZWYgPSBgIyR7c2VjdGlvbn1gO1xuXHRcdFx0XHRcdCQodG1wTm9kZS5maXJzdENoaWxkKS5vbignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRUd2lua2xlLmNsb3NlLmNhbGxiYWNrKHRpdGxlLCBzZWN0aW9uLCBwYWdlbm90ZXhpc3QpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG5vZGUuYXBwZW5kQ2hpbGQodG1wTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdC8vIEtlZXAgdGhpcyBzeW5jaHJvbml6ZWQgd2l0aCB7e2RlbGh9fVxuXHRUd2lua2xlLmNsb3NlLmNvZGVzID0gW1xuXHRcdHtcblx0XHRcdGtleTogd2luZG93LndnVUxTKCfor7fmsYLml6DmlYgnLCAn6KuL5rGC54Sh5pWIJyksXG5cdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRpcjoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivt+axguaXoOaViCcsICfoq4vmsYLnhKHmlYgnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVwOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YeN5aSN5o+Q5Ye677yM5peg5pWIJywgJ+mHjeikh+aPkOWHuu+8jOeEoeaViCcpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRuZToge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ebruagh+mhtemdouaIluaWh+S7tuS4jeWtmOWcqO+8jOaXoOaViCcsICfnm67mqJnpoIHpnaLmiJbmqpTmoYjkuI3lrZjlnKjvvIznhKHmlYgnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0bnE6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmj5DliKDogIXmnKrojrflj5bmj5DliKDotYTmoLzvvIzml6DmlYgnLCAn5o+Q5Yiq6ICF5pyq5Y+W5b6X5o+Q5Yiq6LOH5qC877yM54Sh5pWIJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiAn5L+d55WZJyxcblx0XHRcdHZhbHVlOiB7XG5cdFx0XHRcdGs6IHtcblx0XHRcdFx0XHRsYWJlbDogJ+S/neeVmScsXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzazoge1xuXHRcdFx0XHRcdGxhYmVsOiAn5b+r6YCf5L+d55WZJyxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0dGs6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmmoLml7bkv53nlZnvvIzmlLnmjILnu7TmiqTmqKHmnb/vvIjlhbPms6jluqbnrYnvvIknLCAn5pqr5pmC5L+d55WZ77yM5pS55o6b57at6K235qih5p2/77yI6Zec5rOo5bqm562J77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUygn5pqC5pe25L+d55WZJywgJ+aaq+aZguS/neeVmScpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRycjoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivt+axgueQhueUsea2iOWksScsICfoq4vmsYLnkIbnlLHmtojlpLEnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogVHdpbmtsZS5nZXRQcmVmKCdYZmRDbG9zZScpID09PSAnbm9uYWRtaW5vbmx5Jyxcblx0XHRcdFx0fSxcblx0XHRcdFx0ZGFuOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yig5ZCO6YeN5bu6JywgJ+WIquW+jOmHjeW7uicpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHRcdGFkbWlub25seTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5Yig6ZmkJywgJ+WIqumZpCcpLFxuXHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0ZDoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpCcsICfliKrpmaQnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdkZWwnLFxuXHRcdFx0XHRcdGFkbWlub25seTogdHJ1ZSxcblx0XHRcdFx0XHRzZWxlY3RlZDogVHdpbmtsZS5nZXRQcmVmKCdYZmRDbG9zZScpID09PSAnYWxsJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0aWM6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflm77lg4/lm6DkvrXmnYPooqvliKAnLCAn5ZyW5YOP5Zug5L615qyK6KKr5YiqJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAnZGVsJyxcblx0XHRcdFx0XHRhZG1pbm9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpCcsICflv6vpgJ/liKrpmaQnKSxcblx0XHRcdHZhbHVlOiB7XG5cdFx0XHRcdHNkOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5b+r6YCf5Yig6ZmkJywgJ+W/q+mAn+WIqumZpCcpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2RlbCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxzc2Q6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfml6DmnaXmupDmiJbokZfkvZzmnYPkv6Hmga/vvIzlv6vpgJ/liKDpmaQnLCAn54Sh5L6G5rqQ5oiW54mI5qyK6LOH6KiK77yM5b+r6YCf5Yiq6ZmkJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAnZGVsJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0c3ZnOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bey5pS555SoU1ZH5Zu+5b2i77yM5b+r6YCf5Yig6ZmkJywgJ+W3suaUueeUqFNWR+WcluW9ou+8jOW/q+mAn+WIqumZpCcpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2RlbCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRyZXA6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflpJrmrKHooqvliKDpmaTvvIzmnaHnm67plIHlrponLCAn5aSa5qyh6KKr5Yiq6Zmk77yM5qKd55uu6Y6W5a6aJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAnZGVsJyxcblx0XHRcdFx0XHRhZG1pbm9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+WFtuS7luWkhOeQhuaWueazlScsICflhbbku5bomZXnkIbmlrnms5UnKSxcblx0XHRcdHZhbHVlOiB7XG5cdFx0XHRcdGM6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfovazkuqTkvrXmnYMnLCAn6L2J5Lqk5L615qyKJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAnbm9vcCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHI6IHtcblx0XHRcdFx0XHRsYWJlbDogJ+mHjeWumuWQkScsXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjcjoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIhuexu+mHjeWumuWQkScsICfliIbpoZ7ph43lrprlkJEnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0XHRhZG1pbm9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG06IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vliqgnLCAn56e75YuVJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtZXJnZToge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W5tuWFpScsICfkvbXlhaUnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0XHRhZG1pbm9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG1lcmdlYXBwcm92ZWQ6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhYHorrjlubblhaUnLCAn5YWB6Kix5L215YWlJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRuYzoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aXoOWFseivhuaaguaXtuS/neeVmScsICfnhKHlhbHorZjmmqvmmYLkv53nlZknKSxcblx0XHRcdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCfml6DlhbHor4YnLCAn54Sh5YWx6K2YJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2sgPSAodGl0bGUsIHNlY3Rpb24sIG5vb3ApID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDQxMCwgMjAwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUoYOWFs+mXreWtmOW6n+iuqOiuuiBcXHUwMEI3ICR7dGl0bGV9YCk7XG5cdFx0V2luZG93LnNldFNjcmlwdE5hbWUoJ1R3aW5rbGUnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluaygn5a2Y5bqf6K6o6K666K6+572uJywgJ0g6VFcvUFJFRiPlhbPpl63lrZjlup/orqjorronKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluaygnVHdpbmtsZeW4ruWKqScsICdIOlRXL0RPQyPlhbPpl63lrZjlup/orqjorronKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLmNsb3NlLmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdGxhYmVsOiAn5aSE55CG57uT5p6c77yaJyxcblx0XHRcdG5hbWU6ICdzdWJfZ3JvdXAnLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUuY2xvc2UuY2FsbGJhY2suY2hhbmdlX2NvZGUsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdG5hbWU6ICdzZHJlYXNvbicsXG5cdFx0XHRsYWJlbDogJ+mAn+WIoOeQhueUse+8micsXG5cdFx0XHR0b29sdGlwOiAn55So5LqO5Yig6Zmk5pel5b+X77yM5L2/55Soe3tkZWxldGV9feeahOWPguaVsOagvOW8j++8jOS+i+WmgiBBMSDmiJYgQTF8RzEnLFxuXHRcdFx0aGlkZGVuOiB0cnVlLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRuYW1lOiAncmVtYXJrJyxcblx0XHRcdGxhYmVsOiAn6KGl5YWF6K+05piO77yaJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICflj6rlhbPpl63orqjorrrvvIzkuI3ov5vooYzlhbbku5bmk43kvZwnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm9vcCcsXG5cdFx0XHRcdFx0bmFtZTogJ25vb3AnLFxuXHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLmNsb3NlLmNhbGxiYWNrLmNoYW5nZV9vcGVyYXRpb24sXG5cdFx0XHRcdFx0Y2hlY2tlZDogbm9vcCxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0aWYgKG5ldyBtdy5UaXRsZSh0aXRsZSkubmFtZXNwYWNlICUgMiA9PT0gMCAmJiBuZXcgbXcuVGl0bGUodGl0bGUpLm5hbWVzcGFjZSAhPT0gMikge1xuXHRcdFx0Ly8gaGlkZSBvcHRpb24gZm9yIHVzZXIgcGFnZXMsIHRvIGF2b2lkIGFjY2lkZW50YWxseSBkZWxldGluZyB1c2VyIHRhbGsgcGFnZVxuXHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6ICfliKDpmaTlhbPogZTnmoTorqjorrrpobUnLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICd0YWxrcGFnZScsXG5cdFx0XHRcdFx0XHRuYW1lOiAndGFsa3BhZ2UnLFxuXHRcdFx0XHRcdFx0dG9vbHRpcDogJ+WIoOmZpOaXtumZhOW4puWIoOmZpOatpOmhtemdoueahOiuqOiuuumhteOAgicsXG5cdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAn5Yig6Zmk6YeN5a6a5ZCR6aG1Jyxcblx0XHRcdFx0XHR2YWx1ZTogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0bmFtZTogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0dG9vbHRpcDogJ+WIoOmZpOWIsOatpOmhteeahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRldmVudDogKGUpID0+IHtcblx0XHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0Y29uc3QgW3N1Yl9ncm91cF0gPSByZXN1bHQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0Jyk7IC8vIGhhY2tcblx0XHRjb25zdCByZXN1bHREYXRhID0ge1xuXHRcdFx0dGl0bGUsXG5cdFx0XHRzZWN0aW9uOiBOdW1iZXIucGFyc2VJbnQoc2VjdGlvbiwgMTApLFxuXHRcdFx0bm9vcCxcblx0XHR9O1xuXHRcdCQocmVzdWx0KS5kYXRhKCdyZXN1bHREYXRhJywgcmVzdWx0RGF0YSk7XG5cdFx0Ly8gd29ya2VyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgY29tYm8gYm94IGVudHJpZXNcblx0XHRjb25zdCBjcmVhdGVFbnRyaWVzID0gKGNvbnRlbnRzLCBjb250YWluZXIpID0+IHtcblx0XHRcdGZvciAoY29uc3QgW2l0ZW1LZXksIGl0ZW1Qcm9wZXJ0aWVzXSBvZiBPYmplY3QuZW50cmllcyhjb250ZW50cykpIHtcblx0XHRcdFx0Y29uc3Qga2V5ID0gdHlwZW9mIGl0ZW1LZXkgPT09ICdzdHJpbmcnID8gaXRlbUtleSA6IGl0ZW1Qcm9wZXJ0aWVzLnZhbHVlO1xuXHRcdFx0XHRjb25zdCBlbGVtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogYCR7a2V5fe+8miR7aXRlbVByb3BlcnRpZXMubGFiZWx9YCxcblx0XHRcdFx0XHR2YWx1ZToga2V5LFxuXHRcdFx0XHRcdHNlbGVjdGVkOiBpdGVtUHJvcGVydGllcy5zZWxlY3RlZCxcblx0XHRcdFx0XHRkaXNhYmxlZDpcblx0XHRcdFx0XHRcdChUd2lua2xlLmdldFByZWYoJ1hmZENsb3NlJykgIT09ICdhbGwnICYmIGl0ZW1Qcm9wZXJ0aWVzLmFkbWlub25seSkgfHwgaXRlbVByb3BlcnRpZXMuZGlzYWJsZWQsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBlbGVtUmVuZGVyZWQgPSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbS5yZW5kZXIoKSk7XG5cdFx0XHRcdCQoZWxlbVJlbmRlcmVkKS5kYXRhKCdtZXNzYWdlRGF0YScsIGl0ZW1Qcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGZvciAoY29uc3QgZ3JvdXAgb2YgVHdpbmtsZS5jbG9zZS5jb2Rlcykge1xuXHRcdFx0bGV0IG9wdGdyb3VwID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0dHlwZTogJ29wdGdyb3VwJyxcblx0XHRcdFx0bGFiZWw6IGdyb3VwLmtleSxcblx0XHRcdH0pO1xuXHRcdFx0b3B0Z3JvdXAgPSBvcHRncm91cC5yZW5kZXIoKTtcblx0XHRcdHN1Yl9ncm91cC5hcHBlbmRDaGlsZChvcHRncm91cCk7XG5cdFx0XHQvLyBjcmVhdGUgdGhlIG9wdGlvbnNcblx0XHRcdGNyZWF0ZUVudHJpZXMoZ3JvdXAudmFsdWUsIG9wdGdyb3VwKTtcblx0XHR9XG5cdFx0Y29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRldmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdHJlc3VsdC5zdWJfZ3JvdXAuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdH07XG5cdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2suY2hhbmdlX29wZXJhdGlvbiA9IChlKSA9PiB7XG5cdFx0Y29uc3Qgbm9vcCA9IGUudGFyZ2V0LmNoZWNrZWQ7XG5cdFx0Y29uc3QgY29kZSA9IGUudGFyZ2V0LmZvcm0uc3ViX2dyb3VwLnZhbHVlO1xuXHRcdGNvbnN0IG1lc3NhZ2VEYXRhID0gJChlLnRhcmdldC5mb3JtLnN1Yl9ncm91cCkuZmluZChgb3B0aW9uW3ZhbHVlPVwiJHtjb2RlfVwiXWApLmRhdGEoJ21lc3NhZ2VEYXRhJyk7XG5cdFx0Y29uc3Qge3RhbGtwYWdlfSA9IGUudGFyZ2V0LmZvcm07XG5cdFx0Y29uc3Qge3JlZGlyZWN0c30gPSBlLnRhcmdldC5mb3JtO1xuXHRcdGlmIChub29wIHx8IG1lc3NhZ2VEYXRhLmFjdGlvbiA9PT0gJ2tlZXAnKSB7XG5cdFx0XHRpZiAodGFsa3BhZ2UpIHtcblx0XHRcdFx0dGFsa3BhZ2UuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHR0YWxrcGFnZS5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZWRpcmVjdHMuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0cmVkaXJlY3RzLmRpc2FibGVkID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRhbGtwYWdlKSB7XG5cdFx0XHRcdHRhbGtwYWdlLmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0XHR0YWxrcGFnZS5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmVkaXJlY3RzLmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0cmVkaXJlY3RzLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmNsb3NlLmNhbGxiYWNrLmNoYW5nZV9jb2RlID0gKGUpID0+IHtcblx0XHRjb25zdCByZXN1bHREYXRhID0gJChlLnRhcmdldC5mb3JtKS5kYXRhKCdyZXN1bHREYXRhJyk7XG5cdFx0Y29uc3QgbWVzc2FnZURhdGEgPSAkKGUudGFyZ2V0KS5maW5kKGBvcHRpb25bdmFsdWU9XCIke2UudGFyZ2V0LnZhbHVlfVwiXWApLmRhdGEoJ21lc3NhZ2VEYXRhJyk7XG5cdFx0Y29uc3Qge25vb3B9ID0gZS50YXJnZXQuZm9ybTtcblx0XHRjb25zdCB7dGFsa3BhZ2V9ID0gZS50YXJnZXQuZm9ybTtcblx0XHRjb25zdCB7cmVkaXJlY3RzfSA9IGUudGFyZ2V0LmZvcm07XG5cdFx0aWYgKHJlc3VsdERhdGEubm9vcCB8fCBtZXNzYWdlRGF0YS5hY3Rpb24gPT09ICdub29wJykge1xuXHRcdFx0bm9vcC5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdG5vb3AuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKHRhbGtwYWdlKSB7XG5cdFx0XHRcdHRhbGtwYWdlLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0dGFsa3BhZ2UuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmVkaXJlY3RzLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdHJlZGlyZWN0cy5kaXNhYmxlZCA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vb3AuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0bm9vcC5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdFx0aWYgKG1lc3NhZ2VEYXRhLmFjdGlvbiA9PT0gJ2tlZXAnKSB7XG5cdFx0XHRcdGlmICh0YWxrcGFnZSkge1xuXHRcdFx0XHRcdHRhbGtwYWdlLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR0YWxrcGFnZS5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVkaXJlY3RzLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0cmVkaXJlY3RzLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh0YWxrcGFnZSkge1xuXHRcdFx0XHRcdHRhbGtwYWdlLmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHRhbGtwYWdlLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVkaXJlY3RzLmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0XHRyZWRpcmVjdHMuZGlzYWJsZWQgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChlLnRhcmdldC52YWx1ZSA9PT0gJ3NkJykge1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLnNkcmVhc29uLnBhcmVudEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uc2RyZWFzb24ucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICcnKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IGNvZGUgPSBlLnRhcmdldC5zdWJfZ3JvdXAudmFsdWU7XG5cdFx0Y29uc3QgcmVzdWx0RGF0YSA9ICQoZS50YXJnZXQpLmRhdGEoJ3Jlc3VsdERhdGEnKTtcblx0XHRjb25zdCBtZXNzYWdlRGF0YSA9ICQoZS50YXJnZXQuc3ViX2dyb3VwKS5maW5kKGBvcHRpb25bdmFsdWU9XCIke2NvZGV9XCJdYCkuZGF0YSgnbWVzc2FnZURhdGEnKTtcblx0XHRjb25zdCBub29wID0gZS50YXJnZXQubm9vcC5jaGVja2VkO1xuXHRcdGNvbnN0IHRhbGtwYWdlID0gZS50YXJnZXQudGFsa3BhZ2UgJiYgZS50YXJnZXQudGFsa3BhZ2UuY2hlY2tlZDtcblx0XHRjb25zdCByZWRpcmVjdHMgPSBlLnRhcmdldC5yZWRpcmVjdHMuY2hlY2tlZDtcblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHR0aXRsZTogcmVzdWx0RGF0YS50aXRsZSxcblx0XHRcdGNvZGUsXG5cdFx0XHRyZW1hcms6IGUudGFyZ2V0LnJlbWFyay52YWx1ZSxcblx0XHRcdHNkcmVhc29uOiBlLnRhcmdldC5zZHJlYXNvbi52YWx1ZSxcblx0XHRcdHNlY3Rpb246IHJlc3VsdERhdGEuc2VjdGlvbixcblx0XHRcdHBhcmVudFNlY3Rpb246IHJlc3VsdERhdGEucGFyZW50U2VjdGlvbixcblx0XHRcdG1lc3NhZ2VEYXRhLFxuXHRcdFx0dGFsa3BhZ2UsXG5cdFx0XHRyZWRpcmVjdHMsXG5cdFx0fTtcblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGUudGFyZ2V0KTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSAn5pON5L2c5a6M5oiQJztcblx0XHRpZiAobm9vcCB8fCBtZXNzYWdlRGF0YS5hY3Rpb24gPT09ICdub29wJykge1xuXHRcdFx0VHdpbmtsZS5jbG9zZS5jYWxsYmFja3MudGFsa2VuZChwYXJhbXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzd2l0Y2ggKG1lc3NhZ2VEYXRhLmFjdGlvbikge1xuXHRcdFx0XHRjYXNlICdkZWwnOlxuXHRcdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLmRlbChwYXJhbXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdrZWVwJzoge1xuXHRcdFx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShwYXJhbXMudGl0bGUsICfnp7vpmaTlrZjlup/orqjorrrmqKHmnb8nKTtcblx0XHRcdFx0XHRxaXV3ZW5fcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLmtlZXApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0dm9pZCBtdy5ub3RpZnkoYOWFs+mXreWtmOW6n+iuqOiuuu+8muacquWumuS5iSAke2NvZGV9YCwge1xuXHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZWNsb3NlJyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzID0ge1xuXHRcdGRlbDogKHBhcmFtcykgPT4ge1xuXHRcdFx0bGV0IHF1ZXJ5O1xuXHRcdFx0bGV0IHFpdXdlbl9hcGk7XG5cdFx0XHRNb3JlYml0cy53aWtpLmFkZENoZWNrcG9pbnQoKTtcblx0XHRcdGNvbnN0IHBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHBhcmFtcy50aXRsZSwgJ+WIoOmZpOmhtemdoicpO1xuXHRcdFx0aWYgKHBhcmFtcy5jb2RlID09PSAnc2QnKSB7XG5cdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5wYXJzZVdpa2l0ZXh0KHBhcmFtcy50aXRsZSwgYHt7ZGVsZXRlfCR7cGFyYW1zLnNkcmVhc29ufX19YCwgKHJlYXNvbikgPT4ge1xuXHRcdFx0XHRcdHJlYXNvbiA9IHByb21wdCgn6L6T5YWl5Yig6Zmk55CG55Sx77yM5oiW54K55Ye756Gu5a6a5Lul5o6l5Y+X6Ieq5Yqo55Sf5oiQ55qE77yaJywgcmVhc29uKTtcblx0XHRcdFx0XHRpZiAocmVhc29uID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRwYWdlLmdldFN0YXR1c0VsZW1lbnQoKS53YXJuKCfmsqHmnInmiafooYzliKDpmaQnKTtcblx0XHRcdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cGFnZS5zZXRFZGl0U3VtbWFyeShyZWFzb24pO1xuXHRcdFx0XHRcdFx0cGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0XHRwYWdlLmRlbGV0ZVBhZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRwYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS5jbG9zZS5jYWxsYmFja3MudGFsa2VuZChwYXJhbXMpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhZ2Uuc2V0RWRpdFN1bW1hcnkoYOWtmOW6n+iuqOiuuumAmui/h++8mltbJHttdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyl9IyR7cGFyYW1zLnRpdGxlfV1dYCk7XG5cdFx0XHRcdHBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRwYWdlLmRlbGV0ZVBhZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdHBhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLmluZm8oJ+WujOaIkCcpO1xuXHRcdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLnJlZGlyZWN0cykge1xuXHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0dGl0bGVzOiBwYXJhbXMudGl0bGUsXG5cdFx0XHRcdFx0cHJvcDogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0cmRsaW1pdDogJ21heCcsIC8vIDUwMCBpcyBtYXggZm9yIG5vcm1hbCB1c2VycywgNTAwMCBmb3IgYm90cyBhbmQgc3lzb3BzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0cWl1d2VuX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHQn5q2j5Zyo6I635Y+W6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRUd2lua2xlLmNsb3NlLmNhbGxiYWNrcy5kZWxldGVSZWRpcmVjdHNNYWluXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHFpdXdlbl9hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdFx0XHRxaXV3ZW5fYXBpLnBvc3QoKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMudGFsa1BhZ2UpIHtcblx0XHRcdFx0Y29uc3QgcGFnZVRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFyYW1zLnRpdGxlKTtcblx0XHRcdFx0aWYgKHBhZ2VUaXRsZSAmJiBwYWdlVGl0bGUubmFtZXNwYWNlICUgMiA9PT0gMCAmJiBwYWdlVGl0bGUubmFtZXNwYWNlICE9PSAyKSB7XG5cdFx0XHRcdFx0cGFnZVRpdGxlLm5hbWVzcGFjZSsrOyAvLyBub3cgcGFnZVRpdGxlIGlzIHRoZSB0YWxrIHBhZ2UgdGl0bGUhXG5cdFx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHR0aXRsZXM6IHBhZ2VUaXRsZS50b1RleHQoKSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHFpdXdlbl9hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdFx0XHQn5q2j5Zyo5qOA5p+l6K6o6K666aG16Z2i5piv5ZCm5a2Y5ZyoJyxcblx0XHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdFx0VHdpbmtsZS5jbG9zZS5jYWxsYmFja3MuZGVsZXRlVGFsa1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cWl1d2VuX2FwaS5wYXJhbXMgPSBwYXJhbXM7XG5cdFx0XHRcdFx0cWl1d2VuX2FwaS5hcGlvYmoucGFyYW1zLnRhbGtQYWdlID0gcGFnZVRpdGxlLnRvVGV4dCgpO1xuXHRcdFx0XHRcdHFpdXdlbl9hcGkucG9zdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRNb3JlYml0cy53aWtpLnJlbW92ZUNoZWNrcG9pbnQoKTtcblx0XHR9LFxuXHRcdGRlbGV0ZVJlZGlyZWN0c01haW46IChhcGlvYmopID0+IHtcblx0XHRcdGNvbnN0IHhtbCA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdGNvbnN0IHBhZ2VzID0gJCh4bWwpXG5cdFx0XHRcdC5maW5kKCdyZCcpXG5cdFx0XHRcdC5tYXAoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAkKGVsZW1lbnQpLmF0dHIoJ3RpdGxlJyk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5nZXQoKTtcblx0XHRcdGlmIChwYWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVkaXJlY3REZWxldGVyID0gbmV3IE1vcmViaXRzLmJhdGNoT3BlcmF0aW9uKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpOWIsCAnLCAn5q2j5Zyo5Yiq6Zmk5YiwICcpICtcblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLnRpdGxlICtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJyDnmoTph43lrprlkJEnLCAnIOeahOmHjeaWsOWwjuWQkScpXG5cdFx0XHQpO1xuXHRcdFx0cmVkaXJlY3REZWxldGVyLnNldE9wdGlvbignY2h1bmtTaXplJywgVHdpbmtsZS5nZXRQcmVmKCdiYXRjaGRlbGV0ZUNodW5rcycpKTtcblx0XHRcdHJlZGlyZWN0RGVsZXRlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0XHRyZWRpcmVjdERlbGV0ZXIucnVuKChwYWdlTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UocGFnZU5hbWUsIHdpbmRvdy53Z1VMUygn5q2j5Zyo5Yig6ZmkICcsICfmraPlnKjliKrpmaQgJykgKyBwYWdlTmFtZSk7XG5cdFx0XHRcdHFpdXdlbl9wYWdlLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRcdGBbW1FXOkNTRCNHNXxHNV1d77yaJHt3aW5kb3cud2dVTFMoJ+aMh+WQkeW3suWIoOmhtemdouKAnCcsICfmjIflkJHlt7LliKrpoIHpnaLjgIwnKX0ke2FwaW9iai5wYXJhbXMudGl0bGV9JHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn4oCd55qE6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRcdCfjgI3nmoTph43mlrDlsI7lkJEnXG5cdFx0XHRcdFx0KX1gXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHFpdXdlbl9wYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0cWl1d2VuX3BhZ2UuZGVsZXRlUGFnZShyZWRpcmVjdERlbGV0ZXIud29ya2VyU3VjY2VzcywgcmVkaXJlY3REZWxldGVyLndvcmtlckZhaWx1cmUpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRkZWxldGVUYWxrOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCBleGlzdHMgPSAkKHhtbCkuZmluZCgncGFnZTpub3QoW21pc3NpbmddKScpLmxlbmd0aCA+IDA7XG5cdFx0XHRpZiAoIWV4aXN0cykge1xuXHRcdFx0XHQvLyBubyB0YWxrIHBhZ2U7IGZvcmdldCBhYm91dCBpdFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy50YWxrUGFnZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjliKDpmaTpobXpnaIgJywgJ+ato+WcqOWIqumZpOmggemdoiAnKSArXG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy50aXRsZSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCcg55qE6K6o6K666aG1JywgJyDnmoToqI7oq5bpoIEnKVxuXHRcdFx0KTtcblx0XHRcdHBhZ2Uuc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdGBbW1FXOkNTRCNHNXxHNV1d77yaJHt3aW5kb3cud2dVTFMoJ+W3suWIoOmhtemdouKAnCcsICflt7LliKrpoIHpnaLjgIwnKX0ke2FwaW9iai5wYXJhbXMudGl0bGV9JHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+KAneeahFtbSGVscDrorqjorrrpobV86K6o6K666aG1XV0nLFxuXHRcdFx0XHRcdCfjgI3nmoRbW0hlbHA66KiO6KuW6aCBfOiojuirlumggV1dJ1xuXHRcdFx0XHQpfWBcblx0XHRcdCk7XG5cdFx0XHRwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2UuZGVsZXRlUGFnZSgpO1xuXHRcdH0sXG5cdFx0a2VlcDogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHN0YXRlbGVtID0gcGFnZW9iai5nZXRTdGF0dXNFbGVtZW50KCk7XG5cdFx0XHRpZiAoIXBhZ2VvYmouZXhpc3RzKCkpIHtcblx0XHRcdFx0c3RhdGVsZW0uZXJyb3IoJ+mhtemdouS4jeWtmOWcqO+8jOWPr+iDveW3suiiq+WIoOmZpCcpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGNvbnN0IHBhZ2V0aXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhcmFtcy50aXRsZSk7XG5cdFx0XHRpZiAocGFnZXRpdGxlLmdldE5hbWVzcGFjZUlkKCkgJSAyID09PSAwKSB7XG5cdFx0XHRcdGNvbnN0IHRhbGtwYWdldGl0bGUgPSBuZXcgbXcuVGl0bGUocGFnZXRpdGxlLmdldE1haW5UZXh0KCksIHBhZ2V0aXRsZS5nZXROYW1lc3BhY2VJZCgpICsgMSk7XG5cdFx0XHRcdGNvbnN0IHRhbGtwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHR0YWxrcGFnZXRpdGxlLnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmoIforrDorqjorrrpobUnLCAn5qiZ6KiY6KiO6KuW6aCBJylcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgcmVhc29uID0gcGFyYW1zLm1lc3NhZ2VEYXRhLnZhbHVlIHx8IHBhcmFtcy5tZXNzYWdlRGF0YS5sYWJlbDtcblx0XHRcdFx0Y29uc3QgdmZka2VwdCA9IGB7e09sZCB2ZmQgbXVsdGl8JHttdy5jb25maWdcblx0XHRcdFx0XHQuZ2V0KCd3Z1BhZ2VOYW1lJylcblx0XHRcdFx0XHQuc3BsaXQoJy8nKVxuXHRcdFx0XHRcdC5zbGljZSgyKVxuXHRcdFx0XHRcdC5qb2luKCcvJyl9fCR7cmVhc29ufX19XFxuYDtcblx0XHRcdFx0dGFsa3BhZ2Uuc2V0UHJlcGVuZFRleHQodmZka2VwdCk7XG5cdFx0XHRcdHRhbGtwYWdlLnNldEVkaXRTdW1tYXJ5KGBbWyR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfSMke3BhcmFtcy50aXRsZX1dXe+8miR7cmVhc29ufWApO1xuXHRcdFx0XHR0YWxrcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdHRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0dGFsa3BhZ2UucHJlcGVuZCgpO1xuXHRcdFx0fVxuXHRcdFx0bGV0IG5ld3RleHQgPSB0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdC88bm9pbmNsdWRlPlxccypcXHtcXHsoW3JzYWlmdGNtdl1mZCkoXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfVxccyo8XFwvbm9pbmNsdWRlPlxccyovZ2ksXG5cdFx0XHRcdCcnXG5cdFx0XHQpO1xuXHRcdFx0bmV3dGV4dCA9IG5ld3RleHQucmVwbGFjZSgvXFx7XFx7KFtyc2FpZnRjbXZdZmQpKFxcfCg/Olxce1xce1tee31dKlxcfVxcfXxbXnt9XSkqKT9cXH1cXH1cXHMqL2dpLCAnJyk7XG5cdFx0XHRpZiAocGFyYW1zLmNvZGUgIT09ICd0aycpIHtcblx0XHRcdFx0bmV3dGV4dCA9IG5ld3RleHQucmVwbGFjZShcblx0XHRcdFx0XHQve3sobm90YWJpbGl0eXxmYW1lfG1haXJ855+l5ZCN5bqmfOmHjeimgeaAp3zmmL7okZfmgKd86aGv6JGX5oCnfOefpeWQjeW6puS4jei2s3zkurrnianph43opoHmgKd86YeN6KaB5oCn5LiN6LazfG5vdGFibGV85YWz5rOo5bqmfOWFs+azqOW6puS4jei2s3zpl5zms6jluqZ86Zec5rOo5bqm5LiN6LazfOmHjeimgXzph43opoHluqYpKFxcfCg/Ont7W157fV0qfX18W157fV0pKik/fX1cXG4qL2dpLFxuXHRcdFx0XHRcdCcnXG5cdFx0XHRcdCk7XG5cdFx0XHRcdG5ld3RleHQgPSBuZXd0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdFx0L3t7KHN1YnN0dWJ85bCP5bCP5L2c5ZOBfGNvZHzlsI/lsI/mop3nm6585bCP5bCP5p2h55uuKShcXHwoPzp7e1tee31dKn19fFtee31dKSopP319XFxuKi9naSxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy5jb2RlID09PSAnbWVyZ2VhcHByb3ZlZCcpIHtcblx0XHRcdFx0Y29uc3QgdGFnID0gJ3t7J1xuXHRcdFx0XHRcdC5jb25jYXQoJ3N1YnN0OicpXG5cdFx0XHRcdFx0LmNvbmNhdChgTWVyZ2UgYXBwcm92ZWQvYXV0b3xkaXNjdXNzPSR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfSMke3BhcmFtcy50aXRsZX19fVxcbmApO1xuXHRcdFx0XHQvLyBJbnNlcnQgdGFnIGFmdGVyIHNob3J0IGRlc2NyaXB0aW9uIG9yIGFueSBoYXRub3Rlc1xuXHRcdFx0XHRjb25zdCBxaXV3ZW5fcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpdGV4dC5wYWdlKG5ld3RleHQpO1xuXHRcdFx0XHRuZXd0ZXh0ID0gcWl1d2VuX3BhZ2UuaW5zZXJ0QWZ0ZXJUZW1wbGF0ZXModGFnLCBUd2lua2xlLmhhdG5vdGVSZWdleCkuZ2V0VGV4dCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5ld3RleHQgPT09IHRleHQpIHtcblx0XHRcdFx0c3RhdGVsZW0ud2Fybign5pyq5om+5Yiw5a2Y5bqf6K6o6K665qih5p2/77yM5Y+v6IO95bey6KKr56e76ZmkJyk7XG5cdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZWRpdHN1bW1hcnkgPSBg5a2Y5bqf6K6o6K665YWz6Zet77yaW1ske213LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKX0jJHtwYXJhbXMudGl0bGV9XV1gO1xuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dChuZXd0ZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoZWRpdHN1bW1hcnkpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZShUd2lua2xlLmNsb3NlLmNhbGxiYWNrcy5rZWVwQ29tcGxldGUpO1xuXHRcdH0sXG5cdFx0a2VlcENvbXBsZXRlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHR9LFxuXHRcdHRhbGtlbmQ6IChwYXJhbXMpID0+IHtcblx0XHRcdGNvbnN0IHFpdXdlbl9wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksICflhbPpl63orqjorronKTtcblx0XHRcdHFpdXdlbl9wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0cWl1d2VuX3BhZ2Uuc2V0UGFnZVNlY3Rpb24ocGFyYW1zLnNlY3Rpb24pO1xuXHRcdFx0cWl1d2VuX3BhZ2UubG9hZChUd2lua2xlLmNsb3NlLmNhbGxiYWNrcy5zYXZlVGFsayk7XG5cdFx0fSxcblx0XHRzYXZlVGFsazogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHN0YXRlbGVtID0gcGFnZW9iai5nZXRTdGF0dXNFbGVtZW50KCk7XG5cdFx0XHRsZXQgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRpZiAodGV4dC5pbmNsdWRlcygne3tkZWxoJykpIHtcblx0XHRcdFx0c3RhdGVsZW0uZXJyb3IoJ+iuqOiuuuW3suiiq+WFs+mXrScpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzYmVnaW4gPSB0ZXh0LmluY2x1ZGVzKCc8c2VjdGlvbiBiZWdpbj1iYWNrbG9nIC8+Jyk7XG5cdFx0XHRjb25zdCBzZW5kID0gdGV4dC5pbmNsdWRlcygnPHNlY3Rpb24gZW5kPWJhY2tsb2cgLz4nKTtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoJ1xcbjxzZWN0aW9uIGJlZ2luPWJhY2tsb2cgLz4nLCAnJyk7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCdcXG48c2VjdGlvbiBlbmQ9YmFja2xvZyAvPicsICcnKTtcblx0XHRcdGNvbnN0IGJhciA9IHRleHQuc3BsaXQoJ1xcbi0tLS1cXG4nKTtcblx0XHRcdGNvbnN0IHNwbGl0ID0gYmFyWzBdLnNwbGl0KCdcXG4nKTtcblx0XHRcdHRleHQgPSBgJHtzcGxpdFswXX1cXG57e2RlbGh8JHtwYXJhbXMuY29kZX19fVxcbmA7XG5cdFx0XHR0ZXh0ICs9IHNwbGl0LnNsaWNlKDEpLmpvaW4oJ1xcbicpO1xuXHRcdFx0Y29uc3QgcmVhc29uID0gcGFyYW1zLm1lc3NhZ2VEYXRhLnZhbHVlIHx8IHBhcmFtcy5tZXNzYWdlRGF0YS5sYWJlbDtcblx0XHRcdHRleHQgKz0gYFxcbjxocj5cXG46ICR7cmVhc29ufWA7XG5cdFx0XHRpZiAocGFyYW1zLnJlbWFyaykge1xuXHRcdFx0XHR0ZXh0ICs9IGDvvJoke01vcmViaXRzLnN0cmluZy5hcHBlbmRQdW5jdHVhdGlvbihwYXJhbXMucmVtYXJrKX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGV4dCArPSAn44CCJztcblx0XHRcdH1cblx0XHRcdGlmICghTW9yZWJpdHMudXNlcklzU3lzb3ApIHtcblx0XHRcdFx0dGV4dCArPSAne3snLmNvbmNhdCgnc3Vic3Q6JykuY29uY2F0KCdOQUN9fScpO1xuXHRcdFx0fVxuXHRcdFx0dGV4dCArPSAnLS1+ficuY29uY2F0KCd+ficsICdcXG57e2RlbGZ9fScpO1xuXHRcdFx0aWYgKGJhclsxXSkge1xuXHRcdFx0XHR0ZXh0ICs9IGBcXG4tLS0tXFxuJHtiYXIuc2xpY2UoMSkuam9pbignXFxuLS0tLVxcbicpfWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2VuZCkge1xuXHRcdFx0XHR0ZXh0ICs9ICdcXG48c2VjdGlvbiBlbmQ9YmFja2xvZyAvPic7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2JlZ2luKSB7XG5cdFx0XHRcdC8vIGd1YXJhbnRlZWQgdG8gYmUgYXQgdG5lIGVuZD9cblx0XHRcdFx0dGV4dCArPSAnXFxuPHNlY3Rpb24gYmVnaW49YmFja2xvZyAvPic7XG5cdFx0XHR9XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShgLyogJHtwYXJhbXMudGl0bGV9ICovICR7cmVhc29ufWApO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZShUd2lua2xlLmNsb3NlLmNhbGxiYWNrcy5kaXNhYmxlTGluayk7XG5cdFx0fSxcblx0XHRkaXNhYmxlTGluazogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHQkKGBzdHJvbmcgYVtocmVmPSMke3BhcmFtcy5zZWN0aW9ufV0gc3BhbmApLmNzcygnY29sb3InLCAnIzgwODA4MCcpO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuY2xvc2UsICdjbG9zZScpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5cbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWNvbmZpZy5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVjb25maWcoJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0LyoqXG5cdCAqIHR3aW5rbGVjb25maWcuanM6IFByZWZlcmVuY2VzIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IEFkZHMgY29uZmlndXJhdGlvbiBmb3JtIHRvIEhlbHA6VHdpbmtsZS/lj4LmlbDorr7nva4sXG5cdCAqIGFuZCBhZGRzIGFuIGFkIGJveCB0byB0aGUgdG9wIG9mIHVzZXIgc3VicGFnZXMgYmVsb25naW5nIHRvIHRoZVxuXHQgKiBjdXJyZW50bHkgbG9nZ2VkLWluIHVzZXIgd2hpY2ggZW5kIGluICcuanMnXG5cdCAqIEFjdGl2ZSBvbjogV2hhdCBJIGp1c3Qgc2FpZC4gWWVhaC5cblx0ICovXG5cdFR3aW5rbGUuY29uZmlnID0ge307XG5cdFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zID0ge1xuXHRcdHllczogd2luZG93LndnVUxTKCfmsLjkuYXliqDlhaXliLDnm5Hop4bliJfooagnLCAn5rC45LmF5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0bm86IHdpbmRvdy53Z1VMUygn5LiN5Yqg5YWl5Yiw55uR6KeG5YiX6KGoJywgJ+S4jeWKoOWFpeWIsOebo+imlua4heWWricpLFxuXHRcdGRlZmF1bHQ6IHdpbmRvdy53Z1VMUygn6YG15a6I56uZ54K56K6+572uJywgJ+mBteWuiOermem7nuioreWumicpLFxuXHRcdCcxIHdlZWsnOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeWIsOebkeinhuWIl+ihqDHlkagnLCAn5Yqg5YWl5Yiw55uj6KaW5riF5ZauMemAsScpLFxuXHRcdCcxIG1vbnRoJzogd2luZG93LndnVUxTKCfliqDlhaXliLDnm5Hop4bliJfooagx5Liq5pyIJywgJ+WKoOWFpeWIsOebo+imlua4heWWrjHlgIvmnIgnKSxcblx0XHQnMyBtb250aHMnOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeWIsOebkeinhuWIl+ihqDPkuKrmnIgnLCAn5Yqg5YWl5Yiw55uj6KaW5riF5ZauM+WAi+aciCcpLFxuXHRcdCc2IG1vbnRocyc6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5Yiw55uR6KeG5YiX6KGoNuS4quaciCcsICfliqDlhaXliLDnm6PoppbmuIXllq425YCL5pyIJyksXG5cdH07XG5cdFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMgPSB7XG5cdFx0Y3NkQ3JpdGVyaWE6IHtcblx0XHRcdGRiOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieeQhueUsScsICfoh6roqILnkIbnlLEnKSxcblx0XHRcdGcxOiAnRzEnLFxuXHRcdFx0ZzI6ICdHMicsXG5cdFx0XHRnMzogJ0czJyxcblx0XHRcdGc0OiAnRzQnLFxuXHRcdFx0ZzU6ICdHNScsXG5cdFx0XHRnNjogJ0c2Jyxcblx0XHRcdGc3OiAnRzcnLFxuXHRcdFx0Zzg6ICdHOCcsXG5cdFx0XHRnOTogJ0c5Jyxcblx0XHRcdGExOiAnQTEnLFxuXHRcdFx0YTI6ICdBMicsXG5cdFx0XHRhMzogJ0EzJyxcblx0XHRcdG8xOiAnTzEnLFxuXHRcdFx0bzI6ICdPMicsXG5cdFx0XHRvMzogJ08zJyxcblx0XHRcdGYxOiAnRjEnLFxuXHRcdFx0ZjI6ICdGMicsXG5cdFx0XHRmMzogJ0YzJyxcblx0XHRcdGY0OiAnRjQnLFxuXHRcdFx0ZjU6ICdGNScsXG5cdFx0XHRyMTogJ1IxJyxcblx0XHRcdHIyOiAnUjInLFxuXHRcdH0sXG5cdFx0Y3NkQ3JpdGVyaWFEaXNwbGF5T3JkZXI6IFtcblx0XHRcdCdkYicsXG5cdFx0XHQnZzEnLFxuXHRcdFx0J2cyJyxcblx0XHRcdCdnMycsXG5cdFx0XHQnZzQnLFxuXHRcdFx0J2c1Jyxcblx0XHRcdCdnNicsXG5cdFx0XHQnZzcnLFxuXHRcdFx0J2c4Jyxcblx0XHRcdCdnOScsXG5cdFx0XHQnYTEnLFxuXHRcdFx0J2EyJyxcblx0XHRcdCdhMycsXG5cdFx0XHQnbzEnLFxuXHRcdFx0J28yJyxcblx0XHRcdCdvMycsXG5cdFx0XHQnZjEnLFxuXHRcdFx0J2YyJyxcblx0XHRcdCdmMycsXG5cdFx0XHQnZjQnLFxuXHRcdFx0J2Y1Jyxcblx0XHRcdCdyMScsXG5cdFx0XHQncjInLFxuXHRcdF0sXG5cdFx0Y3NkQ3JpdGVyaWFOb3RpZmljYXRpb246IHtcblx0XHRcdGRiOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieeQhueUsScsICfoh6roqILnkIbnlLEnKSxcblx0XHRcdGcxOiAnRzEnLFxuXHRcdFx0ZzI6ICdHMicsXG5cdFx0XHRnMzogJ0czJyxcblx0XHRcdGc0OiAnRzQnLFxuXHRcdFx0ZzU6ICdHNScsXG5cdFx0XHRnNjogJ0c2Jyxcblx0XHRcdGc3OiAnRzcnLFxuXHRcdFx0Zzg6ICdHOCcsXG5cdFx0XHRnOTogJ0c5Jyxcblx0XHRcdGExOiAnQTEnLFxuXHRcdFx0YTI6ICdBMicsXG5cdFx0XHRhMzogJ0EzJyxcblx0XHRcdG8xOiAnTzEnLFxuXHRcdFx0bzI6ICdPMicsXG5cdFx0XHRvMzogJ08zJyxcblx0XHRcdGYxOiAnRjEnLFxuXHRcdFx0ZjI6ICdGMicsXG5cdFx0XHRmMzogJ0YzJyxcblx0XHRcdGY0OiAnRjQnLFxuXHRcdFx0ZjU6ICdGNScsXG5cdFx0XHRyMTogJ1IxJyxcblx0XHRcdHIyOiAnUjInLFxuXHRcdH0sXG5cdFx0Y3NkQ3JpdGVyaWFOb3RpZmljYXRpb25EaXNwbGF5T3JkZXI6IFtcblx0XHRcdCdkYicsXG5cdFx0XHQnZzEnLFxuXHRcdFx0J2cyJyxcblx0XHRcdCdnMycsXG5cdFx0XHQnZzQnLFxuXHRcdFx0J2c1Jyxcblx0XHRcdCdnNicsXG5cdFx0XHQnZzcnLFxuXHRcdFx0J2c4Jyxcblx0XHRcdCdnOScsXG5cdFx0XHQnYTEnLFxuXHRcdFx0J2EyJyxcblx0XHRcdCdhMycsXG5cdFx0XHQnbzEnLFxuXHRcdFx0J28yJyxcblx0XHRcdCdvMycsXG5cdFx0XHQnZjEnLFxuXHRcdFx0J2YyJyxcblx0XHRcdCdmMycsXG5cdFx0XHQnZjQnLFxuXHRcdFx0J2Y1Jyxcblx0XHRcdCdyMScsXG5cdFx0XHQncjInLFxuXHRcdF0sXG5cdFx0Y3NkQW5kRElDcml0ZXJpYToge1xuXHRcdFx0ZGI6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ55CG55SxJywgJ+iHquiogueQhueUsScpLFxuXHRcdFx0ZzE6ICdHMScsXG5cdFx0XHRnMjogJ0cyJyxcblx0XHRcdGczOiAnRzMnLFxuXHRcdFx0ZzQ6ICdHNCcsXG5cdFx0XHRnNTogJ0c1Jyxcblx0XHRcdGc2OiAnRzYnLFxuXHRcdFx0Zzc6ICdHNycsXG5cdFx0XHRnODogJ0c4Jyxcblx0XHRcdGc5OiAnRzknLFxuXHRcdFx0YTE6ICdBMScsXG5cdFx0XHRhMjogJ0EyJyxcblx0XHRcdGEzOiAnQTMnLFxuXHRcdFx0bzE6ICdPMScsXG5cdFx0XHRvMjogJ08yJyxcblx0XHRcdG8zOiAnTzMnLFxuXHRcdFx0ZjE6ICdGMScsXG5cdFx0XHRmMjogJ0YyJyxcblx0XHRcdGYzOiAnRjMnLFxuXHRcdFx0ZjQ6ICdGNCcsXG5cdFx0XHRmNTogJ0Y1Jyxcblx0XHRcdHIxOiAnUjEnLFxuXHRcdFx0cjI6ICdSMicsXG5cdFx0fSxcblx0XHRjc2RBbmRESUNyaXRlcmlhRGlzcGxheU9yZGVyOiBbXG5cdFx0XHQnZGInLFxuXHRcdFx0J2cxJyxcblx0XHRcdCdnMicsXG5cdFx0XHQnZzMnLFxuXHRcdFx0J2c0Jyxcblx0XHRcdCdnNScsXG5cdFx0XHQnZzYnLFxuXHRcdFx0J2c3Jyxcblx0XHRcdCdnOCcsXG5cdFx0XHQnZzknLFxuXHRcdFx0J2ExJyxcblx0XHRcdCdhMicsXG5cdFx0XHQnYTMnLFxuXHRcdFx0J28xJyxcblx0XHRcdCdvMicsXG5cdFx0XHQnbzMnLFxuXHRcdFx0J2YxJyxcblx0XHRcdCdmMicsXG5cdFx0XHQnZjMnLFxuXHRcdFx0J2Y0Jyxcblx0XHRcdCdmNScsXG5cdFx0XHQncjEnLFxuXHRcdFx0J3IyJyxcblx0XHRdLFxuXHRcdHhmZENyaXRlcmlhOiB7XG5cdFx0XHRkZWxldGU6IHdpbmRvdy53Z1VMUygn5Yig6ZmkJywgJ+WIqumZpCcpLFxuXHRcdFx0bWVyZ2U6IHdpbmRvdy53Z1VMUygn5ZCI5bm2JywgJ+WQiOS9tScpLFxuXHRcdFx0ZndkY3NkOiB3aW5kb3cud2dVTFMoJ+i9rOS6pOiHquW/q+mAn+WIoOmZpOWAmemAiScsICfovYnkuqToh6rlv6vpgJ/liKrpmaTlgJnpgbgnKSxcblx0XHRcdGZhbWU6IHdpbmRvdy53Z1VMUygn5om56YeP5YWz5rOo5bqm5o+Q5YigJywgJ+aJueasoemXnOazqOW6puaPkOWIqicpLFxuXHRcdFx0c3Vic3R1Yjogd2luZG93LndnVUxTKCfmibnph4/lsI/lsI/kvZzlk4Hmj5DliKAnLCAn5om55qyh5bCP5bCP5L2c5ZOB5o+Q5YiqJyksXG5cdFx0XHRiYXRjaDogd2luZG93LndnVUxTKCfmibnph4/lhbbku5bmj5DliKAnLCAn5om55qyh5YW25LuW5o+Q5YiqJyksXG5cdFx0fSxcblx0XHR4ZmRDcml0ZXJpYURpc3BsYXlPcmRlcjogWydkZWxldGUnLCAnbWVyZ2UnLCAnZndkY3NkJywgJ2ZhbWUnLCAnc3Vic3R1YicsICdiYXRjaCddLFxuXHRcdG5hbWVzcGFjZXNOb1NwZWNpYWw6IHtcblx0XHRcdDA6IHdpbmRvdy53Z1VMUygn77yI5p2h55uu77yJJywgJ++8iOaineebru+8iScpLFxuXHRcdFx0MTogJ1RhbGsnLFxuXHRcdFx0MjogJ1VzZXInLFxuXHRcdFx0MzogJ1VzZXIgdGFsaycsXG5cdFx0XHQ0OiAnUWl1d2VuJyxcblx0XHRcdDU6ICdRaXV3ZW4gdGFsaycsXG5cdFx0XHQ2OiAnRmlsZScsXG5cdFx0XHQ3OiAnRmlsZSB0YWxrJyxcblx0XHRcdDg6ICdNZWRpYVdpa2knLFxuXHRcdFx0OTogJ01lZGlhV2lraSB0YWxrJyxcblx0XHRcdDEwOiAnVGVtcGxhdGUnLFxuXHRcdFx0MTE6ICdUZW1wbGF0ZSB0YWxrJyxcblx0XHRcdDEyOiAnSGVscCcsXG5cdFx0XHQxMzogJ0hlbHAgdGFsaycsXG5cdFx0XHQxNDogJ0NhdGVnb3J5Jyxcblx0XHRcdDE1OiAnQ2F0ZWdvcnkgdGFsaycsXG5cdFx0XHQxMTg6ICdEcmFmdCcsXG5cdFx0XHQxMTk6ICdEcmFmdCB0YWxrJyxcblx0XHRcdDIwNDogJ05FQScsXG5cdFx0XHQyMDU6ICdORUEgdGFsaycsXG5cdFx0XHQyMDY6ICdBZGRlbmR1bScsXG5cdFx0XHQyMDc6ICdBZGRlbmR1bSB0YWxrJyxcblx0XHRcdDgyODogJ01vZHVsZScsXG5cdFx0XHQ4Mjk6ICdNb2R1bGUgdGFsaycsXG5cdFx0fSxcblx0fTtcblx0LyoqXG5cdCAqIFNlY3Rpb24gZW50cnkgZm9ybWF0OlxuXHQgKlxuXHQgKiB7XG5cdCAqICAgdGl0bGU6IDxodW1hbi1yZWFkYWJsZSBzZWN0aW9uIHRpdGxlPixcblx0ICogICBtb2R1bGU6IDxuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIG1vZHVsZSwgdXNlZCB0byBsaW5rIHRvIHNlY3Rpb25zPixcblx0ICogICBhZG1pbk9ubHk6IDx0cnVlIGZvciBhZG1pbi1vbmx5IHNlY3Rpb25zPixcblx0ICogICBoaWRkZW46IDx0cnVlIGZvciBhZHZhbmNlZCBwcmVmZXJlbmNlcyB0aGF0IHJhcmVseSBuZWVkIHRvIGJlIGNoYW5nZWQgLSB0aGV5IGNhbiBzdGlsbCBiZSBtb2RpZmllZCBieSBtYW51YWxseSBlZGl0aW5nIHR3aW5rbGVvcHRpb25zLmpzPixcblx0ICogICBwcmVmZXJlbmNlczogW1xuXHQgKiAgICAge1xuXHQgKiAgICAgICBuYW1lOiA8VHdpbmtsZUNvbmZpZyBwcm9wZXJ0eSBuYW1lPixcblx0ICogICAgICAgbGFiZWw6IDxodW1hbi1yZWFkYWJsZSBzaG9ydCBkZXNjcmlwdGlvbiAtIHVzZWQgYXMgYSBmb3JtIGxhYmVsPixcblx0ICogICAgICAgaGVscHRpcDogPChvcHRpb25hbCkgaHVtYW4tcmVhZGFibGUgdGV4dCAodXNpbmcgdmFsaWQgSFRNTCkgdGhhdCBjb21wbGVtZW50cyB0aGUgZGVzY3JpcHRpb24sIGxpa2UgbGltaXRzLCB3YXJuaW5ncywgZXRjLj5cblx0ICogICAgICAgYWRtaW5Pbmx5OiA8dHJ1ZSBmb3IgYWRtaW4tb25seSBwcmVmZXJlbmNlcz4sXG5cdCAqICAgICAgIHR5cGU6IDxzdHJpbmd8Ym9vbGVhbnxpbnRlZ2VyfGVudW18c2V0fGN1c3RvbUxpc3Q+IChjdXN0b21MaXN0IHN0b3JlcyBhbiBhcnJheSBvZiBKU09OIG9iamVjdHMgeyB2YWx1ZSwgbGFiZWwgfSksXG5cdCAqICAgICAgIGVudW1WYWx1ZXM6IDxmb3IgdHlwZSA9IFwiZW51bVwiOiBhIEpTT04gb2JqZWN0IHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgaW50ZXJuYWwgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIGh1bWFuLXJlYWRhYmxlIHN0cmluZ3M+LFxuXHQgKiAgICAgICBzZXRWYWx1ZXM6IDxmb3IgdHlwZSA9IFwic2V0XCI6IGEgSlNPTiBvYmplY3Qgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBpbnRlcm5hbCBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgaHVtYW4tcmVhZGFibGUgc3RyaW5ncz4sXG5cdCAqICAgICAgIHNldERpc3BsYXlPcmRlcjogPChvcHRpb25hbCkgZm9yIHR5cGUgPSBcInNldFwiOiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBrZXlzIG9mIHNldFZhbHVlcyAoYXMgc3RyaW5ncykgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgZGlzcGxheWVkPixcblx0ICogICAgICAgY3VzdG9tTGlzdFZhbHVlVGl0bGU6IDxmb3IgdHlwZSA9IFwiY3VzdG9tTGlzdFwiOiB0aGUgaGVhZGluZyBmb3IgdGhlIGxlZnQgXCJ2YWx1ZVwiIGNvbHVtbiBpbiB0aGUgY3VzdG9tIGxpc3QgZWRpdG9yPixcblx0ICogICAgICAgY3VzdG9tTGlzdExhYmVsVGl0bGU6IDxmb3IgdHlwZSA9IFwiY3VzdG9tTGlzdFwiOiB0aGUgaGVhZGluZyBmb3IgdGhlIHJpZ2h0IFwibGFiZWxcIiBjb2x1bW4gaW4gdGhlIGN1c3RvbSBsaXN0IGVkaXRvcj5cblx0ICogICAgIH0sXG5cdCAqICAgICAuIC4gLlxuXHQgKiAgIF1cblx0ICogfSxcblx0ICogLiAuIC5cblx0ICpcblx0ICovXG5cdFR3aW5rbGUuY29uZmlnLnNlY3Rpb25zID0gW1xuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+W4uOinhCcsICfluLjopo8nKSxcblx0XHRcdG1vZHVsZTogJ2dlbmVyYWwnLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy51c2VyVGFsa1BhZ2VNb2RlIG1heSB0YWtlIGFyZ3VtZW50czpcblx0XHRcdFx0Ly8gJ3dpbmRvdyc6IG9wZW4gYSBuZXcgd2luZG93LCByZW1lbWJlciB0aGUgb3BlbmVkIHdpbmRvd1xuXHRcdFx0XHQvLyAndGFiJzogb3BlbnMgaW4gYSBuZXcgdGFiLCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0Ly8gJ2JsYW5rJzogZm9yY2Ugb3BlbiBpbiBhIG5ldyB3aW5kb3csIGV2ZW4gaWYgc3VjaCBhIHdpbmRvdyBleGlzdHNcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd1c2VyVGFsa1BhZ2VNb2RlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflvZPopoHmiZPlvIDnlKjmiLforqjorrrpobXml7YnLCAn55W26KaB5omT6ZaL5L2/55So6ICF6KiO6KuW6aCB5pmCJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IHtcblx0XHRcdFx0XHRcdHdpbmRvdzogd2luZG93LndnVUxTKCflnKjnqpflj6PkuK3vvIzmm7/mjaLmiJDlhbblroPnlKjmiLflr7nor53pobUnLCAn5Zyo55W25YmN5YiG6aCB77yM5pu/5o+b5oiQ5YW25a6D55So5oi26KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0XHR0YWI6IHdpbmRvdy53Z1VMUygn5Zyo5paw5qCH562+6aG15LitJywgJ+WcqOaWsOWIhumggeS4rScpLFxuXHRcdFx0XHRcdFx0Ymxhbms6IHdpbmRvdy53Z1VMUygn5Zyo5YWo5paw55qE56qX5Y+j5LitJywgJ+WcqOaWsOimlueql+S4rScpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuZGlhbG9nTGFyZ2VGb250IChib29sZWFuKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2RpYWxvZ0xhcmdlRm9udCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5ZyoVHdpbmtsZeWvueivneahhuS4reS9v+eUqOWkp+WPt+Wtl+S9kycsICflnKhUd2lua2xl5bCN6Kmx5pa55aGK5Lit5L2/55So5aSn6Jmf5a2X5Z6LJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlLmNvbmZpZy5kaXNhYmxlZE1vZHVsZXMgKGFycmF5KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2Rpc2FibGVkTW9kdWxlcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWz6Zet5oyH5a6a55qEVHdpbmtsZeaooeWdlycsICfpl5zplonmjIflrprnmoRUd2lua2xl5qih57WEJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aCqOWcqOatpOmAieaLqeeahOWKn+iDveWwhuaXoOazleS9v+eUqO+8jOWPlua2iOmAieaLqeS7pemHjeaWsOWQr+eUqOWKn+iDveOAgicsXG5cdFx0XHRcdFx0XHQn5oKo5Zyo5q2k6YG45pOH55qE5Yqf6IO95bCH54Sh5rOV5L2/55So77yM5Y+W5raI6YG45pOH5Lul6YeN5paw5ZWf55So5Yqf6IO944CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ3NldCcsXG5cdFx0XHRcdFx0c2V0VmFsdWVzOiB7XG5cdFx0XHRcdFx0XHRhcnY6IHdpbmRvdy53Z1VMUygn5ZGK54q2JywgJ+WRiueLgCcpLFxuXHRcdFx0XHRcdFx0d2FybjogJ+itpuWRiicsXG5cdFx0XHRcdFx0XHRibG9jazogd2luZG93LndnVUxTKCflsIHnpoEnLCAn5bCB6Y6WJyksXG5cdFx0XHRcdFx0XHR0YWxrYmFjazogJ+mAmuWRiicsXG5cdFx0XHRcdFx0XHRzcGVlZHk6IHdpbmRvdy53Z1VMUygn6YCf5YigJywgJ+mAn+WIqicpLFxuXHRcdFx0XHRcdFx0Y29weXZpbzogd2luZG93LndnVUxTKCfkvrXmnYMnLCAn5L615qyKJyksXG5cdFx0XHRcdFx0XHR4ZmQ6IHdpbmRvdy53Z1VMUygn5o+Q5YigJywgJ+aPkOWIqicpLFxuXHRcdFx0XHRcdFx0aW1hZ2U6IHdpbmRvdy53Z1VMUygn5Zu+5p2DJywgJ+WcluasiicpLFxuXHRcdFx0XHRcdFx0cHJvdGVjdDogd2luZG93LndnVUxTKCfkv53miqQnLCAn5L+d6K23JyksXG5cdFx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5qCH6K6wJywgJ+aomeiomCcpLFxuXHRcdFx0XHRcdFx0c3R1YjogJ+Wwj+S9nOWTgScsXG5cdFx0XHRcdFx0XHRkaWZmOiB3aW5kb3cud2dVTFMoJ+W3ruW8gicsICflt67nlbAnKSxcblx0XHRcdFx0XHRcdHVubGluazogd2luZG93LndnVUxTKCfpk77lhaUnLCAn6YCj5YWlJyksXG5cdFx0XHRcdFx0XHRmbHVmZjogJ+WbnumAgCcsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZS5jb25maWcuZGlzYWJsZWRTeXNvcE1vZHVsZXMgKGFycmF5KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2Rpc2FibGVkU3lzb3BNb2R1bGVzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhbPpl63mjIflrprnmoRUd2lua2xl566h55CG5ZGY5qih5Z2XJywgJ+mXnOmWieaMh+WumueahFR3aW5rbGXnrqHnkIblk6HmqKHntYQnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5oKo5Zyo5q2k6YCJ5oup55qE5Yqf6IO95bCG5peg5rOV5L2/55So77yM5Y+W5raI6YCJ5oup5Lul6YeN5paw5ZCv55So5Yqf6IO944CCJyxcblx0XHRcdFx0XHRcdCfmgqjlnKjmraTpgbjmk4fnmoTlip/og73lsIfnhKHms5Xkvb/nlKjvvIzlj5bmtojpgbjmk4fku6Xph43mlrDllZ/nlKjlip/og73jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRhZG1pbk9ubHk6IHRydWUsXG5cdFx0XHRcdFx0dHlwZTogJ3NldCcsXG5cdFx0XHRcdFx0c2V0VmFsdWVzOiB7XG5cdFx0XHRcdFx0XHRiYXRjaGRlbGV0ZTogd2luZG93LndnVUxTKCfmibnliKAnLCAn5om55YiqJyksXG5cdFx0XHRcdFx0XHRiYXRjaHVuZGVsZXRlOiB3aW5kb3cud2dVTFMoJ+aJueWkjScsICfmibnlvqknKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+WRiueKticsICflkYrni4AnKSxcblx0XHRcdG1vZHVsZTogJ2FydicsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3NwaVdhdGNoUmVwb3J0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj5HotbflgoDlhKHosIPmn6Xml7bliqDlhaXliLDnm5Hop4bliJfooagnLCAn55m86LW35YKA5YSh6Kq/5p+l5pmC5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+WwgeemgeeUqOaItycsICflsIHpjpbkvb/nlKjogIUnKSxcblx0XHRcdG1vZHVsZTogJ2Jsb2NrJyxcblx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuZGVmYXVsdFRvQmxvY2s2NCAoYm9vbGVhbilcblx0XHRcdFx0Ly8gV2hldGhlciB0byBkZWZhdWx0IHRvIGp1c3QgYmxvY2tpbmcgdGhlIC82NCBvbiBvciBvZmZcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdkZWZhdWx0VG9CbG9jazY0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflr7nkuo5JUHY25Zyw5Z2A77yM6buY6K6k6YCJ5oup5bCB56aBLzY05q61JywgJ+WwjeaWvElQdjblnLDlnYDvvIzpoJDoqK3pgbjmk4flsIHpjpYvNjTmrrUnKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuZGVmYXVsdFRvUGFydGlhbEJsb2NrcyAoYm9vbGVhbilcblx0XHRcdFx0Ly8gV2hldGhlciB0byBkZWZhdWx0IHBhcnRpYWwgYmxvY2tzIG9uIG9yIG9mZlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2RlZmF1bHRUb1BhcnRpYWxCbG9ja3MnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aJk+W8gOWwgeemgeiPnOWNleaXtum7mOiupOmAieaLqemDqOWIhuWwgeemgScsICfmiZPplovlsIHpjpbpgbjllq7mmYLpoJDoqK3pgbjmk4fpg6jliIblsIHpjpYnKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcud2F0Y2hCbG9ja05vdGljZXMgKHN0cmluZylcblx0XHRcdFx0Ly8gV2F0Y2hsaXN0IHNldHRpbmcgZm9yIHRoZSBwYWdlIHdoaWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQgYW4gd2FybmluZyBvciBub3RpY2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaEJsb2NrTm90aWNlcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflj5HpgIHlsIHnpoHmqKHmnb/ml7bliqDlhaXnlKjmiLforqjorrrpobXliLDnm5Hop4bliJfooagnLFxuXHRcdFx0XHRcdFx0J+eZvOmAgeWwgemOluaooeadv+aZguWKoOWFpeS9v+eUqOiAheiojuirlumggeWIsOebo+imlua4heWWridcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjdXN0b21CbG9ja1JlYXNvbkxpc3QnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieWwgeemgeeQhueUsScsICfoh6roqILlsIHpjpbnkIbnlLEnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5oKo5Y+v5Lul5Yqg5YWl5bi455So55qE5bCB56aB55CG55Sx44CC6Ieq5a6a5LmJ55qE5bCB56aB55CG55Sx5Lya5Ye6546w5Zyo5LiA6Iis55qE5bCB56aB55CG55Sx5LiL5pa544CCJyxcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XliqDlhaXluLjnlKjnmoTlsIHpjpbnkIbnlLHjgILoh6roqILnmoTlsIHpjpbnkIbnlLHmnIPlh7rnj77lnKjkuIDoiKznmoTlsIHpjpbnkIbnlLHkuIvmlrnjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnY3VzdG9tTGlzdCcsXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdFZhbHVlVGl0bGU6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfkvb/nlKjlsIHnpoHmqKHmnb/vvIjpu5jorqTkuLogdXctYmxvY2sx77yJJyxcblx0XHRcdFx0XHRcdCfkvb/nlKjlsIHpjpbmqKHmnb/vvIjpoJDoqK3ngrogdXctYmxvY2sx77yJJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdExhYmVsVGl0bGU6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfigJznlLHkuo7igKbmgqjlt7LooqvlsIHnpoHigJ3lj4rlsIHnpoHml6Xlv5fnkIbnlLEnLFxuXHRcdFx0XHRcdFx0J+OAjOeUseaWvOKApuaCqOW3suiiq+WwgemOluOAjeWPiuWwgemOluaXpeiqjOeQhueUsSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+WbvueJh+WIoOmZpCcsICflnJbniYfliKrpmaQnKSxcblx0XHRcdG1vZHVsZTogJ2ltYWdlJyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcubm90aWZ5VXNlck9uRGVsaSAoYm9vbGVhbilcblx0XHRcdFx0Ly8gSWYgdGhlIHVzZXIgc2hvdWxkIGJlIG5vdGlmaWVkIGFmdGVyIHBsYWNpbmcgYSBmaWxlIGRlbGV0aW9uIHRhZ1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ25vdGlmeVVzZXJPbkRlbGknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupOWLvumAieKAnOmAmuefpeWIm+W7uuiAheKAnScsICfpoJDoqK3li77pgbjjgIzpgJrnn6Xlu7rnq4vogIXjgI0nKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuZGVsaVdhdGNoUGFnZSAoc3RyaW5nKVxuXHRcdFx0XHQvLyBUaGUgd2F0Y2hsaXN0IHNldHRpbmcgb2YgdGhlIHBhZ2UgdGFnZ2VkIGZvciBkZWxldGlvbi5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdkZWxpV2F0Y2hQYWdlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDlm77niYfml7bliqDlhaXliLDnm5Hop4bliJfooagnLCAn5qiZ6KiY5ZyW54mH5pmC5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLmRlbGlXYXRjaFVzZXIgKHN0cmluZylcblx0XHRcdFx0Ly8gVGhlIHdhdGNobGlzdCBzZXR0aW5nIG9mIHRoZSB1c2VyIHRhbGsgcGFnZSBpZiBhIG5vdGlmaWNhdGlvbiBpcyBwbGFjZWQuXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGVsaVdhdGNoVXNlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w5Zu+54mH5pe25Yqg5YWl5Yib5bu66ICF6K6o6K666aG15Yiw55uR6KeG5YiX6KGoJywgJ+aomeiomOWclueJh+aZguWKoOWFpeW7uueri+iAheiojuirlumggeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogd2luZG93LndnVUxTKCfkv53miqQnLCAn5L+d6K23JyksXG5cdFx0XHRtb2R1bGU6ICdwcm90ZWN0Jyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnd2F0Y2hSZXF1ZXN0ZWRQYWdlcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K+35rGC5L+d5oqk6aG16Z2i5pe25Yqg5YWl5Yiw55uR6KeG5YiX6KGoJywgJ+iri+axguS/neitt+mggemdouaZguWKoOWFpeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFBQVGFnZ2VkUGFnZXMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOS/neaKpOaooeadv+aXtuWKoOWFpeWIsOebkeinhuWIl+ihqCcsICfmqJnoqJjkv53orbfmqKHmnb/mmYLliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnd2F0Y2hQcm90ZWN0ZWRQYWdlcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L+d5oqk5pe25Yqg5YWl5Yiw55uR6KeG5YiX6KGoJywgJ+S/neitt+aZguWKoOWFpeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfoi6XlnKjkv53miqTlkI7kuZ/moIforrDpobXpnaLvvIzliJnkvb/nlKjmoIforrDpobXpnaLnmoTlj4LmlbDorr7nva7jgIInLFxuXHRcdFx0XHRcdFx0J+iLpeWcqOS/neitt+W+jOS5n+aomeiomOmggemdou+8jOWJh+S9v+eUqOaomeiomOmggemdoueahOWBj+WlveioreWumuOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6ICflm57pgIAnLFxuXHRcdFx0Ly8gdHdpbmtsZWZsdWZmIG1vZHVsZVxuXHRcdFx0bW9kdWxlOiAnZmx1ZmYnLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5hdXRvTWVudUFmdGVyUm9sbGJhY2sgKGJvb2wpXG5cdFx0XHRcdC8vIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IG9wZW4gdGhlIHdhcm5pbmcgbWVudSBpZiB0aGUgdXNlciB0YWxrIHBhZ2UgaXMgb3BlbmVkIHBvc3QtcmV2ZXJzaW9uXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnYXV0b01lbnVBZnRlclJvbGxiYWNrJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqFR3aW5rbGXlm57pgIDlkI7oh6rliqjmiZPlvIDnlKjmiLforqjorrrpobXkuIrnmoRUd2lua2xl6K2m5ZGK6I+c5Y2VJyxcblx0XHRcdFx0XHRcdCflnKhUd2lua2xl5Zue6YCA5b6M6Ieq5YuV5omT6ZaL5L2/55So6ICF6KiO6KuW6aCB5LiK55qEVHdpbmtsZeitpuWRiumBuOWWridcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn5LuF5Zyo6YCJ5Y+W5LiL5pa55a+55bqU5qGG5pe25omN5omn6KGMJywgJ+WDheWcqOmBuOWPluS4i+aWueWwjeaHieahhuaZguaJjeWft+ihjCcpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5vcGVuVGFsa1BhZ2UgKGFycmF5KVxuXHRcdFx0XHQvLyBXaGF0IHR5cGVzIG9mIGFjdGlvbnMgdGhhdCBzaG91bGQgcmVzdWx0IGluIG9wZW5pbmcgb2YgdGFsayBwYWdlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnb3BlblRhbGtQYWdlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjov5nkupvnsbvlnovnmoTlm57pgIDlkI7miZPlvIDnlKjmiLforqjorrrpobUnLCAn5Zyo6YCZ5Lqb6aGe5Yil55qE5Zue6YCA5b6M5omT6ZaL5L2/55So6ICF6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0dHlwZTogJ3NldCcsXG5cdFx0XHRcdFx0c2V0VmFsdWVzOiB7XG5cdFx0XHRcdFx0XHRub3JtOiB3aW5kb3cud2dVTFMoJ+W4uOinhOWbnumAgCcsICfluLjopo/lm57pgIAnKSxcblx0XHRcdFx0XHRcdHZhbmQ6IHdpbmRvdy53Z1VMUygn56C05Z2P5Zue6YCAJywgJ+egtOWjnuWbnumAgCcpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcub3BlblRhbGtQYWdlT25BdXRvUmV2ZXJ0IChib29sKVxuXHRcdFx0XHQvLyBEZWZpbmVzIGlmIHRhbGsgcGFnZSBzaG91bGQgYmUgb3BlbmVkIHdoZW4gY2FsbGluZyByZXZlcnQgZnJvbSBjb250cmlicyBvciByZWNlbnQgY2hhbmdlcyBwYWdlcy4gSWYgc2V0IHRvIHRydWUsIG9wZW5UYWxrUGFnZSBkZWZpbmVzIHRoZW4gaWYgdGFsayBwYWdlIHdpbGwgYmUgb3BlbmVkLlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ29wZW5UYWxrUGFnZU9uQXV0b1JldmVydCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflnKjku47nlKjmiLfotKHnjK7lj4rmnIDov5Hmm7TmlLnkuK3lj5Hotbflm57pgIDml7bmiZPlvIDnlKjmiLforqjorrrpobUnLFxuXHRcdFx0XHRcdFx0J+WcqOW+nuS9v+eUqOiAheiyoueNu+WPiui/keacn+iuiuabtOS4reeZvOi1t+WbnumAgOaZguaJk+mWi+S9v+eUqOiAheiojuirlumggSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn5b2T5a6D5omT5byA5pe277yM5L6d6LWW5LiK5LiA5Liq6K6+572u44CCJywgJ+eVtuWug+aJk+mWi+aZgu+8jOS+neiztOS4iuS4gOWAi+ioreWumuOAgicpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5yb2xsYmFja0luUGxhY2UgKGJvb2wpXG5cdFx0XHRcdC8vXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAncm9sbGJhY2tJblBsYWNlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOS7jueUqOaIt+i0oeeMruWPiuacgOi/keabtOaUueS4reWPkei1t+WbnumAgOaXtuS4jeWIt+aWsOmhtemdoicsXG5cdFx0XHRcdFx0XHQn5Zyo5b6e5L2/55So6ICF6LKi54275Y+K6L+R5pyf6K6K5pu05Lit55m86LW35Zue6YCA5pmC5LiN6YeN5paw5pW055CG6aCB6Z2iJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+W9k+Wug+aJk+W8gOaXtu+8jFR3aW5rbGXlsIbkuI3kvJrlnKjku47nlKjmiLfotKHnjK7lj4rmnIDov5Hmm7TmlLnkuK3lj5Hotbflm57pgIDml7bliLfmlrDpobXpnaLvvIzlhYHorrjmgqjkuIDmrKHmgKflm57pgIDlpJrkuKrnvJbovpHjgIInLFxuXHRcdFx0XHRcdFx0J+eVtuWug+aJk+mWi+aZgu+8jFR3aW5rbGXlsIfkuI3mnIPlnKjlvp7kvb/nlKjogIXosqLnjbvlj4rov5HmnJ/orormm7TkuK3nmbzotbflm57pgIDmmYLph43mlrDmlbTnkIbpoIHpnaLvvIzlhYHoqLHmgqjkuIDmrKHmgKflm57pgIDlpJrlgIvnt6jovK/jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcubWFya1JldmVydGVkUGFnZXNBc01pbm9yIChhcnJheSlcblx0XHRcdFx0Ly8gV2hhdCB0eXBlcyBvZiBhY3Rpb25zIHRoYXQgc2hvdWxkIHJlc3VsdCBpbiBtYXJraW5nIGVkaXQgYXMgbWlub3Jcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdtYXJrUmV2ZXJ0ZWRQYWdlc0FzTWlub3InLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+Wwhui/meS6m+exu+Wei+eahOWbnumAgOagh+iusOS4uuWwj+S/ruaUuScsICflsIfpgJnkupvpoZ7liKXnmoTlm57pgIDmqJnoqJjngrrlsI/kv67mlLknKSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IHtcblx0XHRcdFx0XHRcdG5vcm06IHdpbmRvdy53Z1VMUygn5bi46KeE5Zue6YCAJywgJ+W4uOimj+WbnumAgCcpLFxuXHRcdFx0XHRcdFx0dmFuZDogd2luZG93LndnVUxTKCfnoLTlnY/lm57pgIAnLCAn56C05aOe5Zue6YCAJyksXG5cdFx0XHRcdFx0XHR0b3Jldjogd2luZG93LndnVUxTKCfigJzmgaLlpI3mraTniYjmnKzigJ0nLCAn44CM5oGi5b6p5q2k54mI5pys44CNJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy53YXRjaFJldmVydGVkUGFnZXMgKGFycmF5KVxuXHRcdFx0XHQvLyBXaGF0IHR5cGVzIG9mIGFjdGlvbnMgdGhhdCBzaG91bGQgcmVzdWx0IGluIGZvcmNlZCBhZGRpdGlvbiB0byB3YXRjaGxpc3Rcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFJldmVydGVkUGFnZXMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aKiui/meS6m+exu+Wei+eahOWbnumAgOWKoOWFpeWIsOebkeinhuWIl+ihqCcsICfmiorpgJnkupvpoZ7liKXnmoTlm57pgIDliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IHtcblx0XHRcdFx0XHRcdG5vcm06IHdpbmRvdy53Z1VMUygn5bi46KeE5Zue6YCAJywgJ+W4uOimj+WbnumAgCcpLFxuXHRcdFx0XHRcdFx0dmFuZDogd2luZG93LndnVUxTKCfnoLTlnY/lm57pgIAnLCAn56C05aOe5Zue6YCAJyksXG5cdFx0XHRcdFx0XHR0b3Jldjogd2luZG93LndnVUxTKCfigJzmgaLlpI3mraTniYjmnKzigJ0nLCAn44CM5oGi5b6p5q2k54mI5pys44CNJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy53YXRjaFJldmVydGVkRXhwaXJ5XG5cdFx0XHRcdC8vIElmIGFueSBvZiB0aGUgYWJvdmUgaXRlbXMgYXJlIHNlbGVjdGVkLCB3aGV0aGVyIHRvIGV4cGlyZSB0aGUgd2F0Y2hcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFJldmVydGVkRXhwaXJ5Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflvZPlm57pgIDpobXpnaLml7bvvIzliqDlhaXliLDnm5Hop4bliJfooajnmoTmnJ/pmZAnLCAn55W25Zue6YCA6aCB6Z2i5pmC77yM5Yqg5YWl5Yiw55uj6KaW5riF5Zau55qE5pyf6ZmQJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLm9mZmVyUmVhc29uT25Ob3JtYWxSZXZlcnQgKGJvb2xlYW4pXG5cdFx0XHRcdC8vIElmIHRvIG9mZmVyIGEgcHJvbXB0IGZvciBleHRyYSBzdW1tYXJ5IHJlYXNvbiBmb3Igbm9ybWFsIHJldmVydHMsIGRlZmF1bHQgdG8gdHJ1ZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ29mZmVyUmVhc29uT25Ob3JtYWxSZXZlcnQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W4uOinhOWbnumAgOaXtuivoumXrueQhueUsScsICfluLjopo/lm57pgIDmmYLoqaLllY/nkIbnlLEnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoJ+KAnOW4uOinhOKAneWbnumAgOaYr+S4remXtOeahOmCo+S4qlvlm57pgIBd6ZO+5o6l44CCJywgJ+OAjOW4uOimj+OAjeWbnumAgOaYr+S4remWk+eahOmCo+WAi1vlm57pgIBd6YCj57WQ44CCJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2NvbmZpcm1PbkZsdWZmJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflm57pgIDliY3opoHmsYLnoa7orqTvvIjmiYDmnInorr7lpIfvvIknLCAn5Zue6YCA5YmN6KaB5rGC56K66KqN77yI5omA5pyJ6KOd572u77yJJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WvueS6juS9v+eUqOenu+WKqOiuvuWkh+eahOeUqOaIt++8jOaIluiAheaEj+W/l+S4jeWdmuWumueahOOAgicsXG5cdFx0XHRcdFx0XHQn5bCN5pa85L2/55So6KGM5YuV6KOd572u55qE5L2/55So6ICF77yM5oiW6ICF5oSP5b+X5LiN5aCF5a6a55qE44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnNob3dSb2xsYmFja0xpbmtzIChhcnJheSlcblx0XHRcdFx0Ly8gV2hlcmUgVHdpbmtsZSBzaG91bGQgc2hvdyByb2xsYmFjayBsaW5rczpcblx0XHRcdFx0Ly8gZGlmZiwgb3RoZXJzLCBtaW5lLCBjb250cmlicywgaGlzdG9yeSwgcmVjZW50XG5cdFx0XHRcdC8vIE5vdGUgZnJvbSBUVE86IHxjb250cmlic3wgc2VlbXMgdG8gYmUgZXF1YWwgdG8gfG90aGVyc3wgKyB8bWluZXwsIGkuZS4gcmVkdW5kYW50LCBzbyBJIGxlZnQgaXQgb3V0IGhlcmVzXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnc2hvd1JvbGxiYWNrTGlua3MnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOi/meS6m+mhtemdouS4iuaYvuekuuWbnumAgOmTvuaOpScsICflnKjpgJnkupvpoIHpnaLkuIrpoa/npLrlm57pgIDpgKPntZAnKSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IHtcblx0XHRcdFx0XHRcdGRpZmY6IHdpbmRvdy53Z1VMUygn5beu5byCJywgJ+W3rueVsCcpLFxuXHRcdFx0XHRcdFx0aGlzdG9yeTogd2luZG93LndnVUxTKCfljoblj7LorrDlvZUnLCAn5q235Y+y6KiY6YyEJyksXG5cdFx0XHRcdFx0XHRvdGhlcnM6IHdpbmRvdy53Z1VMUygn5YW25a6D55So5oi355qE6LSh54yuJywgJ+WFtuWug+S9v+eUqOiAheeahOiyoueNuycpLFxuXHRcdFx0XHRcdFx0bWluZTogd2luZG93LndnVUxTKCfmiJHnmoTotKHnjK4nLCAn5oiR55qE6LKi5427JyksXG5cdFx0XHRcdFx0XHRyZWNlbnRjaGFuZ2VzOiB3aW5kb3cud2dVTFMoJ+acgOi/keabtOaUuScsICfov5HmnJ/orormm7QnKSxcblx0XHRcdFx0XHRcdHJlY2VudGNoYW5nZXNsaW5rZWQ6IHdpbmRvdy53Z1VMUygn55u45YWz5pu05pS5JywgJ+ebuOmXnOiuiuabtCcpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY3VzdG9tUmV2ZXJ0U3VtbWFyeScsXG5cdFx0XHRcdFx0bGFiZWw6ICflm57pgIDnkIbnlLEnLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflnKjmn6XnnIvlt67lvILml7blj6/pgInvvIzku4XlloTmhI/lm57pgIDjgIHluLjop4Tlm57pgIDjgIHmgaLlpI3mraTniYjmnKwnLFxuXHRcdFx0XHRcdFx0J+WcqOaqouimluW3rueVsOaZguWPr+mBuO+8jOWDheWWhOaEj+WbnumAgOOAgeW4uOimj+WbnumAgOOAgeaBouW+qeatpOeJiOacrCdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdjdXN0b21MaXN0Jyxcblx0XHRcdFx0XHRjdXN0b21MaXN0VmFsdWVUaXRsZTogJ+eQhueUsScsXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdExhYmVsVGl0bGU6IHdpbmRvdy53Z1VMUygn5pi+56S655qE5paH5a2XJywgJ+mhr+ekuueahOaWh+WtlycpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpCcsICflv6vpgJ/liKrpmaQnKSxcblx0XHRcdG1vZHVsZTogJ3NwZWVkeScsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3NwZWVkeVNlbGVjdGlvblN0eWxlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfku4DkuYjml7blgJnmiafooYzmoIforrDmiJbliKDpmaQnLCAn5LuA6bq85pmC5YCZ5Z+36KGM5qiZ6KiY5oiW5Yiq6ZmkJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IHtcblx0XHRcdFx0XHRcdGJ1dHRvbkNsaWNrOiB3aW5kb3cud2dVTFMoJ+W9k+aIkeeCueKAnOaPkOS6pOKAneaXticsICfnlbbmiJHpu57jgIzmj5DkuqTjgI3mmYInKSxcblx0XHRcdFx0XHRcdHJhZGlvQ2xpY2s6IHdpbmRvdy53Z1VMUygn5b2T5oiR54K55LiA5Liq6YCJ6aG55pe2JywgJ+eVtuaIkem7nuS4gOWAi+mBuOmgheaZgicpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcud2F0Y2hTcGVlZHlQYWdlcyAoYXJyYXkpXG5cdFx0XHRcdC8vIFdoZXRoZXIgdG8gYWRkIHNwZWVkeSB0YWdnZWQgcGFnZXMgdG8gd2F0Y2hsaXN0XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnd2F0Y2hTcGVlZHlQYWdlcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCG5Lul5LiL55CG55Sx5Yqg5YWl5Yiw55uR6KeG5YiX6KGoJywgJ+Wwh+S7peS4i+eQhueUseWKoOWFpeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5jc2RDcml0ZXJpYSxcblx0XHRcdFx0XHRzZXREaXNwbGF5T3JkZXI6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQ3JpdGVyaWFEaXNwbGF5T3JkZXIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcud2F0Y2hTcGVlZHlFeHBpcnlcblx0XHRcdFx0Ly8gSWYgYW55IG9mIHRoZSBhYm92ZSBpdGVtcyBhcmUgc2VsZWN0ZWQsIHdoZXRoZXIgdG8gZXhwaXJlIHRoZSB3YXRjaFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoU3BlZWR5RXhwaXJ5Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflvZPmoIforrDpobXpnaLml7bvvIzliqDlhaXliLDnm5Hop4bliJfooajnmoTmnJ/pmZAnLCAn55W25qiZ6KiY6aCB6Z2i5pmC77yM5Yqg5YWl5Yiw55uj6KaW5riF5Zau55qE5pyf6ZmQJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLm1hcmtTcGVlZHlQYWdlc0FzUGF0cm9sbGVkIChib29sZWFuKVxuXHRcdFx0XHQvLyBJZiwgd2hlbiBhcHBseWluZyBzcGVlZHkgdGVtcGxhdGUgdG8gcGFnZSwgdG8gbWFyayB0aGUgcGFnZSBhcyBwYXRyb2xsZWQgKGlmIHRoZSBwYWdlIHdhcyByZWFjaGVkIGZyb20gTmV3UGFnZXMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbWFya1NwZWVkeVBhZ2VzQXNQYXRyb2xsZWQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOaXtuagh+iusOmhtemdouS4uuW3suW3oeafpe+8iOWmguWPr+iDve+8iScsICfmqJnoqJjmmYLmqJnoqJjpoIHpnaLngrrlt7Llt6Hmn6XvvIjlpoLlj6/og73vvIknKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcubm90aWZ5VXNlck9uU3BlZWR5RGVsZXRpb25Ob21pbmF0aW9uIChhcnJheSlcblx0XHRcdFx0Ly8gV2hhdCB0eXBlcyBvZiBhY3Rpb25zIHNob3VsZCByZXN1bHQgdGhhdCB0aGUgYXV0aG9yIG9mIHRoZSBwYWdlIGJlaW5nIG5vdGlmaWVkIG9mIG5vbWluYXRpb25cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdub3RpZnlVc2VyT25TcGVlZHlEZWxldGlvbk5vbWluYXRpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7heWcqOS9v+eUqOS7peS4i+eQhueUseaXtumAmuefpemhtemdouWIm+W7uuiAhScsICflg4XlnKjkvb/nlKjku6XkuIvnkIbnlLHmmYLpgJrnn6XpoIHpnaLlu7rnq4vogIUnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5bC9566h5oKo5Zyo5a+56K+d5qGG5Lit6YCJ5oup6YCa55+l77yM6YCa55+l5LuN5Y+q5Lya5Zyo5L2/55So6L+Z5Lqb55CG55Sx5pe25Y+R5Ye644CCJyxcblx0XHRcdFx0XHRcdCflhJjnrqHmgqjlnKjlsI3oqbHmlrnloYrkuK3pgbjmk4fpgJrnn6XvvIzpgJrnn6Xku43lj6rmnIPlnKjkvb/nlKjpgJnkupvnkIbnlLHmmYLnmbzlh7rjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQ3JpdGVyaWFOb3RpZmljYXRpb24sXG5cdFx0XHRcdFx0c2V0RGlzcGxheU9yZGVyOiBUd2lua2xlLmNvbmZpZy5jb21tb25TZXRzLmNzZENyaXRlcmlhTm90aWZpY2F0aW9uRGlzcGxheU9yZGVyLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnByb21wdEZvclNwZWVkeURlbGV0aW9uU3VtbWFyeSAoYXJyYXkgb2Ygc3RyaW5ncylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdwcm9tcHRGb3JTcGVlZHlEZWxldGlvblN1bW1hcnknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S9v+eUqOS7peS4i+eQhueUseWIoOmZpOaXtuWFgeiuuOe8lui+keWIoOmZpOeQhueUsScsICfkvb/nlKjku6XkuIvnkIbnlLHliKrpmaTmmYLlhYHoqLHnt6jovK/liKrpmaTnkIbnlLEnKSxcblx0XHRcdFx0XHRhZG1pbk9ubHk6IHRydWUsXG5cdFx0XHRcdFx0dHlwZTogJ3NldCcsXG5cdFx0XHRcdFx0c2V0VmFsdWVzOiBUd2lua2xlLmNvbmZpZy5jb21tb25TZXRzLmNzZEFuZERJQ3JpdGVyaWEsXG5cdFx0XHRcdFx0c2V0RGlzcGxheU9yZGVyOiBUd2lua2xlLmNvbmZpZy5jb21tb25TZXRzLmNzZEFuZERJQ3JpdGVyaWFEaXNwbGF5T3JkZXIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcub3BlblVzZXJUYWxrUGFnZU9uU3BlZWR5RGVsZXRlIChhcnJheSBvZiBzdHJpbmdzKVxuXHRcdFx0XHQvLyBXaGF0IHR5cGVzIG9mIGFjdGlvbnMgdGhhdCBzaG91bGQgcmVzdWx0IHVzZXIgdGFsayBwYWdlIHRvIGJlIG9wZW5lZCB3aGVuIHNwZWVkaWx5IGRlbGV0aW5nIChhZG1pbiBvbmx5KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ29wZW5Vc2VyVGFsa1BhZ2VPblNwZWVkeURlbGV0ZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L2/55So5Lul5LiL55CG55Sx5pe25omT5byA55So5oi36K6o6K666aG1JywgJ+S9v+eUqOS7peS4i+eQhueUseaZguaJk+mWi+S9v+eUqOiAheiojuirlumggScpLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQW5kRElDcml0ZXJpYSxcblx0XHRcdFx0XHRzZXREaXNwbGF5T3JkZXI6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQW5kRElDcml0ZXJpYURpc3BsYXlPcmRlcixcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5kZWxldGVUYWxrUGFnZU9uRGVsZXRlIChib29sZWFuKVxuXHRcdFx0XHQvLyBJZiB0YWxrIHBhZ2UgaWYgZXhpc3RzIHNob3VsZCBhbHNvIGJlIGRlbGV0ZWQgKENTRCBHOCkgd2hlbiBzcGVkeWluZyBhIHBhZ2UgKGFkbWluIG9ubHkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlVGFsa1BhZ2VPbkRlbGV0ZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5Yu+6YCJ4oCc5Yig6Zmk6K6o6K666aG14oCdJywgJ+mgkOioreWLvumBuOOAjOWIqumZpOiojuirlumggeOAjScpLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlUmVkaXJlY3RzT25EZWxldGUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupOWLvumAieKAnOWIoOmZpOmHjeWumuWQkeKAnScsICfpoJDoqK3li77pgbjjgIzliKrpmaTph43mlrDlsI7lkJHjgI0nKSxcblx0XHRcdFx0XHRhZG1pbk9ubHk6IHRydWUsXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLmRlbGV0ZVN5c29wRGVmYXVsdFRvRGVsZXRlIChib29sZWFuKVxuXHRcdFx0XHQvLyBNYWtlIHRoZSBDU0Qgc2NyZWVuIGRlZmF1bHQgdG8gXCJkZWxldGVcIiBpbnN0ZWFkIG9mIFwidGFnXCIgKGFkbWluIG9ubHkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlU3lzb3BEZWZhdWx0VG9EZWxldGUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupOS4uuebtOaOpeWIoOmZpOiAjOS4jeaYr+agh+iusCcsICfpoJDoqK3ngrrnm7TmjqXliKrpmaTogIzkuI3mmK/mqJnoqJgnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6Iul5bey5pS+572u5b+r6YCf5Yig6Zmk5qCH6K6w77yM5YiZ5rC46L+c6buY6K6k5Li65Yig6Zmk5qih5byP44CCJyxcblx0XHRcdFx0XHRcdCfoi6Xlt7LmlL7nva7lv6vpgJ/liKrpmaTmqJnoqJjvvIzliYfmsLjpgaDpoJDoqK3ngrrliKrpmaTmqKHlvI/jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRhZG1pbk9ubHk6IHRydWUsXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnNwZWVkeVdpbmRvd1dpZHRoIChpbnRlZ2VyKVxuXHRcdFx0XHQvLyBEZWZpbmVzIHRoZSB3aWR0aCBvZiB0aGUgVHdpbmtsZSBTRCB3aW5kb3cgaW4gcGl4ZWxzXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnc3BlZWR5V2luZG93V2lkdGgnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpOWvueivneahhuWuveW6pu+8iOWDj+e0oO+8iScsICflv6vpgJ/liKrpmaTlsI3oqbHmlrnloYrlr6zluqbvvIjlg4/ntKDvvIknKSxcblx0XHRcdFx0XHR0eXBlOiAnaW50ZWdlcicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuc3BlZWR5V2luZG93V2lkdGggKGludGVnZXIpXG5cdFx0XHRcdC8vIERlZmluZXMgdGhlIHdpZHRoIG9mIHRoZSBUd2lua2xlIFNEIHdpbmRvdyBpbiBwaXhlbHNcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdzcGVlZHlXaW5kb3dIZWlnaHQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpOWvueivneahhumrmOW6pu+8iOWDj+e0oO+8iScsICflv6vpgJ/liKrpmaTlsI3oqbHmlrnloYrpq5jluqbvvIjlg4/ntKDvvIknKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6Iul5oKo5pyJ5LiA5Y+w5b6I5aSn55qE5pi+56S65Zmo77yM5oKo5Y+v5Lul5bCG5q2k6LCD6auY44CCJyxcblx0XHRcdFx0XHRcdCfoi6XmgqjmnInkuIDlj7DlvojlpKfnmoTpoa/npLrlmajvvIzmgqjlj6/ku6XlsIfmraToqr/pq5jjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnaW50ZWdlcicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbG9nU3BlZWR5Tm9taW5hdGlvbnMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOeUqOaIt+epuumXtOS4reiusOW9leaJgOacieW/q+mAn+WIoOmZpOaPkOWQjScsICflnKjkvb/nlKjogIXnqbrplpPkuK3oqJjpjITmiYDmnInlv6vpgJ/liKrpmaTmj5DlkI0nKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6Z2e566h55CG5ZGY5peg5rOV6K6/6Zeu5Yiw5bey5Yig6Zmk55qE6LSh54yu77yM55So5oi356m66Ze05pel5b+X5o+Q5L6b5LqG5LiA5Liq5b6I5aW955qE5pa55rOV5p2l6K6w5b2V6L+Z5Lqb5Y6G5Y+y44CCJyxcblx0XHRcdFx0XHRcdCfpnZ7nrqHnkIblk6HnhKHms5XlrZjlj5bliLDlt7LliKrpmaTnmoTosqLnjbvvvIzkvb/nlKjogIXnqbrplpPml6Xoqozmj5DkvpvkuobkuIDlgIvlvojlpb3nmoTmlrnms5XkvoboqJjpjITpgJnkupvmrbflj7LjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnc3BlZWR5TG9nUGFnZU5hbWUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOatpOmhteS/neeVmeaXpeW/lycsICflnKjmraTpoIHkv53nlZnml6XoqownKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5Zyo5q2k5qGG5Lit6L6T5YWl5a2Q6aG16Z2i5ZCN56ew77yM5oKo5bCG5ZyoVXNlcjo8aT7nlKjmiLflkI08L2k+LzxpPuWtkOmhtemdojwvaT7mib7liLBDU0Tml6Xlv5fjgILku4XlnKjlkK/nlKjml6Xlv5fml7blt6XkvZzjgIInLFxuXHRcdFx0XHRcdFx0J+WcqOatpOahhuS4rei8uOWFpeWtkOmggemdouWQjeeose+8jOaCqOWwh+WcqFVzZXI6PGk+5L2/55So6ICF5ZCN56ixPC9pPi88aT7lrZDpoIHpnaI8L2k+5om+5YiwQ1NE5pel6KqM44CC5YOF5Zyo5ZWf55So5pel6KqM5pmC5bel5L2c44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbm9Mb2dPblNwZWVkeU5vbWluYXRpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOS9v+eUqOS7peS4i+eQhueUseaXtuS4jeWBmuiusOW9lScsICflnKjkvb/nlKjku6XkuIvnkIbnlLHmmYLkuI3lgZroqJjpjIQnKSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQW5kRElDcml0ZXJpYSxcblx0XHRcdFx0XHRzZXREaXNwbGF5T3JkZXI6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQW5kRElDcml0ZXJpYURpc3BsYXlPcmRlcixcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdlbmxhcmdlRzdJbnB1dCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5omp5aSnQ1NEIEc355qE5oyJ6ZKuJywgJ+aTtOWkp0NTRCBHN+eahOaMiemIlScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn5omp5Li66buY6K6k55qE5Lik5YCN5aSn44CCJywgJ+aTtOeCuumgkOioreeahOWFqeWAjeWkp+OAgicpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogd2luZG93LndnVUxTKCfmoIforrAnLCAn5qiZ6KiYJyksXG5cdFx0XHRtb2R1bGU6ICd0YWcnLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFRhZ2dlZFBhZ2VzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDml7bliqDlhaXliLDnm5Hop4bliJfooagnLCAn5qiZ6KiY5pmC5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoTWVyZ2VEaXNjdXNzaW9ucycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5ZCI5bm26K6o6K665pe255uR6KeG6K6o6K666aG1JywgJ+WKoOWFpeWQiOS9teiojuirluaZguebo+imluiojuirlumggScpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdtYXJrVGFnZ2VkUGFnZXNBc01pbm9yJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflsIbmoIforrDmoIforrDkuLrlsI/kv67mlLknLCAn5bCH5qiZ6KiY5qiZ6KiY54K65bCP5L+u5pS5JyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtUYWdnZWRQYWdlc0FzUGF0cm9sbGVkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqTli77pgInigJzmoIforrDpobXpnaLkuLrlt7Llt6Hmn6XigJ3moYYnLCAn6aCQ6Kit5Yu+6YG444CM5qiZ6KiY6aCB6Z2i54K65bey5beh5p+l44CN5qGGJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2dyb3VwQnlEZWZhdWx0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+m7mOiupOWLvumAieKAnOWQiOW5tuWIsHt7bXVsdGlwbGUgaXNzdWVzfX3igJ3lpI3pgInmoYYnLFxuXHRcdFx0XHRcdFx0J+mgkOioreWLvumBuOOAjOWQiOS9teWIsHt7bXVsdGlwbGUgaXNzdWVzfX3jgI3moLjlj5bmlrnloYonXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAndGFnQXJ0aWNsZVNvcnRPcmRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5p2h55uu5qCH6K6w55qE6buY6K6k5p+l55yL5pa55byPJywgJ+aineebruaomeiomOeahOmgkOioreaqouimluaWueW8jycpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiB7XG5cdFx0XHRcdFx0XHRjYXQ6IHdpbmRvdy53Z1VMUygn5oyJ57G75Z6LJywgJ+aMiemhnuWIpScpLFxuXHRcdFx0XHRcdFx0YWxwaGE6ICfmjInlrZfmr40nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY3VzdG9tVGFnTGlzdCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5p2h55uu57u05oqk5qCH6K6wJywgJ+iHquioguaineebrue2reitt+aomeiomCcpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn6L+Z5Lqb5Lya5Ye6546w5Zyo5YiX6KGo55qE5pyr5bC+44CCJywgJ+mAmeS6m+acg+WHuuePvuWcqOWIl+ihqOeahOacq+WwvuOAgicpLFxuXHRcdFx0XHRcdHR5cGU6ICdjdXN0b21MaXN0Jyxcblx0XHRcdFx0XHRjdXN0b21MaXN0VmFsdWVUaXRsZTogd2luZG93LndnVUxTKCfmqKHmnb/lkI3vvIjkuI3lkKvlpKfmi6zlj7fvvIknLCAn5qih5p2/5ZCN77yI5LiN5ZCr5aSn5ous6Jmf77yJJyksXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdExhYmVsVGl0bGU6IHdpbmRvdy53Z1VMUygn5pi+56S655qE5paH5a2XJywgJ+mhr+ekuueahOaWh+WtlycpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2N1c3RvbUZpbGVUYWdMaXN0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnmlofku7bnu7TmiqTmoIforrAnLCAn6Ieq6KiC5qqU5qGI57at6K235qiZ6KiYJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKCfov5nkupvkvJrlh7rnjrDlnKjliJfooajnmoTmnKvlsL7jgIInLCAn6YCZ5Lqb5pyD5Ye654++5Zyo5YiX6KGo55qE5pyr5bC+44CCJyksXG5cdFx0XHRcdFx0dHlwZTogJ2N1c3RvbUxpc3QnLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RWYWx1ZVRpdGxlOiB3aW5kb3cud2dVTFMoJ+aooeadv+WQje+8iOS4jeWQq+Wkp+aLrOWPt++8iScsICfmqKHmnb/lkI3vvIjkuI3lkKvlpKfmi6zomZ/vvIknKSxcblx0XHRcdFx0XHRjdXN0b21MaXN0TGFiZWxUaXRsZTogd2luZG93LndnVUxTKCfmmL7npLrnmoTmloflrZcnLCAn6aGv56S655qE5paH5a2XJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY3VzdG9tUmVkaXJlY3RUYWdMaXN0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnph43lrprlkJHnu7TmiqTmoIforrAnLCAn6Ieq6KiC6YeN5paw5bCO5ZCR57at6K235qiZ6KiYJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKCfov5nkupvkvJrlh7rnjrDlnKjliJfooajnmoTmnKvlsL7jgIInLCAn6YCZ5Lqb5pyD5Ye654++5Zyo5YiX6KGo55qE5pyr5bC+44CCJyksXG5cdFx0XHRcdFx0dHlwZTogJ2N1c3RvbUxpc3QnLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RWYWx1ZVRpdGxlOiB3aW5kb3cud2dVTFMoJ+aooeadv+WQje+8iOS4jeWQq+Wkp+aLrOWPt++8iScsICfmqKHmnb/lkI3vvIjkuI3lkKvlpKfmi6zomZ/vvIknKSxcblx0XHRcdFx0XHRjdXN0b21MaXN0TGFiZWxUaXRsZTogd2luZG93LndnVUxTKCfmmL7npLrnmoTmloflrZcnLCAn6aGv56S655qE5paH5a2XJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6ICflsI/kvZzlk4EnLFxuXHRcdFx0bW9kdWxlOiAnc3R1YicsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoU3R1YmJlZFBhZ2VzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDml7bliqDlhaXliLDnm5Hop4bliJfooagnLCAn5qiZ6KiY5pmC5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtTdHViYmVkUGFnZXNBc01pbm9yJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflsIblsI/kvZzlk4HmoIforrDkuLrlsI/kv67mlLknLCAn5bCH5bCP5L2c5ZOB5qiZ6KiY54K65bCP5L+u5pS5JyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtTdHViYmVkUGFnZXNBc1BhdHJvbGxlZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5Yu+6YCJ4oCc5qCH6K6w6aG16Z2i5Li65bey5beh5p+l4oCd5qGGJywgJ+mgkOioreWLvumBuOOAjOaomeiomOmggemdoueCuuW3suW3oeafpeOAjeahhicpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdzdHViQXJ0aWNsZVNvcnRPcmRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5p2h55uu5bCP5L2c5ZOB55qE6buY6K6k5p+l55yL5pa55byPJywgJ+aineebruWwj+S9nOWTgeeahOmgkOioreaqouimluaWueW8jycpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiB7XG5cdFx0XHRcdFx0XHRjYXQ6IHdpbmRvdy53Z1VMUygn5oyJ57G75Z6LJywgJ+aMiemhnuWIpScpLFxuXHRcdFx0XHRcdFx0YWxwaGE6ICfmjInlrZfmr40nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY3VzdG9tU3R1Ykxpc3QnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieadoeebruWwj+S9nOWTgeagh+iusCcsICfoh6roqILmop3nm67lsI/kvZzlk4HmqJnoqJgnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoJ+i/meS6m+S8muWHuueOsOWcqOWIl+ihqOeahOacq+WwvuOAgicsICfpgJnkupvmnIPlh7rnj77lnKjliJfooajnmoTmnKvlsL7jgIInKSxcblx0XHRcdFx0XHR0eXBlOiAnY3VzdG9tTGlzdCcsXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdFZhbHVlVGl0bGU6IHdpbmRvdy53Z1VMUygn5qih5p2/5ZCN77yI5LiN5ZCr5aSn5ous5Y+377yJJywgJ+aooeadv+WQje+8iOS4jeWQq+Wkp+aLrOiZn++8iScpLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RMYWJlbFRpdGxlOiB3aW5kb3cud2dVTFMoJ+aYvuekuueahOaWh+WtlycsICfpoa/npLrnmoTmloflrZcnKSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogJ+mAmuWRiicsXG5cdFx0XHRtb2R1bGU6ICd0YWxrYmFjaycsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtUYWxrYmFja0FzTWlub3InLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwhumAmuWRiuagh+iusOS4uuWwj+S/ruaUuScsICflsIfpgJrlkYrmqJnoqJjngrrlsI/kv67mlLknKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnaW5zZXJ0VGFsa2JhY2tTaWduYXR1cmUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAmuWRiuaXtuWKoOWFpeetvuWQjScsICfpgJrlkYrmmYLliqDlhaXnsL3lkI0nKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAndGFsa2JhY2tIZWFkaW5nJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgJrlkYrmiYDnlKjnmoTlsI/oioLmoIfpopgnLCAn6YCa5ZGK5omA55So55qE5bCP56+A5qiZ6aGMJyksXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbWFpbEhlYWRpbmcnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+KAnOacieaWsOmCruS7tuKAneaJgOeUqOeahOWwj+iKguagh+mimCcsICfjgIzmnInmlrDpg7Xku7bjgI3miYDnlKjnmoTlsI/nr4DmqJnpoYwnKSxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogd2luZG93LndnVUxTKCflj5bmtojpk77lhaUnLCAn5Y+W5raI6YCj5YWlJyksXG5cdFx0XHRtb2R1bGU6ICd1bmxpbmsnLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy51bmxpbmtOYW1lc3BhY2VzIChhcnJheSlcblx0XHRcdFx0Ly8gSW4gd2hhdCBuYW1lc3BhY2VzIHVubGluayBzaG91bGQgaGFwcGVuLCBkZWZhdWx0IGluIDAgKGFydGljbGUpIGFuZCAxMDAgKHBvcnRhbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd1bmxpbmtOYW1lc3BhY2VzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj5bmtojku6XkuIvlkb3lkI3nqbrpl7TkuK3nmoTlj43lkJHpk77mjqUnLCAn5Y+W5raI5Lul5LiL5ZG95ZCN56m66ZaT5Lit55qE5Y+N5ZCR6YCj57WQJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+ivt+mBv+WFjemAieaLqeiuqOiuuumhte+8jOWboOi/meagt+S8muWvvOiHtFR3aW5rbGXor5Xlm77kv67mlLnorqjorrrlrZjmoaPjgIInLFxuXHRcdFx0XHRcdFx0J+iri+mBv+WFjemBuOaTh+iojuirlumgge+8jOWboOmAmeaoo+acg+WwjuiHtFR3aW5rbGXoqablnJbkv67mlLnoqI7oq5blrZjmqpTjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMubmFtZXNwYWNlc05vU3BlY2lhbCxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogd2luZG93LndnVUxTKCforablkYrnlKjmiLcnLCAn6K2m5ZGK5L2/55So6ICFJyksXG5cdFx0XHRtb2R1bGU6ICd3YXJuJyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuZGVmYXVsdFdhcm5pbmdHcm91cCAoaW50KVxuXHRcdFx0XHQvLyBpZiB0cnVlLCB3YXRjaCB0aGUgcGFnZSB3aGljaCBoYXMgYmVlbiBkaXNwYXRjaGVkIGFuIHdhcm5pbmcgb3Igbm90aWNlLCBpZiBmYWxzZSwgZGVmYXVsdCBhcHBsaWVzXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGVmYXVsdFdhcm5pbmdHcm91cCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k6K2m5ZGK57qn5YirJywgJ+mgkOioreitpuWRiue0muWIpScpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiB7XG5cdFx0XHRcdFx0XHQxOiAnMe+8muazqOaEjycsXG5cdFx0XHRcdFx0XHQyOiAnMu+8muitpuWRiicsXG5cdFx0XHRcdFx0XHQzOiB3aW5kb3cud2dVTFMoJ+WNleWxgue6p+aPkOmGkicsICfllq7lsaTntJrmj5DphpInKSxcblx0XHRcdFx0XHRcdDQ6IHdpbmRvdy53Z1VMUygn5Y2V5bGC57qn6K2m5ZGKJywgJ+WWruWxpOe0muitpuWRiicpLFxuXHRcdFx0XHRcdFx0NTogd2luZG93LndnVUxTKCfoh6rlrprkuYnmj5DphpLmiJborablkYonLCAn6Ieq6KiC5o+Q6YaS5oiW6K2m5ZGKJyksXG5cdFx0XHRcdFx0XHQ2OiAn5omA5pyJ6K2m5ZGK5qih5p2/Jyxcblx0XHRcdFx0XHRcdDc6IHdpbmRvdy53Z1VMUygn6Ieq5Yqo6YCJ5oup5bGC57qnJywgJ+iHquWLlemBuOaTh+WxpOe0micpLFxuXHRcdFx0XHRcdFx0Ly8gOCB3YXMgdXNlZCBmb3IgYmxvY2sgdGVtcGxhdGVzIGJlZm9yZSAjMjYwXG5cdFx0XHRcdFx0XHQvLyA5IHdhcyBkZXByZWNhdGVkXG5cdFx0XHRcdFx0XHQvLyAxMCB3YXMgZGVwcmVjYXRlZFxuXHRcdFx0XHRcdFx0Ly8gMTEgd2FzIGRlcHJlY2F0ZWRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLmNvbWJpbmVkU2luZ2xldE1lbnVzIChib29sZWFuKVxuXHRcdFx0XHQvLyBpZiB0cnVlLCBzaG93IG9uZSBtZW51IHdpdGggYm90aCBzaW5nbGUtaXNzdWUgbm90aWNlcyBhbmQgd2FybmluZ3MgaW5zdGVhZCBvZiB0d28gc2VwYXJhdGVseVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2NvbWJpbmVkU2luZ2xldE1lbnVzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflsIbkuKTkuKrljZXlsYLnuqfoj5zljZXlkIjlubbmiJDkuIDkuKonLCAn5bCH5YWp5YCL5Zau5bGk57Sa6YG45Zau5ZCI5L215oiQ5LiA5YCLJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+W9k+WQr+eUqOatpOmAiemhueaXtu+8jOaXoOiuuum7mOiupOitpuWRiue6p+WIq+mAieaLqeWNleWxgue6p+mAmuefpeaIluWNleWxgue6p+itpuWRiueahuWxnuS6juatpOmhueOAgicsXG5cdFx0XHRcdFx0XHQn55W25ZWf55So5q2k6YG46aCF5pmC77yM54Sh6KuW6aCQ6Kit6K2m5ZGK57Sa5Yil6YG45pOH5Zau5bGk57Sa6YCa55+l5oiW5Zau5bGk57Sa6K2m5ZGK55qG5bGs5pa85q2k6aCF44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLndhdGNoV2FybmluZ3MgKHN0cmluZylcblx0XHRcdFx0Ly8gV2F0Y2hsaXN0IHNldHRpbmcgZm9yIHRoZSBwYWdlIHdoaWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQgYW4gd2FybmluZyBvciBub3RpY2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFdhcm5pbmdzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCforablkYrml7bliqDlhaXnlKjmiLforqjorrrpobXliLDnm5Hop4bliJfooagnLCAn6K2m5ZGK5pmC5Yqg5YWl5L2/55So6ICF6KiO6KuW6aCB5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLm9sZFNlbGVjdCAoYm9vbGVhbilcblx0XHRcdFx0Ly8gaWYgdHJ1ZSwgdXNlIHRoZSBuYXRpdmUgc2VsZWN0IG1lbnUgcmF0aGVyIHRoZSBqcXVlcnkgY2hvc2VuLWJhc2VkIG9uZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ29sZFNlbGVjdCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L2/55So5LiN5Y+v5pCc57Si55qE57uP5YW46I+c5Y2VJywgJ+S9v+eUqOS4jeWPr+aQnOWwi+eahOe2k+WFuOmBuOWWricpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjdXN0b21XYXJuaW5nTGlzdCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ6K2m5ZGK5qih5p2/JywgJ+iHquioguitpuWRiuaooeadvycpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XliqDlhaXmqKHmnb/miJbnlKjmiLflrZDpobXpnaLjgILoh6rlrprkuYnorablkYrkvJrlh7rnjrDlnKjorablkYrlr7nor53moYbkuK3igJzoh6rlrprkuYnorablkYrigJ3kuIDoioLjgIInLFxuXHRcdFx0XHRcdFx0J+aCqOWPr+S7peWKoOWFpeaooeadv+aIluS9v+eUqOiAheWtkOmggemdouOAguiHquioguitpuWRiuacg+WHuuePvuWcqOitpuWRiuWwjeipseaWueWhiuS4reOAjOiHquioguitpuWRiuOAjeS4gOevgOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdjdXN0b21MaXN0Jyxcblx0XHRcdFx0XHRjdXN0b21MaXN0VmFsdWVUaXRsZTogd2luZG93LndnVUxTKCfmqKHmnb/lkI3vvIjkuI3lkKvlpKfmi6zlj7fvvIknLCAn5qih5p2/5ZCN77yI5LiN5ZCr5aSn5ous6Jmf77yJJyksXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdExhYmVsVGl0bGU6IHdpbmRvdy53Z1VMUygn5pi+56S655qE5paH5a2X77yI5ZKM57yW6L6R5pGY6KaB77yJJywgJ+mhr+ekuueahOaWh+Wtl++8iOWSjOe3qOi8r+aRmOimge+8iScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+WtmOW6n+iuqOiuuicsICflrZjlu6LoqI7oq5YnKSxcblx0XHRcdG1vZHVsZTogJ3hmZCcsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2xvZ1hmZE5vbWluYXRpb25zJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjnlKjmiLfnqbrpl7TkuK3orrDlvZXmiYDmnInlrZjlup/orqjorrrmj5DlkI0nLCAn5Zyo5L2/55So6ICF56m66ZaT5Lit6KiY6YyE5omA5pyJ5a2Y5bui6KiO6KuW5o+Q5ZCNJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+ivpeaXpeW/l+S+m+aCqOi/vei4quaJgOaciemAmui/h1R3aW5rbGXmj5DkuqTnmoTlrZjlup/orqjorronLFxuXHRcdFx0XHRcdFx0J+ipsuaXpeiqjOS+m+aCqOi/vei5pOaJgOaciemAj+mBjlR3aW5rbGXmj5DkuqTnmoTlrZjlu6LoqI7oq5YnXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAneGZkTG9nUGFnZU5hbWUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOatpOmhteS/neeVmeaXpeW/lycsICflnKjmraTpoIHkv53nlZnml6XoqownKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5Zyo5q2k5qGG5Lit6L6T5YWl5a2Q6aG16Z2i5ZCN56ew77yM5oKo5bCG5ZyoVXNlcjo8aT7nlKjmiLflkI08L2k+LzxpPuWtkOmhtemdojwvaT7mib7liLBYRkTml6Xlv5fjgILku4XlnKjlkK/nlKjml6Xlv5fml7blt6XkvZzjgIInLFxuXHRcdFx0XHRcdFx0J+WcqOatpOahhuS4rei8uOWFpeWtkOmggemdouWQjeeose+8jOaCqOWwh+WcqFVzZXI6PGk+5L2/55So6ICF5ZCN56ixPC9pPi88aT7lrZDpoIHpnaI8L2k+5om+5YiwWEZE5pel6KqM44CC5YOF5Zyo5ZWf55So5pel6KqM5pmC5bel5L2c44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbm9Mb2dPblhmZE5vbWluYXRpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOS9v+eUqOS7peS4i+eQhueUseaXtuS4jeWBmuiusOW9lScsICflnKjkvb/nlKjku6XkuIvnkIbnlLHmmYLkuI3lgZroqJjpjIQnKSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMueGZkQ3JpdGVyaWEsXG5cdFx0XHRcdFx0c2V0RGlzcGxheU9yZGVyOiBUd2lua2xlLmNvbmZpZy5jb21tb25TZXRzLnhmZENyaXRlcmlhRGlzcGxheU9yZGVyLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnhmZFdhdGNoUGFnZSAoc3RyaW5nKVxuXHRcdFx0XHQvLyBUaGUgd2F0Y2hsaXN0IHNldHRpbmcgb2YgdGhlIHBhZ2UgYmVpbmcgbm9taW5hdGVkIGZvciBYZkQuXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAneGZkV2F0Y2hQYWdlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliqDlhaXmj5DlkI3nmoTpobXpnaLliLDnm5Hop4bliJfooagnLCAn5Yqg5YWl5o+Q5ZCN55qE6aCB6Z2i5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnhmZFdhdGNoRGlzY3Vzc2lvbiAoc3RyaW5nKVxuXHRcdFx0XHQvLyBUaGUgd2F0Y2hsaXN0IHNldHRpbmcgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgWGZEIHBhZ2UgKGZvciB0aG9zZSBwcm9jZXNzZXMgdGhhdCBjcmVhdGUgZGlzY3Vzc2lvbiBwYWdlcyBmb3IgZWFjaCBub21pbmF0aW9uKSxcblx0XHRcdFx0Ly8gb3IgdGhlIGxpc3QgcGFnZSBmb3IgdGhlIG90aGVyIHByb2Nlc3Nlcy5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd4ZmRXYXRjaERpc2N1c3Npb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeWtmOW6n+iuqOiuuumhteWIsOebkeinhuWIl+ihqCcsICfliqDlhaXlrZjlu6LoqI7oq5bpoIHliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoJ+W9k+aXpeeahOmhtemdouOAgicsICfnlbbml6XnmoTpoIHpnaLjgIInKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcueGZkV2F0Y2hVc2VyIChzdHJpbmcpXG5cdFx0XHRcdC8vIFRoZSB3YXRjaGxpc3Qgc2V0dGluZyBvZiB0aGUgdXNlciB0YWxrIHBhZ2UgaWYgdGhleSByZWNlaXZlIGEgbm90aWZpY2F0aW9uLlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3hmZFdhdGNoVXNlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfliqDlhaXliJvlu7rogIXorqjorrrpobXliLDnm5Hop4bliJfooajvvIjlnKjpgJrnn6Xml7bvvIknLFxuXHRcdFx0XHRcdFx0J+WKoOWFpeW7uueri+iAheiojuirlumggeWIsOebo+imlua4heWWru+8iOWcqOmAmuefpeaZgu+8iSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdtYXJrWGZkUGFnZXNBc1BhdHJvbGxlZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w5pe25qCH6K6w6aG16Z2i5Li65bey5beh5p+l77yI5aaC5Y+v6IO977yJJywgJ+aomeiomOaZguaomeiomOmggemdoueCuuW3suW3oeafpe+8iOWmguWPr+iDve+8iScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfln7rkuo7mioDmnK/ljp/lm6DvvIzpobXpnaLku4XkvJrlnKjnlLFTcGVjaWFsOk5ld1BhZ2Vz5Yiw6L6+5pe26KKr5qCH6K6w5Li65bey5beh5p+l44CCJyxcblx0XHRcdFx0XHRcdCfln7rmlrzmioDooZPljp/lm6DvvIzpoIHpnaLlg4XmnIPlnKjnlLFTcGVjaWFsOk5ld1BhZ2Vz5Yiw6YGU5pmC6KKr5qiZ6KiY54K65bey5beh5p+l44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ0Z3ZENzZFRvWGZkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmj5DliKDnsbvlnovlop7liqDovazkuqToh6rlv6vpgJ/liKDpmaTlgJnpgIknLCAn5o+Q5Yiq6aGe5Yil5aKe5Yqg6L2J5Lqk6Ieq5b+r6YCf5Yiq6Zmk5YCZ6YG4JyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+ivt+ehruS/neaCqOWFheWIhuS6huino1tbUWl1d2VuOuW/q+mAn+WIoOmZpOaWuemSiF1d5omN5byA5ZCv5q2k5Yqf6IO944CCJyxcblx0XHRcdFx0XHRcdCfoq4vnorrkv53mgqjlhYXliIbkuobop6NbW1FpdXdlbjrlv6vpgJ/liKrpmaTmlrnph51dXeaJjemWi+WVn+atpOWKn+iDveOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdhZmREZWZhdWx0Q2F0ZWdvcnknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupOaPkOWIoOexu+WeiycsICfpoJDoqK3mj5DliKrpoZ7liKUnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6Iul6YCJ5oup4oCc55u45ZCM5LqO5LiK5qyh6YCJ5oup4oCd5bCG5L2/55SobG9jYWxTdG9yYWdl5p2l6K6w5b+G44CCJyxcblx0XHRcdFx0XHRcdCfoi6Xpgbjmk4fjgIznm7jlkIzmlrzkuIrmrKHpgbjmk4fjgI3lsIfkvb/nlKhsb2NhbFN0b3JhZ2XkvoboqJjmhrbjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczoge1xuXHRcdFx0XHRcdFx0ZGVsZXRlOiB3aW5kb3cud2dVTFMoJ+WIoOmZpCcsICfliKrpmaQnKSxcblx0XHRcdFx0XHRcdHNhbWU6IHdpbmRvdy53Z1VMUygn55u45ZCM5LqO5LiK5qyh6YCJ5oupJywgJ+ebuOWQjOaWvOS4iuasoemBuOaThycpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnYWZkRmFtZURlZmF1bHRSZWFzb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupOWFs+azqOW6puaPkOWIoOeQhueUsScsICfpoJDoqK3pl5zms6jluqbmj5DliKrnkIbnlLEnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoJ+eUqOS6juaJuemHj+aPkOWIoOOAgicsICfnlKjmlrzmibnmrKHmj5DliKrjgIInKSxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdhZmRTdWJzdHViRGVmYXVsdFJlYXNvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5bCP5bCP5L2c5ZOB5o+Q5Yig55CG55SxJywgJ+mgkOioreWwj+Wwj+S9nOWTgeaPkOWIqueQhueUsScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn55So5LqO5om56YeP5o+Q5Yig44CCJywgJ+eUqOaWvOaJueasoeaPkOWIquOAgicpLFxuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+WFs+mXreWtmOW6n+iuqOiuuicsICfpl5zplonlrZjlu6LoqI7oq5YnKSxcblx0XHRcdG1vZHVsZTogJ2Nsb3NlJyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnWGZkQ2xvc2UnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOWtmOW6n+iuqOiuuuaYvuekuuWFs+mXreiuqOiuuuaMiemSricsICflnKjlrZjlu6LoqI7oq5bpoa/npLrpl5zplonoqI7oq5bmjInpiJUnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6K+356Gu5L+d5oKo5YWF5YiG5LqG6KejW1tRaXV3ZW465Yig6Zmk5pa56ZKIXV3miY3lvIDlkK/mraTlip/og73jgIInLFxuXHRcdFx0XHRcdFx0J+iri+eiuuS/neaCqOWFheWIhuS6huino1tbUWl1d2VuOuWIqumZpOaWuemHnV1d5omN6ZaL5ZWf5q2k5Yqf6IO944CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IHtcblx0XHRcdFx0XHRcdGhpZGU6IHdpbmRvdy53Z1VMUygn5LiN5pi+56S6JywgJ+S4jemhr+ekuicpLFxuXHRcdFx0XHRcdFx0bm9uYWRtaW5vbmx5OiB3aW5kb3cud2dVTFMoJ+WPquWMheWQq+mdnueuoeeQhuWRmOWPr+S9v+eUqOmAiemhuScsICflj6rljIXlkKvpnZ7nrqHnkIblk6Hlj6/kvb/nlKjpgbjpoIUnKSxcblx0XHRcdFx0XHRcdGFsbDogd2luZG93LndnVUxTKCfmmL7npLrmiYDmnInpgInpobknLCAn6aGv56S65omA5pyJ6YG46aCFJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogd2luZG93LndnVUxTKCfkvrXniq/okZfkvZzmnYMnLCAn5L6154qv6JGX5L2c5qyKJyksXG5cdFx0XHRtb2R1bGU6ICdjb3B5dmlvJyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuY29weXZpb1dhdGNoUGFnZSAoc3RyaW5nKVxuXHRcdFx0XHQvLyBUaGUgd2F0Y2hsaXN0IHNldHRpbmcgb2YgdGhlIHBhZ2UgYmVpbmcgbm9taW5hdGVkIGZvciBYZkQuXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY29weXZpb1dhdGNoUGFnZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5o+Q5oql55qE6aG16Z2i5Yiw55uR6KeG5YiX6KGoJywgJ+WKoOWFpeaPkOWgseeahOmggemdouWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5jb3B5dmlvV2F0Y2hVc2VyIChzdHJpbmcpXG5cdFx0XHRcdC8vIFRoZSB3YXRjaGxpc3Qgc2V0dGluZyBvZiB0aGUgdXNlciBpZiBoZSByZWNlaXZlcyBhIG5vdGlmaWNhdGlvbi5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjb3B5dmlvV2F0Y2hVc2VyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WKoOWFpeWIm+W7uuiAheiuqOiuuumhteWIsOebkeinhuWIl+ihqO+8iOWcqOmAmuefpeaXtu+8iScsXG5cdFx0XHRcdFx0XHQn5Yqg5YWl5bu656uL6ICF6KiO6KuW6aCB5Yiw55uj6KaW5riF5Zau77yI5Zyo6YCa55+l5pmC77yJJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLm1hcmtDb3B5dmlvUGFnZXNBc1BhdHJvbGxlZCAoYm9vbGVhbilcblx0XHRcdFx0Ly8gSWYsIHdoZW4gYXBwbHlpbmcgY29weXZpbyB0ZW1wbGF0ZSB0byBwYWdlLCB0byBtYXJrIHRoZSBwYWdlIGFzIHBhdHJvbGxlZCAoaWYgdGhlIHBhZ2Ugd2FzIHJlYWNoZWQgZnJvbSBOZXdQYWdlcylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdtYXJrQ29weXZpb1BhZ2VzQXNQYXRyb2xsZWQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOaXtuagh+iusOmhtemdouS4uuW3suW3oeafpe+8iOWmguWPr+iDve+8iScsICfmqJnoqJjmmYLmqJnoqJjpoIHpnaLngrrlt7Llt6Hmn6XvvIjlpoLlj6/og73vvIknKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5Z+65LqO5oqA5pyv5Y6f5Zug77yM6aG16Z2i5LuF5Lya5Zyo55SxU3BlY2lhbDpOZXdQYWdlc+WIsOi+vuaXtuiiq+agh+iusOS4uuW3suW3oeafpeOAgicsXG5cdFx0XHRcdFx0XHQn5Z+65pa85oqA6KGT5Y6f5Zug77yM6aCB6Z2i5YOF5pyD5Zyo55SxU3BlY2lhbDpOZXdQYWdlc+WIsOmBlOaZguiiq+aomeiomOeCuuW3suW3oeafpeOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogd2luZG93LndnVUxTKCfpmpDol48nLCAn6Zqx6JePJyksXG5cdFx0XHRoaWRkZW46IHRydWUsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHQvLyB0d2lua2xlLmpzOiBwb3J0bGV0IHNldHVwXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAncG9ydGxldEFyZWEnLFxuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3BvcnRsZXRJZCcsXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAncG9ydGxldE5hbWUnLFxuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3BvcnRsZXRUeXBlJyxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdwb3J0bGV0TmV4dCcsXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIHR3aW5rbGVmbHVmZi5qczogZGVmaW5lcyBob3cgbWFueSByZXZpc2lvbiB0byBxdWVyeSBtYXhpbXVtLCBtYXhpbXVtIHBvc3NpYmxlIGlzIDUwLCBkZWZhdWx0IGlzIDUwXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAncmV2ZXJ0TWF4UmV2aXNpb25zJyxcblx0XHRcdFx0XHR0eXBlOiAnaW50ZWdlcicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIHR3aW5rbGViYXRjaGRlbGV0ZS5qczogSG93IG1hbnkgcGFnZXMgc2hvdWxkIGJlIHByb2Nlc3NlZCBtYXhpbXVtXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnYmF0Y2hNYXgnLFxuXHRcdFx0XHRcdHR5cGU6ICdpbnRlZ2VyJyxcblx0XHRcdFx0XHRhZG1pbk9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIEhvdyBtYW55IHBhZ2VzIHNob3VsZCBiZSBwcm9jZXNzZWQgYXQgYSB0aW1lIGJ5IGRlcHJvZCBhbmQgYmF0Y2hkZWxldGUvcHJvdGVjdC91bmRlbGV0ZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2JhdGNoQ2h1bmtzJyxcblx0XHRcdFx0XHR0eXBlOiAnaW50ZWdlcicsXG5cdFx0XHRcdFx0YWRtaW5Pbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRdOyAvLyBlbmQgb2YgVHdpbmtsZS5jb25maWcuc2VjdGlvbnNcblx0VHdpbmtsZS5jb25maWcuaW5pdCA9ICgpID0+IHtcblx0XHQvLyBjcmVhdGUgdGhlIGNvbmZpZyBwYWdlIGF0IFR3aW5rbGUuZ2V0UHJlZignY29uZmlnUGFnZScpXG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSA9PT0gVHdpbmtsZS5nZXRQcmVmKCdjb25maWdQYWdlJykgJiYgbXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ3ZpZXcnKSB7XG5cdFx0XHRpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0d2lua2xlLWNvbmZpZycpKSB7XG5cdFx0XHRcdHJldHVybjsgLy8gbWF5YmUgdGhlIHBhZ2UgaXMgbWlzY29uZmlndXJlZCwgb3Igc29tZXRoaW5nIC0gYnV0IGFueSBhdHRlbXB0IHRvIG1vZGlmeSBpdCB3aWxsIGJlIHBvaW50bGVzc1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udGVudGRpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0d2lua2xlLWNvbmZpZy1jb250ZW50Jyk7XG5cdFx0XHRjb250ZW50ZGl2LnRleHRDb250ZW50ID0gJyc7IC8vIGNsZWFyIGNoaWxkcmVuXG5cdFx0XHQvLyBzdGFydCBhIHRhYmxlIG9mIGNvbnRlbnRzXG5cdFx0XHRjb25zdCB0b2N0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0dG9jdGFibGUuY2xhc3NOYW1lID0gJ3RvYyc7XG5cdFx0XHR0b2N0YWJsZS5zdHlsZS5tYXJnaW5MZWZ0ID0gJzAuNGVtJztcblx0XHRcdC8vIGNyZWF0ZSBUT0MgdGl0bGVcblx0XHRcdGNvbnN0IHRvY3RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHR0b2N0aXRsZS5pZCA9ICd0b2N0aXRsZSc7XG5cdFx0XHRjb25zdCB0b2NoMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gyJyk7XG5cdFx0XHR0b2NoMi50ZXh0Q29udGVudCA9IHdpbmRvdy53Z1VMUygn55uu5b2VICcsICfnm67pjIQgJyk7XG5cdFx0XHR0b2N0aXRsZS5hcHBlbmRDaGlsZCh0b2NoMik7XG5cdFx0XHQvLyBhZGQgVE9DIHNob3cvaGlkZSBsaW5rXG5cdFx0XHRjb25zdCB0b2N0b2dnbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHR0b2N0b2dnbGUuY2xhc3NOYW1lID0gJ3RvY3RvZ2dsZSc7XG5cdFx0XHR0b2N0b2dnbGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1snKSk7XG5cdFx0XHRjb25zdCB0b2N0b2dnbGVsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0dG9jdG9nZ2xlbGluay5jbGFzc05hbWUgPSAnaW50ZXJuYWwnO1xuXHRcdFx0dG9jdG9nZ2xlbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnI3R3LXRvY3Nob3doaWRlJyk7XG5cdFx0XHR0b2N0b2dnbGVsaW5rLnRleHRDb250ZW50ID0gd2luZG93LndnVUxTKCfpmpDol48nLCAn6Zqx6JePJyk7XG5cdFx0XHR0b2N0b2dnbGUuYXBwZW5kQ2hpbGQodG9jdG9nZ2xlbGluayk7XG5cdFx0XHR0b2N0b2dnbGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ10nKSk7XG5cdFx0XHR0b2N0aXRsZS5hcHBlbmRDaGlsZCh0b2N0b2dnbGUpO1xuXHRcdFx0dG9jdGFibGUuYXBwZW5kQ2hpbGQodG9jdGl0bGUpO1xuXHRcdFx0Ly8gY3JlYXRlIGl0ZW0gY29udGFpbmVyOiB0aGlzIGlzIHdoYXQgd2UgYWRkIHN0dWZmIHRvXG5cdFx0XHRjb25zdCB0b2N1bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG5cdFx0XHR0b2N0b2dnbGVsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcdCdjbGljaycsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCAkdG9jdWwgPSAkKHRvY3VsKTtcblx0XHRcdFx0XHQkdG9jdWwudG9nZ2xlKCk7XG5cdFx0XHRcdFx0aWYgKCR0b2N1bC5maW5kKCc6dmlzaWJsZScpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dG9jdG9nZ2xlbGluay50ZXh0Q29udGVudCA9IHdpbmRvdy53Z1VMUygn6ZqQ6JePJywgJ+maseiXjycpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0b2N0b2dnbGVsaW5rLnRleHRDb250ZW50ID0gd2luZG93LndnVUxTKCfmmL7npLonLCAn6aGv56S6Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KTtcblx0XHRcdHRvY3RhYmxlLmFwcGVuZENoaWxkKHRvY3VsKTtcblx0XHRcdGNvbnRlbnRkaXYuYXBwZW5kQ2hpbGQodG9jdGFibGUpO1xuXHRcdFx0Y29uc3QgY29udGVudGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2NyaXB0LXVybFxuXHRcdFx0Y29udGVudGZvcm0uc2V0QXR0cmlidXRlKCdhY3Rpb24nLCAnamF2YXNjcmlwdDp2b2lkKDApJyk7IC8vIHdhcyAjdHctc2F2ZSAtIGNoYW5nZWQgdG8gdm9pZCgwKSB0byB3b3JrIGFyb3VuZCBDaHJvbWUgaXNzdWVcblx0XHRcdGNvbnRlbnRmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIFR3aW5rbGUuY29uZmlnLnNhdmUsIHRydWUpO1xuXHRcdFx0Y29udGVudGRpdi5hcHBlbmRDaGlsZChjb250ZW50Zm9ybSk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXHRcdFx0Y29udGVudGZvcm0uYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblx0XHRcdCQoVHdpbmtsZS5jb25maWcuc2VjdGlvbnMpLmVhY2goKHNlY3Rpb25rZXksIHNlY3Rpb24pID0+IHtcblx0XHRcdFx0aWYgKHNlY3Rpb24uaGlkZGVuIHx8IChzZWN0aW9uLmFkbWluT25seSAmJiAhTW9yZWJpdHMudXNlcklzU3lzb3ApKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7IC8vIGkuZS4gXCJjb250aW51ZVwiIGluIHRoaXMgY29udGV4dFxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGFkZCB0byBUT0Ncblx0XHRcdFx0Y29uc3QgdG9jbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuXHRcdFx0XHR0b2NsaS5jbGFzc05hbWUgPSAndG9jbGV2ZWwtMSc7XG5cdFx0XHRcdGNvbnN0IHRvY2EgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0XHRcdHRvY2Euc2V0QXR0cmlidXRlKCdocmVmJywgYCMke3NlY3Rpb24ubW9kdWxlfWApO1xuXHRcdFx0XHR0b2NhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlY3Rpb24udGl0bGUpKTtcblx0XHRcdFx0dG9jbGkuYXBwZW5kQ2hpbGQodG9jYSk7XG5cdFx0XHRcdHRvY3VsLmFwcGVuZENoaWxkKHRvY2xpKTtcblx0XHRcdFx0bGV0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG5cdFx0XHRcdGxldCBjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRcdFx0Y2VsbC5zZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nLCAnMycpO1xuXHRcdFx0XHRjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDQnKTtcblx0XHRcdFx0aGVhZGluZy5zdHlsZS5ib3JkZXJCb3R0b20gPSAnMXB4IHNvbGlkICM4MDgwODAnO1xuXHRcdFx0XHRoZWFkaW5nLnN0eWxlLm1hcmdpblRvcCA9ICcwLjJlbSc7XG5cdFx0XHRcdGhlYWRpbmcuaWQgPSBzZWN0aW9uLm1vZHVsZTtcblx0XHRcdFx0aGVhZGluZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzZWN0aW9uLnRpdGxlKSk7XG5cdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XG5cdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKHJvdyk7XG5cdFx0XHRcdGxldCByb3djb3VudCA9IDE7IC8vIGZvciByb3cgYmFuZGluZ1xuXHRcdFx0XHQvLyBhZGQgZWFjaCBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gdGhlIGZvcm1cblx0XHRcdFx0JChzZWN0aW9uLnByZWZlcmVuY2VzKS5lYWNoKChwcmVma2V5LCBwcmVmKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByZWYuYWRtaW5Pbmx5ICYmICFNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7IC8vIGkuZS4gXCJjb250aW51ZVwiIGluIHRoaXMgY29udGV4dFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG5cdFx0XHRcdFx0cm93LnN0eWxlLm1hcmdpbkJvdHRvbSA9ICcwLjJlbSc7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIG9kZCByb3cgYmFuZGluZ1xuXHRcdFx0XHRcdGlmIChyb3djb3VudCsrICUgMiA9PT0gMCkge1xuXHRcdFx0XHRcdFx0cm93LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdyZ2IoMTI4IDEyOCAxMjgvLjEpJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XG5cdFx0XHRcdFx0bGV0IGxhYmVsO1xuXHRcdFx0XHRcdGxldCBpbnB1dDtcblx0XHRcdFx0XHRjb25zdCBnb3RQcmVmID0gVHdpbmtsZS5nZXRQcmVmKHByZWYubmFtZSk7XG5cdFx0XHRcdFx0c3dpdGNoIChwcmVmLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ2Jvb2xlYW4nOlxuXHRcdFx0XHRcdFx0XHQvLyBjcmVhdGUgYSBjaGVja2JveFxuXHRcdFx0XHRcdFx0XHRjZWxsLnNldEF0dHJpYnV0ZSgnY29sc3BhbicsICcyJyk7XG5cdFx0XHRcdFx0XHRcdGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHRcdFx0XHRcdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuXHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcblx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCdpZCcsIHByZWYubmFtZSk7XG5cdFx0XHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIHByZWYubmFtZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChnb3RQcmVmID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5wdXQuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bGFiZWwuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuXHRcdFx0XHRcdFx0XHRsYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwcmVmLmxhYmVsKSk7XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3N0cmluZyc6IC8vIGNyZWF0ZSBhbiBpbnB1dCBib3hcblx0XHRcdFx0XHRcdGNhc2UgJ2ludGVnZXInOlxuXHRcdFx0XHRcdFx0XHQvLyBhZGQgbGFiZWwgdG8gZmlyc3QgY29sdW1uXG5cdFx0XHRcdFx0XHRcdGNlbGwuc3R5bGUudGV4dEFsaWduID0gJ3JpZ2h0Jztcblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMC41ZW0nO1xuXHRcdFx0XHRcdFx0XHRsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG5cdFx0XHRcdFx0XHRcdGxhYmVsLnNldEF0dHJpYnV0ZSgnZm9yJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYCR7cHJlZi5sYWJlbH3vvJpgKSk7XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXHRcdFx0XHRcdFx0XHRyb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBpbnB1dCBib3ggdG8gc2Vjb25kIGNvbHVtblxuXHRcdFx0XHRcdFx0XHRjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMWVtJztcblx0XHRcdFx0XHRcdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuXHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpO1xuXHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ2lkJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKHByZWYudHlwZSA9PT0gJ2ludGVnZXInKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCdzaXplJywgNik7XG5cdFx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ251bWJlcicpO1xuXHRcdFx0XHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgnc3RlcCcsICcxJyk7IC8vIGludGVnZXJzIG9ubHlcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChnb3RQcmVmKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIGdvdFByZWYpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2VudW0nOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGNyZWF0ZSBhIGNvbWJvIGJveFxuXHRcdFx0XHRcdFx0XHQvLyBhZGQgbGFiZWwgdG8gZmlyc3QgY29sdW1uXG5cdFx0XHRcdFx0XHRcdC8vIG5vdGU6IGR1cGxpY2F0ZXMgdGhlIGNvZGUgYWJvdmUsIHVuZGVyIHN0cmluZy9pbnRlZ2VyXG5cdFx0XHRcdFx0XHRcdGNlbGwuc3R5bGUudGV4dEFsaWduID0gJ3JpZ2h0Jztcblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMC41ZW0nO1xuXHRcdFx0XHRcdFx0XHRsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG5cdFx0XHRcdFx0XHRcdGxhYmVsLnNldEF0dHJpYnV0ZSgnZm9yJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYCR7cHJlZi5sYWJlbH3vvJpgKSk7XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXHRcdFx0XHRcdFx0XHRyb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBpbnB1dCBib3ggdG8gc2Vjb25kIGNvbHVtblxuXHRcdFx0XHRcdFx0XHRjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMWVtJztcblx0XHRcdFx0XHRcdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcblx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCdpZCcsIHByZWYubmFtZSk7XG5cdFx0XHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIHByZWYubmFtZSk7XG5cdFx0XHRcdFx0XHRcdGxldCBvcHRpb25FeGlzdHMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBbZW51bXZhbHVlLCBlbnVtZGlzcGxheV0gb2YgT2JqZWN0LmVudHJpZXMocHJlZi5lbnVtVmFsdWVzKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgZW51bXZhbHVlKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRnb3RQcmVmID09PSBlbnVtdmFsdWUgfHxcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhY2sgdG8gY29udmVydCBvbGQgYm9vbGVhbiB3YXRjaGxpc3QgcHJlZnNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHRvIGNvcnJlc3BvbmRpbmcgZW51bXMgKGFkZGVkIGluIHYyLjEpXG5cdFx0XHRcdFx0XHRcdFx0XHQodHlwZW9mIGdvdFByZWYgPT09ICdib29sZWFuJyAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoKGdvdFByZWYgJiYgZW51bXZhbHVlID09PSAneWVzJykgfHwgKCFnb3RQcmVmICYmIGVudW12YWx1ZSA9PT0gJ25vJykpKVxuXHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCAnc2VsZWN0ZWQnKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9wdGlvbkV4aXN0cyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbnVtZGlzcGxheSkpO1xuXHRcdFx0XHRcdFx0XHRcdGlucHV0LmFwcGVuZENoaWxkKG9wdGlvbik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Ly8gQXBwZW5kIHVzZXItZGVmaW5lZCB2YWx1ZSB0byBvcHRpb25zXG5cdFx0XHRcdFx0XHRcdGlmICghb3B0aW9uRXhpc3RzKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBnb3RQcmVmKTtcblx0XHRcdFx0XHRcdFx0XHRvcHRpb24uc2V0QXR0cmlidXRlKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpO1xuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnb3RQcmVmKSk7XG5cdFx0XHRcdFx0XHRcdFx0aW5wdXQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjZWxsLmFwcGVuZENoaWxkKGlucHV0KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlICdzZXQnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGNyZWF0ZSBhIHNldCBvZiBjaGVjayBib3hlc1xuXHRcdFx0XHRcdFx0XHQvLyBhZGQgbGFiZWwgZmlyc3Qgb2YgYWxsXG5cdFx0XHRcdFx0XHRcdGNlbGwuc2V0QXR0cmlidXRlKCdjb2xzcGFuJywgJzInKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpOyAvLyBub3QgcmVhbGx5IG5lY2Vzc2FyeSB0byB1c2UgYSBsYWJlbCBlbGVtZW50IGhlcmUsIGJ1dCB3ZSBkbyBpdCBmb3IgY29uc2lzdGVuY3kgb2Ygc3R5bGluZ1xuXHRcdFx0XHRcdFx0XHRsYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtwcmVmLmxhYmVsfe+8mmApKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChsYWJlbCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRcdFx0XHRcdGNoZWNrZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJzFlbSc7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHdvcmtlciA9IChpdGVta2V5LCBpdGVtdmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGVja2xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHRcdFx0XHRcdFx0XHRjaGVja2xhYmVsLnN0eWxlLm1hcmdpblJpZ2h0ID0gJzAuN2VtJztcblx0XHRcdFx0XHRcdFx0XHRjaGVja2xhYmVsLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjaGVjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2suc2V0QXR0cmlidXRlKCd0eXBlJywgJ2NoZWNrYm94Jyk7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2suc2V0QXR0cmlidXRlKCdpZCcsIGAke3ByZWYubmFtZX1fJHtpdGVta2V5fWApO1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrLnNldEF0dHJpYnV0ZSgnbmFtZScsIGAke3ByZWYubmFtZX1fJHtpdGVta2V5fWApO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChnb3RQcmVmICYmIGdvdFByZWYuaW5jbHVkZXMoaXRlbWtleSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNoZWNrLmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBjYXRlciBmb3IgbGVnYWN5IGludGVnZXIgYXJyYXkgdmFsdWVzIGZvciB1bmxpbmtOYW1lc3BhY2VzICh0aGlzIGNhbiBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGRvd24gdGhlIHRyYWNrLi4uKVxuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdHByZWYubmFtZSA9PT0gJ3VubGlua05hbWVzcGFjZXMnICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRnb3RQcmVmICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRnb3RQcmVmLmluY2x1ZGVzKE51bWJlci5wYXJzZUludChpdGVta2V5LCAxMCkpXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjaGVjay5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tsYWJlbC5hcHBlbmRDaGlsZChjaGVjayk7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tsYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpdGVtdmFsdWUpKTtcblx0XHRcdFx0XHRcdFx0XHRjaGVja2Rpdi5hcHBlbmRDaGlsZChjaGVja2xhYmVsKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0aWYgKHByZWYuc2V0RGlzcGxheU9yZGVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWRkIGNoZWNrIGJveGVzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZGlzcGxheSBvcmRlclxuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBwcmVmLnNldERpc3BsYXlPcmRlcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0d29ya2VyKGl0ZW0sIHByZWYuc2V0VmFsdWVzW2l0ZW1dKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWRkIGNoZWNrIGJveGVzIGFjY29yZGluZyB0byB0aGUgb3JkZXIgaXQgZ2V0cyBmZWQgdG8gdXMgKHByb2JhYmx5IHN0cmljdCBhbHBoYWJldGljYWwpXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBbaXRlbWtleSwgaXRlbXZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcmVmLnNldFZhbHVlcykpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdvcmtlcihpdGVta2V5LCBpdGVtdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjZWxsLmFwcGVuZENoaWxkKGNoZWNrZGl2KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlICdjdXN0b21MaXN0Jzoge1xuXHRcdFx0XHRcdFx0XHQvLyBhZGQgbGFiZWwgdG8gZmlyc3QgY29sdW1uXG5cdFx0XHRcdFx0XHRcdGNlbGwuc3R5bGUudGV4dEFsaWduID0gJ3JpZ2h0Jztcblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMC41ZW0nO1xuXHRcdFx0XHRcdFx0XHRsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG5cdFx0XHRcdFx0XHRcdGxhYmVsLnNldEF0dHJpYnV0ZSgnZm9yJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYCR7cHJlZi5sYWJlbH3vvJpgKSk7XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXHRcdFx0XHRcdFx0XHRyb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBidXR0b24gdG8gc2Vjb25kIGNvbHVtblxuXHRcdFx0XHRcdFx0XHRjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMWVtJztcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3VzdG9tTGlzdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuXHRcdFx0XHRcdFx0XHRjdXN0b21MaXN0QnV0dG9uLnNldEF0dHJpYnV0ZSgnaWQnLCBwcmVmLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRjdXN0b21MaXN0QnV0dG9uLnNldEF0dHJpYnV0ZSgnbmFtZScsIHByZWYubmFtZSk7XG5cdFx0XHRcdFx0XHRcdGN1c3RvbUxpc3RCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xuXHRcdFx0XHRcdFx0XHRjdXN0b21MaXN0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgVHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5kaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdC8vIHVzZSBqUXVlcnkgZGF0YSBvbiB0aGUgYnV0dG9uIHRvIHN0b3JlIHRoZSBjdXJyZW50IGNvbmZpZyB2YWx1ZVxuXHRcdFx0XHRcdFx0XHQkKGN1c3RvbUxpc3RCdXR0b24pLmRhdGEoe1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBnb3RQcmVmLFxuXHRcdFx0XHRcdFx0XHRcdHByZWYsXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRjdXN0b21MaXN0QnV0dG9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHdpbmRvdy53Z1VMUygn57yW6L6R6aG555uuJywgJ+e3qOi8r+mgheebricpKSk7XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQoY3VzdG9tTGlzdEJ1dHRvbik7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0dm9pZCBtdy5ub3RpZnkoYHR3aW5rbGVjb25maWc6IOacquefpeexu+Wei+eahOWxnuaApyAke3ByZWYubmFtZX1gLCB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVjb25maWcnLFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0XHQvLyBhZGQgaGVscCB0aXBcblx0XHRcdFx0XHRjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRcdFx0XHRjZWxsLnN0eWxlLmZvbnRTaXplID0gJzkwJSc7XG5cdFx0XHRcdFx0Y2VsbC5zdHlsZS5jb2xvciA9ICdncmF5Jztcblx0XHRcdFx0XHRpZiAocHJlZi5oZWxwdGlwKSB7XG5cdFx0XHRcdFx0XHQvLyBjb252ZXJ0IG1lbnRpb25zIG9mIHRlbXBsYXRlcyBpbiB0aGUgaGVscHRpcCB0byBjbGlja2FibGUgbGlua3Ncblx0XHRcdFx0XHRcdGNlbGwuaW5uZXJIVE1MID0gcHJlZi5oZWxwdGlwXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRcdC97eyguKz8pfX0vZyxcblx0XHRcdFx0XHRcdFx0XHRge3s8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCgnVGVtcGxhdGU6Jyl9JDFcIiByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPn19YFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRcdC9cXFtcXFsoLis/KV1dL2csXG5cdFx0XHRcdFx0XHRcdFx0YDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCcnKX0kMVwiIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+YFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBhZGQgcmVzZXQgbGluayAoY3VzdG9tIGxpc3RzIGRvbid0IG5lZWQgdGhpcywgYXMgdGhlaXIgY29uZmlnIHZhbHVlIGlzbid0IGRpc3BsYXllZCBvbiB0aGUgZm9ybSlcblx0XHRcdFx0XHRpZiAocHJlZi50eXBlICE9PSAnY3VzdG9tTGlzdCcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc2V0bGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdFx0XHRcdHJlc2V0bGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnI3R3LXJlc2V0Jyk7XG5cdFx0XHRcdFx0XHRyZXNldGxpbmsuc2V0QXR0cmlidXRlKCdpZCcsIGB0d2lua2xlLWNvbmZpZy1yZXNldC0ke3ByZWYubmFtZX1gKTtcblx0XHRcdFx0XHRcdHJlc2V0bGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIFR3aW5rbGUuY29uZmlnLnJlc2V0UHJlZkxpbmssIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJlc2V0bGluay5zdHlsZS5jc3NGbG9hdCA9ICdyaWdodCc7XG5cdFx0XHRcdFx0XHRyZXNldGxpbmsuc3R5bGUubWFyZ2luID0gJzAgMC42ZW0nO1xuXHRcdFx0XHRcdFx0cmVzZXRsaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHdpbmRvdy53Z1VMUygn5aSN5L2NJywgJ+W+qeS9jScpKSk7XG5cdFx0XHRcdFx0XHRjZWxsLmFwcGVuZENoaWxkKHJlc2V0bGluayk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQocm93KTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBmb290ZXJib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGZvb3RlcmJveC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3R3aW5rbGUtY29uZmlnLWJ1dHRvbnBhbmUnKTtcblx0XHRcdGZvb3RlcmJveC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0JDQ0FERic7XG5cdFx0XHRmb290ZXJib3guc3R5bGUucGFkZGluZyA9ICcwLjVlbSc7XG5cdFx0XHRjb25zdCBzdWJtaXRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRcdHN1Ym1pdEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3R3aW5rbGUtY29uZmlnLXN1Ym1pdCcpO1xuXHRcdFx0c3VibWl0QnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdzdWJtaXQnKTtcblx0XHRcdHN1Ym1pdEJ1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh3aW5kb3cud2dVTFMoJ+S/neWtmOS/ruaUuScsICflhLLlrZjkv67mlLknKSkpO1xuXHRcdFx0Zm9vdGVyYm94LmFwcGVuZENoaWxkKHN1Ym1pdEJ1dHRvbik7XG5cdFx0XHRjb25zdCBmb290ZXJzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0Zm9vdGVyc3Bhbi5jbGFzc05hbWUgPSAncGxhaW5saW5rcyc7XG5cdFx0XHRmb290ZXJzcGFuLnN0eWxlLm1hcmdpbkxlZnQgPSAnMi40ZW0nO1xuXHRcdFx0Zm9vdGVyc3Bhbi5zdHlsZS5mb250U2l6ZSA9ICc5MCUnO1xuXHRcdFx0Y29uc3QgZm9vdGVyYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdGZvb3RlcmEuc2V0QXR0cmlidXRlKCdocmVmJywgJyN0dy1yZXNldC1hbGwnKTtcblx0XHRcdGZvb3RlcmEuc2V0QXR0cmlidXRlKCdpZCcsICd0d2lua2xlLWNvbmZpZy1yZXNldGFsbCcpO1xuXHRcdFx0Zm9vdGVyYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIFR3aW5rbGUuY29uZmlnLnJlc2V0QWxsUHJlZnMsIGZhbHNlKTtcblx0XHRcdGZvb3RlcmEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2luZG93LndnVUxTKCfmgaLlpI3pu5jorqQnLCAn5oGi5b6p6aCQ6KitJykpKTtcblx0XHRcdGZvb3RlcnNwYW4uYXBwZW5kQ2hpbGQoZm9vdGVyYSk7XG5cdFx0XHRmb290ZXJib3guYXBwZW5kQ2hpbGQoZm9vdGVyc3Bhbik7XG5cdFx0XHRjb250ZW50Zm9ybS5hcHBlbmRDaGlsZChmb290ZXJib3gpO1xuXHRcdFx0Ly8gc2luY2UgYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgZXhpc3Qgbm93LCB3ZSBjYW4gdHJ5IGdvaW5nIHRvIHRoZSByZXF1ZXN0ZWQgYW5jaG9yXG5cdFx0XHRpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHtcblx0XHRcdFx0Y29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7XG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gbG9jO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpLnVzZXIgJiZcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKS5pbmRleE9mKG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkgPT09IDAgJiZcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKS5zbGljZSgtMykgPT09ICcuanMnXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdC8vIFN0eWxlZCBpbiB0d2lua2xlLmNzc1xuXHRcdFx0Ym94LnNldEF0dHJpYnV0ZSgnaWQnLCAndHdpbmtsZS1jb25maWctaGVhZGVyYm94Jyk7XG5cdFx0XHRsZXQgbGluaztcblx0XHRcdGNvbnN0IHNjcmlwdFBhZ2VOYW1lID0gbXcuY29uZmlnXG5cdFx0XHRcdC5nZXQoJ3dnUGFnZU5hbWUnKVxuXHRcdFx0XHQuc2xpY2UoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLmxhc3RJbmRleE9mKCcvJykgKyAxLFxuXHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKS5sYXN0SW5kZXhPZignLmpzJylcblx0XHRcdFx0KTtcblx0XHRcdGlmIChzY3JpcHRQYWdlTmFtZSA9PT0gJ3R3aW5rbGVvcHRpb25zJykge1xuXHRcdFx0XHQvLyBwbGFjZSBcIndoeSBub3QgdHJ5IHRoZSBwcmVmZXJlbmNlIHBhbmVsXCIgbm90aWNlXG5cdFx0XHRcdGJveC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2NvbmZpZy10d29wdC1ib3gnKTtcblx0XHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykgPiAwKSB7XG5cdFx0XHRcdFx0Ly8gcGFnZSBleGlzdHNcblx0XHRcdFx0XHRib3guYXBwZW5kQ2hpbGQoXG5cdFx0XHRcdFx0XHRkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfov5npobXljIXlkKvmgqjnmoRUd2lua2xl5Y+C5pWw6K6+572u77yM5oKo5Y+v5L2/55SoJyxcblx0XHRcdFx0XHRcdFx0XHQn6YCZ6aCB5YyF5ZCr5oKo55qEVHdpbmtsZeWBj+WlveioreWumu+8jOaCqOWPr+S9v+eUqCdcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gcGFnZSBkb2VzIG5vdCBleGlzdFxuXHRcdFx0XHRcdGJveC5hcHBlbmRDaGlsZChcblx0XHRcdFx0XHRcdGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aCqOWPr+mFjee9ruaCqOeahFR3aW5rbGXvvIzpgJrov4fkvb/nlKgnLCAn5oKo5Y+v6YWN572u5oKo55qEVHdpbmtsZe+8jOmAmumBjuS9v+eUqCcpXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIG13LnV0aWwuZ2V0VXJsKFR3aW5rbGUuZ2V0UHJlZignY29uZmlnUGFnZScpKSk7XG5cdFx0XHRcdGxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2luZG93LndnVUxTKCdUd2lua2xl5Y+C5pWw6K6+572u6Z2i5p2/JywgJ1R3aW5rbGXlgY/lpb3oqK3lrprpnaLmnb8nKSkpO1xuXHRcdFx0XHRib3guYXBwZW5kQ2hpbGQobGluayk7XG5cdFx0XHRcdGJveC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh3aW5kb3cud2dVTFMoJ++8jOaIluebtOaOpee8lui+keacrOmhteOAgicsICfvvIzmiJbnm7TmjqXnt6jovK/mnKzpoIHjgIInKSkpO1xuXHRcdFx0XHQkKGJveCkuaW5zZXJ0QWZ0ZXIoJGJvZHkuZmluZCgnI2NvbnRlbnRTdWInKSk7XG5cdFx0XHR9IGVsc2UgaWYgKFsndmVjdG9yJywgJ3ZlY3Rvci0yMDIyJywgJ2dvbmdiaScsICdjaXRpemVuJywgJ2NvbW1vbiddLmluY2x1ZGVzKHNjcmlwdFBhZ2VOYW1lKSkge1xuXHRcdFx0XHQvLyBwbGFjZSBcIkxvb2tpbmcgZm9yIFR3aW5rbGUgb3B0aW9ucz9cIiBub3RpY2Vcblx0XHRcdFx0Ym94LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnY29uZmlnLXVzZXJza2luLWJveCcpO1xuXHRcdFx0XHRib3guYXBwZW5kQ2hpbGQoXG5cdFx0XHRcdFx0ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+iLpeaCqOaDs+mFjee9ruaCqOeahFR3aW5rbGXvvIzor7fkvb/nlKgnLCAn6Iul5oKo5oOz6YWN572u5oKo55qEVHdpbmtsZe+8jOiri+S9v+eUqCcpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIG13LnV0aWwuZ2V0VXJsKFR3aW5rbGUuZ2V0UHJlZignY29uZmlnUGFnZScpKSk7XG5cdFx0XHRcdGxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2luZG93LndnVUxTKCdUd2lua2xl5Y+C5pWw6K6+572u6Z2i5p2/JywgJ1R3aW5rbGXlgY/lpb3oqK3lrprpnaLmnb8nKSkpO1xuXHRcdFx0XHRib3guYXBwZW5kQ2hpbGQobGluayk7XG5cdFx0XHRcdGJveC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgn44CCJykpO1xuXHRcdFx0XHQkKGJveCkuaW5zZXJ0QWZ0ZXIoJGJvZHkuZmluZCgnI2NvbnRlbnRTdWInKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyBjdXN0b20gbGlzdC1yZWxhdGVkIHN0dWZmXG5cdFR3aW5rbGUuY29uZmlnLmxpc3REaWFsb2cgPSB7fTtcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5hZGRSb3cgPSAoZGxndGFibGUsIHZhbHVlLCBsYWJlbCkgPT4ge1xuXHRcdGNvbnN0IGNvbnRlbnR0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG5cdFx0Ly8gXCJyZW1vdmVcIiBidXR0b25cblx0XHRsZXQgY29udGVudHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRjb25zdCByZW1vdmVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRyZW1vdmVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xuXHRcdHJlbW92ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0J2NsaWNrJyxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0JChjb250ZW50dHIpLnJlbW92ZSgpO1xuXHRcdFx0fSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHRyZW1vdmVCdXR0b24udGV4dENvbnRlbnQgPSAn56e76ZmkJztcblx0XHRjb250ZW50dGQuYXBwZW5kQ2hpbGQocmVtb3ZlQnV0dG9uKTtcblx0XHRjb250ZW50dHIuYXBwZW5kQ2hpbGQoY29udGVudHRkKTtcblx0XHQvLyB2YWx1ZSBpbnB1dCBib3hcblx0XHRjb250ZW50dGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuXHRcdGxldCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcblx0XHRpbnB1dC5jbGFzc05hbWUgPSAndHdpbmtsZS1jb25maWctY3VzdG9tbGlzdC12YWx1ZSc7XG5cdFx0aW5wdXQuc3R5bGUud2lkdGggPSAnOTclJztcblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7XG5cdFx0fVxuXHRcdGNvbnRlbnR0ZC5hcHBlbmRDaGlsZChpbnB1dCk7XG5cdFx0Y29udGVudHRyLmFwcGVuZENoaWxkKGNvbnRlbnR0ZCk7XG5cdFx0Ly8gbGFiZWwgaW5wdXQgYm94XG5cdFx0Y29udGVudHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcblx0XHRpbnB1dC5jbGFzc05hbWUgPSAndHdpbmtsZS1jb25maWctY3VzdG9tbGlzdC1sYWJlbCc7XG5cdFx0aW5wdXQuc3R5bGUud2lkdGggPSAnOTglJztcblx0XHRpZiAobGFiZWwpIHtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBsYWJlbCk7XG5cdFx0fVxuXHRcdGNvbnRlbnR0ZC5hcHBlbmRDaGlsZChpbnB1dCk7XG5cdFx0Y29udGVudHRyLmFwcGVuZENoaWxkKGNvbnRlbnR0ZCk7XG5cdFx0ZGxndGFibGUuYXBwZW5kQ2hpbGQoY29udGVudHRyKTtcblx0fTtcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5kaXNwbGF5ID0gKGUpID0+IHtcblx0XHRjb25zdCAkcHJlZmJ1dHRvbiA9ICQoZS50YXJnZXQpO1xuXHRcdGNvbnN0IGN1cnZhbHVlID0gJHByZWZidXR0b24uZGF0YSgndmFsdWUnKTtcblx0XHRjb25zdCBjdXJwcmVmID0gJHByZWZidXR0b24uZGF0YSgncHJlZicpO1xuXHRcdGNvbnN0IGRpYWxvZyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNzIwLCA0MDApO1xuXHRcdGRpYWxvZy5zZXRUaXRsZShjdXJwcmVmLmxhYmVsKTtcblx0XHRkaWFsb2cuc2V0U2NyaXB0TmFtZSh3aW5kb3cud2dVTFMoJ1R3aW5rbGXlj4LmlbDorr7nva4nLCAnVHdpbmtsZeWBj+WlveioreWumicpKTtcblx0XHRjb25zdCBkaWFsb2djb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0Y29uc3QgZGxndGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpO1xuXHRcdGRsZ3RhYmxlLmNsYXNzTmFtZSA9ICd3aWtpdGFibGUnO1xuXHRcdGRsZ3RhYmxlLnN0eWxlLm1hcmdpbiA9ICcxLjRlbSAxZW0nO1xuXHRcdGRsZ3RhYmxlLnN0eWxlLndpZHRoID0gJzk3JSc7XG5cdFx0Y29uc3QgZGxndGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuXHRcdC8vIGhlYWRlciByb3dcblx0XHRsZXQgZGxndHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xuXHRcdC8vIHRvcC1sZWZ0IGNlbGxcblx0XHRsZXQgZGxndGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0aCcpO1xuXHRcdGRsZ3RoLnN0eWxlLndpZHRoID0gJzUlJztcblx0XHRkbGd0ci5hcHBlbmRDaGlsZChkbGd0aCk7XG5cdFx0Ly8gdmFsdWUgY29sdW1uIGhlYWRlclxuXHRcdGRsZ3RoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcblx0XHRkbGd0aC5zdHlsZS53aWR0aCA9ICczNSUnO1xuXHRcdGRsZ3RoLnRleHRDb250ZW50ID0gY3VycHJlZi5jdXN0b21MaXN0VmFsdWVUaXRsZSA/PyB3aW5kb3cud2dVTFMoJ+aVsOWAvCcsICfmlbjlgLwnKTtcblx0XHRkbGd0ci5hcHBlbmRDaGlsZChkbGd0aCk7XG5cdFx0Ly8gbGFiZWwgY29sdW1uIGhlYWRlclxuXHRcdGRsZ3RoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcblx0XHRkbGd0aC5zdHlsZS53aWR0aCA9ICc2MCUnO1xuXHRcdGRsZ3RoLnRleHRDb250ZW50ID0gY3VycHJlZi5jdXN0b21MaXN0TGFiZWxUaXRsZSA/PyB3aW5kb3cud2dVTFMoJ+agh+etvicsICfmqJnnsaQnKTtcblx0XHRkbGd0ci5hcHBlbmRDaGlsZChkbGd0aCk7XG5cdFx0ZGxndGJvZHkuYXBwZW5kQ2hpbGQoZGxndHIpO1xuXHRcdC8vIGNvbnRlbnQgcm93c1xuXHRcdGxldCBnb3RSb3cgPSBmYWxzZTtcblx0XHRmb3IgKGNvbnN0IHYgb2YgY3VydmFsdWUpIHtcblx0XHRcdGdvdFJvdyA9IHRydWU7XG5cdFx0XHRUd2lua2xlLmNvbmZpZy5saXN0RGlhbG9nLmFkZFJvdyhkbGd0Ym9keSwgdi52YWx1ZSwgdi5sYWJlbCk7XG5cdFx0fVxuXHRcdC8vIGlmIHRoZXJlIGFyZSBubyB2YWx1ZXMgcHJlc2VudCwgYWRkIGEgYmxhbmsgcm93IHRvIHN0YXJ0IHRoZSB1c2VyIG9mZlxuXHRcdGlmICghZ290Um93KSB7XG5cdFx0XHRUd2lua2xlLmNvbmZpZy5saXN0RGlhbG9nLmFkZFJvdyhkbGd0Ym9keSk7XG5cdFx0fVxuXHRcdC8vIGZpbmFsIFwiYWRkXCIgYnV0dG9uXG5cdFx0Y29uc3QgZGxndGZvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Zm9vdCcpO1xuXHRcdGRsZ3RyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcblx0XHRjb25zdCBkbGd0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XG5cdFx0ZGxndGQuc2V0QXR0cmlidXRlKCdjb2xzcGFuJywgJzMnKTtcblx0XHRjb25zdCBhZGRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRhZGRCdXR0b24uc3R5bGUubWluV2lkdGggPSAnOGVtJztcblx0XHRhZGRCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xuXHRcdGFkZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0J2NsaWNrJyxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5hZGRSb3coZGxndGJvZHkpO1xuXHRcdFx0fSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHRhZGRCdXR0b24udGV4dENvbnRlbnQgPSAn5re75YqgJztcblx0XHRkbGd0ZC5hcHBlbmRDaGlsZChhZGRCdXR0b24pO1xuXHRcdGRsZ3RyLmFwcGVuZENoaWxkKGRsZ3RkKTtcblx0XHRkbGd0Zm9vdC5hcHBlbmRDaGlsZChkbGd0cik7XG5cdFx0ZGxndGFibGUuYXBwZW5kQ2hpbGQoZGxndGJvZHkpO1xuXHRcdGRsZ3RhYmxlLmFwcGVuZENoaWxkKGRsZ3Rmb290KTtcblx0XHRkaWFsb2djb250ZW50LmFwcGVuZENoaWxkKGRsZ3RhYmxlKTtcblx0XHQvLyBidXR0b25wYW5lIGJ1dHRvbnM6IFtTYXZlIGNoYW5nZXNdIFtSZXNldF0gW0NhbmNlbF1cblx0XHRsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG5cdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdzdWJtaXQnKTsgLy8gc28gTW9yZWJpdHMuc2ltcGxlV2luZG93IHB1dHMgdGhlIGJ1dHRvbiBpbiB0aGUgYnV0dG9uIHBhbmVcblx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcblx0XHRcdCdjbGljaycsXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFR3aW5rbGUuY29uZmlnLmxpc3REaWFsb2cuc2F2ZSgkcHJlZmJ1dHRvbiwgZGxndGJvZHkpO1xuXHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdH0sXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0YnV0dG9uLnRleHRDb250ZW50ID0gd2luZG93LndnVUxTKCfkv53lrZjkv67mlLknLCAn5YSy5a2Y5L+u5pS5Jyk7XG5cdFx0ZGlhbG9nY29udGVudC5hcHBlbmRDaGlsZChidXR0b24pO1xuXHRcdGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuXHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnc3VibWl0Jyk7IC8vIHNvIE1vcmViaXRzLnNpbXBsZVdpbmRvdyBwdXRzIHRoZSBidXR0b24gaW4gdGhlIGJ1dHRvbiBwYW5lXG5cdFx0YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHQnY2xpY2snLFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRUd2lua2xlLmNvbmZpZy5saXN0RGlhbG9nLnJlc2V0KCRwcmVmYnV0dG9uLCBkbGd0Ym9keSk7XG5cdFx0XHR9LFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9IHdpbmRvdy53Z1VMUygn5aSN5L2NJywgJ+W+qeS9jScpO1xuXHRcdGRpYWxvZ2NvbnRlbnQuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblx0XHRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRidXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ3N1Ym1pdCcpOyAvLyBzbyBNb3JlYml0cy5zaW1wbGVXaW5kb3cgcHV0cyB0aGUgYnV0dG9uIGluIHRoZSBidXR0b24gcGFuZVxuXHRcdGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0J2NsaWNrJyxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7IC8vIHRoZSBldmVudCBwYXJhbWV0ZXIgb24gdGhpcyBmdW5jdGlvbiBzZWVtcyB0byBiZSBicm9rZW5cblx0XHRcdH0sXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ+WPlua2iCc7XG5cdFx0ZGlhbG9nY29udGVudC5hcHBlbmRDaGlsZChidXR0b24pO1xuXHRcdGRpYWxvZy5zZXRDb250ZW50KGRpYWxvZ2NvbnRlbnQpO1xuXHRcdGRpYWxvZy5kaXNwbGF5KCk7XG5cdH07XG5cdC8vIFJlc2V0cyB0aGUgZGF0YSB2YWx1ZSwgcmUtcG9wdWxhdGVzIGJhc2VkIG9uIHRoZSBuZXcgKGRlZmF1bHQpIHZhbHVlLCB0aGVuIHNhdmVzIHRoZVxuXHQvLyBvbGQgZGF0YSB2YWx1ZSBhZ2FpbiAobGVzcyBzdXJwcmlzaW5nIGJlaGF2aW91cilcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5yZXNldCA9IChidXR0b24sIHRib2R5KSA9PiB7XG5cdFx0Ly8gcmVzZXQgdmFsdWUgb24gYnV0dG9uXG5cdFx0Y29uc3QgJGJ1dHRvbiA9ICQoYnV0dG9uKTtcblx0XHRjb25zdCBjdXJwcmVmID0gJGJ1dHRvbi5kYXRhKCdwcmVmJyk7XG5cdFx0Y29uc3Qgb2xkdmFsdWUgPSAkYnV0dG9uLmRhdGEoJ3ZhbHVlJyk7XG5cdFx0VHdpbmtsZS5jb25maWcucmVzZXRQcmVmKGN1cnByZWYpO1xuXHRcdC8vIHJlc2V0IGZvcm1cblx0XHRjb25zdCAkdGJvZHkgPSAkKHRib2R5KTtcblx0XHQkdGJvZHkuZmluZCgndHInKS5zbGljZSgxKS5yZW1vdmUoKTsgLy8gYWxsIHJvd3MgZXhjZXB0IHRoZSBmaXJzdCAoaGVhZGVyKSByb3dcblx0XHQvLyBhZGQgdGhlIG5ldyB2YWx1ZXNcblx0XHRjb25zdCBjdXJ2YWx1ZSA9ICRidXR0b24uZGF0YSgndmFsdWUnKTtcblx0XHRmb3IgKGNvbnN0IHYgb2YgY3VydmFsdWUpIHtcblx0XHRcdFR3aW5rbGUuY29uZmlnLmxpc3REaWFsb2cuYWRkUm93KHRib2R5LCB2LnZhbHVlLCB2LmxhYmVsKTtcblx0XHR9XG5cdFx0Ly8gc2F2ZSB0aGUgb2xkIHZhbHVlXG5cdFx0JGJ1dHRvbi5kYXRhKCd2YWx1ZScsIG9sZHZhbHVlKTtcblx0fTtcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5zYXZlID0gKGJ1dHRvbiwgdGJvZHkpID0+IHtcblx0XHRjb25zdCByZXN1bHQgPSBbXTtcblx0XHRsZXQgY3VycmVudCA9IHt9O1xuXHRcdCQodGJvZHkpXG5cdFx0XHQuZmluZCgnaW5wdXRbdHlwZT1cInRleHRcIl0nKVxuXHRcdFx0LmVhY2goKGlucHV0a2V5LCBpbnB1dCkgPT4ge1xuXHRcdFx0XHRpZiAoJChpbnB1dCkuaGFzQ2xhc3MoJ3R3aW5rbGUtY29uZmlnLWN1c3RvbWxpc3QtdmFsdWUnKSkge1xuXHRcdFx0XHRcdGN1cnJlbnQgPSB7XG5cdFx0XHRcdFx0XHR2YWx1ZTogaW5wdXQudmFsdWUsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjdXJyZW50LmxhYmVsID0gaW5wdXQudmFsdWU7XG5cdFx0XHRcdFx0Ly8gZXhjbHVkZSB0b3RhbGx5IGVtcHR5IHJvd3Ncblx0XHRcdFx0XHRpZiAoY3VycmVudC52YWx1ZSB8fCBjdXJyZW50LmxhYmVsKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBjdXJyZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0JChidXR0b24pLmRhdGEoJ3ZhbHVlJywgcmVzdWx0KTtcblx0fTtcblx0Ly8gcmVzZXQvcmVzdG9yZSBkZWZhdWx0c1xuXHRUd2lua2xlLmNvbmZpZy5yZXNldFByZWZMaW5rID0gKGUpID0+IHtcblx0XHRjb25zdCB3YW50ZWRwcmVmID0gZS50YXJnZXQuaWQuc2xpY2UoMjEpOyAvLyBcInR3aW5rbGUtY29uZmlnLXJlc2V0LVwiIHByZWZpeCBpcyBzdHJpcHBlZFxuXHRcdC8vIHNlYXJjaCB0YWN0aWNzXG5cdFx0JChUd2lua2xlLmNvbmZpZy5zZWN0aW9ucykuZWFjaCgoc2VjdGlvbmtleSwgc2VjdGlvbikgPT4ge1xuXHRcdFx0aWYgKHNlY3Rpb24uaGlkZGVuIHx8IChzZWN0aW9uLmFkbWluT25seSAmJiAhTW9yZWJpdHMudXNlcklzU3lzb3ApKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlOyAvLyBjb250aW51ZTogc2tpcCBpbXBvc3NpYmlsaXRpZXNcblx0XHRcdH1cblxuXHRcdFx0bGV0IGZvdW5kaXQgPSBmYWxzZTtcblx0XHRcdCQoc2VjdGlvbi5wcmVmZXJlbmNlcykuZWFjaCgocHJlZmtleSwgcHJlZikgPT4ge1xuXHRcdFx0XHRpZiAocHJlZi5uYW1lICE9PSB3YW50ZWRwcmVmKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7IC8vIGNvbnRpbnVlXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRUd2lua2xlLmNvbmZpZy5yZXNldFByZWYocHJlZik7XG5cdFx0XHRcdGZvdW5kaXQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7IC8vIGJyZWFrXG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGZvdW5kaXQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBicmVha1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGZhbHNlOyAvLyBzdG9wIGxpbmsgZnJvbSBzY3JvbGxpbmcgcGFnZVxuXHR9O1xuXG5cdFR3aW5rbGUuY29uZmlnLnJlc2V0UHJlZiA9IChwcmVmKSA9PiB7XG5cdFx0c3dpdGNoIChwcmVmLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jvb2xlYW4nOlxuXHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmLm5hbWV9YCkuY2hlY2tlZCA9IFR3aW5rbGUuZGVmYXVsdENvbmZpZ1twcmVmLm5hbWVdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHRjYXNlICdpbnRlZ2VyJzpcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmLm5hbWV9YCkudmFsdWUgPSBUd2lua2xlLmRlZmF1bHRDb25maWdbcHJlZi5uYW1lXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzZXQnOlxuXHRcdFx0XHRmb3IgKGNvbnN0IFtpdGVta2V5XSBvZiBPYmplY3QuZW50cmllcyhwcmVmLnNldFZhbHVlcykpIHtcblx0XHRcdFx0XHRpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZi5uYW1lfV8ke2l0ZW1rZXl9YCkpIHtcblx0XHRcdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWYubmFtZX1fJHtpdGVta2V5fWApLmNoZWNrZWQgPVxuXHRcdFx0XHRcdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWdbcHJlZi5uYW1lXS5pbmNsdWRlcyhpdGVta2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjdXN0b21MaXN0Jzpcblx0XHRcdFx0JChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmLm5hbWV9YCkpLmRhdGEoJ3ZhbHVlJywgVHdpbmtsZS5kZWZhdWx0Q29uZmlnW3ByZWYubmFtZV0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KGB0d2lua2xlY29uZmlnOiB1bmtub3duIGRhdGEgdHlwZSBmb3IgcHJlZmVyZW5jZSAke3ByZWYubmFtZX1gLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVjb25maWcnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmNvbmZpZy5yZXNldEFsbFByZWZzID0gKCkgPT4ge1xuXHRcdC8vIG5vIGNvbmZpcm1hdGlvbiBtZXNzYWdlIC0gdGhlIHVzZXIgY2FuIGp1c3QgcmVmcmVzaC9jbG9zZSB0aGUgcGFnZSB0byBhYm9ydFxuXHRcdCQoVHdpbmtsZS5jb25maWcuc2VjdGlvbnMpLmVhY2goKHNlY3Rpb25rZXksIHNlY3Rpb24pID0+IHtcblx0XHRcdGlmIChzZWN0aW9uLmhpZGRlbiB8fCAoc2VjdGlvbi5hZG1pbk9ubHkgJiYgIU1vcmViaXRzLnVzZXJJc1N5c29wKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gY29udGludWU6IHNraXAgaW1wb3NzaWJpbGl0aWVzXG5cdFx0XHR9XG5cblx0XHRcdCQoc2VjdGlvbi5wcmVmZXJlbmNlcykuZWFjaCgocHJlZmtleSwgcHJlZikgPT4ge1xuXHRcdFx0XHRpZiAoIXByZWYuYWRtaW5Pbmx5IHx8IE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS5jb25maWcucmVzZXRQcmVmKHByZWYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xuXHRcdHJldHVybiBmYWxzZTsgLy8gc3RvcCBsaW5rIGZyb20gc2Nyb2xsaW5nIHBhZ2Vcblx0fTtcblxuXHRUd2lua2xlLmNvbmZpZy5zYXZlID0gKGUpID0+IHtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdHdpbmtsZS1jb25maWctY29udGVudCcpKTtcblx0XHRjb25zdCB1c2VyanMgPSBgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVttdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpLnVzZXJdfToke213LmNvbmZpZy5nZXQoXG5cdFx0XHQnd2dVc2VyTmFtZSdcblx0XHQpfS90d2lua2xlb3B0aW9ucy5qc2A7XG5cdFx0Y29uc3QgcWl1d2VuX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHVzZXJqcywgd2luZG93LndnVUxTKCfkv53lrZjlj4LmlbDorr7nva7liLAgJywgJ+WEsuWtmOWBj+WlveioreWumuWIsCAnKSArIHVzZXJqcyk7XG5cdFx0cWl1d2VuX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKGUudGFyZ2V0KTtcblx0XHRxaXV3ZW5fcGFnZS5sb2FkKFR3aW5rbGUuY29uZmlnLndyaXRlUHJlZnMpO1xuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0VHdpbmtsZS5jb25maWcud3JpdGVQcmVmcyA9IChwYWdlb2JqKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0Ly8gdGhpcyBpcyB0aGUgb2JqZWN0IHdoaWNoIGdldHMgc2VyaWFsaXplZCBpbnRvIEpTT047IG9ubHlcblx0XHQvLyBwcmVmZXJlbmNlcyB0aGF0IHRoaXMgc2NyaXB0IGtub3dzIGFib3V0IGFyZSBrZXB0XG5cdFx0Y29uc3QgbmV3Q29uZmlnID0ge1xuXHRcdFx0b3B0aW9uc1ZlcnNpb246IDIuMSxcblx0XHR9O1xuXHRcdC8vIGEgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyBuZWVkZWQgbGF0ZXIgb25cblx0XHQvLyBpdCBpcyBqdXN0IGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzIChpLmUuIGNvbXBhcmluZyBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyxcblx0XHQvLyBhcnJheXMgb2Ygc3RyaW5ncywgYW5kIGFycmF5cyBvZiB7IHZhbHVlLCBsYWJlbCB9KVxuXHRcdC8vIGFuZCBpdCBpcyBub3QgdmVyeSByb2J1c3Q6IGUuZy4gY29tcGFyZShbMl0sIFtcIjJcIl0pID09PSB0cnVlLCBhbmRcblx0XHQvLyBjb21wYXJlKHt9LCB7fSkgPT09IGZhbHNlLCBidXQgaXQncyBnb29kIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzIGhlcmVcblx0XHRjb25zdCBjb21wYXJlID0gKGEsIGIpID0+IHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG5cdFx0XHRcdGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0YS5zb3J0KCk7XG5cdFx0XHRcdGIuc29ydCgpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtpLCBlbGVtZW50XSBvZiBhLmVudHJpZXMoKSkge1xuXHRcdFx0XHRcdC8vIGNvbXBhcmlzb24gb2YgdGhlIHR3byBwcm9wZXJ0aWVzIG9mIGN1c3RvbSBsaXN0c1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgKGVsZW1lbnQubGFiZWwgIT09IGJbaV0ubGFiZWwgfHwgZWxlbWVudC52YWx1ZSAhPT0gYltpXS52YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQudG9TdHJpbmcoKSAhPT0gYltpXS50b1N0cmluZygpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGEgPT09IGI7XG5cdFx0fTtcblx0XHQkKFR3aW5rbGUuY29uZmlnLnNlY3Rpb25zKS5lYWNoKChzZWN0aW9ua2V5LCBzZWN0aW9uKSA9PiB7XG5cdFx0XHRpZiAoc2VjdGlvbi5hZG1pbk9ubHkgJiYgIU1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRcdHJldHVybjsgLy8gaS5lLiBcImNvbnRpbnVlXCIgaW4gdGhpcyBjb250ZXh0XG5cdFx0XHR9XG5cdFx0XHQvLyByZWFjaCBlYWNoIG9mIHRoZSBwcmVmZXJlbmNlcyBmcm9tIHRoZSBmb3JtXG5cdFx0XHQkKHNlY3Rpb24ucHJlZmVyZW5jZXMpLmVhY2goKHByZWZrZXksIHByZWYpID0+IHtcblx0XHRcdFx0bGV0IHVzZXJWYWx1ZTsgLy8gPSB1bmRlZmluZWRcblx0XHRcdFx0Ly8gb25seSByZWFkIGZvcm0gdmFsdWVzIGZvciB0aG9zZSBwcmVmcyB0aGF0IGhhdmUgdGhlbVxuXHRcdFx0XHRpZiAoIXByZWYuYWRtaW5Pbmx5IHx8IE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRcdFx0aWYgKCFzZWN0aW9uLmhpZGRlbikge1xuXHRcdFx0XHRcdFx0c3dpdGNoIChwcmVmLnR5cGUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSAnYm9vbGVhbic6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVhZCBmcm9tIHRoZSBjaGVja2JveFxuXHRcdFx0XHRcdFx0XHRcdHVzZXJWYWx1ZSA9IGZvcm1bcHJlZi5uYW1lXS5jaGVja2VkO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdzdHJpbmcnOiAvLyByZWFkIGZyb20gdGhlIGlucHV0IGJveCBvciBjb21ibyBib3hcblx0XHRcdFx0XHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRcdFx0XHRcdFx0dXNlclZhbHVlID0gZm9ybVtwcmVmLm5hbWVdLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdpbnRlZ2VyJzpcblx0XHRcdFx0XHRcdFx0XHQvLyByZWFkIGZyb20gdGhlIGlucHV0IGJveFxuXHRcdFx0XHRcdFx0XHRcdHVzZXJWYWx1ZSA9IE51bWJlci5wYXJzZUludChmb3JtW3ByZWYubmFtZV0udmFsdWUsIDEwKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHVzZXJWYWx1ZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/neWtmCcsICflhLLlrZgnKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfmgqjkuLogJywgJ+aCqOeCuiAnKSArIHByZWYubmFtZX0g5oyH5a6a55qE5YC877yIJHtwcmVmLnZhbHVlfSR7d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCfvvInkuI3lkIjms5XvvIzkvJrnu6fnu63kv53lrZjmk43kvZzvvIzkvYbmraTlgLzlsIbkvJrot7Pov4fjgIInLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCfvvInkuI3lkIjms5XvvIzmnIPnubznuozlhLLlrZjmk43kvZzvvIzkvYbmraTlgLzlsIfmnIPot7PpgY7jgIInXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCl9YFxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdHVzZXJWYWx1ZSA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdzZXQnOlxuXHRcdFx0XHRcdFx0XHRcdC8vIHJlYWQgZnJvbSB0aGUgc2V0IG9mIGNoZWNrIGJveGVzXG5cdFx0XHRcdFx0XHRcdFx0dXNlclZhbHVlID0gW107XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHByZWYuc2V0RGlzcGxheU9yZGVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyByZWFkIG9ubHkgdGhvc2Uga2V5cyBzcGVjaWZpZWQgaW4gdGhlIGRpc3BsYXkgb3JkZXJcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBwcmVmLnNldERpc3BsYXlPcmRlcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZm9ybVtgJHtwcmVmLm5hbWV9XyR7aXRlbX1gXS5jaGVja2VkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dXNlclZhbHVlW3VzZXJWYWx1ZS5sZW5ndGhdID0gaXRlbTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyByZWFkIGFsbCB0aGUga2V5cyBpbiB0aGUgbGlzdCBvZiB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgW2l0ZW1rZXldIG9mIE9iamVjdC5lbnRyaWVzKHByZWYuc2V0VmFsdWVzKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZm9ybVtgJHtwcmVmLm5hbWV9XyR7aXRlbWtleX1gXS5jaGVja2VkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dXNlclZhbHVlW3VzZXJWYWx1ZS5sZW5ndGhdID0gaXRlbWtleTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnY3VzdG9tTGlzdCc6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVhZCBmcm9tIHRoZSBqUXVlcnkgZGF0YSBzdG9yZWQgb24gdGhlIGJ1dHRvbiBvYmplY3Rcblx0XHRcdFx0XHRcdFx0XHR1c2VyVmFsdWUgPSAkKGZvcm1bcHJlZi5uYW1lXSkuZGF0YSgndmFsdWUnKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHR2b2lkIG13Lm5vdGlmeShgdHdpbmtsZWNvbmZpZzog5pyq55+l5pWw5o2u57G75Z6L77yM5bGe5oCnICR7cHJlZi5uYW1lfWAsIHtcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVjb25maWcnLFxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoVHdpbmtsZS5wcmVmcykge1xuXHRcdFx0XHRcdFx0Ly8gUmV0YWluIHRoZSBoaWRkZW4gcHJlZmVyZW5jZXMgdGhhdCBtYXkgaGF2ZSBjdXN0b21pc2VkIGJ5IHRoZSB1c2VyIGZyb20gdHdpbmtsZW9wdGlvbnMuanNcblx0XHRcdFx0XHRcdC8vIHVuZGVmaW5lZCBpZiBub3Qgc2V0XG5cdFx0XHRcdFx0XHR1c2VyVmFsdWUgPSBUd2lua2xlLnByZWZzW3ByZWYubmFtZV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIG9ubHkgc2F2ZSB0aG9zZSBwcmVmZXJlbmNlcyB0aGF0IGFyZSAqZGlmZmVyZW50KiBmcm9tIHRoZSBkZWZhdWx0XG5cdFx0XHRcdGlmICh1c2VyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhY29tcGFyZSh1c2VyVmFsdWUsIFR3aW5rbGUuZGVmYXVsdENvbmZpZ1twcmVmLm5hbWVdKSkge1xuXHRcdFx0XHRcdG5ld0NvbmZpZ1twcmVmLm5hbWVdID0gdXNlclZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0XHRjb25zdCBub3dpa2kgPSAnbm93aWtpJztcblx0XHRsZXQgdGV4dCA9IGAvLyA8JHtub3dpa2l9PlxcbiR7d2luZG93LndnVUxTKFxuXHRcdFx0YC8vIHR3aW5rbGVvcHRpb25zLmpz77ya55So5oi3VHdpbmtsZeWPguaVsOiuvue9ruaWh+S7tlxcbi8vXFxuLy8g5rOo77ya5L+u5pS55oKo55qE5Y+C5pWw6K6+572u5pyA566A5Y2V55qE5Yqe5rOV5piv5L2/55SoXFxuLy8gVHdpbmtsZeWPguaVsOiuvue9rumdouadv++8jOWcqFtbJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV3jgIJcXG4vL1xcbi8vIOi/meS4quaWh+S7tuaYr+iHquWKqOeUn+aIkOeahO+8jOaCqOaJgOWBmueahOS7u+S9leS/ruaUue+8iOmZpOS6hlxcbi8vIOS7peS4gOenjeWQiOazleeahEphdmFTY3JpcHTnmoTmlrnlvI/mnaXkv67mlLnov5nkupvlsZ7mgKflgLzvvInkvJpcXG4vLyDlnKjkuIvkuIDmrKHmgqjngrnlh7vigJzkv53lrZjigJ3ml7booqvopobnm5bjgIJcXG4vLyDkv67mlLnmraTmlofku7bml7bvvIzor7forrDlvpfkvb/nlKjlkIjms5XnmoRKYXZhU2NyaXB044CCXFxuYCxcblx0XHRcdGAvLyB0d2lua2xlb3B0aW9ucy5qc++8muS9v+eUqOiAhVR3aW5rbGXlj4PmlbjoqK3lrprmqpTmoYhcXG4vL1xcbi8vIOiou++8muS/ruaUueaCqOeahOWPg+aVuOioreWumuacgOewoeWWrueahOi+puazleaYr+S9v+eUqFxcbi8vIFR3aW5rbGXlj4PmlbjoqK3lrprpnaLmnb/vvIzlnKhbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1d44CCXFxuLy9cXG4vLyDpgJnlgIvmqpTmoYjmmK/oh6rli5XnlKLnlJ/nmoTvvIzmgqjmiYDlgZrnmoTku7vkvZXkv67mlLnvvIjpmaTkuoZcXG4vLyDku6XkuIDnqK7lkIjms5XnmoRKYXZhU2NyaXB055qE5pa55byP5L6G5L+u5pS56YCZ5Lqb5bGs5oCn5YC877yJ5pyDXFxuLy8g5Zyo5LiL5LiA5qyh5oKo6bue5pOK44CM5YSy5a2Y44CN5pmC6KKr6KaG6JOL44CCXFxuLy8g5L+u5pS55q2k5qqU5qGI5pmC77yM6KuL6KiY5b6X5L2/55So5ZCI5rOV55qESmF2YVNjcmlwdOOAglxcbmBcblx0XHQpfWA7XG5cdFx0dGV4dCArPVxuXHRcdFx0J1xcbndpbmRvdy5Ud2lua2xlID0gd2luZG93LlR3aW5rbGUgfHwge307XFxud2luZG93LlR3aW5rbGUucHJlZnMgPSB3aW5kb3cuVHdpbmtsZS5wcmVmcyB8fCB7fTtcXG53aW5kb3cuVHdpbmtsZS5wcmVmcyA9ICc7XG5cdFx0dGV4dCArPSBKU09OLnN0cmluZ2lmeShuZXdDb25maWcsIG51bGwsIDIpO1xuXHRcdHRleHQgKz0gYDtcXG5cXG4ke3dpbmRvdy53Z1VMUygnLy8gdHdpbmtsZW9wdGlvbnMuanPliLDmraTkuLrmraJcXG4nLCAnLy8gdHdpbmtsZW9wdGlvbnMuanPliLDmraTngrrmraJcXG4nKX0vLyA8LyR7bm93aWtpfT5gO1xuXHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShcblx0XHRcdHdpbmRvdy53Z1VMUygn5L+d5a2YVHdpbmtsZeWPguaVsOiuvue9ru+8muadpeiHqltbJywgJ+WEsuWtmFR3aW5rbGXlgY/lpb3oqK3lrprvvJrkvoboh6pbWycpICtcblx0XHRcdFx0TW9yZWJpdHMucGFnZU5hbWVOb3JtICtcblx0XHRcdFx0d2luZG93LndnVUxTKCddXeeahOiHquWKqOe8lui+kScsICddXeeahOiHquWLlee3qOi8rycpXG5cdFx0KTtcblx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRwYWdlb2JqLnNhdmUoVHdpbmtsZS5jb25maWcuc2F2ZVN1Y2Nlc3MpO1xuXHR9O1xuXHRUd2lua2xlLmNvbmZpZy5zYXZlU3VjY2VzcyA9IChwYWdlb2JqKSA9PiB7XG5cdFx0cGFnZW9iai5nZXRTdGF0dXNFbGVtZW50KCkuaW5mbygn5oiQ5YqfJyk7XG5cdFx0Y29uc3Qgbm90aWNlYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0bm90aWNlYm94LmNsYXNzTmFtZSA9ICdtdy1tZXNzYWdlLWJveCBtdy1tZXNzYWdlLWJveC1zdWNjZXNzJztcblx0XHRub3RpY2Vib3guc3R5bGUuZm9udFNpemUgPSAnMTAwJSc7XG5cdFx0bm90aWNlYm94LnN0eWxlLm1hcmdpblRvcCA9ICcyZW0nO1xuXHRcdG5vdGljZWJveC5pbm5lckhUTUwgPSBgPHA+PGI+JHt3aW5kb3cud2dVTFMoXG5cdFx0XHQn5oKo55qEVHdpbmtsZeWPguaVsOiuvue9ruW3suiiq+S/neWtmOOAgicsXG5cdFx0XHQn5oKo55qEVHdpbmtsZeWBj+WlveioreWumuW3suiiq+WEsuWtmOOAgidcblx0XHQpfTwvYj48L3A+PHA+JHt3aW5kb3cud2dVTFMoJ+imgeeci+WIsOi/meS6m+abtOaUue+8jOaCqOWPr+iDvemcgOimgScsICfopoHnnIvliLDpgJnkupvmm7TmlLnvvIzmgqjlj6/og73pnIDopoEnKX08YSBocmVmPVwiJHttdy51dGlsLmdldFVybChcblx0XHRcdCdRVzpCWVBBU1MnXG5cdFx0KX1cIiB0aXRsZT1cIlFXOkJZUEFTU1wiPjxiPiR7d2luZG93LndnVUxTKCfnu5Xov4fmtY/op4jlmajnvJPlrZgnLCAn57me6YGO54CP6Ka95Zmo5b+r5Y+WJyl9PC9iPjwvYT7jgII8L3A+YDtcblx0XHRNb3JlYml0cy5zdGF0dXMucm9vdC5hcHBlbmRDaGlsZChub3RpY2Vib3gpO1xuXHRcdGNvbnN0IG5vdGljZWNsZWFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKTtcblx0XHRub3RpY2VjbGVhci5zdHlsZS5jbGVhciA9ICdib3RoJztcblx0XHRNb3JlYml0cy5zdGF0dXMucm9vdC5hcHBlbmRDaGlsZChub3RpY2VjbGVhcik7XG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuY29uZmlnLmluaXQpO1xufSkoalF1ZXJ5KTtcblxuZXhwb3J0IHt9O1xuIiwgImltcG9ydCAnLi9Ud2lua2xlLmxlc3MnO1xuXG4oYXN5bmMgZnVuY3Rpb24gdHdpbmtsZUxvYWQoKSB7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGUnKTtcblx0YXdhaXQgaW1wb3J0KCcuL21vZHVsZXMvdHdpbmtsZWFydicpO1xuXHRhd2FpdCBpbXBvcnQoJy4vbW9kdWxlcy90d2lua2xld2FybicpO1xuXHRhd2FpdCBpbXBvcnQoJy4vbW9kdWxlcy90d2lua2xlYmxvY2snKTtcblx0YXdhaXQgaW1wb3J0KCcuL21vZHVsZXMvZnJpZW5kbHl0YWxrYmFjaycpO1xuXHRhd2FpdCBpbXBvcnQoJy4vbW9kdWxlcy90d2lua2xlc3BlZWR5Jyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGVjb3B5dmlvJyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGV4ZmQnKTtcblx0YXdhaXQgaW1wb3J0KCcuL21vZHVsZXMvdHdpbmtsZWltYWdlJyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGVwcm90ZWN0Jyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL2ZyaWVuZGx5dGFnJyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGVzdHViJyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGVkaWZmJyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGV1bmxpbmsnKTtcblx0YXdhaXQgaW1wb3J0KCcuL21vZHVsZXMvdHdpbmtsZWZsdWZmJyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGViYXRjaGRlbGV0ZScpO1xuXHRhd2FpdCBpbXBvcnQoJy4vbW9kdWxlcy90d2lua2xlYmF0Y2h1bmRlbGV0ZScpO1xuXHRhd2FpdCBpbXBvcnQoJy4vbW9kdWxlcy90d2lua2xlYmF0Y2hwcm90ZWN0Jyk7XG5cdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL3R3aW5rbGVjbG9zZScpO1xuXHRhd2FpdCBpbXBvcnQoJy4vbW9kdWxlcy90d2lua2xlY29uZmlnJyk7XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxDQUFBO0FBQUEsSUFBQUMsZUFBQUMsTUFBQTtFQUFBLG1DQUFBO0FBQUE7SUFFQTtBQUNBLEtBQUMsU0FBU0MsUUFBUUMsR0FBQUMsU0FBRztBQUNwQixZQUFNQyxRQUFRRixFQUFFLE1BQU07QUFDdEIsWUFBTUcsV0FBVSxDQUFDO0FBQ2pCLE9BQUFGLFVBQUFHLFFBQU9DLFlBQVBKLFFBQU9JLFVBQVlGO0FBR25CLFVBQUksQ0FBQ0csU0FBU0MsY0FBYyxlQUFlLEtBQUssQ0FBQ0QsU0FBU0MsY0FBYyxXQUFXLEdBQUc7QUFDckZDLGdCQUFRQyxLQUFLLHFDQUFxQztBQUNsRDtNQUNEO0FBTUFOLGVBQVFPLGFBQWE7QUFFckJQLGVBQVFRLFlBQVk7QUFFcEJSLGVBQVFTLGVBQ1A7QUFDRFQsZUFBUVUsZ0JBQWdCLENBQUE7QUFReEJWLGVBQVFXLGtCQUFrQixDQUFDQyxNQUFNQyxTQUFTO0FBQ3pDYixpQkFBUVUsY0FBY1YsU0FBUVUsY0FBY0ksTUFBTSxJQUFJO1VBQ3JERjtVQUNBQztRQUNEO01BQ0Q7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QyxRQUFBLEVBQUFuMkMsS0FBQSxPQUFBMnNDLG1CQUFBLEdBQUFELHNCQUFBO0VBQ1AsQ0FBQTtBQUFBLFdBckJnQjBKLGNBQUE7QUFBQSxXQUFBQyxhQUFBQyxNQUFBLE1BQUFDLFNBQUE7RUFBQTtBQUFBLFNBQUFIO0FBQUEsR0FBQSxFQXFCYjsiLAogICJuYW1lcyI6IFsidHdpbmtsZV9leHBvcnRzIiwgImluaXRfdHdpbmtsZSIsICJfX2VzbSIsICJ0d2lua2xlIiwgIiQiLCAiX3dpbmRvdyIsICIkYm9keSIsICJUd2lua2xlMiIsICJ3aW5kb3ciLCAiVHdpbmtsZSIsICJNb3JlYml0cyIsICJ1c2VySXNJbkdyb3VwIiwgImNvbnNvbGUiLCAid2FybiIsICJjaGFuZ2VUYWdzIiwgInN1bW1hcnlBZCIsICJoYXRub3RlUmVnZXgiLCAiaW5pdENhbGxiYWNrcyIsICJhZGRJbml0Q2FsbGJhY2siLCAiZnVuYyIsICJuYW1lIiwgImxlbmd0aCIsICJkZWZhdWx0Q29uZmlnIiwgInVzZXJUYWxrUGFnZU1vZGUiLCAiZGlhbG9nTGFyZ2VGb250IiwgImRpc2FibGVkTW9kdWxlcyIsICJ1c2VySXNTeXNvcCIsICJkaXNhYmxlZFN5c29wTW9kdWxlcyIsICJzcGlXYXRjaFJlcG9ydCIsICJkZWZhdWx0VG9CbG9jazY0IiwgImRlZmF1bHRUb1BhcnRpYWxCbG9ja3MiLCAiYmxhbmtUYWxrcGFnZU9uSW5kZWZCbG9jayIsICJ3YXRjaEJsb2NrTm90aWNlcyIsICJjdXN0b21CbG9ja1JlYXNvbkxpc3QiLCAib3BlblRhbGtQYWdlIiwgIm9wZW5UYWxrUGFnZU9uQXV0b1JldmVydCIsICJyb2xsYmFja0luUGxhY2UiLCAibWFya1JldmVydGVkUGFnZXNBc01pbm9yIiwgIndhdGNoUmV2ZXJ0ZWRQYWdlcyIsICJ3YXRjaFJldmVydGVkRXhwaXJ5IiwgIm9mZmVyUmVhc29uT25Ob3JtYWxSZXZlcnQiLCAiY29uZmlybU9uRmx1ZmYiLCAic2hvd1JvbGxiYWNrTGlua3MiLCAiY3VzdG9tUmV2ZXJ0U3VtbWFyeSIsICJub3RpZnlVc2VyT25EZWxpIiwgImRlbGlXYXRjaFBhZ2UiLCAiZGVsaVdhdGNoVXNlciIsICJ3YXRjaFJlcXVlc3RlZFBhZ2VzIiwgIndhdGNoUFBUYWdnZWRQYWdlcyIsICJ3YXRjaFByb3RlY3RlZFBhZ2VzIiwgInNwZWVkeVNlbGVjdGlvblN0eWxlIiwgIndhdGNoU3BlZWR5UGFnZXMiLCAid2F0Y2hTcGVlZHlFeHBpcnkiLCAibWFya1NwZWVkeVBhZ2VzQXNQYXRyb2xsZWQiLCAid2F0Y2hTcGVlZHlVc2VyIiwgIm5vdGlmeVVzZXJPblNwZWVkeURlbGV0aW9uTm9taW5hdGlvbiIsICJ3YXJuVXNlck9uU3BlZWR5RGVsZXRlIiwgInByb21wdEZvclNwZWVkeURlbGV0aW9uU3VtbWFyeSIsICJvcGVuVXNlclRhbGtQYWdlT25TcGVlZHlEZWxldGUiLCAiZGVsZXRlVGFsa1BhZ2VPbkRlbGV0ZSIsICJkZWxldGVSZWRpcmVjdHNPbkRlbGV0ZSIsICJkZWxldGVTeXNvcERlZmF1bHRUb0RlbGV0ZSIsICJzcGVlZHlXaW5kb3dIZWlnaHQiLCAic3BlZWR5V2luZG93V2lkdGgiLCAibG9nU3BlZWR5Tm9taW5hdGlvbnMiLCAic3BlZWR5TG9nUGFnZU5hbWUiLCAibm9Mb2dPblNwZWVkeU5vbWluYXRpb24iLCAiZW5sYXJnZUc3SW5wdXQiLCAidW5saW5rTmFtZXNwYWNlcyIsICJkZWZhdWx0V2FybmluZ0dyb3VwIiwgImNvbWJpbmVkU2luZ2xldE1lbnVzIiwgIndhdGNoV2FybmluZ3MiLCAib2xkU2VsZWN0IiwgImN1c3RvbVdhcm5pbmdMaXN0IiwgImF1dG9NZW51QWZ0ZXJSb2xsYmFjayIsICJsb2dYZmROb21pbmF0aW9ucyIsICJ4ZmRMb2dQYWdlTmFtZSIsICJub0xvZ09uWGZkTm9taW5hdGlvbiIsICJ4ZmRXYXRjaERpc2N1c3Npb24iLCAieGZkV2F0Y2hQYWdlIiwgInhmZFdhdGNoVXNlciIsICJtYXJrWGZkUGFnZXNBc1BhdHJvbGxlZCIsICJGd2RDc2RUb1hmZCIsICJhZmREZWZhdWx0Q2F0ZWdvcnkiLCAiYWZkRmFtZURlZmF1bHRSZWFzb24iLCAiYWZkU3Vic3R1YkRlZmF1bHRSZWFzb24iLCAiWGZkQ2xvc2UiLCAiY29weXZpb1dhdGNoUGFnZSIsICJjb3B5dmlvV2F0Y2hVc2VyIiwgIm1hcmtDb3B5dmlvUGFnZXNBc1BhdHJvbGxlZCIsICJhdXRvbGV2ZWxTdGFsZURheXMiLCAicmV2ZXJ0TWF4UmV2aXNpb25zIiwgImJhdGNoTWF4IiwgImJhdGNoQ2h1bmtzIiwgImNvbmZpZ1BhZ2UiLCAicHJvamVjdE5hbWVzcGFjZU5hbWUiLCAibXciLCAiY29uZmlnIiwgImdldCIsICJzYW5kYm94UGFnZSIsICJkZWxldGlvblN1bW1hcnlBZCIsICJwcm90ZWN0aW9uU3VtbWFyeUFkIiwgImJsb2NrU3VtbWFyeUFkIiwgImdyb3VwQnlEZWZhdWx0IiwgIndhdGNoVGFnZ2VkUGFnZXMiLCAid2F0Y2hNZXJnZURpc2N1c3Npb25zIiwgIm1hcmtUYWdnZWRQYWdlc0FzTWlub3IiLCAibWFya1RhZ2dlZFBhZ2VzQXNQYXRyb2xsZWQiLCAidGFnQXJ0aWNsZVNvcnRPcmRlciIsICJjdXN0b21UYWdMaXN0IiwgImN1c3RvbUZpbGVUYWdMaXN0IiwgImN1c3RvbVJlZGlyZWN0VGFnTGlzdCIsICJ3YXRjaFN0dWJiZWRQYWdlcyIsICJtYXJrU3R1YmJlZFBhZ2VzQXNNaW5vciIsICJtYXJrU3R1YmJlZFBhZ2VzQXNQYXRyb2xsZWQiLCAic3R1YkFydGljbGVTb3J0T3JkZXIiLCAiY3VzdG9tU3R1Ykxpc3QiLCAibWFya1RhbGtiYWNrQXNNaW5vciIsICJpbnNlcnRUYWxrYmFja1NpZ25hdHVyZSIsICJ0YWxrYmFja0hlYWRpbmciLCAid2dVTFMiLCAibWFpbEhlYWRpbmciLCAicG9ydGxldEFyZWEiLCAicG9ydGxldElkIiwgInBvcnRsZXROYW1lIiwgInBvcnRsZXRUeXBlIiwgInBvcnRsZXROZXh0IiwgImZpbmQiLCAiZ2V0UHJlZiIsICJwcmVmcyIsICJUd2lua2xlQ29uZmlnIiwgImFkZFBvcnRsZXQiLCAibmF2aWdhdGlvbiIsICJpZCIsICJ0ZXh0IiwgInR5cGUiLCAibmV4dG5vZGVpZCIsICJyb290IiwgImRvY3VtZW50IiwgInF1ZXJ5U2VsZWN0b3IiLCAidGVzdCIsICJjb25jYXQiLCAiaXRlbSIsICJwYXJlbnROb2RlIiwgIm5leHRub2RlIiwgInNraW4iLCAib3V0ZXJOYXZDbGFzcyIsICJpbm5lckRpdkNsYXNzIiwgIm91dGVyTmF2IiwgImhlYWRpbmciLCAiY3JlYXRlRWxlbWVudCIsICJzZXRBdHRyaWJ1dGUiLCAiY2xhc3NOYW1lIiwgImluc2VydEJlZm9yZSIsICJhcHBlbmRDaGlsZCIsICJ1bCIsICJpbmNsdWRlcyIsICJjaGtib3giLCAic3BhbiIsICJjcmVhdGVUZXh0Tm9kZSIsICJhIiwgImhyZWYiLCAib24iLCAiZSIsICJwcmV2ZW50RGVmYXVsdCIsICJpbm5lckRpdiIsICJhZGRQb3J0bGV0TGluayIsICJ0YXNrIiwgInRvb2x0aXAiLCAibGluayIsICJ1dGlsIiwgImNzcyIsICJldiIsICJjb2xsYXBzaWJsZVRhYnMiLCAiaGFuZGxlUmVzaXplIiwgInNjcmlwdHVybCIsICJnZXRVcmwiLCAiYWN0aW9uIiwgImN0eXBlIiwgImhhcHB5IiwgImxvYWRlciIsICJnZXRTY3JpcHQiLCAiZmFpbCIsICJub3RpZnkiLCAidGFnIiwgImFsd2F5cyIsICJsb2FkIiwgImFjdGl2ZVNwZWNpYWxQYWdlTGlzdCIsICJ0b3AiLCAic2VsZiIsICJ1c2VyQWdlbnQiLCAid2lraSIsICJhcGkiLCAic2V0QXBpVXNlckFnZW50IiwgIl9pdGVyYXRvciIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcCIsICJzIiwgIm4iLCAiZG9uZSIsICJtb2R1bGUyIiwgInZhbHVlIiwgImVyciIsICJmIiwgImFkZENTUyIsICJpc1ZlY3RvciIsICJzb3J0QnlOYW1lc3BhY2UiLCAiZmlyc3QiLCAic2Vjb25kIiwgIm5zIiwgInRpdGxlIiwgImdlbmVyYXRlQmF0Y2hQYWdlTGlua3MiLCAiY2hlY2tib3giLCAiJGNoZWNrYm94IiwgImh0bWxOb2RlIiwgInZhbCIsICJuZXh0IiwgInByZXBlbmQiLCAialF1ZXJ5IiwgInR3aW5rbGVhcnZfZXhwb3J0cyIsICJpbml0X3R3aW5rbGVhcnYiLCAidHdpbmtsZWFydiIsICJhcnYiLCAidXNlcm5hbWUiLCAiaXNJUCIsICJpc0lQQWRkcmVzcyIsICJjYWxsYmFjayIsICJ1aWQiLCAiV2luZG93IiwgInNpbXBsZVdpbmRvdyIsICJzZXRUaXRsZSIsICJzZXRTY3JpcHROYW1lIiwgImFkZEZvb3RlckxpbmsiLCAiZm9ybSIsICJxdWlja0Zvcm0iLCAiZXZhbHVhdGUiLCAiY2F0ZWdvcmllcyIsICJhcHBlbmQiLCAibGFiZWwiLCAiZXZlbnQiLCAiY2hhbmdlQ2F0ZWdvcnkiLCAiZGlzYWJsZWQiLCAic3R5bGUiLCAicmVzdWx0IiwgInJlbmRlciIsICJzZXRDb250ZW50IiwgImRpc3BsYXkiLCAicXVlcnkiLCAibGlzdCIsICJia3Byb3AiLCAiZm9ybWF0IiwgImJraXAiLCAiYmt1c2VycyIsICJhcGlvYmoiLCAiYmxvY2tsaXN0IiwgImdldFJlc3BvbnNlIiwgImJsb2NrcyIsICJibG9jayIsICJtZXNzYWdlIiwgInBhcnRpYWwiLCAicmFuZ2VzdGFydCIsICJyYW5nZWVuZCIsICJwb3N0IiwgImV2dCIsICJjcmVhdGVFdmVudCIsICJpbml0RXZlbnQiLCAiY2F0ZWdvcnkiLCAiZGlzcGF0Y2hFdmVudCIsICJsdGFfbGlzdCIsICJzb2NrbWFzdGVyX2NoYW5nZWQiLCAic2V0X3NvY2ttYXN0ZXIiLCAidGFyZ2V0IiwgInNvY2ttYXN0ZXIiLCAidmFsdWVfIiwgInJvb3RfIiwgIm9sZF9hcmVhIiwgImdldEVsZW1lbnRzIiwgIndvcmtfYXJlYSIsICJwcmV2aWV3bGluayIsICJjdXJzb3IiLCAidGV4dENvbnRlbnQiLCAicHJldmlldyIsICJlbGVtZW50IiwgInN1YmxhYmVsIiwgIm1pbiIsICJtYXgiLCAicmVwbGFjZUNoaWxkIiwgImFkZENsYXNzIiwgInNwaW5vdGljZXByZXZpZXdlciIsICJsYXN0IiwgImdldFBhcmFtVmFsdWUiLCAiYmFkaWQiLCAiZ29vZGlkIiwgInByZXZpZXdlciIsICJyZWFzb24iLCAiZ2V0UmVwb3J0V2lraXRleHQiLCAiaW5wdXQiLCAiZ2V0SW5wdXREYXRhIiwgImJlZ2luUmVuZGVyIiwgImNvbW1lbnQiLCAiY2hlY2tUaXRsZSIsICJyZXZpZCIsICJwYWdlXyIsICJUaXRsZSIsICJuYW1lc3BhY2UiLCAicGFnZSIsICJwYWdlcyIsICJtYXAiLCAibyIsICJfaXRlcmF0b3IyIiwgIl9zdGVwMiIsICJnZXRQcmVmaXhlZFRleHQiLCAicmVwbGFjZSIsICJ0cmltIiwgInN0cmluZyIsICJhcHBlbmRQdW5jdHVhdGlvbiIsICJ0eXBlcyIsICJhcnZ0eXBlIiwgInRvTG93ZXJDYXNlRmlyc3RDaGFyIiwgImhhc1NoYXJlZCIsICJzcGxpY2UiLCAiaW5kZXhPZiIsICJjb25maXJtIiwgImpvaW4iLCAic2xpY2UiLCAiaGlkZW5hbWUiLCAidG9VcHBlckNhc2VGaXJzdENoYXIiLCAic29ja3B1cHBldHMiLCAiYXJyYXkiLCAidW5pcSIsICJzb2NrIiwgImluZGV4IiwgImNoZWNrdXNlciIsICJ2IiwgIl9pbnB1dCRnb29kaWQiLCAic3VtbWFyeSIsICJzZXRCdXR0b25zRW5hYmxlZCIsICJzdGF0dXMiLCAiaW5pdCIsICJhY3Rpb25Db21wbGV0ZWQiLCAicmVkaXJlY3QiLCAibm90aWNlIiwgImV3aXBQYWdlIiwgInNldEZvbGxvd1JlZGlyZWN0IiwgImdldFBhZ2VUZXh0IiwgIiRld2lwTGluayIsICJSZWdFeHAiLCAiZXNjYXBlUmVnRXhwIiwgImdldFN0YXR1c0VsZW1lbnQiLCAiZXJyb3IiLCAicHJpbnRVc2VyVGV4dCIsICJzZXRQYWdlU2VjdGlvbiIsICJzZXRFZGl0U3VtbWFyeSIsICJzZXRDaGFuZ2VUYWdzIiwgInNldEFwcGVuZFRleHQiLCAidWFhUGFnZSIsICIkdWFhTGluayIsICJyZXBvcnRwYWdlIiwgInNwaVBhZ2UiLCAic2V0V2F0Y2hsaXN0IiwgImFpdlBhZ2UiLCAiJGFpdkxpbmsiLCAidHdpbmtsZXdhcm5fZXhwb3J0cyIsICJpbml0X3R3aW5rbGV3YXJuIiwgInR3aW5rbGV3YXJuIiwgInJlbGV2YW50VXNlck5hbWUiLCAiJHZhbmRhbFRhbGtMaW5rIiwgIm1ha2VWYW5kYWxUYWxrTGluayIsICJwYWdlTmFtZU5vcm0iLCAiYWZUYWxrTGluayIsICJwYWdlX3ByZWZpeGVkdGl0bGUiLCAicGFnZW5hbWUiLCAid3JhcElubmVyIiwgImF0dHIiLCAiZXh0cmFQYXJhbSIsICJyYXd1cmxlbmNvZGUiLCAiZGlhbG9nIiwgIm1haW5fc2VsZWN0IiwgIm1haW5fZ3JvdXAiLCAiY2hhbmdlX2NhdGVnb3J5IiwgImRlZmF1bHRHcm91cCIsICJOdW1iZXIiLCAicGFyc2VJbnQiLCAic2VsZWN0ZWQiLCAiY2hhbmdlX3N1YmNhdGVnb3J5IiwgInNpemUiLCAicGxhY2Vob2xkZXIiLCAibW9yZSIsICJjYWxsYmFja3MiLCAidmFucmV2aWQiLCAidGl0bGVzIiwgInByb3AiLCAicnZzdGFydGlkIiwgInJ2bGltaXQiLCAicnZkaXIiLCAicnZwcm9wIiwgInJldmVydFVzZXIiLCAiZ2V0QXR0cmlidXRlIiwgImNoZWNrU3RhbGUiLCAidmFudGltZXN0YW1wXyIsICJyZXZEYXRlIiwgImRhdGUiLCAiaXNWYWxpZCIsICJhZGQiLCAiaXNCZWZvcmUiLCAiRGF0ZSIsICJ2YW50aW1lc3RhbXAiLCAicmV2aWRzIiwgIm1lc3NhZ2VzIiwgImxldmVscyIsICJsZXZlbDEiLCAibGV2ZWwyIiwgInNpbmdsZW5vdGljZSIsICJzaW5nbGV3YXJuIiwgInN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeSIsICJwcmV2X2FydGljbGUiLCAicHJldl9yZWFzb24iLCAidGFsa3BhZ2VPYmoiLCAic3ViX2dyb3VwIiwgIm9sZF9zdWJ2YWx1ZSIsICJvbGRfc3VidmFsdWVfcmUiLCAiaGFzQ2hpbGROb2RlcyIsICJyZW1vdmVDaGlsZCIsICJmaXJzdENoaWxkIiwgImNyZWF0ZUVudHJpZXMiLCAiY29udGVudHMiLCAiY29udGFpbmVyIiwgIndyYXBJbk9wdGdyb3VwIiwgImxldmVsIiwgImNsaWVudCIsICJwcm9maWxlIiwgInBsYXRmb3JtIiwgIndyYXBwZXJPcHRncm91cCIsICJfaTIiLCAiX09iamVjdCRlbnRyaWVzIiwgIk9iamVjdCIsICJlbnRyaWVzIiwgIml0ZW1LZXkiLCAiaXRlbVByb3BlcnRpZXMiLCAia2V5IiwgInRlbXBsYXRlIiwgImVsZW0iLCAiZGF0YSIsICJlbGVtUmVuZGVyZWQiLCAidW5Tb3J0ZWRTaW5nbGV0cyIsICJzb3J0ZWRTaW5nbGV0TWVzc2FnZXMiLCAiX2l0ZXJhdG9yMyIsICJrZXlzIiwgInNvcnQiLCAiX3N0ZXAzIiwgIl9pMyIsICJfYXJyIiwgImx2bCIsICJfaXRlcmF0b3I0IiwgIl9zdGVwNCIsICJsZXZlbEdyb3VwIiwgIl9pdGVyYXRvcjUiLCAiX3N0ZXA1IiwgIm9wdGdyb3VwIiwgImF1dG9sZXZlbFByb2MiLCAid2lraXRleHQiLCAibGF0ZXN0IiwgImRhdGVQcm9jZXNzaW5nIiwgInBhcmFtcyIsICJhcnRpY2xlIiwgImF1dG9sZXZlbFBhcnNlV2lraXRleHQiLCAiX2l0ZXJhdG9yNiIsICJfc3RlcDYiLCAicG9zdENhdGVnb3J5Q2xlYW51cCIsICJ1c2VydGFsa19wYWdlIiwgInBhZ2VvYmoiLCAiJG5vVGFsa1BhZ2VOb2RlIiwgImNsb3NlUHJldmlldyIsICJyZW1vdmUiLCAic2V0RWxlbWVudFRvb2x0aXBWaXNpYmlsaXR5IiwgInJlc2V0RWxlbWVudExhYmVsIiwgInNlbGVjdDIiLCAid2lkdGgiLCAibWF0Y2hlciIsICJtYXRjaGVycyIsICJvcHRncm91cEZ1bGwiLCAidGVtcGxhdGVSZXN1bHQiLCAiaGlnaGxpZ2h0U2VhcmNoTWF0Y2hlcyIsICJsYW5ndWFnZSIsICJzZWFyY2hpbmciLCAicXVlcnlJbnRlcmNlcHRvciIsICJjaGFuZ2UiLCAiYXV0b1N0YXJ0IiwgInRyaWdnZXIiLCAibm90TGlua2VkQXJ0aWNsZSIsICJub3RBcnRpY2xlIiwgIm92ZXJyaWRlRWxlbWVudExhYmVsIiwgImdldFdhcm5pbmdXaWtpdGV4dCIsICJ0ZW1wbGF0ZU5hbWUiLCAiaXNDdXN0b20iLCAibm9TaWduIiwgInNob3dQcmV2aWV3IiwgInRlbXBsYXRlbmFtZSIsICJsaW5rZWRhcnRpY2xlIiwgInRlbXBsYXRldGV4dCIsICJtZXNzYWdlRGF0YSIsICJoaXN0b3J5X3JlIiwgImhpc3RvcnkiLCAiY3VycmVudCIsICJleGVjIiwgImN1cnJlbnRfZGF0ZSIsICJpc0FmdGVyIiwgInN0YXRlbGVtIiwgIiRhdXRvbGV2ZWxNZXNzYWdlIiwgImlzTmFOIiwgImF1dG9UaW1lb3V0IiwgImdldFRpbWUiLCAiJGxpbmsiLCAiY2xvc2UiLCAic3RhdHVzTm9kZSIsICJpbnNlcnRBZnRlciIsICJtYWluIiwgImdldENhbGxiYWNrUGFyYW1ldGVycyIsICJ3YXJuaW5nSGlzdG9yeSIsICJub3ciLCAiZ2V0TG9hZFRpbWUiLCAidGVtcGxhdGVBbmRMZXZlbCIsICJjdXN0b21Qcm9jZXNzIiwgInNwbGl0IiwgInByZWZpeCIsICJzdWIiLCAid2FybmluZ1RleHQiLCAic2VjdGlvbkV4aXN0cyIsICJzZWN0aW9uTnVtYmVyIiwgInNlY3Rpb25zIiwgIm1hdGNoIiwgImRhdGVIZWFkZXJSZWdleCIsICJtb250aEhlYWRlclJlZ2V4IiwgInJldmVyc2UiLCAic29tZSIsICJzZWMiLCAiaWR4IiwgInNldE5ld1NlY3Rpb25UaXRsZSIsICJpbmZvIiwgIm1vbnRoSGVhZGVyIiwgInNldE5ld1NlY3Rpb25UZXh0IiwgIm5ld1NlY3Rpb24iLCAidXNlclRhbGtQYWdlIiwgImdldEZyYWdtZW50IiwgImFsZXJ0IiwgIiRzZWxlY3RlZEVsIiwgInFpdXdlbl9wYWdlIiwgInNldENhbGxiYWNrUGFyYW1ldGVycyIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJpbml0X2FwaSIsICJyZXF1aXJlIiwgImluaXRNd0FwaSIsICJ0d2lua2xlYmxvY2tfZXhwb3J0cyIsICJpbXBvcnRfZXh0X2dhZGdldDIiLCAiaW5pdF90d2lua2xlYmxvY2siLCAidHdpbmtsZWJsb2NrIiwgImJsb2NrZWRVc2VyTmFtZSIsICJtZW51Rm9ybWF0dGVkTmFtZXNwYWNlcyIsICJibG9ja0FjdGlvblRleHQiLCAicmVibG9jayIsICJ1bmJsb2NrIiwgImlwIiwgImlzUmFuZ2UiLCAidmFsaWRDSURSIiwgImN1cnJlbnRCbG9ja0luZm8iLCAiZmllbGRfYmxvY2tfb3B0aW9ucyIsICJmaWVsZF90ZW1wbGF0ZV9vcHRpb25zIiwgImFjdGlvbmZpZWxkIiwgImNoYW5nZV9hY3Rpb24iLCAiaGlkZGVuIiwgImNoZWNrZWQiLCAic2l4dHlGb3VyIiwgImdldDY0IiwgImJsb2NrNjRmaWVsZCIsICJjaGFuZ2VfYmxvY2s2NCIsICJmZXRjaFVzZXJJbmZvIiwgImlzUmVnaXN0ZXJlZCIsICIkZm9ybSIsICJzZXRFbGVtZW50VmlzaWJpbGl0eSIsICJwYXJlbnQiLCAidHJhbnNmb3JtQmxvY2tQcmVzZXRzIiwgImJsb2NrNjQiLCAiYWN0aW9udHlwZSIsICJmZXRjaGVkRGF0YSIsICJwcm9jZXNzVXNlckluZm8iLCAiZm4iLCAiYmxvY2tpbmZvIiwgInVzZXJpbmZvIiwgInVzZXJzIiwgInVzZXIiLCAidXNlcmlkIiwgInVzZXJJc0JvdCIsICJncm91cG1lbWJlcnNoaXBzIiwgImdyb3VwIiwgImRpc2FibGV0YWxrIiwgImFsbG93dXNlcnRhbGsiLCAiaGFyZGJsb2NrIiwgImFub25vbmx5IiwgImhhc0Jsb2NrTG9nIiwgImxvZ2V2ZW50cyIsICJibG9ja0xvZyIsICJibG9ja0xvZ0lkIiwgImxvZ2lkIiwgImxldHlwZSIsICJsZWxpbWl0IiwgImxldGl0bGUiLCAidXN1c2VycyIsICJ1c3Byb3AiLCAidGhlbiIsICJzYXZlRmllbGRzZXQiLCAiZmllbGRzZXQiLCAiX2l0ZXJhdG9yNyIsICJzZXJpYWxpemVBcnJheSIsICJfc3RlcDciLCAiZWwiLCAiJGJsb2NrNjQiLCAicHJpb3JOYW1lIiwgImlzIiwgIm9yaWdpbmFsSXNSYW5nZSIsICJyZWdlbmVyYXRlRm9ybSIsICJ0aXRsZUJhciIsICJuZXh0U2libGluZyIsICJub2RlVmFsdWUiLCAiZmllbGRfcHJlc2V0IiwgImZpZWxkX3RhZ19vcHRpb25zIiwgImZpZWxkX3VuYmxvY2tfb3B0aW9ucyIsICIkYmxvY2siLCAiYmxvY2tCb3giLCAiJHRlbXBsYXRlIiwgInRlbXBsYXRlQm94IiwgIiR0YWciLCAidGFnQm94IiwgIiRwcm90ZWN0IiwgIiRwYXJ0aWFsIiwgInBhcnRpYWxCb3giLCAiJHVuYmxvY2siLCAidW5ibG9ja0JveCIsICJibG9ja0dyb3VwIiwgImJsb2NrR3JvdXBzUGFydGlhbCIsICJibG9ja0dyb3VwcyIsICJwcmlvciIsICJibG9ja1ByZXNldHNJbmZvIiwgImJnIiwgImlzSW5maW5pdHkiLCAiZXhwaXJ5IiwgImZpbHRlciIsICJjaGFuZ2VfcHJlc2V0IiwgImZpbHRlcmVkX2Jsb2NrX2dyb3VwcyIsICJjaGFuZ2VfZXhwaXJ5IiwgInRlbXBsYXRlX2V4cGlyeSIsICJtdWx0aXBsZSIsICJfaTQiLCAiX09iamVjdCRlbnRyaWVzMiIsICJudW1iZXIiLCAiYmxvY2tvcHRpb25zIiwgIm5vY3JlYXRlIiwgIm5vZW1haWwiLCAiYXV0b2Jsb2NrIiwgIndhdGNodXNlciIsICJ0b2dnbGVfc2VlX2Fsc29zIiwgImNoYW5nZV90ZW1wbGF0ZSIsICJibG9ja19yZWFzb24iLCAiYmxhbmtfZHVyYXRpb24iLCAibm90YWxrIiwgIm5vZW1haWxfdGVtcGxhdGUiLCAibm9jcmVhdGVfdGVtcGxhdGUiLCAiJHByZXZpZXdsaW5rIiwgIm9mZiIsICJzdWJncm91cCIsICJvbGRmaWVsZCIsICJoaWRlIiwgInNob3ciLCAiZXJyb3JMb2FkaW5nIiwgIm1heGltdW1TZWxlY3Rpb25MZW5ndGgiLCAibWluaW11bUlucHV0TGVuZ3RoIiwgImFqYXgiLCAidXJsIiwgIndpa2lTY3JpcHQiLCAiZGF0YVR5cGUiLCAiZGVsYXkiLCAibmV3RnJvbVRleHQiLCAidGVybSIsICJhcGZyb20iLCAiYXBuYW1lc3BhY2UiLCAiYXBsaW1pdCIsICJwcm9jZXNzUmVzdWx0cyIsICJyZXN1bHRzIiwgImFsbHBhZ2VzIiwgInRvVGV4dCIsICJ0ZW1wbGF0ZVNlbGVjdGlvbiIsICJjaG9pY2UiLCAicmVsIiwgIndvcmRCZWdpbm5pbmciLCAic2FtZVVzZXIiLCAic3RhdHVzU3RyIiwgIiRyYW5nZWJsb2NrbG9nbGluayIsICJodG1sIiwgImNhbGVuZGFyIiwgImluZm9TdHIiLCAidXBkYXRlX2Zvcm0iLCAiYmxvY2tsb2dpbmZvIiwgIiRibG9ja2xvZ2xpbmsiLCAibGFzdEJsb2NrQWN0aW9uIiwgImJsb2NrQWN0aW9uIiwgInRpbWVzdGFtcCIsICJmb3JtYXRUaW1lIiwgImR1cmF0aW9uIiwgImZvclJlZ2lzdGVyZWRPbmx5IiwgInBhZ2VQYXJhbSIsICJyZWFzb25QYXJhbSIsICJub25zdGFuZGFyZCIsICJmb3JBbm9uT25seSIsICJzaWciLCAiY2hlY2t1c2VyYmxvY2siLCAiYmlvYmxvY2siLCAidWNibG9jayIsICJucGJsb2NrIiwgIl9pdGVyYXRvcjgiLCAiX3N0ZXA4IiwgIm5ld0tleSIsICJjdXN0b20iLCAiX2k1IiwgIl9PYmplY3QkZW50cmllczMiLCAicHJlc2V0IiwgInNldHRpbmdzIiwgImluZGVmaW5pdGUiLCAibWV0YSIsICJzaG93X3RlbXBsYXRlIiwgInRlbXBsYXRlcyIsICJibG9ja1ByZXNldCIsICJibG9ja1NldHRpbmdzIiwgInJlZ2lzdHJhdGlvblJlc3RyaWN0IiwgInNlZUFsc29zIiwgInNlZUFsc29NZXNzYWdlIiwgInVzZUluaXRpYWxPcHRpb25zIiwgInBhcnNlIiwgInRvR01UU3RyaW5nIiwgImV4cGlyeV9wcmVzZXQiLCAiZWFjaCIsICJfaSIsICJjaGVjayIsICJwcmVwZW5kUmVhc29uIiwgInBhZ2VyZXN0cmljdGlvbnMiLCAiJHBhZ2VTZWxlY3QiLCAiJG5hbWVzcGFjZVNlbGVjdCIsICJyZXN0cmljdGlvbnMiLCAicHIiLCAiX2l0ZXJhdG9yOSIsICJfc3RlcDkiLCAiZXNjYXBlU2VsZWN0b3IiLCAibmV3T3B0aW9uIiwgIk9wdGlvbiIsICJnZW5lcmF0ZUFycmF5IiwgIm5hbWVzcGFjZXMiLCAicHJldl90ZW1wbGF0ZV9leHBpcnkiLCAiYXJlYSIsICJuYW1lc3BhY2VyZXN0cmljdGlvbnMiLCAidGVtcGxhdGVUZXh0IiwgImdldEJsb2NrTm90aWNlV2lraXRleHQiLCAiX3RlbXBsYXRlb3B0aW9ucyIsICJ0b0Jsb2NrIiwgInRvV2FybiIsICJ0b1BhcnRpYWwiLCAidG9UYWciLCAidG9Qcm90ZWN0IiwgInRvVW5ibG9jayIsICJ0ZW1wbGF0ZW9wdGlvbnMiLCAidW5ibG9ja29wdGlvbnMiLCAidG9DbG9zZXZpcCIsICJjbG9zZXZpcCIsICJjaGVja0luY29tcGF0aWJsZSIsICJjb25mbGljdHMiLCAiZXh0cmEiLCAiY291bnQiLCAicmVkdWNlIiwgInN1bSIsICJzcHBVc2VybmFtZSIsICJzdGF0dXNFbGVtZW50IiwgImxvZ0V4cGlyeSIsICJleHBpcnlEYXRlIiwgImdyb3Vwc0NhbkJlUmVtb3ZlZCIsICJncm91cHNUb0JlUmVtb3ZlZCIsICJncm91cHMiLCAidGFncyIsICJ0b2tlbiIsICJ0b2tlbnMiLCAibWJBcGkiLCAiaXNzdWVfdGVtcGxhdGUiLCAidmlwUGFnZSIsICJjbG9zZVJlcXVlc3QiLCAicmlnaHRTdGF0dXNFbGVtZW50IiwgInJldm9rZU9wdGlvbnMiLCAidXNlcnJpZ2h0c3Rva2VuIiwgIm1yQXBpIiwgInVzZXJQYWdlIiwgInRhZ3VzZXJwYWdlIiwgInVuYmxvY2tTdGF0dXNFbGVtZW50IiwgInVuYmxvY2tNYkFwaSIsICJfaXRlcmF0b3IxMCIsICJfc3RlcDEwIiwgInRhZ3RleHQiLCAic3BwVHlwZSIsICJzcHBFdmlkZW5jZSIsICJzcG1DaGVja2VkIiwgInNwbUV2aWRlbmNlIiwgInNldFBhZ2VUZXh0IiwgInNhdmUiLCAicHJvdGVjdHVzZXJwYWdlIiwgImV4aXN0cyIsICJzZXRFZGl0UHJvdGVjdGlvbiIsICJzZXRNb3ZlUHJvdGVjdGlvbiIsICJzZXRDcmVhdGVQcm90ZWN0aW9uIiwgInByb3RlY3QiLCAiZm9ybURhdGEiLCAidXNlcnRhbGtfc3VtbWFyeSIsICJ1c2VyTmFtZSIsICJleHBpcnlUZXh0IiwgInJlcXVlc3RMaXN0IiwgImZvdW5kIiwgInZpcFJlIiwgInBhZ2VOYW1lUmVnZXgiLCAiX2l0ZXJhdG9yMTEiLCAiX3N0ZXAxMSIsICJyZXF1ZXN0IiwgInRyaW1FbmQiLCAibmV3VGV4dCIsICJtYWtlU2VudGVuY2UiLCAicG9wIiwgInAiLCAibmFtZXNwYWNlTmFtZXMiLCAiZGF0ZUhlYWRlclJlZ2V4TGFzdCIsICJkYXRlSGVhZGVyUmVnZXhSZXN1bHQiLCAibGFzdEhlYWRlckluZGV4IiwgImxhc3RJbmRleE9mIiwgImZyaWVuZGx5dGFsa2JhY2tfZXhwb3J0cyIsICJpbml0X2ZyaWVuZGx5dGFsa2JhY2siLCAiZnJpZW5kbHl0YWxrYmFjayIsICJ0YWxrYmFjayIsICJjaGFuZ2VUYXJnZXQiLCAidGJ0YXJnZXQiLCAiZWxxdWVyeSIsICJlbGxpbWl0IiwgInFpdXdlbl9hcGkiLCAib3B0b3V0U3RhdHVzIiwgIm9wdG91dCIsICIkZWwiLCAiZ2V0WE1MIiwgInByZXZfcGFnZSIsICJwcmV2X3NlY3Rpb24iLCAicHJldl9tZXNzYWdlIiwgInZhbHVlcyIsICJzZWN0aW9uIiwgInJlcXVpcmVkIiwgIm5vdGljZWJvYXJkIiwgIl9pNiIsICJfT2JqZWN0JGVudHJpZXM0IiwgIm5vdGljZWJvYXJkcyIsICJuYm5hbWUiLCAiZGVmYXVsdFNlbGVjdGVkIiwgImFmZnAiLCAiY29udGVudCIsICJlZGl0U3VtbWFyeSIsICJzYmwiLCAic2hsIiwgImdldENoZWNrZWQiLCAibmFtZXNwYWNlUmVnZXgiLCAiZnVsbFVzZXJUYWxrUGFnZU5hbWUiLCAidXNlcl90YWxrIiwgImdldE5vdGljZVdpa2l0ZXh0IiwgInRhbGtwYWdlIiwgInNldENyZWF0ZU9wdGlvbiIsICJzZXRNaW5vckVkaXQiLCAibm90aWNldGV4dCIsICJzYWZlUmVwbGFjZSIsICJ0d2lua2xlc3BlZWR5X2V4cG9ydHMiLCAiaW1wb3J0X2V4dF9nYWRnZXQzIiwgImluaXRfdHdpbmtsZXNwZWVkeSIsICJ0d2lua2xlc3BlZWR5IiwgInNwZWVkeSIsICJpbml0RGlhbG9nIiwgImV2YWx1YXRlU3lzb3AiLCAiZXZhbHVhdGVVc2VyIiwgImhhc0NTRCIsICJtb2RlIiwgInN5c29wU2luZ2xlU3VibWl0IiwgInN5c29wUmFkaW9DbGljayIsICJzeXNvcE11bHRpcGxlU3VibWl0IiwgInN5c29wTXVsdGlwbGVSYWRpb0NsaWNrIiwgInVzZXJNdWx0aXBsZVN1Ym1pdCIsICJ1c2VyTXVsdGlwbGVSYWRpb0NsaWNrIiwgInVzZXJTaW5nbGVTdWJtaXQiLCAidXNlclNpbmdsZVJhZGlvQ2xpY2siLCAiaXNTeXNvcCIsICJoYXNTdWJtaXRCdXR0b24iLCAiaXNNdWx0aXBsZSIsICJjYWxsYmFja2Z1bmMiLCAiY0Zvcm0iLCAiY0NoZWNrZWQiLCAicmVkaXJlY3RzIiwgImRlbG11bHRpcGxlIiwgIm9wZW51c2VydGFsayIsICJzYWx0aW5nIiwgIm1vZGVDaGFuZ2VkIiwgInN0b3BQcm9wYWdhdGlvbiIsICJkZWxldGVPcHRpb25zIiwgInRhZ09wdGlvbnMiLCAicHJpb3JEZWxldGlvbkNvdW50IiwgImdldE1vZGUiLCAidGFnX29ubHkiLCAiaXNTeXNvcE1vZGUiLCAiZXZhbHVhdGVUeXBlIiwgInJhZGlvT3JDaGVja2JveCIsICJnZW5lcmF0ZUNzZExpc3QiLCAiY3VzdG9tUmF0aW9uYWxlIiwgImFydGljbGVMaXN0IiwgInVzZXJMaXN0IiwgInVzZXJ0YWxrTGlzdCIsICJmaWxlTGlzdCIsICJjYXRlZ29yeUxpc3QiLCAiZHJhZnRMaXN0IiwgInRhbGtMaXN0IiwgImdlbmVyYWxDcml0ZXJpYSIsICJnZW5lcmFsTGlzdCIsICJyZWRpcmVjdExpc3QiLCAiY3VzdG9tT3B0aW9uIiwgImNsaWNrIiwgImRlY29kZVVSSUNvbXBvbmVudCIsICJsYWJlbHMiLCAiZW1wdHkiLCAibGVhY3Rpb24iLCAibGVwcm9wIiwgInJlc3BvbnNlIiwgImRlbENvdW50IiwgImNvbnRpbnVlIiwgIm9wZW5TdWJncm91cEhhbmRsZXIiLCAiY2hpbGRyZW4iLCAiZm9jdXMiLCAic3VibWl0U3ViZ3JvdXBIYW5kbGVyIiwgIkFycmF5IiwgInByb3RvdHlwZSIsICJjYWxsIiwgImNyaXRFbGVtZW50IiwgImNyaXRlcmlvbiIsICJoaWRlV2hlbk11bHRpcGxlIiwgImhpZGVTdWJncm91cFdoZW5NdWx0aXBsZSIsICJoaWRlV2hlblNpbmdsZSIsICJoaWRlU3ViZ3JvdXBXaGVuU2luZ2xlIiwgImhpZGVXaGVuU3lzb3AiLCAiaGlkZVN1Ymdyb3VwV2hlblN5c29wIiwgImhpZGVXaGVuVXNlciIsICJoaWRlU3ViZ3JvdXBXaGVuVXNlciIsICJoaWRlV2hlblJlZGlyZWN0IiwgInNob3dJbk5hbWVzcGFjZXMiLCAiaGlkZUluTmFtZXNwYWNlcyIsICJvcmlnaW5hbEV2ZW50IiwgIm5vcm1hbGl6ZWRDcml0ZXJpb24iLCAibm9ybWFsaXplSGFzaCIsICJnMSIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsICJnNiIsICJnNyIsICJnOCIsICJnOSIsICJhMSIsICJhMiIsICJhMyIsICJyMSIsICJyMiIsICJmMSIsICJmMiIsICJmMyIsICJmNCIsICJmNSIsICJvMSIsICJvMiIsICJvMyIsICJnZXRUZW1wbGF0ZUNvZGVBbmRQYXJhbXMiLCAiY29kZSIsICJwYXJhbWV0ZXJzIiwgImkiLCAibm9ybWFsaXplZHMiLCAidXRwYXJhbXMiLCAiX2l0ZXJhdG9yMTIiLCAiX3N0ZXAxMiIsICJub3JtIiwgInRvVXBwZXJDYXNlIiwgInRlbXBsYXRlUGFyYW1zIiwgImlfIiwgImdldFVzZXJUYWxrUGFyYW1ldGVycyIsICJwYXJzZVdpa2l0ZXh0IiwgInBzdCIsICJjb250ZW50bW9kZWwiLCAic3RhdHVzSW5kaWNhdG9yIiwgImFwaTIiLCAiYXBpT2JqIiwgImNoaWxkTm9kZXMiLCAic3lzb3AiLCAicHJvbXB0IiwgImRlbGV0ZVBhZ2UiLCAiZGVsZXRlUmVhc29uIiwgInByb21wdEZvclN1bW1hcnkiLCAidGhpc3BhZ2UiLCAiZGVsZXRlTWFpbiIsICJ3YXRjaCIsICJkZWxldGVUYWxrIiwgIm9wZW5Vc2VyVGFsayIsICJsb29rdXBDcmVhdGlvbiIsICJvcGVuVXNlclRhbGtQYWdlIiwgImRlbGV0ZVRhbGtQYWdlIiwgIm5vcm1hbGl6ZWQiLCAiY2xhc3NMaXN0IiwgImNvbnRhaW5zIiwgInNldFRpbWVvdXQiLCAiZGVsZXRlUmVkaXJlY3RzIiwgInJkbGltaXQiLCAiZGVsZXRlUmVkaXJlY3RzTWFpbiIsICIkYmlndGV4dCIsICJzZXQiLCAidW5saW5rIiwgImdldENyZWF0b3IiLCAidmFuYXJ0aWNsZSIsICJvcGVuIiwgInhtbERvYyIsICIkc25hcHNob3QiLCAidG90YWwiLCAib25zdWNjZXNzIiwgImFwaW9iaklubmVyIiwgInVwZGF0ZSIsICJyZW1vdmVDaGVja3BvaW50IiwgImFkZENoZWNrcG9pbnQiLCAiX2tleSIsICJ0ZXh0Tm9TZCIsICJjb3B5dmlvIiwgInhmZCIsICJidWlsZERhdGEiLCAicGF0cm9sIiwgInJlcXVlc3RzYWx0IiwgImVkaXRzdW1tYXJ5IiwgIl9pdGVyYXRvcjEzIiwgIl9zdGVwMTMiLCAiTWF0aCIsICJibGFuayIsICJpbnNlcnRBZnRlclRlbXBsYXRlcyIsICJnZXRUZXh0IiwgInRhZ0NvbXBsZXRlIiwgInVzZXJ0YWxrIiwgInBhZ2VPYmoiLCAiaW5pdGlhbENvbnRyaWIiLCAidGFsa1BhZ2VOYW1lIiwgInVzZXJ0YWxrcGFnZSIsICJub3RpZnl0ZXh0IiwgImxvZ25vbWluYXRpb24iLCAiYWRkVG9Mb2ciLCAidXNsIiwgInVzZXJzcGFjZUxvZ2dlciIsICJpbml0aWFsVGV4dCIsICJhcHBlbmRUZXh0IiwgImZyb21ESSIsICJfaXRlcmF0b3IxNCIsICJfc3RlcDE0IiwgImxvZyIsICJnZXRQYXJhbWV0ZXJzIiwgIl9pdGVyYXRvcjE1IiwgIl9zdGVwMTUiLCAiY3VycmVudFBhcmFtcyIsICJyZWRpbWFnZSIsICJkYnJhdGlvbmFsZSIsICJvdGhlcnBhZ2UiLCAiZmlsZW5hbWUiLCAicmVkaXJ0eXBlIiwgInJlc29sdmVDc2RWYWx1ZXMiLCAiX2UkdGFyZ2V0JGZvcm0iLCAiX2UkdGFyZ2V0JGZvcm0yIiwgIndhdGNoUGFnZSIsICJfaXRlcmF0b3IxNiIsICJfc3RlcDE2IiwgIl9lJHRhcmdldCRmb3JtMyIsICJfaXRlcmF0b3IxNyIsICJfc3RlcDE3IiwgIl9pNyIsICJfbm9ybWFsaXplZHMiLCAibm90aWZ5dXNlciIsICJfaXRlcmF0b3IxOCIsICJfc3RlcDE4IiwgImNzZGxvZyIsICJfaXRlcmF0b3IxOSIsICJfc3RlcDE5IiwgInR3aW5rbGVjb3B5dmlvX2V4cG9ydHMiLCAiaW5pdF90d2lua2xlY29weXZpbyIsICJ0d2lua2xlY29weXZpbyIsICJpc1BhZ2VSZWRpcmVjdCIsICJ0cnlUYWdnaW5nIiwgInRhZ2dpbmdBcnRpY2xlIiwgImxvZ3BhZ2UiLCAiY29weXZpb0xpc3QiLCAicmV2aXNpb25JZCIsICJzb3VyY2UiLCAib2xkY3NkIiwgInNwZWVkeVRhZyIsICJnNF9wYWdlbmFtZSIsICJvdXRwdXQiLCAiZ2V0VVRDTW9udGgiLCAiZ2V0VVRDRGF0ZSIsICJ0d2lua2xleGZkX2V4cG9ydHMiLCAiaW5pdF90d2lua2xleGZkIiwgInR3aW5rbGV4ZmQiLCAiY3VycmVudFJhdGlvbmFsZSIsICJwcmludFJhdGlvbmFsZSIsICJvbGRyZWFzb250ZXh0Ym94IiwgIm9sZHJlYXNvbiIsICJhcHBlbmRSZWFzb25Cb3giLCAieGZkX2NhdCIsICJhZmRfY2F0ZWdvcnkiLCAiY2hhbmdlX2FmZF9jYXRlZ29yeSIsICJhZmRfY2F0IiwgImxvY2FsU3RvcmFnZSIsICJUd2lua2xlX2FmZENhdGVnb3J5IiwgInhmZGNhdCIsICJtZXJnZWludG8iLCAicGFyZW50RWxlbWVudCIsICJyZW1vdmVBdHRyaWJ1dGUiLCAiZndkY3NkcmVhc29uIiwgInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCAiaW5uZXJIVE1MIiwgInhmZHJlYXNvbiIsICJhZmQiLCAidGFnZ2luZ19wYWdlIiwgImRpc2N1c3Npb25fcGFnZSIsICJ0b2RheXNMaXN0IiwgImNyZWF0b3IiLCAiZm9ybWF0UmVhc29uVGV4dCIsICJub2luY2x1ZGUiLCAidGV4dE5vTm90TWFuZGFyaW4iLCAidGV4dE5vQWZjIiwgInRvIiwgImNvbW1lbnRUZXh0IiwgInNhZmVzdWJzdCIsICJmYW1lIiwgInN1YnN0dWIiLCAiYmF0Y2giLCAidGFyZ2V0X3BhZ2UiLCAiZmZkIiwgInRhZ2dpbmdJbWFnZSIsICJ4ZmRDYXROYW1lIiwgIndpa2lVcmxlbmNvZGUiLCAiZm9ybWF0UmVhc29uRm9yTG9nIiwgIm9uRXJyb3IiLCAic2V0TG9va3VwTm9uUmVkaXJlY3RDcmVhdG9yIiwgInR3aW5rbGVpbWFnZV9leHBvcnRzIiwgImluaXRfdHdpbmtsZWltYWdlIiwgInR3aW5rbGVpbWFnZSIsICJpbWFnZSIsICJmaWVsZCIsICJfaXRlcmF0b3IyMCIsICJfc3RlcDIwIiwgInR5cGVfIiwgImNzZGNyaXQiLCAiRXJyb3IiLCAidG9Mb3dlckNhc2UiLCAiZjFfc291cmNlIiwgImY0X3R5cGUiLCAidXNlck5vdGlmaWNhdGlvbiIsICJub3RlRGF0YSIsICJpbWFnZUxpc3QiLCAidHdpbmtsZXByb3RlY3RfZXhwb3J0cyIsICJpbml0X3R3aW5rbGVwcm90ZWN0IiwgInR3aW5rbGVwcm90ZWN0IiwgImNoYW5nZUFjdGlvbiIsICJmZXRjaFByb3RlY3Rpb25MZXZlbCIsICJpc1RlbXBsYXRlIiwgImN1cnJlbnRQcm90ZWN0aW9uTGV2ZWxzIiwgInByZXZpb3VzUHJvdGVjdGlvbkxldmVscyIsICJpbmRleHBhZ2VpZHMiLCAiaW5wcm9wIiwgInByb3RlY3REYXRhIiwgInBhZ2VpZCIsICJwYWdlaWRzIiwgInByZXZpb3VzIiwgIndhdGNoZWQiLCAid2F0Y2hsaXN0ZXhwaXJ5IiwgIl9pdGVyYXRvcjIxIiwgInByb3RlY3Rpb24iLCAiX3N0ZXAyMSIsICJjYXNjYWRlIiwgInByZXZpb3VzUHJvdGVjdGlvbkxvZyIsICJfaXRlcmF0b3IyMiIsICJkZXRhaWxzIiwgIl9zdGVwMjIiLCAiaGFzUHJvdGVjdExvZyIsICJzaG93TG9nQW5kQ3VycmVudFByb3RlY3RJbmZvIiwgImN1cnJlbnRseVByb3RlY3RlZCIsICJoYXNTdGFibGVMb2ciLCAiJGxpbmtNYXJrdXAiLCAiZm9ybWF0UHJvdGVjdGlvbkRlc2NyaXB0aW9uIiwgInByb3RlY3Rpb25Ob2RlIiwgInN0YXR1c0xldmVsIiwgImZpZWxkMSIsICJmaWVsZDIiLCAiY2hhbmdlUHJlc2V0IiwgInByb3RlY3Rpb25UeXBlc0FkbWluIiwgInByb3RlY3Rpb25UeXBlc0NyZWF0ZSIsICJmb3JtZXZlbnRzIiwgImVkaXRtb2RpZnkiLCAiZWRpdGxldmVsIiwgInByb3RlY3Rpb25MZXZlbHMiLCAiZG9DdXN0b21FeHBpcnkiLCAiY2xvc2VzdCIsICJzZWxlY3RlZEluZGV4IiwgInByb3RlY3Rpb25MZW5ndGhzIiwgIm1vdmVtb2RpZnkiLCAibW92ZWxldmVsIiwgImNyZWF0ZWxldmVsIiwgInByb3RlY3Rpb25UYWdzIiwgInRhZ3R5cGUiLCAicHJvdGVjdGlvblR5cGVzIiwgIm1hcmdpblJpZ2h0IiwgImVkaXRleHBpcnkiLCAiY29sb3IiLCAibW92ZWV4cGlyeSIsICJjcmVhdGVleHBpcnkiLCAic21hbGwiLCAic2hvd2V4cGlyeSIsICJvcHRpb24iLCAicHJvdGVjdGlvblR5cGVzQ3JlYXRlT25seSIsICJwcm90ZWN0aW9uUHJlc2V0c0luZm8iLCAiZWRpdCIsICJtb3ZlIiwgInVucHJvdGVjdCIsICJjcmVhdGUiLCAiYWN0aW9udHlwZXMiLCAiX2l0ZXJhdG9yMjMiLCAiX3N0ZXAyMyIsICJhY3Rpb25fdHlwZV92YWx1ZSIsICJyZWFzb25GaWVsZCIsICJwcm90ZWN0UmVhc29uIiwgIl9pdGVtJHRlbXBsYXRlIiwgInRhZ3BhcmFtcyIsICJjbG9zZXBhcmFtcyIsICJzdGF0dXNJbml0ZWQiLCAiYWxsRG9uZSIsICJ0YWdnaW5nUGFnZUluaXRpYWwiLCAicnBwUGFnZSIsICJwcm90ZWN0SXQiLCAiZm9sbG93UmVkaXJlY3QiLCAidHlwZW5hbWUiLCAidHlwZXJlYXNvbiIsICJycHBwYXJhbXMiLCAicnBwTmFtZSIsICJmaWxlUmVxdWVzdCIsICJwYWdlTmFtZSIsICJwcm90ZWN0ZWRQYWdlIiwgInRhZ2dpbmdQYWdlIiwgImdldFRhZ2dlZFBhZ2UiLCAib2xkdGFnX3JlIiwgInJlX3Jlc3VsdCIsICJuZXdWZXJzaW9uIiwgInN1cHByZXNzUHJvdGVjdFdhcm5pbmciLCAicnBwUmUiLCAicnBwTGluayIsICJnZXRQYWdlTmFtZSIsICJuZXd0YWciLCAid29yZHMiLCAicmVnIiwgIm9yaWdpbmFsVGV4dExlbmd0aCIsICJsaW5rbm9kZSIsICJ3YXRjaFByZWYiLCAib3B0aW9ucyIsICJ3YXRjaF9xdWVyeSIsICJsaW5rbm9kZTIiLCAic2VjdGlvblRleHQiLCAiX2l0ZXJhdG9yMjQiLCAiX3N0ZXAyNCIsICJfaTgiLCAiX09iamVjdCRlbnRyaWVzNSIsICJmcmllbmRseXRhZ19leHBvcnRzIiwgImluaXRfZnJpZW5kbHl0YWciLCAiZnJpZW5kbHl0YWciLCAibW9kZUVuIiwgImNhblJlbW92ZSIsICJjaGVja2VkVGFncyIsICIkYWxsQ2hlY2tib3hEaXZzIiwgImxhYmVsX2VsZW1lbnQiLCAiJGFsbEhlYWRlcnMiLCAic2VhcmNoU3RyaW5nIiwgInNlYXJjaFJlZ2V4IiwgIl9pbmRleCIsICJsYWJlbF90ZXh0IiwgInNlYXJjaEhpdCIsICJyYW5nZSIsICJjcmVhdGVSYW5nZSIsICJ0ZXh0bm9kZSIsICJzZWxlY3ROb2RlQ29udGVudHMiLCAic2V0U3RhcnQiLCAic2V0RW5kIiwgInVuZGVybGluZV9zcGFuIiwgInN1cnJvdW5kQ29udGVudHMiLCAiZmxhdE9iamVjdCIsICJfaXRlcmF0b3IyNSIsICJ0YWdMaXN0IiwgIl9zdGVwMjUiLCAiX2l0ZXJhdG9yMjYiLCAiX3N0ZXAyNiIsICJfaXRlcmF0b3IyNyIsICJfc3RlcDI3IiwgImRlc2NyaXB0aW9uIiwgImV4Y2x1ZGVNSSIsICJ1cGRhdGVTb3J0T3JkZXIiLCAiZGl2RWxlbWVudCIsICJfaXRlcmF0b3IyOCIsICJfc3RlcDI4IiwgImJ1aWxkRmlsZW5hbWUiLCAiX2l0ZXJhdG9yMjkiLCAiX3N0ZXAyOSIsICJfaXRlcmF0b3IzMCIsICJfc3RlcDMwIiwgInF1ZXJ5U2VsZWN0b3JBbGwiLCAicXVpY2tmaWx0ZXIiLCAiYXV0b2NvbXBsZXRlIiwgImFkZEV2ZW50TGlzdGVuZXIiLCAiYWxyZWFkeVByZXNlbnRUYWdzIiwgInRhZ05hbWUiLCAiYm94VGFnIiwgImZvbnRTaXplIiwgIm51bUFkZGVkIiwgIm51bVJlbW92ZWQiLCAiYWZ0ZXIiLCAic29ydG9yZGVyIiwgIl9pdGVyYXRvcjMxIiwgIl9zdGVwMzEiLCAiZ2VuZXJhdGVMaW5rcyIsICJtYWtlQ2hlY2tib3giLCAib3RoZXJUYWdOYW1lIiwgIm1ha2VDaGVja2JveGVzRm9yQWxyZWFkeVByZXNlbnRUYWdzIiwgInN1YmRpdiIsICJjaGVja2JveGVzIiwgInVuQ2hlY2tlZFRhZ3MiLCAiZ2V0VW5jaGVja2VkIiwgIl9pdGVyYXRvcjMyIiwgIl9zdGVwMzIiLCAiZG9DYXRlZ29yeUNoZWNrYm94ZXMiLCAiX2l0ZXJhdG9yMzMiLCAiX3N0ZXAzMyIsICJfaXRlcmF0b3IzNCIsICJfc3RlcDM0IiwgIl9pdGVyYXRvcjM1IiwgIl9zdGVwMzUiLCAiX1R3aW5rbGUkdGFnJGFydGljbGUiLCAiYWxwaGFiZXRpY2FsTGlzdCIsICJfaXRlcmF0b3IzNiIsICJfc3RlcDM2IiwgIiR3b3JrYXJlYSIsICJyZW5kZXJlZCIsICJfaXRlcmF0b3IzNyIsICJfc3RlcDM3IiwgIl9pdGVyYXRvcjM4IiwgIl9zdGVwMzgiLCAiZmlyc3RQYXJ0IiwgInNlY29uZFBhcnQiLCAidGFnbmFtZSIsICJwYWdlVGV4dCIsICJwb3N0UmVtb3ZhbCIsICJ0YWdzVG9SZW1vdmUiLCAibWFrZVRlbXBsYXRlTGluayIsICJzdW1tYXJ5VGV4dCIsICJhZGRlZFRhZ3MiLCAicmVtb3ZlZFRhZ3MiLCAibWVyZ2VSZWFzb24iLCAiZGlzY3Vzc0FydGljbGUiLCAibm9uRGlzY3Vzc0FydGljbGUiLCAibWVyZ2VUYWdPdGhlciIsICJtZXJnZVRhZyIsICJuZXdQYXJhbXMiLCAidGFnc1RvUmVtYWluIiwgIm1lcmdlVGFyZ2V0IiwgInRhbGtEaXNjdXNzaW9uVGl0bGUiLCAidGFsa0Rpc2N1c3Npb25UaXRsZUxpbmtlZCIsICJtb3ZlUmVhc29uIiwgIm1vdmVUYWxrcGFnZVRleHQiLCAibW92ZVRhcmdldCIsICJtb3ZlVGFsa3BhZ2UiLCAicmVtb3ZlVGFncyIsICJnZXRSZWRpcmVjdHNGb3IiLCAiX2l0ZXJhdG9yMzkiLCAiX3N0ZXAzOSIsICJ0YWdfcmUiLCAibGhuYW1lc3BhY2UiLCAibGhzaG93IiwgImxobGltaXQiLCAicmVzcG9uc2VYTUwiLCAiX2lkeCIsICJyZW1vdmVkIiwgInRhZ1JlIiwgInRhZ1RleHQiLCAiZ3JvdXBhYmxlVGFncyIsICJncm91cGFibGVFeGlzdGluZ1RhZ3MiLCAiYWRkVGFnIiwgImN1cnJlbnRUYWciLCAiZXhwZXJ0IiwgImV4cGVydDIiLCAiZXhwZXJ0MyIsICJtaXNzaW5nSW5mb3JtYXRpb24iLCAibm90YWJpbGl0eSIsICJ0YXJnZXQxIiwgInRhcmdldDIiLCAidGFyZ2V0MyIsICJjbGVhbnVwUmVhc29uIiwgImFkZFVuZ3JvdXBlZFRhZ3MiLCAiX2k5IiwgIl90YWdzIiwgInRlbXBsYXRlc0FmdGVyIiwgIl9pdGVyYXRvcjQwIiwgIl9zdGVwNDAiLCAibm90YWJpbGl0eUxpc3QiLCAiX2l0ZXJhdG9yNDEiLCAiX3N0ZXA0MSIsICJtaVRlc3QiLCAiX2l0ZXJhdG9yNDIiLCAiX3N0ZXA0MiIsICJtaVJlZ2V4IiwgImFkZE5ld1RhZ3NUb01JIiwgIl9pdGVyYXRvcjQzIiwgIl9zdGVwNDMiLCAiX2l0ZXJhdG9yNDQiLCAiX3N0ZXA0NCIsICJ0YWdJbmRleCIsICJhbHRMYW5nRnJvbSIsICJyZXFBcnRpY2xlTGFuZyIsICJyZXFBcnRpY2xlVGl0bGUiLCAiX2kxMCIsICJfdGFnczIiLCAib2xkVGFncyIsICJwYWdlVGFncyIsICJvbGRQYWdlVGFncyIsICJfaXRlcmF0b3I0NSIsICJfc3RlcDQ1IiwgInBhZ2VUYWciLCAicGFnZVJlIiwgImZpbGUiLCAiX2l0ZXJhdG9yNDYiLCAiX3N0ZXA0NiIsICJub3djb21tb25zTmFtZSIsICJrZWVwbG9jYWxOYW1lIiwgImtlZXBsb2NhbFJlYXNvbiIsICJyZW5hbWVtZWRpYU5ld25hbWUiLCAicmVuYW1lbWVkaWFSZWFzb24iLCAiRG9Ob3RNb3ZlVG9Db21tb25zX3JlYXNvbiIsICJjaGVja1BhcmFtZXRlciIsICJwYXJhbWV0ZXIiLCAiZXhpc3RpbmdUYWdzIiwgInR3aW5rbGVzdHViX2V4cG9ydHMiLCAiaW1wb3J0X2V4dF9nYWRnZXQ0IiwgImluaXRfdHdpbmtsZXN0dWIiLCAidHdpbmtsZXN0dWIiLCAic3R1YiIsICJjdXN0b21jaGVja2JveGVzIiwgIl9pdGVyYXRvcjQ3IiwgIl9zdGVwNDciLCAiX2l0ZXJhdG9yNDgiLCAiX3N0ZXA0OCIsICJfaTExIiwgIl9PYmplY3QkZW50cmllczYiLCAidGFnQ2F0ZWdvcmllcyIsICJ0aXRsZU5hbWUiLCAidGFnQ2F0ZWdvcmllc0hlYWRlciIsICJpc0FycmF5IiwgIl9pMTIiLCAiX09iamVjdCRlbnRyaWVzNyIsICJzdWJ0aXRsZSIsICJzdWJjb250ZW50IiwgIl9pMTMiLCAiX09iamVjdCRlbnRyaWVzOCIsICJfaXRlcmF0b3I0OSIsICJfc3RlcDQ5IiwgImdlbmVyYWwiLCAiZ2VvIiwgIm90aGVycyIsICJiaW8iLCAic2NpZW5jZSIsICJzcG9ydCIsICJ0ZWNoIiwgImFydCIsICJ0b3RhbFRhZ3MiLCAiX2kxNCIsICJfdGFnczMiLCAicGF0cm9sUGFnZSIsICJ0d2lua2xlZGlmZl9leHBvcnRzIiwgImluaXRfdHdpbmtsZWRpZmYiLCAidHdpbmtsZWRpZmYiLCAiZGlmZiIsICJvbGRpZCIsICJtZSIsICJub2RlIiwgInJ2dXNlciIsICJsb2NhdGlvbiIsICJ0d2lua2xldW5saW5rX2V4cG9ydHMiLCAiaW5pdF90d2lua2xldW5saW5rIiwgInR3aW5rbGV1bmxpbmsiLCAicHJlc2V0UmVhc29uIiwgImZpbGVTcGFjZSIsICJsaW5rVGV4dEJlZm9yZSIsICJsaW5rVGV4dEFmdGVyIiwgImxpbmtQbGFpbkJlZm9yZSIsICJsaW5rVGVtcGxhdGVCZWZvcmUiLCAibGlua1BsYWluQWZ0ZXIiLCAiX2kxNSIsICJfYXJyMiIsICJmb250RmFtaWx5IiwgImZvbnRTdHlsZSIsICJibHRpdGxlIiwgImJsbGltaXQiLCAiYmxuYW1lc3BhY2UiLCAicmF3Y29udGludWUiLCAiaXV0aXRsZSIsICJpdWxpbWl0IiwgIml1bmFtZXNwYWNlIiwgImJsZmlsdGVycmVkaXIiLCAiYmFja2xpbmtzIiwgInBhZGRpbmciLCAiaW1hZ2V1c2FnZSIsICJ1bmxpbmtlciIsICJiYXRjaE9wZXJhdGlvbiIsICJzZXRPcHRpb24iLCAic2V0UGFnZUxpc3QiLCAicnVuIiwgInNldEJvdEVkaXQiLCAiZG9CYWNrbGlua3MiLCAiZG9JbWFnZXVzYWdlIiwgInVubGlua0JhY2tsaW5rcyIsICJoYXZlY29udGVudCIsICJfaXRlcmF0b3I1MCIsICJfc3RlcDUwIiwgImNvbnZlcnROdW1iZXIiLCAic2hpZnRDbGlja1N1cHBvcnQiLCAiX2l0ZXJhdG9yNTEiLCAiX3N0ZXA1MSIsICJfaXRlcmF0b3I1MiIsICJfc3RlcDUyIiwgIl9pdGVyYXRvcjUzIiwgIl9zdGVwNTMiLCAib2xkdGV4dCIsICJ3YXJuaW5nU3RyaW5nIiwgImNvbW1lbnRPdXRJbWFnZSIsICJyZW1vdmVMaW5rIiwgInJlbW92ZVRlbXBsYXRlIiwgIndvcmtlckZhaWx1cmUiLCAid29ya2VyU3VjY2VzcyIsICJ0d2lua2xlZmx1ZmZfZXhwb3J0cyIsICJpbml0X3R3aW5rbGVmbHVmZiIsICJ0d2lua2xlZmx1ZmYiLCAiZmx1ZmYiLCAiaG9vayIsICJhZGRMaW5rcyIsICJza2lwVGFsayIsICJjb250cmlidXRpb25zIiwgInJlY2VudGNoYW5nZXMiLCAidHJ1c3RlZEJvdHMiLCAiaGlkZGVuTmFtZSIsICJsaW5rQnVpbGRlciIsICJzcGFuVGFnIiwgImJ1aWxkTGluayIsICJyb2xsYmFja0xpbmtzIiwgInZhbmRhbCIsICJpbmxpbmUiLCAicmV2IiwgInJldk5vZGUiLCAibm9ybU5vZGUiLCAidmFuZE5vZGUiLCAibm9ybUxpbmsiLCAidmFuZExpbmsiLCAicmV2ZXJ0IiwgImRpc2FibGVMaW5rcyIsICJzZXBhcmF0b3IiLCAicmVzdG9yZVRoaXNSZXZpc2lvbkxpbmsiLCAicmV2aXNpb25SZWYiLCAicmV2ZXJ0VG9SZXZpc2lvbk5vZGUiLCAiZm9udFdlaWdodCIsICJyZXZlcnRUb1JldmlzaW9uTGluayIsICJyZXZlcnRUb1JldmlzaW9uIiwgIiRsaXN0IiwgImRhdGFzZXQiLCAibXdSZXZpZCIsICJub3QiLCAidGFyZ2V0UGFnZSIsICJoaXN0TGlzdCIsICJ0b0FycmF5IiwgInNoaWZ0IiwgIl9pdGVyYXRvcjU0IiwgIl9zdGVwNTQiLCAiX2l0ZXJhdG9yNTUiLCAiX3N0ZXA1NSIsICJ3YXJuRnJvbVRhbGsiLCAieHRpdGxlIiwgInRhbGtMaW5rIiwgImV4dHJhUGFyYW1zIiwgIm9sZFRpdGxlIiwgInJldmVydHN1bW1hcnkiLCAiXyIsICJuZXdUaXRsZSIsICJudGl0bGUiLCAiaXNJUHY2QWRkcmVzcyIsICJzYW5pdGl6ZUlQdjYiLCAiZ2V0RWxlbWVudHNCeU5hbWUiLCAibm90aWZ5U3RhdHVzIiwgImF1dG9IaWRlIiwgInVzZXJIaWRkZW4iLCAiaW50ZXN0YWN0aW9ucyIsICJjdXJ0aW1lc3RhbXAiLCAib2xkcmV2IiwgInRvUmV2aXNpb24iLCAibGFzdHJldmlkIiwgInRvdWNoZWQiLCAibG9hZHRpbWVzdGFtcCIsICJjc3JmdG9rZW4iLCAicmV2ZXJ0VG9SZXZJRCIsICJyZXZlcnRUb1VzZXIiLCAicmV2ZXJ0VG9Vc2VySGlkZGVuIiwgIm9wdGlvbmFsX3N1bW1hcnkiLCAiZm9ybWF0U3VtbWFyeSIsICJ1bmRvIiwgInVuZG9hZnRlciIsICJiYXNldGltZXN0YW1wIiwgInN0YXJ0dGltZXN0YW1wIiwgIm1pbm9yIiwgImJvdCIsICJ3YXRjaE9yRXhwaXJ5IiwgIndhdGNobGlzdCIsICJjb21wbGV0ZSIsICJyZXZzIiwgImxhc3R1c2VyIiwgInVzZXJOb3JtIiwgImNvbnQiLCAiZ29vZF9yZXZpc2lvbiIsICJ1c2VySGFzQWxyZWFkeUNvbmZpcm1lZEFjdGlvbiIsICJnb29kdXNlciIsICJnb29kdXNlckhpZGRlbiIsICJleHRyYV9zdW1tYXJ5IiwgIm5vdGlmeVVzZXIiLCAieG1sIiwgIiRlZGl0IiwgIndpbmRvd1F1ZXJ5IiwgInZhbmFydGljbGVyZXZpZCIsICJ2YW5hcnRpY2xlZ29vZHJldmlkIiwgImJ1aWx0SW5TdHJpbmciLCAiY3VzdG9tU3RyaW5nIiwgInJlc3VsdExlbiIsICJ1bmVzY2FwZSIsICJlbmNvZGVVUklDb21wb25lbnQiLCAiY29udHJpYnNMaW5rIiwgImNvbnRyaWJzTGVuIiwgInR3aW5rbGViYXRjaGRlbGV0ZV9leHBvcnRzIiwgImluaXRfdHdpbmtsZWJhdGNoZGVsZXRlIiwgInR3aW5rbGViYXRjaGRlbGV0ZSIsICJiYXRjaGRlbGV0ZSIsICJ1bmxpbmtDYWNoZSIsICJzdWJwYWdlc0xvYWRlZCIsICJ0b2dnbGVTdWJwYWdlcyIsICJkZWxldGVyZWFzb25saXN0IiwgImNoYW5nZV9jb21tb25fcmVhc29uIiwgImdlbmVyYXRvciIsICJnY210aXRsZSIsICJnY21saW1pdCIsICJnYXBsaW1pdCIsICJnYXBuYW1lc3BhY2UiLCAiZ2FwcHJlZml4IiwgInBhdGhTcGxpdCIsICJwYXRobmFtZSIsICJ0aXRsZVNwbGl0IiwgImdxcHBhZ2UiLCAiZ3FwbGltaXQiLCAiZ3BsbGltaXQiLCAic3RhdHVzZGl2IiwgIiRwYWdlcyIsICIkcGFnZSIsICJpc1JlZGlyIiwgIiRlZGl0cHJvdCIsICJpc1Byb3RlY3RlZCIsICJtZXRhZGF0YSIsICJmb3JtXyIsICJfaXRlcmF0b3I1NiIsICJfc3RlcDU2IiwgImdlbmVyYXRlQXJyb3dMaW5rcyIsICJuZXh0RWxlbWVudFNpYmxpbmciLCAiZ2VuZXJhdGVOZXdQYWdlTGlzdCIsICJlbGVtZW50cyIsICJOb2RlTGlzdCIsICJfaXRlcmF0b3I1NyIsICJfc3RlcDU3IiwgIkhUTUxJbnB1dEVsZW1lbnQiLCAibmV3UGFnZUxpc3QiLCAiZGVsZXRlX3N1YnBhZ2VfcmVkaXJlY3RzIiwgImRlbGV0ZV9yZWRpcmVjdHMiLCAiZGVsZXRlX3N1YnBhZ2VfdGFsa3MiLCAiZGVsZXRlX3RhbGsiLCAidW5saW5rX3N1YnBhZ2VzIiwgInVubGlua19wYWdlIiwgIl9pdGVyYXRvcjU4IiwgIl9zdGVwNTgiLCAic3ViZ3JvdXBfIiwgInJlcGxhY2VXaXRoIiwgIl9pdGVyYXRvcjU5IiwgIl9zdGVwNTkiLCAiX2l0ZXJhdG9yNjAiLCAiX3N0ZXA2MCIsICJsb2FkaW5nVGV4dCIsICJzdWJwYWdlTGlzdGVyIiwgInBhZ2VUaXRsZSIsICJwYWdlTmFtZUZ1bGwiLCAic3VicGFnZUxpc3QiLCAicGFnZU5hbWVfIiwgIl9pdGVyYXRvcjYxIiwgIl9zdGVwNjEiLCAiX2l0ZXJhdG9yNjIiLCAiX3N0ZXA2MiIsICJfaXRlcmF0b3I2MyIsICJfc3RlcDYzIiwgIl9pdGVyYXRvcjY0IiwgIl9zdGVwNjQiLCAibnVtUHJvdGVjdGVkIiwgInN1YnBhZ2VzIiwgImRlbGV0ZV9wYWdlIiwgImRlbGV0ZV9zdWJwYWdlcyIsICJ1bmxpbmtfZmlsZSIsICJwYWdlRGVsZXRlciIsICJkb0V4dHJhcyIsICJzdWJwYWdlRGVsZXRlciIsICJ0aGluZ1dpdGhQYXJhbWV0ZXJzIiwgInVubGlua0JhY2tsaW5rc01haW4iLCAidW5saW5rSW1hZ2VJbnN0YW5jZXNNYWluIiwgInRhbGtQYWdlIiwgInJlZGlyZWN0RGVsZXRlciIsICJvbGRfdGV4dCIsICJzZXRNYXhDb25mbGljdFJldHJpZXMiLCAidW5saW5rSW1hZ2VJbnN0YW5jZXMiLCAidHdpbmtsZWJhdGNodW5kZWxldGVfZXhwb3J0cyIsICJpbml0X3R3aW5rbGViYXRjaHVuZGVsZXRlIiwgInR3aW5rbGViYXRjaHVuZGVsZXRlIiwgImJhdGNodW5kZWxldGUiLCAicHJvamVjdCIsICJ1bmRlbF90YWxrIiwgInBhZ2VVbmRlbGV0ZXIiLCAic2V0TWF4UmV0cmllcyIsICJ1bmRlbGV0ZVBhZ2UiLCAidGFsa3BhZ2VuYW1lIiwgImdldFRhbGtQYWdlIiwgImRydnByb3AiLCAiZHJ2bGltaXQiLCAidW5kZWxldGVUYWxrIiwgImRlbHJldnMiLCAidHdpbmtsZWJhdGNocHJvdGVjdF9leHBvcnRzIiwgImluaXRfdHdpbmtsZWJhdGNocHJvdGVjdCIsICJ0d2lua2xlYmF0Y2hwcm90ZWN0IiwgImJhdGNocHJvdGVjdCIsICJwcm90TGV2ZWwiLCAiX2l0ZXJhdG9yNjUiLCAiX3N0ZXA2NSIsICJtaXNzaW5nIiwgImVkaXRQcm90IiwgImltYWdlaW5mbyIsICJyZXZpc2lvbnMiLCAiX2l0ZXJhdG9yNjYiLCAiX3N0ZXA2NiIsICJsaW5rcyIsICJjdXJyZW50UHJvdGVjdENvdW50ZXIiLCAiY3VycmVudHByb3RlY3RvciIsICJ0YWtlbkFjdGlvbiIsICJjcmVhdGVtb2RpZnkiLCAidHdpbmtsZWNsb3NlX2V4cG9ydHMiLCAiaW5pdF90d2lua2xlY2xvc2UiLCAidHdpbmtsZWNsb3NlIiwgInNlbGVjdG9yIiwgImRlbE5vZGUiLCAiZGVsTGluayIsICJfaXRlcmF0b3I2NyIsICJfc3RlcDY3IiwgImhlYWRsaW5laHJlZiIsICJtIiwgInBhZ2Vub3RleGlzdCIsICJoYXNDbGFzcyIsICJ0bXBOb2RlIiwgImNsb25lTm9kZSIsICJjb2RlcyIsICJpciIsICJyZXAiLCAibmUiLCAibnEiLCAiayIsICJhZG1pbm9ubHkiLCAic2siLCAidGsiLCAicnIiLCAiZGFuIiwgImQiLCAiaWMiLCAic2QiLCAibHNzZCIsICJzdmciLCAiZHJlcCIsICJjIiwgInIiLCAiY3IiLCAibWVyZ2UiLCAibWVyZ2VhcHByb3ZlZCIsICJuYyIsICJub29wIiwgImNoYW5nZV9jb2RlIiwgImNoYW5nZV9vcGVyYXRpb24iLCAicmVzdWx0RGF0YSIsICJfaTE2IiwgIl9PYmplY3QkZW50cmllczkiLCAiX2l0ZXJhdG9yNjgiLCAiX3N0ZXA2OCIsICJzZHJlYXNvbiIsICJyZW1hcmsiLCAicGFyZW50U2VjdGlvbiIsICJ0YWxrZW5kIiwgImRlbCIsICJrZWVwIiwgInBhZ2V0aXRsZSIsICJnZXROYW1lc3BhY2VJZCIsICJ0YWxrcGFnZXRpdGxlIiwgImdldE1haW5UZXh0IiwgInRvU3RyaW5nIiwgInZmZGtlcHQiLCAic2V0UHJlcGVuZFRleHQiLCAibmV3dGV4dCIsICJrZWVwQ29tcGxldGUiLCAic2F2ZVRhbGsiLCAic2JlZ2luIiwgInNlbmQiLCAiYmFyIiwgImRpc2FibGVMaW5rIiwgInR3aW5rbGVjb25maWdfZXhwb3J0cyIsICJpbml0X3R3aW5rbGVjb25maWciLCAidHdpbmtsZWNvbmZpZyIsICJ3YXRjaGxpc3RFbnVtcyIsICJ5ZXMiLCAibm8iLCAiZGVmYXVsdCIsICJjb21tb25TZXRzIiwgImNzZENyaXRlcmlhIiwgImRiIiwgImNzZENyaXRlcmlhRGlzcGxheU9yZGVyIiwgImNzZENyaXRlcmlhTm90aWZpY2F0aW9uIiwgImNzZENyaXRlcmlhTm90aWZpY2F0aW9uRGlzcGxheU9yZGVyIiwgImNzZEFuZERJQ3JpdGVyaWEiLCAiY3NkQW5kRElDcml0ZXJpYURpc3BsYXlPcmRlciIsICJ4ZmRDcml0ZXJpYSIsICJkZWxldGUiLCAiZndkY3NkIiwgInhmZENyaXRlcmlhRGlzcGxheU9yZGVyIiwgIm5hbWVzcGFjZXNOb1NwZWNpYWwiLCAibW9kdWxlIiwgInByZWZlcmVuY2VzIiwgImVudW1WYWx1ZXMiLCAidGFiIiwgImhlbHB0aXAiLCAic2V0VmFsdWVzIiwgImFkbWluT25seSIsICJjdXN0b21MaXN0VmFsdWVUaXRsZSIsICJjdXN0b21MaXN0TGFiZWxUaXRsZSIsICJ2YW5kIiwgInRvcmV2IiwgIm1pbmUiLCAicmVjZW50Y2hhbmdlc2xpbmtlZCIsICJidXR0b25DbGljayIsICJyYWRpb0NsaWNrIiwgInNldERpc3BsYXlPcmRlciIsICJjYXQiLCAiYWxwaGEiLCAic2FtZSIsICJub25hZG1pbm9ubHkiLCAiYWxsIiwgImNvbnRlbnRkaXYiLCAidG9jdGFibGUiLCAibWFyZ2luTGVmdCIsICJ0b2N0aXRsZSIsICJ0b2NoMiIsICJ0b2N0b2dnbGUiLCAidG9jdG9nZ2xlbGluayIsICJ0b2N1bCIsICIkdG9jdWwiLCAidG9nZ2xlIiwgImNvbnRlbnRmb3JtIiwgInNlY3Rpb25rZXkiLCAidG9jbGkiLCAidG9jYSIsICJyb3ciLCAiY2VsbCIsICJib3JkZXJCb3R0b20iLCAibWFyZ2luVG9wIiwgInJvd2NvdW50IiwgInByZWZrZXkiLCAicHJlZiIsICJtYXJnaW5Cb3R0b20iLCAiYmFja2dyb3VuZENvbG9yIiwgImdvdFByZWYiLCAidGV4dEFsaWduIiwgInBhZGRpbmdSaWdodCIsICJvcHRpb25FeGlzdHMiLCAiX2kxNyIsICJfT2JqZWN0JGVudHJpZXMxMCIsICJlbnVtdmFsdWUiLCAiZW51bWRpc3BsYXkiLCAiY2hlY2tkaXYiLCAicGFkZGluZ0xlZnQiLCAid29ya2VyIiwgIml0ZW1rZXkiLCAiaXRlbXZhbHVlIiwgImNoZWNrbGFiZWwiLCAiX2l0ZXJhdG9yNjkiLCAiX3N0ZXA2OSIsICJfaTE4IiwgIl9PYmplY3QkZW50cmllczExIiwgImN1c3RvbUxpc3RCdXR0b24iLCAibGlzdERpYWxvZyIsICJyZXNldGxpbmsiLCAicmVzZXRQcmVmTGluayIsICJjc3NGbG9hdCIsICJtYXJnaW4iLCAiZm9vdGVyYm94IiwgInN1Ym1pdEJ1dHRvbiIsICJmb290ZXJzcGFuIiwgImZvb3RlcmEiLCAicmVzZXRBbGxQcmVmcyIsICJoYXNoIiwgImxvYyIsICJib3giLCAic2NyaXB0UGFnZU5hbWUiLCAiYWRkUm93IiwgImRsZ3RhYmxlIiwgImNvbnRlbnR0ciIsICJjb250ZW50dGQiLCAicmVtb3ZlQnV0dG9uIiwgIl9jdXJwcmVmJGN1c3RvbUxpc3RWYSIsICJfY3VycHJlZiRjdXN0b21MaXN0TGEiLCAiJHByZWZidXR0b24iLCAiY3VydmFsdWUiLCAiY3VycHJlZiIsICJkaWFsb2djb250ZW50IiwgImRsZ3Rib2R5IiwgImRsZ3RyIiwgImRsZ3RoIiwgImdvdFJvdyIsICJfaXRlcmF0b3I3MCIsICJfc3RlcDcwIiwgImRsZ3Rmb290IiwgImRsZ3RkIiwgImFkZEJ1dHRvbiIsICJtaW5XaWR0aCIsICJidXR0b24iLCAicmVzZXQiLCAidGJvZHkiLCAiJGJ1dHRvbiIsICJvbGR2YWx1ZSIsICJyZXNldFByZWYiLCAiJHRib2R5IiwgIl9pdGVyYXRvcjcxIiwgIl9zdGVwNzEiLCAiaW5wdXRrZXkiLCAid2FudGVkcHJlZiIsICJmb3VuZGl0IiwgIl9pMTkiLCAiX09iamVjdCRlbnRyaWVzMTIiLCAidXNlcmpzIiwgIndyaXRlUHJlZnMiLCAibmV3Q29uZmlnIiwgIm9wdGlvbnNWZXJzaW9uIiwgImNvbXBhcmUiLCAiYiIsICJfaXRlcmF0b3I3MiIsICJfc3RlcDcyIiwgInVzZXJWYWx1ZSIsICJfaXRlcmF0b3I3MyIsICJfc3RlcDczIiwgIl9pMjAiLCAiX09iamVjdCRlbnRyaWVzMTMiLCAibm93aWtpIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgInNhdmVTdWNjZXNzIiwgIm5vdGljZWJveCIsICJub3RpY2VjbGVhciIsICJjbGVhciIsICJQcm9taXNlIiwgInJlc29sdmUiLCAidHdpbmtsZUxvYWQiLCAiX3R3aW5rbGVMb2FkIiwgImFwcGx5IiwgImFyZ3VtZW50cyJdCn0K