import {
  __commonJS
} from "./chunk-PLDDJCW6.js";
// node_modules/jsoneditor/dist/jsoneditor.min.js
var require_jsoneditor_min = __commonJS({
  "node_modules/jsoneditor/dist/jsoneditor.min.js"(exports, module) {
    !function(e, t) {
      "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define([], t) : "object" == typeof exports ? exports.JSONEditor = t() : e.JSONEditor = t();
    }(self, function() {
      return n = { 897: function(e, t, n2) {
        "use strict";
        n2.d(t, { x: function() {
          return r;
        } });
        var c = n2(2602), h = n2(9791), d = n2(7907);
        function o2(e2) {
          return (o2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e3) {
            return typeof e3;
          } : function(e3) {
            return e3 && "function" == typeof Symbol && e3.constructor === Symbol && e3 !== Symbol.prototype ? "symbol" : typeof e3;
          })(e2);
        }
        function i2(e2, t2) {
          for (var n3 = 0; n3 < t2.length; n3++) {
            var i3 = t2[n3];
            i3.enumerable = i3.enumerable || false, i3.configurable = true, "value" in i3 && (i3.writable = true), Object.defineProperty(e2, function(e3) {
              e3 = function(e4, t3) {
                if ("object" !== o2(e4) || null === e4) return e4;
                var n4 = e4[Symbol.toPrimitive];
                if (void 0 === n4) return ("string" === t3 ? String : Number)(e4);
                n4 = n4.call(e4, t3 || "default");
                if ("object" !== o2(n4)) return n4;
                throw new TypeError("@@toPrimitive must return a primitive value.");
              }(e3, "string");
              return "symbol" === o2(e3) ? e3 : String(e3);
            }(i3.key), i3);
          }
        }
        var r = function() {
          function l(t3, e3) {
            if (!(this instanceof l)) throw new TypeError("Cannot call a class as a function");
            this.dom = {};
            var h2 = this, n4 = this.dom, e3 = (this.anchor = void 0, this.items = t3, this.eventListeners = {}, this.selection = void 0, this.onClose = e3 ? e3.close : void 0, this.limitHeight = !!e3 && e3.limitHeight, document.createElement("div")), i3 = (e3.className = "jsoneditor-contextmenu-root", n4.root = e3, document.createElement("div")), e3 = (i3.className = "jsoneditor-contextmenu", n4.menu = i3, e3.appendChild(i3), document.createElement("ul")), i3 = (e3.className = "jsoneditor-menu", i3.appendChild(e3), n4.list = e3, n4.items = [], document.createElement("button")), n4 = (i3.type = "button", n4.focusButton = i3, document.createElement("li"));
            n4.style.overflow = "hidden", n4.style.height = "0", n4.appendChild(i3), e3.appendChild(n4), function a(l2, c2, e4) {
              e4.forEach(function(t4) {
                var n5, e5, i4, o3, r2, s;
                "separator" === t4.type ? ((r2 = document.createElement("div")).className = "jsoneditor-separator", (e5 = document.createElement("li")).appendChild(r2), l2.appendChild(e5)) : (n5 = {}, r2 = document.createElement("li"), l2.appendChild(r2), (e5 = document.createElement("button")).type = "button", e5.className = t4.className, n5.button = e5, t4.title && (e5.title = t4.title), t4.click && (e5.onclick = function(e6) {
                  e6.preventDefault(), h2.hide(), t4.click();
                }), r2.appendChild(e5), t4.submenu ? ((o3 = document.createElement("div")).className = "jsoneditor-icon", e5.appendChild(o3), (o3 = document.createElement("div")).className = "jsoneditor-text" + (t4.click ? "" : " jsoneditor-right-margin"), o3.appendChild(document.createTextNode(t4.text)), e5.appendChild(o3), (i4 = t4.click ? (e5.className += " jsoneditor-default", (o3 = document.createElement("button")).type = "button", (n5.buttonExpand = o3).className = "jsoneditor-expand", (s = document.createElement("div")).className = "jsoneditor-expand", o3.appendChild(s), r2.appendChild(o3), t4.submenuTitle && (o3.title = t4.submenuTitle), o3) : ((s = document.createElement("div")).className = "jsoneditor-expand", e5.appendChild(s), e5)).onclick = function(e6) {
                  e6.preventDefault(), h2._onExpandItem(n5), i4.focus();
                }, n5.subItems = o3 = [], s = document.createElement("ul"), (n5.ul = s).className = "jsoneditor-menu", s.style.height = "0", r2.appendChild(s), a(s, o3, t4.submenu)) : ((r2 = document.createElement("div")).className = "jsoneditor-icon", e5.appendChild(r2), (s = document.createElement("div")).className = "jsoneditor-text", s.appendChild(document.createTextNode((0, d.Iu)(t4.text))), e5.appendChild(s)), c2.push(n5));
              });
            }(e3, this.dom.items, t3), this.maxHeight = 0, t3.forEach(function(e4) {
              e4 = 24 * (t3.length + (e4.submenu ? e4.submenu.length : 0));
              h2.maxHeight = Math.max(h2.maxHeight, e4);
            });
          }
          var e2, t2, n3;
          return e2 = l, (t2 = [{ key: "_getVisibleButtons", value: function() {
            var t3 = [], n4 = this;
            return this.dom.items.forEach(function(e3) {
              t3.push(e3.button), e3.buttonExpand && t3.push(e3.buttonExpand), e3.subItems && e3 === n4.expandedItem && e3.subItems.forEach(function(e4) {
                t3.push(e4.button), e4.buttonExpand && t3.push(e4.buttonExpand);
              });
            }), t3;
          } }, { key: "show", value: function(e3, t3, n4) {
            this.hide();
            var i3 = true, o3 = e3.parentNode, r2 = e3.getBoundingClientRect(), o3 = o3.getBoundingClientRect(), s = t3.getBoundingClientRect(), a = this, t3 = (this.dom.absoluteAnchor = (0, c.w)(e3, t3, function() {
              a.hide();
            }), r2.bottom + this.maxHeight < s.bottom || r2.top - this.maxHeight > s.top && (i3 = false), n4 ? 0 : r2.top - o3.top);
            i3 ? (n4 = e3.offsetHeight, this.dom.menu.style.left = "0", this.dom.menu.style.top = t3 + n4 + "px", this.dom.menu.style.bottom = "") : (this.dom.menu.style.left = "0", this.dom.menu.style.top = "", this.dom.menu.style.bottom = "0px"), this.limitHeight && (o3 = i3 ? s.bottom - r2.bottom - 10 : r2.top - s.top - 10, this.dom.list.style.maxHeight = o3 + "px", this.dom.list.style.overflowY = "auto"), this.dom.absoluteAnchor.appendChild(this.dom.root), this.selection = (0, h.getSelection)(), this.anchor = e3, setTimeout(function() {
              a.dom.focusButton.focus();
            }, 0), l.visibleMenu && l.visibleMenu.hide(), l.visibleMenu = this;
          } }, { key: "hide", value: function() {
            this.dom.absoluteAnchor && (this.dom.absoluteAnchor.destroy(), delete this.dom.absoluteAnchor), this.dom.root.parentNode && (this.dom.root.parentNode.removeChild(this.dom.root), this.onClose) && this.onClose(), l.visibleMenu === this && (l.visibleMenu = void 0);
          } }, { key: "_onExpandItem", value: function(n4) {
            var i3, o3 = this, e3 = n4 === this.expandedItem, t3 = this.expandedItem;
            t3 && (t3.ul.style.height = "0", t3.ul.style.padding = "", setTimeout(function() {
              o3.expandedItem !== t3 && (t3.ul.style.display = "", h.removeClassName)(t3.ul.parentNode, "jsoneditor-selected");
            }, 300), this.expandedItem = void 0), e3 || ((i3 = n4.ul).style.display = "block", i3.clientHeight, setTimeout(function() {
              if (o3.expandedItem === n4) {
                for (var e4 = 0, t4 = 0; t4 < i3.childNodes.length; t4++) e4 += i3.childNodes[t4].clientHeight;
                i3.style.height = e4 + "px", i3.style.padding = "5px 10px";
              }
            }, 0), (0, h.addClassName)(i3.parentNode, "jsoneditor-selected"), this.expandedItem = n4);
          } }, { key: "_onKeyDown", value: function(e3) {
            var t3, n4, i3, o3, r2 = e3.target, s = e3.which, a = false;
            27 === s ? (this.selection && (0, h.setSelection)(this.selection), this.anchor && this.anchor.focus(), this.hide(), a = true) : 9 === s ? e3.shiftKey ? 0 === (n4 = (t3 = this._getVisibleButtons()).indexOf(r2)) && (t3[t3.length - 1].focus(), a = true) : (n4 = (t3 = this._getVisibleButtons()).indexOf(r2)) === t3.length - 1 && (t3[0].focus(), a = true) : 37 === s ? ("jsoneditor-expand" === r2.className && (n4 = (t3 = this._getVisibleButtons()).indexOf(r2), i3 = t3[n4 - 1]) && i3.focus(), a = true) : 38 === s ? (n4 = (t3 = this._getVisibleButtons()).indexOf(r2), (i3 = (i3 = (i3 = t3[n4 - 1]) && "jsoneditor-expand" === i3.className ? t3[n4 - 2] : i3) || t3[t3.length - 1]) && i3.focus(), a = true) : 39 === s ? (n4 = (t3 = this._getVisibleButtons()).indexOf(r2), (o3 = t3[n4 + 1]) && "jsoneditor-expand" === o3.className && o3.focus(), a = true) : 40 === s && (n4 = (t3 = this._getVisibleButtons()).indexOf(r2), (o3 = (o3 = (o3 = t3[n4 + 1]) && "jsoneditor-expand" === o3.className ? t3[n4 + 2] : o3) || t3[0]) && (o3.focus(), a = true), a = true), a && (e3.stopPropagation(), e3.preventDefault());
          } }]) && i2(e2.prototype, t2), n3 && i2(e2, n3), Object.defineProperty(e2, "prototype", { writable: false }), l;
        }();
        r.visibleMenu = void 0;
      }, 6436: function(e, t, n2) {
        "use strict";
        function o2(e2) {
          return (o2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e3) {
            return typeof e3;
          } : function(e3) {
            return e3 && "function" == typeof Symbol && e3.constructor === Symbol && e3 !== Symbol.prototype ? "symbol" : typeof e3;
          })(e2);
        }
        function r(e2, t2) {
          for (var n3 = 0; n3 < t2.length; n3++) {
            var i3 = t2[n3];
            i3.enumerable = i3.enumerable || false, i3.configurable = true, "value" in i3 && (i3.writable = true), Object.defineProperty(e2, function(e3) {
              e3 = function(e4, t3) {
                if ("object" !== o2(e4) || null === e4) return e4;
                var n4 = e4[Symbol.toPrimitive];
                if (void 0 === n4) return ("string" === t3 ? String : Number)(e4);
                n4 = n4.call(e4, t3 || "default");
                if ("object" !== o2(n4)) return n4;
                throw new TypeError("@@toPrimitive must return a primitive value.");
              }(e3, "string");
              return "symbol" === o2(e3) ? e3 : String(e3);
            }(i3.key), i3);
          }
        }
        n2.d(t, { Q: function() {
          return i2;
        } });
        var i2 = function() {
          function n3(e3) {
            if (!(this instanceof n3)) throw new TypeError("Cannot call a class as a function");
            this.errorTableVisible = e3.errorTableVisible, this.onToggleVisibility = e3.onToggleVisibility, this.onFocusLine = e3.onFocusLine || function() {
            }, this.onChangeHeight = e3.onChangeHeight, this.dom = {};
            var e3 = document.createElement("div"), t3 = (e3.className = "jsoneditor-validation-errors-container", this.dom.validationErrorsContainer = e3, document.createElement("div")), e3 = (t3.style.display = "none", t3.className = "jsoneditor-additional-errors fadein", t3.textContent = "Scroll for more ▿", this.dom.additionalErrorsIndication = t3, e3.appendChild(t3), document.createElement("span")), t3 = (e3.className = "jsoneditor-validation-error-icon", e3.style.display = "none", this.dom.validationErrorIcon = e3, document.createElement("span"));
            t3.className = "jsoneditor-validation-error-count", t3.style.display = "none", this.dom.validationErrorCount = t3, this.dom.parseErrorIndication = document.createElement("span"), this.dom.parseErrorIndication.className = "jsoneditor-parse-error-icon", this.dom.parseErrorIndication.style.display = "none";
          }
          var e2, t2, i3;
          return e2 = n3, (t2 = [{ key: "getErrorTable", value: function() {
            return this.dom.validationErrorsContainer;
          } }, { key: "getErrorCounter", value: function() {
            return this.dom.validationErrorCount;
          } }, { key: "getWarningIcon", value: function() {
            return this.dom.validationErrorIcon;
          } }, { key: "getErrorIcon", value: function() {
            return this.dom.parseErrorIndication;
          } }, { key: "toggleTableVisibility", value: function() {
            this.errorTableVisible = !this.errorTableVisible, this.onToggleVisibility(this.errorTableVisible);
          } }, { key: "setErrors", value: function(e3, r2) {
            var s, t3, a = this, n4 = (this.dom.validationErrors && (this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors), this.dom.validationErrors = null, this.dom.additionalErrorsIndication.style.display = "none"), this.errorTableVisible && 0 < e3.length ? ((n4 = document.createElement("div")).className = "jsoneditor-validation-errors", (t3 = document.createElement("table")).className = "jsoneditor-text-errors", n4.appendChild(t3), s = document.createElement("tbody"), t3.appendChild(s), e3.forEach(function(t4) {
              isNaN(t4.line) ? t4.dataPath && (n5 = r2.find(function(e5) {
                return e5.path === t4.dataPath;
              })) && (e4 = n5.line + 1) : e4 = t4.line;
              var e4, n5 = document.createElement("tr"), i4 = (n5.className = isNaN(e4) ? "" : "jump-to-line", "error" === t4.type ? n5.className += " parse-error" : n5.className += " validation-error", document.createElement("td")), o3 = document.createElement("button"), o3 = (o3.className = "jsoneditor-schema-error", i4.appendChild(o3), n5.appendChild(i4), document.createElement("td"));
              o3.style = "white-space: nowrap;", o3.textContent = isNaN(e4) ? "" : "Ln " + e4, n5.appendChild(o3), "string" == typeof t4 ? ((i4 = document.createElement("td")).colSpan = 2, (o3 = document.createElement("pre")).appendChild(document.createTextNode(t4)), i4.appendChild(o3), n5.appendChild(i4)) : ((o3 = document.createElement("td")).appendChild(document.createTextNode(t4.dataPath || "")), n5.appendChild(o3), i4 = document.createElement("td"), (o3 = document.createElement("pre")).appendChild(document.createTextNode(t4.message.replace(/
/gi, "\n"))), i4.appendChild(o3), n5.appendChild(i4)), n5.onclick = function() {
                a.onFocusLine(e4);
              }, s.appendChild(n5);
            }), this.dom.validationErrors = n4, this.dom.validationErrorsContainer.appendChild(n4), this.dom.additionalErrorsIndication.title = e3.length + " errors total", this.dom.validationErrorsContainer.clientHeight < this.dom.validationErrorsContainer.scrollHeight ? (this.dom.additionalErrorsIndication.style.display = "block", this.dom.validationErrorsContainer.onscroll = function() {
              a.dom.additionalErrorsIndication.style.display = 0 < a.dom.validationErrorsContainer.clientHeight && 0 === a.dom.validationErrorsContainer.scrollTop ? "block" : "none";
            }) : this.dom.validationErrorsContainer.onscroll = void 0, t3 = this.dom.validationErrorsContainer.clientHeight + (this.dom.statusBar ? this.dom.statusBar.clientHeight : 0), this.onChangeHeight(t3)) : this.onChangeHeight(0), e3.filter(function(e4) {
              return "error" !== e4.type;
            }).length);
            0 < n4 ? (this.dom.validationErrorCount.style.display = "inline", this.dom.validationErrorCount.innerText = n4, this.dom.validationErrorCount.onclick = this.toggleTableVisibility.bind(this), this.dom.validationErrorIcon.style.display = "inline", this.dom.validationErrorIcon.title = n4 + " schema validation error(s) found", this.dom.validationErrorIcon.onclick = this.toggleTableVisibility.bind(this)) : (this.dom.validationErrorCount.style.display = "none", this.dom.validationErrorIcon.style.display = "none"), e3.some(function(e4) {
              return "error" === e4.type;
            }) ? (t3 = e3[0].line, this.dom.parseErrorIndication.style.display = "block", this.dom.parseErrorIndication.title = isNaN(t3) ? "parse error - check that the json is valid" : "parse error on line " + t3, this.dom.parseErrorIndication.onclick = this.toggleTableVisibility.bind(this)) : this.dom.parseErrorIndication.style.display = "none";
          } }]) && r(e2.prototype, t2), i3 && r(e2, i3), Object.defineProperty(e2, "prototype", { writable: false }), n3;
        }();
      }, 2474: function(e, t, n2) {
        "use strict";
        function o2(e2) {
          return (o2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e3) {
            return typeof e3;
          } : function(e3) {
            return e3 && "function" == typeof Symbol && e3.constructor === Symbol && e3 !== Symbol.prototype ? "symbol" : typeof e3;
          })(e2);
        }
        function r(e2, t2) {
          for (var n3 = 0; n3 < t2.length; n3++) {
            var i3 = t2[n3];
            i3.enumerable = i3.enumerable || false, i3.configurable = true, "value" in i3 && (i3.writable = true), Object.defineProperty(e2, function(e3) {
              e3 = function(e4, t3) {
                if ("object" !== o2(e4) || null === e4) return e4;
                var n4 = e4[Symbol.toPrimitive];
                if (void 0 === n4) return ("string" === t3 ? String : Number)(e4);
                n4 = n4.call(e4, t3 || "default");
                if ("object" !== o2(n4)) return n4;
                throw new TypeError("@@toPrimitive must return a primitive value.");
              }(e3, "string");
              return "symbol" === o2(e3) ? e3 : String(e3);
            }(i3.key), i3);
          }
        }
        n2.d(t, { R: function() {
          return i2;
        } });
        var i2 = function() {
          function t2(e3) {
            if (!(this instanceof t2)) throw new TypeError("Cannot call a class as a function");
            if (this.target = e3.target || null, !this.target) throw new Error('FocusTracker constructor called without a "target" to track.');
            this.onFocus = "function" == typeof e3.onFocus ? e3.onFocus : null, this.onBlur = "function" == typeof e3.onBlur ? e3.onBlur : null, this._onClick = this._onEvent.bind(this), this._onKeyUp = (function(e4) {
              9 !== e4.which && 9 !== e4.keyCode || this._onEvent(e4);
            }).bind(this), this._onBlur = this._onEvent.bind(this), this.focusFlag = false, this.firstEventFlag = true, (this.onFocus || this.onBlur) && (document.addEventListener("click", this._onClick), document.addEventListener("keyup", this._onKeyUp), document.addEventListener("blur", this._onBlur));
          }
          var e2, n3, i3;
          return e2 = t2, (n3 = [{ key: "destroy", value: function() {
            document.removeEventListener("click", this._onClick), document.removeEventListener("keyup", this._onKeyUp), document.removeEventListener("blur", this._onBlur), this._onEvent({ target: document.body });
          } }, { key: "_onEvent", value: function(e3) {
            e3 = e3.target, e3 = e3 === this.target || !(!this.target.contains(e3) && !this.target.contains(document.activeElement));
            e3 ? this.focusFlag || (this.onFocus && this.onFocus({ type: "focus", target: this.target }), this.focusFlag = true) : (this.focusFlag || this.firstEventFlag) && (this.onBlur && this.onBlur({ type: "blur", target: this.target }), this.focusFlag = false, this.firstEventFlag) && (this.firstEventFlag = false);
          } }]) && r(e2.prototype, n3), i3 && r(e2, i3), Object.defineProperty(e2, "prototype", { writable: false }), t2;
        }();
      }, 3161: function(e, t, o2) {
        "use strict";
        var n2 = o2(8170), i2 = o2(8037), r = o2(8038).treeModeMixins, s = o2(8458).textModeMixins, a = o2(341).previewModeMixins, l = o2(9791), c = l.clear, h = l.extend, d = l.getInnerText, u = l.getInternetExplorerVersion, g = l.parse, l = o2(2744).tryRequireAjv, p = o2(2558).showTransformModal, m = o2(6210).showSortModal, f = l();
        function C(e2, t2, n3) {
          if (!(this instanceof C)) throw new Error('JSONEditor constructor called without "new".');
          var i3 = u();
          if (-1 !== i3 && i3 < 9) throw new Error("Unsupported browser, IE9 or newer required. Please install the newest version of your browser.");
          t2 && (t2.error && (console.warn('Option "error" has been renamed to "onError"'), t2.onError = t2.error, delete t2.error), t2.change && (console.warn('Option "change" has been renamed to "onChange"'), t2.onChange = t2.change, delete t2.change), t2.editable && (console.warn('Option "editable" has been renamed to "onEditable"'), t2.onEditable = t2.editable, delete t2.editable), t2.onChangeJSON && ("text" === t2.mode || "code" === t2.mode || t2.modes && (-1 !== t2.modes.indexOf("text") || -1 !== t2.modes.indexOf("code"))) && console.warn('Option "onChangeJSON" is not applicable to modes "text" and "code". Use "onChangeText" or "onChange" instead.'), t2) && Object.keys(t2).forEach(function(e3) {
            -1 === C.VALID_OPTIONS.indexOf(e3) && console.warn('Unknown option "' + e3 + '". This option will be ignored');
          }), arguments.length && this._create(e2, t2, n3);
        }
        "undefined" == typeof Promise && console.error("Promise undefined. Please load a Promise polyfill in the browser in order to use JSONEditor"), C.modes = {}, C.prototype.DEBOUNCE_INTERVAL = 150, C.VALID_OPTIONS = ["ajv", "schema", "schemaRefs", "templates", "ace", "theme", "autocomplete", "onChange", "onChangeJSON", "onChangeText", "onExpand", "onEditable", "onError", "onEvent", "onModeChange", "onNodeName", "onValidate", "onCreateMenu", "onSelectionChange", "onTextSelectionChange", "onClassName", "onFocus", "onBlur", "colorPicker", "onColorPicker", "timestampTag", "timestampFormat", "escapeUnicode", "history", "search", "mode", "modes", "name", "indentation", "sortObjectKeys", "navigationBar", "statusBar", "mainMenuBar", "languages", "language", "enableSort", "enableTransform", "limitDragging", "maxVisibleChilds", "onValidationError", "modalAnchor", "popupAnchor", "createQuery", "executeQuery", "queryDescription", "allowSchemaSuggestions", "showErrorTable"], C.prototype._create = function(e2, t2, n3) {
          this.container = e2, this.options = t2 || {}, this.json = n3 || {};
          e2 = this.options.mode || this.options.modes && this.options.modes[0] || "tree";
          this.setMode(e2);
        }, C.prototype.destroy = function() {
        }, C.prototype.set = function(e2) {
          this.json = e2;
        }, C.prototype.get = function() {
          return this.json;
        }, C.prototype.setText = function(e2) {
          this.json = g(e2);
        }, C.prototype.getText = function() {
          return JSON.stringify(this.json);
        }, C.prototype.setName = function(e2) {
          this.options || (this.options = {}), this.options.name = e2;
        }, C.prototype.getName = function() {
          return this.options && this.options.name;
        }, C.prototype.setMode = function(e2) {
          if (e2 !== this.options.mode || !this.create) {
            var t2 = this.container, n3 = h({}, this.options), i3 = n3.mode, o3 = (n3.mode = e2, C.modes[e2]);
            if (!o3) throw new Error('Unknown mode "' + n3.mode + '"');
            var r2 = "text" === o3.data, s2 = this.getName(), a2 = this[r2 ? "getText" : "get"]();
            if (this.destroy(), c(this), h(this, o3.mixin), this.create(t2, n3), this.setName(s2), this[r2 ? "setText" : "set"](a2), "function" == typeof o3.load) try {
              o3.load.call(this);
            } catch (e3) {
              console.error(e3);
            }
            if ("function" == typeof n3.onModeChange && e2 !== i3) try {
              n3.onModeChange(e2, i3);
            } catch (e3) {
              console.error(e3);
            }
          }
        }, C.prototype.getMode = function() {
          return this.options.mode;
        }, C.prototype._onError = function(e2) {
          this.options && "function" == typeof this.options.onError ? this.options.onError(e2) : window.alert(e2.toString());
        }, C.prototype.setSchema = function(e2, t2) {
          if (e2) {
            var n3;
            try {
              this.options.ajv ? n3 = this.options.ajv : ((n3 = f({ allErrors: true, verbose: true, schemaId: "auto", $data: true })).addMetaSchema(o2(7171)), n3.addMetaSchema(o2(6273)));
            } catch (e3) {
              console.warn("Failed to create an instance of Ajv, JSON Schema validation is not available. Please use a JSONEditor bundle including Ajv, or pass an instance of Ajv as via the configuration option `ajv`.");
            }
            if (n3) {
              if (t2) {
                for (var i3 in t2) n3.removeSchema(i3), t2[i3] && n3.addSchema(t2[i3], i3);
                this.options.schemaRefs = t2;
              }
              this.validateSchema = n3.compile(e2), this.options.schema = e2, this.options.schemaRefs = t2, this.validate();
            }
          } else this.validateSchema = null, this.options.schema = null, this.options.schemaRefs = null, this.validate();
          this.refresh(), "function" == typeof this._onSchemaChange && this._onSchemaChange(e2, t2);
        }, C.prototype.validate = function() {
        }, C.prototype.refresh = function() {
        }, (C.registerMode = function(e2) {
          var t2;
          if (Array.isArray(e2)) for (o3 = 0; o3 < e2.length; o3++) C.registerMode(e2[o3]);
          else {
            if (!("mode" in e2)) throw new Error('Property "mode" missing');
            if (!("mixin" in e2)) throw new Error('Property "mixin" missing');
            if (!("data" in e2)) throw new Error('Property "data" missing');
            var n3 = e2.mode;
            if (n3 in C.modes) throw new Error('Mode "' + n3 + '" already registered');
            if ("function" != typeof e2.mixin.create) throw new Error('Required function "create" missing on mixin');
            for (var i3 = ["setMode", "registerMode", "modes"], o3 = 0; o3 < i3.length; o3++) if ((t2 = i3[o3]) in e2.mixin) throw new Error('Reserved property "' + t2 + '" not allowed in mixin');
            C.modes[n3] = e2;
          }
        })(r), C.registerMode(s), C.registerMode(a), C.ace = n2, C.Ajv = f, C.VanillaPicker = i2, C.showTransformModal = p, C.showSortModal = m, C.getInnerText = d, e.exports = C.default = C;
      }, 6617: function(e, t, n2) {
        "use strict";
        n2.d(t, { x: function() {
          return r;
        } });
        var u = n2(897), g = n2(7907);
        function o2(e2) {
          return (o2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e3) {
            return typeof e3;
          } : function(e3) {
            return e3 && "function" == typeof Symbol && e3.constructor === Symbol && e3 !== Symbol.prototype ? "symbol" : typeof e3;
          })(e2);
        }
        function i2(e2, t2) {
          for (var n3 = 0; n3 < t2.length; n3++) {
            var i3 = t2[n3];
            i3.enumerable = i3.enumerable || false, i3.configurable = true, "value" in i3 && (i3.writable = true), Object.defineProperty(e2, function(e3) {
              e3 = function(e4, t3) {
                if ("object" !== o2(e4) || null === e4) return e4;
                var n4 = e4[Symbol.toPrimitive];
                if (void 0 === n4) return ("string" === t3 ? String : Number)(e4);
                n4 = n4.call(e4, t3 || "default");
                if ("object" !== o2(n4)) return n4;
                throw new TypeError("@@toPrimitive must return a primitive value.");
              }(e3, "string");
              return "symbol" === o2(e3) ? e3 : String(e3);
            }(i3.key), i3);
          }
        }
        var r = function() {
          function d(e3, t3, n4, i3) {
            if (!(this instanceof d)) throw new TypeError("Cannot call a class as a function");
            for (var o3 = { code: { text: (0, g.Iu)("modeCodeText"), title: (0, g.Iu)("modeCodeTitle"), click: function() {
              i3("code");
            } }, form: { text: (0, g.Iu)("modeFormText"), title: (0, g.Iu)("modeFormTitle"), click: function() {
              i3("form");
            } }, text: { text: (0, g.Iu)("modeTextText"), title: (0, g.Iu)("modeTextTitle"), click: function() {
              i3("text");
            } }, tree: { text: (0, g.Iu)("modeTreeText"), title: (0, g.Iu)("modeTreeTitle"), click: function() {
              i3("tree");
            } }, view: { text: (0, g.Iu)("modeViewText"), title: (0, g.Iu)("modeViewTitle"), click: function() {
              i3("view");
            } }, preview: { text: (0, g.Iu)("modePreviewText"), title: (0, g.Iu)("modePreviewTitle"), click: function() {
              i3("preview");
            } } }, r2 = [], s = 0; s < t3.length; s++) {
              var a = t3[s], l = o3[a];
              if (!l) throw new Error('Unknown mode "' + a + '"');
              l.className = "jsoneditor-type-modes" + (n4 === a ? " jsoneditor-selected" : ""), r2.push(l);
            }
            var c = o3[n4];
            if (!c) throw new Error('Unknown mode "' + n4 + '"');
            var c = c.text, h = document.createElement("button"), c = (h.type = "button", h.className = "jsoneditor-modes jsoneditor-separator", h.textContent = c + " ▾", h.title = (0, g.Iu)("modeEditorTitle"), h.onclick = function() {
              new u.x(r2).show(h, e3);
            }, document.createElement("div"));
            c.className = "jsoneditor-modes", c.style.position = "relative", c.appendChild(h), e3.appendChild(c), this.dom = { container: e3, box: h, frame: c };
          }
          var e2, t2, n3;
          return e2 = d, (t2 = [{ key: "focus", value: function() {
            this.dom.box.focus();
          } }, { key: "destroy", value: function() {
            this.dom && this.dom.frame && this.dom.frame.parentNode && this.dom.frame.parentNode.removeChild(this.dom.frame), this.dom = null;
          } }]) && i2(e2.prototype, t2), n3 && i2(e2, n3), Object.defineProperty(e2, "prototype", { writable: false }), d;
        }();
      }, 8170: function(e, t, n2) {
        var i2;
        if (window.ace) i2 = window.ace;
        else try {
          i2 = n2(6225), n2(4091), n2(3330), n2(4317);
          var o2 = n2(7923);
          i2.config.setModuleUrl("ace/mode/json_worker", o2);
        } catch (e2) {
        }
        e.exports = i2;
      }, 4864: function() {
        window.ace.define("ace/theme/jsoneditor", ["require", "exports", "module", "ace/lib/dom"], function(e, t, n2) {
          t.isDark = false, t.cssClass = "ace-jsoneditor", t.cssText = '.ace-jsoneditor .ace_gutter {\nbackground: #ebebeb;\ncolor: #333\n}\n\n.ace-jsoneditor.ace_editor {\nline-height: 1.3;\nbackground-color: #fff;\n}\n.ace-jsoneditor .ace_print-margin {\nwidth: 1px;\nbackground: #e8e8e8\n}\n.ace-jsoneditor .ace_scroller {\nbackground-color: #FFFFFF\n}\n.ace-jsoneditor .ace_text-layer {\ncolor: gray\n}\n.ace-jsoneditor .ace_variable {\ncolor: #1a1a1a\n}\n.ace-jsoneditor .ace_cursor {\nborder-left: 2px solid #000000\n}\n.ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\nborder-left: 0px;\nborder-bottom: 1px solid #000000\n}\n.ace-jsoneditor .ace_marker-layer .ace_selection {\nbackground: lightgray\n}\n.ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\nbox-shadow: 0 0 3px 0px #FFFFFF;\nborder-radius: 2px\n}\n.ace-jsoneditor .ace_marker-layer .ace_step {\nbackground: rgb(255, 255, 0)\n}\n.ace-jsoneditor .ace_marker-layer .ace_bracket {\nmargin: -1px 0 0 -1px;\nborder: 1px solid #BFBFBF\n}\n.ace-jsoneditor .ace_marker-layer .ace_active-line {\nbackground: #FFFBD1\n}\n.ace-jsoneditor .ace_gutter-active-line {\nbackground-color : #dcdcdc\n}\n.ace-jsoneditor .ace_marker-layer .ace_selected-word {\nborder: 1px solid lightgray\n}\n.ace-jsoneditor .ace_invisible {\ncolor: #BFBFBF\n}\n.ace-jsoneditor .ace_keyword,\n.ace-jsoneditor .ace_meta,\n.ace-jsoneditor .ace_support.ace_constant.ace_property-value {\ncolor: #AF956F\n}\n.ace-jsoneditor .ace_keyword.ace_operator {\ncolor: #484848\n}\n.ace-jsoneditor .ace_keyword.ace_other.ace_unit {\ncolor: #96DC5F\n}\n.ace-jsoneditor .ace_constant.ace_language {\ncolor: darkorange\n}\n.ace-jsoneditor .ace_constant.ace_numeric {\ncolor: red\n}\n.ace-jsoneditor .ace_constant.ace_character.ace_entity {\ncolor: #BF78CC\n}\n.ace-jsoneditor .ace_invalid {\ncolor: #FFFFFF;\nbackground-color: #FF002A;\n}\n.ace-jsoneditor .ace_fold {\nbackground-color: #AF956F;\nborder-color: #000000\n}\n.ace-jsoneditor .ace_storage,\n.ace-jsoneditor .ace_support.ace_class,\n.ace-jsoneditor .ace_support.ace_function,\n.ace-jsoneditor .ace_support.ace_other,\n.ace-jsoneditor .ace_support.ace_type {\ncolor: #C52727\n}\n.ace-jsoneditor .ace_string {\ncolor: green\n}\n.ace-jsoneditor .ace_comment {\ncolor: #BCC8BA\n}\n.ace-jsoneditor .ace_entity.ace_name.ace_tag,\n.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\ncolor: #606060\n}\n.ace-jsoneditor .ace_markup.ace_underline {\ntext-decoration: underline\n}\n.ace-jsoneditor .ace_indent-guide {\nbackground: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y\n}', e("../lib/dom").importCssString(t.cssText, t.cssClass);
        });
      }, 6589: function(e, t) {
        (n2 = { trace: function() {
        }, yy: {}, symbols_: { error: 2, JSONString: 3, STRING: 4, JSONNumber: 5, NUMBER: 6, JSONNullLiteral: 7, NULL: 8, JSONBooleanLiteral: 9, TRUE: 10, FALSE: 11, JSONText: 12, JSONValue: 13, EOF: 14, JSONObject: 15, JSONArray: 16, "{": 17, "}": 18, JSONMemberList: 19, JSONMember: 20, ":": 21, ",": 22, "[": 23, "]": 24, JSONElementList: 25, $accept: 0, $end: 1 }, terminals_: { 2: "error", 4: "STRING", 6: "NUMBER", 8: "NULL", 10: "TRUE", 11: "FALSE", 14: "EOF", 17: "{", 18: "}", 21: ":", 22: ",", 23: "[", 24: "]" }, productions_: [0, [3, 1], [5, 1], [7, 1], [9, 1], [9, 1], [12, 2], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [15, 2], [15, 3], [20, 3], [19, 1], [19, 3], [16, 2], [16, 3], [25, 1], [25, 3]], performAction: function(e2, t2, n3, i2, o2, r, s) {
          var a = r.length - 1;
          switch (o2) {
            case 1:
              this.$ = e2.replace(/\\(\\|")/g, "$1").replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, "	").replace(/\\v/g, "\v").replace(/\\f/g, "\f").replace(/\\b/g, "\b");
              break;
            case 2:
              this.$ = Number(e2);
              break;
            case 3:
              this.$ = null;
              break;
            case 4:
              this.$ = true;
              break;
            case 5:
              this.$ = false;
              break;
            case 6:
              return this.$ = r[a - 1];
            case 13:
              this.$ = {};
              break;
            case 14:
              this.$ = r[a - 1];
              break;
            case 15:
              this.$ = [r[a - 2], r[a]];
              break;
            case 16:
              this.$ = {}, this.$[r[a][0]] = r[a][1];
              break;
            case 17:
              this.$ = r[a - 2], r[a - 2][r[a][0]] = r[a][1];
              break;
            case 18:
              this.$ = [];
              break;
            case 19:
              this.$ = r[a - 1];
              break;
            case 20:
              this.$ = [r[a]];
              break;
            case 21:
              this.$ = r[a - 2], r[a - 2].push(r[a]);
          }
        }, table: [{ 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 12: 1, 13: 2, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15] }, { 1: [3] }, { 14: [1, 16] }, { 14: [2, 7], 18: [2, 7], 22: [2, 7], 24: [2, 7] }, { 14: [2, 8], 18: [2, 8], 22: [2, 8], 24: [2, 8] }, { 14: [2, 9], 18: [2, 9], 22: [2, 9], 24: [2, 9] }, { 14: [2, 10], 18: [2, 10], 22: [2, 10], 24: [2, 10] }, { 14: [2, 11], 18: [2, 11], 22: [2, 11], 24: [2, 11] }, { 14: [2, 12], 18: [2, 12], 22: [2, 12], 24: [2, 12] }, { 14: [2, 3], 18: [2, 3], 22: [2, 3], 24: [2, 3] }, { 14: [2, 4], 18: [2, 4], 22: [2, 4], 24: [2, 4] }, { 14: [2, 5], 18: [2, 5], 22: [2, 5], 24: [2, 5] }, { 14: [2, 1], 18: [2, 1], 21: [2, 1], 22: [2, 1], 24: [2, 1] }, { 14: [2, 2], 18: [2, 2], 22: [2, 2], 24: [2, 2] }, { 3: 20, 4: [1, 12], 18: [1, 17], 19: 18, 20: 19 }, { 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 13: 23, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15], 24: [1, 21], 25: 22 }, { 1: [2, 6] }, { 14: [2, 13], 18: [2, 13], 22: [2, 13], 24: [2, 13] }, { 18: [1, 24], 22: [1, 25] }, { 18: [2, 16], 22: [2, 16] }, { 21: [1, 26] }, { 14: [2, 18], 18: [2, 18], 22: [2, 18], 24: [2, 18] }, { 22: [1, 28], 24: [1, 27] }, { 22: [2, 20], 24: [2, 20] }, { 14: [2, 14], 18: [2, 14], 22: [2, 14], 24: [2, 14] }, { 3: 20, 4: [1, 12], 20: 29 }, { 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 13: 30, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15] }, { 14: [2, 19], 18: [2, 19], 22: [2, 19], 24: [2, 19] }, { 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 13: 31, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15] }, { 18: [2, 17], 22: [2, 17] }, { 18: [2, 15], 22: [2, 15] }, { 22: [2, 21], 24: [2, 21] }], defaultActions: { 16: [2, 6] }, parseError: function(e2, t2) {
          throw new Error(e2);
        }, parse: function(e2) {
          var t2 = this, n3 = [0], i2 = [null], o2 = [], r = this.table, s = "", a = 0, l = 0, c = 0, h = (this.lexer.setInput(e2), this.lexer.yy = this.yy, this.yy.lexer = this.lexer, void 0 === this.lexer.yylloc && (this.lexer.yylloc = {}), this.lexer.yylloc);
          function d() {
            var e3 = t2.lexer.lex() || 1;
            return e3 = "number" != typeof e3 ? t2.symbols_[e3] || e3 : e3;
          }
          o2.push(h), "function" == typeof this.yy.parseError && (this.parseError = this.yy.parseError);
          for (var u, g, p, m, f, C, y, v, I, b = {}; ; ) {
            if (p = n3[n3.length - 1], void 0 === (m = this.defaultActions[p] || (null == u && (u = d()), r[p] && r[p][u])) || !m.length || !m[0]) {
              if (!c) {
                for (f in v = [], r[p]) this.terminals_[f] && 2 < f && v.push("'" + this.terminals_[f] + "'");
                var A = "", A = this.lexer.showPosition ? "Parse error on line " + (a + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + v.join(", ") + ", got '" + this.terminals_[u] + "'" : "Parse error on line " + (a + 1) + ": Unexpected " + (1 == u ? "end of input" : "'" + (this.terminals_[u] || u) + "'");
                this.parseError(A, { text: this.lexer.match, token: this.terminals_[u] || u, line: this.lexer.yylineno, loc: h, expected: v });
              }
              if (3 == c) {
                if (1 == u) throw new Error(A || "Parsing halted.");
                l = this.lexer.yyleng, s = this.lexer.yytext, a = this.lexer.yylineno, h = this.lexer.yylloc, u = d();
              }
              for (; ; ) {
                if (2 .toString() in r[p]) break;
                if (0 == p) throw new Error(A || "Parsing halted.");
                I = 1, n3.length = n3.length - 2 * I, i2.length = i2.length - I, o2.length = o2.length - I, p = n3[n3.length - 1];
              }
              g = u, u = 2, m = r[p = n3[n3.length - 1]] && r[p][2], c = 3;
            }
            if (m[0] instanceof Array && 1 < m.length) throw new Error("Parse Error: multiple actions possible at state: " + p + ", token: " + u);
            switch (m[0]) {
              case 1:
                n3.push(u), i2.push(this.lexer.yytext), o2.push(this.lexer.yylloc), n3.push(m[1]), u = null, g ? (u = g, g = null) : (l = this.lexer.yyleng, s = this.lexer.yytext, a = this.lexer.yylineno, h = this.lexer.yylloc, 0 < c && c--);
                break;
              case 2:
                if (C = this.productions_[m[1]][1], b.$ = i2[i2.length - C], b._$ = { first_line: o2[o2.length - (C || 1)].first_line, last_line: o2[o2.length - 1].last_line, first_column: o2[o2.length - (C || 1)].first_column, last_column: o2[o2.length - 1].last_column }, void 0 !== (y = this.performAction.call(b, s, l, a, this.yy, m[1], i2, o2))) return y;
                C && (n3 = n3.slice(0, -1 * C * 2), i2 = i2.slice(0, -1 * C), o2 = o2.slice(0, -1 * C)), n3.push(this.productions_[m[1]][0]), i2.push(b.$), o2.push(b._$), y = r[n3[n3.length - 2]][n3[n3.length - 1]], n3.push(y);
                break;
              case 3:
                return true;
            }
          }
          return true;
        } }).lexer = { EOF: 1, parseError: function(e2, t2) {
          if (!this.yy.parseError) throw new Error(e2);
          this.yy.parseError(e2, t2);
        }, setInput: function(e2) {
          return this._input = e2, this._more = this._less = this.done = false, this.yylineno = this.yyleng = 0, this.yytext = this.matched = this.match = "", this.conditionStack = ["INITIAL"], this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }, this;
        }, input: function() {
          var e2 = this._input[0];
          return this.yytext += e2, this.yyleng++, this.match += e2, this.matched += e2, e2.match(/\n/) && this.yylineno++, this._input = this._input.slice(1), e2;
        }, unput: function(e2) {
          return this._input = e2 + this._input, this;
        }, more: function() {
          return this._more = true, this;
        }, less: function(e2) {
          this._input = this.match.slice(e2) + this._input;
        }, pastInput: function() {
          var e2 = this.matched.substr(0, this.matched.length - this.match.length);
          return (20 < e2.length ? "..." : "") + e2.substr(-20).replace(/\n/g, "");
        }, upcomingInput: function() {
          var e2 = this.match;
          return e2.length < 20 && (e2 += this._input.substr(0, 20 - e2.length)), (e2.substr(0, 20) + (20 < e2.length ? "..." : "")).replace(/\n/g, "");
        }, showPosition: function() {
          var e2 = this.pastInput(), t2 = new Array(e2.length + 1).join("-");
          return e2 + this.upcomingInput() + "\n" + t2 + "^";
        }, next: function() {
          if (this.done) return this.EOF;
          this._input || (this.done = true), this._more || (this.yytext = "", this.match = "");
          for (var e2, t2, n3, i2, o2 = this._currentRules(), r = 0; r < o2.length && (!(t2 = this._input.match(this.rules[o2[r]])) || e2 && !(t2[0].length > e2[0].length) || (e2 = t2, n3 = r, this.options.flex)); r++) ;
          return e2 ? ((i2 = e2[0].match(/\n.*/g)) && (this.yylineno += i2.length), this.yylloc = { first_line: this.yylloc.last_line, last_line: this.yylineno + 1, first_column: this.yylloc.last_column, last_column: i2 ? i2[i2.length - 1].length - 1 : this.yylloc.last_column + e2[0].length }, this.yytext += e2[0], this.match += e2[0], this.yyleng = this.yytext.length, this._more = false, this._input = this._input.slice(e2[0].length), this.matched += e2[0], i2 = this.performAction.call(this, this.yy, this, o2[n3], this.conditionStack[this.conditionStack.length - 1]), this.done && this._input && (this.done = false), i2 || void 0) : "" === this._input ? this.EOF : void this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno });
        }, lex: function() {
          var e2 = this.next();
          return void 0 !== e2 ? e2 : this.lex();
        }, begin: function(e2) {
          this.conditionStack.push(e2);
        }, popState: function() {
          return this.conditionStack.pop();
        }, _currentRules: function() {
          return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
        }, topState: function() {
          return this.conditionStack[this.conditionStack.length - 2];
        }, pushState: function(e2) {
          this.begin(e2);
        }, options: {}, performAction: function(e2, t2, n3, i2) {
          switch (n3) {
            case 0:
              break;
            case 1:
              return 6;
            case 2:
              return t2.yytext = t2.yytext.substr(1, t2.yyleng - 2), 4;
            case 3:
              return 17;
            case 4:
              return 18;
            case 5:
              return 23;
            case 6:
              return 24;
            case 7:
              return 22;
            case 8:
              return 21;
            case 9:
              return 10;
            case 10:
              return 11;
            case 11:
              return 8;
            case 12:
              return 14;
            case 13:
              return "INVALID";
          }
        }, rules: [/^(?:\s+)/, /^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/, /^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/, /^(?:\{)/, /^(?:\})/, /^(?:\[)/, /^(?:\])/, /^(?:,)/, /^(?::)/, /^(?:true\b)/, /^(?:false\b)/, /^(?:null\b)/, /^(?:$)/, /^(?:.)/], conditions: { INITIAL: { rules: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], inclusive: true } } };
        var n2;
        t.parser = n2, t.parse = n2.parse.bind(n2);
      }, 3879: function(e) {
        "use strict";
        function i2() {
        }
        i2.prototype = { on: function(e2, t2) {
          this._events = this._events || {}, this._events[e2] = this._events[e2] || [], this._events[e2].push(t2);
        }, off: function(e2, t2) {
          this._events = this._events || {}, e2 in this._events != false && this._events[e2].splice(this._events[e2].indexOf(t2), 1);
        }, emit: function(e2) {
          if (this._events = this._events || {}, e2 in this._events != false) for (var t2 = 0; t2 < this._events[e2].length; t2++) this._events[e2][t2].apply(this, Array.prototype.slice.call(arguments, 1));
        } }, i2.mixin = function(e2) {
          for (var t2 = ["on", "off", "emit"], n2 = 0; n2 < t2.length; n2++) "function" == typeof e2 ? e2.prototype[t2[n2]] = i2.prototype[t2[n2]] : e2[t2[n2]] = i2.prototype[t2[n2]];
          return e2;
        };
        var u = { escapeRegExp: function(e2) {
          var t2 = /[\\^$.*+?()[\]{}|]/g, n2 = new RegExp(t2.source);
          return e2 && n2.test(e2) ? e2.replace(t2, "\\$&") : e2;
        }, extend: function(e2, t2) {
          for (var n2 in t2) {
            var i3;
            t2.hasOwnProperty(n2) && ((i3 = t2[n2]) && "[object Object]" === Object.prototype.toString.call(i3) ? (e2[n2] = e2[n2] || {}, u.extend(e2[n2], i3)) : e2[n2] = i3);
          }
          return e2;
        }, each: function(e2, t2, n2) {
          if ("[object Object]" === Object.prototype.toString.call(e2)) for (var i3 in e2) Object.prototype.hasOwnProperty.call(e2, i3) && t2.call(n2, i3, e2[i3], e2);
          else for (var o3 = 0, r2 = e2.length; o3 < r2; o3++) t2.call(n2, o3, e2[o3], e2);
        }, createElement: function(e2, t2) {
          var n2, i3 = document.createElement(e2);
          if (t2 && "[object Object]" === Object.prototype.toString.call(t2)) for (n2 in t2) n2 in i3 ? i3[n2] = t2[n2] : "html" === n2 ? i3.innerHTML = t2[n2] : i3.setAttribute(n2, t2[n2]);
          return i3;
        }, hasClass: function(e2, t2) {
          if (e2) return e2.classList ? e2.classList.contains(t2) : !!e2.className && !!e2.className.match(new RegExp("(\\s|^)" + t2 + "(\\s|$)"));
        }, addClass: function(e2, t2) {
          u.hasClass(e2, t2) || (e2.classList ? e2.classList.add(t2) : e2.className = e2.className.trim() + " " + t2);
        }, removeClass: function(e2, t2) {
          u.hasClass(e2, t2) && (e2.classList ? e2.classList.remove(t2) : e2.className = e2.className.replace(new RegExp("(^|\\s)" + t2.split(" ").join("|") + "(\\s|$)", "gi"), " "));
        }, closest: function(e2, t2) {
          return e2 && e2 !== document.body && (t2(e2) ? e2 : u.closest(e2.parentNode, t2));
        }, isInt: function(e2) {
          return "number" == typeof e2 && isFinite(e2) && Math.floor(e2) === e2;
        }, debounce: function(i3, o3, r2) {
          var s2;
          return function() {
            var e2 = this, t2 = arguments, n2 = r2 && !s2;
            clearTimeout(s2), s2 = setTimeout(function() {
              s2 = null, r2 || i3.apply(e2, t2);
            }, o3), n2 && i3.apply(e2, t2);
          };
        }, rect: function(e2, t2) {
          var n2 = window, e2 = e2.getBoundingClientRect(), i3 = t2 ? n2.pageXOffset : 0, t2 = t2 ? n2.pageYOffset : 0;
          return { bottom: e2.bottom + t2, height: e2.height, left: e2.left + i3, right: e2.right + i3, top: e2.top + t2, width: e2.width };
        }, includes: function(e2, t2) {
          return -1 < e2.indexOf(t2);
        }, startsWith: function(e2, t2) {
          return e2.substr(0, t2.length) === t2;
        }, truncate: function(e2) {
          for (; e2.firstChild; ) e2.removeChild(e2.firstChild);
        } };
        function h(e2, t2) {
          return e2.hasOwnProperty(t2) && (true === e2[t2] || e2[t2].length);
        }
        function g(e2, t2, n2) {
          e2.parentNode ? e2.parentNode.parentNode || t2.appendChild(e2.parentNode) : t2.appendChild(e2), u.removeClass(e2, "excluded"), n2 || (e2.textContent = e2.textContent);
        }
        function o2() {
          var n2, e2;
          this.items.length && (n2 = document.createDocumentFragment(), this.config.pagination ? (e2 = this.pages.slice(0, this.pageIndex), u.each(e2, function(e3, t2) {
            u.each(t2, function(e4, t3) {
              g(t3, n2, this.customOption);
            }, this);
          }, this)) : u.each(this.items, function(e3, t2) {
            g(t2, n2, this.customOption);
          }, this), n2.childElementCount && (u.removeClass(this.items[this.navIndex], "active"), this.navIndex = (n2.querySelector(".selectr-option.selected") || n2.querySelector(".selectr-option")).idx, u.addClass(this.items[this.navIndex], "active")), this.tree.appendChild(n2));
        }
        function d(e2, t2) {
          t2 = t2 || e2;
          var n2 = { class: "selectr-option", role: "treeitem", "aria-selected": false };
          return this.customOption ? n2.html = this.config.renderOption(t2) : n2.textContent = e2.textContent, (t2 = u.createElement("li", n2)).idx = e2.idx, this.items.push(t2), e2.defaultSelected && this.defaultSelected.push(e2.idx), e2.disabled && (t2.disabled = true, u.addClass(t2, "disabled")), t2;
        }
        function r() {
          var n2, e2 = this.tree, t2 = e2.scrollTop;
          e2.scrollHeight - e2.offsetHeight <= t2 && this.pageIndex < this.pages.length && (n2 = document.createDocumentFragment(), u.each(this.pages[this.pageIndex], function(e3, t3) {
            g(t3, n2, this.customOption);
          }, this), e2.appendChild(n2), this.pageIndex++, this.emit("selectr.paginate", { items: this.items.length, total: this.data.length, page: this.pageIndex, pages: this.pages.length }));
        }
        function s() {
          (this.config.searchable || this.config.taggable) && (this.input.value = null, this.searching = false, this.config.searchable && u.removeClass(this.inputContainer, "active"), u.hasClass(this.container, "notice") && (u.removeClass(this.container, "notice"), u.addClass(this.container, "open"), this.input.focus()), u.each(this.items, function(e2, t2) {
            u.removeClass(t2, "excluded"), this.customOption || (t2.textContent = t2.textContent);
          }, this));
        }
        function t(e2, t2) {
          if (!e2) throw new Error("You must supply either a HTMLSelectElement or a CSS3 selector string.");
          if ("string" == typeof (this.el = e2) && (this.el = document.querySelector(e2)), null === this.el) throw new Error("The element you passed to Selectr can not be found.");
          if ("select" !== this.el.nodeName.toLowerCase()) throw new Error("The element you passed to Selectr is not a HTMLSelectElement.");
          this.render(t2);
        }
        t.prototype.render = function(e2) {
          var t2;
          this.rendered || ((this.el.selectr = this).config = u.extend({ defaultSelected: true, width: "auto", disabled: false, disabledMobile: false, searchable: true, clearable: false, sortSelected: false, allowDeselect: false, closeOnScroll: false, nativeDropdown: false, nativeKeyboard: false, placeholder: "Select an option...", taggable: false, tagPlaceholder: "Enter a tag...", messages: { noResults: "No results.", noOptions: "No options available.", maxSelections: "A maximum of {max} items can be selected.", tagDuplicate: "That tag is already in use.", searchPlaceholder: "Search options..." } }, e2), this.originalType = this.el.type, this.originalIndex = this.el.tabIndex, this.defaultSelected = [], this.originalOptionCount = this.el.options.length, (this.config.multiple || this.config.taggable) && (this.el.multiple = true), this.disabled = h(this.config, "disabled"), this.opened = false, this.config.taggable && (this.config.searchable = false), this.navigating = false, this.mobileDevice = false, !this.config.disabledMobile && /Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i.test(navigator.userAgent) && (this.mobileDevice = true), this.customOption = this.config.hasOwnProperty("renderOption") && "function" == typeof this.config.renderOption, this.customSelected = this.config.hasOwnProperty("renderSelection") && "function" == typeof this.config.renderSelection, this.supportsEventPassiveOption = this.detectEventPassiveOption(), i2.mixin(this), (function() {
            this.requiresPagination = this.config.pagination && 0 < this.config.pagination, h(this.config, "width") && (u.isInt(this.config.width) ? this.width = this.config.width + "px" : "auto" === this.config.width ? this.width = "100%" : u.includes(this.config.width, "%") && (this.width = this.config.width)), this.container = u.createElement("div", { class: "selectr-container" }), this.config.customClass && u.addClass(this.container, this.config.customClass), this.mobileDevice ? u.addClass(this.container, "selectr-mobile") : u.addClass(this.container, "selectr-desktop"), this.el.tabIndex = -1, this.config.nativeDropdown || this.mobileDevice ? u.addClass(this.el, "selectr-visible") : u.addClass(this.el, "selectr-hidden"), this.selected = u.createElement("div", { class: "selectr-selected", disabled: this.disabled, tabIndex: 0, "aria-expanded": false }), this.label = u.createElement(this.el.multiple ? "ul" : "span", { class: "selectr-label" });
            var e3 = u.createElement("div", { class: "selectr-options-container" });
            if (this.tree = u.createElement("ul", { class: "selectr-options", role: "tree", "aria-hidden": true, "aria-expanded": false }), this.notice = u.createElement("div", { class: "selectr-notice" }), this.el.setAttribute("aria-hidden", true), this.disabled && (this.el.disabled = true), this.el.multiple ? (u.addClass(this.label, "selectr-tags"), u.addClass(this.container, "multiple"), this.tags = [], this.selectedValues = this.config.defaultSelected ? this.getSelectedProperties("value") : [], this.selectedIndexes = this.getSelectedProperties("idx")) : (this.selectedValue = null, this.selectedIndex = -1), this.selected.appendChild(this.label), this.config.clearable && (this.selectClear = u.createElement("button", { class: "selectr-clear", type: "button" }), this.container.appendChild(this.selectClear), u.addClass(this.container, "clearable")), this.config.taggable) {
              var t3 = u.createElement("li", { class: "input-tag" });
              if (this.input = u.createElement("input", { class: "selectr-tag-input", placeholder: this.config.tagPlaceholder, tagIndex: 0, autocomplete: "off", autocorrect: "off", autocapitalize: "off", spellcheck: "false", role: "textbox", type: "search" }), t3.appendChild(this.input), this.label.appendChild(t3), u.addClass(this.container, "taggable"), this.tagSeperators = [","], this.config.tagSeperators) {
                this.tagSeperators = this.tagSeperators.concat(this.config.tagSeperators);
                for (var n2 = [], i3 = 0; i3 < this.tagSeperators.length; i3++) n2.push(u.escapeRegExp(this.tagSeperators[i3]));
                this.tagSeperatorsRegex = new RegExp(n2.join("|"), "i");
              } else this.tagSeperatorsRegex = new RegExp(",", "i");
            }
            this.config.searchable && (this.input = u.createElement("input", { class: "selectr-input", tagIndex: -1, autocomplete: "off", autocorrect: "off", autocapitalize: "off", spellcheck: "false", role: "textbox", type: "search", placeholder: this.config.messages.searchPlaceholder }), this.inputClear = u.createElement("button", { class: "selectr-input-clear", type: "button" }), this.inputContainer = u.createElement("div", { class: "selectr-input-container" }), this.inputContainer.appendChild(this.input), this.inputContainer.appendChild(this.inputClear), e3.appendChild(this.inputContainer)), e3.appendChild(this.notice), e3.appendChild(this.tree), this.items = [], this.options = [], this.el.options.length && (this.options = [].slice.call(this.el.options));
            var o3, r2, s2, a = false, l = 0;
            this.el.children.length && u.each(this.el.children, function(e4, t4) {
              "OPTGROUP" === t4.nodeName ? (a = u.createElement("ul", { class: "selectr-optgroup", role: "group", html: "
" + t4.label + "" }), u.each(t4.children, function(e5, t5) {
                t5.idx = l, a.appendChild(d.call(this, t5, a)), l++;
              }, this)) : (t4.idx = l, d.call(this, t4), l++);
            }, this), this.config.data && Array.isArray(this.config.data) && (o3 = !(this.data = []), a = false, l = 0, u.each(this.config.data, function(e4, t4) {
              h(t4, "children") ? (o3 = u.createElement("optgroup", { label: t4.text }), a = u.createElement("ul", { class: "selectr-optgroup", role: "group", html: "" + t4.text + "" }), u.each(t4.children, function(e5, t5) {
                (r2 = new Option(t5.text, t5.value, false, t5.hasOwnProperty("selected") && true === t5.selected)).disabled = h(t5, "disabled"), this.options.push(r2), o3.appendChild(r2), r2.idx = l, a.appendChild(d.call(this, r2, t5)), this.data[l] = t5, l++;
              }, this), this.el.appendChild(o3)) : ((r2 = new Option(t4.text, t4.value, false, t4.hasOwnProperty("selected") && true === t4.selected)).disabled = h(t4, "disabled"), this.options.push(r2), r2.idx = l, d.call(this, r2, t4), this.data[l] = t4, l++);
            }, this)), this.setSelected(true);
            for (var c = this.navIndex = 0; c < this.items.length; c++) if (s2 = this.items[c], !u.hasClass(s2, "disabled")) {
              u.addClass(s2, "active"), this.navIndex = c;
              break;
            }
            this.requiresPagination && (this.pageIndex = 1, this.paginate()), this.container.appendChild(this.selected), this.container.appendChild(e3), this.placeEl = u.createElement("div", { class: "selectr-placeholder" }), this.setPlaceholder(), this.selected.appendChild(this.placeEl), this.disabled && this.disable(), this.el.parentNode.insertBefore(this.container, this.el), this.container.appendChild(this.el);
          }).call(this), this.bindEvents(), this.update(), this.optsRect = u.rect(this.tree), this.rendered = true, this.el.multiple || (this.el.selectedIndex = this.selectedIndex), t2 = this, setTimeout(function() {
            t2.emit("selectr.init");
          }, 20));
        }, t.prototype.getSelected = function() {
          return this.el.querySelectorAll("option:checked");
        }, t.prototype.getSelectedProperties = function(t2) {
          var e2 = this.getSelected();
          return [].slice.call(e2).map(function(e3) {
            return e3[t2];
          }).filter(function(e3) {
            return null != e3;
          });
        }, t.prototype.detectEventPassiveOption = function() {
          var e2 = false;
          try {
            var t2 = Object.defineProperty({}, "passive", { get: function() {
              e2 = true;
            } });
            window.addEventListener("test", null, t2);
          } catch (e3) {
          }
          return e2;
        }, t.prototype.bindEvents = function() {
          var n2, i3 = this;
          this.events = {}, this.events.dismiss = (function(e2) {
            e2 = e2.target;
            this.container.contains(e2) || !this.opened && !u.hasClass(this.container, "notice") || this.close();
          }).bind(this), this.events.navigate = (function(e2) {
            if (e2 = e2 || window.event, this.items.length && this.opened && u.includes([13, 38, 40], e2.which)) {
              if (e2.preventDefault(), 13 === e2.which) return !(this.noResults || this.config.taggable && 0 < this.input.value.length) && this.change(this.navIndex);
              var t2, n3 = this.items[this.navIndex], i4 = this.navIndex;
              switch (e2.which) {
                case 38:
                  (t2 = 0) < this.navIndex && this.navIndex--;
                  break;
                case 40:
                  this.navIndex < this.items.length - (t2 = 1) && this.navIndex++;
              }
              for (this.navigating = true; u.hasClass(this.items[this.navIndex], "disabled") || u.hasClass(this.items[this.navIndex], "excluded"); ) {
                if (!(0 < this.navIndex && this.navIndex < this.items.length - 1)) {
                  this.navIndex = i4;
                  break;
                }
                if (t2 ? this.navIndex++ : this.navIndex--, this.searching) {
                  if (this.navIndex > this.tree.lastElementChild.idx) {
                    this.navIndex = this.tree.lastElementChild.idx;
                    break;
                  }
                  if (this.navIndex < this.tree.firstElementChild.idx) {
                    this.navIndex = this.tree.firstElementChild.idx;
                    break;
                  }
                }
              }
              e2 = u.rect(this.items[this.navIndex]);
              t2 ? (0 === this.navIndex ? this.tree.scrollTop = 0 : e2.top + e2.height > this.optsRect.top + this.optsRect.height && (this.tree.scrollTop = this.tree.scrollTop + (e2.top + e2.height - (this.optsRect.top + this.optsRect.height))), this.navIndex === this.tree.childElementCount - 1 && this.requiresPagination && r.call(this)) : 0 === this.navIndex ? this.tree.scrollTop = 0 : e2.top - this.optsRect.top < 0 && (this.tree.scrollTop = this.tree.scrollTop + (e2.top - this.optsRect.top)), n3 && u.removeClass(n3, "active"), u.addClass(this.items[this.navIndex], "active");
            } else this.navigating = false;
          }).bind(this), this.events.reset = this.reset.bind(this), (this.config.nativeDropdown || this.mobileDevice) && (this.container.addEventListener("touchstart", function(e2) {
            e2.changedTouches[0].target === i3.el && i3.toggle();
          }, !!this.supportsEventPassiveOption && { passive: true }), this.container.addEventListener("click", function(e2) {
            e2.target === i3.el && i3.toggle();
          }), this.el.addEventListener("change", function(e2) {
            e2.__selfTriggered || (i3.el.multiple ? (e2 = i3.getSelectedProperties("idx"), e2 = function(e3, t2) {
              for (var n3, i4 = [], o3 = e3.slice(0), r2 = 0; r2 < t2.length; r2++) -1 < (n3 = o3.indexOf(t2[r2])) ? o3.splice(n3, 1) : i4.push(t2[r2]);
              return [i4, o3];
            }(i3.selectedIndexes, e2), u.each(e2[0], function(e3, t2) {
              i3.select(t2);
            }, i3), u.each(e2[1], function(e3, t2) {
              i3.deselect(t2);
            }, i3)) : -1 < i3.el.selectedIndex && i3.select(i3.el.selectedIndex));
          })), this.config.nativeDropdown && this.container.addEventListener("keydown", function(e2) {
            "Enter" === e2.key && i3.selected === document.activeElement && (i3.toggle(), setTimeout(function() {
              i3.el.focus();
            }, 200));
          }), this.selected.addEventListener("click", function(e2) {
            i3.disabled || i3.toggle(), e2.preventDefault();
          }), this.config.nativeKeyboard && (n2 = "", this.selected.addEventListener("keydown", function(e2) {
            var t2;
            i3.disabled || i3.selected !== document.activeElement || e2.altKey || e2.ctrlKey || e2.metaKey || (" " === e2.key || !i3.opened && -1 < ["Enter", "ArrowUp", "ArrowDown"].indexOf(e2.key) ? (i3.toggle(), e2.preventDefault(), e2.stopPropagation()) : e2.key.length <= 2 && String[String.fromCodePoint ? "fromCodePoint" : "fromCharCode"](e2.key[String.codePointAt ? "codePointAt" : "charCodeAt"](0)) === e2.key && (i3.config.multiple ? (i3.open(), i3.config.searchable && (i3.input.value = e2.key, i3.input.focus(), i3.search(null, true))) : (n2 += e2.key, (t2 = i3.search(n2, true)) && t2.length && (i3.clear(), i3.setValue(t2[0].value)), setTimeout(function() {
              n2 = "";
            }, 1e3)), e2.preventDefault(), e2.stopPropagation()));
          }), this.container.addEventListener("keyup", function(e2) {
            i3.opened && "Escape" === e2.key && (i3.close(), e2.stopPropagation(), i3.selected.focus());
          })), this.label.addEventListener("click", function(e2) {
            u.hasClass(e2.target, "selectr-tag-remove") && i3.deselect(e2.target.parentNode.idx);
          }), this.selectClear && this.selectClear.addEventListener("click", this.clear.bind(this)), this.tree.addEventListener("mousedown", function(e2) {
            e2.preventDefault();
          }), this.tree.addEventListener("click", function(e2) {
            var t2 = u.closest(e2.target, function(e3) {
              return e3 && u.hasClass(e3, "selectr-option");
            });
            t2 && !u.hasClass(t2, "disabled") && (u.hasClass(t2, "selected") ? (i3.el.multiple || !i3.el.multiple && i3.config.allowDeselect) && i3.deselect(t2.idx) : i3.select(t2.idx), i3.opened && !i3.el.multiple) && i3.close(), e2.preventDefault(), e2.stopPropagation();
          }), this.tree.addEventListener("mouseover", function(e2) {
            !u.hasClass(e2.target, "selectr-option") || u.hasClass(e2.target, "disabled") || (u.removeClass(i3.items[i3.navIndex], "active"), u.addClass(e2.target, "active"), i3.navIndex = [].slice.call(i3.items).indexOf(e2.target));
          }), this.config.searchable && (this.input.addEventListener("focus", function(e2) {
            i3.searching = true;
          }), this.input.addEventListener("blur", function(e2) {
            i3.searching = false;
          }), this.input.addEventListener("keyup", function(e2) {
            i3.search(), i3.config.taggable || (this.value.length ? u.addClass(this.parentNode, "active") : u.removeClass(this.parentNode, "active"));
          }), this.inputClear.addEventListener("click", function(e2) {
            i3.input.value = null, s.call(i3), i3.tree.childElementCount || o2.call(i3);
          })), this.config.taggable && this.input.addEventListener("keyup", function(e2) {
            var t2, n3;
            i3.search(), i3.config.taggable && this.value.length && (t2 = this.value.trim()).length && (13 === e2.which || i3.tagSeperatorsRegex.test(t2)) && (e2 = t2.replace(i3.tagSeperatorsRegex, ""), (n3 = (e2 = (e2 = u.escapeRegExp(e2)).trim()).length ? i3.add({ value: e2, textContent: e2, selected: true }, true) : n3) ? (i3.close(), s.call(i3)) : (this.value = "", i3.setMessage(i3.config.messages.tagDuplicate)));
          }), this.update = u.debounce(function() {
            i3.opened && i3.config.closeOnScroll && i3.close(), i3.width && (i3.container.style.width = i3.width), i3.invert();
          }, 50), this.requiresPagination && (this.paginateItems = u.debounce(function() {
            r.call(this);
          }, 50), this.tree.addEventListener("scroll", this.paginateItems.bind(this))), document.addEventListener("click", this.events.dismiss), window.addEventListener("keydown", this.events.navigate), window.addEventListener("resize", this.update), window.addEventListener("scroll", this.update), this.on("selectr.destroy", function() {
            document.removeEventListener("click", this.events.dismiss), window.removeEventListener("keydown", this.events.navigate), window.removeEventListener("resize", this.update), window.removeEventListener("scroll", this.update);
          }), this.el.form && (this.el.form.addEventListener("reset", this.events.reset), this.on("selectr.destroy", function() {
            this.el.form.removeEventListener("reset", this.events.reset);
          }));
        }, t.prototype.setSelected = function(e2) {
          var n2;
          this.config.data || this.el.multiple || !this.el.options.length || (0 !== this.el.selectedIndex || this.el.options[0].defaultSelected || this.config.defaultSelected || (this.el.selectedIndex = -1), this.selectedIndex = this.el.selectedIndex, -1 < this.selectedIndex && this.select(this.selectedIndex)), this.config.multiple && "select-one" === this.originalType && !this.config.data && this.el.options[0].selected && !this.el.options[0].defaultSelected && (this.el.options[0].selected = false), u.each(this.options, function(e3, t2) {
            t2.selected && t2.defaultSelected && this.select(t2.idx);
          }, this), this.config.selectedValue && this.setValue(this.config.selectedValue), this.config.data && (!this.el.multiple && this.config.defaultSelected && this.el.selectedIndex < 0 && 0 < this.config.data.length && this.select(0), n2 = 0, u.each(this.config.data, function(e3, t2) {
            h(t2, "children") ? u.each(t2.children, function(e4, t3) {
              t3.hasOwnProperty("selected") && true === t3.selected && this.select(n2), n2++;
            }, this) : (t2.hasOwnProperty("selected") && true === t2.selected && this.select(n2), n2++);
          }, this));
        }, t.prototype.destroy = function() {
          this.rendered && (this.emit("selectr.destroy"), "select-one" === this.originalType && (this.el.multiple = false), this.config.data && (this.el.innerHTML = ""), u.removeClass(this.el, "selectr-hidden"), this.container.parentNode.replaceChild(this.el, this.container), this.rendered = false, delete this.el.selectr);
        }, t.prototype.change = function(e2) {
          var t2 = this.items[e2], n2 = this.options[e2];
          n2.disabled || (n2.selected && u.hasClass(t2, "selected") ? this.deselect(e2) : this.select(e2), this.opened && !this.el.multiple && this.close());
        }, t.prototype.select = function(i3) {
          var e2 = this.items[i3], t2 = [].slice.call(this.el.options), n2 = this.options[i3];
          if (this.el.multiple) {
            if (u.includes(this.selectedIndexes, i3)) return false;
            if (this.config.maxSelections && this.tags.length === this.config.maxSelections) return this.setMessage(this.config.messages.maxSelections.replace("{max}", this.config.maxSelections), true), false;
            this.selectedValues.push(n2.value), this.selectedIndexes.push(i3), !(function(e3) {
              var l, c = this, n3 = document.createDocumentFragment(), t3 = this.options[e3.idx], i4 = this.data ? this.data[e3.idx] : t3, o4 = { class: "selectr-tag" }, i4 = (this.customSelected ? o4.html = this.config.renderSelection(i4) : o4.textContent = t3.textContent, u.createElement("li", o4)), o4 = u.createElement("button", { class: "selectr-tag-remove", type: "button" });
              i4.appendChild(o4), i4.idx = e3.idx, i4.tag = t3.value, this.tags.push(i4), this.config.sortSelected ? (o4 = this.tags.slice(), l = function(e4, i5) {
                e4.replace(/(\d+)|(\D+)/g, function(e5, t4, n4) {
                  i5.push([t4 || 1 / 0, n4 || ""]);
                });
              }, o4.sort(function(e4, t4) {
                var n4, i5, o5 = [], r2 = [];
                for (true === c.config.sortSelected ? (n4 = e4.tag, i5 = t4.tag) : "text" === c.config.sortSelected && (n4 = e4.textContent, i5 = t4.textContent), l(n4, o5), l(i5, r2); o5.length && r2.length; ) {
                  var s2 = o5.shift(), a = r2.shift(), s2 = s2[0] - a[0] || s2[1].localeCompare(a[1]);
                  if (s2) return s2;
                }
                return o5.length - r2.length;
              }), u.each(o4, function(e4, t4) {
                n3.appendChild(t4);
              }), this.label.innerHTML = "") : n3.appendChild(i4), this.config.taggable ? this.label.insertBefore(n3, this.input.parentNode) : this.label.appendChild(n3);
            }).call(this, e2);
          } else {
            var o3 = this.data ? this.data[i3] : n2;
            this.customSelected ? this.label.innerHTML = this.config.renderSelection(o3) : this.label.textContent = n2.textContent, this.selectedValue = n2.value, this.selectedIndex = i3, u.each(this.options, function(e3, t3) {
              var n3 = this.items[e3];
              e3 !== i3 && (n3 && u.removeClass(n3, "selected"), t3.selected = false, t3.removeAttribute("selected"));
            }, this);
          }
          u.includes(t2, n2) || this.el.add(n2), e2.setAttribute("aria-selected", true), u.addClass(e2, "selected"), u.addClass(this.container, "has-selected"), n2.selected = true, n2.setAttribute("selected", ""), this.emit("selectr.change", n2), this.emit("selectr.select", n2), "createEvent" in document ? ((o3 = document.createEvent("HTMLEvents")).initEvent("change", true, true), o3.__selfTriggered = true, this.el.dispatchEvent(o3)) : this.el.fireEvent("onchange");
        }, t.prototype.deselect = function(e2, t2) {
          var n2 = this.items[e2], i3 = this.options[e2];
          if (this.el.multiple) {
            var o3 = this.selectedIndexes.indexOf(e2), o3 = (this.selectedIndexes.splice(o3, 1), this.selectedValues.indexOf(i3.value));
            this.selectedValues.splice(o3, 1), !(function(n3) {
              var i4 = false;
              u.each(this.tags, function(e3, t3) {
                t3.idx === n3.idx && (i4 = t3);
              }, this), i4 && (this.label.removeChild(i4), this.tags.splice(this.tags.indexOf(i4), 1));
            }).call(this, n2), this.tags.length || u.removeClass(this.container, "has-selected");
          } else {
            if (!t2 && !this.config.clearable && !this.config.allowDeselect) return false;
            this.label.innerHTML = "", this.selectedValue = null, this.el.selectedIndex = this.selectedIndex = -1, u.removeClass(this.container, "has-selected");
          }
          this.items[e2].setAttribute("aria-selected", false), u.removeClass(this.items[e2], "selected"), i3.selected = false, i3.removeAttribute("selected"), this.emit("selectr.change", null), this.emit("selectr.deselect", i3), "createEvent" in document ? ((o3 = document.createEvent("HTMLEvents")).initEvent("change", true, true), o3.__selfTriggered = true, this.el.dispatchEvent(o3)) : this.el.fireEvent("onchange");
        }, t.prototype.setValue = function(n2) {
          var i3 = Array.isArray(n2);
          if (i3 || (n2 = n2.toString().trim()), !this.el.multiple && i3) return false;
          u.each(this.options, function(e2, t2) {
            (i3 && -1 < n2.indexOf(t2.value) || t2.value === n2) && this.change(t2.idx);
          }, this);
        }, t.prototype.getValue = function(e2, t2) {
          var n2, i3;
          return this.el.multiple ? e2 ? this.selectedIndexes.length && (i3 = { values: [] }, u.each(this.selectedIndexes, function(e3, t3) {
            t3 = this.options[t3];
            i3.values[e3] = { value: t3.value, text: t3.textContent };
          }, this)) : i3 = this.selectedValues.slice() : i3 = e2 ? { value: (n2 = this.options[this.selectedIndex]).value, text: n2.textContent } : this.selectedValue, i3 = e2 && t2 ? JSON.stringify(i3) : i3;
        }, t.prototype.add = function(n2, i3) {
          if (n2) {
            if (this.data = this.data || [], this.items = this.items || [], this.options = this.options || [], Array.isArray(n2)) u.each(n2, function(e3, t2) {
              this.add(t2, i3);
            }, this);
            else if ("[object Object]" === Object.prototype.toString.call(n2)) {
              if (i3) {
                var o3 = false;
                if (u.each(this.options, function(e3, t2) {
                  t2.value.toLowerCase() === n2.value.toLowerCase() && (o3 = true);
                }), o3) return false;
              }
              var e2 = u.createElement("option", n2);
              return this.data.push(n2), this.mobileDevice && this.el.add(e2), this.options.push(e2), e2.idx = 0 < this.options.length ? this.options.length - 1 : 0, d.call(this, e2), n2.selected && this.select(e2.idx), this.setPlaceholder(), e2;
            }
            return this.config.pagination && this.paginate(), true;
          }
        }, t.prototype.remove = function(e2) {
          var n2, i3 = [];
          Array.isArray(e2) ? u.each(e2, function(e3, t2) {
            u.isInt(t2) ? i3.push(this.getOptionByIndex(t2)) : "string" == typeof t2 && i3.push(this.getOptionByValue(t2));
          }, this) : u.isInt(e2) ? i3.push(this.getOptionByIndex(e2)) : "string" == typeof e2 && i3.push(this.getOptionByValue(e2)), i3.length && (u.each(i3, function(e3, t2) {
            n2 = t2.idx, this.el.remove(t2), this.options.splice(n2, 1);
            t2 = this.items[n2].parentNode;
            t2 && t2.removeChild(this.items[n2]), this.items.splice(n2, 1), u.each(this.options, function(e4, t3) {
              t3.idx = e4, this.items[e4].idx = e4;
            }, this);
          }, this), this.setPlaceholder(), this.config.pagination) && this.paginate();
        }, t.prototype.removeAll = function() {
          this.clear(true), u.each(this.el.options, function(e2, t2) {
            this.el.remove(t2);
          }, this), u.truncate(this.tree), this.items = [], this.options = [], this.data = [], this.navIndex = 0, this.requiresPagination && (this.requiresPagination = false, this.pageIndex = 1, this.pages = []), this.setPlaceholder();
        }, t.prototype.search = function(a, e2) {
          var l, c, h2, d2, t2;
          if (!this.navigating) return l = false, a || (a = this.input.value, l = true, this.removeMessage(), u.truncate(this.tree)), c = [], h2 = document.createDocumentFragment(), 0 < (a = a.trim().toLowerCase()).length ? (d2 = e2 ? u.startsWith : u.includes, u.each(this.options, function(e3, t3) {
            var n2, i3, o3, r2, s2 = this.items[t3.idx];
            d2(t3.textContent.trim().toLowerCase(), a) && !t3.disabled ? (c.push({ text: t3.textContent, value: t3.value }), l && (g(s2, h2, this.customOption), u.removeClass(s2, "excluded"), !this.customOption) && (n2 = a, o3 = (t3 = t3).textContent, n2 = new RegExp(n2, "ig"), r2 = n2.exec(o3)) && (t3.innerHTML = "", (i3 = document.createElement("span")).classList.add("selectr-match"), i3.textContent = r2[0], t3.appendChild(document.createTextNode(o3.substring(0, r2.index))), t3.appendChild(i3), t3.appendChild(document.createTextNode(o3.substring(n2.lastIndex))))) : l && u.addClass(s2, "excluded");
          }, this), l && (h2.childElementCount ? (e2 = this.items[this.navIndex], t2 = h2.querySelector(".selectr-option:not(.excluded)"), this.noResults = false, u.removeClass(e2, "active"), this.navIndex = t2.idx, u.addClass(t2, "active")) : this.config.taggable || (this.noResults = true, this.setMessage(this.config.messages.noResults)), this.tree.appendChild(h2))) : o2.call(this), c;
        }, t.prototype.toggle = function() {
          this.disabled || (this.opened ? this.close() : this.open());
        }, t.prototype.open = function() {
          var e2 = this;
          if (!this.options.length) return false;
          this.opened || this.emit("selectr.open"), this.opened = true, this.mobileDevice || this.config.nativeDropdown ? (u.addClass(this.container, "native-open"), this.config.data && u.each(this.options, function(e3, t2) {
            this.el.add(t2);
          }, this)) : (u.addClass(this.container, "open"), o2.call(this), this.invert(), this.tree.scrollTop = 0, u.removeClass(this.container, "notice"), this.selected.setAttribute("aria-expanded", true), this.tree.setAttribute("aria-hidden", false), this.tree.setAttribute("aria-expanded", true), this.config.searchable && !this.config.taggable && setTimeout(function() {
            e2.input.focus(), e2.input.tabIndex = 0;
          }, 10));
        }, t.prototype.close = function() {
          var e2;
          this.opened && this.emit("selectr.close"), this.opened = false, this.navigating = false, this.mobileDevice || this.config.nativeDropdown ? u.removeClass(this.container, "native-open") : (e2 = u.hasClass(this.container, "notice"), this.config.searchable && !e2 && (this.input.blur(), this.input.tabIndex = -1, this.searching = false), e2 && (u.removeClass(this.container, "notice"), this.notice.textContent = ""), u.removeClass(this.container, "open"), u.removeClass(this.container, "native-open"), this.selected.setAttribute("aria-expanded", false), this.tree.setAttribute("aria-hidden", true), this.tree.setAttribute("aria-expanded", false), u.truncate(this.tree), s.call(this));
        }, t.prototype.enable = function() {
          this.disabled = false, this.el.disabled = false, this.selected.tabIndex = this.originalIndex, this.el.multiple && u.each(this.tags, function(e2, t2) {
            t2.lastElementChild.tabIndex = 0;
          }), u.removeClass(this.container, "selectr-disabled");
        }, t.prototype.disable = function(e2) {
          e2 || (this.el.disabled = true), this.selected.tabIndex = -1, this.el.multiple && u.each(this.tags, function(e3, t2) {
            t2.lastElementChild.tabIndex = -1;
          }), this.disabled = true, u.addClass(this.container, "selectr-disabled");
        }, t.prototype.reset = function() {
          this.disabled || (this.clear(), this.setSelected(true), u.each(this.defaultSelected, function(e2, t2) {
            this.select(t2);
          }, this), this.emit("selectr.reset"));
        }, t.prototype.clear = function(e2, t2) {
          var n2;
          this.el.multiple ? this.selectedIndexes.length && (n2 = this.selectedIndexes.slice(), t2 ? this.deselect(n2.slice(-1)[0]) : u.each(n2, function(e3, t3) {
            this.deselect(t3);
          }, this)) : -1 < this.selectedIndex && this.deselect(this.selectedIndex, e2), this.emit("selectr.clear");
        }, t.prototype.serialise = function(e2) {
          var i3 = [];
          return u.each(this.options, function(e3, t2) {
            var n2 = { value: t2.value, text: t2.textContent };
            t2.selected && (n2.selected = true), t2.disabled && (n2.disabled = true), i3[e3] = n2;
          }), e2 ? JSON.stringify(i3) : i3;
        }, t.prototype.serialize = function(e2) {
          return this.serialise(e2);
        }, t.prototype.setPlaceholder = function(e2) {
          e2 = e2 || this.config.placeholder || this.el.getAttribute("placeholder"), this.options.length || (e2 = this.config.messages.noOptions), this.placeEl.innerHTML = e2;
        }, t.prototype.paginate = function() {
          var n2;
          if (this.items.length) return (n2 = this).pages = this.items.map(function(e2, t2) {
            return t2 % n2.config.pagination == 0 ? n2.items.slice(t2, t2 + n2.config.pagination) : null;
          }).filter(function(e2) {
            return e2;
          }), this.pages;
        }, t.prototype.setMessage = function(e2, t2) {
          t2 && this.close(), u.addClass(this.container, "notice"), this.notice.textContent = e2;
        }, t.prototype.removeMessage = function() {
          u.removeClass(this.container, "notice"), this.notice.innerHTML = "";
        }, t.prototype.invert = function() {
          var e2 = u.rect(this.selected), t2 = this.tree.parentNode.offsetHeight, n2 = window.innerHeight;
          e2.top + e2.height + t2 > n2 ? (u.addClass(this.container, "inverted"), this.isInverted = true) : (u.removeClass(this.container, "inverted"), this.isInverted = false), this.optsRect = u.rect(this.tree);
        }, t.prototype.getOptionByIndex = function(e2) {
          return this.options[e2];
        }, t.prototype.getOptionByValue = function(e2) {
          for (var t2 = false, n2 = 0, i3 = this.options.length; n2 < i3; n2++) if (this.options[n2].value.trim() === e2.toString().trim()) {
            t2 = this.options[n2];
            break;
          }
          return t2;
        }, e.exports = t;
      }, 4188: function(e, t, n2) {
        "use strict";
        n2.d(t, { EX: function() {
          return o2;
        }, WF: function() {
          return r;
        }, oW: function() {
          return s;
        }, qD: function() {
          return i2;
        } });
        var i2 = document.body, o2 = 10485760, r = 2e4, s = 2147483648;
      }, 2602: function(e, t, n2) {
        "use strict";
        n2.d(t, { w: function() {
          return i2;
        } });
        var u = n2(9791);
        function i2(n3, e2, i3) {
          var t2, o2 = 3 < arguments.length && void 0 !== arguments[3] && arguments[3], r = "function" == typeof (a = n3).getRootNode ? a.getRootNode() : window, s = {}, a = n3.getBoundingClientRect(), l = e2.getBoundingClientRect(), c = document.createElement("div");
          function h() {
            if (c && c.parentNode) {
              for (var e3 in c.parentNode.removeChild(c), s) t3 = e3, Object.prototype.hasOwnProperty.call(s, t3) && ((t3 = s[e3]) && (0, u.removeEventListener)(r, e3, t3), delete s[e3]);
              "function" == typeof i3 && i3(n3);
            }
            var t3;
          }
          function d(e3) {
            (e3 = e3.target) === c || (0, u.isChildOf)(e3, c) || h();
          }
          return c.className = "jsoneditor-anchor", c.style.position = "absolute", c.style.left = a.left - l.left + "px", c.style.top = a.top - l.top + "px", c.style.width = a.width - 2 + "px", c.style.height = a.height - 2 + "px", c.style.boxSizing = "border-box", e2.appendChild(c), s.mousedown = (0, u.addEventListener)(r, "mousedown", d), s.mousewheel = (0, u.addEventListener)(r, "mousewheel", d), o2 && (t2 = null, c.onmouseover = function() {
            clearTimeout(t2), t2 = null;
          }, c.onmouseout = function() {
            t2 = t2 || setTimeout(h, 200);
          }), c.destroy = h, c;
        }
      }, 7923: function(e) {
        e.exports = "data:application/javascript;base64,Im5vIHVzZSBzdHJpY3QiOwohKGZ1bmN0aW9uKHdpbmRvdykgewppZiAodHlwZW9mIHdpbmRvdy53aW5kb3cgIT0gInVuZGVmaW5lZCIgJiYgd2luZG93LmRvY3VtZW50KQogICAgcmV0dXJuOwppZiAod2luZG93LnJlcXVpcmUgJiYgd2luZG93LmRlZmluZSkKICAgIHJldHVybjsKCmlmICghd2luZG93LmNvbnNvbGUpIHsKICAgIHdpbmRvdy5jb25zb2xlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1zZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOwogICAgICAgIHBvc3RNZXNzYWdlKHt0eXBlOiAibG9nIiwgZGF0YTogbXNnc30pOwogICAgfTsKICAgIHdpbmRvdy5jb25zb2xlLmVycm9yID0KICAgIHdpbmRvdy5jb25zb2xlLndhcm4gPSAKICAgIHdpbmRvdy5jb25zb2xlLmxvZyA9CiAgICB3aW5kb3cuY29uc29sZS50cmFjZSA9IHdpbmRvdy5jb25zb2xlOwp9CndpbmRvdy53aW5kb3cgPSB3aW5kb3c7CndpbmRvdy5hY2UgPSB3aW5kb3c7Cgp3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZpbGUsIGxpbmUsIGNvbCwgZXJyKSB7CiAgICBwb3N0TWVzc2FnZSh7dHlwZTogImVycm9yIiwgZGF0YTogewogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgZGF0YTogZXJyICYmIGVyci5kYXRhLAogICAgICAgIGZpbGU6IGZpbGUsCiAgICAgICAgbGluZTogbGluZSwgCiAgICAgICAgY29sOiBjb2wsCiAgICAgICAgc3RhY2s6IGVyciAmJiBlcnIuc3RhY2sKICAgIH19KTsKfTsKCndpbmRvdy5ub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgewogICAgLy8gbm9ybWFsaXplIHBsdWdpbiByZXF1aXJlcwogICAgaWYgKG1vZHVsZU5hbWUuaW5kZXhPZigiISIpICE9PSAtMSkgewogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyB3aW5kb3cubm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBjaHVua3NbMV0pOwogICAgfQogICAgLy8gbm9ybWFsaXplIHJlbGF0aXZlIHJlcXVpcmVzCiAgICBpZiAobW9kdWxlTmFtZS5jaGFyQXQoMCkgPT0gIi4iKSB7CiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7CiAgICAgICAgbW9kdWxlTmFtZSA9IChiYXNlID8gYmFzZSArICIvIiA6ICIiKSArIG1vZHVsZU5hbWU7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKG1vZHVsZU5hbWUuaW5kZXhPZigiLiIpICE9PSAtMSAmJiBwcmV2aW91cyAhPSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgIG1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lLnJlcGxhY2UoL15cLlwvLywgIiIpLnJlcGxhY2UoL1wvXC5cLy8sICIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCAiIik7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gbW9kdWxlTmFtZTsKfTsKCndpbmRvdy5yZXF1aXJlID0gZnVuY3Rpb24gcmVxdWlyZShwYXJlbnRJZCwgaWQpIHsKICAgIGlmICghaWQpIHsKICAgICAgICBpZCA9IHBhcmVudElkOwogICAgICAgIHBhcmVudElkID0gbnVsbDsKICAgIH0KICAgIGlmICghaWQuY2hhckF0KQogICAgICAgIHRocm93IG5ldyBFcnJvcigid29ya2VyLmpzIHJlcXVpcmUoKSBhY2NlcHRzIG9ubHkgKHBhcmVudElkLCBpZCkgYXMgYXJndW1lbnRzIik7CgogICAgaWQgPSB3aW5kb3cubm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBpZCk7CgogICAgdmFyIG1vZHVsZSA9IHdpbmRvdy5yZXF1aXJlLm1vZHVsZXNbaWRdOwogICAgaWYgKG1vZHVsZSkgewogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7CiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbW9kdWxlLmZhY3RvcnkoKS5leHBvcnRzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAgICB9CiAgIAogICAgaWYgKCF3aW5kb3cucmVxdWlyZS50bG5zKQogICAgICAgIHJldHVybiBjb25zb2xlLmxvZygidW5hYmxlIHRvIGxvYWQgIiArIGlkKTsKICAgIAogICAgdmFyIHBhdGggPSByZXNvbHZlTW9kdWxlSWQoaWQsIHdpbmRvdy5yZXF1aXJlLnRsbnMpOwogICAgaWYgKHBhdGguc2xpY2UoLTMpICE9ICIuanMiKSBwYXRoICs9ICIuanMiOwogICAgCiAgICB3aW5kb3cucmVxdWlyZS5pZCA9IGlkOwogICAgd2luZG93LnJlcXVpcmUubW9kdWxlc1tpZF0gPSB7fTsgLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIG9uIGJyb2tlbiBtb2R1bGVzCiAgICBpbXBvcnRTY3JpcHRzKHBhdGgpOwogICAgcmV0dXJuIHdpbmRvdy5yZXF1aXJlKHBhcmVudElkLCBpZCk7Cn07CmZ1bmN0aW9uIHJlc29sdmVNb2R1bGVJZChpZCwgcGF0aHMpIHsKICAgIHZhciB0ZXN0UGF0aCA9IGlkLCB0YWlsID0gIiI7CiAgICB3aGlsZSAodGVzdFBhdGgpIHsKICAgICAgICB2YXIgYWxpYXMgPSBwYXRoc1t0ZXN0UGF0aF07CiAgICAgICAgaWYgKHR5cGVvZiBhbGlhcyA9PSAic3RyaW5nIikgewogICAgICAgICAgICByZXR1cm4gYWxpYXMgKyB0YWlsOwogICAgICAgIH0gZWxzZSBpZiAoYWxpYXMpIHsKICAgICAgICAgICAgcmV0dXJuICBhbGlhcy5sb2NhdGlvbi5yZXBsYWNlKC9cLyokLywgIi8iKSArICh0YWlsIHx8IGFsaWFzLm1haW4gfHwgYWxpYXMubmFtZSk7CiAgICAgICAgfSBlbHNlIGlmIChhbGlhcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICB2YXIgaSA9IHRlc3RQYXRoLmxhc3RJbmRleE9mKCIvIik7CiAgICAgICAgaWYgKGkgPT09IC0xKSBicmVhazsKICAgICAgICB0YWlsID0gdGVzdFBhdGguc3Vic3RyKGkpICsgdGFpbDsKICAgICAgICB0ZXN0UGF0aCA9IHRlc3RQYXRoLnNsaWNlKDAsIGkpOwogICAgfQogICAgcmV0dXJuIGlkOwp9CndpbmRvdy5yZXF1aXJlLm1vZHVsZXMgPSB7fTsKd2luZG93LnJlcXVpcmUudGxucyA9IHt9OwoKd2luZG93LmRlZmluZSA9IGZ1bmN0aW9uKGlkLCBkZXBzLCBmYWN0b3J5KSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgZmFjdG9yeSA9IGRlcHM7CiAgICAgICAgaWYgKHR5cGVvZiBpZCAhPSAic3RyaW5nIikgewogICAgICAgICAgICBkZXBzID0gaWQ7CiAgICAgICAgICAgIGlkID0gd2luZG93LnJlcXVpcmUuaWQ7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmYWN0b3J5ID0gaWQ7CiAgICAgICAgZGVwcyA9IFtdOwogICAgICAgIGlkID0gd2luZG93LnJlcXVpcmUuaWQ7CiAgICB9CiAgICAKICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPSAiZnVuY3Rpb24iKSB7CiAgICAgICAgd2luZG93LnJlcXVpcmUubW9kdWxlc1tpZF0gPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IGZhY3RvcnksCiAgICAgICAgICAgIGluaXRpYWxpemVkOiB0cnVlCiAgICAgICAgfTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFkZXBzLmxlbmd0aCkKICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBkZXBlbmRlbmNpZXMsIHdlIGluamVjdCAicmVxdWlyZSIsICJleHBvcnRzIiBhbmQKICAgICAgICAvLyAibW9kdWxlIiBhcyBkZXBlbmRlbmNpZXMsIHRvIHByb3ZpZGUgQ29tbW9uSlMgY29tcGF0aWJpbGl0eS4KICAgICAgICBkZXBzID0gWyJyZXF1aXJlIiwgImV4cG9ydHMiLCAibW9kdWxlIl07CgogICAgdmFyIHJlcSA9IGZ1bmN0aW9uKGNoaWxkSWQpIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVpcmUoaWQsIGNoaWxkSWQpOwogICAgfTsKCiAgICB3aW5kb3cucmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsKICAgICAgICBleHBvcnRzOiB7fSwKICAgICAgICBmYWN0b3J5OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG1vZHVsZSA9IHRoaXM7CiAgICAgICAgICAgIHZhciByZXR1cm5FeHBvcnRzID0gZmFjdG9yeS5hcHBseSh0aGlzLCBkZXBzLnNsaWNlKDAsIGZhY3RvcnkubGVuZ3RoKS5tYXAoZnVuY3Rpb24oZGVwKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcCkgewogICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgInJlcXVpcmUiLCAiZXhwb3J0cyIgYW5kICJtb2R1bGUiIGFyZW4ndCBhY3R1YWwKICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMsIHdlIG11c3QgaGFuZGxlIHRoZW0gc2VwZXJhdGVseS4KICAgICAgICAgICAgICAgICAgICBjYXNlICJyZXF1aXJlIjogcmV0dXJuIHJlcTsKICAgICAgICAgICAgICAgICAgICBjYXNlICJleHBvcnRzIjogcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIm1vZHVsZSI6ICByZXR1cm4gbW9kdWxlOwogICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBmb3IgYWxsIG90aGVyIGRlcGVuZGVuY2llcywgd2UgY2FuIGp1c3QgZ28gYWhlYWQgYW5kCiAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSB0aGVtLgogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICByZXR1cm4gcmVxKGRlcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKHJldHVybkV4cG9ydHMpCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7CiAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgfQogICAgfTsKfTsKd2luZG93LmRlZmluZS5hbWQgPSB7fTsKd2luZG93LnJlcXVpcmUudGxucyA9IHt9Owp3aW5kb3cuaW5pdEJhc2VVcmxzICA9IGZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsKICAgIGZvciAodmFyIGkgaW4gdG9wTGV2ZWxOYW1lc3BhY2VzKQogICAgICAgIHRoaXMucmVxdWlyZS50bG5zW2ldID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOwp9OwoKd2luZG93LmluaXRTZW5kZXIgPSBmdW5jdGlvbiBpbml0U2VuZGVyKCkgewoKICAgIHZhciBFdmVudEVtaXR0ZXIgPSB3aW5kb3cucmVxdWlyZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwogICAgdmFyIG9vcCA9IHdpbmRvdy5yZXF1aXJlKCJhY2UvbGliL29vcCIpOwogICAgCiAgICB2YXIgU2VuZGVyID0gZnVuY3Rpb24oKSB7fTsKICAgIAogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIAogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFja0lkKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJjYWxsIiwKICAgICAgICAgICAgICAgIGlkOiBjYWxsYmFja0lkLAogICAgICAgICAgICAgICAgZGF0YTogZGF0YQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgCiAgICAgICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSkgewogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLAogICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAKICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7CiAgICAKICAgIHJldHVybiBuZXcgU2VuZGVyKCk7Cn07Cgp2YXIgbWFpbiA9IHdpbmRvdy5tYWluID0gbnVsbDsKdmFyIHNlbmRlciA9IHdpbmRvdy5zZW5kZXIgPSBudWxsOwoKd2luZG93Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgIHZhciBtc2cgPSBlLmRhdGE7CiAgICBpZiAobXNnLmV2ZW50ICYmIHNlbmRlcikgewogICAgICAgIHNlbmRlci5fc2lnbmFsKG1zZy5ldmVudCwgbXNnLmRhdGEpOwogICAgfQogICAgZWxzZSBpZiAobXNnLmNvbW1hbmQpIHsKICAgICAgICBpZiAobWFpblttc2cuY29tbWFuZF0pCiAgICAgICAgICAgIG1haW5bbXNnLmNvbW1hbmRdLmFwcGx5KG1haW4sIG1zZy5hcmdzKTsKICAgICAgICBlbHNlIGlmICh3aW5kb3dbbXNnLmNvbW1hbmRdKQogICAgICAgICAgICB3aW5kb3dbbXNnLmNvbW1hbmRdLmFwcGx5KHdpbmRvdywgbXNnLmFyZ3MpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbW1hbmQ6IiArIG1zZy5jb21tYW5kKTsKICAgIH0KICAgIGVsc2UgaWYgKG1zZy5pbml0KSB7CiAgICAgICAgd2luZG93LmluaXRCYXNlVXJscyhtc2cudGxucyk7CiAgICAgICAgc2VuZGVyID0gd2luZG93LnNlbmRlciA9IHdpbmRvdy5pbml0U2VuZGVyKCk7CiAgICAgICAgdmFyIGNsYXp6ID0gdGhpcy5yZXF1aXJlKG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOwogICAgICAgIG1haW4gPSB3aW5kb3cubWFpbiA9IG5ldyBjbGF6eihzZW5kZXIpOwogICAgfQp9Owp9KSh0aGlzKTsKCmFjZS5kZWZpbmUoImFjZS9saWIvb29wIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CmV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbiAoY3Rvciwgc3VwZXJDdG9yKSB7CiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjsKICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7CiAgICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICAgICAgdmFsdWU6IGN0b3IsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgfQogICAgfSk7Cn07CmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbiAob2JqLCBtaXhpbikgewogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7CiAgICAgICAgb2JqW2tleV0gPSBtaXhpbltrZXldOwogICAgfQogICAgcmV0dXJuIG9iajsKfTsKZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbiAocHJvdG8sIG1peGluKSB7CiAgICBleHBvcnRzLm1peGluKHByb3RvLCBtaXhpbik7Cn07Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9hcHBseV9kZWx0YSIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7InVzZSBzdHJpY3QiOwpmdW5jdGlvbiB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsIGVycm9yVGV4dCkgewogICAgY29uc29sZS5sb2coIkludmFsaWQgRGVsdGE6IiwgZGVsdGEpOwogICAgdGhyb3cgIkludmFsaWQgRGVsdGE6ICIgKyBlcnJvclRleHQ7Cn0KZnVuY3Rpb24gcG9zaXRpb25JbkRvY3VtZW50KGRvY0xpbmVzLCBwb3NpdGlvbikgewogICAgcmV0dXJuIHBvc2l0aW9uLnJvdyA+PSAwICYmIHBvc2l0aW9uLnJvdyA8IGRvY0xpbmVzLmxlbmd0aCAmJgogICAgICAgIHBvc2l0aW9uLmNvbHVtbiA+PSAwICYmIHBvc2l0aW9uLmNvbHVtbiA8PSBkb2NMaW5lc1twb3NpdGlvbi5yb3ddLmxlbmd0aDsKfQpmdW5jdGlvbiB2YWxpZGF0ZURlbHRhKGRvY0xpbmVzLCBkZWx0YSkgewogICAgaWYgKGRlbHRhLmFjdGlvbiAhPSAiaW5zZXJ0IiAmJiBkZWx0YS5hY3Rpb24gIT0gInJlbW92ZSIpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuYWN0aW9uIG11c3QgYmUgJ2luc2VydCcgb3IgJ3JlbW92ZSciKTsKICAgIGlmICghKGRlbHRhLmxpbmVzIGluc3RhbmNlb2YgQXJyYXkpKQogICAgICAgIHRocm93RGVsdGFFcnJvcihkZWx0YSwgImRlbHRhLmxpbmVzIG11c3QgYmUgYW4gQXJyYXkiKTsKICAgIGlmICghZGVsdGEuc3RhcnQgfHwgIWRlbHRhLmVuZCkKICAgICAgICB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsICJkZWx0YS5zdGFydC9lbmQgbXVzdCBiZSBhbiBwcmVzZW50Iik7CiAgICB2YXIgc3RhcnQgPSBkZWx0YS5zdGFydDsKICAgIGlmICghcG9zaXRpb25JbkRvY3VtZW50KGRvY0xpbmVzLCBkZWx0YS5zdGFydCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuc3RhcnQgbXVzdCBiZSBjb250YWluZWQgaW4gZG9jdW1lbnQiKTsKICAgIHZhciBlbmQgPSBkZWx0YS5lbmQ7CiAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmUiICYmICFwb3NpdGlvbkluRG9jdW1lbnQoZG9jTGluZXMsIGVuZCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuZW5kIG11c3QgY29udGFpbmVkIGluIGRvY3VtZW50IGZvciAncmVtb3ZlJyBhY3Rpb25zIik7CiAgICB2YXIgbnVtUmFuZ2VSb3dzID0gZW5kLnJvdyAtIHN0YXJ0LnJvdzsKICAgIHZhciBudW1SYW5nZUxhc3RMaW5lQ2hhcnMgPSAoZW5kLmNvbHVtbiAtIChudW1SYW5nZVJvd3MgPT0gMCA/IHN0YXJ0LmNvbHVtbiA6IDApKTsKICAgIGlmIChudW1SYW5nZVJvd3MgIT0gZGVsdGEubGluZXMubGVuZ3RoIC0gMSB8fCBkZWx0YS5saW5lc1tudW1SYW5nZVJvd3NdLmxlbmd0aCAhPSBudW1SYW5nZUxhc3RMaW5lQ2hhcnMpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEucmFuZ2UgbXVzdCBtYXRjaCBkZWx0YSBsaW5lcyIpOwp9CmV4cG9ydHMuYXBwbHlEZWx0YSA9IGZ1bmN0aW9uIChkb2NMaW5lcywgZGVsdGEsIGRvTm90VmFsaWRhdGUpIHsKICAgIHZhciByb3cgPSBkZWx0YS5zdGFydC5yb3c7CiAgICB2YXIgc3RhcnRDb2x1bW4gPSBkZWx0YS5zdGFydC5jb2x1bW47CiAgICB2YXIgbGluZSA9IGRvY0xpbmVzW3Jvd10gfHwgIiI7CiAgICBzd2l0Y2ggKGRlbHRhLmFjdGlvbikgewogICAgICAgIGNhc2UgImluc2VydCI6CiAgICAgICAgICAgIHZhciBsaW5lcyA9IGRlbHRhLmxpbmVzOwogICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICBkb2NMaW5lc1tyb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgZGVsdGEubGluZXNbMF0gKyBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtyb3csIDFdLmNvbmNhdChkZWx0YS5saW5lcyk7CiAgICAgICAgICAgICAgICBkb2NMaW5lcy5zcGxpY2UuYXBwbHkoZG9jTGluZXMsIGFyZ3MpOwogICAgICAgICAgICAgICAgZG9jTGluZXNbcm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGRvY0xpbmVzW3Jvd107CiAgICAgICAgICAgICAgICBkb2NMaW5lc1tyb3cgKyBkZWx0YS5saW5lcy5sZW5ndGggLSAxXSArPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmVtb3ZlIjoKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IGRlbHRhLmVuZC5jb2x1bW47CiAgICAgICAgICAgIHZhciBlbmRSb3cgPSBkZWx0YS5lbmQucm93OwogICAgICAgICAgICBpZiAocm93ID09PSBlbmRSb3cpIHsKICAgICAgICAgICAgICAgIGRvY0xpbmVzW3Jvd10gPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG9jTGluZXMuc3BsaWNlKHJvdywgZW5kUm93IC0gcm93ICsgMSwgbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgZG9jTGluZXNbZW5kUm93XS5zdWJzdHJpbmcoZW5kQ29sdW1uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn07Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9saWIvZXZlbnRfZW1pdHRlciIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7InVzZSBzdHJpY3QiOwp2YXIgRXZlbnRFbWl0dGVyID0ge307CnZhciBzdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsgfTsKdmFyIHByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9OwpFdmVudEVtaXR0ZXIuX2VtaXQgPQogICAgRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZSkgewogICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwgKHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB7fSk7CiAgICAgICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8ICh0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB7fSk7CiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSB8fCBbXTsKICAgICAgICB2YXIgZGVmYXVsdEhhbmRsZXIgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWxpc3RlbmVycy5sZW5ndGggJiYgIWRlZmF1bHRIYW5kbGVyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBlICE9ICJvYmplY3QiIHx8ICFlKQogICAgICAgICAgICBlID0ge307CiAgICAgICAgaWYgKCFlLnR5cGUpCiAgICAgICAgICAgIGUudHlwZSA9IGV2ZW50TmFtZTsKICAgICAgICBpZiAoIWUuc3RvcFByb3BhZ2F0aW9uKQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IHN0b3BQcm9wYWdhdGlvbjsKICAgICAgICBpZiAoIWUucHJldmVudERlZmF1bHQpCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgPSBwcmV2ZW50RGVmYXVsdDsKICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsaXN0ZW5lcnNbaV0oZSwgdGhpcyk7CiAgICAgICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKGUsIHRoaXMpOwogICAgfTsKRXZlbnRFbWl0dGVyLl9zaWduYWwgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlKSB7CiAgICB2YXIgbGlzdGVuZXJzID0gKHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge30pW2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICByZXR1cm47CiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQogICAgICAgIGxpc3RlbmVyc1tpXShlLCB0aGlzKTsKfTsKRXZlbnRFbWl0dGVyLm9uY2UgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMub24oZXZlbnROYW1lLCBmdW5jdGlvbiBuZXdDYWxsYmFjaygpIHsKICAgICAgICBfc2VsZi5vZmYoZXZlbnROYW1lLCBuZXdDYWxsYmFjayk7CiAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIH0pOwogICAgaWYgKCFjYWxsYmFjaykgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgICAgICBjYWxsYmFjayA9IHJlc29sdmU7CiAgICAgICAgfSk7CiAgICB9Cn07CkV2ZW50RW1pdHRlci5zZXREZWZhdWx0SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnM7CiAgICBpZiAoIWhhbmRsZXJzKQogICAgICAgIGhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0geyBfZGlzYWJsZWRfOiB7fSB9OwogICAgaWYgKGhhbmRsZXJzW2V2ZW50TmFtZV0pIHsKICAgICAgICB2YXIgb2xkID0gaGFuZGxlcnNbZXZlbnROYW1lXTsKICAgICAgICB2YXIgZGlzYWJsZWQgPSBoYW5kbGVycy5fZGlzYWJsZWRfW2V2ZW50TmFtZV07CiAgICAgICAgaWYgKCFkaXNhYmxlZCkKICAgICAgICAgICAgaGFuZGxlcnMuX2Rpc2FibGVkX1tldmVudE5hbWVdID0gZGlzYWJsZWQgPSBbXTsKICAgICAgICBkaXNhYmxlZC5wdXNoKG9sZCk7CiAgICAgICAgdmFyIGkgPSBkaXNhYmxlZC5pbmRleE9mKGNhbGxiYWNrKTsKICAgICAgICBpZiAoaSAhPSAtMSkKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQogICAgaGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOwp9OwpFdmVudEVtaXR0ZXIucmVtb3ZlRGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzOwogICAgaWYgKCFoYW5kbGVycykKICAgICAgICByZXR1cm47CiAgICB2YXIgZGlzYWJsZWQgPSBoYW5kbGVycy5fZGlzYWJsZWRfW2V2ZW50TmFtZV07CiAgICBpZiAoaGFuZGxlcnNbZXZlbnROYW1lXSA9PSBjYWxsYmFjaykgewogICAgICAgIGlmIChkaXNhYmxlZCkKICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0SGFuZGxlcihldmVudE5hbWUsIGRpc2FibGVkLnBvcCgpKTsKICAgIH0KICAgIGVsc2UgaWYgKGRpc2FibGVkKSB7CiAgICAgICAgdmFyIGkgPSBkaXNhYmxlZC5pbmRleE9mKGNhbGxiYWNrKTsKICAgICAgICBpZiAoaSAhPSAtMSkKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQp9OwpFdmVudEVtaXR0ZXIub24gPQogICAgRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaywgY2FwdHVyaW5nKSB7CiAgICAgICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307CiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICAgICAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107CiAgICAgICAgaWYgKGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKSA9PSAtMSkKICAgICAgICAgICAgbGlzdGVuZXJzW2NhcHR1cmluZyA/ICJ1bnNoaWZ0IiA6ICJwdXNoIl0oY2FsbGJhY2spOwogICAgICAgIHJldHVybiBjYWxsYmFjazsKICAgIH07CkV2ZW50RW1pdHRlci5vZmYgPQogICAgRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyID0KICAgICAgICBFdmVudEVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9OwogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgICAgICAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spOwogICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKQogICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgfTsKRXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHsKICAgIGlmICghZXZlbnROYW1lKQogICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5fZXZlbnRSZWdpc3RyeSkKICAgICAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gPSB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5fZGVmYXVsdEhhbmRsZXJzKQogICAgICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gdW5kZWZpbmVkOwp9OwpleHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL3JhbmdlIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CnZhciBjb21wYXJlUG9pbnRzID0gZnVuY3Rpb24gKHAxLCBwMikgewogICAgcmV0dXJuIHAxLnJvdyAtIHAyLnJvdyB8fCBwMS5jb2x1bW4gLSBwMi5jb2x1bW47Cn07CnZhciBSYW5nZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsKICAgICAgICB0aGlzLnN0YXJ0ID0gewogICAgICAgICAgICByb3c6IHN0YXJ0Um93LAogICAgICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVuZCA9IHsKICAgICAgICAgICAgcm93OiBlbmRSb3csCiAgICAgICAgICAgIGNvbHVtbjogZW5kQ29sdW1uCiAgICAgICAgfTsKICAgIH0KICAgIFJhbmdlLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09PSByYW5nZS5zdGFydC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5lbmQucm93ID09PSByYW5nZS5lbmQucm93ICYmCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID09PSByYW5nZS5zdGFydC5jb2x1bW4gJiYKICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID09PSByYW5nZS5lbmQuY29sdW1uOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gKCJSYW5nZTogWyIgKyB0aGlzLnN0YXJ0LnJvdyArICIvIiArIHRoaXMuc3RhcnQuY29sdW1uICsKICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDA7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBjbXAsIGVuZCA9IHJhbmdlLmVuZCwgc3RhcnQgPSByYW5nZS5zdGFydDsKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7CiAgICAgICAgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY21wID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiAtMjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDQyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uIChwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb250YWluc1JhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLnN0YXJ0KSA9PSAwICYmIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLmVuZCkgPT0gMDsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmVSYW5nZShyYW5nZSk7CiAgICAgICAgcmV0dXJuIChjbXAgPT0gLTEgfHwgY21wID09IDAgfHwgY21wID09IDEpOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5pc0VuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmlzU3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuc2V0U3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93OwogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLnNldEVuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmluc2lkZSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pIHx8IHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaW5zaWRlU3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5pbnNpZGVFbmQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgewogICAgICAgICAgICBpZiAocm93ID09PSB0aGlzLnN0YXJ0LnJvdykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8IHRoaXMuc3RhcnQuY29sdW1uID8gLTEgOiAoY29sdW1uID4gdGhpcy5lbmQuY29sdW1uID8gMSA6IDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyb3cgPCB0aGlzLnN0YXJ0LnJvdykKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQogICAgICAgICAgICByZXR1cm4gY29sdW1uID49IHRoaXMuc3RhcnQuY29sdW1uID8gMCA6IC0xOwogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT09IHJvdykKICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsKICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGFyZVN0YXJ0ID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb21wYXJlRW5kID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGFyZUluc2lkZSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jbGlwUm93cyA9IGZ1bmN0aW9uIChmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPiBsYXN0Um93KQogICAgICAgICAgICB2YXIgZW5kID0geyByb3c6IGxhc3RSb3cgKyAxLCBjb2x1bW46IDAgfTsKICAgICAgICBlbHNlIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykKICAgICAgICAgICAgdmFyIGVuZCA9IHsgcm93OiBmaXJzdFJvdywgY29sdW1uOiAwIH07CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykKICAgICAgICAgICAgdmFyIHN0YXJ0ID0geyByb3c6IGxhc3RSb3cgKyAxLCBjb2x1bW46IDAgfTsKICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7IHJvdzogZmlyc3RSb3csIGNvbHVtbjogMCB9OwogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIGlmIChjbXAgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9OwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyIGVuZCA9IHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH07CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT09IHRoaXMuZW5kLmNvbHVtbik7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29sbGFwc2VSb3dzID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0aGlzLmVuZC5jb2x1bW4gPT0gMCkKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdyAtIDEpLCAwKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIHRoaXMuZW5kLnJvdywgMCk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbiAoc2Vzc2lvbikgewogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9IHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpOwogICAgICAgIHZhciBzY3JlZW5Qb3NFbmQgPSBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7CiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzY3JlZW5Qb3NTdGFydC5yb3csIHNjcmVlblBvc1N0YXJ0LmNvbHVtbiwgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbik7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuc3RhcnQucm93ICs9IHJvdzsKICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiArPSBjb2x1bW47CiAgICAgICAgdGhpcy5lbmQucm93ICs9IHJvdzsKICAgICAgICB0aGlzLmVuZC5jb2x1bW4gKz0gY29sdW1uOwogICAgfTsKICAgIHJldHVybiBSYW5nZTsKfSgpKTsKUmFuZ2UuZnJvbVBvaW50cyA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uLCBlbmQucm93LCBlbmQuY29sdW1uKTsKfTsKUmFuZ2UuY29tcGFyZVBvaW50cyA9IGNvbXBhcmVQb2ludHM7ClJhbmdlLmNvbXBhcmVQb2ludHMgPSBmdW5jdGlvbiAocDEsIHAyKSB7CiAgICByZXR1cm4gcDEucm93IC0gcDIucm93IHx8IHAxLmNvbHVtbiAtIHAyLmNvbHVtbjsKfTsKZXhwb3J0cy5SYW5nZSA9IFJhbmdlOwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvYW5jaG9yIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7CnZhciBBbmNob3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBBbmNob3IoZG9jLCByb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMuYXR0YWNoKGRvYyk7CiAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LnJvdywgcm93LmNvbHVtbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsKICAgIH0KICAgIEFuY2hvci5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsKICAgIH07CiAgICBBbmNob3IucHJvdG90eXBlLmdldERvY3VtZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50OwogICAgfTsKICAgIEFuY2hvci5wcm90b3R5cGUub25DaGFuZ2UgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICBpZiAoZGVsdGEuc3RhcnQucm93ID09IGRlbHRhLmVuZC5yb3cgJiYgZGVsdGEuc3RhcnQucm93ICE9IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGRlbHRhLnN0YXJ0LnJvdyA+IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBvaW50ID0gJGdldFRyYW5zZm9ybWVkUG9pbnQoZGVsdGEsIHsgcm93OiB0aGlzLnJvdywgY29sdW1uOiB0aGlzLmNvbHVtbiB9LCB0aGlzLiRpbnNlcnRSaWdodCk7CiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihwb2ludC5yb3csIHBvaW50LmNvbHVtbiwgdHJ1ZSk7CiAgICB9OwogICAgQW5jaG9yLnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbiwgbm9DbGlwKSB7CiAgICAgICAgdmFyIHBvczsKICAgICAgICBpZiAobm9DbGlwKSB7CiAgICAgICAgICAgIHBvcyA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBvcyA9IHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5yb3cgPT0gcG9zLnJvdyAmJiB0aGlzLmNvbHVtbiA9PSBwb3MuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIG9sZCA9IHsKICAgICAgICAgICAgcm93OiB0aGlzLnJvdywKICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbgogICAgICAgIH07CiAgICAgICAgdGhpcy5yb3cgPSBwb3Mucm93OwogICAgICAgIHRoaXMuY29sdW1uID0gcG9zLmNvbHVtbjsKICAgICAgICB0aGlzLl9zaWduYWwoImNoYW5nZSIsIHsKICAgICAgICAgICAgb2xkOiBvbGQsCiAgICAgICAgICAgIHZhbHVlOiBwb3MKICAgICAgICB9KTsKICAgIH07CiAgICBBbmNob3IucHJvdG90eXBlLmRldGFjaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLmRvY3VtZW50Lm9mZigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOwogICAgfTsKICAgIEFuY2hvci5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24gKGRvYykgewogICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2MgfHwgdGhpcy5kb2N1bWVudDsKICAgICAgICB0aGlzLmRvY3VtZW50Lm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7CiAgICB9OwogICAgQW5jaG9yLnByb3RvdHlwZS4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHZhciBwb3MgPSB7fTsKICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcG9zLnJvdyA9IDA7CiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOwogICAgICAgIH0KICAgICAgICBpZiAoY29sdW1uIDwgMCkKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7CiAgICAgICAgcmV0dXJuIHBvczsKICAgIH07CiAgICByZXR1cm4gQW5jaG9yOwp9KCkpOwpBbmNob3IucHJvdG90eXBlLiRpbnNlcnRSaWdodCA9IGZhbHNlOwpvb3AuaW1wbGVtZW50KEFuY2hvci5wcm90b3R5cGUsIEV2ZW50RW1pdHRlcik7CmZ1bmN0aW9uICRwb2ludHNJbk9yZGVyKHBvaW50MSwgcG9pbnQyLCBlcXVhbFBvaW50c0luT3JkZXIpIHsKICAgIHZhciBiQ29sSXNBZnRlciA9IGVxdWFsUG9pbnRzSW5PcmRlciA/IHBvaW50MS5jb2x1bW4gPD0gcG9pbnQyLmNvbHVtbiA6IHBvaW50MS5jb2x1bW4gPCBwb2ludDIuY29sdW1uOwogICAgcmV0dXJuIChwb2ludDEucm93IDwgcG9pbnQyLnJvdykgfHwgKHBvaW50MS5yb3cgPT0gcG9pbnQyLnJvdyAmJiBiQ29sSXNBZnRlcik7Cn0KZnVuY3Rpb24gJGdldFRyYW5zZm9ybWVkUG9pbnQoZGVsdGEsIHBvaW50LCBtb3ZlSWZFcXVhbCkgewogICAgdmFyIGRlbHRhSXNJbnNlcnQgPSBkZWx0YS5hY3Rpb24gPT0gImluc2VydCI7CiAgICB2YXIgZGVsdGFSb3dTaGlmdCA9IChkZWx0YUlzSW5zZXJ0ID8gMSA6IC0xKSAqIChkZWx0YS5lbmQucm93IC0gZGVsdGEuc3RhcnQucm93KTsKICAgIHZhciBkZWx0YUNvbFNoaWZ0ID0gKGRlbHRhSXNJbnNlcnQgPyAxIDogLTEpICogKGRlbHRhLmVuZC5jb2x1bW4gLSBkZWx0YS5zdGFydC5jb2x1bW4pOwogICAgdmFyIGRlbHRhU3RhcnQgPSBkZWx0YS5zdGFydDsKICAgIHZhciBkZWx0YUVuZCA9IGRlbHRhSXNJbnNlcnQgPyBkZWx0YVN0YXJ0IDogZGVsdGEuZW5kOyAvLyBDb2xsYXBzZSBpbnNlcnQgcmFuZ2UuCiAgICBpZiAoJHBvaW50c0luT3JkZXIocG9pbnQsIGRlbHRhU3RhcnQsIG1vdmVJZkVxdWFsKSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdzogcG9pbnQucm93LAogICAgICAgICAgICBjb2x1bW46IHBvaW50LmNvbHVtbgogICAgICAgIH07CiAgICB9CiAgICBpZiAoJHBvaW50c0luT3JkZXIoZGVsdGFFbmQsIHBvaW50LCAhbW92ZUlmRXF1YWwpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcm93OiBwb2ludC5yb3cgKyBkZWx0YVJvd1NoaWZ0LAogICAgICAgICAgICBjb2x1bW46IHBvaW50LmNvbHVtbiArIChwb2ludC5yb3cgPT0gZGVsdGFFbmQucm93ID8gZGVsdGFDb2xTaGlmdCA6IDApCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgcm93OiBkZWx0YVN0YXJ0LnJvdywKICAgICAgICBjb2x1bW46IGRlbHRhU3RhcnQuY29sdW1uCiAgICB9Owp9CmV4cG9ydHMuQW5jaG9yID0gQW5jaG9yOwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvZG9jdW1lbnQiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpeyJ1c2Ugc3RyaWN0IjsKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgYXBwbHlEZWx0YSA9IHJlcXVpcmUoIi4vYXBwbHlfZGVsdGEiKS5hcHBseURlbHRhOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7CnZhciBEb2N1bWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIERvY3VtZW50KHRleHRPckxpbmVzKSB7CiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgICAgIGlmICh0ZXh0T3JMaW5lcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRleHRPckxpbmVzKSkgewogICAgICAgICAgICB0aGlzLmluc2VydE1lcmdlZExpbmVzKHsgcm93OiAwLCBjb2x1bW46IDAgfSwgdGV4dE9yTGluZXMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5pbnNlcnQoeyByb3c6IDAsIGNvbHVtbjogMCB9LCB0ZXh0T3JMaW5lcyk7CiAgICAgICAgfQogICAgfQogICAgRG9jdW1lbnQucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICB2YXIgbGVuID0gdGhpcy5nZXRMZW5ndGgoKSAtIDE7CiAgICAgICAgdGhpcy5yZW1vdmUobmV3IFJhbmdlKDAsIDAsIGxlbiwgdGhpcy5nZXRMaW5lKGxlbikubGVuZ3RoKSk7CiAgICAgICAgdGhpcy5pbnNlcnQoeyByb3c6IDAsIGNvbHVtbjogMCB9LCB0ZXh0IHx8ICIiKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kZGV0ZWN0TmV3TGluZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTsKICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9IG1hdGNoID8gbWF0Y2hbMV0gOiAiXG4iOwogICAgICAgIHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0TmV3TGluZUNoYXJhY3RlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7CiAgICAgICAgICAgIGNhc2UgIndpbmRvd3MiOgogICAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKICAgICAgICAgICAgY2FzZSAidW5peCI6CiAgICAgICAgICAgICAgICByZXR1cm4gIlxuIjsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRhdXRvTmV3TGluZSB8fCAiXG4iOwogICAgICAgIH0KICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuc2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbiAobmV3TGluZU1vZGUpIHsKICAgICAgICBpZiAodGhpcy4kbmV3TGluZU1vZGUgPT09IG5ld0xpbmVNb2RlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsKICAgICAgICB0aGlzLl9zaWduYWwoImNoYW5nZU5ld0xpbmVNb2RlIik7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLiRuZXdMaW5lTW9kZTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaXNOZXdMaW5lID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lID0gZnVuY3Rpb24gKHJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyb3ddIHx8ICIiOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lcyA9IGZ1bmN0aW9uIChmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRBbGxMaW5lcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExlbmd0aCgpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5sZW5ndGg7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzRm9yUmFuZ2UocmFuZ2UpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lc0ZvclJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgdmFyIGxpbmVzOwogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJhbmdlLmVuZC5yb3cpIHsKICAgICAgICAgICAgbGluZXMgPSBbdGhpcy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdykuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbildOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGluZXMgPSB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyk7CiAgICAgICAgICAgIGxpbmVzWzBdID0gKGxpbmVzWzBdIHx8ICIiKS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSAxOwogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyA9PSBsKQogICAgICAgICAgICAgICAgbGluZXNbbF0gPSBsaW5lc1tsXS5zdWJzdHJpbmcoMCwgcmFuZ2UuZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lczsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbiAocm93LCBsaW5lcykgewogICAgICAgIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydExpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgaW5zZXJ0RnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydEZ1bGxMaW5lcyhyb3csIGxpbmVzKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlTGluZXMgPSBmdW5jdGlvbiAoZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5yZW1vdmVMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHJlbW92ZUZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKTsKICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVGdWxsTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TmV3TGluZSBpcyBkZXByZWNhdGVkLiBVc2UgaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIFsnJywgJyddKSBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydE1lcmdlZExpbmVzKHBvc2l0aW9uLCBbIiIsICIiXSk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgdGV4dCkgewogICAgICAgIGlmICh0aGlzLmdldExlbmd0aCgpIDw9IDEpCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIHRoaXMuJHNwbGl0KHRleHQpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0SW5MaW5lID0gZnVuY3Rpb24gKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5wb3MocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aCk7CiAgICAgICAgdGhpcy5hcHBseURlbHRhKHsKICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgICAgICBlbmQ6IGVuZCwKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0IiwKICAgICAgICAgICAgbGluZXM6IFt0ZXh0XQogICAgICAgIH0sIHRydWUpOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKGVuZCk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmNsaXBwZWRQb3MgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTsKICAgICAgICBpZiAocm93ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcm93ID0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChyb3cgPCAwKSB7CiAgICAgICAgICAgIHJvdyA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcm93ID0gbGVuZ3RoIC0gMTsKICAgICAgICAgICAgY29sdW1uID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOwogICAgICAgIGlmIChjb2x1bW4gPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBjb2x1bW4gPSBsaW5lLmxlbmd0aDsKICAgICAgICBjb2x1bW4gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW4sIDApLCBsaW5lLmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH07CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmNsb25lUG9zID0gZnVuY3Rpb24gKHBvcykgewogICAgICAgIHJldHVybiB7IHJvdzogcG9zLnJvdywgY29sdW1uOiBwb3MuY29sdW1uIH07CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9OwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7CiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcG9zaXRpb24ucm93ID0gTWF0aC5tYXgoMCwgbGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGggLSAxKS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBwb3NpdGlvbi5yb3cpOwogICAgICAgICAgICBwb3NpdGlvbi5jb2x1bW4gPSBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbi5jb2x1bW4sIDApLCB0aGlzLmdldExpbmUocG9zaXRpb24ucm93KS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmluc2VydEZ1bGxMaW5lcyA9IGZ1bmN0aW9uIChyb3csIGxpbmVzKSB7CiAgICAgICAgcm93ID0gTWF0aC5taW4oTWF0aC5tYXgocm93LCAwKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAgICAgICAgdmFyIGNvbHVtbiA9IDA7CiAgICAgICAgaWYgKHJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgbGluZXMgPSBsaW5lcy5jb25jYXQoWyIiXSk7CiAgICAgICAgICAgIGNvbHVtbiA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsaW5lcyA9IFsiIl0uY29uY2F0KGxpbmVzKTsKICAgICAgICAgICAgcm93LS07CiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuJGxpbmVzW3Jvd10ubGVuZ3RoOwogICAgICAgIH0KICAgICAgICB0aGlzLmluc2VydE1lcmdlZExpbmVzKHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH0sIGxpbmVzKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0TWVyZ2VkTGluZXMgPSBmdW5jdGlvbiAocG9zaXRpb24sIGxpbmVzKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICByb3c6IHN0YXJ0LnJvdyArIGxpbmVzLmxlbmd0aCAtIDEsCiAgICAgICAgICAgIGNvbHVtbjogKGxpbmVzLmxlbmd0aCA9PSAxID8gc3RhcnQuY29sdW1uIDogMCkgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgICAgICAgZW5kOiBlbmQsCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydCIsCiAgICAgICAgICAgIGxpbmVzOiBsaW5lcwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKGVuZCk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuY2xpcHBlZFBvcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbik7CiAgICAgICAgdmFyIGVuZCA9IHRoaXMuY2xpcHBlZFBvcyhyYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgIGVuZDogZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKHN0YXJ0KTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24gKHJvdywgc3RhcnRDb2x1bW4sIGVuZENvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuY2xpcHBlZFBvcyhyb3csIHN0YXJ0Q29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5jbGlwcGVkUG9zKHJvdywgZW5kQ29sdW1uKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgIGVuZDogZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KQogICAgICAgIH0sIHRydWUpOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKHN0YXJ0KTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlRnVsbExpbmVzID0gZnVuY3Rpb24gKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgZmlyc3RSb3cgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBmaXJzdFJvdyksIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICBsYXN0Um93ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgbGFzdFJvdyksIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICB2YXIgZGVsZXRlRmlyc3ROZXdMaW5lID0gbGFzdFJvdyA9PSB0aGlzLmdldExlbmd0aCgpIC0gMSAmJiBmaXJzdFJvdyA+IDA7CiAgICAgICAgdmFyIGRlbGV0ZUxhc3ROZXdMaW5lID0gbGFzdFJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkgLSAxOwogICAgICAgIHZhciBzdGFydFJvdyA9IChkZWxldGVGaXJzdE5ld0xpbmUgPyBmaXJzdFJvdyAtIDEgOiBmaXJzdFJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sID0gKGRlbGV0ZUZpcnN0TmV3TGluZSA/IHRoaXMuZ2V0TGluZShzdGFydFJvdykubGVuZ3RoIDogMCk7CiAgICAgICAgdmFyIGVuZFJvdyA9IChkZWxldGVMYXN0TmV3TGluZSA/IGxhc3RSb3cgKyAxIDogbGFzdFJvdyk7CiAgICAgICAgdmFyIGVuZENvbCA9IChkZWxldGVMYXN0TmV3TGluZSA/IDAgOiB0aGlzLmdldExpbmUoZW5kUm93KS5sZW5ndGgpOwogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2wsIGVuZFJvdywgZW5kQ29sKTsKICAgICAgICB2YXIgZGVsZXRlZExpbmVzID0gdGhpcy4kbGluZXMuc2xpY2UoZmlyc3RSb3csIGxhc3RSb3cgKyAxKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogcmFuZ2Uuc3RhcnQsCiAgICAgICAgICAgIGVuZDogcmFuZ2UuZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHJhbmdlKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBkZWxldGVkTGluZXM7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJlbW92ZU5ld0xpbmUgPSBmdW5jdGlvbiAocm93KSB7CiAgICAgICAgaWYgKHJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkgLSAxICYmIHJvdyA+PSAwKSB7CiAgICAgICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5wb3Mocm93LCB0aGlzLmdldExpbmUocm93KS5sZW5ndGgpLAogICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvcyhyb3cgKyAxLCAwKSwKICAgICAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICBsaW5lczogWyIiLCAiIl0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKHJhbmdlLCB0ZXh0KSB7CiAgICAgICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpCiAgICAgICAgICAgIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOwogICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsKICAgICAgICB2YXIgZW5kOwogICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgIGVuZCA9IHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCB0ZXh0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVuZCA9IHJhbmdlLnN0YXJ0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5hcHBseURlbHRhcyA9IGZ1bmN0aW9uIChkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmFwcGx5RGVsdGEoZGVsdGFzW2ldKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJldmVydERlbHRhcyA9IGZ1bmN0aW9uIChkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpID0gZGVsdGFzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHRoaXMucmV2ZXJ0RGVsdGEoZGVsdGFzW2ldKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmFwcGx5RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEsIGRvTm90VmFsaWRhdGUpIHsKICAgICAgICB2YXIgaXNJbnNlcnQgPSBkZWx0YS5hY3Rpb24gPT0gImluc2VydCI7CiAgICAgICAgaWYgKGlzSW5zZXJ0ID8gZGVsdGEubGluZXMubGVuZ3RoIDw9IDEgJiYgIWRlbHRhLmxpbmVzWzBdCiAgICAgICAgICAgIDogIVJhbmdlLmNvbXBhcmVQb2ludHMoZGVsdGEuc3RhcnQsIGRlbHRhLmVuZCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNJbnNlcnQgJiYgZGVsdGEubGluZXMubGVuZ3RoID4gMjAwMDApIHsKICAgICAgICAgICAgdGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGEoZGVsdGEsIDIwMDAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFwcGx5RGVsdGEodGhpcy4kbGluZXMsIGRlbHRhLCBkb05vdFZhbGlkYXRlKTsKICAgICAgICAgICAgdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLCBkZWx0YSk7CiAgICAgICAgfQogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kc2FmZUFwcGx5RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICB2YXIgZG9jTGVuZ3RoID0gdGhpcy4kbGluZXMubGVuZ3RoOwogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZSIgJiYgZGVsdGEuc3RhcnQucm93IDwgZG9jTGVuZ3RoICYmIGRlbHRhLmVuZC5yb3cgPCBkb2NMZW5ndGgKICAgICAgICAgICAgfHwgZGVsdGEuYWN0aW9uID09ICJpbnNlcnQiICYmIGRlbHRhLnN0YXJ0LnJvdyA8PSBkb2NMZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5hcHBseURlbHRhKGRlbHRhKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLiRzcGxpdEFuZGFwcGx5TGFyZ2VEZWx0YSA9IGZ1bmN0aW9uIChkZWx0YSwgTUFYKSB7CiAgICAgICAgdmFyIGxpbmVzID0gZGVsdGEubGluZXM7CiAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSBNQVggKyAxOwogICAgICAgIHZhciByb3cgPSBkZWx0YS5zdGFydC5yb3c7CiAgICAgICAgdmFyIGNvbHVtbiA9IGRlbHRhLnN0YXJ0LmNvbHVtbjsKICAgICAgICBmb3IgKHZhciBmcm9tID0gMCwgdG8gPSAwOyBmcm9tIDwgbDsgZnJvbSA9IHRvKSB7CiAgICAgICAgICAgIHRvICs9IE1BWCAtIDE7CiAgICAgICAgICAgIHZhciBjaHVuayA9IGxpbmVzLnNsaWNlKGZyb20sIHRvKTsKICAgICAgICAgICAgY2h1bmsucHVzaCgiIik7CiAgICAgICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5wb3Mocm93ICsgZnJvbSwgY29sdW1uKSwKICAgICAgICAgICAgICAgIGVuZDogdGhpcy5wb3Mocm93ICsgdG8sIGNvbHVtbiA9IDApLAogICAgICAgICAgICAgICAgYWN0aW9uOiBkZWx0YS5hY3Rpb24sCiAgICAgICAgICAgICAgICBsaW5lczogY2h1bmsKICAgICAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGRlbHRhLmxpbmVzID0gbGluZXMuc2xpY2UoZnJvbSk7CiAgICAgICAgZGVsdGEuc3RhcnQucm93ID0gcm93ICsgZnJvbTsKICAgICAgICBkZWx0YS5zdGFydC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgdGhpcy5hcHBseURlbHRhKGRlbHRhLCB0cnVlKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmV2ZXJ0RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICB0aGlzLiRzYWZlQXBwbHlEZWx0YSh7CiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNsb25lUG9zKGRlbHRhLnN0YXJ0KSwKICAgICAgICAgICAgZW5kOiB0aGlzLmNsb25lUG9zKGRlbHRhLmVuZCksCiAgICAgICAgICAgIGFjdGlvbjogKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0IiA/ICJyZW1vdmUiIDogImluc2VydCIpLAogICAgICAgICAgICBsaW5lczogZGVsdGEubGluZXMuc2xpY2UoKQogICAgICAgIH0pOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5pbmRleFRvUG9zaXRpb24gPSBmdW5jdGlvbiAoaW5kZXgsIHN0YXJ0Um93KSB7CiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kbGluZXMgfHwgdGhpcy5nZXRBbGxMaW5lcygpOwogICAgICAgIHZhciBuZXdsaW5lTGVuZ3RoID0gdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdyB8fCAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIGluZGV4IC09IGxpbmVzW2ldLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7CiAgICAgICAgICAgIGlmIChpbmRleCA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4geyByb3c6IGksIGNvbHVtbjogaW5kZXggKyBsaW5lc1tpXS5sZW5ndGggKyBuZXdsaW5lTGVuZ3RoIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJvdzogbCAtIDEsIGNvbHVtbjogaW5kZXggKyBsaW5lc1tsIC0gMV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aCB9OwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5wb3NpdGlvblRvSW5kZXggPSBmdW5jdGlvbiAocG9zLCBzdGFydFJvdykgewogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuJGxpbmVzIHx8IHRoaXMuZ2V0QWxsTGluZXMoKTsKICAgICAgICB2YXIgbmV3bGluZUxlbmd0aCA9IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aDsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHZhciByb3cgPSBNYXRoLm1pbihwb3Mucm93LCBsaW5lcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdyB8fCAwOyBpIDwgcm93OyArK2kpCiAgICAgICAgICAgIGluZGV4ICs9IGxpbmVzW2ldLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7CiAgICAgICAgcmV0dXJuIGluZGV4ICsgcG9zLmNvbHVtbjsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuJHNwbGl0ID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOwogICAgfTsKICAgIHJldHVybiBEb2N1bWVudDsKfSgpKTsKRG9jdW1lbnQucHJvdG90eXBlLiRhdXRvTmV3TGluZSA9ICIiOwpEb2N1bWVudC5wcm90b3R5cGUuJG5ld0xpbmVNb2RlID0gImF1dG8iOwpvb3AuaW1wbGVtZW50KERvY3VtZW50LnByb3RvdHlwZSwgRXZlbnRFbWl0dGVyKTsKZXhwb3J0cy5Eb2N1bWVudCA9IERvY3VtZW50OwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvbGliL2RlZXBfY29weSIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7ZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIGRlZXBDb3B5KG9iaikgewogICAgaWYgKHR5cGVvZiBvYmogIT09ICJvYmplY3QiIHx8ICFvYmopCiAgICAgICAgcmV0dXJuIG9iajsKICAgIHZhciBjb3B5OwogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICAgIGNvcHkgPSBbXTsKICAgICAgICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBvYmoubGVuZ3RoOyBrZXkrKykgewogICAgICAgICAgICBjb3B5W2tleV0gPSBkZWVwQ29weShvYmpba2V5XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb3B5OwogICAgfQogICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopICE9PSAiW29iamVjdCBPYmplY3RdIikKICAgICAgICByZXR1cm4gb2JqOwogICAgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikKICAgICAgICBjb3B5W2tleV0gPSBkZWVwQ29weShvYmpba2V5XSk7CiAgICByZXR1cm4gY29weTsKfTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL2xpYi9sYW5nIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CmV4cG9ydHMubGFzdCA9IGZ1bmN0aW9uIChhKSB7CiAgICByZXR1cm4gYVthLmxlbmd0aCAtIDFdOwp9OwpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIik7Cn07CmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsKICAgIHZhciByZXN1bHQgPSAnJzsKICAgIHdoaWxlIChjb3VudCA+IDApIHsKICAgICAgICBpZiAoY291bnQgJiAxKQogICAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nOwogICAgICAgIGlmIChjb3VudCA+Pj0gMSkKICAgICAgICAgICAgc3RyaW5nICs9IHN0cmluZzsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn07CnZhciB0cmltQmVnaW5SZWdleHAgPSAvXlxzXHMqLzsKdmFyIHRyaW1FbmRSZWdleHAgPSAvXHNccyokLzsKZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsKfTsKZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOwp9OwpleHBvcnRzLmNvcHlPYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7CiAgICB2YXIgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOwogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CmV4cG9ydHMuY29weUFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7CiAgICB2YXIgY29weSA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KGFycmF5W2ldKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJheVtpXTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwpleHBvcnRzLmRlZXBDb3B5ID0gcmVxdWlyZSgiLi9kZWVwX2NvcHkiKS5kZWVwQ29weTsKZXhwb3J0cy5hcnJheVRvTWFwID0gZnVuY3Rpb24gKGFycikgewogICAgdmFyIG1hcCA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgICBtYXBbYXJyW2ldXSA9IDE7CiAgICB9CiAgICByZXR1cm4gbWFwOwp9OwpleHBvcnRzLmNyZWF0ZU1hcCA9IGZ1bmN0aW9uIChwcm9wcykgewogICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKHZhciBpIGluIHByb3BzKSB7CiAgICAgICAgbWFwW2ldID0gcHJvcHNbaV07CiAgICB9CiAgICByZXR1cm4gbWFwOwp9OwpleHBvcnRzLmFycmF5UmVtb3ZlID0gZnVuY3Rpb24gKGFycmF5LCB2YWx1ZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAodmFsdWUgPT09IGFycmF5W2ldKSB7CiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKICAgICAgICB9CiAgICB9Cn07CmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24gKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7Cn07CmV4cG9ydHMuZXNjYXBlSFRNTCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgIHJldHVybiAoIiIgKyBzdHIpLnJlcGxhY2UoLyYvZywgIiYjMzg7IikucmVwbGFjZSgvIi9nLCAiJiMzNDsiKS5yZXBsYWNlKC8nL2csICImIzM5OyIpLnJlcGxhY2UoLzwvZywgIiYjNjA7Iik7Cn07CmV4cG9ydHMuZ2V0TWF0Y2hPZmZzZXRzID0gZnVuY3Rpb24gKHN0cmluZywgcmVnRXhwKSB7CiAgICB2YXIgbWF0Y2hlcyA9IFtdOwogICAgc3RyaW5nLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgbWF0Y2hlcy5wdXNoKHsKICAgICAgICAgICAgb2Zmc2V0OiBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDJdLAogICAgICAgICAgICBsZW5ndGg6IHN0ci5sZW5ndGgKICAgICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIG1hdGNoZXM7Cn07CmV4cG9ydHMuZGVmZXJyZWRDYWxsID0gZnVuY3Rpb24gKGZjbikgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24gKHRpbWVvdXQpIHsKICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7CiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgZmNuKCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICByZXR1cm4gZGVmZXJyZWQ7CiAgICB9OwogICAgZGVmZXJyZWQuaXNQZW5kaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aW1lcjsKICAgIH07CiAgICByZXR1cm4gZGVmZXJyZWQ7Cn07CmV4cG9ydHMuZGVsYXllZENhbGwgPSBmdW5jdGlvbiAoZmNuLCBkZWZhdWx0VGltZW91dCkgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgdmFyIF9zZWxmID0gZnVuY3Rpb24gKHRpbWVvdXQpIHsKICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkKICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IGRlZmF1bHRUaW1lb3V0KTsKICAgIH07CiAgICBfc2VsZi5kZWxheSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7CiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgZGVmYXVsdFRpbWVvdXQpOwogICAgfTsKICAgIF9zZWxmLnNjaGVkdWxlID0gX3NlbGY7CiAgICBfc2VsZi5jYWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgX3NlbGYuY2FuY2VsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgfTsKICAgIF9zZWxmLmlzUGVuZGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGltZXI7CiAgICB9OwogICAgcmV0dXJuIF9zZWxmOwp9OwpleHBvcnRzLnN1cHBvcnRzTG9va2JlaGluZCA9IGZ1bmN0aW9uICgpIHsKICAgIHRyeSB7CiAgICAgICAgbmV3IFJlZ0V4cCgnKD88PS4pJyk7CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9OwpleHBvcnRzLnN1cHBvcnRzVW5pY29kZUZsYWcgPSBmdW5jdGlvbiAoKSB7CiAgICB0cnkgewogICAgICAgIG5ldyBSZWdFeHAoJ14uJCcsICd1Jyk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL3dvcmtlci9taXJyb3IiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIERvY3VtZW50ID0gcmVxdWlyZSgiLi4vZG9jdW1lbnQiKS5Eb2N1bWVudDsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwogICAgCnZhciBNaXJyb3IgPSBleHBvcnRzLk1pcnJvciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CiAgICB2YXIgZG9jID0gdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoIiIpOwogICAgCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWxheWVkQ2FsbCh0aGlzLm9uVXBkYXRlLmJpbmQodGhpcykpOwogICAgCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgc2VuZGVyLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGRhdGEgPSBlLmRhdGE7CiAgICAgICAgaWYgKGRhdGFbMF0uc3RhcnQpIHsKICAgICAgICAgICAgZG9jLmFwcGx5RGVsdGFzKGRhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgdmFyIGQsIGVycjsgCiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2krMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgZCA9IHthY3Rpb246ICJpbnNlcnQiLCBzdGFydDogZGF0YVtpXSwgbGluZXM6IGRhdGFbaSsxXX07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGQgPSB7YWN0aW9uOiAicmVtb3ZlIiwgc3RhcnQ6IGRhdGFbaV0sIGVuZDogZGF0YVtpKzFdfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKChkLmFjdGlvbiA9PSAiaW5zZXJ0IiA/IGQuc3RhcnQgOiBkLmVuZCkucm93ID49IGRvYy4kbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCJJbnZhbGlkIGRlbHRhIik7CiAgICAgICAgICAgICAgICAgICAgZXJyLmRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IF9zZWxmLiRwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lc0xlbmd0aDogZG9jLiRsaW5lcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkLnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGQuZW5kCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZG9jLmFwcGx5RGVsdGEoZCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKF9zZWxmLiR0aW1lb3V0KQogICAgICAgICAgICByZXR1cm4gZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUoX3NlbGYuJHRpbWVvdXQpOwogICAgICAgIF9zZWxmLm9uVXBkYXRlKCk7CiAgICB9KTsKfTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy4kdGltZW91dCA9IDUwMDsKICAgIAogICAgdGhpcy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCkgewogICAgICAgIHRoaXMuJHRpbWVvdXQgPSB0aW1lb3V0OwogICAgfTsKICAgIAogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOwogICAgICAgIHRoaXMuZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUodGhpcy4kdGltZW91dCk7CiAgICB9OwogICAgCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oY2FsbGJhY2tJZCkgewogICAgICAgIHRoaXMuc2VuZGVyLmNhbGxiYWNrKHRoaXMuZG9jLmdldFZhbHVlKCksIGNhbGxiYWNrSWQpOwogICAgfTsKICAgIAogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIAogICAgdGhpcy5pc1BlbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFVwZGF0ZS5pc1BlbmRpbmcoKTsKICAgIH07CiAgICAKfSkuY2FsbChNaXJyb3IucHJvdG90eXBlKTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL21vZGUvanNvbi9qc29uX3BhcnNlIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgYXQsICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCiAgICAgICAgY2gsICAgICAvLyBUaGUgY3VycmVudCBjaGFyYWN0ZXIKICAgICAgICBlc2NhcGVlID0gewogICAgICAgICAgICAnIic6ICAnIicsCiAgICAgICAgICAgICdcXCc6ICdcXCcsCiAgICAgICAgICAgICcvJzogICcvJywKICAgICAgICAgICAgYjogICAgJ1xiJywKICAgICAgICAgICAgZjogICAgJ1xmJywKICAgICAgICAgICAgbjogICAgJ1xuJywKICAgICAgICAgICAgcjogICAgJ1xyJywKICAgICAgICAgICAgdDogICAgJ1x0JwogICAgICAgIH0sCiAgICAgICAgdGV4dCwKCiAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgewoKICAgICAgICAgICAgdGhyb3cgewogICAgICAgICAgICAgICAgbmFtZTogICAgJ1N5bnRheEVycm9yJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG0sCiAgICAgICAgICAgICAgICBhdDogICAgICBhdCwKICAgICAgICAgICAgICAgIHRleHQ6ICAgIHRleHQKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBuZXh0ID0gZnVuY3Rpb24gKGMpIHsKCiAgICAgICAgICAgIGlmIChjICYmIGMgIT09IGNoKSB7CiAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIiArIGNoICsgIiciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7CiAgICAgICAgICAgIGF0ICs9IDE7CiAgICAgICAgICAgIHJldHVybiBjaDsKICAgICAgICB9LAoKICAgICAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB2YXIgbnVtYmVyLAogICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7CgogICAgICAgICAgICBpZiAoY2ggPT09ICctJykgewogICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOwogICAgICAgICAgICAgICAgbmV4dCgnLScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoID09PSAnLicpIHsKICAgICAgICAgICAgICAgIHN0cmluZyArPSAnLic7CiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoID09PSAnZScgfHwgY2ggPT09ICdFJykgewogICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOwogICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnVtYmVyID0gK3N0cmluZzsKICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHsKICAgICAgICAgICAgICAgIGVycm9yKCJCYWQgbnVtYmVyIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgdmFyIGhleCwKICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJywKICAgICAgICAgICAgICAgIHVmZmZmOwoKICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gcGFyc2VJbnQobmV4dCgpLCAxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShoZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1ZmZmZik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVzY2FwZWVbY2hdID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGVzY2FwZWVbY2hdOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJcbiIgfHwgY2ggPT0gIlxyIikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yKCJCYWQgc3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgd2hpdGUgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB3aGlsZSAoY2ggJiYgY2ggPD0gJyAnKSB7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB3b3JkID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgIG5leHQoJ3QnKTsKICAgICAgICAgICAgICAgIG5leHQoJ3InKTsKICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgICAgIG5leHQoJ2YnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2EnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKICAgICAgICAgICAgICAgIG5leHQoJ3MnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICBuZXh0KCduJyk7CiAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7CiAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CiAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCAnIiArIGNoICsgIiciKTsKICAgICAgICB9LAoKICAgICAgICB2YWx1ZSwgIC8vIFBsYWNlIGhvbGRlciBmb3IgdGhlIHZhbHVlIGZ1bmN0aW9uLgoKICAgICAgICBhcnJheSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwoKICAgICAgICAgICAgaWYgKGNoID09PSAnWycpIHsKICAgICAgICAgICAgICAgIG5leHQoJ1snKTsKICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgewogICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7ICAgLy8gZW1wdHkgYXJyYXkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgewogICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOwogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IoIkJhZCBhcnJheSIpOwogICAgICAgIH0sCgogICAgICAgIG9iamVjdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciBrZXksCiAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKCiAgICAgICAgICAgIGlmIChjaCA9PT0gJ3snKSB7CiAgICAgICAgICAgICAgICBuZXh0KCd7Jyk7CiAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsgICAvLyBlbXB0eSBvYmplY3QKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgewogICAgICAgICAgICAgICAgICAgIGtleSA9IHN0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnOicpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgIicgKyBrZXkgKyAnIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsKICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yKCJCYWQgb2JqZWN0Iik7CiAgICAgICAgfTsKCiAgICB2YWx1ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgd2hpdGUoKTsKICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgY2FzZSAneyc6CiAgICAgICAgICAgIHJldHVybiBvYmplY3QoKTsKICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgY2FzZSAnIic6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcoKTsKICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgcmV0dXJuIG51bWJlcigpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknID8gbnVtYmVyKCkgOiB3b3JkKCk7CiAgICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSwgcmV2aXZlcikgewogICAgICAgIHZhciByZXN1bHQ7CgogICAgICAgIHRleHQgPSBzb3VyY2U7CiAgICAgICAgYXQgPSAwOwogICAgICAgIGNoID0gJyAnOwogICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7CiAgICAgICAgd2hpdGUoKTsKICAgICAgICBpZiAoY2gpIHsKICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gd2Fsayhob2xkZXIsIGtleSkgewogICAgICAgICAgICB2YXIgaywgdiwgdmFsdWUgPSBob2xkZXJba2V5XTsKICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIGZvciAoayBpbiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHdhbGsodmFsdWUsIGspOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWVba107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJldml2ZXIuY2FsbChob2xkZXIsIGtleSwgdmFsdWUpOwogICAgICAgIH0oeycnOiByZXN1bHR9LCAnJykgOiByZXN1bHQ7CiAgICB9Owp9KTsKCmFjZS5kZWZpbmUoImFjZS9tb2RlL2pzb25fd29ya2VyIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBNaXJyb3IgPSByZXF1aXJlKCIuLi93b3JrZXIvbWlycm9yIikuTWlycm9yOwp2YXIgcGFyc2UgPSByZXF1aXJlKCIuL2pzb24vanNvbl9wYXJzZSIpOwoKdmFyIEpzb25Xb3JrZXIgPSBleHBvcnRzLkpzb25Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsKICAgIE1pcnJvci5jYWxsKHRoaXMsIHNlbmRlcik7CiAgICB0aGlzLnNldFRpbWVvdXQoMjAwKTsKfTsKCm9vcC5pbmhlcml0cyhKc29uV29ya2VyLCBNaXJyb3IpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRvYy5nZXRWYWx1ZSgpOwogICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICBwYXJzZSh2YWx1ZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB2YXIgcG9zID0gdGhpcy5kb2MuaW5kZXhUb1Bvc2l0aW9uKGUuYXQtMSk7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgIHJvdzogcG9zLnJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogcG9zLmNvbHVtbiwKICAgICAgICAgICAgICAgIHRleHQ6IGUubWVzc2FnZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImFubm90YXRlIiwgZXJyb3JzKTsKICAgIH07Cgp9KS5jYWxsKEpzb25Xb3JrZXIucHJvdG90eXBlKTsKCn0pOwo=";
      }, 7907: function(e, t, n2) {
        "use strict";
        n2.d(t, { Iu: function() {
          return h;
        }, cC: function() {
          return c;
        }, m0: function() {
          return l;
        } });
        n2(4987);
        var r = { en: { array: "Array", auto: "Auto", appendText: "Append", appendTitle: "Append a new field with type 'auto' after this field (Ctrl+Shift+Ins)", appendSubmenuTitle: "Select the type of the field to be appended", appendTitleAuto: "Append a new field with type 'auto' (Ctrl+Shift+Ins)", ascending: "Ascending", ascendingTitle: "Sort the childs of this ${type} in ascending order", actionsMenu: "Click to open the actions menu (Ctrl+M)", cannotParseFieldError: "Cannot parse field into JSON", cannotParseValueError: "Cannot parse value into JSON", collapseAll: "Collapse all fields", compactTitle: "Compact JSON data, remove all whitespaces (Ctrl+Shift+I)", descending: "Descending", descendingTitle: "Sort the childs of this ${type} in descending order", drag: "Drag to move this field (Alt+Shift+Arrows)", duplicateKey: "duplicate key", duplicateText: "Duplicate", duplicateTitle: "Duplicate selected fields (Ctrl+D)", duplicateField: "Duplicate this field (Ctrl+D)", duplicateFieldError: "Duplicate field name", empty: "empty", expandAll: "Expand all fields", expandTitle: "Click to expand/collapse this field (Ctrl+E). \nCtrl+Click to expand/collapse including all childs.", formatTitle: "Format JSON data, with proper indentation and line feeds (Ctrl+I)", insert: "Insert", insertTitle: "Insert a new field with type 'auto' before this field (Ctrl+Ins)", insertSub: "Select the type of the field to be inserted", object: "Object", ok: "Ok", redo: "Redo (Ctrl+Shift+Z)", removeText: "Remove", removeTitle: "Remove selected fields (Ctrl+Del)", removeField: "Remove this field (Ctrl+Del)", repairTitle: "Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.", searchTitle: "Search fields and values", searchNextResultTitle: "Next result (Enter)", searchPreviousResultTitle: "Previous result (Shift + Enter)", selectNode: "Select a node...", showAll: "show all", showMore: "show more", showMoreStatus: "displaying ${visibleChilds} of ${totalChilds} items.", sort: "Sort", sortTitle: "Sort the childs of this ${type}", sortTitleShort: "Sort contents", sortFieldLabel: "Field:", sortDirectionLabel: "Direction:", sortFieldTitle: "Select the nested field by which to sort the array or object", sortAscending: "Ascending", sortAscendingTitle: "Sort the selected field in ascending order", sortDescending: "Descending", sortDescendingTitle: "Sort the selected field in descending order", string: "String", transform: "Transform", transformTitle: "Filter, sort, or transform the childs of this ${type}", transformTitleShort: "Filter, sort, or transform contents", extract: "Extract", extractTitle: "Extract this ${type}", transformQueryTitle: "Enter a JMESPath query", transformWizardLabel: "Wizard", transformWizardFilter: "Filter", transformWizardSortBy: "Sort by", transformWizardSelectFields: "Select fields", transformQueryLabel: "Query", transformPreviewLabel: "Preview", type: "Type", typeTitle: "Change the type of this field", openUrl: "Ctrl+Click or Ctrl+Enter to open url in new window", undo: "Undo last action (Ctrl+Z)", validationCannotMove: "Cannot move a field into a child of itself", autoType: 'Field type "auto". The field type is automatically determined from the value and can be a string, number, boolean, or null.', objectType: 'Field type "object". An object contains an unordered set of key/value pairs.', arrayType: 'Field type "array". An array contains an ordered collection of values.', stringType: 'Field type "string". Field type is not determined from the value, but always returned as string.', modeEditorTitle: "Switch Editor Mode", modeCodeText: "Code", modeCodeTitle: "Switch to code highlighter", modeFormText: "Form", modeFormTitle: "Switch to form editor", modeTextText: "Text", modeTextTitle: "Switch to plain text editor", modeTreeText: "Tree", modeTreeTitle: "Switch to tree editor", modeViewText: "View", modeViewTitle: "Switch to tree view", modePreviewText: "Preview", modePreviewTitle: "Switch to preview mode", examples: "Examples", default: "Default", containsInvalidProperties: "Contains invalid properties", containsInvalidItems: "Contains invalid items" }, es: { array: "Matriz", auto: "Auto", appendText: "Agregar", appendTitle: "Agregue un nuevo campo con el tipo 'auto' después de este campo (Ctrl + Shift + Ins)", appendSubmenuTitle: "Seleccione el tipo de campo que se agregará", appendTitleAuto: "Agregue un nuevo campo con el tipo 'auto' (Ctrl + Shift + Ins)", ascending: "Ascendente", ascendingTitle: "Ordene los elementos secundarios de este ${type} en orden ascendente", actionsMenu: "Haga clic para abrir el menú de acciones (Ctrl + M)", cannotParseFieldError: "No se puede parsear el campo en JSON", cannotParseValueError: "No se puede parsear el valor en JSON", collapseAll: "Contraer todos los campos", compactTitle: "Compactar datos JSON, eliminar todos los espacios en blanco (Ctrl + Shift + I)", descending: "Descendente", descendingTitle: "Ordene los hijos de este ${type} en orden descendente", drag: "Arrastre para mover este campo (Alt + Mayús + Flechas)", duplicateKey: "llave duplicada", duplicateText: "Duplicar", duplicateTitle: "Duplicar campos seleccionados (Ctrl + D)", duplicateField: "Duplicar este campo (Ctrl + D)", duplicateFieldError: "Nombre de campo duplicado", empty: "vacio", expandAll: "Expandir todos los campos", expandTitle: "Haga clic para expandir/contraer este campo (Ctrl + E). \n  Ctrl+Clic para expandir/contraer incluyendo todos los niños.", formatTitle: "Formatee los datos JSON, con la sangría y los avances de línea adecuados (Ctrl + I)", insert: "Insertar", insertTitle: "Inserte un nuevo campo con el tipo 'auto' antes de este campo (Ctrl + Ins)", insertSub: "Seleccione el tipo de campo a insertar", object: "Objeto", ok: "Ok", redo: "Rehacer (Ctrl+Mayús+Z)", removeText: "Eliminar", removeTitle: "Eliminar campos seleccionados (Ctrl+Supr)", removeField: "Eliminar este campo (Ctrl+Supr)", repairTitle: "Reparar JSON: corrija comillas y caracteres de escape, elimine comentarios y notación JSONP, convierta objetos JavaScript en JSON.", searchTitle: "Campos de búsqueda y valores", searchNextResultTitle: "Siguiente resultado (Entrar)", searchPreviousResultTitle: "Resultado anterior (Shift + Enter)", selectNode: "Seleccione un nodo...", showAll: "mostrar todo", showMore: "mostrar más", showMoreStatus: "mostrando ${visibleChilds} de ${totalChilds} elementos.", sort: "Ordenar", sortTitle: "Ordene los hijos de este ${type}", sortTitleShort: "Ordenar contenidos", sortFieldLabel: "Campo:", sortDirectionLabel: "Dirección:", sortFieldTitle: "Seleccione el campo anidado por el cual ordenar la matriz u objeto", sortAscending: "Ascendente", sortAscendingTitle: "Ordenar el campo seleccionado en orden ascendente", sortDescending: "Descendente", sortDescendingTitle: "Ordenar por el campo seleccionado, en orden descendente", string: "Texto", transform: "Transformar", transformTitle: "Filtrar, ordenar o transformar los hijos de este ${type}", transformTitleShort: "Filtrar, ordenar o transformar contenidos", extract: "Extraer", extractTitle: "Extrae este ${type}", transformQueryTitle: "Ingrese una consulta JMESPath", transformWizardLabel: "Wizard", transformWizardFilter: "Filtro", transformWizardSortBy: "Ordenar por", transformWizardSelectFields: "Seleccione un campo", transformQueryLabel: "Consulta", transformPreviewLabel: "Vista Previa", type: "Tipo", typeTitle: "Cambiar el tipo de campo", openUrl: "Ctrl+Click o Ctrl+Enter para abrir la URL en una nueva ventana", undo: "Deshacer la última acción (Ctrl+Z)", validationCannotMove: "No se puede mover un campo a un hijo de sí mismo.", autoType: 'Field type "auto". The field type is automatically determined from the value and can be a string, number, boolean, or null.', objectType: 'Tipo de campo "objeto".  Un objeto contiene un conjunto desordenado de pares clave/valor.', arrayType: 'Tipo de campo "matriz".  Una matriz contiene una colección ordenada de valores.', stringType: 'Tipo de campo "cadena".  El tipo de campo no se determina a partir del valor,  pero siempre se devuelve como una cadena.', modeEditorTitle: "Cambiar modo de editor", modeCodeText: "Codigo", modeCodeTitle: "Cambiar al resaltador de código", modeFormText: "Formulario", modeFormTitle: "Cambiar al editor de formularios", modeTextText: "Texto", modeTextTitle: "Cambiar al editor de texto sin formato", modeTreeText: "Arbol", modeTreeTitle: "Cambiar al editor de árbol", modeViewText: "Vista", modeViewTitle: "Cambiar a la vista de árbol", modePreviewText: "Vista Previa", modePreviewTitle: "Cambiar al modo de vista previa", examples: "Ejemplos", default: "Predeterminado", containsInvalidProperties: "Contiene propiedades no validas", containsInvalidItems: "Contiene items no validos" }, "zh-CN": { array: "数组", auto: "自动", appendText: "追加", appendTitle: "在此字段后追加一个类型为“auto”的新字段 (Ctrl+Shift+Ins)", appendSubmenuTitle: "选择要追加的字段类型", appendTitleAuto: "追加类型为“auto”的新字段 (Ctrl+Shift+Ins)", ascending: "升序", ascendingTitle: "升序排列${type}的子节点", actionsMenu: "点击打开动作菜单(Ctrl+M)", cannotParseFieldError: "无法将字段解析为JSON", cannotParseValueError: "无法将值解析为JSON", collapseAll: "缩进所有字段", compactTitle: "压缩JSON数据,删除所有空格 (Ctrl+Shift+I)", descending: "降序", descendingTitle: "降序排列${type}的子节点", drag: "拖拽移动该节点(Alt+Shift+Arrows)", duplicateKey: "重复键", duplicateText: "复制", duplicateTitle: "复制选中字段(Ctrl+D)", duplicateField: "复制该字段(Ctrl+D)", duplicateFieldError: "重复的字段名称", empty: "清空", expandAll: "展开所有字段", expandTitle: "点击 展开/收缩 该字段(Ctrl+E). \nCtrl+Click 展开/收缩 包含所有子节点.", formatTitle: "使用适当的缩进和换行符格式化JSON数据 (Ctrl+I)", insert: "插入", insertTitle: "在此字段前插入类型为“auto”的新字段 (Ctrl+Ins)", insertSub: "选择要插入的字段类型", object: "对象", ok: "Ok", redo: "重做 (Ctrl+Shift+Z)", removeText: "移除", removeTitle: "移除选中字段 (Ctrl+Del)", removeField: "移除该字段 (Ctrl+Del)", repairTitle: "修复JSON:修复引号和转义符,删除注释和JSONP表示法,将JavaScript对象转换为JSON。", selectNode: "选择一个节点...", showAll: "展示全部", showMore: "展示更多", showMoreStatus: "显示${totalChilds}的${visibleChilds}项目.", sort: "排序", sortTitle: "排序${type}的子节点", sortTitleShort: "内容排序", sortFieldLabel: "字段:", sortDirectionLabel: "方向:", sortFieldTitle: "选择用于对数组或对象排序的嵌套字段", sortAscending: "升序排序", sortAscendingTitle: "按照该字段升序排序", sortDescending: "降序排序", sortDescendingTitle: "按照该字段降序排序", string: "字符串", transform: "变换", transformTitle: "筛选,排序,或者转换${type}的子节点", transformTitleShort: "筛选,排序,或者转换内容", extract: "提取", extractTitle: "提取这个 ${type}", transformQueryTitle: "输入JMESPath查询", transformWizardLabel: "向导", transformWizardFilter: "筛选", transformWizardSortBy: "排序", transformWizardSelectFields: "选择字段", transformQueryLabel: "查询", transformPreviewLabel: "预览", type: "类型", typeTitle: "更改字段类型", openUrl: "Ctrl+Click 或者 Ctrl+Enter 在新窗口打开链接", undo: "撤销上次动作 (Ctrl+Z)", validationCannotMove: "无法将字段移入其子节点", autoType: '字段类型 "auto". 字段类型由值自动确定 可以为 string,number,boolean,或者 null.', objectType: '字段类型 "object". 对象包含一组无序的键/值对.', arrayType: '字段类型 "array". 数组包含值的有序集合.', stringType: '字段类型 "string". 字段类型由值自动确定,但始终作为字符串返回.', modeCodeText: "代码", modeCodeTitle: "切换至代码高亮", modeFormText: "表单", modeFormTitle: "切换至表单编辑", modeTextText: "文本", modeTextTitle: "切换至文本编辑", modeTreeText: "树", modeTreeTitle: "切换至树编辑", modeViewText: "视图", modeViewTitle: "切换至树视图", modePreviewText: "预览", modePreviewTitle: "切换至预览模式", examples: "例子", default: "缺省", containsInvalidProperties: "包含无效的属性", containsInvalidItems: "包含无效项目" }, "pt-BR": { array: "Lista", auto: "Automatico", appendText: "Adicionar", appendTitle: "Adicionar novo campo com tipo 'auto' depois deste campo (Ctrl+Shift+Ins)", appendSubmenuTitle: "Selecione o tipo do campo a ser adicionado", appendTitleAuto: "Adicionar novo campo com tipo 'auto' (Ctrl+Shift+Ins)", ascending: "Ascendente", ascendingTitle: "Organizar filhor do tipo ${type} em crescente", actionsMenu: "Clique para abrir o menu de ações (Ctrl+M)", cannotParseFieldError: "Não é possível analisar o campo no JSON", cannotParseValueError: "Não é possível analisar o valor em JSON", collapseAll: "Fechar todos campos", compactTitle: "Dados JSON compactos, remova todos os espaços em branco (Ctrl+Shift+I)", descending: "Descendente", descendingTitle: "Organizar o filhos do tipo ${type} em decrescente", duplicateKey: "chave duplicada", drag: "Arraste para mover este campo (Alt+Shift+Arrows)", duplicateText: "Duplicar", duplicateTitle: "Duplicar campos selecionados (Ctrl+D)", duplicateField: "Duplicar este campo (Ctrl+D)", duplicateFieldError: "Nome do campo duplicado", empty: "vazio", expandAll: "Expandir todos campos", expandTitle: "Clique para expandir/encolher este campo (Ctrl+E). \nCtrl+Click para expandir/encolher incluindo todos os filhos.", formatTitle: "Formate dados JSON, com recuo e feeds de linha adequados (Ctrl+I)", insert: "Inserir", insertTitle: "Inserir um novo campo do tipo 'auto' antes deste campo (Ctrl+Ins)", insertSub: "Selecionar o tipo de campo a ser inserido", object: "Objeto", ok: "Ok", redo: "Refazer (Ctrl+Shift+Z)", removeText: "Remover", removeTitle: "Remover campos selecionados (Ctrl+Del)", removeField: "Remover este campo (Ctrl+Del)", repairTitle: "Repare JSON: corrija aspas e caracteres de escape, remova comentários e notação JSONP, transforme objetos JavaScript em JSON.", selectNode: "Selecione um nódulo...", showAll: "mostrar todos", showMore: "mostrar mais", showMoreStatus: "exibindo ${visibleChilds} de ${totalChilds} itens.", sort: "Organizar", sortTitle: "Organizar os filhos deste ${type}", sortTitleShort: "Organizar os filhos", sortFieldLabel: "Campo:", sortDirectionLabel: "Direção:", sortFieldTitle: "Selecione um campo filho pelo qual ordenar o array ou objeto", sortAscending: "Ascendente", sortAscendingTitle: "Ordenar o campo selecionado por ordem ascendente", sortDescending: "Descendente", sortDescendingTitle: "Ordenar o campo selecionado por ordem descendente", string: "Texto", transform: "Transformar", transformTitle: "Filtrar, ordenar ou transformar os filhos deste ${type}", transformTitleShort: "Filtrar, ordenar ou transformar conteúdos", transformQueryTitle: "Insira uma expressão JMESPath", transformWizardLabel: "Assistente", transformWizardFilter: "Filtro", transformWizardSortBy: "Ordenar por", transformWizardSelectFields: "Selecionar campos", transformQueryLabel: "Expressão", transformPreviewLabel: "Visualizar", type: "Tipo", typeTitle: "Mudar o tipo deste campo", openUrl: "Ctrl+Click ou Ctrl+Enter para abrir link em nova janela", undo: "Desfazer último ação (Ctrl+Z)", validationCannotMove: "Não pode mover um campo como filho dele mesmo", autoType: 'Campo do tipo "auto". O tipo do campo é determinao automaticamente a partir do seu valor e pode ser texto, número, verdade/falso ou nulo.', objectType: 'Campo do tipo "objeto". Um objeto contém uma lista de pares com chave e valor.', arrayType: 'Campo do tipo "lista". Uma lista contem uma coleção de valores ordenados.', stringType: 'Campo do tipo "string". Campo do tipo nao é determinado através do seu valor, mas sempre retornara um texto.', examples: "Exemplos", default: "Revelia", containsInvalidProperties: "Contém propriedades inválidas", containsInvalidItems: "Contém itens inválidos" }, tr: { array: "Dizin", auto: "Otomatik", appendText: "Ekle", appendTitle: "Bu alanın altına 'otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)", appendSubmenuTitle: "Eklenecek alanın tipini seç", appendTitleAuto: "'Otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)", ascending: "Artan", ascendingTitle: "${type}'ın alt tiplerini artan düzende sırala", actionsMenu: "Aksiyon menüsünü açmak için tıklayın (Ctrl+M)", collapseAll: "Tüm alanları kapat", descending: "Azalan", descendingTitle: "${type}'ın alt tiplerini azalan düzende sırala", drag: "Bu alanı taşımak için sürükleyin (Alt+Shift+Arrows)", duplicateKey: "Var olan anahtar", duplicateText: "Aşağıya kopyala", duplicateTitle: "Seçili alanlardan bir daha oluştur (Ctrl+D)", duplicateField: "Bu alandan bir daha oluştur (Ctrl+D)", duplicateFieldError: "Duplicate field name", cannotParseFieldError: "Alan JSON'a ayrıştırılamıyor", cannotParseValueError: "JSON'a değer ayrıştırılamıyor", empty: "boş", expandAll: "Tüm alanları aç", expandTitle: "Bu alanı açmak/kapatmak için tıkla (Ctrl+E). \nAlt alanlarda dahil tüm alanları açmak için Ctrl+Click ", insert: "Ekle", insertTitle: "Bu alanın üstüne 'otomatik' tipinde yeni bir alan ekle (Ctrl+Ins)", insertSub: "Araya eklenecek alanın tipini seç", object: "Nesne", ok: "Tamam", redo: "Yeniden yap (Ctrl+Shift+Z)", removeText: "Kaldır", removeTitle: "Seçilen alanları kaldır (Ctrl+Del)", removeField: "Bu alanı kaldır (Ctrl+Del)", selectNode: "Bir nesne seç...", showAll: "tümünü göster", showMore: "daha fazla göster", showMoreStatus: "${totalChilds} alanın ${visibleChilds} alt alanları gösteriliyor", sort: "Sırala", sortTitle: "${type}'ın alt alanlarını sırala", sortTitleShort: "İçerikleri sırala", sortFieldLabel: "Alan:", sortDirectionLabel: "Yön:", sortFieldTitle: "Diziyi veya nesneyi sıralamak için iç içe geçmiş alanı seçin", sortAscending: "Artan", sortAscendingTitle: "Seçili alanı artan düzende sırala", sortDescending: "Azalan", sortDescendingTitle: "Seçili alanı azalan düzende sırala", string: "Karakter Dizisi", transform: "Dönüştür", transformTitle: "${type}'ın alt alanlarını filtrele, sırala veya dönüştür", transformTitleShort: "İçerikleri filterele, sırala veya dönüştür", transformQueryTitle: "JMESPath sorgusu gir", transformWizardLabel: "Sihirbaz", transformWizardFilter: "Filtre", transformWizardSortBy: "Sırala", transformWizardSelectFields: "Alanları seç", transformQueryLabel: "Sorgu", transformPreviewLabel: "Önizleme", type: "Tip", typeTitle: "Bu alanın tipini değiştir", openUrl: "URL'i yeni bir pencerede açmak için Ctrl+Click veya Ctrl+Enter", undo: "Son değişikliği geri al (Ctrl+Z)", validationCannotMove: "Alt alan olarak taşınamıyor", autoType: 'Alan tipi "otomatik". Alan türü otomatik olarak değerden belirlenirve bir dize, sayı, boolean veya null olabilir.', objectType: 'Alan tipi "nesne". Bir nesne, sıralanmamış bir anahtar / değer çifti kümesi içerir.', arrayType: 'Alan tipi "dizi". Bir dizi, düzenli değerler koleksiyonu içerir.', stringType: 'Alan tipi "karakter dizisi". Alan türü değerden belirlenmez,ancak her zaman karakter dizisi olarak döndürülür.', modeCodeText: "Kod", modeCodeTitle: "Kod vurgulayıcıya geç", modeFormText: "Form", modeFormTitle: "Form düzenleyiciye geç", modeTextText: "Metin", modeTextTitle: "Düz metin düzenleyiciye geç", modeTreeText: "Ağaç", modeTreeTitle: "Ağaç düzenleyiciye geç", modeViewText: "Görünüm", modeViewTitle: "Ağaç görünümüne geç", examples: "Örnekler", default: "Varsayılan", containsInvalidProperties: "Geçersiz özellikler içeriyor", containsInvalidItems: "Geçersiz öğeler içeriyor" }, ja: { array: "配列", auto: "オート", appendText: "追加", appendTitle: '次のフィールドに"オート"のフィールドを追加 (Ctrl+Shift+Ins)', appendSubmenuTitle: "追加するフィールドの型を選択してください", appendTitleAuto: '"オート"のフィールドを追加 (Ctrl+Shift+Ins)', ascending: "昇順", ascendingTitle: "${type}の子要素を昇順に並べ替え", actionsMenu: "クリックしてアクションメニューを開く (Ctrl+M)", collapseAll: "すべてを折りたたむ", descending: "降順", descendingTitle: "${type}の子要素を降順に並べ替え", drag: "ドラッグして選択中のフィールドを移動 (Alt+Shift+Arrows)", duplicateKey: "複製キー", duplicateText: "複製", duplicateTitle: "選択中のフィールドを複製 (Ctrl+D)", duplicateField: "選択中のフィールドを複製 (Ctrl+D)", duplicateFieldError: "フィールド名が重複しています", cannotParseFieldError: "JSONのフィールドを解析できません", cannotParseValueError: "JSONの値を解析できません", empty: "空", expandAll: "すべてを展開", expandTitle: "クリックしてフィールドを展開/折りたたむ (Ctrl+E). \nCtrl+Click ですべての子要素を展開/折りたたむ", insert: "挿入", insertTitle: "選択中のフィールドの前に新しいフィールドを挿入 (Ctrl+Ins)", insertSub: "挿入するフィールドの型を選択", object: "オブジェクト", ok: "実行", redo: "やり直す (Ctrl+Shift+Z)", removeText: "削除", removeTitle: "選択中のフィールドを削除 (Ctrl+Del)", removeField: "選択中のフィールドを削除 (Ctrl+Del)", selectNode: "ノードを選択...", showAll: "すべてを表示", showMore: "もっと見る", showMoreStatus: "${totalChilds}個のアイテムのうち ${visibleChilds}個を表示しています。", sort: "並べ替え", sortTitle: "${type}の子要素を並べ替え", sortTitleShort: "並べ替え", sortFieldLabel: "フィールド:", sortDirectionLabel: "順序:", sortFieldTitle: "配列またはオブジェクトを並び替えるためのフィールドを選択", sortAscending: "昇順", sortAscendingTitle: "選択中のフィールドを昇順に並び替え", sortDescending: "降順", sortDescendingTitle: "選択中のフィールドを降順に並び替え", string: "文字列", transform: "変換", transformTitle: "${type}の子要素をフィルター・並び替え・変換する", transformTitleShort: "内容をフィルター・並び替え・変換する", extract: "抽出", extractTitle: "${type}を抽出", transformQueryTitle: "JMESPathクエリを入力", transformWizardLabel: "ウィザード", transformWizardFilter: "フィルター", transformWizardSortBy: "並び替え", transformWizardSelectFields: "フィールドを選択", transformQueryLabel: "クエリ", transformPreviewLabel: "プレビュー", type: "型", typeTitle: "選択中のフィールドの型を変更", openUrl: "Ctrl+Click または Ctrl+Enter で 新規ウィンドウでURLを開く", undo: "元に戻す (Ctrl+Z)", validationCannotMove: "子要素に移動できません ", autoType: "オート: フィールドの型は値から自動的に決定されます。 (文字列・数値・ブール・null)", objectType: "オブジェクト: オブジェクトは順序が決まっていないキーと値のペア組み合わせです。", arrayType: "配列: 配列は順序が決まっている値の集合体です。", stringType: "文字列: フィールド型は値から決定されませんが、常に文字列として返されます。", modeCodeText: "コードモード", modeCodeTitle: "ハイライトモードに切り替え", modeFormText: "フォームモード", modeFormTitle: "フォームモードに切り替え", modeTextText: "テキストモード", modeTextTitle: "テキストモードに切り替え", modeTreeText: "ツリーモード", modeTreeTitle: "ツリーモードに切り替え", modeViewText: "ビューモード", modeViewTitle: "ビューモードに切り替え", modePreviewText: "プレビュー", modePreviewTitle: "プレビューに切り替え", examples: "例", default: "デフォルト", containsInvalidProperties: "無効なプロパティが含まれています", containsInvalidItems: "無効なアイテムが含まれています" }, "fr-FR": { array: "Liste", auto: "Auto", appendText: "Ajouter", appendTitle: "Ajouter un champ de type 'auto' après ce champ (Ctrl+Shift+Ins)", appendSubmenuTitle: "Sélectionner le type du champ à ajouter", appendTitleAuto: "Ajouter un champ de type 'auto' (Ctrl+Shift+Ins)", ascending: "Ascendant", ascendingTitle: "Trier les enfants de ce ${type} par ordre ascendant", actionsMenu: "Ouvrir le menu des actions (Ctrl+M)", collapseAll: "Regrouper", descending: "Descendant", descendingTitle: "Trier les enfants de ce ${type} par ordre descendant", drag: "Déplacer (Alt+Shift+Arrows)", duplicateKey: "Dupliquer la clé", duplicateText: "Dupliquer", duplicateTitle: "Dupliquer les champs sélectionnés (Ctrl+D)", duplicateField: "Dupliquer ce champ (Ctrl+D)", duplicateFieldError: "Dupliquer le nom de champ", cannotParseFieldError: "Champ impossible à parser en JSON", cannotParseValueError: "Valeur impossible à parser en JSON", empty: "vide", expandAll: "Étendre", expandTitle: "Étendre/regrouper ce champ (Ctrl+E). \nCtrl+Click pour étendre/regrouper avec tous les champs.", insert: "Insérer", insertTitle: "Insérer un champ de type 'auto' avant ce champ (Ctrl+Ins)", insertSub: "Sélectionner le type de champ à insérer", object: "Objet", ok: "Ok", redo: "Rejouer (Ctrl+Shift+Z)", removeText: "Supprimer", removeTitle: "Supprimer les champs sélectionnés (Ctrl+Del)", removeField: "Supprimer ce champ (Ctrl+Del)", searchTitle: "Rechercher champs et valeurs", searchNextResultTitle: "Résultat suivant (Enter)", searchPreviousResultTitle: "Résultat précédent (Shift + Enter)", selectNode: "Sélectionner un nœud...", showAll: "voir tout", showMore: "voir plus", showMoreStatus: "${visibleChilds} éléments affichés de ${totalChilds}.", sort: "Trier", sortTitle: "Trier les champs de ce ${type}", sortTitleShort: "Trier", sortFieldLabel: "Champ:", sortDirectionLabel: "Direction:", sortFieldTitle: "Sélectionner les champs permettant de trier les listes et objet", sortAscending: "Ascendant", sortAscendingTitle: "Trier les champs sélectionnés par ordre ascendant", sortDescending: "Descendant", sortDescendingTitle: "Trier les champs sélectionnés par ordre descendant", string: "Chaîne", transform: "Transformer", transformTitle: "Filtrer, trier, or transformer les enfants de ce ${type}", transformTitleShort: "Filtrer, trier ou transformer le contenu", extract: "Extraire", extractTitle: "Extraire ce ${type}", transformQueryTitle: "Saisir une requête JMESPath", transformWizardLabel: "Assistant", transformWizardFilter: "Filtrer", transformWizardSortBy: "Trier par", transformWizardSelectFields: "Sélectionner les champs", transformQueryLabel: "Requête", transformPreviewLabel: "Prévisualisation", type: "Type", typeTitle: "Changer le type de ce champ", openUrl: "Ctrl+Click ou Ctrl+Enter pour ouvrir l'url dans une autre fenêtre", undo: "Annuler la dernière action (Ctrl+Z)", validationCannotMove: "Cannot move a field into a child of itself", autoType: 'Champe de type "auto". Ce type de champ est automatiquement déterminé en fonction de la valeur et peut être de type "chaîne", "nombre", "booléen" ou null.', objectType: 'Champ de type "objet". Un objet contient un ensemble non ordonné de paires clé/valeur.', arrayType: 'Champ de type "liste". Une liste contient une collection ordonnée de valeurs.', stringType: `Champ de type "chaîne". Ce type de champ n'est pas déterminé en fonction de la valeur, mais retourne systématiquement une chaîne de caractères.`, modeEditorTitle: "Changer mode d'édition", modeCodeText: "Code", modeCodeTitle: "Activer surlignage code", modeFormText: "Formulaire", modeFormTitle: "Activer formulaire", modeTextText: "Texte", modeTextTitle: "Activer éditeur texte", modeTreeText: "Arbre", modeTreeTitle: "Activer éditeur arbre", modeViewText: "Lecture seule", modeViewTitle: "Activer vue arbre", modePreviewText: "Prévisualisation", modePreviewTitle: "Activer mode prévisualiser", examples: "Exemples", default: "Défaut", containsInvalidProperties: "Contient des propriétés non valides", containsInvalidItems: "Contient des éléments invalides" }, de: { array: "Auflistung", auto: "Auto", appendText: "anhängen", appendTitle: "Fügen Sie nach diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Umschalt+Ein)", appendSubmenuTitle: "Wählen Sie den Typ des neuen Feldes", appendTitleAuto: "Ein neues Feld vom Typ 'auto' hinzufügen (Strg+Umschalt+Ein)", ascending: "Aufsteigend", ascendingTitle: "Sortieren Sie die Elemente dieses ${type} in aufsteigender Reihenfolge", actionsMenu: "Klicken Sie zum Öffnen des Aktionsmenüs (Strg+M)", cannotParseFieldError: "Feld kann nicht in JSON geparst werden", cannotParseValueError: "Wert kann nicht in JSON geparst werden", collapseAll: "Alle Felder zuklappen", compactTitle: "JSON-Daten verdichten, alle Leerzeichen entfernen (Strg+Umschalt+\\)", descending: "Absteigend", descendingTitle: "Sortieren Sie die Elemente dieses ${type} in absteigender Reihenfolge", drag: "Ziehen, um dieses Feld zu verschieben (Alt+Umschalt+Pfeile)", duplicateKey: "Doppelter Schlüssel", duplicateText: "Duplikat", duplicateTitle: "Ausgewählte Felder duplizieren (Strg+D)", duplicateField: "Dieses Feld duplizieren (Strg+D)", duplicateFieldError: "Doppelter Feldname", empty: "leer", expandAll: "Alle Felder anzeigen", expandTitle: "Klicken Sie, um dieses Feld zu erweitern/zu kollabieren (Strg+E). \nStrg+Klicken Sie, um dieses Feld einschließlich aller Elemente zu erweitern/zu kollabieren.", formatTitle: "JSON-Daten mit korrekter Einrückung und Zeilenvorschüben formatieren (Strg+\\)", insert: "einfügen", insertTitle: "Fügen Sie vor diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Einfg)", insertSub: "Wählen Sie den Typ des neuen Feldes", object: "Objekt", ok: "Ok", redo: "Wiederholen (Strg+Umschalt+Z)", removeText: "entfernen", removeTitle: "Ausgewählte Felder entfernen (Strg+Entf)", removeField: "Dieses Feld entfernen (Strg+Entf)", repairTitle: "JSON reparieren: Anführungszeichen und Escape-Zeichen korrigieren, Kommentare und JSONP-Notation entfernen, JavaScript-Objekte in JSON umwandeln.", searchTitle: "Suchfelder und Werte", searchNextResultTitle: "Nächstes Ergebnis (Enter)", searchPreviousResultTitle: "Vorheriges Ergebnis (Umschalt + Eingabe)", selectNode: "Wählen Sie einen Knoten aus...", showAll: "alle anzeigen", showMore: "mehr anzeigen", showMoreStatus: "Anzeige von ${visibleChilds} von ${totalChilds}-Elementen.", sort: "Sortieren", sortTitle: "Sortieren Sie die Elemente dieses ${type}", sortTitleShort: "Inhalt sortieren", sortFieldLabel: "Feld:", sortDirectionLabel: "Richtung:", sortFieldTitle: "Wählen Sie das verschachtelte Feld, nach dem das Array oder Objekt sortiert werden soll.", sortAscending: "Aufsteigend", sortAscendingTitle: "Sortieren Sie das ausgewählte Feld in aufsteigender Reihenfolge", sortDescending: "Absteigend", sortDescendingTitle: "Sortieren Sie das ausgewählte Feld in absteigender Reihenfolge", string: "Zeichenfolge", transform: "Verwandeln", transformTitle: "Die Elemente dieses ${type} filtern, sortieren oder transformieren", transformTitleShort: "Inhalte filtern, sortieren oder transformieren", extract: "Auszug", extractTitle: "Extrahieren Sie diesen ${type}", transformQueryTitle: "Eine JMESPath-Abfrage eingeben", transformWizardLabel: "Zauberer", transformWizardFilter: "Filter", transformWizardSortBy: "Sortieren nach", transformWizardSelectFields: "Felder auswählen", transformQueryLabel: "Anfrage", transformPreviewLabel: "Vorschau", type: "Geben Sie  ein.", typeTitle: "Ändern Sie den Typ dieses Feldes", openUrl: "Strg+Klicken oder Strg+Eingabe, um die URL in einem neuen Fenster zu öffnen", undo: "Letzte Aktion rückgängig machen (Strg+Z)", validationCannotMove: "Kann ein Feld nicht in ein Kind seiner selbst verschieben", autoType: 'Feldtyp "auto". Der Feldtyp wird automatisch aus dem Wert bestimmt und kann ein String, eine Zahl, boolesch oder null sein.', objectType: 'Feldtyp "Objekt". Ein Objekt enthält eine ungeordnete Menge von Schlüssel/Wert-Paaren.', arrayType: 'Feldtyp "Array". Ein Array enthält eine geordnete Sammlung von Werten.', stringType: 'Feldtyp "Zeichenfolge". Der Feldtyp wird nicht aus dem Wert bestimmt, sondern immer als Zeichenfolge zurückgegeben.', modeEditorTitle: "Editor-Modus umschalten", modeCodeText: "Code", modeCodeTitle: "Umschalten auf Code-Highlighter", modeFormText: "Formular", modeFormTitle: "Zum Formular-Editor wechseln", modeTextText: "Text", modeTextTitle: "Zum Editor für einfachen Text wechseln", modeTreeText: "Baum", modeTreeTitle: "Zum Baum-Editor wechseln", modeViewText: "Siehe", modeViewTitle: "Zur Baumansicht wechseln", modePreviewText: "Vorschau", modePreviewTitle: "In den Vorschau-Modus wechseln", examples: "Beispiele", default: "Standardmäßig", containsInvalidProperties: "Enthält ungültige Eigenschaften", containsInvalidItems: "Enthält ungültige Elemente" }, ru: { array: "Массив", auto: "Авто", appendText: "Добавить", appendTitle: "Добавить новое поле с типом 'авто' после этого поля (Ctrl+Shift+Ins)", appendSubmenuTitle: "Выбрать тип поля для добавления", appendTitleAuto: "Добавить новое поле с типом 'авто' (Ctrl+Shift+Ins)", ascending: "По возрастанию", ascendingTitle: "Сортировать ${type} по возрастанию", actionsMenu: "Нажмите для открытия меню действий (Ctrl+M)", cannotParseFieldError: "Невозможно преобразовать поле в JSON", cannotParseValueError: "Невозможно преобразовать значение в JSON", collapseAll: "Свернуть все", compactTitle: "Минификация JSON (Ctrl+Shift+I)", descending: "По убыванию", descendingTitle: "Сортировать ${type} по убыванию", drag: "Потяните для перемещения этого поля (Alt+Shift+Arrows)", duplicateKey: "повторяющийся ключ", duplicateText: "Дублировать", duplicateTitle: "Дублирование полей (Ctrl+D)", duplicateField: "Дублировать поле (Ctrl+D)", duplicateFieldError: "Дублирование названия поля", empty: "пустой", expandAll: "Развернуть все", expandTitle: "Нажмите для раскрытия/скрытия поля (Ctrl+E)\nили Ctrl+Click для раскрытия/скрытия всех потомков.", formatTitle: "Форматирование JSON (Ctrl+I)", insert: "Вставить", insertTitle: "Вставить новое поле с типом 'авто' перед этим полем (Ctrl+Ins)", insertSub: "Выбрать тип поля для вставки", object: "Объект", ok: "ОК", redo: "Повторить (Ctrl+Shift+Z)", removeText: "Удалить", removeTitle: "Удалить выбранные поля (Ctrl+Del)", removeField: "Удалить поле (Ctrl+Del)", repairTitle: "Восстановите JSON: исправьте кавычки и escape-символы, удалите комментарии и нотацию JSONP, модифицируйте объекты JavaScript в JSON.", searchTitle: "Поиск", searchNextResultTitle: "Следующий результат (Enter)", searchPreviousResultTitle: "Предыдущий результат (Shift + Enter)", selectNode: "Выбор узла...", showAll: "показать все", showMore: "больше", showMoreStatus: "${visibleChilds} из ${totalChilds}", sort: "Сортировка", sortTitle: "Сортировка потомков типа ${type}", sortTitleShort: "Сортировка содержимого", sortFieldLabel: "Поле:", sortDirectionLabel: "Направление:", sortFieldTitle: "Выберите поле для сортировки массива или объекта", sortAscending: "По возрастанию", sortAscendingTitle: "Сортировка выбранного поря по возрастанию", sortDescending: "По убыванию", sortDescendingTitle: "Сортировка выбранного поря по убыванию", string: "Строка", transform: "Модификация", transformTitle: "Фильтрация, сортировка или модификация данных типа ${type}", transformTitleShort: "Фильтрация, сортировка или модификация данных", extract: "Извлечение", extractTitle: "Извлечь тип ${type}", transformQueryTitle: "Введите JMESpath запрос", transformWizardLabel: "Мастер", transformWizardFilter: "Фильтр", transformWizardSortBy: "Сортировка", transformWizardSelectFields: "Поля", transformQueryLabel: "Запрос", transformPreviewLabel: "Просмотр", type: "Тип", typeTitle: "Изменить тип этого поля", openUrl: "Ctrl+Click или Ctrl+Enter для открытия url в новом окне", undo: "Отменить (Ctrl+Z)", validationCannotMove: "Поле не может быть перемещено в потомка", autoType: "Тип поля автоматически определяется по значению и может быть строкой, числом, логическим значением или null.", objectType: "Объект содержит неупорядоченный набор пар ключ/значение.", arrayType: "Массив содержит упорядоченный набор значений.", stringType: "Тип поля не определяется из значения, но всегда возвращается как строка.", modeEditorTitle: "Переключение режима редактора", modeCodeText: "Код", modeCodeTitle: "Переключить в режим редактора кода", modeFormText: "Форма", modeFormTitle: "Переключить в режим формы", modeTextText: "Текст", modeTextTitle: "Переключить в режим редактора текста", modeTreeText: "Дерево", modeTreeTitle: "Переключить в режим редактора дерева", modeViewText: "Просмотр дерева", modeViewTitle: "Переключить в режим просмотра дерева", modePreviewText: "Просмотр", modePreviewTitle: "Переключить в режим просмотра", examples: "Примеры", default: "По умолчанию", containsInvalidProperties: "Содержит недопустимые свойства", containsInvalidItems: "Содержит недопустимые элементы" }, ko: { array: "배열", auto: "자동", appendText: "추가", appendTitle: '선택한 요소 아래에 "자동" 요소를 추가합니다. (Ctrl + Shift + Ins)', appendSubmenuTitle: "추가할 요소의 유형을 선택해주세요.", appendTitleAuto: '"자동" 요소를 추가합니다. (Ctrl + Shift + Ins)', ascending: "오름차순", ascendingTitle: "선택한 ${type}의 하위 요소를 오름차순 정렬합니다.", actionsMenu: "메뉴 열기 (Ctrl + M)", cannotParseFieldError: "JSON의 요소를 해석할 수 없습니다.", cannotParseValueError: "JSON의 값을 해석할 수 없습니다.", collapseAll: "모두 접기", compactTitle: "모든 공백을 제거하여 JSON 데이터를 작게 만듭니다. (Ctrl + Shift + I)", descending: "내림차순", descendingTitle: "선택한 ${type}의 하위 요소를 내림차순으로 정렬", drag: "드래그하여 요소를 이동합니다. (Alt + Shift + Arrows)", duplicateKey: "복제키", duplicateText: "복제", duplicateTitle: "선택한 요소를 복제합니다. (Ctrl + D)", duplicateField: "선택한 요소를 복제합니다. (Ctrl + D)", duplicateFieldError: "요소 이름이 중복되었습니다.", empty: "비어있음", expandAll: "모두 열기", expandTitle: "클릭하여 요소를 열거나 닫습니다. (Ctrl + E) \nCtrl + Click으로 모든 하위 요소를 열거나 닫습니다.", formatTitle: "적절한 들여쓰기 및 줄바꿈으로 JSON 데이터를 정형화합니다. (Ctrl + I)", insert: "삽입", insertTitle: "선택한 요소 위에 새요소를 삽입합니다. (Ctrl + Ins)", insertSub: "삽입할 요소의 유형을 선택해주세요.", object: "객체", ok: "확인", redo: "다시 실행 (Ctrl + Shift + Z)", removeText: "삭제", removeTitle: "선택한 요소를 삭제합니다. (Ctrl + Del)", removeField: "선택한 요소를 삭제합니다. (Ctrl + Del)", repairTitle: "JSON 교정: JSON 내의 주석과 JSONP 표기법을 지우고 따옴표와 이스케이프 문자를 수정합니다.", searchTitle: "요소 또는 값 찾기", searchNextResultTitle: "다음으로 찾기 (Enter)", searchPreviousResultTitle: "이전으로 찾기 (Shift + Enter)", selectNode: "요소를 선택해주세요...", showAll: "모두보기", showMore: "더보기", showMoreStatus: "${totalChilds} 개의 항목 중 ${visibleChilds} 개를 표시합니다.", sort: "정렬", sortTitle: "선택한 ${type}의 하위 요소를 정렬합니다.", sortTitleShort: "정렬", sortFieldLabel: "요소:", sortDirectionLabel: "순서:", sortFieldTitle: "배열이나 객체를 정렬하는 요소를 선택해주세요.", sortAscending: "오름차순", sortAscendingTitle: "선택한 요소를 오름차순으로 정렬합니다.", sortDescending: "내림차순", sortDescendingTitle: "선택한 요소를 내림차순으로 정렬합니다.", string: "문자", transform: "변환", transformTitle: "선택한 ${type}의 하위 요소를 필터하거나 정렬 또는 변환합니다.", transformTitleShort: "내용을 필터하거나 정렬 또는 변환합니다.", extract: "추출", extractTitle: "선택한 ${type}의 값을 최상위에 위치시킵니다.", transformQueryTitle: "JMESPath 쿼리를 입력해주세요.", transformWizardLabel: "마법사", transformWizardFilter: "필터", transformWizardSortBy: "정렬", transformWizardSelectFields: "요소를 선택해주세요.", transformQueryLabel: "쿼리", transformPreviewLabel: "미리보기", type: "유형", typeTitle: "선택한 요소의 유형을 변경합니다.", openUrl: "Ctrl + Click 또는 Ctrl + Enter로 새 창에서 URL 열기", undo: "실행 취소 (Ctrl + Z)", validationCannotMove: "하위 요소로 이동할 수 없습니다.", autoType: "자동: 요소의 형식이 값의 유형으로 결정됩니다. 문자, 숫자, 부울, 또는 null만 허용됩니다.", objectType: "객체: 순서대로 나열되지 않은 이름/값 쌍으로 이루어진 집합입니다.", arrayType: "배열: 순서대로 나열된 값의 집합입니다.", stringType: "문자: 요소의 유형이 값에서 결정되지 않지만 항상 문자로 반환됩니다.", modeEditorTitle: "편집기 유형 변경", modeCodeText: "코드", modeCodeTitle: "형식 교정을 도와주는 기능이 포함된 문자 편집기", modeFormText: "입력 양식", modeFormTitle: "정해진 요소에 값을 입력하는 편집기", modeTextText: "문자", modeTextTitle: "단순 문자 편집기", modeTreeText: "트리", modeTreeTitle: "트리 구조로 표시되는 편집기", modeViewText: "보기", modeViewTitle: "읽기전용 트리 구조로 JSON을 표시", modePreviewText: "미리보기", modePreviewTitle: "읽기전용 문자로 JSON을 표시", examples: "예제", default: "기본값", containsInvalidProperties: "잘못된 속성이 포함되어 있습니다.", containsInvalidItems: "잘못된 항목이 포함되어 있습니다" } }, i2 = Object.keys(r), s = "en", o2 = "undefined" != typeof navigator ? navigator.language || navigator.userLanguage : void 0, a = i2.find(function(e2) {
          return e2 === o2;
        }) || s;
        function l(t2) {
          var e2;
          t2 && ((e2 = i2.find(function(e3) {
            return e3 === t2;
          })) ? a = e2 : console.error("Language not found"));
        }
        function c(e2) {
          if (e2) for (var t2 in e2) !function(t3) {
            i2.find(function(e3) {
              return e3 === t3;
            }) || i2.push(t3), r[t3] = Object.assign({}, r[s], r[t3], e2[t3]);
          }(t2);
        }
        function h(e2, t2, n3) {
          var i3 = r[n3 = n3 || a][e2] || r[s][e2] || e2;
          if (t2) for (var o3 in t2) i3 = i3.replace("${" + o3 + "}", t2[o3]);
          return i3;
        }
      }, 6056: function(e, t, n2) {
        "use strict";
        n2.d(t, { J: function() {
          return r;
        }, r: function() {
          return o2;
        } });
        var t = n2(5156), i2 = n2.n(t), s = n2(9791);
        function o2(e2, t2) {
          var n3, i3 = t2.sort, o3 = t2.filter, t2 = t2.projection, r2 = "";
          return o3 ? (n3 = "@" !== o3.field ? ["0"].concat((0, s.parsePath)("." + o3.field)) : ["0"], n3 = "string" == typeof (0, s.get)(e2, n3) ? o3.value : (0, s.parseString)(o3.value), r2 += "[? " + o3.field + " " + o3.relation + " `" + JSON.stringify(n3) + "`]") : r2 += Array.isArray(e2) ? "[*]" : "@", i3 && ("desc" === i3.direction ? r2 += " | reverse(sort_by(@, &" + i3.field + "))" : r2 += " | sort_by(@, &" + i3.field + ")"), t2 && ("]" !== r2[r2.length - 1] && (r2 += " | [*]"), 1 === t2.fields.length ? r2 += "." + t2.fields[0] : 1 < t2.fields.length && (r2 += ".{" + t2.fields.map(function(e3) {
            var t3 = e3.split(".");
            return t3[t3.length - 1] + ": " + e3;
          }).join(", ") + "}")), r2;
        }
        function r(e2, t2) {
          return i2().search(e2, t2);
        }
      }, 4987: function() {
        function e(e2) {
          void 0 === e2 || "remove" in e2 || Object.defineProperty(e2, "remove", { configurable: true, enumerable: true, writable: true, value: function() {
            void 0 !== this.parentNode && this.parentNode.removeChild(this);
          } });
        }
        "undefined" != typeof Element && (void 0 !== window.Element && e(window.Element.prototype), void 0 !== window.CharacterData && e(window.CharacterData.prototype), void 0 !== window.DocumentType) && e(window.DocumentType.prototype), Array.prototype.findIndex || Object.defineProperty(Array.prototype, "findIndex", { value: function(e2) {
          for (var t = 0; t < this.length; t++) {
            var n2 = this[t];
            if (e2.call(this, n2, t, this)) return t;
          }
          return -1;
        }, configurable: true, writable: true }), Array.prototype.find || Object.defineProperty(Array.prototype, "find", { value: function(e2) {
          e2 = this.findIndex(e2);
          return this[e2];
        }, configurable: true, writable: true }), String.prototype.trim || (String.prototype.trim = function() {
          return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
        });
      }, 341: function(e, t, n2) {
        "use strict";
        n2.r(t), n2.d(t, { previewModeMixins: function() {
          return f;
        } });
        var i2 = n2(1262), s = n2(4188), o2 = n2(6436), r = n2(2474);
        function a(e2) {
          return (a = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e3) {
            return typeof e3;
          } : function(e3) {
            return e3 && "function" == typeof Symbol && e3.constructor === Symbol && e3 !== Symbol.prototype ? "symbol" : typeof e3;
          })(e2);
        }
        function l(e2, t2) {
          for (var n3 = 0; n3 < t2.length; n3++) {
            var i3 = t2[n3];
            i3.enumerable = i3.enumerable || false, i3.configurable = true, "value" in i3 && (i3.writable = true), Object.defineProperty(e2, function(e3) {
              e3 = function(e4, t3) {
                if ("object" !== a(e4) || null === e4) return e4;
                var n4 = e4[Symbol.toPrimitive];
                if (void 0 === n4) return ("string" === t3 ? String : Number)(e4);
                n4 = n4.call(e4, t3 || "default");
                if ("object" !== a(n4)) return n4;
                throw new TypeError("@@toPrimitive must return a primitive value.");
              }(e3, "string");
              return "symbol" === a(e3) ? e3 : String(e3);
            }(i3.key), i3);
          }
        }
        var c = function() {
          function i3(e3, t3, n4) {
            if (!(this instanceof i3)) throw new TypeError("Cannot call a class as a function");
            this.onChange = e3, this.calculateItemSize = t3 || function() {
              return 1;
            }, this.limit = n4, this.items = [], this.index = -1;
          }
          var e2, t2, n3;
          return e2 = i3, (t2 = [{ key: "add", value: function(e3) {
            for (; this._calculateHistorySize() > this.limit && 1 < this.items.length; ) this.items.shift(), this.index--;
            this.items = this.items.slice(0, this.index + 1), this.items.push(e3), this.index++, this.onChange();
          } }, { key: "_calculateHistorySize", value: function() {
            var t3 = this.calculateItemSize, n4 = 0;
            return this.items.forEach(function(e3) {
              n4 += t3(e3);
            }), n4;
          } }, { key: "undo", value: function() {
            if (this.canUndo()) return this.index--, this.onChange(), this.items[this.index];
          } }, { key: "redo", value: function() {
            if (this.canRedo()) return this.index++, this.onChange(), this.items[this.index];
          } }, { key: "canUndo", value: function() {
            return 0 < this.index;
          } }, { key: "canRedo", value: function() {
            return this.index < this.items.length - 1;
          } }, { key: "clear", value: function() {
            this.items = [], this.index = -1, this.onChange();
          } }]) && l(e2.prototype, t2), n3 && l(e2, n3), Object.defineProperty(e2, "prototype", { writable: false }), i3;
        }(), h = n2(7907), d = n2(6056), u = n2(6617), g = n2(6210), p = n2(2558), t = n2(8458), m = n2(9791), n2 = t.textModeMixins[0].mixin, t = { create: function(e2) {
          var t2 = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {}, n3 = (void 0 === t2.statusBar && (t2.statusBar = true), t2.mainMenuBar = false !== t2.mainMenuBar, t2.enableSort = false !== t2.enableSort, t2.enableTransform = false !== t2.enableTransform, t2.createQuery = t2.createQuery || d.r, t2.executeQuery = t2.executeQuery || d.J, "number" == typeof (this.options = t2).indentation ? this.indentation = Number(t2.indentation) : this.indentation = 2, (0, h.cC)(this.options.languages), (0, h.m0)(this.options.language), this.mode = "preview", this), e2 = (this.container = e2, this.dom = {}, this.json = void 0, this.text = "", this._debouncedValidate = (0, m.debounce)(this.validate.bind(this), this.DEBOUNCE_INTERVAL), this.width = e2.clientWidth, this.height = e2.clientHeight, this.frame = document.createElement("div"), this.frame.className = "jsoneditor jsoneditor-mode-preview", this.frame.onclick = function(e3) {
            e3.preventDefault();
          }, { target: this.frame, onFocus: this.options.onFocus || null, onBlur: this.options.onBlur || null }), e2 = (this.frameFocusTracker = new r.R(e2), this.content = document.createElement("div"), this.content.className = "jsoneditor-outer", this.dom.busy = document.createElement("div"), this.dom.busy.className = "jsoneditor-busy", this.dom.busyContent = document.createElement("span"), this.dom.busyContent.textContent = "busy...", this.dom.busy.appendChild(this.dom.busyContent), this.content.appendChild(this.dom.busy), this.dom.previewContent = document.createElement("pre"), this.dom.previewContent.className = "jsoneditor-preview", this.dom.previewText = document.createTextNode(""), this.dom.previewContent.appendChild(this.dom.previewText), this.content.appendChild(this.dom.previewContent), this.options.mainMenuBar && ((0, m.addClassName)(this.content, "has-main-menu-bar"), this.menu = document.createElement("div"), this.menu.className = "jsoneditor-menu", this.frame.appendChild(this.menu), (e2 = document.createElement("button")).type = "button", e2.className = "jsoneditor-format", e2.title = (0, h.Iu)("formatTitle"), this.menu.appendChild(e2), e2.onclick = function() {
            n3.executeWithBusyMessage(function() {
              try {
                n3.format();
              } catch (e3) {
                n3._onError(e3);
              }
            }, "formatting...");
          }, (e2 = document.createElement("button")).type = "button", e2.className = "jsoneditor-compact", e2.title = (0, h.Iu)("compactTitle"), this.menu.appendChild(e2), e2.onclick = function() {
            n3.executeWithBusyMessage(function() {
              try {
                n3.compact();
              } catch (e3) {
                n3._onError(e3);
              }
            }, "compacting...");
          }, this.options.enableSort && ((e2 = document.createElement("button")).type = "button", e2.className = "jsoneditor-sort", e2.title = (0, h.Iu)("sortTitleShort"), e2.onclick = function() {
            n3._showSortModal();
          }, this.menu.appendChild(e2)), this.options.enableTransform && ((e2 = document.createElement("button")).type = "button", e2.title = (0, h.Iu)("transformTitleShort"), e2.className = "jsoneditor-transform", e2.onclick = function() {
            n3._showTransformModal();
          }, this.dom.transform = e2, this.menu.appendChild(e2)), (e2 = document.createElement("button")).type = "button", e2.className = "jsoneditor-repair", e2.title = (0, h.Iu)("repairTitle"), this.menu.appendChild(e2), !(e2.onclick = function() {
            void 0 === n3.json && n3.executeWithBusyMessage(function() {
              try {
                n3.repair();
              } catch (e3) {
                n3._onError(e3);
              }
            }, "repairing...");
          }) !== this.options.history && (this.history = new c(function() {
            n3.dom.undo.disabled = !n3.history.canUndo(), n3.dom.redo.disabled = !n3.history.canRedo();
          }, function(e3) {
            return 2 * e3.text.length;
          }, s.oW), (e2 = document.createElement("button")).type = "button", e2.className = "jsoneditor-undo jsoneditor-separator", e2.title = (0, h.Iu)("undo"), e2.onclick = function() {
            var e3 = n3.history.undo();
            e3 && n3._applyHistory(e3);
          }, this.menu.appendChild(e2), this.dom.undo = e2, (e2 = document.createElement("button")).type = "button", e2.className = "jsoneditor-redo", e2.title = (0, h.Iu)("redo"), e2.onclick = function() {
            var e3 = n3.history.redo();
            e3 && n3._applyHistory(e3);
          }, this.menu.appendChild(e2), this.dom.redo = e2, this.history.onChange()), this.options) && this.options.modes && this.options.modes.length && (this.modeSwitcher = new u.x(this.menu, this.options.modes, this.options.mode, function(e3) {
            try {
              n3.setMode(e3), n3.modeSwitcher.focus();
            } catch (e4) {
              n3._onError(e4);
            }
          })), Array.isArray(this.options.showErrorTable) ? this.options.showErrorTable.includes(this.mode) : true === this.options.showErrorTable);
          this.errorTable = new o2.Q({ errorTableVisible: e2, onToggleVisibility: function() {
            n3.validate();
          }, onFocusLine: null, onChangeHeight: function(e3) {
            e3 = e3 + (n3.dom.statusBar ? n3.dom.statusBar.clientHeight : 0) + 1;
            n3.content.style.marginBottom = -e3 + "px", n3.content.style.paddingBottom = e3 + "px";
          } }), this.frame.appendChild(this.content), this.frame.appendChild(this.errorTable.getErrorTable()), this.container.appendChild(this.frame), t2.statusBar && ((0, m.addClassName)(this.content, "has-status-bar"), e2 = document.createElement("div"), (this.dom.statusBar = e2).className = "jsoneditor-statusbar", this.frame.appendChild(e2), this.dom.fileSizeInfo = document.createElement("span"), this.dom.fileSizeInfo.className = "jsoneditor-size-info", this.dom.fileSizeInfo.innerText = "", e2.appendChild(this.dom.fileSizeInfo), this.dom.arrayInfo = document.createElement("span"), this.dom.arrayInfo.className = "jsoneditor-size-info", this.dom.arrayInfo.innerText = "", e2.appendChild(this.dom.arrayInfo), e2.appendChild(this.errorTable.getErrorCounter()), e2.appendChild(this.errorTable.getWarningIcon()), e2.appendChild(this.errorTable.getErrorIcon())), this._renderPreview(), this.setSchema(this.options.schema, this.options.schemaRefs);
        }, _renderPreview: function() {
          var e2 = this.getText();
          this.dom.previewText.nodeValue = (0, m.limitCharacters)(e2, s.WF), this.dom.fileSizeInfo && (this.dom.fileSizeInfo.innerText = "Size: " + (0, m.formatSize)(e2.length)), this.dom.arrayInfo && (Array.isArray(this.json) ? this.dom.arrayInfo.innerText = "Array: " + this.json.length + " items" : this.dom.arrayInfo.innerText = "");
        }, _onChange: function() {
          if (this._debouncedValidate(), this.options.onChange) try {
            this.options.onChange();
          } catch (e2) {
            console.error("Error in onChange callback: ", e2);
          }
          if (this.options.onChangeJSON) try {
            this.options.onChangeJSON(this.get());
          } catch (e2) {
            console.error("Error in onChangeJSON callback: ", e2);
          }
          if (this.options.onChangeText) try {
            this.options.onChangeText(this.getText());
          } catch (e2) {
            console.error("Error in onChangeText callback: ", e2);
          }
        } }, f = (t._showSortModal = function() {
          var r2 = this;
          this.executeWithBusyMessage(function() {
            var e2 = r2.options.modalAnchor || s.qD, o3 = r2.get();
            r2._renderPreview(), (0, g.showSortModal)(e2, o3, function(i3) {
              r2.executeWithBusyMessage(function() {
                var e3, t2, n3;
                e3 = o3, t2 = i3, Array.isArray(e3) && (n3 = (0, m.sort)(e3, t2.path, t2.direction), r2.sortedBy = t2, r2._setAndFireOnChange(n3)), (0, m.isObject)(e3) && (n3 = (0, m.sortObjectKeys)(e3, t2.direction), r2.sortedBy = t2, r2._setAndFireOnChange(n3));
              }, "sorting...");
            }, r2.sortedBy);
          }, "parsing...");
        }, t._showTransformModal = function() {
          var r2 = this;
          this.executeWithBusyMessage(function() {
            var e2 = r2.options, t2 = e2.createQuery, n3 = e2.executeQuery, i3 = e2.modalAnchor, e2 = e2.queryDescription, o3 = r2.get();
            r2._renderPreview(), (0, p.showTransformModal)({ container: i3 || s.qD, json: o3, queryDescription: e2, createQuery: t2, executeQuery: n3, onTransform: function(t3) {
              r2.executeWithBusyMessage(function() {
                var e3 = n3(o3, t3);
                r2._setAndFireOnChange(e3);
              }, "transforming...");
            } });
          }, "parsing...");
        }, t.destroy = function() {
          this.frame && this.container && this.frame.parentNode === this.container && this.container.removeChild(this.frame), this.modeSwitcher && (this.modeSwitcher.destroy(), this.modeSwitcher = null), this._debouncedValidate = null, this.history && (this.history.clear(), this.history = null), this.frameFocusTracker.destroy();
        }, t.compact = function() {
          var e2 = this.get(), t2 = JSON.stringify(e2);
          this._setTextAndFireOnChange(t2, e2);
        }, t.format = function() {
          var e2 = this.get(), t2 = JSON.stringify(e2, null, this.indentation);
          this._setTextAndFireOnChange(t2, e2);
        }, t.repair = function() {
          var e2 = this.getText();
          try {
            var t2 = (0, i2.K)(e2);
            this._setTextAndFireOnChange(t2);
          } catch (e3) {
          }
        }, t.focus = function() {
          this.dom.transform.focus();
        }, t.set = function(e2) {
          this.history && this.history.clear(), this._set(e2);
        }, t.update = function(e2) {
          this._set(e2);
        }, t._set = function(e2) {
          this.text = void 0, this.json = e2, this._renderPreview(), this._pushHistory(), this._debouncedValidate();
        }, t._setAndFireOnChange = function(e2) {
          this._set(e2), this._onChange();
        }, t.get = function() {
          var e2;
          return void 0 === this.json && (e2 = this.getText(), this.json = (0, m.parse)(e2)), this.json;
        }, t.getText = function() {
          return void 0 === this.text && (this.text = JSON.stringify(this.json, null, this.indentation), true === this.options.escapeUnicode) && (this.text = (0, m.escapeUnicodeChars)(this.text)), this.text;
        }, t.setText = function(e2) {
          this.history && this.history.clear(), this._setText(e2);
        }, t.updateText = function(e2) {
          this.getText() !== e2 && this._setText(e2);
        }, t._setText = function(e2, t2) {
          var n3;
          true === this.options.escapeUnicode ? this.text = (0, m.escapeUnicodeChars)(e2) : this.text = e2, this.json = t2, this._renderPreview(), void 0 === this.json ? (n3 = this).executeWithBusyMessage(function() {
            try {
              n3.json = n3.get(), n3._renderPreview(), n3._pushHistory();
            } catch (e3) {
            }
          }, "parsing...") : this._pushHistory(), this._debouncedValidate();
        }, t._setTextAndFireOnChange = function(e2, t2) {
          this._setText(e2, t2), this._onChange();
        }, t._applyHistory = function(e2) {
          this.json = e2.json, this.text = e2.text, this._renderPreview(), this._debouncedValidate();
        }, t._pushHistory = function() {
          var e2;
          this.history && (e2 = { text: this.text, json: this.json }, this.history.add(e2));
        }, t.executeWithBusyMessage = function(e2, t2) {
          var n3;
          this.getText().length > s.EX ? ((0, m.addClassName)((n3 = this).frame, "busy"), n3.dom.busyContent.innerText = t2, setTimeout(function() {
            e2(), (0, m.removeClassName)(n3.frame, "busy"), n3.dom.busyContent.innerText = "";
          }, 100)) : e2();
        }, t.validate = n2.validate, t._renderErrors = n2._renderErrors, [{ mode: "preview", mixin: t, data: "json" }]);
      }, 6210: function(e, t, n2) {
        "use strict";
        n2.r(t), n2.d(t, { showSortModal: function() {
          return s;
        } });
        var t = n2(483), i2 = n2.n(t), o2 = n2(7907), r = n2(9791);
        function s(e2, t2, s2, n3) {
          var a = Array.isArray(t2) ? (0, r.getChildPaths)(t2) : [""], l = n3 && n3.path && (0, r.contains)(a, n3.path) ? n3.path : a[0], c = n3 && n3.direction || "asc", t2 = '';
          i2()({ parent: e2, content: t2, overlayClass: "jsoneditor-modal-overlay", overlayStyles: { backgroundColor: "rgb(1,1,1)", opacity: 0.3 }, modalClass: "jsoneditor-modal jsoneditor-modal-sort" }).afterCreate(function(t3) {
            var e3 = t3.modalElem().querySelector("form"), n4 = t3.modalElem().querySelector("#ok"), i3 = t3.modalElem().querySelector("#field"), o3 = t3.modalElem().querySelector("#direction");
            function r2(e4) {
              o3.value = e4, o3.className = "jsoneditor-button-group jsoneditor-button-group-value-" + o3.value;
            }
            a.forEach(function(e4) {
              var t4, n5 = document.createElement("option");
              n5.text = "" === (t4 = e4) ? "@" : "." === t4[0] ? t4.slice(1) : t4, n5.value = e4, i3.appendChild(n5);
            }), i3.value = l || a[0], r2(c || "asc"), o3.onclick = function(e4) {
              r2(e4.target.getAttribute("data-value"));
            }, n4.onclick = function(e4) {
              e4.preventDefault(), e4.stopPropagation(), t3.close(), s2({ path: i3.value, direction: o3.value });
            }, e3 && (e3.onsubmit = n4.onclick);
          }).afterClose(function(e3) {
            e3.destroy();
          }).show();
        }
      }, 2558: function(e, t, n2) {
        "use strict";
        n2.r(t), n2.d(t, { showTransformModal: function() {
          return s;
        } });
        var t = n2(483), i2 = n2.n(t), t = n2(3879), x = n2.n(t), o2 = n2(7907);
        function I(e2) {
          return (I = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e3) {
            return typeof e3;
          } : function(e3) {
            return e3 && "function" == typeof Symbol && e3.constructor === Symbol && e3 !== Symbol.prototype ? "symbol" : typeof e3;
          })(e2);
        }
        function k(e2, t2, n3, i3) {
          if ("boolean" == typeof e2 || e2 instanceof Boolean || null === e2 || "number" == typeof e2 || e2 instanceof Number || "string" == typeof e2 || e2 instanceof String || e2 instanceof Date) return JSON.stringify(e2);
          if (Array.isArray(e2)) {
            for (var o3 = e2, r2 = t2, s2 = n3, a = i3, l = r2 ? s2 + r2 : void 0, c = r2 ? "[\n" : "[", h = 0; h < o3.length; h++) {
              var d = o3[h];
              if (r2 && (c += l), c += void 0 !== d && "function" != typeof d ? k(d, r2, l, a) : "null", h < o3.length - 1 && (c += r2 ? ",\n" : ","), c.length > a) return c + "...";
            }
            return c += r2 ? "\n" + s2 + "]" : "]";
          }
          if (e2 && "object" === I(e2)) {
            var u, g = e2, p = t2, s2 = n3, m = i3, f = p ? s2 + p : void 0, C = true, y = p ? "{\n" : "{";
            if ("function" == typeof g.toJSON) return k(g.toJSON(), p, s2, m);
            for (u in g) if (function(e3, t3) {
              return Object.prototype.hasOwnProperty.call(e3, t3);
            }(g, u)) {
              var v = g[u];
              if (C ? C = false : y += p ? ",\n" : ",", (y = (y += p ? f + '"' + u + '": ' : '"' + u + '":') + k(v, p, f, m)).length > m) return y + "...";
            }
            return y += p ? "\n" + s2 + "}" : "}";
          }
        }
        function E(e2, t2) {
          for (var n3 = ""; 0 < t2--; ) n3 += e2;
          return n3;
        }
        var T = n2(9791), R = n2(4188), r = 'Enter a JMESPath query to filter, sort, or transform the JSON data.
To learn JMESPath, go to the interactive tutorial.';
        function s(e2) {
          var t2 = e2.container, I2 = e2.json, n3 = e2.queryDescription, n3 = void 0 === n3 ? r : n3, b = e2.createQuery, A = e2.executeQuery, w = e2.onTransform, S = I2, e2 = '