MediaWiki:Gadget-Navigation popups.js

MediaWiki系统消息页面
/**
 * SPDX-License-Identifier: CC-BY-SA-4.0
 * _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
 *
 * @base {@link https://en.wikipedia.org/wiki/MediaWiki:Gadget-popups.js}
 * @base {@link https://zh.wikipedia.org/w/index.php?title=User:Lupin/strings-draft&oldid=579996170}
 * @base {@link https://zh.wikipedia.org/wiki/MediaWiki:Gadget-navpop.css}
 * @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/Navigation_popups}
 * @license CC-BY-SA-4.0 {@link https://www.qiuwenbaike.cn/wiki/H:CC-BY-SA-4.0}
 */
/**
 * +------------------------------------------------------------+
 * |            === WARNING: GLOBAL GADGET FILE ===             |
 * +------------------------------------------------------------+
 * |       All changes should be made in the repository,        |
 * |                otherwise they will be lost.                |
 * +------------------------------------------------------------+
 * |        Changes to this page may affect many users.         |
 * | Please discuss changes by opening an issue before editing. |
 * +------------------------------------------------------------+
 */
/* <nowiki> */

(() => {

"use strict";
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/global.js
var require_global = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/global.js"(exports, module2) {
    "use strict";
    var check = function(it) {
      return it && it.Math === Math && it;
    };
    module2.exports = // eslint-disable-next-line es/no-global-this -- safe
    check(typeof globalThis == "object" && globalThis) || check(typeof window == "object" && window) || // eslint-disable-next-line no-restricted-globals -- safe
    check(typeof self == "object" && self) || check(typeof global == "object" && global) || check(typeof exports == "object" && exports) || // eslint-disable-next-line no-new-func -- fallback
    /* @__PURE__ */ function() {
      return this;
    }() || Function("return this")();
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/fails.js
var require_fails = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/fails.js"(exports, module2) {
    "use strict";
    module2.exports = function(exec) {
      try {
        return !!exec();
      } catch (error) {
        return true;
      }
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/descriptors.js
var require_descriptors = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/descriptors.js"(exports, module2) {
    "use strict";
    var fails = require_fails();
    module2.exports = !fails(function() {
      return Object.defineProperty({}, 1, { get: function() {
        return 7;
      } })[1] !== 7;
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-bind-native.js
var require_function_bind_native = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-bind-native.js"(exports, module2) {
    "use strict";
    var fails = require_fails();
    module2.exports = !fails(function() {
      var test = function() {
      }.bind();
      return typeof test != "function" || test.hasOwnProperty("prototype");
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-call.js
var require_function_call = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-call.js"(exports, module2) {
    "use strict";
    var NATIVE_BIND = require_function_bind_native();
    var call = Function.prototype.call;
    module2.exports = NATIVE_BIND ? call.bind(call) : function() {
      return call.apply(call, arguments);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-property-is-enumerable.js
var require_object_property_is_enumerable = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-property-is-enumerable.js"(exports) {
    "use strict";
    var $propertyIsEnumerable = {}.propertyIsEnumerable;
    var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
    var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);
    exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
      var descriptor = getOwnPropertyDescriptor(this, V);
      return !!descriptor && descriptor.enumerable;
    } : $propertyIsEnumerable;
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-property-descriptor.js
var require_create_property_descriptor = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-property-descriptor.js"(exports, module2) {
    "use strict";
    module2.exports = function(bitmap, value) {
      return {
        enumerable: !(bitmap & 1),
        configurable: !(bitmap & 2),
        writable: !(bitmap & 4),
        value
      };
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-uncurry-this.js
var require_function_uncurry_this = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-uncurry-this.js"(exports, module2) {
    "use strict";
    var NATIVE_BIND = require_function_bind_native();
    var FunctionPrototype = Function.prototype;
    var call = FunctionPrototype.call;
    var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);
    module2.exports = NATIVE_BIND ? uncurryThisWithBind : function(fn) {
      return function() {
        return call.apply(fn, arguments);
      };
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/classof-raw.js
var require_classof_raw = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/classof-raw.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    var toString = uncurryThis({}.toString);
    var stringSlice = uncurryThis("".slice);
    module2.exports = function(it) {
      return stringSlice(toString(it), 8, -1);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/indexed-object.js
var require_indexed_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/indexed-object.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    var fails = require_fails();
    var classof = require_classof_raw();
    var $Object = Object;
    var split = uncurryThis("".split);
    module2.exports = fails(function() {
      return !$Object("z").propertyIsEnumerable(0);
    }) ? function(it) {
      return classof(it) === "String" ? split(it, "") : $Object(it);
    } : $Object;
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-null-or-undefined.js
var require_is_null_or_undefined = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-null-or-undefined.js"(exports, module2) {
    "use strict";
    module2.exports = function(it) {
      return it === null || it === void 0;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/require-object-coercible.js
var require_require_object_coercible = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/require-object-coercible.js"(exports, module2) {
    "use strict";
    var isNullOrUndefined = require_is_null_or_undefined();
    var $TypeError = TypeError;
    module2.exports = function(it) {
      if (isNullOrUndefined(it))
        throw new $TypeError("Can't call method on " + it);
      return it;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-indexed-object.js
var require_to_indexed_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-indexed-object.js"(exports, module2) {
    "use strict";
    var IndexedObject = require_indexed_object();
    var requireObjectCoercible = require_require_object_coercible();
    module2.exports = function(it) {
      return IndexedObject(requireObjectCoercible(it));
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-callable.js
var require_is_callable = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-callable.js"(exports, module2) {
    "use strict";
    var documentAll = typeof document == "object" && document.all;
    module2.exports = typeof documentAll == "undefined" && documentAll !== void 0 ? function(argument) {
      return typeof argument == "function" || argument === documentAll;
    } : function(argument) {
      return typeof argument == "function";
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-object.js
var require_is_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-object.js"(exports, module2) {
    "use strict";
    var isCallable = require_is_callable();
    module2.exports = function(it) {
      return typeof it == "object" ? it !== null : isCallable(it);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-built-in.js
var require_get_built_in = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-built-in.js"(exports, module2) {
    "use strict";
    var global2 = require_global();
    var isCallable = require_is_callable();
    var aFunction = function(argument) {
      return isCallable(argument) ? argument : void 0;
    };
    module2.exports = function(namespace, method) {
      return arguments.length < 2 ? aFunction(global2[namespace]) : global2[namespace] && global2[namespace][method];
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-is-prototype-of.js
var require_object_is_prototype_of = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-is-prototype-of.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    module2.exports = uncurryThis({}.isPrototypeOf);
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-user-agent.js
var require_engine_user_agent = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-user-agent.js"(exports, module2) {
    "use strict";
    module2.exports = typeof navigator != "undefined" && String(navigator.userAgent) || "";
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-v8-version.js
var require_engine_v8_version = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/engine-v8-version.js"(exports, module2) {
    "use strict";
    var global2 = require_global();
    var userAgent = require_engine_user_agent();
    var process = global2.process;
    var Deno = global2.Deno;
    var versions = process && process.versions || Deno && Deno.version;
    var v8 = versions && versions.v8;
    var match;
    var version;
    if (v8) {
      match = v8.split(".");
      version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
    }
    if (!version && userAgent) {
      match = userAgent.match(/Edge\/(\d+)/);
      if (!match || match[1] >= 74) {
        match = userAgent.match(/Chrome\/(\d+)/);
        if (match)
          version = +match[1];
      }
    }
    module2.exports = version;
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/symbol-constructor-detection.js
var require_symbol_constructor_detection = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/symbol-constructor-detection.js"(exports, module2) {
    "use strict";
    var V8_VERSION = require_engine_v8_version();
    var fails = require_fails();
    var global2 = require_global();
    var $String = global2.String;
    module2.exports = !!Object.getOwnPropertySymbols && !fails(function() {
      var symbol = Symbol("symbol detection");
      return !$String(symbol) || !(Object(symbol) instanceof Symbol) || // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
      !Symbol.sham && V8_VERSION && V8_VERSION < 41;
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/use-symbol-as-uid.js
var require_use_symbol_as_uid = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/use-symbol-as-uid.js"(exports, module2) {
    "use strict";
    var NATIVE_SYMBOL = require_symbol_constructor_detection();
    module2.exports = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == "symbol";
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-symbol.js
var require_is_symbol = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-symbol.js"(exports, module2) {
    "use strict";
    var getBuiltIn = require_get_built_in();
    var isCallable = require_is_callable();
    var isPrototypeOf = require_object_is_prototype_of();
    var USE_SYMBOL_AS_UID = require_use_symbol_as_uid();
    var $Object = Object;
    module2.exports = USE_SYMBOL_AS_UID ? function(it) {
      return typeof it == "symbol";
    } : function(it) {
      var $Symbol = getBuiltIn("Symbol");
      return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/try-to-string.js
var require_try_to_string = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/try-to-string.js"(exports, module2) {
    "use strict";
    var $String = String;
    module2.exports = function(argument) {
      try {
        return $String(argument);
      } catch (error) {
        return "Object";
      }
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/a-callable.js
var require_a_callable = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/a-callable.js"(exports, module2) {
    "use strict";
    var isCallable = require_is_callable();
    var tryToString = require_try_to_string();
    var $TypeError = TypeError;
    module2.exports = function(argument) {
      if (isCallable(argument))
        return argument;
      throw new $TypeError(tryToString(argument) + " is not a function");
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-method.js
var require_get_method = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/get-method.js"(exports, module2) {
    "use strict";
    var aCallable = require_a_callable();
    var isNullOrUndefined = require_is_null_or_undefined();
    module2.exports = function(V, P) {
      var func = V[P];
      return isNullOrUndefined(func) ? void 0 : aCallable(func);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ordinary-to-primitive.js
var require_ordinary_to_primitive = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ordinary-to-primitive.js"(exports, module2) {
    "use strict";
    var call = require_function_call();
    var isCallable = require_is_callable();
    var isObject = require_is_object();
    var $TypeError = TypeError;
    module2.exports = function(input, pref) {
      var fn, val;
      if (pref === "string" && isCallable(fn = input.toString) && !isObject(val = call(fn, input)))
        return val;
      if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input)))
        return val;
      if (pref !== "string" && isCallable(fn = input.toString) && !isObject(val = call(fn, input)))
        return val;
      throw new $TypeError("Can't convert object to primitive value");
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-pure.js
var require_is_pure = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-pure.js"(exports, module2) {
    "use strict";
    module2.exports = false;
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-global-property.js
var require_define_global_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-global-property.js"(exports, module2) {
    "use strict";
    var global2 = require_global();
    var defineProperty = Object.defineProperty;
    module2.exports = function(key, value) {
      try {
        defineProperty(global2, key, { value, configurable: true, writable: true });
      } catch (error) {
        global2[key] = value;
      }
      return value;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-store.js
var require_shared_store = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-store.js"(exports, module2) {
    "use strict";
    var IS_PURE = require_is_pure();
    var globalThis2 = require_global();
    var defineGlobalProperty = require_define_global_property();
    var SHARED = "__core-js_shared__";
    var store = module2.exports = globalThis2[SHARED] || defineGlobalProperty(SHARED, {});
    (store.versions || (store.versions = [])).push({
      version: "3.37.0",
      mode: IS_PURE ? "pure" : "global",
      copyright: "© 2014-2024 Denis Pushkarev (zloirock.ru)",
      license: "https://github.com/zloirock/core-js/blob/v3.37.0/LICENSE",
      source: "https://github.com/zloirock/core-js"
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared.js
var require_shared = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared.js"(exports, module2) {
    "use strict";
    var store = require_shared_store();
    module2.exports = function(key, value) {
      return store[key] || (store[key] = value || {});
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-object.js
var require_to_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-object.js"(exports, module2) {
    "use strict";
    var requireObjectCoercible = require_require_object_coercible();
    var $Object = Object;
    module2.exports = function(argument) {
      return $Object(requireObjectCoercible(argument));
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/has-own-property.js
var require_has_own_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/has-own-property.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    var toObject = require_to_object();
    var hasOwnProperty = uncurryThis({}.hasOwnProperty);
    module2.exports = Object.hasOwn || function hasOwn(it, key) {
      return hasOwnProperty(toObject(it), key);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/uid.js
var require_uid = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/uid.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    var id = 0;
    var postfix = Math.random();
    var toString = uncurryThis(1 .toString);
    module2.exports = function(key) {
      return "Symbol(" + (key === void 0 ? "" : key) + ")_" + toString(++id + postfix, 36);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/well-known-symbol.js
var require_well_known_symbol = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/well-known-symbol.js"(exports, module2) {
    "use strict";
    var global2 = require_global();
    var shared = require_shared();
    var hasOwn = require_has_own_property();
    var uid = require_uid();
    var NATIVE_SYMBOL = require_symbol_constructor_detection();
    var USE_SYMBOL_AS_UID = require_use_symbol_as_uid();
    var Symbol2 = global2.Symbol;
    var WellKnownSymbolsStore = shared("wks");
    var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol2["for"] || Symbol2 : Symbol2 && Symbol2.withoutSetter || uid;
    module2.exports = function(name) {
      if (!hasOwn(WellKnownSymbolsStore, name)) {
        WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol2, name) ? Symbol2[name] : createWellKnownSymbol("Symbol." + name);
      }
      return WellKnownSymbolsStore[name];
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-primitive.js
var require_to_primitive = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-primitive.js"(exports, module2) {
    "use strict";
    var call = require_function_call();
    var isObject = require_is_object();
    var isSymbol = require_is_symbol();
    var getMethod = require_get_method();
    var ordinaryToPrimitive = require_ordinary_to_primitive();
    var wellKnownSymbol = require_well_known_symbol();
    var $TypeError = TypeError;
    var TO_PRIMITIVE = wellKnownSymbol("toPrimitive");
    module2.exports = function(input, pref) {
      if (!isObject(input) || isSymbol(input))
        return input;
      var exoticToPrim = getMethod(input, TO_PRIMITIVE);
      var result;
      if (exoticToPrim) {
        if (pref === void 0)
          pref = "default";
        result = call(exoticToPrim, input, pref);
        if (!isObject(result) || isSymbol(result))
          return result;
        throw new $TypeError("Can't convert object to primitive value");
      }
      if (pref === void 0)
        pref = "number";
      return ordinaryToPrimitive(input, pref);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-property-key.js
var require_to_property_key = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-property-key.js"(exports, module2) {
    "use strict";
    var toPrimitive = require_to_primitive();
    var isSymbol = require_is_symbol();
    module2.exports = function(argument) {
      var key = toPrimitive(argument, "string");
      return isSymbol(key) ? key : key + "";
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/document-create-element.js
var require_document_create_element = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/document-create-element.js"(exports, module2) {
    "use strict";
    var global2 = require_global();
    var isObject = require_is_object();
    var document2 = global2.document;
    var EXISTS = isObject(document2) && isObject(document2.createElement);
    module2.exports = function(it) {
      return EXISTS ? document2.createElement(it) : {};
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ie8-dom-define.js
var require_ie8_dom_define = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/ie8-dom-define.js"(exports, module2) {
    "use strict";
    var DESCRIPTORS = require_descriptors();
    var fails = require_fails();
    var createElement = require_document_create_element();
    module2.exports = !DESCRIPTORS && !fails(function() {
      return Object.defineProperty(createElement("div"), "a", {
        get: function() {
          return 7;
        }
      }).a !== 7;
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-descriptor.js
var require_object_get_own_property_descriptor = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-descriptor.js"(exports) {
    "use strict";
    var DESCRIPTORS = require_descriptors();
    var call = require_function_call();
    var propertyIsEnumerableModule = require_object_property_is_enumerable();
    var createPropertyDescriptor = require_create_property_descriptor();
    var toIndexedObject = require_to_indexed_object();
    var toPropertyKey = require_to_property_key();
    var hasOwn = require_has_own_property();
    var IE8_DOM_DEFINE = require_ie8_dom_define();
    var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
    exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
      O = toIndexedObject(O);
      P = toPropertyKey(P);
      if (IE8_DOM_DEFINE)
        try {
          return $getOwnPropertyDescriptor(O, P);
        } catch (error) {
        }
      if (hasOwn(O, P))
        return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/v8-prototype-define-bug.js
var require_v8_prototype_define_bug = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/v8-prototype-define-bug.js"(exports, module2) {
    "use strict";
    var DESCRIPTORS = require_descriptors();
    var fails = require_fails();
    module2.exports = DESCRIPTORS && fails(function() {
      return Object.defineProperty(function() {
      }, "prototype", {
        value: 42,
        writable: false
      }).prototype !== 42;
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/an-object.js
var require_an_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/an-object.js"(exports, module2) {
    "use strict";
    var isObject = require_is_object();
    var $String = String;
    var $TypeError = TypeError;
    module2.exports = function(argument) {
      if (isObject(argument))
        return argument;
      throw new $TypeError($String(argument) + " is not an object");
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-define-property.js
var require_object_define_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-define-property.js"(exports) {
    "use strict";
    var DESCRIPTORS = require_descriptors();
    var IE8_DOM_DEFINE = require_ie8_dom_define();
    var V8_PROTOTYPE_DEFINE_BUG = require_v8_prototype_define_bug();
    var anObject = require_an_object();
    var toPropertyKey = require_to_property_key();
    var $TypeError = TypeError;
    var $defineProperty = Object.defineProperty;
    var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
    var ENUMERABLE = "enumerable";
    var CONFIGURABLE = "configurable";
    var WRITABLE = "writable";
    exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {
      anObject(O);
      P = toPropertyKey(P);
      anObject(Attributes);
      if (typeof O === "function" && P === "prototype" && "value" in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
        var current = $getOwnPropertyDescriptor(O, P);
        if (current && current[WRITABLE]) {
          O[P] = Attributes.value;
          Attributes = {
            configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],
            enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
            writable: false
          };
        }
      }
      return $defineProperty(O, P, Attributes);
    } : $defineProperty : function defineProperty(O, P, Attributes) {
      anObject(O);
      P = toPropertyKey(P);
      anObject(Attributes);
      if (IE8_DOM_DEFINE)
        try {
          return $defineProperty(O, P, Attributes);
        } catch (error) {
        }
      if ("get" in Attributes || "set" in Attributes)
        throw new $TypeError("Accessors not supported");
      if ("value" in Attributes)
        O[P] = Attributes.value;
      return O;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-non-enumerable-property.js
var require_create_non_enumerable_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/create-non-enumerable-property.js"(exports, module2) {
    "use strict";
    var DESCRIPTORS = require_descriptors();
    var definePropertyModule = require_object_define_property();
    var createPropertyDescriptor = require_create_property_descriptor();
    module2.exports = DESCRIPTORS ? function(object, key, value) {
      return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
    } : function(object, key, value) {
      object[key] = value;
      return object;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-name.js
var require_function_name = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/function-name.js"(exports, module2) {
    "use strict";
    var DESCRIPTORS = require_descriptors();
    var hasOwn = require_has_own_property();
    var FunctionPrototype = Function.prototype;
    var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;
    var EXISTS = hasOwn(FunctionPrototype, "name");
    var PROPER = EXISTS && function something() {
    }.name === "something";
    var CONFIGURABLE = EXISTS && (!DESCRIPTORS || DESCRIPTORS && getDescriptor(FunctionPrototype, "name").configurable);
    module2.exports = {
      EXISTS,
      PROPER,
      CONFIGURABLE
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/inspect-source.js
var require_inspect_source = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/inspect-source.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    var isCallable = require_is_callable();
    var store = require_shared_store();
    var functionToString = uncurryThis(Function.toString);
    if (!isCallable(store.inspectSource)) {
      store.inspectSource = function(it) {
        return functionToString(it);
      };
    }
    module2.exports = store.inspectSource;
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/weak-map-basic-detection.js
var require_weak_map_basic_detection = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/weak-map-basic-detection.js"(exports, module2) {
    "use strict";
    var global2 = require_global();
    var isCallable = require_is_callable();
    var WeakMap = global2.WeakMap;
    module2.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-key.js
var require_shared_key = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/shared-key.js"(exports, module2) {
    "use strict";
    var shared = require_shared();
    var uid = require_uid();
    var keys = shared("keys");
    module2.exports = function(key) {
      return keys[key] || (keys[key] = uid(key));
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/hidden-keys.js
var require_hidden_keys = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/hidden-keys.js"(exports, module2) {
    "use strict";
    module2.exports = {};
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/internal-state.js
var require_internal_state = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/internal-state.js"(exports, module2) {
    "use strict";
    var NATIVE_WEAK_MAP = require_weak_map_basic_detection();
    var global2 = require_global();
    var isObject = require_is_object();
    var createNonEnumerableProperty = require_create_non_enumerable_property();
    var hasOwn = require_has_own_property();
    var shared = require_shared_store();
    var sharedKey = require_shared_key();
    var hiddenKeys = require_hidden_keys();
    var OBJECT_ALREADY_INITIALIZED = "Object already initialized";
    var TypeError2 = global2.TypeError;
    var WeakMap = global2.WeakMap;
    var set;
    var get;
    var has;
    var enforce = function(it) {
      return has(it) ? get(it) : set(it, {});
    };
    var getterFor = function(TYPE) {
      return function(it) {
        var state;
        if (!isObject(it) || (state = get(it)).type !== TYPE) {
          throw new TypeError2("Incompatible receiver, " + TYPE + " required");
        }
        return state;
      };
    };
    if (NATIVE_WEAK_MAP || shared.state) {
      store = shared.state || (shared.state = new WeakMap());
      store.get = store.get;
      store.has = store.has;
      store.set = store.set;
      set = function(it, metadata) {
        if (store.has(it))
          throw new TypeError2(OBJECT_ALREADY_INITIALIZED);
        metadata.facade = it;
        store.set(it, metadata);
        return metadata;
      };
      get = function(it) {
        return store.get(it) || {};
      };
      has = function(it) {
        return store.has(it);
      };
    } else {
      STATE = sharedKey("state");
      hiddenKeys[STATE] = true;
      set = function(it, metadata) {
        if (hasOwn(it, STATE))
          throw new TypeError2(OBJECT_ALREADY_INITIALIZED);
        metadata.facade = it;
        createNonEnumerableProperty(it, STATE, metadata);
        return metadata;
      };
      get = function(it) {
        return hasOwn(it, STATE) ? it[STATE] : {};
      };
      has = function(it) {
        return hasOwn(it, STATE);
      };
    }
    var store;
    var STATE;
    module2.exports = {
      set,
      get,
      has,
      enforce,
      getterFor
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/make-built-in.js
var require_make_built_in = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/make-built-in.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    var fails = require_fails();
    var isCallable = require_is_callable();
    var hasOwn = require_has_own_property();
    var DESCRIPTORS = require_descriptors();
    var CONFIGURABLE_FUNCTION_NAME = require_function_name().CONFIGURABLE;
    var inspectSource = require_inspect_source();
    var InternalStateModule = require_internal_state();
    var enforceInternalState = InternalStateModule.enforce;
    var getInternalState = InternalStateModule.get;
    var $String = String;
    var defineProperty = Object.defineProperty;
    var stringSlice = uncurryThis("".slice);
    var replace = uncurryThis("".replace);
    var join = uncurryThis([].join);
    var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function() {
      return defineProperty(function() {
      }, "length", { value: 8 }).length !== 8;
    });
    var TEMPLATE = String(String).split("String");
    var makeBuiltIn = module2.exports = function(value, name, options) {
      if (stringSlice($String(name), 0, 7) === "Symbol(") {
        name = "[" + replace($String(name), /^Symbol\(([^)]*)\).*$/, "$1") + "]";
      }
      if (options && options.getter)
        name = "get " + name;
      if (options && options.setter)
        name = "set " + name;
      if (!hasOwn(value, "name") || CONFIGURABLE_FUNCTION_NAME && value.name !== name) {
        if (DESCRIPTORS)
          defineProperty(value, "name", { value: name, configurable: true });
        else
          value.name = name;
      }
      if (CONFIGURABLE_LENGTH && options && hasOwn(options, "arity") && value.length !== options.arity) {
        defineProperty(value, "length", { value: options.arity });
      }
      try {
        if (options && hasOwn(options, "constructor") && options.constructor) {
          if (DESCRIPTORS)
            defineProperty(value, "prototype", { writable: false });
        } else if (value.prototype)
          value.prototype = void 0;
      } catch (error) {
      }
      var state = enforceInternalState(value);
      if (!hasOwn(state, "source")) {
        state.source = join(TEMPLATE, typeof name == "string" ? name : "");
      }
      return value;
    };
    Function.prototype.toString = makeBuiltIn(function toString() {
      return isCallable(this) && getInternalState(this).source || inspectSource(this);
    }, "toString");
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in.js
var require_define_built_in = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in.js"(exports, module2) {
    "use strict";
    var isCallable = require_is_callable();
    var definePropertyModule = require_object_define_property();
    var makeBuiltIn = require_make_built_in();
    var defineGlobalProperty = require_define_global_property();
    module2.exports = function(O, key, value, options) {
      if (!options)
        options = {};
      var simple = options.enumerable;
      var name = options.name !== void 0 ? options.name : key;
      if (isCallable(value))
        makeBuiltIn(value, name, options);
      if (options.global) {
        if (simple)
          O[key] = value;
        else
          defineGlobalProperty(key, value);
      } else {
        try {
          if (!options.unsafe)
            delete O[key];
          else if (O[key])
            simple = true;
        } catch (error) {
        }
        if (simple)
          O[key] = value;
        else
          definePropertyModule.f(O, key, {
            value,
            enumerable: false,
            configurable: !options.nonConfigurable,
            writable: !options.nonWritable
          });
      }
      return O;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/math-trunc.js
var require_math_trunc = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/math-trunc.js"(exports, module2) {
    "use strict";
    var ceil = Math.ceil;
    var floor = Math.floor;
    module2.exports = Math.trunc || function trunc(x) {
      var n = +x;
      return (n > 0 ? floor : ceil)(n);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-integer-or-infinity.js
var require_to_integer_or_infinity = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-integer-or-infinity.js"(exports, module2) {
    "use strict";
    var trunc = require_math_trunc();
    module2.exports = function(argument) {
      var number = +argument;
      return number !== number || number === 0 ? 0 : trunc(number);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-absolute-index.js
var require_to_absolute_index = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-absolute-index.js"(exports, module2) {
    "use strict";
    var toIntegerOrInfinity = require_to_integer_or_infinity();
    var max = Math.max;
    var min = Math.min;
    module2.exports = function(index, length) {
      var integer = toIntegerOrInfinity(index);
      return integer < 0 ? max(integer + length, 0) : min(integer, length);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-length.js
var require_to_length = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/to-length.js"(exports, module2) {
    "use strict";
    var toIntegerOrInfinity = require_to_integer_or_infinity();
    var min = Math.min;
    module2.exports = function(argument) {
      var len = toIntegerOrInfinity(argument);
      return len > 0 ? min(len, 9007199254740991) : 0;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/length-of-array-like.js
var require_length_of_array_like = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/length-of-array-like.js"(exports, module2) {
    "use strict";
    var toLength = require_to_length();
    module2.exports = function(obj) {
      return toLength(obj.length);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-includes.js
var require_array_includes = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-includes.js"(exports, module2) {
    "use strict";
    var toIndexedObject = require_to_indexed_object();
    var toAbsoluteIndex = require_to_absolute_index();
    var lengthOfArrayLike = require_length_of_array_like();
    var createMethod = function(IS_INCLUDES) {
      return function($this, el, fromIndex) {
        var O = toIndexedObject($this);
        var length = lengthOfArrayLike(O);
        if (length === 0)
          return !IS_INCLUDES && -1;
        var index = toAbsoluteIndex(fromIndex, length);
        var value;
        if (IS_INCLUDES && el !== el)
          while (length > index) {
            value = O[index++];
            if (value !== value)
              return true;
          }
        else
          for (; length > index; index++) {
            if ((IS_INCLUDES || index in O) && O[index] === el)
              return IS_INCLUDES || index || 0;
          }
        return !IS_INCLUDES && -1;
      };
    };
    module2.exports = {
      // `Array.prototype.includes` method
      // https://tc39.es/ecma262/#sec-array.prototype.includes
      includes: createMethod(true),
      // `Array.prototype.indexOf` method
      // https://tc39.es/ecma262/#sec-array.prototype.indexof
      indexOf: createMethod(false)
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-keys-internal.js
var require_object_keys_internal = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-keys-internal.js"(exports, module2) {
    "use strict";
    var uncurryThis = require_function_uncurry_this();
    var hasOwn = require_has_own_property();
    var toIndexedObject = require_to_indexed_object();
    var indexOf = require_array_includes().indexOf;
    var hiddenKeys = require_hidden_keys();
    var push = uncurryThis([].push);
    module2.exports = function(object, names) {
      var O = toIndexedObject(object);
      var i = 0;
      var result = [];
      var key;
      for (key in O)
        !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);
      while (names.length > i)
        if (hasOwn(O, key = names[i++])) {
          ~indexOf(result, key) || push(result, key);
        }
      return result;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/enum-bug-keys.js
var require_enum_bug_keys = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/enum-bug-keys.js"(exports, module2) {
    "use strict";
    module2.exports = [
      "constructor",
      "hasOwnProperty",
      "isPrototypeOf",
      "propertyIsEnumerable",
      "toLocaleString",
      "toString",
      "valueOf"
    ];
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-names.js
var require_object_get_own_property_names = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-names.js"(exports) {
    "use strict";
    var internalObjectKeys = require_object_keys_internal();
    var enumBugKeys = require_enum_bug_keys();
    var hiddenKeys = enumBugKeys.concat("length", "prototype");
    exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
      return internalObjectKeys(O, hiddenKeys);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-symbols.js
var require_object_get_own_property_symbols = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/object-get-own-property-symbols.js"(exports) {
    "use strict";
    exports.f = Object.getOwnPropertySymbols;
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/own-keys.js
var require_own_keys = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/own-keys.js"(exports, module2) {
    "use strict";
    var getBuiltIn = require_get_built_in();
    var uncurryThis = require_function_uncurry_this();
    var getOwnPropertyNamesModule = require_object_get_own_property_names();
    var getOwnPropertySymbolsModule = require_object_get_own_property_symbols();
    var anObject = require_an_object();
    var concat = uncurryThis([].concat);
    module2.exports = getBuiltIn("Reflect", "ownKeys") || function ownKeys(it) {
      var keys = getOwnPropertyNamesModule.f(anObject(it));
      var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
      return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/copy-constructor-properties.js
var require_copy_constructor_properties = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/copy-constructor-properties.js"(exports, module2) {
    "use strict";
    var hasOwn = require_has_own_property();
    var ownKeys = require_own_keys();
    var getOwnPropertyDescriptorModule = require_object_get_own_property_descriptor();
    var definePropertyModule = require_object_define_property();
    module2.exports = function(target, source, exceptions) {
      var keys = ownKeys(source);
      var defineProperty = definePropertyModule.f;
      var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
      for (var i = 0; i < keys.length; i++) {
        var key = keys[i];
        if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {
          defineProperty(target, key, getOwnPropertyDescriptor(source, key));
        }
      }
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-forced.js
var require_is_forced = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-forced.js"(exports, module2) {
    "use strict";
    var fails = require_fails();
    var isCallable = require_is_callable();
    var replacement = /#|\.prototype\./;
    var isForced = function(feature, detection) {
      var value = data[normalize(feature)];
      return value === POLYFILL ? true : value === NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection;
    };
    var normalize = isForced.normalize = function(string) {
      return String(string).replace(replacement, ".").toLowerCase();
    };
    var data = isForced.data = {};
    var NATIVE = isForced.NATIVE = "N";
    var POLYFILL = isForced.POLYFILL = "P";
    module2.exports = isForced;
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/export.js
var require_export = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/export.js"(exports, module2) {
    "use strict";
    var global2 = require_global();
    var getOwnPropertyDescriptor = require_object_get_own_property_descriptor().f;
    var createNonEnumerableProperty = require_create_non_enumerable_property();
    var defineBuiltIn = require_define_built_in();
    var defineGlobalProperty = require_define_global_property();
    var copyConstructorProperties = require_copy_constructor_properties();
    var isForced = require_is_forced();
    module2.exports = function(options, source) {
      var TARGET = options.target;
      var GLOBAL = options.global;
      var STATIC = options.stat;
      var FORCED, target, key, targetProperty, sourceProperty, descriptor;
      if (GLOBAL) {
        target = global2;
      } else if (STATIC) {
        target = global2[TARGET] || defineGlobalProperty(TARGET, {});
      } else {
        target = global2[TARGET] && global2[TARGET].prototype;
      }
      if (target)
        for (key in source) {
          sourceProperty = source[key];
          if (options.dontCallGetSet) {
            descriptor = getOwnPropertyDescriptor(target, key);
            targetProperty = descriptor && descriptor.value;
          } else
            targetProperty = target[key];
          FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? "." : "#") + key, options.forced);
          if (!FORCED && targetProperty !== void 0) {
            if (typeof sourceProperty == typeof targetProperty)
              continue;
            copyConstructorProperties(sourceProperty, targetProperty);
          }
          if (options.sham || targetProperty && targetProperty.sham) {
            createNonEnumerableProperty(sourceProperty, "sham", true);
          }
          defineBuiltIn(target, key, sourceProperty, options);
        }
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-array.js
var require_is_array = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/is-array.js"(exports, module2) {
    "use strict";
    var classof = require_classof_raw();
    module2.exports = Array.isArray || function isArray(argument) {
      return classof(argument) === "Array";
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-set-length.js
var require_array_set_length = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/array-set-length.js"(exports, module2) {
    "use strict";
    var DESCRIPTORS = require_descriptors();
    var isArray = require_is_array();
    var $TypeError = TypeError;
    var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
    var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function() {
      if (this !== void 0)
        return true;
      try {
        Object.defineProperty([], "length", { writable: false }).length = 1;
      } catch (error) {
        return error instanceof TypeError;
      }
    }();
    module2.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function(O, length) {
      if (isArray(O) && !getOwnPropertyDescriptor(O, "length").writable) {
        throw new $TypeError("Cannot set read only .length");
      }
      return O.length = length;
    } : function(O, length) {
      return O.length = length;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/does-not-exceed-safe-integer.js
var require_does_not_exceed_safe_integer = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/does-not-exceed-safe-integer.js"(exports, module2) {
    "use strict";
    var $TypeError = TypeError;
    var MAX_SAFE_INTEGER = 9007199254740991;
    module2.exports = function(it) {
      if (it > MAX_SAFE_INTEGER)
        throw $TypeError("Maximum allowed index exceeded");
      return it;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.push.js
var require_es_array_push = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.push.js"() {
    "use strict";
    var $2 = require_export();
    var toObject = require_to_object();
    var lengthOfArrayLike = require_length_of_array_like();
    var setArrayLength = require_array_set_length();
    var doesNotExceedSafeInteger = require_does_not_exceed_safe_integer();
    var fails = require_fails();
    var INCORRECT_TO_LENGTH = fails(function() {
      return [].push.call({ length: 4294967296 }, 1) !== 4294967297;
    });
    var properErrorOnNonWritableLength = function() {
      try {
        Object.defineProperty([], "length", { writable: false }).push();
      } catch (error) {
        return error instanceof TypeError;
      }
    };
    var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();
    $2({ target: "Array", proto: true, arity: 1, forced: FORCED }, {
      // eslint-disable-next-line no-unused-vars -- required for `.length`
      push: function push(item) {
        var O = toObject(this);
        var len = lengthOfArrayLike(O);
        var argCount = arguments.length;
        doesNotExceedSafeInteger(len + argCount);
        for (var i = 0; i < argCount; i++) {
          O[len] = arguments[i];
          len++;
        }
        setArrayLength(O, len);
        return len;
      }
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/delete-property-or-throw.js
var require_delete_property_or_throw = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/delete-property-or-throw.js"(exports, module2) {
    "use strict";
    var tryToString = require_try_to_string();
    var $TypeError = TypeError;
    module2.exports = function(O, P) {
      if (!delete O[P])
        throw new $TypeError("Cannot delete property " + tryToString(P) + " of " + tryToString(O));
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.unshift.js
var require_es_array_unshift = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.array.unshift.js"() {
    "use strict";
    var $2 = require_export();
    var toObject = require_to_object();
    var lengthOfArrayLike = require_length_of_array_like();
    var setArrayLength = require_array_set_length();
    var deletePropertyOrThrow = require_delete_property_or_throw();
    var doesNotExceedSafeInteger = require_does_not_exceed_safe_integer();
    var INCORRECT_RESULT = [].unshift(0) !== 1;
    var properErrorOnNonWritableLength = function() {
      try {
        Object.defineProperty([], "length", { writable: false }).unshift();
      } catch (error) {
        return error instanceof TypeError;
      }
    };
    var FORCED = INCORRECT_RESULT || !properErrorOnNonWritableLength();
    $2({ target: "Array", proto: true, arity: 1, forced: FORCED }, {
      // eslint-disable-next-line no-unused-vars -- required for `.length`
      unshift: function unshift(item) {
        var O = toObject(this);
        var len = lengthOfArrayLike(O);
        var argCount = arguments.length;
        if (argCount) {
          doesNotExceedSafeInteger(len + argCount);
          var k = len;
          while (k--) {
            var to = k + argCount;
            if (k in O)
              O[to] = O[k];
            else
              deletePropertyOrThrow(O, to);
          }
          for (var j = 0; j < argCount; j++) {
            O[j] = arguments[j];
          }
        }
        return setArrayLength(O, len + argCount);
      }
    });
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in-accessor.js
var require_define_built_in_accessor = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/define-built-in-accessor.js"(exports, module2) {
    "use strict";
    var makeBuiltIn = require_make_built_in();
    var defineProperty = require_object_define_property();
    module2.exports = function(target, name, descriptor) {
      if (descriptor.get)
        makeBuiltIn(descriptor.get, name, { getter: true });
      if (descriptor.set)
        makeBuiltIn(descriptor.set, name, { setter: true });
      return defineProperty.f(target, name, descriptor);
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/regexp-flags.js
var require_regexp_flags = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/internals/regexp-flags.js"(exports, module2) {
    "use strict";
    var anObject = require_an_object();
    module2.exports = function() {
      var that = anObject(this);
      var result = "";
      if (that.hasIndices)
        result += "d";
      if (that.global)
        result += "g";
      if (that.ignoreCase)
        result += "i";
      if (that.multiline)
        result += "m";
      if (that.dotAll)
        result += "s";
      if (that.unicode)
        result += "u";
      if (that.unicodeSets)
        result += "v";
      if (that.sticky)
        result += "y";
      return result;
    };
  }
});

// node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.regexp.flags.js
var require_es_regexp_flags = __commonJS({
  "node_modules/.pnpm/core-js@3.37.0/node_modules/core-js/modules/es.regexp.flags.js"() {
    "use strict";
    var global2 = require_global();
    var DESCRIPTORS = require_descriptors();
    var defineBuiltInAccessor = require_define_built_in_accessor();
    var regExpFlags = require_regexp_flags();
    var fails = require_fails();
    var RegExp2 = global2.RegExp;
    var RegExpPrototype = RegExp2.prototype;
    var FORCED = DESCRIPTORS && fails(function() {
      var INDICES_SUPPORT = true;
      try {
        RegExp2(".", "d");
      } catch (error) {
        INDICES_SUPPORT = false;
      }
      var O = {};
      var calls = "";
      var expected = INDICES_SUPPORT ? "dgimsy" : "gimsy";
      var addGetter = function(key2, chr) {
        Object.defineProperty(O, key2, { get: function() {
          calls += chr;
          return true;
        } });
      };
      var pairs = {
        dotAll: "s",
        global: "g",
        ignoreCase: "i",
        multiline: "m",
        sticky: "y"
      };
      if (INDICES_SUPPORT)
        pairs.hasIndices = "d";
      for (var key in pairs)
        addGetter(key, pairs[key]);
      var result = Object.getOwnPropertyDescriptor(RegExpPrototype, "flags").get.call(O);
      return result !== expected || calls !== expected;
    });
    if (FORCED)
      defineBuiltInAccessor(RegExpPrototype, "flags", {
        configurable: true,
        get: regExpFlags
      });
  }
});

// dist/Navigation_popups/Navigation_popups.js
require_es_array_push();
require_es_array_unshift();
require_es_regexp_flags();
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  try {
    var info = gen[key](arg);
    var value = info.value;
  } catch (error) {
    reject(error);
    return;
  }
  if (info.done) {
    resolve(value);
  } else {
    Promise.resolve(value).then(_next, _throw);
  }
}
function _asyncToGenerator(fn) {
  return function() {
    var self2 = this, args = arguments;
    return new Promise(function(resolve, reject) {
      var gen = fn.apply(self2, args);
      function _next(value) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
      }
      function _throw(err) {
        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
      }
      _next(void 0);
    });
  };
}
function _createForOfIteratorHelper(o, allowArrayLike) {
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
  if (!it) {
    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it)
        o = it;
      var i = 0;
      var F = function() {
      };
      return { s: F, n: function() {
        if (i >= o.length)
          return { done: true };
        return { done: false, value: o[i++] };
      }, e: function(e) {
        throw e;
      }, f: F };
    }
    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }
  var normalCompletion = true, didErr = false, err;
  return { s: function() {
    it = it.call(o);
  }, n: function() {
    var step = it.next();
    normalCompletion = step.done;
    return step;
  }, e: function(e) {
    didErr = true;
    err = e;
  }, f: function() {
    try {
      if (!normalCompletion && it.return != null)
        it.return();
    } finally {
      if (didErr)
        throw err;
    }
  } };
}
function _unsupportedIterableToArray(o, minLen) {
  if (!o)
    return;
  if (typeof o === "string")
    return _arrayLikeToArray(o, minLen);
  var n = Object.prototype.toString.call(o).slice(8, -1);
  if (n === "Object" && o.constructor)
    n = o.constructor.name;
  if (n === "Map" || n === "Set")
    return Array.from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
    return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length)
    len = arr.length;
  for (var i = 0, arr2 = new Array(len); i < len; i++)
    arr2[i] = arr[i];
  return arr2;
}
//! src/Navigation_popups/modules/api.ts
var import_ext_gadget = require("ext.gadget.Util");
var api = (0, import_ext_gadget.initMwApi)("Navigation popups/1.0");
//! src/Navigation_popups/modules/string.ts
var message = {
  // summary data, searching etc.
  article: window.wgULS("条目", "條目"),
  category: window.wgULS("个分类", "個分類"),
  categories: window.wgULS("个分类", "個分類"),
  image: window.wgULS("个文件", "個檔案"),
  images: window.wgULS("个文件", "個檔案"),
  stub: "小作品",
  "section stub": window.wgULS("小章节", "小章節"),
  "Empty page": window.wgULS("空页面", "空頁面"),
  kB: window.wgULS("千字节<sub>(以1000为一进)</sub>", "千位元組<sub>(以1000為一進)</sub>"),
  bytes: window.wgULS("字节", "位元組"),
  day: "天",
  days: "天",
  hour: window.wgULS("小时", "小時"),
  hours: window.wgULS("小时", "小時"),
  minute: "分",
  minutes: "分",
  second: "秒",
  seconds: "秒",
  week: "周",
  weeks: "周",
  month: "月",
  months: "月",
  year: "年",
  years: "年",
  search: window.wgULS("搜索", "搜尋"),
  SearchHint: window.wgULS("搜索包含 %s 的页面", "搜尋包含 %s 的頁面"),
  web: "Bing",
  global: "全域",
  "more...": "更多……",
  // article-related actions and info
  // (some actions also apply to user pages)
  actions: window.wgULS("操作", "動作"),
  // /// view articles and view talk
  popupsMenu: "Popups",
  "disable previews": window.wgULS("禁用预览", "禁用預覽"),
  togglePreviewsHint: window.wgULS("切换本页 Popups 的预览开关", "切換本頁 Popups 的預覽開關"),
  "toggle previews": window.wgULS("切换预览开关", "切換預覽開關"),
  reset: window.wgULS("复位", "複位"),
  disable: "禁用 Popups",
  disablePopupsHint: window.wgULS("在本页禁用 Popups,刷新页面以重新启用。", "在本頁禁用 Popups,重新整理頁面以重新啟用。"),
  purgePopupsHint: window.wgULS("复位 Popups,清除所有缓存数据。", "複位 Popups,清除所有快取資料。"),
  PopupsHint: window.wgULS("复位 Popups,清除所有缓存数据。", "複位 Popups,清除所有快取資料。"),
  spacebar: "空格",
  view: window.wgULS("查看", "檢視"),
  "view article": window.wgULS("查看条目", "檢視條目"),
  viewHint: window.wgULS("前往 %s", "前往 %s"),
  talk: window.wgULS("讨论", "討論"),
  "talk page": window.wgULS("讨论页", "討論頁"),
  "this&nbsp;revision": window.wgULS("此修订版本", "此修訂版本"),
  "revision %s of %s": window.wgULS("页面 $2 的修订版本 $1", "頁面 $2 的修訂版本 $1"),
  "Revision %s of %s": window.wgULS("页面 $2 的修订版本 $1", "頁面 $2 的修訂版本 $1"),
  "the revision prior to revision %s of %s": window.wgULS("页面 $2 的修订版本 $1 之前的修订版本", "頁面 $2 的修訂版本 $1 之前的修訂版本"),
  "Toggle image size": window.wgULS("点击切换图片大小", "點擊切換圖片大小"),
  del: window.wgULS("删除", "删除"),
  // /// delete, protect, move
  delete: window.wgULS("删除", "删除"),
  deleteHint: window.wgULS("删除 %s", "删除 %s"),
  undeleteShort: window.wgULS("恢复", "恢復"),
  UndeleteHint: window.wgULS("恢复 %s", "恢復 %s"),
  protect: window.wgULS("保护", "保護"),
  protectHint: window.wgULS("保护 %s", "保護 %s"),
  unprotectShort: window.wgULS("解除", "解除"),
  unprotectHint: window.wgULS("解除对 %s 的保护", "解除對 %s 的保護"),
  move: window.wgULS("移动", "移動"),
  "move page": window.wgULS("移动页面", "移動頁面"),
  MovepageHint: window.wgULS("修改 %s 的标题", "修改 %s 的標題"),
  edit: window.wgULS("编辑", "編輯"),
  // /// edit articles and talk
  "edit article": window.wgULS("编辑条目", "編輯條目"),
  editHint: window.wgULS("修改 %s 的内容", "修改 %s 的內容"),
  "edit talk": window.wgULS("编辑讨论页", "編輯對話頁"),
  new: window.wgULS("新", "新"),
  "new topic": window.wgULS("新话题", "新話題"),
  newSectionHint: window.wgULS("在 %s 增加新的讨论话题", "在 %s 增加新的討論話題"),
  "null edit": window.wgULS("空编辑", "空編輯"),
  nullEditHint: window.wgULS("进行一次对 %s 的空编辑", "製造一次對 %s 的空編輯"),
  hist: window.wgULS("历史", "歷史"),
  // /// history, diffs, editors, related
  history: window.wgULS("历史", "歷史"),
  historyHint: window.wgULS("%s 的修订历史", "%s 的修訂歷史"),
  last: window.wgULS("之前", "之前"),
  // [[MediaWiki:Last]]
  lastEdit: window.wgULS("最近更改", "最近更改"),
  "show last edit": window.wgULS("最近一次更改", "最新一次修訂"),
  "Show the last edit": window.wgULS("显示最近一次更改的差异", "顯示最新一次修訂的差異"),
  lastContrib: window.wgULS("最近编辑", "最近編輯"),
  "last set of edits": window.wgULS("最近编辑", "最近編輯"),
  lastContribHint: window.wgULS("显示由最后一位编辑者造成的差异", "顯示由最後一位編輯者製造的差異"),
  cur: window.wgULS("当前", "當前"),
  diffCur: window.wgULS("与当前版本的差异", "與目前版本的差異"),
  "Show changes since revision %s": window.wgULS("显示自修订版本 %s 的差异", "顯示自修訂版本 %s 的差異"),
  "%s old": window.wgULS("%s 前的最后版本", "%s 前的最后版本"),
  // as in 4 weeks old
  oldEdit: window.wgULS("旧编辑", "舊編輯"),
  purge: window.wgULS("清除缓存", "清除快取"),
  purgeHint: window.wgULS("清除服务器中 %s 的缓存", "清除伺服器中 %s 的快取"),
  raw: window.wgULS("源代码", "原始碼"),
  rawHint: window.wgULS("查看 %s 的源代码", "檢視 %s 的原始碼"),
  render: window.wgULS("仅正文", "僅正文"),
  renderHint: window.wgULS("显示 %s 的纯HTML解析(仅正文内容)", "顯示 %s 的純HTML解析(僅正文內容)"),
  "Show the edit made to get revision": window.wgULS("显示编辑以得到修订版本", "顯示編輯以得到修訂版本"),
  sinceMe: window.wgULS("自我", "自我"),
  "changes since mine": window.wgULS("自我修订的差异", "自我修訂的差異"),
  sinceMeHint: window.wgULS("显示自我上次修改以来的差异", "顯示自我上次修改以來的差異"),
  "Couldn't find an edit by %s\nin the last %s edits to\n%s": window.wgULS("在 $3 最近 $2 次编辑中找不到 $1 做出的修改", "在 $3 最近 $2 次編輯中找不到 $1 做出的修改"),
  eds: window.wgULS("编辑", "編輯"),
  editors: window.wgULS("编辑者", "編輯者"),
  editorListHint: window.wgULS("列出编辑过 %s 的用户", "列出編輯過 %s 的使用者"),
  related: window.wgULS("相关", "相關"),
  relatedChanges: window.wgULS("相关更改", "相關更改"),
  "related changes": window.wgULS("相关更改", "相關更改"),
  RecentchangeslinkedHint: window.wgULS("显示相关 %s 的修改", "顯示相關 %s 的修改"),
  editOld: window.wgULS("编辑旧版", "編輯舊版"),
  // /// edit old version, or revert
  rv: window.wgULS("回退", "恢復"),
  revert: window.wgULS("回退", "恢復"),
  revertHint: window.wgULS("回退到 %s", "恢復到 %s"),
  undo: window.wgULS("撤销", "撤銷"),
  undoHint: window.wgULS("撤销这次编辑", "撤銷這次編輯"),
  defaultpopupRedlinkSummary: window.wgULS("移除到空页面[[%s]]的链接(Popups)", "移除到空頁面[[%s]]的連結(Popups)"),
  defaultpopupFixDabsSummary: window.wgULS("消歧义[[%s]]到[[%s]](Popups)", "消歧義[[%s]]到[[%s]](Popups)"),
  defaultpopupFixRedirsSummary: window.wgULS("忽略从[[%s]]到[[%s]]的重定向(Popups)", "忽略從[[%s]]到[[%s]]的重新導向(Popups)"),
  defaultpopupExtendedRevertSummary: window.wgULS("回退到$2在$1时编辑的修订版本$3(Popups)", "還原到$2在$1時製作的修訂版本$3(Popups)"),
  defaultpopupRevertToPreviousSummary: window.wgULS("回退到修订版本%s的上一个版本(Popups)", "還原到修訂版本%s的上一個版本(Popups)"),
  defaultpopupRevertSummary: window.wgULS("回退到修订版本%s(Popups)", "還原到修訂版本%s(Popups)"),
  defaultpopupQueriedRevertToPreviousSummary: window.wgULS("回退到修订版本$1的上一个版本,由$3在$2时编辑(Popups)", "還原到修訂版本$1的上一個版本,由$3在$2時製作(Popups)"),
  defaultpopupQueriedRevertSummary: window.wgULS("回退到$3在$2时编辑的修订版本$1(Popups)", "還原到$3在$2時製作的修訂版本$1(Popups)"),
  defaultpopupRmDabLinkSummary: window.wgULS("移除到消歧义页[[%s]]的链接(Popups)", "移除到消歧義頁[[%s]]的連結(Popups)"),
  Redirects: window.wgULS("重定向", "重定向"),
  // as in Redirects to ...
  // " to ": window.wgULS( "到","到" ),
  // as in Redirects to ...
  "Bypass redirect": window.wgULS("忽略重定向", "忽略重新導向"),
  "Fix this redirect": window.wgULS("修复重定向", "修復重新導向"),
  disambig: window.wgULS("消歧义", "消歧義"),
  // /// add or remove dab etc.
  disambigHint: window.wgULS("消歧义这个链接到 [[%s]]", "消歧義這個連結到 [[%s]]"),
  "Click to disambiguate this link to:": window.wgULS("点击以消歧义这个链接到:", "點擊以消歧義這個連結到:"),
  "remove this link": window.wgULS("移除链接", "移除連結"),
  "remove all links to this page from this article": window.wgULS("移除此条目到这页的所有链接", "移除此條目到這頁的所有連結"),
  "remove all links to this disambig page from this article": window.wgULS("移除此条目到这消歧义的所有链接", "移除此條目到這消歧義的所有連結"),
  mainlink: window.wgULS("主链接", "主連結"),
  // /// links, watch, unwatch
  wikiLink: window.wgULS("个内部链接", "个內部連結"),
  wikiLinks: window.wgULS("个内部链接", "个內部連結"),
  "links here": window.wgULS("链入", "鏈入"),
  whatLinksHere: window.wgULS("链入页面", "鏈入頁面"),
  "what links here": window.wgULS("链入页面", "鏈入頁面"),
  WhatlinkshereHint: window.wgULS("显示链接到 %s 的页面", "顯示連結到 %s 的頁面"),
  unwatchShort: window.wgULS("取消", "取消"),
  watchThingy: window.wgULS("监视", "監視"),
  // called watchThingy because {}.watch is a function
  watchHint: window.wgULS("加入 %s 到我的监视列表", "加入 %s 到我的監視列表"),
  unwatchHint: window.wgULS("从我的监视列表移除 %s", "從我的監視列表移除 %s"),
  "Only found one editor: %s made %s edits": window.wgULS("仅找到一位编者:%s 制造了 %s 次编辑", "僅找到一位編者:%s 製造了 %s 次編輯"),
  "%s seems to be the last editor to the page %s": window.wgULS("%s 看上去是 %s 这页的最后一位编者", "%s 看上去是 %s 這頁的最後一位編者"),
  rss: window.wgULS("RSS", "RSS"),
  // diff previews
  "Diff truncated for performance reasons": window.wgULS("出于性能考虑,差异已被截断", "出於效能考慮,差異已被截斷"),
  "Old revision": window.wgULS("旧版本", "舊版本"),
  "New revision": window.wgULS("新版本", "新版本"),
  "Something went wrong :-(": window.wgULS("出问题了 :-(", "出問題了 :-("),
  "Empty revision, maybe non-existent": window.wgULS("空的修订,可能并不存在", "空的修訂,可能並不存在"),
  "Unknown date": window.wgULS("未知日期", "未知日期"),
  // other special previews
  "Empty category": window.wgULS("空的分类", "空的分類"),
  "Category members (%s shown)": window.wgULS("分类成员(%s 显示)", "分類成員(%s 顯示)"),
  "No image links found": window.wgULS("未找到文件链接", "未找到檔案連結"),
  "File links": window.wgULS("文件链接", "檔案連結"),
  "not commons": window.wgULS("维基共享中无此名称的文件。", "維基共享中無此名稱的檔案。"),
  "commons only": window.wgULS("此文件来自维基共享。", "此檔案來自維基共享。"),
  "No image found": window.wgULS("找不到文件", "找不到檔案"),
  "commons dupe": window.wgULS("维基共享中存在此文件的副本。", "維基共享中存在此檔案的副本。"),
  "commons conflict": window.wgULS("维基共享中存在此文件名称不同的副本。", "維基共享中存在此檔名稱不同的副本。"),
  // user-related actions and info
  user: window.wgULS("用户", "使用者"),
  // /// user page, talk, email, space
  "user&nbsp;page": window.wgULS("用户页", "使用者頁"),
  "user talk": window.wgULS("用户讨论", "使用者對話"),
  "edit user talk": window.wgULS("编辑用户讨论", "編輯使用者對話"),
  "leave comment": window.wgULS("留言", "留言"),
  email: window.wgULS("电邮", "電郵"),
  "email user": window.wgULS("电邮用户", "電郵使用者"),
  EmailuserHint: window.wgULS("给 %s 发送电子邮件", "給 %s 發送電子郵件"),
  space: window.wgULS("子页面", "子頁面"),
  // short form for userSpace link
  PrefixindexHint: window.wgULS("显示 %s 的用户页子页面", "顯示 %s 的使用者頁子頁面"),
  count: window.wgULS("统计", "統計"),
  // /// contributions, tree, log
  "edit counter": window.wgULS("编辑次数", "編輯次數"),
  katelinkHint: window.wgULS("%s 的编辑次数", "%s 的編輯次數"),
  contribs: window.wgULS("贡献", "貢獻"),
  contributions: window.wgULS("贡献", "貢獻"),
  deletedContribs: window.wgULS("已删除的贡献", "已刪除的貢獻"),
  ContributionsHint: window.wgULS("%s 的用户贡献", "%s 的使用者貢獻"),
  tree: window.wgULS("树", "樹"),
  contribsTreeHint: window.wgULS("根据名字空间查看 %s 的贡献", "根據命名空間檢視 %s 的貢獻"),
  log: window.wgULS("日志", "日誌"),
  "user log": window.wgULS("用户日志", "使用者日誌"),
  userLogHint: window.wgULS("显示 %s 的用户日志", "顯示 %s 的使用者日誌"),
  unblockShort: window.wgULS("解除", "解除"),
  block: window.wgULS("封禁", "封鎖"),
  "block user": window.wgULS("封禁用户", "封鎖使用者"),
  IpblocklistHint: window.wgULS("解封 %s", "解封 %s"),
  BlockipHint: window.wgULS("封禁 %s", "封鎖 %s"),
  "block log": window.wgULS("封禁日志", "封鎖日誌"),
  blockLogHint: window.wgULS("显示 %s 的封禁日志", "顯示 %s 的封鎖日誌"),
  protectLogHint: window.wgULS("显示 %s 的保护日志", "顯示 %s 的保護日誌"),
  pageLogHint: window.wgULS("显示 %s 的日志", "顯示 %s 的日誌"),
  deleteLogHint: window.wgULS("显示 %s 的删除日志", "顯示 %s 的刪除日誌"),
  "Invalid %s %s": window.wgULS("选项 %s 不可用:%s", "選項 %s 不可用:%s"),
  m: "小",
  // Autoediting
  "Enter a non-empty edit summary or press cancel to abort": window.wgULS("输入编辑摘要,或按取消中止操作", "輸入編輯摘要,或按取消中止操作"),
  "Failed to get revision information, please edit manually.\n\n": window.wgULS("获取修订版本信息失败,请手动修改。\n\n", "獲取修訂版本資訊失敗,請手動修改。\n\n"),
  "The %s button has been automatically clicked. Please wait for the next page to load.": window.wgULS("按钮 %s 已被自动点击,请等待下一个页面加载。", "按鈕 %s 已被自動點擊,請等待下一個頁面載入。"),
  "Could not find button %s. Please check the settings in your javascript file.": window.wgULS("找不到按钮 %s,请检查您 JavaScript 文件中的设置。", "找不到按鈕 %s,請檢查您 JavaScript 檔案中的設定。"),
  // Popups setup
  "Open full-size image": window.wgULS("查看全尺寸图像", "檢視全尺寸影像"),
  // 以下内容由 AnnAngela 补正
  bingSearchHint: window.wgULS("在 Bing 上搜索“%s”", "在 bing 上搜尋「%s」"),
  "enable previews": window.wgULS("启用预览", "啟用預覽"),
  "show preview": window.wgULS("禁用预览", "禁用預覽"),
  historyfeedHint: window.wgULS("该页面的近期更改 RSS feed", "該頁面的近期更改 RSS feed"),
  "send thanks": window.wgULS("发送感谢", "傳送感謝"),
  ThanksHint: window.wgULS("向该用户发送一封感谢消息", "向該使用者傳送一封感謝訊息"),
  "mark patrolled": window.wgULS("标记为已巡查", "標記為已巡查"),
  markpatrolledHint: window.wgULS("标记该编辑为已巡查", "標記該編輯為已巡查"),
  "Could not marked this edit as patrolled": window.wgULS("无法标记该编辑为已巡查", "無法標記該編輯為已巡查"),
  defaultpopupReviewedSummary: window.wgULS("标记从版本%s到%s间的编辑为已巡查", "標記從版本%s到%s間的編輯為已巡查"),
  "Image from Commons": window.wgULS("来自维基共享的图片", "來自維基共用的圖片"),
  "Description page": window.wgULS("图片描述页", "圖片描述頁"),
  "Alt text:": window.wgULS("替换文本(Alt):", "替換文字(Alt):"),
  revdel: window.wgULS("历史版本被隐藏", "歷史版本被隱藏"),
  DeletedcontributionsHint: window.wgULS("用户%s的被删除编辑次数", "使用者%s的被刪除編輯次數"),
  "No backlinks found": window.wgULS("找不到链入页面", "找不到鏈入頁面"),
  " and more": window.wgULS("以及其他页面", "以及其他頁面"),
  "Download preview data": window.wgULS("下载预览数据", "下載預覽資料"),
  "Not a registered username": window.wgULS("非已注册的用户", "非已註冊的使用者"),
  BLOCKED: window.wgULS("被封禁", "被封鎖"),
  "Has blocks": window.wgULS("被部分封禁", "被部分封鎖"),
  " edits since: ": window.wgULS("次编辑,注册日期为", "次編輯,註冊日期為"),
  "last edit on ": window.wgULS("最后一次编辑于", "最後一次編輯於"),
  EmailUserHint: window.wgULS("给 %s 发送电子邮件", "給 %s 發送電子郵件"),
  RANGEBLOCKED: window.wgULS("IP段被封禁", "IP段被封鎖"),
  "IP user": window.wgULS("IP用户", "IP使用者"),
  "♀": "♀",
  "♂": "♂",
  HIDDEN: window.wgULS("全域隐藏", "全域隱藏"),
  LOCKED: window.wgULS("全域锁定", "全域鎖定"),
  "Invalid user": window.wgULS("非法用户名", "非法使用者名稱"),
  diff: window.wgULS("差异", "差異"),
  " to ": "至",
  autoedit_version: "np20140416",
  PrefixIndexHint: window.wgULS("显示用户%s的子页面", "顯示使用者%s的子頁面"),
  nullEditSummary: window.wgULS("进行一次零编辑", "進行一次零編輯"),
  // 用户组名称从系统消息获取
  "group-no-autoconfirmed": window.wgULS("非自动确认用户", "非自動確認使用者"),
  separator: "、",
  comma: ","
};
//! src/Navigation_popups/modules/core.js
var popups = () => {
  const pg = {
    api: {},
    re: {},
    ns: {},
    string: {},
    wiki: {},
    user: {},
    misc: {},
    option: {},
    optionDefault: {},
    flag: {},
    cache: {},
    structures: {},
    timer: {},
    counter: {},
    current: {},
    fn: {},
    endoflist: null
  };
  if (window.pg && !(window.pg instanceof HTMLElement)) {
    return;
  }
  window.pg = pg;
  const setupTooltips = (container, remove, force, popData) => {
    log("setupTooltips, container=".concat(container, ", remove=").concat(remove));
    if (!container) {
      if (getValueOf("popupOnEditSelection") && document && document.editform && document.editform.wpTextbox1) {
        document.editform.wpTextbox1.onmouseup = doSelectionPopup;
      }
      container = defaultPopupsContainer();
    }
    if (!remove && !force && container.ranSetupTooltipsAlready) {
      return;
    }
    container.ranSetupTooltipsAlready = !remove;
    const anchors = container.querySelectorAll("a");
    setupTooltipsLoop(anchors, 0, 250, 100, remove, popData);
  };
  const defaultPopupsContainer = () => {
    if (getValueOf("popupOnlyArticleLinks")) {
      return document.querySelector(".skin-vector-2022 .vector-body") || document.querySelector("#mw_content") || document.querySelector("#content") || document.querySelector("#article") || document;
    }
    return document;
  };
  const setupTooltipsLoop = function setupTooltipsLoop2(anchors, begin, howmany, sleep, remove, popData, ...args) {
    log(simplePrintf("setupTooltipsLoop(%s,%s,%s,%s,%s)", [anchors, begin, howmany, sleep, remove, popData, ...args]));
    const finish = begin + howmany;
    const loopend = Math.min(finish, anchors.length);
    let j = loopend - begin;
    log("setupTooltips: anchors.length=".concat(anchors.length, ", begin=").concat(begin, ", howmany=").concat(howmany, ", loopend=").concat(loopend, ", remove=").concat(remove));
    const doTooltip = remove ? removeTooltip : addTooltip;
    if (j > 0) {
      do {
        const a = anchors[loopend - j];
        if (a === void 0 || !a || !a.href) {
          log("got null anchor at index ".concat(loopend) - j);
          continue;
        }
        doTooltip(a, popData);
      } while (--j);
    }
    if (finish < anchors.length) {
      setTimeout(() => {
        setupTooltipsLoop2(anchors, finish, howmany, sleep, remove, popData);
      }, sleep);
    } else {
      if (!remove && !getValueOf("popupTocLinks")) {
        rmTocTooltips();
      }
      pg.flag.finishedLoading = true;
    }
  };
  const rmTocTooltips = () => {
    const toc = document.querySelector("#toc");
    if (toc) {
      const tocLinks = toc.querySelectorAll("a");
      const tocLen = tocLinks.length;
      for (let j = 0; j < tocLen; ++j) {
        removeTooltip(tocLinks[j], true);
      }
    }
  };
  const addTooltip = (a, popData) => {
    if (!isPopupLink(a)) {
      return;
    }
    a.onmouseover = mouseOverWikiLink;
    a.onmouseout = mouseOutWikiLink;
    a.onmousedown = killPopup;
    a.hasPopup = true;
    a.popData = popData;
  };
  const removeTooltip = (a) => {
    if (!a.hasPopup) {
      return;
    }
    a.onmouseover = null;
    a.onmouseout = null;
    if (a.originalTitle) {
      a.title = a.originalTitle;
    }
    a.hasPopup = false;
  };
  const removeTitle = (a) => {
    if (!a.originalTitle) {
      a.originalTitle = a.title;
    }
    a.title = "";
  };
  const restoreTitle = (a) => {
    if (a.title || !a.originalTitle) {
      return;
    }
    a.title = a.originalTitle;
  };
  const registerHooks = (np) => {
    const popupMaxWidth = getValueOf("popupMaxWidth");
    if (typeof popupMaxWidth === "number") {
      const setMaxWidth = () => {
        np.mainDiv.style.maxWidth = "".concat(popupMaxWidth, "px");
        np.maxWidth = popupMaxWidth;
      };
      np.addHook(setMaxWidth, "unhide", "before");
    }
    np.addHook(addPopupShortcuts, "unhide", "after");
    np.addHook(rmPopupShortcuts, "hide", "before");
  };
  const removeModifierKeyListener = (a) => {
    document.removeEventListener("keydown", a.modifierKeyListener, false);
    document.removeEventListener("keyup", a.modifierKeyListener, false);
  };
  const mouseOverWikiLink = function mouseOverWikiLink3(evt) {
    if (!evt && window.event) {
      evt = window.event;
    }
    if (getValueOf("popupModifier")) {
      const action = getValueOf("popupModifierAction");
      const key = action === "disable" ? "keyup" : "keydown";
      const self2 = this;
      self2.modifierKeyListener = (evt2) => {
        mouseOverWikiLink2(self2, evt2);
      };
      document.addEventListener(key, self2.modifierKeyListener, false);
    }
    return mouseOverWikiLink2(this, evt);
  };
  const footnoteTarget = (a) => {
    const aTitle = Title.fromAnchor(a);
    const anch = aTitle.anchor;
    if (!/^(cite_note-|_note-|endnote)/.test(anch)) {
      return false;
    }
    const lTitle = Title.fromURL(location.href);
    if (lTitle.toString(true) !== aTitle.toString(true)) {
      return false;
    }
    let el = document.querySelector("#".concat(anch));
    while (el && typeof el.nodeName === "string") {
      const nt = el.nodeName.toLowerCase();
      if (nt === "li") {
        return el;
      } else if (nt === "body") {
        return false;
      } else if (el.parentNode) {
        el = el.parentNode;
      } else {
        return false;
      }
    }
    return false;
  };
  const footnotePreview = (x, navpop) => {
    setPopupHTML("<hr>".concat(x.innerHTML), "popupPreview", navpop.idNumber);
  };
  const modifierPressed = (evt) => {
    const mod = getValueOf("popupModifier");
    if (!mod) {
      return false;
    }
    if (!evt && window.event) {
      evt = window.event;
    }
    return evt && mod && evt["".concat(mod.toLowerCase(), "Key")];
  };
  const isCorrectModifier = (_a, evt) => {
    if (!getValueOf("popupModifier")) {
      return true;
    }
    const action = getValueOf("popupModifierAction");
    return action === "enable" && modifierPressed(evt) || action === "disable" && !modifierPressed(evt);
  };
  const mouseOverWikiLink2 = (a, evt) => {
    if (!isCorrectModifier(a, evt)) {
      return;
    }
    if (getValueOf("removeTitles")) {
      removeTitle(a);
    }
    if (a === pg.current.link && a.navpopup && a.navpopup.isVisible()) {
      return;
    }
    pg.current.link = a;
    if (getValueOf("simplePopups") && !pg.option.popupStructure) {
      setDefault("popupStructure", "original");
    }
    const article = new Title().fromAnchor(a);
    pg.current.article = article;
    if (!a.navpopup) {
      a.navpopup = newNavpopup(a, article);
      pg.current.linksHash[a.href] = a.navpopup;
      pg.current.links.push(a);
    }
    if (a.navpopup.pending === null || a.navpopup.pending !== 0) {
      simplePopupContent(a, article);
    }
    a.navpopup.showSoonIfStable(a.navpopup.delay);
    clearInterval(pg.timer.checkPopupPosition);
    pg.timer.checkPopupPosition = setInterval(checkPopupPosition, 600);
    if (getValueOf("simplePopups") && getValueOf("popupPreviewButton") && !a.simpleNoMore) {
      const d = document.createElement("div");
      d.className = "popupPreviewButtonDiv";
      const s = document.createElement("span");
      d.append(s);
      s.className = "popupPreviewButton";
      s["on".concat(getValueOf("popupPreviewButtonEvent"))] = () => {
        a.simpleNoMore = true;
        d.style.display = "none";
        nonsimplePopupContent(a, article);
      };
      s.innerHTML = popupString("show preview");
      setPopupHTML(d, "popupPreview", a.navpopup.idNumber);
    }
    if (a.navpopup.pending !== 0) {
      nonsimplePopupContent(a, article);
    }
  };
  const simplePopupContent = (a, article) => {
    a.navpopup.hasPopupMenu = false;
    a.navpopup.setInnerHTML(popupHTML(a));
    fillEmptySpans({
      navpopup: a.navpopup
    });
    if (getValueOf("popupDraggable")) {
      let dragHandle = getValueOf("popupDragHandle") || null;
      if (dragHandle && dragHandle !== "all") {
        dragHandle += a.navpopup.idNumber;
      }
      setTimeout(() => {
        a.navpopup.makeDraggable(dragHandle);
      }, 150);
    }
    if (getValueOf("popupRedlinkRemoval") && a.className === "new") {
      setPopupHTML("<br>".concat(popupRedlinkHTML(article)), "popupRedlink", a.navpopup.idNumber);
    }
  };
  const debugData = (navpopup) => {
    if (getValueOf("popupDebugging") && navpopup.idNumber) {
      setPopupHTML("idNumber=".concat(navpopup.idNumber, ", pending=").concat(navpopup.pending), "popupError", navpopup.idNumber);
    }
  };
  const newNavpopup = (a, article) => {
    const navpopup = new Navpopup();
    navpopup.fuzz = 5;
    navpopup.delay = getValueOf("popupDelay") * 1e3;
    navpopup.idNumber = ++pg.idNumber;
    navpopup.parentAnchor = a;
    navpopup.parentPopup = a.popData && a.popData.owner;
    navpopup.article = article;
    registerHooks(navpopup);
    return navpopup;
  };
  const shouldShowNonSimple = (a) => {
    return !getValueOf("simplePopups") || a.simpleNoMore;
  };
  const shouldShow = (a, option) => {
    if (shouldShowNonSimple(a)) {
      return getValueOf(option);
    }
    return window[option] !== void 0 && window[option];
  };
  const nonsimplePopupContent = (a, article) => {
    let diff2;
    let history;
    const params = parseParams(a.href);
    const oldid = params.oldid === void 0 ? null : params.oldid;
    if (shouldShow(a, "popupPreviewDiffs")) {
      ({
        diff: diff2
      } = params);
    }
    if (shouldShow(a, "popupPreviewHistory")) {
      history = params.action === "history";
    }
    a.navpopup.pending = 0;
    const referenceElement = footnoteTarget(a);
    if (referenceElement) {
      footnotePreview(referenceElement, a.navpopup);
    } else if (diff2 || diff2 === 0) {
      loadDiff(article, oldid, diff2, a.navpopup);
    } else if (history) {
      loadAPIPreview("history", article, a.navpopup);
    } else if (shouldShowNonSimple(a) && pg.re.contribs.test(a.href)) {
      loadAPIPreview("contribs", article, a.navpopup);
    } else if (shouldShowNonSimple(a) && pg.re.backlinks.test(a.href)) {
      loadAPIPreview("backlinks", article, a.navpopup);
    } else if (
      // FIXME should be able to get all preview combinations with options
      article.namespaceId() === pg.nsImageId && (shouldShow(a, "imagePopupsForImages") || !anchorContainsImage(a))
    ) {
      loadAPIPreview("imagepagepreview", article, a.navpopup);
      loadImage(article, a.navpopup);
    } else {
      if (article.namespaceId() === pg.nsCategoryId && shouldShow(a, "popupCategoryMembers")) {
        loadAPIPreview("category", article, a.navpopup);
      } else if ((article.namespaceId() === pg.nsUserId || article.namespaceId() === pg.nsUsertalkId) && shouldShow(a, "popupUserInfo")) {
        loadAPIPreview("userinfo", article, a.navpopup);
      }
      if (shouldShowNonSimple(a)) {
        startArticlePreview(article, oldid, a.navpopup);
      }
    }
  };
  const pendingNavpopTask = (navpop) => {
    if (navpop && navpop.pending === null) {
      navpop.pending = 0;
    }
    ++navpop.pending;
    debugData(navpop);
  };
  const completedNavpopTask = (navpop) => {
    if (navpop && navpop.pending) {
      --navpop.pending;
    }
    debugData(navpop);
  };
  const startArticlePreview = (article, oldid, navpop) => {
    navpop.redir = 0;
    loadPreview(article, oldid, navpop);
  };
  const loadPreview = (article, oldid, navpop) => {
    if (!navpop.redir) {
      navpop.originalArticle = article;
    }
    article.oldid = oldid;
    loadAPIPreview("revision", article, navpop);
  };
  const loadPreviewFromRedir = (redirMatch, navpop) => {
    const target = new Title().fromWikiText(redirMatch[2]);
    if (navpop.article.anchor) {
      target.anchor = navpop.article.anchor;
    }
    navpop.redir++;
    navpop.redirTarget = target;
    const warnRedir = redirLink(target, navpop.article);
    setPopupHTML(warnRedir, "popupWarnRedir", navpop.idNumber);
    navpop.article = target;
    fillEmptySpans({
      redir: true,
      redirTarget: target,
      navpopup: navpop
    });
    return loadPreview(target, null, navpop);
  };
  const insertPreview = (download) => {
    if (!download.owner) {
      return;
    }
    const redirMatch = pg.re.redirect.exec(download.data);
    if (download.owner.redir === 0 && redirMatch) {
      loadPreviewFromRedir(redirMatch, download.owner);
      return;
    }
    if (download.owner.visible || !getValueOf("popupLazyPreviews")) {
      insertPreviewNow(download);
    } else {
      const id = download.owner.redir ? "PREVIEW_REDIR_HOOK" : "PREVIEW_HOOK";
      download.owner.addHook(() => {
        insertPreviewNow(download);
        return true;
      }, "unhide", "after", id);
    }
  };
  const insertPreviewNow = (download) => {
    if (!download.owner) {
      return;
    }
    const wikiText = download.data;
    const navpop = download.owner;
    const art = navpop.redirTarget || navpop.originalArticle;
    makeFixDabs(wikiText, navpop);
    if (getValueOf("popupSummaryData")) {
      getPageInfo(wikiText, download);
      setPopupTrailer(getPageInfo(wikiText, download), navpop.idNumber);
    }
    let imagePage = "";
    imagePage = art.namespaceId() === pg.nsImageId ? art.toString() : getValidImageFromWikiText(wikiText);
    if (imagePage) {
      loadImage(Title.fromWikiText(imagePage), navpop);
    }
    if (getValueOf("popupPreviews")) {
      insertArticlePreview(download, art, navpop);
    }
  };
  const insertArticlePreview = (download, art, navpop) => {
    if (download && typeof download.data === "string") {
      if (art.namespaceId() === pg.nsTemplateId && getValueOf("popupPreviewRawTemplates")) {
        const h = '<hr><span style="font-family: monospace;">'.concat(download.data.entify().split("\\n").join("<br>\\n"), "</span>");
        setPopupHTML(h, "popupPreview", navpop.idNumber);
      } else {
        const p = prepPreviewmaker(download.data, art, navpop);
        p.showPreview();
      }
    }
  };
  const prepPreviewmaker = (data, article, navpop) => {
    const d = anchorize(data, article.anchorString());
    const urlBase = joinPath([pg.wiki.articlebase, article.urlString()]);
    const p = new Previewmaker(d, urlBase, navpop);
    return p;
  };
  const anchorize = (d, anch) => {
    if (!anch) {
      return d;
    }
    const anchRe = new RegExp("(?:=+\\s*".concat(literalizeRegex(anch).replace(/[ _]/g, "[_ ]"), "\\s*=+|\\{\\{\\s*").concat(getValueOf("popupAnchorRegexp"), "\\s*(?:\\|[^|}]*)*?\\s*").concat(literalizeRegex(anch), "\\s*(?:\\|[^}]*)?}})"));
    const match = d.match(anchRe);
    if (match && match.length > 0 && match[0]) {
      return d.slice(Math.max(0, d.indexOf(match[0])));
    }
    const lines = d.split("\n");
    for (let i = 0; i < lines.length; ++i) {
      lines[i] = lines[i].replace(/\[{2}([^\]|]*?\|)?(.*?)]{2}/g, "$2").replace(/'''([^'])/g, "$1").replace(/''([^'])/g, "$1");
      if (anchRe.test(lines[i])) {
        return d.split("\n").slice(i).join("\n").replace(/^[^=]*/, "");
      }
    }
    return d;
  };
  const killPopup = function killPopup2() {
    removeModifierKeyListener(this);
    if (getValueOf("popupShortcutKeys")) {
      rmPopupShortcuts();
    }
    if (!pg) {
      return;
    }
    if (pg.current.link && pg.current.link.navpopup) {
      pg.current.link.navpopup.banish();
    }
    pg.current.link = null;
    abortAllDownloads();
    if (pg.timer.checkPopupPosition) {
      clearInterval(pg.timer.checkPopupPosition);
      pg.timer.checkPopupPosition = null;
    }
    return true;
  };
  class Drag {
    constructor() {
      this.startCondition = null;
      this.endHook = null;
    }
    /**
     * Gets an event in a cross-browser manner.
     *
     * @param {Event} e
     * @private
     */
    static fixE(e) {
      if (e === void 0) {
        e = window.event;
      }
      if (e.layerX === void 0) {
        e.layerX = e.offsetX;
      }
      if (e.layerY === void 0) {
        e.layerY = e.offsetY;
      }
      return e;
    }
    /**
     * Initialises the Drag instance by telling it which object you want to be draggable, and what
     * you want to drag it by.
     *
     * @param {DOMElement} o The "handle" by which <code>oRoot</code> is dragged.
     * @param {DOMElement} oRoot The object which moves when <code>o</code> is dragged, or <code>o</code> if omitted.
     */
    init(o, oRoot) {
      const self2 = this;
      this.obj = o;
      o.onmousedown = (e) => {
        self2.start(e);
      };
      o.dragging = false;
      o.popups_draggable = true;
      o.hmode = true;
      o.vmode = true;
      o.root = oRoot || o;
      if (Number.isNaN(Number.parseInt(o.root.style.left, 10))) {
        o.root.style.left = "0px";
      }
      if (Number.isNaN(Number.parseInt(o.root.style.top, 10))) {
        o.root.style.top = "0px";
      }
      o.root.onthisStart = () => {
      };
      o.root.onthisEnd = () => {
      };
      o.root.onthis = () => {
      };
    }
    /**
     * Starts the drag.
     *
     * @private
     * @param {Event} e
     */
    start(e) {
      const o = this.obj;
      e = Drag.fixE(e);
      if (this.startCondition && !this.startCondition(e)) {
        return;
      }
      const y = Number.parseInt(o.vmode ? o.root.style.top : o.root.style.bottom, 10);
      const x = Number.parseInt(o.hmode ? o.root.style.left : o.root.style.right, 10);
      o.root.onthisStart(x, y);
      o.lastMouseX = e.clientX;
      o.lastMouseY = e.clientY;
      const self2 = this;
      o.onmousemoveDefault = document.onmousemove;
      o.dragging = true;
      document.onmousemove = (e2) => {
        self2.drag(e2);
      };
      document.onmouseup = (e2) => {
        self2.end(e2);
      };
      return false;
    }
    /**
     * Does the drag.
     *
     * @param {Event} e
     * @private
     */
    drag(e) {
      e = Drag.fixE(e);
      const o = this.obj;
      const ey = e.clientY;
      const ex = e.clientX;
      const y = Number.parseInt(o.vmode ? o.root.style.top : o.root.style.bottom, 10);
      const x = Number.parseInt(o.hmode ? o.root.style.left : o.root.style.right, 10);
      const nx = x + (ex - o.lastMouseX) * (o.hmode ? 1 : -1);
      const ny = y + (ey - o.lastMouseY) * (o.vmode ? 1 : -1);
      this.obj.root.style[o.hmode ? "left" : "right"] = "".concat(nx, "px");
      this.obj.root.style[o.vmode ? "top" : "bottom"] = "".concat(ny, "px");
      this.obj.lastMouseX = ex;
      this.obj.lastMouseY = ey;
      this.obj.root.onthis(nx, ny);
      return false;
    }
    /**
     * Ends the drag.
     *
     * @private
     */
    end() {
      document.onmousemove = this.obj.onmousemoveDefault;
      document.onmouseup = null;
      this.obj.dragging = false;
      if (this.endHook) {
        this.endHook(Number.parseInt(this.obj.root.style[this.obj.hmode ? "left" : "right"], 10), Number.parseInt(this.obj.root.style[this.obj.vmode ? "top" : "bottom"], 10));
      }
    }
  }
  pg.structures.original = {};
  pg.structures.original.popupLayout = () => {
    return ["popupError", "popupImage", "popupTopLinks", "popupTitle", "popupUserData", "popupData", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"];
  };
  pg.structures.original.popupRedirSpans = () => {
    return ["popupRedir", "popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"];
  };
  pg.structures.original.popupTitle = (x) => {
    log("defaultstructure.popupTitle");
    if (!getValueOf("popupNavLinks")) {
      return navlinkStringToHTML("<b><<mainlink>></b>", x.article, x.params);
    }
    return "";
  };
  pg.structures.original.popupTopLinks = (x) => {
    log("defaultstructure.popupTopLinks");
    if (getValueOf("popupNavLinks")) {
      return navLinksHTML(x.article, x.hint, x.params);
    }
    return "";
  };
  pg.structures.original.popupImage = (x) => {
    log("original.popupImage, x.article=".concat(x.article, ", x.navpop.idNumber=").concat(x.navpop.idNumber));
    return imageHTML(x.article, x.navpop.idNumber);
  };
  pg.structures.original.popupRedirTitle = pg.structures.original.popupTitle;
  pg.structures.original.popupRedirTopLinks = pg.structures.original.popupTopLinks;
  const copyStructure = (oldStructure, newStructure) => {
    pg.structures[newStructure] = {};
    for (const prop in pg.structures[oldStructure]) {
      if (!Object.hasOwn(pg.structures[oldStructure], prop)) {
        continue;
      }
      pg.structures[newStructure][prop] = pg.structures[oldStructure][prop];
    }
  };
  copyStructure("original", "nostalgia");
  pg.structures.nostalgia.popupTopLinks = (x) => {
    let str = "";
    str += "<b><<mainlink|shortcut= >></b>";
    str += "if(user){<br><<contribs|shortcut=c>>";
    str += "if(wikimedia){*<<count|shortcut=#>>}";
    str += "if(ipuser){}else{*<<email|shortcut=E>>}if(admin){*<<block|shortcut=b>>}}";
    const editstr = "<<edit|shortcut=e>>";
    const editOldidStr = "if(oldid){<<editOld|shortcut=e>>|<<revert|shortcut=v|rv>>|<<edit|cur>>}else{".concat(editstr, "}");
    const historystr = "<<history|shortcut=h>>";
    const watchstr = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>";
    str += "<br>if(talk){".concat(editOldidStr, "|<<new|shortcut=+>>*").concat(historystr, "*").concat(watchstr, "*<b><<article|shortcut=a>></b>|<<editArticle|edit>>}else{").concat(
      // not a talk page
      editOldidStr,
      "*"
    ).concat(historystr, "*").concat(watchstr, "*<b><<talk|shortcut=t>></b>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>}");
    str += "<br><<whatLinksHere|shortcut=l>>*<<relatedChanges|shortcut=r>>";
    str += "if(admin){<br>}else{*}<<move|shortcut=m>>";
    str += "if(admin){*<<unprotect|unprotectShort>>|<<protect|shortcut=p>>*<<undelete|undeleteShort>>|<<delete|shortcut=d>>}";
    return navlinkStringToHTML(str, x.article, x.params);
  };
  pg.structures.nostalgia.popupRedirTopLinks = pg.structures.nostalgia.popupTopLinks;
  copyStructure("original", "fancy");
  pg.structures.fancy.popupTitle = (x) => {
    return navlinkStringToHTML("<font size=+0><<mainlink>></font>", x.article, x.params);
  };
  pg.structures.fancy.popupTopLinks = (x) => {
    const hist = "<<history|shortcut=h|hist>>|<<lastEdit|shortcut=/|last>>|<<editors|shortcut=E|eds>>";
    const watch = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>";
    const move = "<<move|shortcut=m|move>>";
    return navlinkStringToHTML("if(talk){<<edit|shortcut=e>>|<<new|shortcut=+|+>>*".concat(hist, "*<<article|shortcut=a>>|<<editArticle|edit>>*").concat(watch, "*").concat(move, "}else{<<edit|shortcut=e>>*").concat(hist, "*<<talk|shortcut=t|>>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>*").concat(watch, "*").concat(move, "}<br>"), x.article, x.params);
  };
  pg.structures.fancy.popupOtherLinks = (x) => {
    const admin = "<<unprotect|unprotectShort>>|<<protect|shortcut=p>>*<<undelete|undeleteShort>>|<<delete|shortcut=d|del>>";
    let user = "<<contribs|shortcut=c>>if(wikimedia){|<<count|shortcut=#|#>>}";
    user += "if(ipuser){|<<arin>>}else{*<<email|shortcut=E|".concat(popupString("email"), ">>}if(admin){*<<block|shortcut=b>>}");
    const normal = "<<whatLinksHere|shortcut=l|links here>>*<<relatedChanges|shortcut=r|related>>";
    return navlinkStringToHTML("<br>if(user){".concat(user, "*}if(admin){").concat(admin, "if(user){<br>}else{*}}").concat(normal), x.article, x.params);
  };
  pg.structures.fancy.popupRedirTitle = pg.structures.fancy.popupTitle;
  pg.structures.fancy.popupRedirTopLinks = pg.structures.fancy.popupTopLinks;
  pg.structures.fancy.popupRedirOtherLinks = pg.structures.fancy.popupOtherLinks;
  copyStructure("fancy", "fancy2");
  pg.structures.fancy2.popupTopLinks = // hack out the <br> at the end and put one at the beginning
  (x) => {
    return "<br>".concat(pg.structures.fancy.popupTopLinks(x).replace(/<br>$/i, ""));
  };
  pg.structures.fancy2.popupLayout = () => {
    return ["popupError", "popupImage", "popupTitle", "popupUserData", "popupData", "popupTopLinks", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"];
  };
  copyStructure("original", "menus");
  pg.structures.menus.popupLayout = () => {
    return ["popupError", "popupImage", "popupTopLinks", "popupTitle", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupUserData", "popupData", "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"];
  };
  pg.structures.menus.popupTopLinks = (x, shorter) => {
    const s = [];
    const dropdiv = '<div class="popup_drop">';
    const enddiv = "</div>";
    let hist = "<<history|shortcut=h>>";
    if (!shorter) {
      hist = "<menurow>".concat(hist, "|<<historyfeed|rss>>|<<editors|shortcut=E>></menurow>");
    }
    const lastedit = "<<lastEdit|shortcut=/|show last edit>>";
    const thank = "if(diff){<<thank|send thanks>>}";
    const jsHistory = "<<lastContrib|last set of edits>><<sinceMe|changes since mine>>";
    const linkshere = "<<whatLinksHere|shortcut=l|what links here>>";
    const related = "<<relatedChanges|shortcut=r|related changes>>";
    const search = "<menurow><<search|shortcut=s>></menurow>";
    const watch = "<menurow><<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>></menurow>";
    const protect = "<menurow><<unprotect|unprotectShort>>|<<protect|shortcut=p>>|<<protectlog|log>></menurow>";
    const del = "<menurow><<undelete|undeleteShort>>|<<delete|shortcut=d>>|<<deletelog|log>></menurow>";
    const move = "<<move|shortcut=m|move page>>";
    const nullPurge = "<menurow><<nullEdit|shortcut=n|null edit>>|<<purge|shortcut=P>></menurow>";
    const viewOptions = "<menurow><<view|shortcut=v>>|<<render|shortcut=S>>|<<raw>></menurow>";
    const editRow = "if(oldid){<menurow><<edit|shortcut=e>>|<<editOld|shortcut=e|this&nbsp;revision>></menurow><menurow><<revert|shortcut=v>>|<<undo>></menurow>}else{<<edit|shortcut=e>>}";
    const markPatrolled = "if(rcid){<<markpatrolled|mark patrolled>>}";
    const newTopic = "if(talk){<<new|shortcut=+|new topic>>}";
    const protectDelete = "if(admin){".concat(protect).concat(del, "}");
    if (getValueOf("popupActionsMenu")) {
      s.push("<<mainlink>>*".concat(dropdiv).concat(menuTitle("actions")));
    } else {
      s.push("".concat(dropdiv, "<<mainlink>>"));
    }
    s.push("<menu>", editRow + markPatrolled + newTopic + hist + lastedit + thank);
    if (!shorter) {
      s.push(jsHistory);
    }
    s.push(move + linkshere + related);
    if (!shorter) {
      s.push(nullPurge + search);
    }
    if (!shorter) {
      s.push(viewOptions);
    }
    s.push("<hr>".concat(watch).concat(protectDelete), "<hr>if(talk){<<article|shortcut=a|view article>><<editArticle|edit article>>}else{<<talk|shortcut=t|talk page>><<editTalk|edit talk>><<newTalk|shortcut=+|new topic>>}</menu>".concat(enddiv));
    const email = "<<email|shortcut=E|email user>>";
    const contribs = "if(wikimedia){<menurow>}<<contribs|shortcut=c|contributions>>if(wikimedia){</menurow>}if(admin){<menurow><<deletedContribs>></menurow>}";
    s.push("if(user){*".concat(dropdiv).concat(menuTitle("user")), "<menu>", "<menurow><<userPage|shortcut=u|user&nbsp;page>>|<<userSpace|space>></menurow>", "<<userTalk|shortcut=t|user talk>><<editUserTalk|edit user talk>><<newUserTalk|shortcut=+|leave comment>>");
    if (shorter) {
      s.push("if(ipuser){}else{".concat(email, "}"));
    } else {
      s.push("if(ipuser){<<arin>>}else{".concat(email, "}"));
    }
    s.push("<hr>".concat(contribs, "<<userlog|shortcut=L|user log>>"), "if(wikimedia){<<count|shortcut=#|edit counter>>}", "if(admin){<menurow><<unblock|unblockShort>>|<<block|shortcut=b|block user>></menurow>}", "<<blocklog|shortcut=B|block log>>", "</menu>".concat(enddiv, "}"));
    if (getValueOf("popupSetupMenu") && !x.navpop.hasPopupMenu) {
      x.navpop.hasPopupMenu = true;
      s.push("*".concat(dropdiv).concat(menuTitle("popupsMenu"), "<menu>"), "<<togglePreviews|toggle previews>>", "<<purgePopups|reset>>", "<<disablePopups|disable>>", "</menu>".concat(enddiv));
    }
    return navlinkStringToHTML(s.join(""), x.article, x.params);
  };
  const menuTitle = (s) => {
    return '<a href="#" noPopup=1>'.concat(popupString(s), "</a>");
  };
  pg.structures.menus.popupRedirTitle = pg.structures.menus.popupTitle;
  pg.structures.menus.popupRedirTopLinks = pg.structures.menus.popupTopLinks;
  copyStructure("menus", "shortmenus");
  pg.structures.shortmenus.popupTopLinks = (x) => {
    return pg.structures.menus.popupTopLinks(x, true);
  };
  pg.structures.shortmenus.popupRedirTopLinks = pg.structures.shortmenus.popupTopLinks;
  pg.structures.lite = {};
  pg.structures.lite.popupLayout = () => {
    return ["popupTitle", "popupPreview"];
  };
  pg.structures.lite.popupTitle = (x) => {
    log("".concat(x.article, ": structures.lite.popupTitle"));
    return '<div><span class="popup_mainlink"><b>'.concat(x.article.toString(), "</b></span></div>");
  };
  const substitute = (data, cmdBody) => {
    const fromRe = new RegExp(cmdBody.from, cmdBody.flags);
    return data.replace(fromRe, cmdBody.to);
  };
  const execCmds = (data, cmdList) => {
    var _iterator = _createForOfIteratorHelper(cmdList), _step;
    try {
      for (_iterator.s(); !(_step = _iterator.n()).done; ) {
        const element = _step.value;
        data = element.action(data, element);
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }
    return data;
  };
  const parseCmd = function parseCmd2(str) {
    if (str.length === 0) {
      return [];
    }
    let p = false;
    switch (str.charAt(0)) {
      case "s":
        p = parseSubstitute(str);
        break;
      default:
        return false;
    }
    if (p) {
      return [p, parseCmd2(p.remainder)];
    }
    return false;
  };
  const unEscape = (str, sep) => {
    return str.split("\\\\").join("\\").split("\\".concat(sep)).join(sep).split("\\n").join("\n");
  };
  const parseSubstitute = (str) => {
    let from;
    let to;
    let flags;
    let tmp;
    if (str.length < 4) {
      return false;
    }
    const sep = str.charAt(1);
    str = str.slice(2);
    tmp = skipOver(str, sep);
    if (tmp) {
      from = tmp.segment;
      str = tmp.remainder;
    } else {
      return false;
    }
    tmp = skipOver(str, sep);
    if (tmp) {
      to = tmp.segment;
      str = tmp.remainder;
    } else {
      return false;
    }
    flags = "";
    if (str.length > 0) {
      tmp = skipOver(str, ";") || skipToEnd(str, ";");
      if (tmp) {
        flags = tmp.segment;
        str = tmp.remainder;
      }
    }
    return {
      action: substitute,
      from,
      to,
      flags,
      remainder: str
    };
  };
  const skipOver = (str, sep) => {
    const endSegment = findNext(str, sep);
    if (endSegment < 0) {
      return false;
    }
    const segment = unEscape(str.slice(0, Math.max(0, endSegment)), sep);
    return {
      segment,
      remainder: str.slice(Math.max(0, endSegment + 1))
    };
  };
  const skipToEnd = (str, _sep) => {
    return {
      segment: str,
      remainder: ""
    };
  };
  const findNext = (str, ch) => {
    for (let i = 0; i < str.length; ++i) {
      if (str.charAt(i) === "\\") {
        i += 2;
      }
      if (str.charAt(i) === ch) {
        return i;
      }
    }
    return -1;
  };
  const setCheckbox = (param, box) => {
    const val = mw.util.getParamValue(param);
    if (val) {
      switch (val) {
        case "1":
        case "yes":
        case "true":
          box.checked = true;
          break;
        case "0":
        case "no":
        case "false":
          box.checked = false;
      }
    }
  };
  const autoEdit = function autoEdit4() {
    setupPopups(() => {
      if (mw.util.getParamValue("autoimpl") !== popupString("autoedit_version")) {
        return false;
      }
      if (mw.util.getParamValue("autowatchlist") && mw.util.getParamValue("actoken") === autoClickToken()) {
        pg.fn.modifyWatchlist(mw.util.getParamValue("title"), mw.util.getParamValue("action"));
      }
      if (!document.editform) {
        return false;
      }
      if (autoEdit4.alreadyRan) {
        return false;
      }
      autoEdit4.alreadyRan = true;
      const cmdString = mw.util.getParamValue("autoedit");
      if (cmdString) {
        try {
          const editbox = document.editform.wpTextbox1;
          const cmdList = parseCmd(cmdString);
          const input = editbox.value;
          const output = execCmds(input, cmdList);
          editbox.value = output;
        } catch {
          return;
        }
      }
      setCheckbox("autominor", document.editform.wpMinoredit);
      setCheckbox("autowatch", document.editform.wpWatchthis);
      const rvid = mw.util.getParamValue("autorv");
      if (rvid) {
        const url = "".concat(pg.wiki.apiwikibase, "?action=query&format=json&formatversion=2&prop=revisions&revids=").concat(rvid);
        startDownload(url, null, autoEdit2);
      } else {
        autoEdit2();
      }
    });
  };
  const autoEdit2 = (d) => {
    let summary = mw.util.getParamValue("autosummary");
    let summaryprompt = mw.util.getParamValue("autosummaryprompt");
    let summarynotice = "";
    if (d && d.data && mw.util.getParamValue("autorv")) {
      const s = getRvSummary(summary, d.data);
      if (s === false) {
        summaryprompt = true;
        summarynotice = popupString("Failed to get revision information, please edit manually.\n\n");
        summary = simplePrintf(summary, [mw.util.getParamValue("autorv"), "(unknown)", "(unknown)"]);
      } else {
        summary = s;
      }
    }
    if (summaryprompt) {
      const txt = summarynotice + popupString("Enter a non-empty edit summary or press cancel to abort");
      const response = prompt(txt, summary);
      if (response) {
        summary = response;
      } else {
        return;
      }
    }
    if (summary) {
      document.editform.wpSummary.value = summary;
    }
    setTimeout(autoEdit3, 100);
  };
  const autoClickToken = () => {
    return mw.user.sessionId();
  };
  const autoEdit3 = () => {
    if (mw.util.getParamValue("actoken") !== autoClickToken()) {
      return;
    }
    const btn = mw.util.getParamValue("autoclick");
    if (btn) {
      if (document.editform && document.editform[btn]) {
        const button = document.editform[btn];
        const msg = tprintf("The %s button has been automatically clicked. Please wait for the next page to load.", [button.value]);
        bannerMessage(msg);
        document.title = "(".concat(document.title, ")");
        button.click();
      } else {
        void mw.notify(tprintf("Could not find button %s. Please check the settings in your javascript file.", [btn]), {
          tag: "popups",
          type: "error"
        });
      }
    }
  };
  const bannerMessage = (s) => {
    const headings = document.querySelectorAll("h1");
    if (headings) {
      const div = document.createElement("div");
      div.innerHTML = "<font size=+1><b>".concat(pg.escapeQuotesHTML(s), "</b></font>");
      headings[0].parentNode.insertBefore(div, headings[0]);
    }
  };
  const getRvSummary = (template, json) => {
    try {
      const o = getJsObj(json);
      const [edit] = anyChild(o.query.pages).revisions;
      const timestamp = edit.timestamp.split(/[A-Z]/g).join(" ").replace(/^ *| *$/g, "");
      return simplePrintf(template, [edit.revid, timestamp, edit.userhidden ? "(hidden)" : edit.user]);
    } catch {
      return false;
    }
  };
  class Downloader {
    constructor(url) {
      if (typeof XMLHttpRequest !== "undefined") {
        this.http = new XMLHttpRequest();
      }
      this.url = url;
      this.id = null;
      this.lastModified = null;
      this.callbackFunction = null;
      this.onFailure = null;
      this.aborted = false;
      this.method = "GET";
      this.async = true;
    }
    /**
     * Submits the http request.
     *
     * @param {*} x
     */
    send(x) {
      if (!this.http) {
        return null;
      }
      return this.http.send(x);
    }
    /* Aborts the download, setting the <code>aborted</code> field to true. */
    abort() {
      if (!this.http) {
        return null;
      }
      this.aborted = true;
      return this.http.abort();
    }
    /** Returns the downloaded data. */
    getData() {
      if (!this.http) {
        return null;
      }
      return this.http.responseText;
    }
    /** Prepares the download. */
    setTarget() {
      if (!this.http) {
        return null;
      }
      this.http.open(this.method, this.url, this.async);
      this.http.setRequestHeader("Api-User-Agent", pg.api.userAgent);
    }
    /** Gets the state of the download. */
    getReadyState() {
      if (!this.http) {
        return null;
      }
      return this.http.readyState;
    }
    /**
     * Starts the download.
     * Note that setTarget {@source Downloader#setTarget} must be run first
     */
    start() {
      if (!this.http) {
        return;
      }
      const self2 = this;
      pg.misc.downloadsInProgress[this.id] = self2;
      this.http.send(null);
    }
    /**
     * Gets the 'Last-Modified' date from the download headers.
     * Should be run after the download completes.
     * Returns <code>null</code> on failure.
     *
     * @return {Date}
     */
    getLastModifiedDate() {
      if (!this.http) {
        return null;
      }
      let lastmod;
      try {
        lastmod = this.http.getResponseHeader("Last-Modified");
      } catch {
      }
      if (lastmod) {
        return new Date(lastmod);
      }
      return null;
    }
    /**
     * Sets the callback function.
     *
     * @param {Function} f callback function, called as <code>f(this)</code> on success
     */
    setCallback(f) {
      if (!this.http) {
        return;
      }
      this.http.onreadystatechange = f;
    }
    getStatus() {
      if (!this.http) {
        return null;
      }
      return this.http.status;
    }
  }
  new Downloader();
  pg.misc.downloadsInProgress = {};
  const newDownload = function newDownload2(url, id, callback, onfailure) {
    const d = new Downloader(url);
    if (!d.http) {
      return "ohdear";
    }
    d.id = id;
    d.setTarget();
    if (!onfailure) {
      onfailure = 2;
    }
    const f = function() {
      if (d.getReadyState() === 4) {
        delete pg.misc.downloadsInProgress[this.id];
        try {
          if (d.getStatus() === 200) {
            d.data = d.getData();
            d.lastModified = d.getLastModifiedDate();
            callback(d);
          } else if (typeof onfailure === "number") {
            if (onfailure > 0) {
              newDownload2(url, id, callback, onfailure - 1);
            }
          } else if (typeof onfailure === "function") {
            onfailure(d, url, id, callback);
          }
        } catch {
        }
      }
    };
    d.setCallback(f);
    return d;
  };
  const fakeDownload = (url, id, callback, data, lastModified, owner) => {
    const d = newDownload(url, callback);
    d.owner = owner;
    d.id = id;
    d.data = data;
    d.lastModified = lastModified;
    return callback(d);
  };
  const startDownload = (url, id, callback) => {
    const d = newDownload(url, id, callback);
    if (typeof d === "string") {
      return d;
    }
    d.start();
    return d;
  };
  const abortAllDownloads = () => {
    for (const x in pg.misc.downloadsInProgress) {
      if (!Object.hasOwn(pg.misc.downloadsInProgress, x)) {
        continue;
      }
      try {
        pg.misc.downloadsInProgress[x].aborted = true;
        pg.misc.downloadsInProgress[x].abort();
        delete pg.misc.downloadsInProgress[x];
      } catch {
      }
    }
  };
  const Insta = {};
  const setupLivePreview = () => {
    let _b;
    Insta.conf = {
      baseUrl: "",
      user: {},
      wiki: {
        lang: pg.wiki.lang,
        interwiki: pg.wiki.interwiki,
        default_thumb_width: 180
      },
      paths: {
        articles: "".concat(pg.wiki.articlePath, "/"),
        // Only used for Insta previews with images. (not in popups)
        math: "/math/",
        images: "https://tu.zhongwen.wiki/images/qiuwenbaike/zh/",
        images_fallback: "//wm.zhongwen.wiki/commons/"
      },
      locale: {
        user: mw.config.get("wgFormattedNamespaces")[pg.nsUserId],
        image: mw.config.get("wgFormattedNamespaces")[pg.nsImageId],
        category: mw.config.get("wgFormattedNamespaces")[pg.nsCategoryId],
        // shouldn't be used in popup previews, i think
        months: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
      }
    };
    (_b = Insta.conf.user).name || (_b.name = "Qiuwen Baike contributors");
    Insta.conf.user.signature = "[[".concat(Insta.conf.locale.user, ":").concat(Insta.conf.user.name, "|").concat(Insta.conf.user.name, "]]");
    Insta.BLOCK_IMAGE = new RegExp("^\\[\\[(?:File|Image|".concat(Insta.conf.locale.image, "):.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)"), "i");
  };
  Insta.dump = function(from, to) {
    if (typeof from === "string") {
      from = document.querySelector("#".concat(from));
    }
    if (typeof to === "string") {
      to = document.querySelector("#".concat(to));
    }
    to.innerHTML = this.convert(from.value);
  };
  Insta.convert = (wiki) => {
    const ll = typeof wiki === "string" ? wiki.replace(/\r/g, "").split(/\n/) : wiki;
    let o = "";
    let p = 0;
    let r;
    const remain = () => {
      return ll.length;
    };
    const sh = () => {
      return ll.shift();
    };
    const ps = (s) => {
      o += s;
    };
    const f = function f2(...args) {
      let i = 1;
      const a = args;
      let [f3] = a;
      let o2 = "";
      let c;
      let p2;
      for (; i < a.length; i++) {
        if ((p2 = f3.indexOf("?")) + 1) {
          c = f3.charAt(p2 + 1) === "?" ? 1 : 0;
          i -= c;
          o2 += f3.slice(0, Math.max(0, p2)) + (c ? "?" : a[i]);
          f3 = f3.slice(p2 + 1 + c);
        } else {
          break;
        }
      }
      return o2 + f3;
    };
    const html_entities = (s) => {
      return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    };
    const htmlescape_text = (s) => {
      return s.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/:/g, "&#58;").replace(/\[/g, "&#91;").replace(/]/g, "&#93;");
    };
    const htmlescape_attr = (s) => {
      return htmlescape_text(s).replace(/'/g, "&#39;").replace(/"/g, "&quot;");
    };
    const str_imatch = (a, b) => {
      let i;
      let l;
      for (i = 0, l = Math.min(a.length, b.length); i < l; i++) {
        if (a.charAt(i) !== b.charAt(i)) {
          break;
        }
      }
      return i;
    };
    const compareLineStringOrReg = (c) => {
      return typeof c === "string" ? ll[0] && ll[0].slice(0, c.length) === c : r = ll[0] && ll[0].match(c);
    };
    const compareLineString = (c) => {
      return ll[0] === c;
    };
    const charAtPoint = (p2) => {
      return ll[0].charAt(p2);
    };
    const endl = (s) => {
      ps(s);
      sh();
    };
    const parse_list = () => {
      let prev = "";
      while (remain() && compareLineStringOrReg(/^([#*:;]+)(.*)$/)) {
        const l_match = r;
        sh();
        const ipos = str_imatch(prev, l_match[1]);
        for (let prevPos = prev.length - 1; prevPos >= ipos; prevPos--) {
          const pi = prev.charAt(prevPos);
          if (pi === "*") {
            ps("</ul>");
          } else if (pi === "#") {
            ps("</ol>");
          } else if (["", "*", "#"].indexOf(l_match[1].charAt(prevPos))) {
            ps("</dl>");
          }
        }
        for (let matchPos = ipos; matchPos < l_match[1].length; matchPos++) {
          const li = l_match[1].charAt(matchPos);
          if (li === "*") {
            ps("<ul>");
          } else if (li === "#") {
            ps("<ol>");
          } else if (["", "*", "#"].indexOf(prev.charAt(matchPos))) {
            ps("<dl>");
          }
        }
        switch (l_match[1].at(-1)) {
          case "*":
          case "#":
            ps("<li>".concat(parse_inline_nowiki(l_match[2])));
            break;
          case ";": {
            ps("<dt>");
            const dt_match = l_match[2].match(/(.*?)(:.*?)$/);
            if (dt_match) {
              ps(parse_inline_nowiki(dt_match[1]));
              ll.unshift(dt_match[2]);
            } else {
              ps(parse_inline_nowiki(l_match[2]));
            }
            break;
          }
          case ":":
            ps("<dd>".concat(parse_inline_nowiki(l_match[2])));
        }
        [, prev] = l_match;
      }
      for (let i = prev.length - 1; i >= 0; i--) {
        ps(f("</?>", prev.charAt(i) === "*" ? "ul" : prev.charAt(i) === "#" ? "ol" : "dl"));
      }
    };
    const parse_table = () => {
      endl(f("<table>", compareLineStringOrReg(/^{\|( .*)$/) ? r[1] : ""));
      for (; remain(); ) {
        if (compareLineStringOrReg("|")) {
          switch (charAtPoint(1)) {
            case "}":
              endl("</table>");
              return;
            case "-":
              endl(f("<tr>", compareLineStringOrReg(/\|-*(.*)/)[1]));
              break;
            default:
              parse_table_data();
          }
        } else if (compareLineStringOrReg("!")) {
          parse_table_data();
        } else {
          sh();
        }
      }
    };
    const parse_table_data = () => {
      let td_line;
      let match_i;
      const td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/);
      if (td_match[1] === "|+") {
        ps("<caption");
      } else {
        ps("<t".concat(td_match[1] === "|" ? "d" : "h"));
      }
      if (td_match[3]) {
        match_i = 4;
      } else {
        match_i = 2;
      }
      ps(">");
      if (td_match[1] === "|+") {
        ps(parse_inline_nowiki(td_match[match_i]));
      } else {
        td_line = td_match[match_i].split(td_match[1] === "|" ? "||" : /\|\||!!/);
        ps(parse_inline_nowiki(td_line.shift()));
        while (td_line.length > 0) {
          ll.unshift(td_match[1] + td_line.pop());
        }
      }
      let tc = 0;
      const td = [];
      while (remain()) {
        td.push(sh());
        if (compareLineStringOrReg("|")) {
          if (!tc) {
            break;
          } else if (charAtPoint(1) === "}") {
            tc--;
          }
        } else if (!tc && compareLineStringOrReg("!")) {
          break;
        } else if (compareLineStringOrReg("{|")) {
          tc++;
        }
      }
      if (td.length > 0) {
        ps(Insta.convert(td));
      }
    };
    const parse_pre = () => {
      ps("<pre>");
      do {
        endl("".concat(parse_inline_nowiki(ll[0].slice(1)), "\n"));
      } while (remain() && compareLineStringOrReg(" "));
      ps("</pre>");
    };
    const parse_block_image = () => {
      ps(parse_image(sh()));
    };
    const parse_image = (str) => {
      let tag = str.substring(str.indexOf(":") + 1, str.length - 2);
      let width;
      let attr = [];
      let filename;
      let caption = "";
      let thumb = 0;
      let frame = 0;
      let center = 0;
      let align = "";
      if (/\|/.test(tag)) {
        let nesting = 0;
        let last_attr;
        for (let i = tag.length - 1; i > 0; i--) {
          if (tag.charAt(i) === "|" && !nesting) {
            last_attr = tag.slice(i + 1);
            tag = tag.slice(0, Math.max(0, i));
            break;
          } else {
            switch (tag.slice(i - 1, i - 1 + 2)) {
              case "]]":
                nesting++;
                i--;
                break;
              case "[[":
                nesting--;
                i--;
            }
          }
        }
        attr = tag.split(/\s*\|\s*/);
        attr.push(last_attr);
        filename = attr.shift();
        let w_match;
        for (; attr.length > 0; attr.shift()) {
          w_match = attr[0].match(/^(\d*)(?:[px]*\d*)?px$/);
          if (w_match) {
            [, width] = w_match;
          } else {
            switch (attr[0]) {
              case "thumb":
              case "thumbnail":
                thumb = true;
                frame = true;
                break;
              case "frame":
                frame = true;
                break;
              case "none":
              case "right":
              case "left":
                center = false;
                [align] = attr;
                break;
              case "center":
                center = true;
                align = "none";
                break;
              default:
                if (attr.length === 1) {
                  [caption] = attr;
                }
            }
          }
        }
      } else {
        filename = tag;
      }
      return "";
    };
    const parse_inline_nowiki = (str) => {
      let start;
      let lastend = 0;
      let substart = 0;
      let nestlev = 0;
      let open;
      let close;
      let subloop;
      let html = "";
      while ((start = str.indexOf("<no".concat("wiki", ">"), substart)) !== -1) {
        html += parse_inline_wiki(str.substring(lastend, start));
        start += 8;
        substart = start;
        subloop = true;
        do {
          open = str.indexOf("<no".concat("wiki", ">"), substart);
          close = str.indexOf("</no".concat("wiki", ">"), substart);
          if (close <= open || open === -1) {
            if (close === -1) {
              return html + html_entities(str.slice(start));
            }
            substart = close + 9;
            if (nestlev) {
              nestlev--;
            } else {
              lastend = substart;
              html += html_entities(str.substring(start, lastend - 9));
              subloop = false;
            }
          } else {
            substart = open + 8;
            nestlev++;
          }
        } while (subloop);
      }
      return html + parse_inline_wiki(str.slice(lastend));
    };
    const parse_inline_images = (str) => {
      let start;
      let substart = 0;
      let nestlev = 0;
      let loop;
      let close;
      let open;
      let wiki2;
      let html;
      while ((start = str.indexOf("[[", substart)) !== -1) {
        if (new RegExp("^(Image|File|".concat(Insta.conf.locale.image, "):"), "i").test(str.slice(start + 2))) {
          loop = true;
          substart = start;
          do {
            substart += 2;
            close = str.indexOf("]]", substart);
            open = str.indexOf("[[", substart);
            if (close <= open || open === -1) {
              if (close === -1) {
                return str;
              }
              substart = close;
              if (nestlev) {
                nestlev--;
              } else {
                wiki2 = str.substring(start, close + 2);
                html = parse_image(wiki2);
                str = str.replace(wiki2, html);
                substart = start + html.length;
                loop = false;
              }
            } else {
              substart = open;
              nestlev++;
            }
          } while (loop);
        } else {
          break;
        }
      }
      return str;
    };
    const parse_inline_formatting = (str) => {
      let em;
      let st;
      let i;
      let li;
      let o2 = "";
      while ((i = str.indexOf("''", li)) + 1) {
        o2 += str.substring(li, i);
        li = i + 2;
        if (str.charAt(i + 2) === "'") {
          li++;
          st = !st;
          o2 += st ? "<strong>" : "</strong>";
        } else {
          em = !em;
          o2 += em ? "<em>" : "</em>";
        }
      }
      return o2 + str.slice(li);
    };
    const parse_inline_wiki = (str) => {
      str = parse_inline_images(str);
      str = parse_inline_formatting(str);
      str = str.replace(/<math>(.*?)<\/math>/gi, "");
      let date = /* @__PURE__ */ new Date();
      let minutes = date.getUTCMinutes();
      if (minutes < 10) {
        minutes = "0".concat(minutes);
      }
      date = f("?:?, ? ? ? (UTC)", date.getUTCHours(), minutes, date.getUTCDate(), Insta.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear());
      return str.replace(/~{5}(?!~)/g, date).replace(/~{4}(?!~)/g, "".concat(Insta.conf.user.name, " ").concat(date)).replace(/~{3}(?!~)/g, Insta.conf.user.name).replace(new RegExp("\\[\\[:((?:".concat(Insta.conf.locale.category, "|Image|File|").concat(Insta.conf.locale.image, "|").concat(Insta.conf.wiki.interwiki, "):[^|]*?)\\]\\](\\w*)"), "gi"), (_$0, $1, $2) => {
        return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2));
      }).replace(new RegExp("\\[\\[(?:".concat(Insta.conf.locale.category, "|").concat(Insta.conf.wiki.interwiki, "):.*?\\]\\]"), "gi"), "").replace(new RegExp("\\[\\[:((?:".concat(Insta.conf.locale.category, "|Image|File|").concat(Insta.conf.locale.image, "|").concat(Insta.conf.wiki.interwiki, "):.*?)\\|([^\\]]+?)\\]\\](\\w*)"), "gi"), (_$0, $1, $2, $3) => {
        return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3));
      }).replace(/\[\[(\/[^|]*?)]]/g, (_$0, $1) => {
        return f("<a href='?'>?</a>", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($1));
      }).replace(/\[\[(\/.*?)\|(.+?)]]/g, (_$0, $1, $2) => {
        return f("<a href='?'>?</a>", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($2));
      }).replace(/\[\[([^[|]*?)]](\w*)/g, (_$0, $1, $2) => {
        return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2));
      }).replace(/\[\[([^[]*?)\|([^\]]+?)]](\w*)/g, (_$0, $1, $2, $3) => {
        return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3));
      }).replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|]]/g, (_$0, $1, $2, $3) => {
        return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1) + htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($2));
      }).replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)]/g, (_$0, $1, $2, $3, $4) => {
        return f("<a class='external' href='?:?'>?</a>", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($4));
      }).replace(/\[http:\/\/(.*?)]/g, (_$0, $1) => {
        return f("<a class='external' href='http://?'>[#]</a>", htmlescape_attr($1));
      }).replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)]/g, (_$0, $1, $2, $3) => {
        return f("<a class='external' href='?:?'>?:?</a>", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($1), htmlescape_text($2) + htmlescape_text($3));
      }).replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*[^ !$,.:;?])/g, (_$0, $1, $2, $3, $4) => {
        return f("?<a class='external' href='?:?'>?:?</a>", htmlescape_text($1), htmlescape_attr($2), htmlescape_attr($3) + htmlescape_attr($4), htmlescape_text($2), htmlescape_text($3) + htmlescape_text($4));
      }).replace("__NOTOC__", "").replace("__NOINDEX__", "").replace("__INDEX__", "").replace("__NOEDITSECTION__", "");
    };
    for (; remain(); ) {
      if (compareLineStringOrReg(/^(={1,6})(.*)\1(.*)$/)) {
        p = 0;
        endl(f("<h?>?</h?>?", r[1].length, parse_inline_nowiki(r[2]), r[1].length, r[3]));
      } else if (compareLineStringOrReg(/^[#*:;]/)) {
        p = 0;
        parse_list();
      } else if (compareLineStringOrReg(" ")) {
        p = 0;
        parse_pre();
      } else if (compareLineStringOrReg("{|")) {
        p = 0;
        parse_table();
      } else if (compareLineStringOrReg(/^----+$/)) {
        p = 0;
        endl("<hr>");
      } else if (compareLineStringOrReg(Insta.BLOCK_IMAGE)) {
        p = 0;
        parse_block_image();
      } else {
        if (compareLineString("")) {
          p = remain() > 1 && ll[1] === "";
          if (p) {
            endl("<p><br>");
          }
        } else {
          if (!p) {
            ps("<p>");
            p = 1;
          }
          ps("".concat(parse_inline_nowiki(ll[0]), " "));
        }
        sh();
      }
    }
    return o;
  };
  const wiki2html = (txt, baseurl) => {
    Insta.conf.baseUrl = baseurl;
    return Insta.convert(txt);
  };
  const popupFilterPageSize = (data) => {
    return formatBytes(data.length);
  };
  const popupFilterCountLinks = (data) => {
    const num = countLinks(data);
    return "".concat(String(num), "&nbsp;").concat(num === 1 ? popupString("wikiLink") : popupString("wikiLinks"));
  };
  const popupFilterCountImages = (data) => {
    const num = countImages(data);
    return "".concat(String(num), "&nbsp;").concat(num === 1 ? popupString("image") : popupString("images"));
  };
  const popupFilterCountCategories = (data) => {
    const num = countCategories(data);
    return "".concat(String(num), "&nbsp;").concat(num === 1 ? popupString("category") : popupString("categories"));
  };
  const popupFilterLastModified = (_data, download) => {
    const lastmod = download.lastModified;
    const now = /* @__PURE__ */ new Date();
    const age = now - lastmod;
    if (lastmod && getValueOf("popupLastModified")) {
      return tprintf("%s old", [formatAge(age)]).replace(/ /g, "&nbsp;");
    }
    return "";
  };
  const formatAge = (age) => {
    let a = 0 + age;
    const aa = a;
    const seclen = 1e3;
    const minlen = 60 * seclen;
    const hourlen = 60 * minlen;
    const daylen = 24 * hourlen;
    const weeklen = 7 * daylen;
    const numweeks = (a - a % weeklen) / weeklen;
    a -= numweeks * weeklen;
    const sweeks = addunit(numweeks, "week");
    const numdays = (a - a % daylen) / daylen;
    a -= numdays * daylen;
    const sdays = addunit(numdays, "day");
    const numhours = (a - a % hourlen) / hourlen;
    a -= numhours * hourlen;
    const shours = addunit(numhours, "hour");
    const nummins = (a - a % minlen) / minlen;
    a -= nummins * minlen;
    const smins = addunit(nummins, "minute");
    const numsecs = (a - a % seclen) / seclen;
    a -= numsecs * seclen;
    const ssecs = addunit(numsecs, "second");
    if (aa > 4 * weeklen) {
      return sweeks;
    }
    if (aa > weeklen) {
      return "".concat(sweeks, " ").concat(sdays);
    }
    if (aa > daylen) {
      return "".concat(sdays, " ").concat(shours);
    }
    if (aa > 6 * hourlen) {
      return shours;
    }
    if (aa > hourlen) {
      return "".concat(shours, " ").concat(smins);
    }
    if (aa > 10 * minlen) {
      return smins;
    }
    if (aa > minlen) {
      return "".concat(smins, " ").concat(ssecs);
    }
    return ssecs;
  };
  const addunit = (num, str) => {
    return "".concat(num, " ").concat(num === 1 ? popupString(str) : popupString("".concat(str, "s")));
  };
  const runPopupFilters = (list, data, download) => {
    const ret = [];
    var _iterator2 = _createForOfIteratorHelper(list), _step2;
    try {
      for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) {
        const element = _step2.value;
        if (element && typeof element === "function") {
          const s = element(data, download, download.owner.article);
          if (s) {
            ret.push(s);
          }
        }
      }
    } catch (err) {
      _iterator2.e(err);
    } finally {
      _iterator2.f();
    }
    return ret;
  };
  const getPageInfo = (data, download) => {
    if (!data || data.length === 0) {
      return popupString("Empty page");
    }
    const popupFilters = getValueOf("popupFilters") || [];
    const extraPopupFilters = getValueOf("extraPopupFilters") || [];
    const pageInfoArray = runPopupFilters([...popupFilters, ...extraPopupFilters], data, download);
    let pageInfo = pageInfoArray.join(", ");
    if (pageInfo !== "") {
      pageInfo = upcaseFirst(pageInfo);
    }
    return pageInfo;
  };
  const countLinks = (wikiText) => {
    return wikiText.split("[[").length - 1;
  };
  const countImages = (wikiText) => {
    return (wikiText.split(pg.re.image).length - 1) / (pg.re.imageBracketCount + 1);
  };
  const countCategories = (wikiText) => {
    return (wikiText.split(pg.re.category).length - 1) / (pg.re.categoryBracketCount + 1);
  };
  const popupFilterStubDetect = (data, _download, article) => {
    const counts = stubCount(data, article);
    if (counts.real) {
      return popupString("stub");
    }
    if (counts.sect) {
      return popupString("section stub");
    }
    return "";
  };
  const popupFilterDisambigDetect = (data, _download, article) => {
    if (!getValueOf("popupAllDabsStubs") && article.namespace()) {
      return "";
    }
    return isDisambig(data, article) ? popupString("disambig") : "";
  };
  const formatBytes = (num) => {
    return num > 949 ? Math.round(num / 100) / 10 + popupString("kB") : "".concat(num, "&nbsp;").concat(popupString("bytes"));
  };
  const Stringwrapper = function Stringwrapper2() {
    this.indexOf = function(x) {
      return this.toString().indexOf(x);
    };
    this.toString = function() {
      return this.value;
    };
    this.split = function(x) {
      return this.toString().split(x);
    };
    this.substring = function(x, y) {
      if (y === void 0) {
        return this.toString().slice(Math.max(0, x));
      }
      return this.toString().substring(x, y);
    };
    this.split = function(x) {
      return this.toString().split(x);
    };
    this.replace = function(x, y) {
      return this.toString().replace(x, y);
    };
  };
  class Title extends Stringwrapper {
    constructor(val) {
      super();
      this.value = null;
      this.anchor = "";
      this.setUtf(val);
    }
    /**
     * Returns the canonical representation of the article title, optionally without anchor.
     *
     * @param {boolean} omitAnchor
     * @fixme Decide specs for anchor
     * @return String The article title and the anchor.
     */
    toString(omitAnchor) {
      return this.value + (!omitAnchor && this.anchor ? "#".concat(this.anchorString()) : "");
    }
    anchorString() {
      if (!this.anchor) {
        return "";
      }
      const split = this.anchor.split(/((?:\.[\dA-F]{2})+)/);
      const len = split.length;
      let value;
      for (let j = 1; j < len; j += 2) {
        value = split[j].split(".").join("%");
        try {
          value = decodeURIComponent(value);
        } catch {
        }
        split[j] = value.split("_").join(" ");
      }
      return split.join("");
    }
    urlAnchor() {
      const split = this.anchor.split("/((?:[%][0-9A-F]{2})+)/");
      const len = split.length;
      for (let j = 1; j < len; j += 2) {
        split[j] = split[j].split("%").join(".");
      }
      return split.join("");
    }
    anchorFromUtf(str) {
      this.anchor = encodeURIComponent(str.split(" ").join("_")).split("%3A").join(":").split("'").join("%27").split("%").join(".");
    }
    fromURL(h) {
      if (typeof h !== "string") {
        this.value = null;
        return this;
      }
      const splitted = h.split("?");
      splitted[0] = splitted[0].split("&").join("%26");
      h = splitted.join("?");
      const contribs = pg.re.contribs.exec(h);
      if (contribs) {
        if (contribs[1] === "title=") {
          contribs[3] = contribs[3].split("+").join(" ");
        }
        const u = new Title(contribs[3]);
        this.setUtf(Title.decodeNasties("".concat(mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":").concat(u.stripNamespace())));
        return this;
      }
      const email = pg.re.email.exec(h);
      if (email) {
        this.setUtf(Title.decodeNasties("".concat(mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":").concat(new Title(email[3]).stripNamespace())));
        return this;
      }
      const backlinks = pg.re.backlinks.exec(h);
      if (backlinks) {
        this.setUtf(Title.decodeNasties(new Title(backlinks[3])));
        return this;
      }
      const specialdiff = pg.re.specialdiff.exec(h);
      if (specialdiff) {
        this.setUtf(Title.decodeNasties(new Title("".concat(mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId], ":Diff"))));
        return this;
      }
      const m = pg.re.main.exec(h);
      if (m === null) {
        this.value = null;
      } else {
        const fromBotInterface = /\?(.+&)?title=/.test(h);
        if (fromBotInterface) {
          m[2] = m[2].split("+").join("_");
        }
        const extracted = m[2] + (m[3] ? "#".concat(m[3]) : "");
        if (pg.flag.isSafari && /%25[\dA-Fa-f]{2}/.test(extracted)) {
          this.setUtf(decodeURIComponent(unescape(extracted)));
        } else {
          this.setUtf(Title.decodeNasties(extracted));
        }
      }
      return this;
    }
    static decodeNasties(txt) {
      try {
        let ret = decodeURI(Title.decodeEscapes(txt));
        ret = ret.replace(/[ _]*$/, "");
        return ret;
      } catch {
        return txt;
      }
    }
    // Decode valid %-encodings, otherwise escape them
    static decodeEscapes(txt) {
      const split = txt.split(/((?:%[\dA-Fa-f]{2})+)/);
      const len = split.length;
      if (len === 1) {
        return split[0].replace(/%(?![\dA-Fa-f]{2})/g, "%25");
      }
      for (let i = 1; i < len; i += 2) {
        split[i] = decodeURIComponent(split[i]);
      }
      return split.join("");
    }
    fromAnchor(a) {
      if (!a) {
        this.value = null;
        return this;
      }
      return this.fromURL(a.href);
    }
    fromWikiText(txt) {
      txt = myDecodeURI(txt);
      this.setUtf(txt);
      return this;
    }
    hintValue() {
      if (!this.value) {
        return "";
      }
      return safeDecodeURI(this.value);
    }
    toUserName(withNs) {
      if (this.namespaceId() !== pg.nsUserId && this.namespaceId() !== pg.nsUsertalkId) {
        this.value = null;
        return;
      }
      this.value = (withNs ? "".concat(mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":") : "") + this.stripNamespace().split("/")[0];
    }
    userName(withNs) {
      const t = new Title(this.value);
      t.toUserName(withNs);
      if (t.value) {
        return t;
      }
      return null;
    }
    toTalkPage() {
      if (this.value === null) {
        return null;
      }
      const namespaceId = this.namespaceId();
      if (namespaceId >= 0 && namespaceId % 2 === 0) {
        const localizedNamespace = mw.config.get("wgFormattedNamespaces")[namespaceId + 1];
        if (localizedNamespace !== void 0) {
          this.value = localizedNamespace === "" ? this.stripNamespace() : "".concat(localizedNamespace.split(" ").join("_"), ":").concat(this.stripNamespace());
          return this.value;
        }
      }
      this.value = null;
      return null;
    }
    // Return canonical, localized namespace
    namespace() {
      return mw.config.get("wgFormattedNamespaces")[this.namespaceId()];
    }
    namespaceId() {
      const n = this.value.indexOf(":");
      if (n < 0) {
        return 0;
      }
      const namespaceId = mw.config.get("wgNamespaceIds")[this.value.slice(0, Math.max(0, n)).split(" ").join("_").toLowerCase()];
      if (namespaceId === void 0) {
        return 0;
      }
      return namespaceId;
    }
    talkPage() {
      const t = new Title(this.value);
      t.toTalkPage();
      if (t.value) {
        return t;
      }
      return null;
    }
    isTalkPage() {
      if (this.talkPage() === null) {
        return true;
      }
      return false;
    }
    toArticleFromTalkPage() {
      if (this.value === null) {
        return null;
      }
      const namespaceId = this.namespaceId();
      if (namespaceId >= 0 && namespaceId % 2 === 1) {
        const localizedNamespace = mw.config.get("wgFormattedNamespaces")[namespaceId - 1];
        if (localizedNamespace !== void 0) {
          this.value = localizedNamespace === "" ? this.stripNamespace() : "".concat(localizedNamespace.split(" ").join("_"), ":").concat(this.stripNamespace());
          return this.value;
        }
      }
      this.value = null;
      return null;
    }
    articleFromTalkPage() {
      const t = new Title(this.value);
      t.toArticleFromTalkPage();
      if (t.value) {
        return t;
      }
      return null;
    }
    articleFromTalkOrArticle() {
      const t = new Title(this.value);
      if (t.toArticleFromTalkPage()) {
        return t;
      }
      return this;
    }
    isIpUser() {
      return pg.re.ipUser.test(this.userName());
    }
    stripNamespace() {
      const n = this.value.indexOf(":");
      if (n < 0) {
        return this.value;
      }
      const namespaceId = this.namespaceId();
      if (namespaceId === pg.nsMainspaceId) {
        return this.value;
      }
      return this.value.slice(Math.max(0, n + 1));
    }
    setUtf(value) {
      if (!value) {
        this.value = "";
        return;
      }
      const anch = value.indexOf("#");
      if (anch < 0) {
        this.value = value.split("_").join(" ");
        this.anchor = "";
        return;
      }
      this.value = value.slice(0, Math.max(0, anch)).split("_").join(" ");
      this.anchor = value.slice(Math.max(0, anch + 1));
      this.ns = null;
    }
    setUrl(urlfrag) {
      const anch = urlfrag.indexOf("#");
      this.value = safeDecodeURI(urlfrag.slice(0, Math.max(0, anch)));
      this.anchor = this.value.slice(Math.max(0, anch + 1));
    }
    append(x) {
      this.setUtf(this.value + x);
    }
    urlString(x) {
      if (!x) {
        x = {};
      }
      let v = this.toString(true);
      if (!x.omitAnchor && this.anchor) {
        v += "#".concat(this.urlAnchor());
      }
      if (!x.keepSpaces) {
        v = v.split(" ").join("_");
      }
      return encodeURI(v).split("&").join("%26").split("?").join("%3F").split("+").join("%2B");
    }
    removeAnchor() {
      return new Title(this.toString(true));
    }
    toUrl() {
      return pg.wiki.titlebase + this.urlString();
    }
  }
  Title.fromURL = (h) => {
    return new Title().fromURL(h);
  };
  Title.fromAnchor = (a) => {
    return new Title().fromAnchor(a);
  };
  Title.fromWikiText = (txt) => {
    return new Title().fromWikiText(txt);
  };
  const parseParams = (url) => {
    const specialDiff = pg.re.specialdiff.exec(url);
    if (specialDiff) {
      const split = specialDiff[1].split("/");
      if (split.length === 1) {
        return {
          oldid: split[0],
          diff: "prev"
        };
      } else if (split.length === 2) {
        return {
          oldid: split[0],
          diff: split[1]
        };
      }
    }
    const ret = {};
    if (!url.includes("?")) {
      return ret;
    }
    [url] = url.split("#");
    const s = url.split("?").slice(1).join(",");
    const t = s.split("&");
    var _iterator3 = _createForOfIteratorHelper(t), _step3;
    try {
      for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) {
        const element = _step3.value;
        const z = element.split("=");
        z.push(null);
        [, ret[z[0]]] = z;
      }
    } catch (err) {
      _iterator3.e(err);
    } finally {
      _iterator3.f();
    }
    if (ret.diff && ret.oldid === void 0) {
      ret.oldid = "prev";
    }
    if (ret.oldid && (ret.oldid === "prev" || ret.oldid === "next" || ret.oldid === "cur")) {
      const helper = ret.diff;
      ret.diff = ret.oldid;
      ret.oldid = helper;
    }
    return ret;
  };
  const myDecodeURI = (str) => {
    let ret;
    try {
      ret = decodeURI(str.toString());
    } catch {
      return str;
    }
    for (let i = 0; i < pg.misc.decodeExtras.length; ++i) {
      const {
        from
      } = pg.misc.decodeExtras[i];
      const {
        to
      } = pg.misc.decodeExtras[i];
      ret = ret.split(from).join(to);
    }
    return ret;
  };
  const safeDecodeURI = (str) => {
    const ret = myDecodeURI(str);
    return ret || str;
  };
  const isDisambig = (data, article) => {
    if (!getValueOf("popupAllDabsStubs") && article.namespace()) {
      return false;
    }
    return !article.isTalkPage() && pg.re.disambig.test(data);
  };
  const stubCount = (data, article) => {
    if (!getValueOf("popupAllDabsStubs") && article.namespace()) {
      return false;
    }
    let sectStub = 0;
    let realStub = 0;
    if (pg.re.stub.test(data)) {
      const s = data.split(pg.re.stub);
      for (let i = 1; i < s.length; i += 2) {
        if (s[i]) {
          ++sectStub;
        } else {
          ++realStub;
        }
      }
    }
    return {
      real: realStub,
      sect: sectStub
    };
  };
  const isValidImageName = (str) => {
    return !str.includes("{");
  };
  const isInStrippableNamespace = (article) => {
    return article.namespaceId() !== 0;
  };
  const isInMainNamespace = (article) => {
    return article.namespaceId() === 0;
  };
  const anchorContainsImage = (a) => {
    if (a === null) {
      return false;
    }
    const kids = a.childNodes;
    var _iterator4 = _createForOfIteratorHelper(kids), _step4;
    try {
      for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) {
        const kid = _step4.value;
        if (kid.nodeName === "IMG") {
          return true;
        }
      }
    } catch (err) {
      _iterator4.e(err);
    } finally {
      _iterator4.f();
    }
    return false;
  };
  const isPopupLink = (a) => {
    if (!markNopopupSpanLinks.done) {
      markNopopupSpanLinks();
    }
    if (a.inNopopupSpan) {
      return false;
    }
    if (a.onmousedown || a.getAttribute("nopopup")) {
      return false;
    }
    const h = a.href;
    if (h === "".concat(document.location.href, "#")) {
      return false;
    }
    if (!pg.re.basenames.test(h)) {
      return false;
    }
    if (!pg.re.urlNoPopup.test(h)) {
      return true;
    }
    return (pg.re.email.test(h) || pg.re.contribs.test(h) || pg.re.backlinks.test(h) || pg.re.specialdiff.test(h)) && !h.includes("&limit=");
  };
  const markNopopupSpanLinks = function markNopopupSpanLinks2() {
    if (!getValueOf("popupOnlyArticleLinks")) {
      fixVectorMenuPopups();
    }
    const $body = $("body");
    const s = $body.find(".nopopups").toArray();
    var _iterator5 = _createForOfIteratorHelper(s), _step5;
    try {
      for (_iterator5.s(); !(_step5 = _iterator5.n()).done; ) {
        const element = _step5.value;
        const as = element.querySelectorAll("a");
        var _iterator6 = _createForOfIteratorHelper(as), _step6;
        try {
          for (_iterator6.s(); !(_step6 = _iterator6.n()).done; ) {
            const a = _step6.value;
            a.inNopopupSpan = true;
          }
        } catch (err) {
          _iterator6.e(err);
        } finally {
          _iterator6.f();
        }
      }
    } catch (err) {
      _iterator5.e(err);
    } finally {
      _iterator5.f();
    }
    markNopopupSpanLinks2.done = true;
  };
  const fixVectorMenuPopups = () => {
    const $body = $("body");
    $body.find("nav.vector-menu h3:first a:first").prop("inNopopupSpan", true);
  };
  const getPageWithCaching = (url, onComplete, owner) => {
    log("getPageWithCaching, url=".concat(url));
    const i = findInPageCache(url);
    let d;
    if (i > -1) {
      d = fakeDownload(url, owner.idNumber, onComplete, pg.cache.pages[i].data, pg.cache.pages[i].lastModified, owner);
    } else {
      d = getPage(url, onComplete, owner);
      if (d && owner && owner.addDownload) {
        owner.addDownload(d);
        d.owner = owner;
      }
    }
  };
  const getPage = (url, onComplete, owner) => {
    log("getPage");
    const callback = (d) => {
      if (!d.aborted) {
        addPageToCache(d);
        onComplete(d);
      }
    };
    return startDownload(url, owner.idNumber, callback);
  };
  const findInPageCache = (url) => {
    for (let i = 0; i < pg.cache.pages.length; ++i) {
      if (url === pg.cache.pages[i].url) {
        return i;
      }
    }
    return -1;
  };
  const addPageToCache = (download) => {
    log("addPageToCache ".concat(download.url));
    const page = {
      url: download.url,
      data: download.data,
      lastModified: download.lastModified
    };
    return pg.cache.pages.push(page);
  };
  const getJsObj = (json) => {
    try {
      const json_ret = JSON.parse(json);
      if (json_ret.warnings) {
        for (let w = 0; w < json_ret.warnings.length; w++) {
          if (json_ret.warnings[w]["*"]) {
            log(json_ret.warnings[w]["*"]);
          } else {
            log(json_ret.warnings[w].warnings);
          }
        }
      } else if (json_ret.error) {
        errlog("".concat(json_ret.error.code, ": ").concat(json_ret.error.info));
      }
      return json_ret;
    } catch {
      errlog("Something went wrong with getJsObj, json=".concat(json));
      return 1;
    }
  };
  const anyChild = (obj) => {
    for (const p in obj) {
      if (!Object.hasOwn(obj, p)) {
        continue;
      }
      return obj[p];
    }
    return null;
  };
  const upcaseFirst = (str) => {
    if (typeof str !== "string" || str === "") {
      return;
    }
    return str.charAt(0).toUpperCase() + str.slice(1);
  };
  const findInArray = (arr, foo) => {
    if (!arr || arr.length === 0) {
      return -1;
    }
    const len = arr.length;
    for (let i = 0; i < len; ++i) {
      if (arr[i] === foo) {
        return i;
      }
    }
    return -1;
  };
  const nextOne = (array, value) => {
    const i = findInArray(array, value);
    if (i < 0) {
      return null;
    }
    return array[i + 1];
  };
  const literalizeRegex = (str) => {
    return mw.util.escapeRegExp(str);
  };
  String.prototype.entify = function() {
    return this.split("&").join("&amp;").split("<").join("&lt;").split(">").join(
      "&gt;"
      /* +shy */
    ).split('"').join("&quot;");
  };
  const removeNulls = (val) => {
    return val !== null;
  };
  const joinPath = (list) => {
    return list.filter(removeNulls).join("/");
  };
  const simplePrintf = (str, subs) => {
    if (!str || !subs) {
      return str;
    }
    const ret = [];
    const s = str.split(/(%s|\$\d+)/);
    let i = 0;
    do {
      ret.push(s.shift());
      if (s.length === 0) {
        break;
      }
      const cmd = s.shift();
      if (cmd === "%s") {
        if (i < subs.length) {
          ret.push(subs[i]);
        } else {
          ret.push(cmd);
        }
        ++i;
      } else {
        const j = Number.parseInt(cmd.replace("$", ""), 10) - 1;
        if (j > -1 && j < subs.length) {
          ret.push(subs[j]);
        } else {
          ret.push(cmd);
        }
      }
    } while (s.length > 0);
    return ret.join("");
  };
  const isString = (x) => {
    return typeof x === "string" || x instanceof String;
  };
  const isNumber = (x) => {
    return typeof x === "number" || x instanceof Number;
  };
  const isRegExp = (x) => {
    return x instanceof RegExp;
  };
  const isArray = (x) => {
    return Array.isArray(x);
  };
  const isObject = (x) => {
    return x instanceof Object;
  };
  const isFunction = (x) => {
    return !isRegExp(x) && (typeof x === "function" || x instanceof Function);
  };
  const repeatString = (s, mult) => {
    let ret = "";
    for (let i = 0; i < mult; ++i) {
      ret += s;
    }
    return ret;
  };
  const zeroFill = (s, min) => {
    min || (min = 2);
    const t = s.toString();
    return repeatString("0", min - t.length) + t;
  };
  const map = (f, o) => {
    if (isArray(o)) {
      return map_array(f, o);
    }
    return map_object(f, o);
  };
  const map_array = (f, o) => {
    const ret = [];
    var _iterator7 = _createForOfIteratorHelper(o), _step7;
    try {
      for (_iterator7.s(); !(_step7 = _iterator7.n()).done; ) {
        const element = _step7.value;
        ret.push(f(element));
      }
    } catch (err) {
      _iterator7.e(err);
    } finally {
      _iterator7.f();
    }
    return ret;
  };
  const map_object = (f, o) => {
    const ret = {};
    for (const i in o) {
      if (!Object.hasOwn(o, i)) {
        continue;
      }
      ret[o] = f(o[i]);
    }
    return ret;
  };
  pg.escapeQuotesHTML = (text) => {
    return text.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
  };
  pg.unescapeQuotesHTML = (html) => {
    const txt = document.createElement("textarea");
    txt.innerHTML = html;
    return txt.value;
  };
  const retargetDab = (newTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) => {
    log("retargetDab: newTarget=".concat(newTarget, " oldTarget=").concat(oldTarget));
    return changeLinkTargetLink({
      newTarget,
      text: newTarget.split(" ").join("&nbsp;"),
      hint: tprintf("disambigHint", [newTarget]),
      summary: simplePrintf(getValueOf("popupFixDabsSummary"), [friendlyCurrentArticleName, newTarget]),
      clickButton: getValueOf("popupDabsAutoClick"),
      minor: true,
      oldTarget,
      watch: getValueOf("popupWatchDisambiggedPages"),
      title: titleToEdit
    });
  };
  const listLinks = (wikitext, oldTarget, titleToEdit) => {
    const reg = /\[\[([^|]*?) *(\||]])/gi;
    let ret = [];
    const splitted = wikitext.split(reg);
    const omitRegex = /^[a-z]*:|^[Ss]pecial:|^[Ii]mage|^[Cc]ategory/;
    const friendlyCurrentArticleName = oldTarget.toString();
    const wikPos = getValueOf("popupDabWiktionary");
    for (let i = 1; i < splitted.length; i += 3) {
      if (typeof splitted[i] === "string" && splitted[i].length > 0 && !omitRegex.test(splitted[i])) {
        ret.push(retargetDab(splitted[i], oldTarget, friendlyCurrentArticleName, titleToEdit));
      }
    }
    ret = rmDupesFromSortedList(ret.sort());
    if (wikPos) {
      const wikTarget = "wiktionary:".concat(friendlyCurrentArticleName.replace(/^(.+)\s+\([^)]+\)\s*$/, "$1"));
      const meth = wikPos.toLowerCase() === "first" ? "unshift" : "push";
      ret[meth](retargetDab(wikTarget, oldTarget, friendlyCurrentArticleName, titleToEdit));
    }
    ret.push(changeLinkTargetLink({
      newTarget: null,
      text: popupString("remove this link").split(" ").join("&nbsp;"),
      hint: popupString("remove all links to this disambig page from this article"),
      clickButton: getValueOf("popupDabsAutoClick"),
      oldTarget,
      summary: simplePrintf(getValueOf("popupRmDabLinkSummary"), [friendlyCurrentArticleName]),
      watch: getValueOf("popupWatchDisambiggedPages"),
      title: titleToEdit
    }));
    return ret;
  };
  const rmDupesFromSortedList = (list) => {
    const ret = [];
    var _iterator8 = _createForOfIteratorHelper(list), _step8;
    try {
      for (_iterator8.s(); !(_step8 = _iterator8.n()).done; ) {
        const element = _step8.value;
        if (ret.length === 0 || element !== ret.at(-1)) {
          ret.push(element);
        }
      }
    } catch (err) {
      _iterator8.e(err);
    } finally {
      _iterator8.f();
    }
    return ret;
  };
  const makeFixDab = (data, navpop) => {
    const titleToEdit = navpop.parentPopup && navpop.parentPopup.article.toString();
    const list = listLinks(data, navpop.originalArticle, titleToEdit);
    if (list.length === 0) {
      log("listLinks returned empty list");
      return null;
    }
    let html = "<hr>".concat(popupString("Click to disambiguate this link to:"), "<br>");
    html += list.join(", ");
    return html;
  };
  const makeFixDabs = (wikiText, navpop) => {
    if (getValueOf("popupFixDabs") && isDisambig(wikiText, navpop.article) && Title.fromURL(location.href).namespaceId() !== pg.nsSpecialId && navpop.article.talkPage()) {
      setPopupHTML(makeFixDab(wikiText, navpop), "popupFixDab", navpop.idNumber);
    }
  };
  const popupRedlinkHTML = (article) => {
    return changeLinkTargetLink({
      newTarget: null,
      text: popupString("remove this link").split(" ").join("&nbsp;"),
      hint: popupString("remove all links to this page from this article"),
      clickButton: getValueOf("popupRedlinkAutoClick"),
      oldTarget: article.toString(),
      summary: simplePrintf(getValueOf("popupRedlinkSummary"), [article.toString()])
    });
  };
  const setPopupHTML = function setPopupHTML2(str, elementId, popupId, onSuccess, append) {
    if (popupId === void 0) {
      popupId = pg.idNumber;
    }
    const popupElement = document.querySelector("#".concat(elementId).concat(popupId));
    if (popupElement) {
      if (!append) {
        popupElement.innerHTML = "";
      }
      if (isString(str)) {
        popupElement.innerHTML += str;
      } else {
        popupElement.append(str);
      }
      if (onSuccess) {
        onSuccess();
      }
      setTimeout(checkPopupPosition, 100);
      return true;
    }
    setTimeout(() => {
      setPopupHTML2(str, elementId, popupId, onSuccess);
    }, 600);
    return null;
  };
  const setPopupTrailer = (str, id) => {
    return setPopupHTML(str, "popupData", id);
  };
  const fillEmptySpans = (args) => {
    let redir = true;
    let rcid;
    if (typeof args !== "object" || args.redir === void 0 || !args.redir) {
      redir = false;
    }
    const a = args.navpopup.parentAnchor;
    let article;
    let hint;
    let oldid;
    let params = {};
    if (redir && typeof args.redirTarget === typeof {}) {
      article = args.redirTarget;
    } else {
      article = new Title().fromAnchor(a);
      hint = a.originalTitle || article.hintValue();
      params = parseParams(a.href);
      oldid = getValueOf("popupHistoricalLinks") ? params.oldid : null;
      ({
        rcid
      } = params);
    }
    const x = {
      article,
      hint,
      oldid,
      rcid,
      navpop: args.navpopup,
      params
    };
    const structure = pg.structures[getValueOf("popupStructure")];
    if (typeof structure !== "object") {
      setPopupHTML("popupError", "Unknown structure (this should never happen): ".concat(pg.option.popupStructure), args.navpopup.idNumber);
      return;
    }
    const spans = flatten(pg.misc.layout);
    const numspans = spans.length;
    const redirs = pg.misc.redirSpans;
    for (let i = 0; i < numspans; ++i) {
      const found = redirs && redirs.includes(spans[i]);
      if (found && !redir || !found && redir) {
        continue;
      }
      const structurefn = structure[spans[i]];
      if (structurefn === void 0) {
        continue;
      }
      let setfn = setPopupHTML;
      if (getValueOf("popupActiveNavlinks") && (spans[i].indexOf("popupTopLinks") === 0 || spans[i].indexOf("popupRedirTopLinks") === 0)) {
        setfn = setPopupTipsAndHTML;
      }
      switch (typeof structurefn) {
        case "function":
          log("running ".concat(spans[i], "({\n						article:").concat(x.article, ", hint:").concat(x.hint, ", oldid: ").concat(x.oldid, "})"));
          setfn(structurefn(x), spans[i], args.navpopup.idNumber);
          break;
        case "string":
          setfn(structurefn, spans[i], args.navpopup.idNumber);
          break;
        default:
          errlog("unknown thing with label ".concat(spans[i], " (span index was ").concat(i, ")"));
          break;
      }
    }
  };
  const flatten = function flatten2(list, start) {
    const ret = [];
    if (start === void 0) {
      start = 0;
    }
    for (let i = start; i < list.length; ++i) {
      if (typeof list[i] === typeof []) {
        return [...ret, ...flatten2(list[i]), ...flatten2(list, i + 1)];
      }
      ret.push(list[i]);
    }
    return ret;
  };
  const popupHTML = function popupHTML2(a) {
    getValueOf("popupStructure");
    const structure = pg.structures[pg.option.popupStructure];
    if (typeof structure !== "object") {
      pg.option.popupStructure = pg.optionDefault.popupStructure;
      return popupHTML2(a);
    }
    if (typeof structure.popupLayout !== "function") {
      return "Bad layout";
    }
    pg.misc.layout = structure.popupLayout();
    pg.misc.redirSpans = typeof structure.popupRedirSpans === "function" ? structure.popupRedirSpans() : [];
    return makeEmptySpans(pg.misc.layout, a.navpopup);
  };
  const makeEmptySpans = function makeEmptySpans2(list, navpop) {
    let ret = "";
    var _iterator9 = _createForOfIteratorHelper(list), _step9;
    try {
      for (_iterator9.s(); !(_step9 = _iterator9.n()).done; ) {
        const element = _step9.value;
        if (typeof element === "string") {
          ret += emptySpanHTML(element, navpop.idNumber, "div");
        } else if (typeof element === typeof [] && element.length > 0) {
          ret = ret.split(/(<\/[^>]*?>$)/).join(makeEmptySpans2(element, navpop));
        } else if (typeof element === typeof {} && element.nodeType) {
          ret += emptySpanHTML(element.name, navpop.idNumber, element.nodeType);
        }
      }
    } catch (err) {
      _iterator9.e(err);
    } finally {
      _iterator9.f();
    }
    return ret;
  };
  const emptySpanHTML = function emptySpanHTML2(name, id, tag, classname) {
    tag || (tag = "span");
    if (!classname) {
      classname = emptySpanHTML2.classAliases[name];
    }
    classname || (classname = name);
    if (name === getValueOf("popupDragHandle")) {
      classname += " popupDragHandle";
    }
    return simplePrintf('<%s id="%s" class="%s"></%s>', [tag, name + id, classname, tag]);
  };
  emptySpanHTML.classAliases = {
    popupSecondPreview: "popupPreview"
  };
  const imageHTML = (_article, idNumber) => {
    return simplePrintf('<a id="popupImageLink$1"><img align="right" valign="top" id="popupImg$1" style="display:none"></img></a>', [idNumber]);
  };
  const popTipsSoonFn = (id, when, popData) => {
    if (!when) {
      when = 250;
    }
    const popTips = () => {
      setupTooltips(document.querySelector("#".concat(id)), false, true, popData);
    };
    return () => {
      setTimeout(popTips, when, popData);
    };
  };
  const setPopupTipsAndHTML = (html, divname, idnumber, popData) => {
    setPopupHTML(html, divname, idnumber, getValueOf("popupSubpopups") ? popTipsSoonFn(divname + idnumber, null, popData) : null);
  };
  const fuzzyCursorOffMenus = (_x, _y, _fuzz, parent) => {
    if (!parent) {
      return null;
    }
    const uls = parent.querySelectorAll("ul");
    var _iterator10 = _createForOfIteratorHelper(uls), _step10;
    try {
      for (_iterator10.s(); !(_step10 = _iterator10.n()).done; ) {
        const ul = _step10.value;
        if (ul.className === "popup_menu" && ul.offsetWidth > 0) {
          return false;
        }
      }
    } catch (err) {
      _iterator10.e(err);
    } finally {
      _iterator10.f();
    }
    return true;
  };
  const checkPopupPosition = () => {
    if (pg.current.link && pg.current.link.navpopup) {
      pg.current.link.navpopup.limitHorizontalPosition();
    }
  };
  const mouseOutWikiLink = function mouseOutWikiLink2() {
    const self2 = this;
    removeModifierKeyListener(self2);
    if (self2.navpopup === null || self2.navpopup === void 0) {
      return;
    }
    if (!self2.navpopup.isVisible()) {
      self2.navpopup.banish();
      return;
    }
    restoreTitle(self2);
    Navpopup.tracker.addHook(posCheckerHook(self2.navpopup));
  };
  const posCheckerHook = (navpop) => {
    return () => {
      if (!navpop.isVisible()) {
        return true;
      }
      if (Navpopup.tracker.dirty) {
        return false;
      }
      const {
        x
      } = Navpopup.tracker;
      const {
        y
      } = Navpopup.tracker;
      const mouseOverNavpop = navpop.isWithin(x, y, navpop.fuzz, navpop.mainDiv) || !fuzzyCursorOffMenus(x, y, navpop.fuzz, navpop.mainDiv);
      let t = getValueOf("popupHideDelay");
      if (t) {
        t *= 1e3;
      }
      if (!t) {
        if (!mouseOverNavpop) {
          if (navpop.parentAnchor) {
            restoreTitle(navpop.parentAnchor);
          }
          navpop.banish();
          return true;
        }
        return false;
      }
      const d = Date.now();
      if (!navpop.mouseLeavingTime) {
        navpop.mouseLeavingTime = d;
        return false;
      }
      if (mouseOverNavpop) {
        navpop.mouseLeavingTime = null;
        return false;
      }
      if (d - navpop.mouseLeavingTime > t) {
        navpop.mouseLeavingTime = null;
        navpop.banish();
        return true;
      }
      return false;
    };
  };
  const runStopPopupTimer = (navpop) => {
    if (!navpop.stopPopupTimer) {
      navpop.stopPopupTimer = setInterval(posCheckerHook(navpop), 500);
      navpop.addHook(() => {
        clearInterval(navpop.stopPopupTimer);
      }, "hide", "before");
    }
  };
  class Previewmaker {
    constructor(wikiText, baseUrl, owner) {
      this.originalData = wikiText;
      this.baseUrl = baseUrl;
      this.owner = owner;
      this.maxCharacters = getValueOf("popupMaxPreviewCharacters");
      this.maxSentences = getValueOf("popupMaxPreviewSentences");
      this.setData();
    }
    setData() {
      const maxSize = Math.max(1e4, 2 * this.maxCharacters);
      this.data = this.originalData.slice(0, Math.max(0, maxSize));
    }
    /**
     * Remove HTML comments
     *
     * @private
     */
    killComments() {
      this.data = this.data.replace(/^<!--[^$]*?-->\n|\n<!--[^$]*?-->(?=\n)|<!--[^$]*?-->/g, "");
    }
    /**
     * @private
     */
    killDivs() {
      this.data = this.data.replace(/< *div[^>]* *>[\S\s]*?< *\/ *div *>/gi, "");
    }
    /**
     * @private
     */
    killGalleries() {
      this.data = this.data.replace(/< *gallery[^>]* *>[\S\s]*?< *\/ *gallery *>/gi, "");
    }
    /**
     * @param {Object} opening
     * @param {Object} closing
     * @param {Object} subopening
     * @param {Object} subclosing
     * @param {Object} repl
     * @private
     */
    kill(opening, closing, subopening, subclosing, repl) {
      let oldk = this.data;
      let k = Previewmaker.killStuff(this.data, opening, closing, subopening, subclosing, repl);
      while (k.length < oldk.length) {
        oldk = k;
        k = Previewmaker.killStuff(k, opening, closing, subopening, subclosing, repl);
      }
      this.data = k;
    }
    /**
     * @param {Object} txt
     * @param {Object} opening
     * @param {Object} closing
     * @param {Object} subopening
     * @param {Object} subclosing
     * @param {Object} repl
     * @private
     */
    static killStuff(txt, opening, closing, subopening, subclosing, repl) {
      const op = Previewmaker.makeRegexp(opening);
      const cl = Previewmaker.makeRegexp(closing, "^");
      const sb = subopening ? Previewmaker.makeRegexp(subopening, "^") : null;
      const sc = subclosing ? Previewmaker.makeRegexp(subclosing, "^") : cl;
      if (!op || !cl) {
        void mw.notify("Navigation Popups error: op or cl is null! something is wrong.", {
          tag: "popups",
          type: "error"
        });
        return;
      }
      if (!op.test(txt)) {
        return txt;
      }
      let ret = "";
      const opResult = op.exec(txt);
      ret = txt.slice(0, Math.max(0, opResult.index));
      txt = txt.slice(Math.max(0, opResult.index + opResult[0].length));
      let depth = 1;
      while (txt.length > 0) {
        let removal = 0;
        if (depth === 1 && cl.test(txt)) {
          depth--;
          removal = cl.exec(txt)[0].length;
        } else if (depth > 1 && sc.test(txt)) {
          depth--;
          removal = sc.exec(txt)[0].length;
        } else if (sb && sb.test(txt)) {
          depth++;
          removal = sb.exec(txt)[0].length;
        }
        if (!removal) {
          removal = 1;
        }
        txt = txt.slice(Math.max(0, removal));
        if (depth === 0) {
          break;
        }
      }
      return ret + (repl || "") + txt;
    }
    /**
     * @param {string|RegExp} x
     * @param {string|RegExp} prefix
     * @param {string|RegExp} suffix
     * @private
     */
    static makeRegexp(x, prefix, suffix) {
      prefix || (prefix = "");
      suffix || (suffix = "");
      let reStr = "";
      let flags = "";
      if (isString(x)) {
        reStr = prefix + literalizeRegex(x) + suffix;
      } else if (isRegExp(x)) {
        let s = x.toString().slice(1);
        const sp = s.split("/");
        flags = sp.at(-1);
        sp[sp.length - 1] = "";
        s = sp.join("/");
        s = s.slice(0, Math.max(0, s.length - 1));
        reStr = prefix + s + suffix;
      } else {
        log("makeRegexp failed");
      }
      log("makeRegexp: got reStr=".concat(reStr, ", flags=").concat(flags));
      return new RegExp(reStr, flags);
    }
    /**
     * @private
     */
    killBoxTemplates() {
      this.kill(/{{[^\s{|}]*?(float|box)[ _](begin|start)/i, /}}\s*/, "{{");
      this.kill(/{{[^\s{|}]*?(infobox|elementbox|frame)[ _]/i, /}}\s*/, "{{");
    }
    /**
     * @private
     */
    killTemplates() {
      this.kill("{{", "}}", "{", "}", " ");
    }
    /**
     * @private
     */
    killTables() {
      this.kill("{|", /\|}\s*/, "{|");
      this.kill(/<table.*?>/i, /<\/table.*?>/i, /<table.*?>/i);
      this.data = this.data.replace(/^\|.*$/gm, "");
    }
    /**
     * @private
     */
    killImages() {
      const forbiddenNamespaceAliases = [];
      for (var _i = 0, _Object$entries = Object.entries(mw.config.get("wgNamespaceIds")); _i < _Object$entries.length; _i++) {
        const [localizedNamespaceLc, namespaceId] = _Object$entries[_i];
        if (namespaceId !== pg.nsImageId && namespaceId !== pg.nsCategoryId) {
          return;
        }
        forbiddenNamespaceAliases.push(localizedNamespaceLc.split(" ").join("[ _]"));
      }
      this.kill(new RegExp("[[][[]\\s*(".concat(forbiddenNamespaceAliases.join("|"), ")\\s*:"), "i"), /]]\s*/, "[", "]");
    }
    /**
     * @private
     */
    killHTML() {
      this.kill(/<ref\b[^/>]*?>/i, /<\/ref>/i);
      this.data = this.data.replace(/(^|\n) *<.*/g, "\n");
      const splitted = this.data.split(/(<[\W\w]*?(?:>|$|(?=<)))/);
      const len = splitted.length;
      for (let i = 1; i < len; i += 2) {
        switch (splitted[i]) {
          case "<no".concat("wiki", ">"):
          case "</no".concat("wiki", ">"):
          case "<block".concat("quote", ">"):
          case "</block".concat("quote", ">"):
            break;
          default:
            splitted[i] = "";
        }
      }
      this.data = splitted.join("");
    }
    /**
     * @private
     */
    killChunks() {
      const italicChunkRegex = /((^|\n)\s*:*\s*''[^']([^']|'''|'[^']){20}(.|\n[^\n])*''[\s!.?]*\n)+/g;
      this.data = this.data.replace(italicChunkRegex, "\n");
    }
    /**
     * @private
     */
    mopup() {
      this.data = this.data.replace(/^-{4,}/gm, "");
      this.data = this.data.replace(/(^|\n) *:[^\n]*/g, "");
      this.data = this.data.replace(/^__[_a-z]*__ *$/gim, "");
    }
    /**
     * @private
     */
    firstBit() {
      let d = this.data;
      if (getValueOf("popupPreviewCutHeadings")) {
        this.data = this.data.replace(/\s*(==+[^=]*==+)\s*/g, "\n\n$1 ");
        this.data = this.data.replace(/([:;]) *\n{2,}/g, "$1\n");
        this.data = this.data.replace(/^\s*/, "");
        const stuff = /^([^\n]|\n\S)*/.exec(this.data);
        if (stuff) {
          [d] = stuff;
        }
        if (!getValueOf("popupPreviewFirstParOnly")) {
          d = this.data;
        }
        d = d.replace(/(==+[^=]*==+)\s*/g, "$1\n\n");
      }
      d = d.split(/([!.?]+["']*\s)/g);
      d[0] = d[0].replace(/^\s*/, "");
      const notSentenceEnds = /([^.][a-z]\. *[a-z]|etc|sic|dr|mr|mrs|ms|st|no|op|cit|\[[^\]]*|\s[a-z])$/i;
      d = this.fixSentenceEnds(d, notSentenceEnds);
      this.fullLength = d.join("").length;
      let n = this.maxSentences;
      let dd = Previewmaker.firstSentences(d, n);
      do {
        dd = Previewmaker.firstSentences(d, n);
        --n;
      } while (dd.length > this.maxCharacters && n !== 0);
      this.data = dd;
    }
    /**
     * @param {string} strs
     * @param {RegExp} reg
     * @private
     */
    fixSentenceEnds(strs, reg) {
      for (let i = 0; i < strs.length - 2; ++i) {
        if (reg.test(strs[i])) {
          const a = [];
          for (let j = 0; j < strs.length; ++j) {
            if (j < i) {
              a[j] = strs[j];
            }
            if (j === i) {
              a[i] = strs[i] + strs[i + 1] + strs[i + 2];
            }
            if (j > i + 2) {
              a[j - 2] = strs[j];
            }
          }
          return this.fixSentenceEnds(a, reg);
        }
      }
      return strs;
    }
    /**
     * @param {string[]} strs
     * @param {number} howmany
     * @private
     */
    static firstSentences(strs, howmany) {
      const t = strs.slice(0, 2 * howmany);
      return t.join("");
    }
    /**
     * @private
     */
    killBadWhitespace() {
      this.data = this.data.replace(/^ *'+ *$/gm, "");
    }
    /**
     * Runs the various methods to generate the preview.
     * The preview is stored in the <code>html</html> field.
     *
     * @private
     */
    makePreview() {
      if (this.owner.article.namespaceId() !== pg.nsTemplateId && this.owner.article.namespaceId() !== pg.nsImageId) {
        this.killComments();
        this.killDivs();
        this.killGalleries();
        this.killBoxTemplates();
        if (getValueOf("popupPreviewKillTemplates")) {
          this.killTemplates();
        } else {
          this.killMultilineTemplates();
        }
        this.killTables();
        this.killImages();
        this.killHTML();
        this.killChunks();
        this.mopup();
        this.firstBit();
        this.killBadWhitespace();
      } else {
        this.killHTML();
      }
      this.html = wiki2html(this.data, this.baseUrl);
      this.fixHTML();
      this.stripLongTemplates();
    }
    /**
     * @param {string} data
     * @private
     */
    static esWiki2HtmlPart(data) {
      const reLinks = /(?:\[\[([^\]|]*)(?:\|([^\]|]*))*]]([a-z]*))/gi;
      reLinks.lastIndex = 0;
      let match;
      let result = "";
      let postfixIndex = 0;
      while ((match = reLinks.exec(data)) !== null) {
        var _match$;
        result += "".concat(pg.escapeQuotesHTML(data.substring(postfixIndex, match.index)), '<a href="').concat(Insta.conf.paths.articles).concat(pg.escapeQuotesHTML(match[1]), '">').concat(pg.escapeQuotesHTML(((_match$ = match[2]) !== null && _match$ !== void 0 ? _match$ : match[1]) + match[3]), "</a>");
        postfixIndex = reLinks.lastIndex;
      }
      result += pg.escapeQuotesHTML(data.slice(Math.max(0, postfixIndex)));
      return result;
    }
    editSummaryPreview() {
      const reAes = /\/\* *(.*?) *\*\//g;
      reAes.lastIndex = 0;
      const match = reAes.exec(this.data);
      if (match) {
        const prefix = this.data.slice(0, Math.max(0, match.index - 1));
        const [, section] = match;
        const postfix = this.data.slice(Math.max(0, reAes.lastIndex));
        let start = "<span class='autocomment'>";
        let end = "</span>";
        if (prefix.length > 0) {
          start = "".concat(Previewmaker.esWiki2HtmlPart(prefix), " ").concat(start, "- ");
        }
        if (postfix.length > 0) {
          end = ": ".concat(end).concat(Previewmaker.esWiki2HtmlPart(postfix));
        }
        const t = new Title().fromURL(this.baseUrl);
        t.anchorFromUtf(section);
        const sectionLink = "".concat(Insta.conf.paths.articles + pg.escapeQuotesHTML(t.toString(true)), "#").concat(pg.escapeQuotesHTML(t.anchor));
        return "".concat(start, '<a href="').concat(sectionLink, '">&rarr;</a> ').concat(pg.escapeQuotesHTML(section)).concat(end);
      }
      return Previewmaker.esWiki2HtmlPart(this.data);
    }
    /**
     * Works around livepreview bugs.
     *
     * @private
     */
    fixHTML() {
      if (!this.html) {
        return;
      }
      let ret = this.html;
      ret = ret.replace(new RegExp('(<a href="'.concat(pg.wiki.articlePath, '/[^"]*)[?](.*?")'), "g"), "$1%3F$2");
      ret = ret.replace(new RegExp("(<a href='".concat(pg.wiki.articlePath, "/[^']*)[?](.*?')"), "g"), "$1%3F$2");
      this.html = ret;
    }
    /**
     * Generates the preview and displays it in the current popup.
     * Does nothing if the generated preview is invalid or consists of whitespace only.
     * Also activates wikilinks in the preview for subpopups if the popupSubpopups option is true.
     */
    showPreview() {
      this.makePreview();
      if (typeof this.html !== "string") {
        return;
      }
      if (/^\s*$/.test(this.html)) {
        return;
      }
      setPopupHTML("<hr>", "popupPrePreviewSep", this.owner.idNumber);
      setPopupTipsAndHTML(this.html, "popupPreview", this.owner.idNumber, {
        owner: this.owner
      });
      const more = this.fullLength > this.data.length ? this.moreLink() : "";
      setPopupHTML(more, "popupPreviewMore", this.owner.idNumber);
    }
    /**
     * @private
     */
    moreLink() {
      const a = document.createElement("a");
      a.className = "popupMoreLink";
      a.innerHTML = popupString("more...");
      const self2 = this;
      a.onclick = () => {
        self2.maxCharacters += 2e3;
        self2.maxSentences += 20;
        self2.setData();
        self2.showPreview();
      };
      return a;
    }
    /**
     * @private
     */
    stripLongTemplates() {
      this.html = this.html.replace(/^.{0,1000}{{[^}]*?(<(p|br)( \/)?>\s*){2,}([^{}]*?}})?/gi, "");
      this.html = this.html.split("\n").join(" ");
      this.html = this.html.replace(/{{[^}]*<pre>[^}]*}}/gi, "");
    }
    /**
     * @private
     */
    killMultilineTemplates() {
      this.kill("{{{", "}}}");
      this.kill(/\s*{{[^{}]*\n/, "}}", "{{");
    }
  }
  const loadAPIPreview = (queryType, article, navpop) => {
    const art = new Title(article).urlString();
    let url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query&");
    let htmlGenerator = () => {
      void mw.notify("invalid html generator", {
        tag: "popups",
        type: "error"
      });
    };
    let usernameart = "";
    switch (queryType) {
      case "history":
        url += "titles=".concat(art, "&prop=revisions&rvlimit=").concat(getValueOf("popupHistoryPreviewLimit"));
        htmlGenerator = APIhistoryPreviewHTML;
        break;
      case "category":
        url += "list=categorymembers&cmtitle=".concat(art);
        htmlGenerator = APIcategoryPreviewHTML;
        break;
      case "userinfo": {
        const username = new Title(article).userName();
        usernameart = encodeURIComponent(username);
        url += pg.re.ipUser.test(username) ? "list=blocks&bkprop=range|restrictions&bkip=".concat(usernameart) : "list=users|usercontribs&usprop=blockinfo|groups|editcount|registration|gender&ususers=".concat(usernameart, "&meta=globaluserinfo&guiprop=groups|unattached&guiuser=").concat(usernameart, "&uclimit=1&ucprop=timestamp&ucuser=").concat(usernameart);
        htmlGenerator = APIuserInfoPreviewHTML;
        break;
      }
      case "contribs":
        usernameart = encodeURIComponent(new Title(article).userName());
        url += "list=usercontribs&ucuser=".concat(usernameart, "&uclimit=").concat(getValueOf("popupContribsPreviewLimit"));
        htmlGenerator = APIcontribsPreviewHTML;
        break;
      case "imagepagepreview": {
        let trail = "";
        if (getValueOf("popupImageLinks")) {
          trail = "&list=imageusage&iutitle=".concat(art);
        }
        url += "titles=".concat(art, "&prop=revisions|imageinfo&rvprop=content").concat(trail);
        htmlGenerator = APIimagepagePreviewHTML;
        break;
      }
      case "backlinks":
        url += "list=backlinks&bltitle=".concat(art);
        htmlGenerator = APIbacklinksPreviewHTML;
        break;
      case "revision":
        url += article.oldid ? "revids=".concat(article.oldid) : "titles=".concat(article.removeAnchor().urlString());
        url += "&prop=revisions|pageprops|info|images|categories&rvprop=ids|timestamp|flags|comment|user|content&cllimit=max&imlimit=max";
        htmlGenerator = APIrevisionPreviewHTML;
        break;
    }
    pendingNavpopTask(navpop);
    const callback = (d) => {
      log("callback of API functions was hit");
      if (queryType === "userinfo") {
        fetchUserGroupNames(d.data).then(() => {
          showAPIPreview(queryType, htmlGenerator(article, d, navpop), navpop.idNumber, navpop, d);
        });
        return;
      }
      showAPIPreview(queryType, htmlGenerator(article, d, navpop), navpop.idNumber, navpop, d);
    };
    const go = () => {
      getPageWithCaching(url, callback, navpop);
      return true;
    };
    if (navpop.visible || !getValueOf("popupLazyDownloads")) {
      go();
    } else {
      navpop.addHook(go, "unhide", "before", "DOWNLOAD_".concat(queryType, "_QUERY_DATA"));
    }
  };
  const linkList = (list) => {
    list.sort((x, y) => {
      return x === y ? 0 : x < y ? -1 : 1;
    });
    const buf = [];
    var _iterator11 = _createForOfIteratorHelper(list), _step11;
    try {
      for (_iterator11.s(); !(_step11 = _iterator11.n()).done; ) {
        const element = _step11.value;
        buf.push(wikiLink({
          article: new Title(element),
          text: element.split(" ").join("&nbsp;"),
          action: "view"
        }));
      }
    } catch (err) {
      _iterator11.e(err);
    } finally {
      _iterator11.f();
    }
    return buf.join(", ");
  };
  const getTimeOffset = () => {
    const tz = mw.user.options.get("timecorrection");
    if (tz && tz.includes("|")) {
      return Number.parseInt(tz.split("|")[1], 10);
    }
    return 0;
  };
  const getTimeZone = () => {
    if (!pg.user.timeZone) {
      const tz = mw.user.options.get("timecorrection");
      pg.user.timeZone = "UTC";
      if (tz) {
        const tzComponents = tz.split("|");
        if (tzComponents.length === 3 && tzComponents[0] === "ZoneInfo") {
          [, , pg.user.timeZone] = tzComponents;
        } else {
          errlog("Unexpected timezone information: ".concat(tz));
        }
      }
    }
    return pg.user.timeZone;
  };
  const useTimeOffset = () => {
    if (Intl.DateTimeFormat.prototype.formatToParts === void 0) {
      return true;
    }
    const tz = mw.user.options.get("timecorrection");
    if (tz && !tz.includes("ZoneInfo|")) {
      return true;
    }
    return false;
  };
  const getLocales = () => {
    if (!pg.user.locales) {
      let userLanguage = document.querySelector("html").getAttribute("lang");
      if (getValueOf("popupLocale")) {
        userLanguage = getValueOf("popupLocale");
      } else if (userLanguage === "en") {
        userLanguage = getMWDateFormat() === "mdy" ? "en-US" : "en-GB";
      }
      pg.user.locales = Intl.DateTimeFormat.supportedLocalesOf([userLanguage, navigator.language]);
    }
    return pg.user.locales;
  };
  const getMWDateFormat = () => {
    return mw.user.options.get("date");
  };
  const editPreviewTable = (article, h, reallyContribs) => {
    let html = ["<table>"];
    let day;
    let curart = article;
    let page;
    let makeFirstColumnLinks;
    if (reallyContribs) {
      makeFirstColumnLinks = (currentRevision) => {
        let result = "(";
        result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(currentRevision.title).urlString(), "&diff=prev&oldid=").concat(currentRevision.revid, '">').concat(popupString("diff"), "</a>");
        result += "&nbsp;|&nbsp;";
        result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(currentRevision.title).urlString(), '&action=history">').concat(popupString("hist"), "</a>");
        result += ")";
        return result;
      };
    } else {
      const firstRevid = h[0].revid;
      makeFirstColumnLinks = (currentRevision) => {
        let result = "(";
        result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(curart).urlString(), "&diff=").concat(firstRevid, "&oldid=").concat(currentRevision.revid, '">').concat(popupString("cur"), "</a>");
        result += "&nbsp;|&nbsp;";
        result += '<a href="'.concat(pg.wiki.titlebase).concat(new Title(curart).urlString(), "&diff=prev&oldid=").concat(currentRevision.revid, '">').concat(popupString("last"), "</a>");
        result += ")";
        return result;
      };
    }
    var _iterator12 = _createForOfIteratorHelper(h.entries()), _step12;
    try {
      for (_iterator12.s(); !(_step12 = _iterator12.n()).done; ) {
        const [i, element] = _step12.value;
        if (reallyContribs) {
          page = element.title;
          curart = new Title(page);
        }
        const minor = element.minor ? "<b>m </b>" : "";
        const editDate = new Date(element.timestamp);
        let thisDay = formattedDate(editDate);
        const thisTime = formattedTime(editDate);
        if (thisDay === day) {
          thisDay = "";
        } else {
          day = thisDay;
        }
        if (thisDay) {
          html.push('<tr><td colspan=3><span class="popup_history_date">'.concat(thisDay, "</span></td></tr>"));
        }
        html.push('<tr class="popup_history_row_'.concat(i % 2 ? "odd" : "even", '">'), "<td>".concat(makeFirstColumnLinks(element), "</td>"), '<td><a href="'.concat(pg.wiki.titlebase).concat(new Title(curart).urlString(), "&oldid=").concat(element.revid, '">').concat(thisTime, "</a></td>"));
        let col3url = "";
        let col3txt = "";
        if (reallyContribs) {
          col3url = pg.wiki.titlebase + curart.urlString();
          col3txt = pg.escapeQuotesHTML(page);
        } else {
          const {
            user
          } = element;
          if (element.userhidden) {
            col3url = getValueOf("popupRevDelUrl");
            col3txt = pg.escapeQuotesHTML(popupString("revdel"));
          } else {
            col3url = pg.re.ipUser.test(user) ? "".concat(pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId], ":Contributions&target=").concat(new Title(user).urlString()) : "".concat(pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsUserId], ":").concat(new Title(user).urlString());
            col3txt = pg.escapeQuotesHTML(user);
          }
        }
        html.push("<td>".concat(reallyContribs ? minor : "", '<a href="').concat(col3url, '">').concat(col3txt, "</a></td>"));
        let comment = "";
        const c = element.comment || element.content;
        if (c) {
          comment = new Previewmaker(c, new Title(curart).toUrl()).editSummaryPreview();
        } else if (element.commenthidden) {
          comment = popupString("revdel");
        }
        html.push("<td>".concat(reallyContribs ? "" : minor).concat(comment, "</td>"), "</tr>");
        html = [html.join("")];
      }
    } catch (err) {
      _iterator12.e(err);
    } finally {
      _iterator12.f();
    }
    html.push("</table>");
    return html.join("");
  };
  const adjustDate = (d, offset) => {
    const o = offset * 60 * 1e3;
    return new Date(+d + o);
  };
  const convertTimeZone = (date, timeZone) => {
    return new Date(date.toLocaleString("en-US", {
      timeZone
    }));
  };
  const formattedDateTime = (date) => {
    if (useTimeOffset()) {
      return "".concat(formattedDate(date), " ").concat(formattedTime(date));
    }
    if (getMWDateFormat() === "ISO 8601") {
      const d2 = convertTimeZone(date, getTimeZone());
      return "".concat(map(zeroFill, [d2.getFullYear(), d2.getMonth() + 1, d2.getDate()]).join("-"), "T").concat(map(zeroFill, [d2.getHours(), d2.getMinutes(), d2.getSeconds()]).join(":"));
    }
    const options = getValueOf("popupDateTimeFormatterOptions");
    options.timeZone = getTimeZone();
    return date.toLocaleString(getLocales(), options);
  };
  const formattedDate = (date) => {
    let d2;
    if (useTimeOffset()) {
      d2 = adjustDate(date, getTimeOffset());
      return map(zeroFill, [d2.getUTCFullYear(), d2.getUTCMonth() + 1, d2.getUTCDate()]).join("-");
    }
    if (getMWDateFormat() === "ISO 8601") {
      d2 = convertTimeZone(date, getTimeZone());
      return map(zeroFill, [d2.getFullYear(), d2.getMonth() + 1, d2.getDate()]).join("-");
    }
    const options = getValueOf("popupDateFormatterOptions");
    options.timeZone = getTimeZone();
    return date.toLocaleDateString(getLocales(), options);
  };
  const formattedTime = (date) => {
    let d2;
    if (useTimeOffset()) {
      d2 = adjustDate(date, getTimeOffset());
      return map(zeroFill, [d2.getUTCHours(), d2.getUTCMinutes(), d2.getUTCSeconds()]).join(":");
    }
    if (getMWDateFormat() === "ISO 8601") {
      d2 = convertTimeZone(date, getTimeZone());
      return map(zeroFill, [d2.getHours(), d2.getMinutes(), d2.getSeconds()]).join(":");
    }
    const options = getValueOf("popupTimeFormatterOptions");
    options.timeZone = getTimeZone();
    return date.toLocaleTimeString(getLocales(), options);
  };
  const fetchUserGroupNames = (userinfoResponse) => {
    const queryObj = getJsObj(userinfoResponse).query;
    const user = anyChild(queryObj.users);
    const messages = [];
    if (user.groups) {
      var _iterator13 = _createForOfIteratorHelper(user.groups), _step13;
      try {
        for (_iterator13.s(); !(_step13 = _iterator13.n()).done; ) {
          const groupName = _step13.value;
          if (!["*", "user", "autoconfirmed"].includes(groupName)) {
            messages.push("group-".concat(groupName, "-member"));
          }
        }
      } catch (err) {
        _iterator13.e(err);
      } finally {
        _iterator13.f();
      }
    }
    if (queryObj.globaluserinfo && queryObj.globaluserinfo.groups) {
      var _iterator14 = _createForOfIteratorHelper(queryObj.globaluserinfo.groups), _step14;
      try {
        for (_iterator14.s(); !(_step14 = _iterator14.n()).done; ) {
          const groupName = _step14.value;
          messages.push("group-".concat(groupName, "-member"));
        }
      } catch (err) {
        _iterator14.e(err);
      } finally {
        _iterator14.f();
      }
    }
    return getMwApi().loadMessagesIfMissing(messages);
  };
  const showAPIPreview = (queryType, html, id, navpop, download) => {
    let target = "popupPreview";
    completedNavpopTask(navpop);
    switch (queryType) {
      case "imagelinks":
      case "category":
        target = "popupPostPreview";
        break;
      case "userinfo":
        target = "popupUserData";
        break;
      case "revision":
        insertPreview(download);
        return;
    }
    setPopupTipsAndHTML(html, target, id);
  };
  const APIrevisionPreviewHTML = (_article, download) => {
    try {
      const jsObj = getJsObj(download.data);
      const page = anyChild(jsObj.query.pages);
      if (page.missing) {
        download.owner = null;
        return;
      }
      const content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null;
      if (typeof content === "string") {
        download.data = content;
        download.lastModified = new Date(page.revisions[0].timestamp);
      }
    } catch {
      return "Revision preview failed :(";
    }
  };
  const APIbacklinksPreviewHTML = (_article, download) => {
    try {
      const jsObj = getJsObj(download.data);
      const list = jsObj.query.backlinks;
      let html = [];
      if (!list) {
        return popupString("No backlinks found");
      }
      var _iterator15 = _createForOfIteratorHelper(list), _step15;
      try {
        for (_iterator15.s(); !(_step15 = _iterator15.n()).done; ) {
          const element = _step15.value;
          const t = new Title(element.title);
          html.push('<a href="'.concat(pg.wiki.titlebase).concat(t.urlString(), '">').concat(t.toString().entify(), "</a>"));
        }
      } catch (err) {
        _iterator15.e(err);
      } finally {
        _iterator15.f();
      }
      html = html.join(", ");
      if (jsObj.continue && jsObj.continue.blcontinue) {
        html += popupString(" and more");
      }
      return html;
    } catch {
      return "backlinksPreviewHTML went wonky";
    }
  };
  pg.fn.APIsharedImagePagePreviewHTML = (obj) => {
    log("APIsharedImagePagePreviewHTML");
    const popupid = obj.requestid;
    if (obj.query && obj.query.pages) {
      const page = anyChild(obj.query.pages);
      const content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null;
      if (typeof content === "string" && pg && pg.current && pg.current.link && pg.current.link.navpopup) {
        const p = new Previewmaker(content, pg.current.link.navpopup.article, pg.current.link.navpopup);
        p.makePreview();
        setPopupHTML(p.html, "popupSecondPreview", popupid);
      }
    }
  };
  const APIimagepagePreviewHTML = (article, download, navpop) => {
    try {
      const jsObj = getJsObj(download.data);
      const page = anyChild(jsObj.query.pages);
      const content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null;
      let ret = "";
      let alt = "";
      try {
        [{
          alt
        }] = navpop.parentAnchor.childNodes;
      } catch {
      }
      if (alt) {
        ret = "".concat(ret, "<hr><b>").concat(popupString("Alt text:"), "</b> ").concat(pg.escapeQuotesHTML(alt));
      }
      if (typeof content === "string") {
        const p = prepPreviewmaker(content, article, navpop);
        p.makePreview();
        if (p.html) {
          ret += "<hr>".concat(p.html);
        }
        if (getValueOf("popupSummaryData")) {
          const info = getPageInfo(content, download);
          log(info);
          setPopupTrailer(info, navpop.idNumber);
        }
      }
      if (page && page.imagerepository === "shared") {
        const art = new Title(article);
        const encart = encodeURIComponent("File:".concat(art.stripNamespace()));
        const shared_url = "".concat(pg.wiki.apicommonsbase, "?format=json&formatversion=2&callback=pg.fn.APIsharedImagePagePreviewHTML&requestid=").concat(navpop.idNumber, "&action=query&prop=revisions&rvprop=content&titles=").concat(encart);
        ret = "".concat(ret, "<hr>").concat(popupString("Image from Commons"), ': <a href="').concat(pg.wiki.commonsbase, "?title=").concat(encart, '">').concat(popupString("Description page"), "</a>");
        mw.loader.load(shared_url);
      }
      showAPIPreview("imagelinks", APIimagelinksPreviewHTML(article, download), navpop.idNumber, download);
      return ret;
    } catch {
      return "API imagepage preview failed :(";
    }
  };
  const APIimagelinksPreviewHTML = (_article, download) => {
    try {
      const jsobj = getJsObj(download.data);
      const list = jsobj.query.imageusage;
      if (list) {
        const ret = [];
        var _iterator16 = _createForOfIteratorHelper(list), _step16;
        try {
          for (_iterator16.s(); !(_step16 = _iterator16.n()).done; ) {
            const element = _step16.value;
            ret.push(element.title);
          }
        } catch (err) {
          _iterator16.e(err);
        } finally {
          _iterator16.f();
        }
        if (ret.length === 0) {
          return popupString("No image links found");
        }
        return "<h2>".concat(popupString("File links"), "</h2>").concat(linkList(ret));
      }
      return popupString("No image links found");
    } catch {
      return "Image links preview generation failed :(";
    }
  };
  const APIcategoryPreviewHTML = (_article, download) => {
    try {
      const jsobj = getJsObj(download.data);
      const list = jsobj.query.categorymembers;
      let ret = [];
      var _iterator17 = _createForOfIteratorHelper(list), _step17;
      try {
        for (_iterator17.s(); !(_step17 = _iterator17.n()).done; ) {
          const element = _step17.value;
          ret.push(element.title);
        }
      } catch (err) {
        _iterator17.e(err);
      } finally {
        _iterator17.f();
      }
      if (ret.length === 0) {
        return popupString("Empty category");
      }
      ret = "<h2>".concat(tprintf("Category members (%s shown)", [ret.length]), "</h2>").concat(linkList(ret));
      if (jsobj.continue && jsobj.continue.cmcontinue) {
        ret += popupString(" and more");
      }
      return ret;
    } catch {
      return "Category preview failed :(";
    }
  };
  const APIuserInfoPreviewHTML = (_article, download) => {
    let ret = [];
    let queryobj = {};
    try {
      queryobj = getJsObj(download.data).query;
    } catch {
      return "Userinfo preview failed :(";
    }
    const user = anyChild(queryobj.users);
    if (user) {
      const {
        globaluserinfo
      } = queryobj;
      if (user.invalid === "") {
        ret.push(popupString("Invalid user"));
      } else if (user.missing === "") {
        ret.push(popupString("Not a registered username"));
      }
      if (user.blockedby) {
        if (user.blockpartial) {
          ret.push("<b>".concat(popupString("Has blocks"), "</b>"));
        } else {
          ret.push("<b>".concat(popupString("BLOCKED"), "</b>"));
        }
      }
      if (globaluserinfo && ("locked" in globaluserinfo || "hidden" in globaluserinfo)) {
        let lockedSulAccountIsAttachedToThis = true;
        for (let i = 0; globaluserinfo.unattached && i < globaluserinfo.unattached.length; i++) {
          if (globaluserinfo.unattached[i].wiki === mw.config.get("wgDBname")) {
            lockedSulAccountIsAttachedToThis = false;
            break;
          }
        }
        if (lockedSulAccountIsAttachedToThis) {
          if ("locked" in globaluserinfo) {
            ret.push("<b><i>".concat(popupString("LOCKED"), "</i></b>"));
          }
          if ("hidden" in globaluserinfo) {
            ret.push("<b><i>".concat(popupString("HIDDEN"), "</i></b>"));
          }
        }
      }
      if (getValueOf("popupShowGender") && user.gender) {
        switch (user.gender) {
          case "male":
            ret.push("".concat(popupString("he/him"), " · "));
            break;
          case "female":
            ret.push("".concat(popupString("she/her"), " · "));
            break;
        }
      }
      if (user.groups) {
        var _iterator18 = _createForOfIteratorHelper(user.groups), _step18;
        try {
          for (_iterator18.s(); !(_step18 = _iterator18.n()).done; ) {
            const groupName = _step18.value;
            if (!["*", "user", "autoconfirmed"].includes(groupName)) {
              ret.push(pg.escapeQuotesHTML(mw.message("group-".concat(groupName, "-member"), user.gender).text()));
            }
          }
        } catch (err) {
          _iterator18.e(err);
        } finally {
          _iterator18.f();
        }
      }
      if (globaluserinfo && globaluserinfo.groups) {
        var _iterator19 = _createForOfIteratorHelper(globaluserinfo.groups), _step19;
        try {
          for (_iterator19.s(); !(_step19 = _iterator19.n()).done; ) {
            const groupName = _step19.value;
            ret.push(
              // Messages that can be used here:
              // * see [[Special:PrefixIndex/MediaWiki:Group-]]
              // * for more information
              "<i>".concat(pg.escapeQuotesHTML(mw.message("group-".concat(groupName, "-member"), user.gender).text()), "</i>")
            );
          }
        } catch (err) {
          _iterator19.e(err);
        } finally {
          _iterator19.f();
        }
      }
      if (user.registration) {
        var _user$editcount;
        ret.push(pg.escapeQuotesHTML(((_user$editcount = user.editcount) !== null && _user$editcount !== void 0 ? _user$editcount : "0") + popupString(" edits since: ") + (user.registration ? formattedDate(new Date(user.registration)) : "")));
      }
    }
    if (queryobj.usercontribs && queryobj.usercontribs.length > 0) {
      ret.push(popupString("last edit on ") + formattedDate(new Date(queryobj.usercontribs[0].timestamp)));
    }
    if (queryobj.blocks) {
      ret.push(popupString("IP user"));
      for (let l = 0; l < queryobj.blocks.length; l++) {
        let rbstr = queryobj.blocks[l].rangestart === queryobj.blocks[l].rangeend ? "BLOCK" : "RANGEBLOCK";
        rbstr = Array.isArray(queryobj.blocks[l].restrictions) ? "".concat(rbstr, "ED") : "Has ".concat(rbstr.toLowerCase(), "s");
        ret.push("<b>".concat(popupString(rbstr), "</b>"));
      }
    }
    for (let m = 0; m < ret.length - 1; m++) {
      if (ret[m].length > 3 && ret[m].slice(Math.max(0, ret[m].length - 3)) === " · ") {
        ret[m] += ret[m + 1];
        ret.splice(m + 1, 1);
        m--;
      }
    }
    ret = "<hr>".concat(ret.join(", "));
    return ret;
  };
  const APIcontribsPreviewHTML = (article, download, navpop) => {
    return APIhistoryPreviewHTML(article, download, navpop, true);
  };
  const APIhistoryPreviewHTML = (article, download, _navpop, reallyContribs) => {
    try {
      const jsobj = getJsObj(download.data);
      let edits = [];
      edits = reallyContribs ? jsobj.query.usercontribs : anyChild(jsobj.query.pages).revisions;
      const ret = editPreviewTable(article, edits, reallyContribs);
      return ret;
    } catch {
      return "History preview failed :-(";
    }
  };
  const setupDebugging = () => {
    if (window.popupDebug) {
      window.log = (x) => {
        console.log(x);
      };
      window.errlog = (x) => {
        console.error("[Popups] ".concat(x));
      };
      log("Initializing logger");
    } else {
      window.log = () => {
      };
      window.errlog = () => {
      };
    }
  };
  const loadImage = (image, navpop) => {
    if (typeof image.stripNamespace !== "function") {
      void mw.notify("loadImages bad", {
        tag: "popups",
        type: "error"
      });
    }
    if (!getValueOf("popupImages")) {
      return;
    }
    if (!isValidImageName(image.toString())) {
      return false;
    }
    const art = image.urlString();
    let url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query");
    url += "&prop=imageinfo&iiprop=url|mime&iiurlwidth=".concat(getValueOf("popupImageSizeLarge"));
    url += "&titles=".concat(art);
    pendingNavpopTask(navpop);
    const callback = (d) => {
      popupsInsertImage(navpop.idNumber, navpop, d);
    };
    const go = () => {
      getPageWithCaching(url, callback, navpop);
      return true;
    };
    if (navpop.visible || !getValueOf("popupLazyDownloads")) {
      go();
    } else {
      navpop.addHook(go, "unhide", "after", "DOWNLOAD_IMAGE_QUERY_DATA");
    }
  };
  const popupsInsertImage = (id, _navpop, download) => {
    log("popupsInsertImage");
    let imageinfo;
    try {
      const jsObj = getJsObj(download.data);
      const imagepage = anyChild(jsObj.query.pages);
      if (imagepage.imageinfo === void 0) {
        return;
      }
      [imageinfo] = imagepage.imageinfo;
    } catch {
      log("popupsInsertImage failed :(");
      return;
    }
    const popupImage = document.querySelector("#popupImg".concat(id));
    if (!popupImage) {
      log("could not find insertion point for image");
      return;
    }
    popupImage.width = getValueOf("popupImageSize");
    popupImage.style.display = "inline";
    if (imageinfo.thumburl) {
      popupImage.src = imageinfo.thumburl;
    } else if (imageinfo.mime.indexOf("image") === 0) {
      popupImage.src = imageinfo.url;
      log("a thumb could not be found, using original image");
    } else {
      log("fullsize imagethumb, but not sure if it's an image");
    }
    const a = document.querySelector("#popupImageLink".concat(id));
    if (a === null) {
      return null;
    }
    switch (getValueOf("popupThumbAction")) {
      case "imagepage":
        if (pg.current.article.namespaceId() !== pg.nsImageId) {
          a.href = imageinfo.descriptionurl;
          popTipsSoonFn("popupImage".concat(id))();
          break;
        }
      case "sizetoggle":
        a.onclick = toggleSize;
        a.title = popupString("Toggle image size");
        return;
      case "linkfull":
        a.href = imageinfo.url;
        a.title = popupString("Open full-size image");
    }
  };
  const toggleSize = function toggleSize2() {
    const self2 = this;
    if (!self2) {
      void mw.notify("self is null :/", {
        tag: "popups",
        type: "error"
      });
      return;
    }
    const img = self2.firstChild;
    if (!img) {
      void mw.notify("img is null :/", {
        tag: "popups",
        type: "error"
      });
      return;
    }
    img.style.width = !img.style.width || img.style.width === "" ? "100%" : "";
  };
  const getValidImageFromWikiText = (wikiText) => {
    let matched;
    let match;
    const t = removeMatchesUnless(wikiText, /(<!--[\S\s]*?-->)/, 1, /^<!--[^[]*popup/i);
    while ((match = pg.re.image.exec(t)) !== null) {
      const m = match[2] || match[6];
      if (isValidImageName(m)) {
        matched = m;
        break;
      }
    }
    pg.re.image.lastIndex = 0;
    if (!matched) {
      return null;
    }
    return "".concat(mw.config.get("wgFormattedNamespaces")[pg.nsImageId], ":").concat(upcaseFirst(matched));
  };
  const removeMatchesUnless = (str, re1, parencount, re2) => {
    const split = str.split(re1);
    const c = parencount + 1;
    for (let i = 0; i < split.length; ++i) {
      if (i % c === 0 || re2.test(split[i])) {
        continue;
      }
      split[i] = "";
    }
    return split.join("");
  };
  const setNamespaces = () => {
    pg.nsSpecialId = -1;
    pg.nsMainspaceId = 0;
    pg.nsImageId = 6;
    pg.nsUserId = 2;
    pg.nsUsertalkId = 3;
    pg.nsCategoryId = 14;
    pg.nsTemplateId = 10;
  };
  const setRedirs = () => {
    const r = "redirect";
    const R = "REDIRECT";
    const redirLists = {
      ar: [R, "تحويل"],
      be: [r, "перанакіраваньне"],
      bg: [r, "пренасочване", "виж"],
      bs: [r, "Preusmjeri", "preusmjeri", "PREUSMJERI"],
      bn: [R, "পুনর্নির্দেশ"],
      cs: [R, "PŘESMĚRUJ"],
      cy: [r, "ail-cyfeirio"],
      de: [R, "WEITERLEITUNG"],
      el: [R, "ΑΝΑΚΑΤΕΥΘΥΝΣΗ"],
      eo: [R, "ALIDIREKTU", "ALIDIREKTI"],
      es: [R, "REDIRECCIÓN"],
      et: [r, "suuna"],
      ga: [r, "athsheoladh"],
      gl: [r, "REDIRECCIÓN", "REDIRECIONAMENTO"],
      he: [R, "הפניה"],
      hu: [R, "ÁTIRÁNYÍTÁS"],
      is: [r, "tilvísun", "TILVÍSUN"],
      it: [R, "RINVIA", "Rinvia"],
      ja: [R, "転送"],
      mk: [r, "пренасочување", "види"],
      nds: [r, "wiederleiden"],
      "nds-nl": [R, "DEURVERWIEZING", "DUURVERWIEZING"],
      nl: [R, "DOORVERWIJZING"],
      nn: [r, "omdiriger"],
      pl: [R, "PATRZ", "PRZEKIERUJ", "TAM"],
      pt: [R, "redir"],
      ru: [R, "ПЕРЕНАПРАВЛЕНИЕ", "ПЕРЕНАПР"],
      sk: [r, "presmeruj"],
      sr: [r, "Преусмери", "преусмери", "ПРЕУСМЕРИ", "Preusmeri", "preusmeri", "PREUSMERI"],
      tt: [R, "yünältü", "перенаправление", "перенапр"],
      uk: [R, "ПЕРЕНАПРАВЛЕННЯ", "ПЕРЕНАПР"],
      vi: [r, "đổi"],
      yi: [R, "ווייטערפירן"],
      zh: [R, "重定向"]
      // no comma
    };
    const redirList = redirLists[pg.wiki.lang] || [r, R];
    pg.re.redirect = new RegExp("^\\s*[#](".concat(redirList.join("|"), ").*?\\[{2}([^\\|\\]]*)(|[^\\]]*)?\\]{2}\\s*(.*)"), "i");
  };
  const setInterwiki = () => {
    if (pg.wiki.wikimedia) {
      pg.wiki.interwiki = "aa|ab|ace|af|ak|als|am|an|ang|ar|arc|arz|as|ast|av|ay|az|ba|bar|bat-smg|bcl|be|be-x-old|bg|bh|bi|bjn|bm|bn|bo|bpy|br|bs|bug|bxr|ca|cbk-zam|cdo|ce|ceb|ch|cho|chr|chy|ckb|co|cr|crh|cs|csb|cu|cv|cy|da|de|diq|dsb|dv|dz|ee|el|eml|en|eo|es|et|eu|ext|fa|ff|fi|fiu-vro|fj|fo|fr|frp|frr|fur|fy|ga|gag|gan|gd|gl|glk|gn|got|gu|gv|ha|hak|haw|he|hi|hif|ho|hr|hsb|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|ilo|io|is|it|iu|ja|jbo|jv|ka|kaa|kab|kbd|kg|ki|kj|kk|kl|km|kn|ko|koi|kr|krc|ks|ksh|ku|kv|kw|ky|la|lad|lb|lbe|lg|li|lij|lmo|ln|lo|lt|ltg|lv|map-bms|mdf|mg|mh|mhr|mi|mk|ml|mn|mo|mr|mrj|ms|mt|mus|mwl|my|myv|mzn|na|nah|nap|nds|nds-nl|ne|new|ng|nl|nn|no|nov|nrm|nv|ny|oc|om|or|os|pa|pag|pam|pap|pcd|pdc|pfl|pi|pih|pl|pms|pnb|pnt|ps|pt|qu|rm|rmy|rn|ro|roa-rup|roa-tara|ru|rue|rw|sa|sah|sc|scn|sco|sd|se|sg|sh|si|simple|sk|sl|sm|sn|so|sq|sr|srn|ss|st|stq|su|sv|sw|szl|ta|te|tet|tg|th|ti|tk|tl|tn|to|tpi|tr|ts|tt|tum|tw|ty|udm|ug|uk|ur|uz|ve|vec|vi|vls|vo|wa|war|wo|wuu|xal|xh|yi|yo|za|zea|zh|zh-classical|zh-min-nan|zh-yue|zu";
      pg.re.interwiki = new RegExp("^".concat(pg.wiki.interwiki, ":"));
    } else {
      pg.wiki.interwiki = null;
      pg.re.interwiki = /^$/;
    }
  };
  const nsRe = (namespaceId) => {
    const imageNamespaceVariants = [];
    for (var _i2 = 0, _Object$entries2 = Object.entries(mw.config.get("wgNamespaceIds")); _i2 < _Object$entries2.length; _i2++) {
      const [_localizedNamespaceLc, _namespaceId] = _Object$entries2[_i2];
      if (_namespaceId !== namespaceId) {
        continue;
      }
      const localizedNamespaceLc = upcaseFirst(_localizedNamespaceLc);
      imageNamespaceVariants.push(mw.util.escapeRegExp(localizedNamespaceLc).split(" ").join("[ _]"), mw.util.escapeRegExp(encodeURI(localizedNamespaceLc)));
    }
    return "(?:".concat(imageNamespaceVariants.join("|"), ")");
  };
  const nsReImage = () => {
    return nsRe(pg.nsImageId);
  };
  const getEditboxSelection = () => {
    let editbox;
    try {
      editbox = document.editform.wpTextbox1;
    } catch {
      return;
    }
    if (document.selection) {
      return document.selection.createRange().text;
    }
    const selStart = editbox.selectionStart;
    const selEnd = editbox.selectionEnd;
    return editbox.value.substring(selStart, selEnd);
  };
  const doSelectionPopup = () => {
    const sel = getEditboxSelection();
    const open = sel.indexOf("[[");
    const pipe = sel.indexOf("|");
    const close = sel.indexOf("]]");
    if (open === -1 || pipe === -1 && close === -1) {
      return;
    }
    if (pipe !== -1 && open > pipe || close !== -1 && open > close) {
      return;
    }
    const article = new Title(sel.substring(open + 2, pipe < 0 ? close : pipe));
    if (getValueOf("popupOnEditSelection") === "boxpreview") {
      return doSeparateSelectionPopup(sel, article);
    }
    if (close > 0 && sel.slice(Math.max(0, close + 2)).includes("[[")) {
      return;
    }
    const a = document.createElement("a");
    a.href = pg.wiki.titlebase + article.urlString();
    mouseOverWikiLink2(a);
    if (a.navpopup) {
      a.navpopup.addHook(() => {
        runStopPopupTimer(a.navpopup);
      }, "unhide", "after");
    }
  };
  const doSeparateSelectionPopup = (str, article) => {
    let div = document.querySelector("#selectionPreview");
    if (!div) {
      div = document.createElement("div");
      div.id = "selectionPreview";
      try {
        const box = document.editform.wpTextbox1;
        box.parentNode.insertBefore(div, box);
      } catch {
        return;
      }
    }
    const p = prepPreviewmaker(str, article, newNavpopup(document.createElement("a"), article));
    p.makePreview();
    if (p.html) {
      div.innerHTML = p.html;
    }
    div.ranSetupTooltipsAlready = false;
    popTipsSoonFn("selectionPreview")();
  };
  class Mousetracker {
    constructor() {
      this.loopDelay = 400;
      this.timer = null;
      this.active = false;
      this.dirty = true;
      this.hooks = [];
    }
    /**
     * Adds a hook, to be called when we get events.
     *
     * @param {Function} f A function which is called as
     * <code>f(x,y)</code>. It should return <code>true</code> when it
     * wants to be removed, and <code>false</code> otherwise.
     */
    addHook(f) {
      this.hooks.push(f);
    }
    /**
     * Runs hooks, passing them the x
     * and y coords of the mouse.  Hook functions that return true are
     * passed to {@source Mousetracker#removeHooks} for removal.
     *
     * @private
     */
    runHooks() {
      if (!this.hooks || this.hooks.length === 0) {
        return;
      }
      let remove = false;
      const removeObj = {};
      const {
        x
      } = this;
      const {
        y
      } = this;
      const len = this.hooks.length;
      for (let i = 0; i < len; ++i) {
        if (this.hooks[i](x, y) === true) {
          remove = true;
          removeObj[i] = true;
        }
      }
      if (remove) {
        this.removeHooks(removeObj);
      }
    }
    /**
     * Removes hooks.
     *
     * @private
     * @param {Object} removeObj An object whose keys are the index
     * numbers of functions for removal, with values that evaluate to true
     */
    removeHooks(removeObj) {
      const newHooks = [];
      const len = this.hooks.length;
      for (let i = 0; i < len; ++i) {
        if (!removeObj[i]) {
          newHooks.push(this.hooks[i]);
        }
      }
      this.hooks = newHooks;
    }
    /**
     * Event listener for mouse wiggles.
     * We simply grab the event, set x and y and run the hooks.
     * This makes the cpu all hot and bothered :-(
     *
     * @private
     * @param {Event} e Mousemove event
     */
    track(e) {
      e || (e = window.event);
      let x;
      let y;
      if (e) {
        if (e.pageX) {
          x = e.pageX;
          y = e.pageY;
        } else if (e.clientX === void 0) {
          return;
        } else {
          let left;
          let top;
          const docElt = document.documentElement;
          if (docElt) {
            left = docElt.scrollLeft;
          }
          left || (left = document.querySelector("body").scrollLeft || document.scrollLeft || 0);
          if (docElt) {
            top = docElt.scrollTop;
          }
          top || (top = document.querySelector("body").scrollTop || document.scrollTop || 0);
          x = e.clientX + left;
          y = e.clientY + top;
        }
        this.setPosition(x, y);
      }
    }
    /**
     * Sets the x and y coordinates stored and takes appropriate action,
     * running hooks as appropriate.
     *
     * @param {Integer} x, y Screen coordinates to set
     * @param {number} x
     * @param {number} y
     */
    setPosition(x, y) {
      this.x = x;
      this.y = y;
      if (this.dirty || this.hooks.length === 0) {
        this.dirty = false;
        return;
      }
      if (typeof this.lastHook_x !== "number") {
        this.lastHook_x = -100;
        this.lastHook_y = -100;
      }
      let diff2 = (this.lastHook_x - x) * (this.lastHook_y - y);
      diff2 = diff2 >= 0 ? diff2 : -diff2;
      if (diff2 > 1) {
        this.lastHook_x = x;
        this.lastHook_y = y;
        if (this.dirty) {
          this.dirty = false;
        } else {
          this.runHooks();
        }
      }
    }
    /**
     * Sets things in motion, unless they are already that is, registering an event listener on
     * <code>document.onmousemove</code>. A half-hearted attempt is made to preserve the old event
     * listener if there is one.
     */
    enable() {
      if (this.active) {
        return;
      }
      this.active = true;
      this.savedListener = document.onmousemove;
      const self2 = this;
      document.onmousemove = (e) => {
        self2.track(e);
      };
      if (this.loopDelay) {
        this.timer = setInterval(() => {
          self2.runHooks();
        }, this.loopDelay);
      }
    }
    /**
     * Disables the tracker, removing the event listener.
     */
    disable() {
      if (!this.active) {
        return;
      }
      if (typeof this.savedListener === "function") {
        document.onmousemove = this.savedListener;
      } else {
        delete document.onmousemove;
      }
      if (this.timer) {
        clearInterval(this.timer);
      }
      this.active = false;
    }
  }
  class Navpopup {
    constructor() {
      this.uid = Navpopup.uid++;
      this.visible = false;
      this.noshow = false;
      this.hooks = {
        create: [],
        unhide: [],
        hide: []
      };
      this.hookIds = {};
      this.downloads = [];
      this.pending = null;
      this.fuzz = 5;
      this.constrained = true;
      this.width = 0;
      this.height = 0;
      this.mainDiv = null;
      this.createMainDiv();
    }
    /**
     * Retrieves the {@source #visible} attribute, indicating whether the popup is currently visible.
     *
     * @type boolean
     */
    isVisible() {
      return this.visible;
    }
    /**
     * Repositions popup using CSS style.
     *
     * @private
     * @param {integer} x x-coordinate (px)
     * @param {integer} y y-coordinate (px)
     * @param {boolean} noLimitHor Don't call {@source #limitHorizontalPosition}
     */
    reposition(x, y, noLimitHor) {
      log("reposition(".concat(x, ",").concat(y, ",").concat(noLimitHor, ")"));
      if (x !== void 0 && x !== null) {
        this.left = x;
      }
      if (y !== void 0 && y !== null) {
        this.top = y;
      }
      if (this.left !== void 0 && this.top !== void 0) {
        this.mainDiv.style.left = "".concat(this.left, "px");
        this.mainDiv.style.top = "".concat(this.top, "px");
      }
      if (!noLimitHor) {
        this.limitHorizontalPosition();
      }
    }
    /**
     * Prevents popups from being in silly locations. Hopefully.
     * Should not be run if {@source #constrained} is true.
     *
     * @private
     */
    limitHorizontalPosition() {
      if (!this.constrained || this.tooWide) {
        return;
      }
      this.updateDimensions();
      const x = this.left;
      const w = this.width;
      const cWidth = document.querySelector("body").clientWidth;
      if (x + w >= cWidth || x > 0 && this.maxWidth && this.width < this.maxWidth && this.height > this.width && x > cWidth - this.maxWidth) {
        this.mainDiv.style.left = "-10000px";
        this.mainDiv.style.width = "".concat(this.maxWidth, "px");
        const naturalWidth = Number.parseInt(this.mainDiv.offsetWidth, 10);
        let newLeft = cWidth - naturalWidth - 1;
        if (newLeft < 0) {
          newLeft = 0;
          this.tooWide = true;
        }
        log("limitHorizontalPosition: moving to (".concat(newLeft, ",").concat(this.top, "); naturalWidth=").concat(naturalWidth, ", clientWidth=").concat(cWidth));
        this.reposition(newLeft, null, true);
      }
    }
    /**
     * Brings popup to the top of the z-order.
     * We increment the {@source #highest} property of the contructor here.
     *
     * @private
     */
    raise() {
      this.mainDiv.style.zIndex = Navpopup.highest + 1;
      ++Navpopup.highest;
    }
    /**
     * Shows the popup provided {@source #noshow} is not true.
     * Updates the position, brings the popup to the top of the z-order and unhides it.
     */
    show() {
      if (this.noshow) {
        return;
      }
      this.reposition();
      this.raise();
      this.unhide();
    }
    /**
     * Checks to see if the mouse pointer has
     * stabilised (checking every <code>time</code>/2 milliseconds) and runs the
     * {@source #show} method if it has.
     *
     * @param {integer} time The minimum time (ms) before the popup may be shown.
     */
    showSoonIfStable(time) {
      log("showSoonIfStable, time=".concat(time));
      if (this.visible) {
        return;
      }
      this.noshow = false;
      this.stable_x = -1e4;
      this.stable_y = -1e4;
      const stableShow = () => {
        log("stableShow called");
        const new_x = Navpopup.tracker.x;
        const new_y = Navpopup.tracker.y;
        const dx = self2.stable_x - new_x;
        const dy = self2.stable_y - new_y;
        const fuzz2 = 0;
        if (dx * dx <= fuzz2 && dy * dy <= fuzz2) {
          log("mouse is stable");
          clearInterval(self2.showSoonStableTimer);
          self2.reposition(new_x + 2, new_y + 2);
          self2.show();
          self2.limitHorizontalPosition();
          return;
        }
        self2.stable_x = new_x;
        self2.stable_y = new_y;
      };
      const self2 = this;
      this.showSoonStableTimer = setInterval(stableShow, time / 2);
    }
    /**
     * Sets the {@source #noshow} flag and hides the popup. This should be called
     * when the mouse leaves the link before
     * (or after) it's actually been displayed.
     */
    banish() {
      log("banish called");
      this.noshow = true;
      if (this.showSoonStableTimer) {
        log("clearing showSoonStableTimer");
        clearInterval(this.showSoonStableTimer);
      }
      this.hide();
    }
    /**
     * Runs hooks added with {@source #addHook}.
     *
     * @private
     * @param {string} key Key name of the {@source #hooks} array - one of 'create', 'unhide', 'hide'
     * @param {string} when Controls exactly when the hook is run: either 'before' or 'after'
     */
    runHooks(key, when) {
      if (!this.hooks[key]) {
        return;
      }
      const keyHooks = this.hooks[key];
      const len = keyHooks.length;
      for (let i = 0; i < len; ++i) {
        if (keyHooks[i] && keyHooks[i].when === when && Reflect.apply(keyHooks[i].hook, this, [])) {
          if (keyHooks[i].hookId) {
            delete this.hookIds[keyHooks[i].hookId];
          }
          keyHooks[i] = null;
        }
      }
    }
    /**
     * Adds a hook to the popup. Hook functions are run with <code>this</code> set to refer to the
     * Navpopup instance, and no arguments.
     *
     * @param {Function} hook The hook function. Functions that return true are deleted.
     * @param {string} key Key name of the {@source #hooks} array - one of 'create', 'unhide', 'hide'
     * @param {string} when Controls exactly when the hook is run: either 'before' or 'after'
     * @param {string} uid A truthy string identifying the hook function; if it matches another hook
     * in this position, it won't be added again.
     */
    addHook(hook, key, when, uid) {
      when || (when = "after");
      if (!this.hooks[key]) {
        return;
      }
      let hookId;
      if (uid) {
        hookId = [key, when, uid].join("|");
        if (this.hookIds[hookId]) {
          return;
        }
        this.hookIds[hookId] = true;
      }
      this.hooks[key].push({
        hook,
        when,
        hookId
      });
    }
    /**
     * Creates the main DIV element, which contains all the actual popup content.
     * Runs hooks with key 'create'.
     *
     * @private
     */
    createMainDiv() {
      var _this$className;
      if (this.mainDiv) {
        return;
      }
      this.runHooks("create", "before");
      const mainDiv = document.createElement("div");
      const self2 = this;
      mainDiv.onclick = (e) => {
        self2.onclickListener(e);
      };
      mainDiv.className = (_this$className = this.className) !== null && _this$className !== void 0 ? _this$className : "navpopup_maindiv";
      mainDiv.id = mainDiv.className + this.uid;
      mainDiv.style.position = "absolute";
      mainDiv.style.minWidth = "350px";
      mainDiv.style.display = "none";
      mainDiv.className = "navpopup";
      mainDiv.navpopup = this;
      this.mainDiv = mainDiv;
      document.querySelector("body").append(mainDiv);
      this.runHooks("create", "after");
    }
    /**
     * Calls the {@source #raise} method.
     *
     * @private
     */
    onclickListener() {
      this.raise();
    }
    /**
     * Makes the popup draggable, using a {@source Drag} object.
     *
     * @param {string} handleName
     * @private
     */
    makeDraggable(handleName) {
      if (!this.mainDiv) {
        this.createMainDiv();
      }
      const drag = new Drag();
      if (!handleName) {
        drag.startCondition = (e) => {
          try {
            if (!e.shiftKey) {
              return false;
            }
          } catch {
            return false;
          }
          return true;
        };
      }
      let dragHandle;
      if (handleName) {
        dragHandle = document.querySelector("#".concat(handleName));
      }
      if (!dragHandle) {
        dragHandle = this.mainDiv;
      }
      const self2 = this;
      drag.endHook = (x, y) => {
        Navpopup.tracker.dirty = true;
        self2.reposition(x, y);
      };
      drag.init(dragHandle, this.mainDiv);
    }
    /**
     * Hides the popup using CSS. Runs hooks with key 'hide'.
     * Sets {@source #visible} appropriately.
     * {@source #banish} should be called externally instead of this method.
     *
     * @private
     */
    hide() {
      this.runHooks("hide", "before");
      this.abortDownloads();
      if (this.visible !== void 0 && this.visible) {
        this.mainDiv.style.display = "none";
        this.visible = false;
      }
      this.runHooks("hide", "after");
    }
    /**
     * Shows the popup using CSS. Runs hooks with key 'unhide'.
     * Sets {@source #visible} appropriately.   {@source #show} should be called externally instead of this method.
     *
     * @private
     */
    unhide() {
      this.runHooks("unhide", "before");
      if (this.visible !== void 0 && !this.visible) {
        this.mainDiv.style.display = "inline";
        this.visible = true;
      }
      this.runHooks("unhide", "after");
    }
    /**
     * Sets the <code>innerHTML</code> attribute of the main div containing the popup content.
     *
     * @param {string} html The HTML to set.
     */
    setInnerHTML(html) {
      this.mainDiv.innerHTML = html;
    }
    /**
     * Updates the {@source #width} and {@source #height} attributes with the CSS properties.
     *
     * @private
     */
    updateDimensions() {
      this.width = Number.parseInt(this.mainDiv.offsetWidth, 10);
      this.height = Number.parseInt(this.mainDiv.offsetHeight, 10);
    }
    /**
     * Checks if the point (x,y) is within {@source #fuzz} of the
     * {@source #mainDiv}.
     *
     * @param {integer} x x-coordinate (px)
     * @param {integer} y y-coordinate (px)
     * @type boolean
     */
    isWithin(x, y) {
      if (!this.visible) {
        return false;
      }
      this.updateDimensions();
      const fuzz = this.fuzz || 0;
      return x + fuzz >= this.left && x - fuzz <= this.left + this.width && y + fuzz >= this.top && y - fuzz <= this.top + this.height;
    }
    /**
     * Adds a download to {@source #downloads}.
     *
     * @param {Downloader} download
     */
    addDownload(download) {
      if (!download) {
        return;
      }
      this.downloads.push(download);
    }
    /**
     * Aborts the downloads listed in {@source #downloads}.
     *
     * @see Downloader#abort
     */
    abortDownloads() {
      var _iterator20 = _createForOfIteratorHelper(this.downloads), _step20;
      try {
        for (_iterator20.s(); !(_step20 = _iterator20.n()).done; ) {
          const d = _step20.value;
          if (d && d.abort) {
            d.abort();
          }
        }
      } catch (err) {
        _iterator20.e(err);
      } finally {
        _iterator20.f();
      }
      this.downloads = [];
    }
  }
  Navpopup.uid = 0;
  Navpopup.highest = 1e3;
  Navpopup.tracker = new Mousetracker();
  const delFmt = (x) => {
    if (x.length === 0) {
      return "";
    }
    return "<del class='popupDiff'>".concat(x.join(""), "</del>");
  };
  const insFmt = (x) => {
    if (x.length === 0) {
      return "";
    }
    return "<ins class='popupDiff'>".concat(x.join(""), "</ins>");
  };
  const countCrossings = (a, b, i, eject) => {
    if (!b[i].row && b[i].row !== 0) {
      return -1;
    }
    let count = 0;
    var _iterator21 = _createForOfIteratorHelper(a.entries()), _step21;
    try {
      for (_iterator21.s(); !(_step21 = _iterator21.n()).done; ) {
        const [j, element] = _step21.value;
        if (!element.row && element.row !== 0) {
          continue;
        }
        if ((j - b[i].row) * (i - element.row) > 0) {
          if (eject) {
            return true;
          }
          count++;
        }
      }
    } catch (err) {
      _iterator21.e(err);
    } finally {
      _iterator21.f();
    }
    return count;
  };
  const shortenDiffString = function shortenDiffString2(str, context) {
    const re = /(<del[\S\s]*?<\/del>|<ins[\S\s]*?<\/ins>)/;
    const splitted = str.split(re);
    let ret = [""];
    for (let i = 0; i < splitted.length; i += 2) {
      if (splitted[i].length < 2 * context) {
        ret[ret.length - 1] += splitted[i];
        if (i + 1 < splitted.length) {
          ret[ret.length - 1] += splitted[i + 1];
        }
        continue;
      } else {
        if (i > 0) {
          ret[ret.length - 1] += splitted[i].slice(0, Math.max(0, context));
        }
        if (i + 1 < splitted.length) {
          ret.push(splitted[i].slice(Math.max(0, splitted[i].length - context)) + splitted[i + 1]);
        }
      }
    }
    while (ret.length > 0 && !ret[0]) {
      ret = ret.slice(1);
    }
    return ret;
  };
  const diffString = (o, n) => {
    let i;
    const oSplitted = o.split(/\b/);
    const nSplitted = n.split(/\b/);
    for (i = 0; i < oSplitted.length; ++i) {
      oSplitted[i] = oSplitted[i].entify();
    }
    for (i = 0; i < nSplitted.length; ++i) {
      nSplitted[i] = nSplitted[i].entify();
    }
    const out = diff(oSplitted, nSplitted);
    let str = "";
    let acc = [];
    let maxOutputPair = 0;
    for (i = 0; i < out.n.length; ++i) {
      if (out.n[i].paired) {
        if (maxOutputPair > out.n[i].row) {
          out.o[out.n[i].row] = out.o[out.n[i].row].text;
          out.n[i] = out.n[i].text;
        }
        if (maxOutputPair < out.n[i].row) {
          maxOutputPair = out.n[i].row;
        }
      }
    }
    for (i = 0; i < out.o.length && !out.o[i].paired; ++i) {
      acc.push(out.o[i]);
    }
    str += delFmt(acc);
    acc = [];
    for (i = 0; i < out.n.length; ++i) {
      while (i < out.n.length && !out.n[i].paired) {
        acc.push(out.n[i++]);
      }
      str += insFmt(acc);
      acc = [];
      if (i < out.n.length) {
        str += out.n[i].text;
        let m = out.n[i].row + 1;
        while (m < out.o.length && !out.o[m].paired) {
          acc.push(out.o[m++]);
        }
        str += delFmt(acc);
        acc = [];
      }
    }
    return str;
  };
  const jsReservedProperties = new RegExp("^(constructor|prototype|__((define|lookup)[GS]etter)__|eval|hasOwnProperty|propertyIsEnumerable|to(Source|String|LocaleString)|(un)?watch|valueOf)$");
  const diffBugAlert = function diffBugAlert2(word) {
    if (!diffBugAlert2.list[word]) {
      diffBugAlert2.list[word] = 1;
      void mw.notify("Bad word: ".concat(word, "\n\nPlease report this bug."), {
        tag: "popups",
        type: "error"
      });
    }
  };
  diffBugAlert.list = {};
  const makeDiffHashtable = (src) => {
    const ret = {};
    for (let i = 0; i < src.length; i++) {
      if (jsReservedProperties.test(src[i])) {
        src[i] += "<!-- -->";
      }
      if (!ret[src[i]]) {
        ret[src[i]] = [];
      }
      try {
        ret[src[i]].push(i);
      } catch {
        diffBugAlert(src[i]);
      }
    }
    return ret;
  };
  const diff = (o, n) => {
    const ns = makeDiffHashtable(n);
    const os = makeDiffHashtable(o);
    let i;
    for (i in ns) {
      if (ns[i].length === 1 && os[i] && os[i].length === 1) {
        n[ns[i][0]] = {
          text: n[ns[i][0]],
          row: os[i][0],
          paired: true
        };
        o[os[i][0]] = {
          text: o[os[i][0]],
          row: ns[i][0],
          paired: true
        };
      }
    }
    for (i = 0; i < n.length - 1; i++) {
      if (n[i].paired && !n[i + 1].paired && n[i].row + 1 < o.length && !o[n[i].row + 1].paired && n[i + 1] === o[n[i].row + 1]) {
        n[i + 1] = {
          text: n[i + 1],
          row: n[i].row + 1,
          paired: true
        };
        o[n[i].row + 1] = {
          text: o[n[i].row + 1],
          row: i + 1,
          paired: true
        };
      }
    }
    for (i = n.length - 1; i > 0; i--) {
      if (n[i].paired && !n[i - 1].paired && n[i].row > 0 && !o[n[i].row - 1].paired && n[i - 1] === o[n[i].row - 1]) {
        n[i - 1] = {
          text: n[i - 1],
          row: n[i].row - 1,
          paired: true
        };
        o[n[i].row - 1] = {
          text: o[n[i].row - 1],
          row: i - 1,
          paired: true
        };
      }
    }
    return {
      o,
      n
    };
  };
  const setSiteInfo = () => {
    if (window.popupLocalDebug) {
      pg.wiki.hostname = "en.wikipedia.org";
    } else {
      pg.wiki.hostname = location.hostname;
    }
    pg.wiki.wikimedia = /(wiki([mp]edia|source|books|news|quote|versity|species|voyage|data)|metawiki|wiktionary|mediawiki)\.org/.test(pg.wiki.hostname);
    pg.wiki.wikia = /\.wikia\.com$/i.test(pg.wiki.hostname);
    pg.wiki.isLocal = pg.wiki.hostname.startsWith("localhost");
    pg.wiki.commons = pg.wiki.wikimedia && pg.wiki.hostname !== "commons.wikimedia.org" ? "commons.wikimedia.org" : null;
    pg.wiki.lang = mw.config.get("wgContentLanguage");
    const port = location.port ? ":".concat(location.port) : "";
    pg.wiki.sitebase = pg.wiki.hostname + port;
  };
  const setUserInfo = () => {
    const params = {
      action: "query",
      list: "users",
      ususers: mw.config.get("wgUserName"),
      usprop: "rights"
    };
    pg.user.canReview = false;
    if (getValueOf("popupReview")) {
      getMwApi().get(params).done((data) => {
        const [{
          rights
        }] = data.query.users;
        pg.user.canReview = rights.includes("review");
      });
    }
  };
  const fetchSpecialPageNames = () => {
    const params = {
      action: "query",
      format: "json",
      formatversion: "2",
      maxage: 3600,
      meta: "siteinfo",
      siprop: "specialpagealiases",
      // cache for an hour
      uselang: "content"
    };
    return getMwApi().get(params).then((data) => {
      pg.wiki.specialpagealiases = data.query.specialpagealiases;
    });
  };
  const setTitleBase = () => {
    const protocol = window.popupLocalDebug ? "http:" : location.protocol;
    pg.wiki.articlePath = mw.config.get("wgArticlePath").replace(/\/\$1/, "");
    pg.wiki.botInterfacePath = mw.config.get("wgScript");
    pg.wiki.APIPath = "".concat(mw.config.get("wgScriptPath"), "/api.php");
    const titletail = "".concat(pg.wiki.botInterfacePath, "?title=");
    pg.wiki.titlebase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(titletail);
    pg.wiki.wikibase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(pg.wiki.botInterfacePath);
    pg.wiki.apiwikibase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(pg.wiki.APIPath);
    pg.wiki.articlebase = "".concat(protocol, "//").concat(pg.wiki.sitebase).concat(pg.wiki.articlePath);
    pg.wiki.commonsbase = "".concat(protocol, "//").concat(pg.wiki.commons).concat(pg.wiki.botInterfacePath);
    pg.wiki.apicommonsbase = "".concat(protocol, "//").concat(pg.wiki.commons).concat(pg.wiki.APIPath);
    pg.re.basenames = new RegExp("^(".concat(map(literalizeRegex, [pg.wiki.titlebase, pg.wiki.articlebase]).join("|"), ")"));
  };
  const setMainRegex = () => {
    const reStart = "[^:]*://";
    let preTitles = "".concat(literalizeRegex(mw.config.get("wgScriptPath")), "/(?:index[.]php|wiki[.]phtml)[?]title=");
    preTitles += "|".concat(literalizeRegex("".concat(pg.wiki.articlePath, "/")));
    const reEnd = "(".concat(preTitles, ")([^&?#]*)[^#]*(?:#(.+))?");
    pg.re.main = new RegExp(reStart + literalizeRegex(pg.wiki.sitebase) + reEnd);
  };
  const buildSpecialPageGroup = (specialPageObj) => {
    const variants = [];
    variants.push(mw.util.escapeRegExp(specialPageObj.realname), mw.util.escapeRegExp(encodeURI(specialPageObj.realname)));
    var _iterator22 = _createForOfIteratorHelper(specialPageObj.aliases), _step22;
    try {
      for (_iterator22.s(); !(_step22 = _iterator22.n()).done; ) {
        const alias = _step22.value;
        variants.push(mw.util.escapeRegExp(alias), mw.util.escapeRegExp(encodeURI(alias)));
      }
    } catch (err) {
      _iterator22.e(err);
    } finally {
      _iterator22.f();
    }
    return variants.join("|");
  };
  const setRegexps = () => {
    setMainRegex();
    const sp = nsRe(pg.nsSpecialId);
    pg.re.urlNoPopup = new RegExp("((title=|/)".concat(sp, "(?:%3A|:)|section=[0-9]|^#$)"));
    var _iterator23 = _createForOfIteratorHelper(pg.wiki.specialpagealiases), _step23;
    try {
      for (_iterator23.s(); !(_step23 = _iterator23.n()).done; ) {
        const specialpage = _step23.value;
        switch (specialpage.realname) {
          case "Contributions":
            pg.re.contribs = new RegExp("(title=|/)".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")(&target=|/|/").concat(nsRe(pg.nsUserId), ":)(.*)"), "i");
            break;
          case "Diff":
            pg.re.specialdiff = new RegExp("/".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")/([^?#]*)"), "i");
            break;
          case "Emailuser":
            pg.re.email = new RegExp("(title=|/)".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")(&target=|/|/(?:").concat(nsRe(pg.nsUserId), ":)?)(.*)"), "i");
            break;
          case "Whatlinkshere":
            pg.re.backlinks = new RegExp("(title=|/)".concat(sp, "(?:%3A|:)(?:").concat(buildSpecialPageGroup(specialpage), ")(&target=|/)([^&]*)"), "i");
            break;
        }
      }
    } catch (err) {
      _iterator23.e(err);
    } finally {
      _iterator23.f();
    }
    const im = nsReImage();
    pg.re.image = new RegExp("(^|\\[\\[)".concat(im, ": *([^|\\]]*[^|\\] ])([^0-9\\]]*([0-9]+) *px)?|(?:\\n *[|]?|[|]) *(").concat(getValueOf("popupImageVarsRegexp"), ") *= *(?:\\[\\[ *)?(?:").concat(im, ":)?([^|]*?)(?:\\]\\])? *[|]? *\\n"), "img");
    pg.re.imageBracketCount = 6;
    pg.re.category = new RegExp("\\[\\[".concat(nsRe(pg.nsCategoryId), ": *([^|\\]]*[^|\\] ]) *"), "i");
    pg.re.categoryBracketCount = 1;
    pg.re.ipUser = /^(?::(?::|(?::[\dA-Fa-f]{1,4}){1,7})|[\dA-Fa-f]{1,4}(?::[\dA-Fa-f]{1,4}){0,6}::|[\dA-Fa-f]{1,4}(?::[\dA-Fa-f]{1,4}){7})|(((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))$/;
    pg.re.stub = new RegExp(getValueOf("popupStubRegexp"), "im");
    pg.re.disambig = new RegExp(getValueOf("popupDabRegexp"), "im");
    pg.re.oldid = /[&?]oldid=([^&]*)/;
    pg.re.diff = /[&?]diff=([^&]*)/;
  };
  const setupCache = () => {
    pg.cache.pages = [];
  };
  const setMisc = () => {
    pg.current.link = null;
    pg.current.links = [];
    pg.current.linksHash = {};
    setupCache();
    pg.timer.checkPopupPosition = null;
    pg.counter.loop = 0;
    pg.idNumber = 0;
    pg.misc.decodeExtras = [
      {
        from: "%2C",
        to: ","
      },
      {
        from: "_",
        to: " "
      },
      {
        from: "%24",
        to: "$"
      },
      {
        from: "%26",
        to: "&"
      }
      // no ,
    ];
  };
  const getMwApi = () => {
    if (!pg.api.client) {
      pg.api.userAgent = "Navigation popups/1.0";
      pg.api.client = api;
    }
    return pg.api.client;
  };
  const setupPopups = function setupPopups2(callback) {
    if (setupPopups2.completed) {
      if (typeof callback === "function") {
        callback();
      }
      return;
    }
    fetchSpecialPageNames().then(() => {
      setupDebugging();
      setSiteInfo();
      setTitleBase();
      setOptions();
      setUserInfo();
      setNamespaces();
      setInterwiki();
      setRegexps();
      setRedirs();
      setMisc();
      setupLivePreview();
      setupTooltips();
      log("In setupPopups(), just called setupTooltips()");
      Navpopup.tracker.enable();
      setupPopups2.completed = true;
      if (typeof callback === "function") {
        callback();
      }
    });
  };
  const defaultNavlinkSpec = () => {
    let str = "";
    str += "<b><<mainlink|shortcut= >></b>";
    if (getValueOf("popupLastEditLink")) {
      str += "*<<lastEdit|shortcut=/>>|<<lastContrib>>|<<sinceMe>>if(oldid){|<<oldEdit>>|<<diffCur>>}";
    }
    str += "if(user){<br><<contribs|shortcut=c>>*<<userlog|shortcut=L|log>>";
    str += "if(ipuser){*<<arin>>}if(wikimedia){*<<count|shortcut=#>>}";
    str += "if(ipuser){}else{*<<email|shortcut=E>>}if(admin){*<<block|shortcut=b>>|<<blocklog|log>>}}";
    const editstr = "<<edit|shortcut=e>>";
    const editOldidStr = "if(oldid){<<editOld|shortcut=e>>|<<revert|shortcut=v|rv>>|<<edit|cur>>}else{".concat(editstr, "}");
    const historystr = "<<history|shortcut=h>>|<<editors|shortcut=E|>>";
    const watchstr = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>";
    str += "<br>if(talk){".concat(editOldidStr, "|<<new|shortcut=+>>*").concat(historystr, "*").concat(watchstr, "*<b><<article|shortcut=a>></b>|<<editArticle|edit>>}else{").concat(
      // not a talk page
      editOldidStr,
      "*"
    ).concat(historystr, "*").concat(watchstr, "*<b><<talk|shortcut=t>></b>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>}");
    str += "<br><<whatLinksHere|shortcut=l>>*<<relatedChanges|shortcut=r>>*<<move|shortcut=m>>";
    str += "if(admin){<br><<unprotect|unprotectShort>>|<<protect|shortcut=p>>|<<protectlog|log>>*<<undelete|undeleteShort>>|<<delete|shortcut=d>>|<<deletelog|log>>}";
    return str;
  };
  const navLinksHTML = (article, _hint, params) => {
    const str = '<span class="popupNavLinks">'.concat(defaultNavlinkSpec(), "</span>");
    return navlinkStringToHTML(str, article, params);
  };
  const expandConditionalNavlinkString = function expandConditionalNavlinkString2(s, article, z, recursionCount) {
    const {
      oldid
    } = z;
    const {
      rcid
    } = z;
    const {
      diff: diff2
    } = z;
    if (typeof recursionCount !== "number") {
      recursionCount = 0;
    }
    const conditionalSplitRegex = /(;?\s*if\s*\(\s*(\w*)\s*\)\s*{([^{}]*)}(\s*else\s*{([^{}]*?)}|))/i;
    const splitted = s.split(conditionalSplitRegex);
    const numParens = 5;
    let [ret] = splitted;
    for (let i = 1; i < splitted.length; i = i + numParens + 1) {
      const testString = splitted[i + 2 - 1];
      const trueString = splitted[i + 3 - 1];
      let falseString = splitted[i + 5 - 1];
      if (falseString === void 0 || !falseString) {
        falseString = "";
      }
      let testResult;
      switch (testString) {
        case "user":
          testResult = !!article.userName();
          break;
        case "talk":
          testResult = !article.talkPage();
          break;
        case "admin":
          testResult = !!getValueOf("popupAdminLinks");
          break;
        case "oldid":
          testResult = !!(oldid !== void 0 && oldid);
          break;
        case "rcid":
          testResult = !!(rcid !== void 0 && rcid);
          break;
        case "ipuser":
          testResult = !!article.isIpUser();
          break;
        case "mainspace_en":
          testResult = isInMainNamespace(article) && pg.wiki.hostname === "en.wikipedia.org";
          break;
        case "wikimedia":
          testResult = !!pg.wiki.wikimedia;
          break;
        case "diff":
          testResult = !!(diff2 !== void 0 && diff2);
          break;
      }
      switch (testResult) {
        case null:
          ret += splitted[i];
          break;
        case true:
          ret += trueString;
          break;
        case false:
          ret += falseString;
          break;
      }
      ret += splitted[i + numParens];
    }
    if (conditionalSplitRegex.test(ret) && recursionCount < 10) {
      return expandConditionalNavlinkString2(ret, article, z, recursionCount + 1);
    }
    return ret;
  };
  const navlinkStringToArray = (s, article, params) => {
    s = expandConditionalNavlinkString(s, article, params);
    const splitted = s.split(/<<(.*?)>>/);
    const ret = [];
    var _iterator24 = _createForOfIteratorHelper(splitted.entries()), _step24;
    try {
      for (_iterator24.s(); !(_step24 = _iterator24.n()).done; ) {
        const [i, element] = _step24.value;
        if (i % 2) {
          const t = new navlinkTag();
          const ss = element.split("|");
          [t.id] = ss;
          for (let j = 1; j < ss.length; ++j) {
            const sss = ss[j].split("=");
            if (sss.length > 1) {
              [, t[sss[0]]] = sss;
            } else {
              t.text = popupString(sss[0]);
            }
          }
          t.article = article;
          const {
            oldid
          } = params;
          const {
            rcid
          } = params;
          const {
            diff: diff2
          } = params;
          if (oldid !== void 0 && oldid !== null) {
            t.oldid = oldid;
          }
          if (rcid !== void 0 && rcid !== null) {
            t.rcid = rcid;
          }
          if (diff2 !== void 0 && diff2 !== null) {
            t.diff = diff2;
          }
          if (!t.text && t.id !== "mainlink") {
            t.text = popupString(t.id);
          }
          ret.push(t);
        } else {
          ret.push(element);
        }
      }
    } catch (err) {
      _iterator24.e(err);
    } finally {
      _iterator24.f();
    }
    return ret;
  };
  const navlinkSubstituteHTML = (s) => {
    return s.split("*").join(getValueOf("popupNavLinkSeparator")).split("<menurow>").join('<li class="popup_menu_row">').split("</menurow>").join("</li>").split("<menu>").join('<ul class="popup_menu">').split("</menu>").join("</ul>");
  };
  const navlinkDepth = (magic, s) => {
    return s.split("<".concat(magic, ">")).length - s.split("</".concat(magic, ">")).length;
  };
  const navlinkStringToHTML = (s, article, params) => {
    const p = navlinkStringToArray(s, article, params);
    let html = "";
    let menudepth = 0;
    let menurowdepth = 0;
    var _iterator25 = _createForOfIteratorHelper(p), _step25;
    try {
      for (_iterator25.s(); !(_step25 = _iterator25.n()).done; ) {
        const element = _step25.value;
        if (typeof element === "string") {
          html += navlinkSubstituteHTML(element);
          menudepth += navlinkDepth("menu", element);
          menurowdepth += navlinkDepth("menurow", element);
        } else if (element.type !== void 0 && element.type === "navlinkTag") {
          html += menudepth > 0 && menurowdepth === 0 ? '<li class="popup_menu_item">'.concat(element.html(), "</li>") : element.html();
        }
      }
    } catch (err) {
      _iterator25.e(err);
    } finally {
      _iterator25.f();
    }
    return html;
  };
  class navlinkTag {
    constructor() {
      this.type = "navlinkTag";
    }
    html() {
      this.getNewWin();
      this.getPrintFunction();
      let html = "";
      let opening;
      let closing;
      const tagType = "span";
      if (tagType) {
        opening = "<".concat(tagType, ' class="popup_').concat(this.id, '">');
        closing = "</".concat(tagType, ">");
      } else {
        opening = "";
        closing = "";
      }
      if (typeof this.print === "function") {
        html = this.print(this);
        if (typeof html !== "string") {
          html = "";
        } else if (this.shortcut !== void 0) {
          html = addPopupShortcut(html, this.shortcut);
        }
      } else {
        errlog("Oh dear - invalid print function for a navlinkTag, id=".concat(this.id));
      }
      return opening + html + closing;
    }
    getNewWin() {
      getValueOf("popupLinksNewWindow");
      if (pg.option.popupLinksNewWindow[this.id] === void 0) {
        this.newWin = null;
      }
      this.newWin = pg.option.popupLinksNewWindow[this.id];
    }
    getPrintFunction() {
      if (typeof this.id !== "string" || typeof this.article !== typeof {}) {
        return;
      }
      this.noPopup = 1;
      switch (this.id) {
        case "contribs":
        case "history":
        case "whatLinksHere":
        case "userPage":
        case "userTalk":
        case "talk":
        case "article":
        case "lastEdit":
          this.noPopup = null;
      }
      switch (this.id) {
        case "email":
        case "contribs":
        case "block":
        case "unblock":
        case "userlog":
        case "userSpace":
        case "deletedContribs":
          this.article = this.article.userName();
      }
      switch (this.id) {
        case "userTalk":
        case "newUserTalk":
        case "editUserTalk":
        case "userPage":
        case "blocklog":
          this.article = this.article.userName(true);
        case "pagelog":
        case "deletelog":
        case "protectlog":
          delete this.oldid;
      }
      if (this.id !== "mainlink") {
        this.article = this.article.removeAnchor();
      }
      switch (this.id) {
        case "undelete":
          this.print = specialLink;
          this.specialpage = "Undelete";
          this.sep = "/";
          break;
        case "whatLinksHere":
          this.print = specialLink;
          this.specialpage = "Whatlinkshere";
          break;
        case "relatedChanges":
          this.print = specialLink;
          this.specialpage = "Recentchangeslinked";
          break;
        case "move":
          this.print = specialLink;
          this.specialpage = "Movepage";
          break;
        case "contribs":
          this.print = specialLink;
          this.specialpage = "Contributions";
          break;
        case "deletedContribs":
          this.print = specialLink;
          this.specialpage = "Deletedcontributions";
          break;
        case "email":
          this.print = specialLink;
          this.specialpage = "EmailUser";
          this.sep = "/";
          break;
        case "block":
          this.print = specialLink;
          this.specialpage = "Blockip";
          this.sep = "&ip=";
          break;
        case "unblock":
          this.print = specialLink;
          this.specialpage = "Ipblocklist";
          this.sep = "&action=unblock&ip=";
          break;
        case "userlog":
          this.print = specialLink;
          this.specialpage = "Log";
          this.sep = "&user=";
          break;
        case "blocklog":
          this.print = specialLink;
          this.specialpage = "Log";
          this.sep = "&type=block&page=";
          break;
        case "pagelog":
          this.print = specialLink;
          this.specialpage = "Log";
          this.sep = "&page=";
          break;
        case "protectlog":
          this.print = specialLink;
          this.specialpage = "Log";
          this.sep = "&type=protect&page=";
          break;
        case "deletelog":
          this.print = specialLink;
          this.specialpage = "Log";
          this.sep = "&type=delete&page=";
          break;
        case "userSpace":
          this.print = specialLink;
          this.specialpage = "PrefixIndex";
          this.sep = "&namespace=2&prefix=";
          break;
        case "search":
          this.print = specialLink;
          this.specialpage = "Search";
          this.sep = "&fulltext=Search&search=";
          break;
        case "thank":
          this.print = specialLink;
          this.specialpage = "Thanks";
          this.sep = "/";
          this.article.value = this.diff === "prev" ? this.oldid : this.diff;
          break;
        case "unwatch":
        case "watch":
          this.print = magicWatchLink;
          this.action = "".concat(this.id, "&autowatchlist=1&autoimpl=").concat(popupString("autoedit_version"), "&actoken=").concat(autoClickToken());
          break;
        case "history":
        case "historyfeed":
        case "unprotect":
        case "protect":
          this.print = wikiLink;
          this.action = this.id;
          break;
        case "delete":
          this.print = wikiLink;
          this.action = "delete";
          if (this.article.namespaceId() === pg.nsImageId) {
            const img = this.article.stripNamespace();
            this.action += "&image=".concat(img);
          }
          break;
        case "markpatrolled":
        case "edit":
          delete this.oldid;
        case "view":
        case "purge":
        case "render":
          this.print = wikiLink;
          this.action = this.id;
          break;
        case "raw":
          this.print = wikiLink;
          this.action = "raw";
          break;
        case "new":
          this.print = wikiLink;
          this.action = "edit&section=new";
          break;
        case "mainlink":
          if (this.text === void 0) {
            this.text = this.article.toString().entify();
          }
          if (getValueOf("popupSimplifyMainLink") && isInStrippableNamespace(this.article)) {
            const s = this.text.split("/");
            this.text = s.at(-1);
            if (this.text === "" && s.length > 1) {
              this.text = s.at(-2);
            }
          }
          this.print = titledWikiLink;
          if (this.title === void 0 && pg.current.link && pg.current.link.href !== void 0) {
            var _pg$current$link$orig;
            this.title = safeDecodeURI((_pg$current$link$orig = pg.current.link.originalTitle) !== null && _pg$current$link$orig !== void 0 ? _pg$current$link$orig : this.article);
            if (this.oldid !== void 0 && this.oldid) {
              this.title = tprintf("Revision %s of %s", [this.oldid, this.title]);
            }
          }
          this.action = "view";
          break;
        case "userPage":
        case "article":
        case "editArticle":
          delete this.oldid;
          this.article = this.article.articleFromTalkOrArticle();
          this.print = wikiLink;
          this.action = this.id.indexOf("edit") === 0 ? "edit" : "view";
          break;
        case "userTalk":
        case "talk":
          this.article = this.article.talkPage();
          delete this.oldid;
          this.print = wikiLink;
          this.action = "view";
          break;
        case "arin":
          this.print = arinLink;
          break;
        case "count":
          this.print = editCounterLink;
          break;
        case "editors":
          this.print = editorListLink;
          break;
        case "lastEdit":
          this.print = titledDiffLink;
          this.title = popupString("Show the last edit");
          this.from = "prev";
          this.to = "cur";
          break;
        case "oldEdit":
          this.print = titledDiffLink;
          this.title = "".concat(popupString("Show the edit made to get revision"), " ").concat(this.oldid);
          this.from = "prev";
          this.to = this.oldid;
          break;
        case "editOld":
          this.print = wikiLink;
          this.action = "edit";
          break;
        case "undo":
          this.print = wikiLink;
          this.action = "edit&undo=";
          break;
        case "revert":
          this.print = wikiLink;
          this.action = "revert";
          break;
        case "nullEdit":
          this.print = wikiLink;
          this.action = "nullEdit";
          break;
        case "diffCur":
          this.print = titledDiffLink;
          this.title = tprintf("Show changes since revision %s", [this.oldid]);
          this.from = this.oldid;
          this.to = "cur";
          break;
        case "editUserTalk":
        case "editTalk":
          delete this.oldid;
          this.article = this.article.talkPage();
          this.action = "edit";
          this.print = wikiLink;
          break;
        case "newUserTalk":
        case "newTalk":
          this.article = this.article.talkPage();
          this.action = "edit&section=new";
          this.print = wikiLink;
          break;
        case "lastContrib":
        case "sinceMe":
          this.print = magicHistoryLink;
          break;
        case "togglePreviews":
          this.text = popupString(pg.option.simplePopups ? "enable previews" : "disable previews");
        case "disablePopups":
        case "purgePopups":
          this.print = popupMenuLink;
          break;
        default:
          this.print = function() {
            return "Unknown navlink type: ".concat(this.id);
          };
      }
    }
  }
  const popupHandleKeypress = function popupHandleKeypress2(evt) {
    var _evt$keyCode;
    const keyCode = window.event ? window.event.keyCode : (_evt$keyCode = evt.keyCode) !== null && _evt$keyCode !== void 0 ? _evt$keyCode : evt.which;
    if (!keyCode || !pg.current.link || !pg.current.link.navpopup) {
      return;
    }
    if (keyCode === 27) {
      killPopup();
      return false;
    }
    const letter = String.fromCodePoint(keyCode);
    const links = pg.current.link.navpopup.mainDiv.querySelectorAll("A");
    let startLink = 0;
    let i;
    let j;
    if (popupHandleKeypress2.lastPopupLinkSelected) {
      for (i = 0; i < links.length; ++i) {
        if (links[i] === popupHandleKeypress2.lastPopupLinkSelected) {
          startLink = i;
        }
      }
    }
    for (j = 0; j < links.length; ++j) {
      i = (startLink + j + 1) % links.length;
      if (links[i].getAttribute("popupkey") === letter) {
        if (evt && evt.preventDefault) {
          evt.preventDefault();
        }
        links[i].focus();
        popupHandleKeypress2.lastPopupLinkSelected = links[i];
        return false;
      }
    }
    if (document.oldPopupOnkeypress) {
      return document.oldPopupOnkeypress(evt);
    }
    return true;
  };
  const addPopupShortcuts = () => {
    if (document.onkeypress !== popupHandleKeypress) {
      document.oldPopupOnkeypress = document.onkeypress;
    }
    document.onkeypress = popupHandleKeypress;
  };
  const rmPopupShortcuts = () => {
    popupHandleKeypress.lastPopupLinkSelected = null;
    try {
      if (document.oldPopupOnkeypress && document.oldPopupOnkeypress === popupHandleKeypress) {
        document.onkeypress = null;
        return;
      }
      document.onkeypress = document.oldPopupOnkeypress;
    } catch {
    }
  };
  const addLinkProperty = (html, property) => {
    const i = html.indexOf(">");
    if (i < 0) {
      return html;
    }
    return "".concat(html.slice(0, Math.max(0, i)), " ").concat(property).concat(html.slice(Math.max(0, i)));
  };
  const addPopupShortcut = (html, key) => {
    if (!getValueOf("popupShortcutKeys")) {
      return html;
    }
    const ret = addLinkProperty(html, 'popupkey="'.concat(key, '"'));
    if (key === " ") {
      key = popupString("spacebar");
    }
    return ret.replace(/^(.*?)(title=")(.*?)(".*)$/i, "$1$2$3 [".concat(key, "]$4"));
  };
  const loadDiff = (article, oldid, diff2, navpop) => {
    navpop.diffData = {
      oldRev: {},
      newRev: {}
    };
    const api2 = getMwApi();
    const params = {
      action: "compare",
      prop: ["ids", "title"]
    };
    if (article.title) {
      params.fromtitle = article.title;
    }
    switch (diff2) {
      case "cur":
        switch (oldid) {
          case null:
          case "":
          case "prev":
            params.torelative = "prev";
            break;
          default:
            params.fromrev = oldid;
            params.torelative = "cur";
            break;
        }
        break;
      case "prev":
        if (oldid) {
          params.fromrev = oldid;
        } else {
          params.fromtitle;
        }
        params.torelative = "prev";
        break;
      case "next":
        params.fromrev = oldid || 0;
        params.torelative = "next";
        break;
      default:
        params.fromrev = oldid || 0;
        params.torev = diff2 || 0;
        break;
    }
    api2.get(params).then((data) => {
      navpop.diffData.oldRev.revid = data.compare.fromrevid;
      navpop.diffData.newRev.revid = data.compare.torevid;
      addReviewLink(navpop, "popupMiscTools");
      const go = () => {
        pendingNavpopTask(navpop);
        let url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query&");
        url += "revids=".concat(navpop.diffData.oldRev.revid, "|").concat(navpop.diffData.newRev.revid);
        url += "&prop=revisions&rvprop=ids|timestamp|content";
        getPageWithCaching(url, doneDiff, navpop);
        return true;
      };
      if (navpop.visible || !getValueOf("popupLazyDownloads")) {
        go();
      } else {
        navpop.addHook(go, "unhide", "before", "DOWNLOAD_DIFFS");
      }
    });
  };
  const addReviewLink = (navpop, target) => {
    if (!pg.user.canReview) {
      return;
    }
    if (navpop.diffData.newRev.revid <= navpop.diffData.oldRev.revid) {
      return;
    }
    const params = {
      action: "query",
      format: "json",
      formatversion: "2",
      prop: ["info", "flagged"],
      revids: navpop.diffData.oldRev.revid
    };
    getMwApi().get(params).then((data) => {
      const stable_revid = data.query.pages[0].flagged && data.query.pages[0].flagged.stable_revid || 0;
      if (stable_revid === navpop.diffData.oldRev.revid) {
        const a = document.createElement("a");
        a.innerHTML = popupString("mark patrolled");
        a.title = popupString("markpatrolledHint");
        a.onclick = () => {
          const params2 = {
            action: "review",
            comment: tprintf("defaultpopupReviewedSummary", [navpop.diffData.oldRev.revid, navpop.diffData.newRev.revid]),
            revid: navpop.diffData.newRev.revid
          };
          getMwApi().postWithToken("csrf", params2).done(() => {
            a.style.display = "none";
          }).fail(() => {
            void mw.notify(popupString("Could not marked this edit as patrolled"), {
              tag: "popups",
              type: "error"
            });
          });
        };
        setPopupHTML(a, target, navpop.idNumber, null, true);
      }
    });
  };
  const doneDiff = (download) => {
    if (!download.owner || !download.owner.diffData) {
      return;
    }
    const navpop = download.owner;
    completedNavpopTask(navpop);
    let pages;
    let revisions = [];
    try {
      ({
        pages
      } = getJsObj(download.data).query);
      var _iterator26 = _createForOfIteratorHelper(pages), _step26;
      try {
        for (_iterator26.s(); !(_step26 = _iterator26.n()).done; ) {
          const page = _step26.value;
          revisions = [...revisions, ...page.revisions];
        }
      } catch (err) {
        _iterator26.e(err);
      } finally {
        _iterator26.f();
      }
      for (var _i3 = 0, _revisions = revisions; _i3 < _revisions.length; _i3++) {
        const revision = _revisions[_i3];
        if (revision.revid === navpop.diffData.oldRev.revid) {
          navpop.diffData.oldRev.revision = revision;
        } else if (revision.revid === navpop.diffData.newRev.revid) {
          navpop.diffData.newRev.revision = revision;
        }
      }
    } catch {
      errlog("Could not get diff");
    }
    insertDiff(navpop);
  };
  const rmBoringLines = (a, b, context) => {
    if (context === void 0) {
      context = 2;
    }
    const aa = [];
    const aaa = [];
    const bb = [];
    const bbb = [];
    let i;
    let j;
    for (i = 0; i < a.length; ++i) {
      if (!a[i].paired) {
        aa[i] = 1;
      } else if (countCrossings(b, a, i, true)) {
        aa[i] = 1;
        bb[a[i].row] = 1;
      }
    }
    for (i = 0; i < b.length; ++i) {
      if (bb[i] === 1) {
        continue;
      }
      if (!b[i].paired) {
        bb[i] = 1;
      }
    }
    for (i = 0; i < b.length; ++i) {
      if (bb[i] === 1) {
        for (j = Math.max(0, i - context); j < Math.min(b.length, i + context); ++j) {
          if (!bb[j]) {
            bb[j] = 1;
            aa[b[j].row] = 0.5;
          }
        }
      }
    }
    for (i = 0; i < a.length; ++i) {
      if (aa[i] === 1) {
        for (j = Math.max(0, i - context); j < Math.min(a.length, i + context); ++j) {
          if (!aa[j]) {
            aa[j] = 1;
            bb[a[j].row] = 0.5;
          }
        }
      }
    }
    for (i = 0; i < bb.length; ++i) {
      if (bb[i] > 0) {
        if (b[i].paired) {
          bbb.push(b[i].text);
        } else {
          bbb.push(b[i]);
        }
      }
    }
    for (i = 0; i < aa.length; ++i) {
      if (aa[i] > 0) {
        if (a[i].paired) {
          aaa.push(a[i].text);
        } else {
          aaa.push(a[i]);
        }
      }
    }
    return {
      a: aaa,
      b: bbb
    };
  };
  const stripOuterCommonLines = (a, b, context) => {
    let i = 0;
    while (i < a.length && i < b.length && a[i] === b[i]) {
      ++i;
    }
    let j = a.length - 1;
    let k = b.length - 1;
    while (j >= 0 && k >= 0 && a[j] === b[k]) {
      --j;
      --k;
    }
    return {
      a: a.slice(Math.max(0, i - 1 - context), Math.min(a.length + 1, j + context + 1)),
      b: b.slice(Math.max(0, i - 1 - context), Math.min(b.length + 1, k + context + 1))
    };
  };
  const insertDiff = (navpop) => {
    let oldlines = navpop.diffData.oldRev.revision.content.split("\n");
    let newlines = navpop.diffData.newRev.revision.content.split("\n");
    let inner = stripOuterCommonLines(oldlines, newlines, getValueOf("popupDiffContextLines"));
    oldlines = inner.a;
    newlines = inner.b;
    let truncated = false;
    getValueOf("popupDiffMaxLines");
    if (oldlines.length > pg.option.popupDiffMaxLines || newlines.length > pg.option.popupDiffMaxLines) {
      truncated = true;
      inner = stripOuterCommonLines(oldlines.slice(0, pg.option.popupDiffMaxLines), newlines.slice(0, pg.option.popupDiffMaxLines), pg.option.popupDiffContextLines);
      oldlines = inner.a;
      newlines = inner.b;
    }
    const lineDiff = diff(oldlines, newlines);
    const lines2 = rmBoringLines(lineDiff.o, lineDiff.n);
    const oldlines2 = lines2.a;
    const newlines2 = lines2.b;
    let html = "<hr>";
    if (getValueOf("popupDiffDates")) {
      html += diffDatesTable(navpop);
      html += "<hr>";
    }
    html += shortenDiffString(diffString(oldlines2.join("\n"), newlines2.join("\n")), getValueOf("popupDiffContextCharacters")).join("<hr>");
    setPopupTipsAndHTML(html.split("\n").join("<br>") + (truncated ? "<hr><b>".concat(popupString("Diff truncated for performance reasons"), "</b>") : ""), "popupPreview", navpop.idNumber);
  };
  const diffDatesTable = (navpop) => {
    let html = '<table class="popup_diff_dates">';
    html += diffDatesTableRow(navpop.diffData.newRev.revision, tprintf("New revision"));
    html += diffDatesTableRow(navpop.diffData.oldRev.revision, tprintf("Old revision"));
    html += "</table>";
    return html;
  };
  const diffDatesTableRow = (revision, label) => {
    let txt = "";
    const lastModifiedDate = new Date(revision.timestamp);
    txt = formattedDateTime(lastModifiedDate);
    const revlink = generalLink({
      url: "".concat(mw.config.get("wgScript"), "?oldid=").concat(revision.revid),
      text: label,
      title: label
    });
    return simplePrintf("<tr><td>%s</td><td>%s</td></tr>", [revlink, txt]);
  };
  const titledDiffLink = (l) => {
    return titledWikiLink({
      article: l.article,
      action: "".concat(l.to, "&oldid=").concat(l.from),
      newWin: l.newWin,
      noPopup: l.noPopup,
      text: l.text,
      title: l.title,
      /* hack: no oldid here */
      actionName: "diff"
    });
  };
  const wikiLink = (l) => {
    if (!(typeof l.article === typeof {} && typeof l.action === "string" && typeof l.text === "string")) {
      return null;
    }
    if (l.oldid === void 0) {
      l.oldid = null;
    }
    const savedOldid = l.oldid;
    if (!/^(edit|view|revert|render)$|^raw/.test(l.action)) {
      l.oldid = null;
    }
    let hint = popupString("".concat(l.action, "Hint"));
    const oldidData = [l.oldid, safeDecodeURI(l.article)];
    let revisionString = tprintf("revision %s of %s", oldidData);
    log("revisionString=".concat(revisionString));
    switch (l.action) {
      case "edit&section=new":
        hint = popupString("newSectionHint");
        break;
      case "edit&undo=":
        if (l.diff && l.diff !== "prev" && savedOldid) {
          l.action += "".concat(l.diff, "&undoafter=").concat(savedOldid);
        } else if (savedOldid) {
          l.action += savedOldid;
        }
        hint = popupString("undoHint");
        break;
      case "raw&ctype=text/css":
        hint = popupString("rawHint");
        break;
      case "revert": {
        const p = parseParams(pg.current.link.href);
        l.action = "edit&autoclick=wpSave&actoken=".concat(autoClickToken(), "&autoimpl=").concat(popupString("autoedit_version"), "&autosummary=").concat(revertSummary(l.oldid, p.diff));
        if (p.diff === "prev") {
          l.action += "&direction=prev";
          revisionString = tprintf("the revision prior to revision %s of %s", oldidData);
        }
        if (getValueOf("popupRevertSummaryPrompt")) {
          l.action += "&autosummaryprompt=true";
        }
        if (getValueOf("popupMinorReverts")) {
          l.action += "&autominor=true";
        }
        log("revisionString is now ".concat(revisionString));
        break;
      }
      case "nullEdit":
        l.action = "edit&autoclick=wpSave&actoken=".concat(autoClickToken(), "&autoimpl=").concat(popupString("autoedit_version"), "&autosummary=null");
        break;
      case "historyfeed":
        l.action = "history&feed=rss";
        break;
      case "markpatrolled":
        l.action = "markpatrolled&rcid=".concat(l.rcid);
    }
    if (hint) {
      hint = l.oldid ? simplePrintf(hint, [revisionString]) : simplePrintf(hint, [safeDecodeURI(l.article)]);
    } else {
      hint = safeDecodeURI("".concat(l.article, "&action=").concat(l.action)) + l.oldid ? "&oldid=".concat(l.oldid) : "";
    }
    return titledWikiLink({
      article: l.article,
      action: l.action,
      text: l.text,
      newWin: l.newWin,
      title: hint,
      oldid: l.oldid,
      noPopup: l.noPopup,
      onclick: l.onclick
    });
  };
  const revertSummary = (oldid, diff2) => {
    let ret = "";
    ret = diff2 === "prev" ? getValueOf("popupQueriedRevertToPreviousSummary") : getValueOf("popupQueriedRevertSummary");
    return "".concat(ret, "&autorv=").concat(oldid);
  };
  const titledWikiLink = (l) => {
    if (l.article === void 0 || l.action === void 0) {
      errlog("got undefined article or action in titledWikiLink");
      return null;
    }
    const base = pg.wiki.titlebase + l.article.urlString();
    let url = base;
    if (l.actionName === void 0 || !l.actionName) {
      l.actionName = "action";
    }
    if (l.action !== "view") {
      url = "".concat(base, "&").concat(l.actionName, "=").concat(l.action);
    }
    if (l.oldid !== void 0 && l.oldid) {
      url += "&oldid=".concat(l.oldid);
    }
    let cssClass = pg.misc.defaultNavlinkClassname;
    if (l.className !== void 0 && l.className) {
      cssClass = l.className;
    }
    return generalNavLink({
      url,
      newWin: l.newWin,
      title: l.title === void 0 ? null : l.title,
      text: l.text === void 0 ? null : l.text,
      className: cssClass,
      noPopup: l.noPopup,
      onclick: l.onclick
    });
  };
  pg.fn.getLastContrib = (wikipage, newWin) => {
    getHistoryInfo(wikipage, (x) => {
      processLastContribInfo(x, {
        page: wikipage,
        newWin
      });
    });
  };
  const processLastContribInfo = (info, stuff) => {
    if (!info.edits || info.edits.length === 0) {
      void mw.notify("Popups: an odd thing happened. Please retry.", {
        tag: "popups",
        type: "error"
      });
      return;
    }
    if (!info.firstNewEditor) {
      void mw.notify(tprintf("Only found one editor: %s made %s edits", [info.edits[0].editor, info.edits.length]), {
        tag: "popups",
        type: "error"
      });
      return;
    }
    const newUrl = "".concat(pg.wiki.titlebase + new Title(stuff.page).urlString(), "&diff=cur&oldid=").concat(info.firstNewEditor.oldid);
    displayUrl(newUrl, stuff.newWin);
  };
  pg.fn.getDiffSinceMyEdit = (wikipage, newWin) => {
    getHistoryInfo(wikipage, (x) => {
      processDiffSinceMyEdit(x, {
        page: wikipage,
        newWin
      });
    });
  };
  const processDiffSinceMyEdit = (info, stuff) => {
    if (!info.edits || info.edits.length === 0) {
      void mw.notify("Popups: something fishy happened. Please try again.", {
        tag: "popups",
        type: "error"
      });
      return;
    }
    const friendlyName = stuff.page.split("_").join(" ");
    if (!info.myLastEdit) {
      void mw.notify(tprintf("Couldn't find an edit by %s\nin the last %s edits to\n%s", [info.userName, getValueOf("popupHistoryLimit"), friendlyName]), {
        tag: "popups",
        type: "error"
      });
      return;
    }
    if (info.myLastEdit.index === 0) {
      void mw.notify(tprintf("%s seems to be the last editor to the page %s", [info.userName, friendlyName]), {
        type: "error"
      });
      return;
    }
    const newUrl = "".concat(pg.wiki.titlebase + new Title(stuff.page).urlString(), "&diff=cur&oldid=").concat(info.myLastEdit.oldid);
    displayUrl(newUrl, stuff.newWin);
  };
  const displayUrl = (url, newWin) => {
    if (newWin) {
      window.open(url);
    } else {
      document.location = url;
    }
  };
  pg.fn.purgePopups = () => {
    processAllPopups(true);
    setupCache();
    pg.option = {};
    abortAllDownloads();
  };
  const processAllPopups = (nullify, banish) => {
    for (let i = 0; pg.current.links && i < pg.current.links.length; ++i) {
      if (!pg.current.links[i].navpopup) {
        continue;
      }
      if (nullify || banish) {
        pg.current.links[i].navpopup.banish();
      }
      pg.current.links[i].simpleNoMore = false;
      if (nullify) {
        pg.current.links[i].navpopup = null;
      }
    }
  };
  pg.fn.disablePopups = () => {
    processAllPopups(false, true);
    setupTooltips(null, true);
  };
  pg.fn.togglePreviews = () => {
    processAllPopups(true, true);
    pg.option.simplePopups = !pg.option.simplePopups;
    abortAllDownloads();
  };
  const magicWatchLink = function magicWatchLink2(l) {
    l.onclick = simplePrintf("pg.fn.modifyWatchlist('%s','%s');return false;", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), this.id]);
    return wikiLink(l);
  };
  pg.fn.modifyWatchlist = /* @__PURE__ */ function() {
    var _ref = _asyncToGenerator(function* (title, action) {
      const reqData = {
        action: "watch",
        formatversion: "2",
        titles: title,
        uselang: mw.config.get("wgUserLanguage")
      };
      if (action === "unwatch") {
        reqData.unwatch = true;
      }
      const mwTitle = mw.Title.newFromText(title);
      let messageName;
      if (mwTitle && mwTitle.getNamespaceId() > 0 && mwTitle.getNamespaceId() % 2 === 1) {
        messageName = action === "watch" ? "addedwatchtext-talk" : "removedwatchtext-talk";
      } else {
        messageName = action === "watch" ? "addedwatchtext" : "removedwatchtext";
      }
      yield getMwApi().postWithToken("watch", reqData);
      yield getMwApi().loadMessagesIfMissing([messageName]);
      void mw.notify(mw.message(messageName, title).parseDom(), {
        tag: "popups"
      });
    });
    return function(_x2, _x3) {
      return _ref.apply(this, arguments);
    };
  }();
  const magicHistoryLink = (l) => {
    let jsUrl = "";
    let title = "";
    let onClick = "";
    switch (l.id) {
      case "lastContrib":
        onClick = simplePrintf("pg.fn.getLastContrib('%s',%s)", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), l.newWin]);
        title = popupString("lastContribHint");
        break;
      case "sinceMe":
        onClick = simplePrintf("pg.fn.getDiffSinceMyEdit('%s',%s)", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), l.newWin]);
        title = popupString("sinceMeHint");
        break;
    }
    jsUrl = "javascript:".concat(onClick);
    onClick += ";return false;";
    return generalNavLink({
      url: jsUrl,
      newWin: false,
      title,
      text: l.text,
      noPopup: l.noPopup,
      onclick: onClick
    });
  };
  const popupMenuLink = (l) => {
    const jsUrl = simplePrintf("javascript:pg.fn.%s()", [l.id]);
    const title = popupString(simplePrintf("%sHint", [l.id]));
    const onClick = simplePrintf("pg.fn.%s();return false;", [l.id]);
    return generalNavLink({
      url: jsUrl,
      newWin: false,
      title,
      text: l.text,
      noPopup: l.noPopup,
      onclick: onClick
    });
  };
  const specialLink = (l) => {
    if (l.specialpage === void 0 || !l.specialpage) {
      return null;
    }
    const base = "".concat(pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId], ":").concat(l.specialpage);
    if (l.sep === void 0 || l.sep === null) {
      l.sep = "&target=";
    }
    let article = l.article.urlString({
      keepSpaces: l.specialpage === "Search"
    });
    let hint = popupString("".concat(l.specialpage, "Hint"));
    switch (l.specialpage) {
      case "Log":
        switch (l.sep) {
          case "&user=":
            hint = popupString("userLogHint");
            break;
          case "&type=block&page=":
            hint = popupString("blockLogHint");
            break;
          case "&page=":
            hint = popupString("pageLogHint");
            break;
          case "&type=protect&page=":
            hint = popupString("protectLogHint");
            break;
          case "&type=delete&page=":
            hint = popupString("deleteLogHint");
            break;
          default:
            log("Unknown log type, sep=".concat(l.sep));
            hint = "Missing hint (FIXME)";
        }
        break;
      case "PrefixIndex":
        article += "/";
        break;
    }
    hint = hint ? simplePrintf(hint, [safeDecodeURI(l.article)]) : safeDecodeURI("".concat(l.specialpage, ":").concat(l.article));
    const url = base + l.sep + article;
    return generalNavLink({
      url,
      title: hint,
      text: l.text,
      newWin: l.newWin,
      noPopup: l.noPopup
    });
  };
  const generalLink = (l) => {
    if (l.url === void 0) {
      return null;
    }
    const url = l.url.split('"').join("%22");
    let ret = '<a href="'.concat(url, '"');
    if (l.title !== void 0 && l.title) {
      ret += ' title="'.concat(pg.escapeQuotesHTML(l.title), '"');
    }
    if (l.onclick !== void 0 && l.onclick) {
      ret += ' onclick="'.concat(pg.escapeQuotesHTML(l.onclick), '"');
    }
    if (l.noPopup) {
      ret += " noPopup=1";
    }
    let newWin;
    if (l.newWin === void 0 || l.newWin === null) {
      newWin = getValueOf("popupNewWindows");
    } else {
      ({
        newWin
      } = l);
    }
    if (newWin) {
      ret += ' rel="noopener" target="_blank"';
    }
    if (l.className !== void 0 && l.className) {
      ret += ' class="'.concat(l.className, '"');
    }
    ret += ">";
    if (typeof l.text === "string") {
      ret += pg.escapeQuotesHTML(pg.unescapeQuotesHTML(l.text));
    }
    ret += "</a>";
    return ret;
  };
  const appendParamsToLink = (linkstr, params) => {
    const sp = linkstr.split(/(href="[^"]+?)"/i);
    if (sp.length < 2) {
      return null;
    }
    let ret = sp.shift() + sp.shift();
    ret += "&".concat(params, '"');
    ret += sp.join("");
    return ret;
  };
  const changeLinkTargetLink = (x) => {
    if (x.newTarget) {
      log("changeLinkTargetLink: newTarget=".concat(x.newTarget));
    }
    if (x.oldTarget !== decodeURIComponent(x.oldTarget)) {
      log("This might be an input problem: ".concat(x.oldTarget));
    }
    const cA = mw.util.escapeRegExp(x.oldTarget);
    let chs = cA.charAt(0).toUpperCase();
    chs = "[".concat(chs).concat(chs.toLowerCase(), "]");
    let currentArticleRegexBit = chs + cA.slice(1);
    currentArticleRegexBit = currentArticleRegexBit.split(/[ _]+|%20/g).join("(?:[_ ]+|%20)").split("\\(").join("(?:%28|\\()").split("\\)").join("(?:%29|\\))");
    currentArticleRegexBit = "\\s*(".concat(currentArticleRegexBit, "(?:#[^\\[\\|]*)?)\\s*");
    const title = x.title || mw.config.get("wgPageName").split("_").join(" ");
    const lk = titledWikiLink({
      article: new Title(title),
      newWin: x.newWin,
      action: "edit",
      text: x.text,
      title: x.hint,
      className: "popup_change_title_link"
    });
    let cmd = "";
    if (x.newTarget) {
      const t = x.newTarget;
      const s = mw.util.escapeRegExp(x.newTarget);
      if (x.alsoChangeLabel) {
        cmd += "s~\\[\\[".concat(currentArticleRegexBit, "\\]\\]~[[").concat(t, "]]~g;");
        cmd += "s~\\[\\[".concat(currentArticleRegexBit, "[|]~[[").concat(t, "|~g;");
        cmd += "s~\\[\\[".concat(s, "\\|").concat(s, "\\]\\]~[[").concat(t, "]]~g");
      } else {
        cmd += "s~\\[\\[".concat(currentArticleRegexBit, "\\]\\]~[[").concat(t, "|$1]]~g;");
        cmd += "s~\\[\\[".concat(currentArticleRegexBit, "[|]~[[").concat(t, "|~g;");
        cmd += "s~\\[\\[".concat(s, "\\|").concat(s, "\\]\\]~[[").concat(t, "]]~g");
      }
    } else {
      cmd += "s~\\[\\[".concat(currentArticleRegexBit, "\\]\\]~$1~g;");
      cmd += "s~\\[\\[".concat(currentArticleRegexBit, "[|](.*?)\\]\\]~$2~g");
    }
    cmd = "autoedit=".concat(encodeURIComponent(cmd));
    cmd += "&autoclick=".concat(encodeURIComponent(x.clickButton), "&actoken=").concat(encodeURIComponent(autoClickToken()));
    cmd += x.minor === null ? "" : "&autominor=".concat(encodeURIComponent(x.minor));
    cmd += x.watch === null ? "" : "&autowatch=".concat(encodeURIComponent(x.watch));
    cmd += "&autosummary=".concat(encodeURIComponent(x.summary));
    cmd += "&autoimpl=".concat(encodeURIComponent(popupString("autoedit_version")));
    return appendParamsToLink(lk, cmd);
  };
  const redirLink = (redirMatch, article) => {
    let ret = "";
    if (getValueOf("popupAppendRedirNavLinks") && getValueOf("popupNavLinks")) {
      ret += "<hr>";
      if (getValueOf("popupFixRedirs") && autoEdit !== void 0 && autoEdit) {
        ret += popupString("Redirects to: (Fix ");
        log("redirLink: newTarget=".concat(redirMatch));
        ret += addPopupShortcut(changeLinkTargetLink({
          newTarget: redirMatch,
          text: popupString("target"),
          hint: popupString("Fix this redirect, changing just the link target"),
          summary: simplePrintf(getValueOf("popupFixRedirsSummary"), [article.toString(), redirMatch]),
          oldTarget: article.toString(),
          clickButton: getValueOf("popupRedirAutoClick"),
          minor: true,
          watch: getValueOf("popupWatchRedirredPages")
        }), "R");
        ret += popupString(" or ");
        ret += addPopupShortcut(changeLinkTargetLink({
          newTarget: redirMatch,
          text: popupString("target & label"),
          hint: popupString("Fix this redirect, changing the link target and label"),
          summary: simplePrintf(getValueOf("popupFixRedirsSummary"), [article.toString(), redirMatch]),
          oldTarget: article.toString(),
          clickButton: getValueOf("popupRedirAutoClick"),
          minor: true,
          watch: getValueOf("popupWatchRedirredPages"),
          alsoChangeLabel: true
        }), "R");
        ret += popupString(")");
      } else {
        ret += popupString("Redirects") + popupString(" to ");
      }
      return ret;
    }
    return "<br> ".concat(popupString("Redirects")).concat(popupString(" to ")).concat(titledWikiLink({
      article: new Title().fromWikiText(redirMatch),
      action: "view",
      text: safeDecodeURI(redirMatch),
      title: popupString("Bypass redirect")
    }));
  };
  const arinLink = (l) => {
    if (!saneLinkCheck(l)) {
      return null;
    }
    if (!l.article.isIpUser() || !pg.wiki.wikimedia) {
      return null;
    }
    const uN = l.article.userName();
    return generalNavLink({
      url: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=".concat(encodeURIComponent(uN)),
      newWin: l.newWin,
      title: tprintf("Look up %s in ARIN whois database", [uN]),
      text: l.text,
      noPopup: 1
    });
  };
  const toolDbName = (cookieStyle) => {
    let ret = mw.config.get("wgDBname");
    if (!cookieStyle) {
      ret += "_p";
    }
    return ret;
  };
  const saneLinkCheck = (l) => {
    if (typeof l.article !== typeof {} || typeof l.text !== "string") {
      return false;
    }
    return true;
  };
  const editCounterLink = (l) => {
    if (!saneLinkCheck(l)) {
      return null;
    }
    if (!pg.wiki.wikimedia) {
      return null;
    }
    const uN = l.article.userName();
    const tool = getValueOf("popupEditCounterTool");
    let url;
    const defaultToolUrl = "//tools.wmflabs.org/supercount/index.php?user=$1&project=$2.$3";
    switch (tool) {
      case "custom":
        url = simplePrintf(getValueOf("popupEditCounterUrl"), [encodeURIComponent(uN), toolDbName()]);
        break;
      default: {
        const theWiki = pg.wiki.hostname.split(".");
        url = simplePrintf(defaultToolUrl, [encodeURIComponent(uN), theWiki[0], theWiki[1]]);
      }
    }
    return generalNavLink({
      url,
      title: tprintf("editCounterLinkHint", [uN]),
      newWin: l.newWin,
      text: l.text,
      noPopup: 1
    });
  };
  const editorListLink = (l) => {
    if (!saneLinkCheck(l)) {
      return null;
    }
    const article = l.article.articleFromTalkPage() || l.article;
    const url = "https://xtools.wmflabs.org/articleinfo/".concat(encodeURI(pg.wiki.hostname), "/").concat(article.urlString(), "?uselang=").concat(mw.config.get("wgUserLanguage"));
    return generalNavLink({
      url,
      title: tprintf("editorListHint", [article]),
      newWin: l.newWin,
      text: l.text,
      noPopup: 1
    });
  };
  const generalNavLink = (l) => {
    l.className = l.className === null ? "popupNavLink" : l.className;
    return generalLink(l);
  };
  const getHistoryInfo = (wikipage, whatNext) => {
    log("getHistoryInfo");
    getHistory(wikipage, whatNext ? (d) => {
      whatNext(processHistory(d));
    } : processHistory);
  };
  const getHistory = (wikipage, onComplete) => {
    log("getHistory");
    const url = "".concat(pg.wiki.apiwikibase, "?format=json&formatversion=2&action=query&prop=revisions&titles=").concat(new Title(wikipage).urlString(), "&rvlimit=").concat(getValueOf("popupHistoryLimit"));
    log("getHistory: url=".concat(url));
    return startDownload(url, "".concat(pg.idNumber, "history"), onComplete);
  };
  const processHistory = (download) => {
    const jsobj = getJsObj(download.data);
    try {
      const {
        revisions
      } = anyChild(jsobj.query.pages);
      const edits = [];
      var _iterator27 = _createForOfIteratorHelper(revisions), _step27;
      try {
        for (_iterator27.s(); !(_step27 = _iterator27.n()).done; ) {
          const revision = _step27.value;
          edits.push({
            oldid: revision.revid,
            editor: revision.user
          });
        }
      } catch (err) {
        _iterator27.e(err);
      } finally {
        _iterator27.f();
      }
      log("processed ".concat(edits.length, " edits"));
      return finishProcessHistory(edits, mw.config.get("wgUserName"));
    } catch {
      log("Something went wrong with JSON business");
      return finishProcessHistory([]);
    }
  };
  const finishProcessHistory = (edits, userName) => {
    const histInfo = {};
    histInfo.edits = edits;
    histInfo.userName = userName;
    for (let i = 0; i < edits.length; ++i) {
      if (histInfo.myLastEdit === void 0 && userName && edits[i].editor === userName) {
        histInfo.myLastEdit = {
          index: i,
          oldid: edits[i].oldid,
          previd: i === 0 ? null : edits[i - 1].oldid
        };
      }
      if (histInfo.firstNewEditor === void 0 && edits[i].editor !== edits[0].editor) {
        histInfo.firstNewEditor = {
          index: i,
          oldid: edits[i].oldid,
          previd: i === 0 ? null : edits[i - 1].oldid
        };
      }
    }
    return histInfo;
  };
  const defaultize = (x) => {
    if (pg.option[x] === null || pg.option[x] === void 0) {
      pg.option[x] = window[x] === void 0 ? pg.optionDefault[x] : window[x];
    }
  };
  const newOption = (x, def) => {
    pg.optionDefault[x] = def;
  };
  const setDefault = (x, def) => {
    return newOption(x, def);
  };
  const getValueOf = (varName) => {
    defaultize(varName);
    return pg.option[varName];
  };
  const setOptions = () => {
    let userIsSysop = false;
    if (mw.config.get("wgUserGroups")) {
      for (let g = 0; g < mw.config.get("wgUserGroups").length; ++g) {
        if (mw.config.get("wgUserGroups")[g] === "sysop") {
          userIsSysop = true;
        }
        if (mw.config.get("wgUserGroups")[g] === "steward") {
          userIsSysop = true;
        }
      }
    }
    newOption("popupDelay", 0.5);
    newOption("popupHideDelay", 0.5);
    newOption("simplePopups", false);
    newOption("popupStructure", "shortmenus");
    newOption("popupActionsMenu", true);
    newOption("popupSetupMenu", true);
    newOption("popupAdminLinks", userIsSysop);
    newOption("popupShortcutKeys", false);
    newOption("popupHistoricalLinks", true);
    newOption("popupOnlyArticleLinks", true);
    newOption("removeTitles", true);
    newOption("popupMaxWidth", 350);
    newOption("popupSimplifyMainLink", true);
    newOption("popupAppendRedirNavLinks", true);
    newOption("popupTocLinks", false);
    newOption("popupSubpopups", true);
    newOption(
      "popupDragHandle",
      false
      /* 'popupTopLinks' */
    );
    newOption("popupLazyPreviews", true);
    newOption("popupLazyDownloads", true);
    newOption("popupAllDabsStubs", false);
    newOption("popupDebugging", false);
    newOption("popupActiveNavlinks", true);
    newOption("popupModifier", false);
    newOption("popupModifierAction", "enable");
    newOption("popupDraggable", true);
    newOption("popupReview", false);
    newOption("popupLocale", false);
    newOption("popupDateTimeFormatterOptions", {
      year: "numeric",
      month: "long",
      day: "numeric",
      hour12: false,
      hour: "2-digit",
      minute: "2-digit",
      second: "2-digit"
    });
    newOption("popupDateFormatterOptions", {
      year: "numeric",
      month: "long",
      day: "numeric"
    });
    newOption("popupTimeFormatterOptions", {
      hour12: false,
      hour: "2-digit",
      minute: "2-digit",
      second: "2-digit"
    });
    newOption("popupImages", true);
    newOption("imagePopupsForImages", true);
    newOption("popupNeverGetThumbs", false);
    newOption("popupThumbAction", "imagepage");
    newOption("popupImageSize", 60);
    newOption("popupImageSizeLarge", 200);
    newOption("popupFixRedirs", false);
    newOption("popupRedirAutoClick", "wpDiff");
    newOption("popupFixDabs", false);
    newOption("popupDabsAutoClick", "wpDiff");
    newOption("popupRevertSummaryPrompt", false);
    newOption("popupMinorReverts", false);
    newOption("popupRedlinkRemoval", false);
    newOption("popupRedlinkAutoClick", "wpDiff");
    newOption("popupWatchDisambiggedPages", null);
    newOption("popupWatchRedirredPages", null);
    newOption("popupDabWiktionary", "last");
    newOption("popupNavLinks", true);
    newOption("popupNavLinkSeparator", " &sdot; ");
    newOption("popupLastEditLink", true);
    newOption("popupEditCounterTool", "supercount");
    newOption("popupEditCounterUrl", "");
    newOption("popupPreviews", true);
    newOption("popupSummaryData", true);
    newOption("popupMaxPreviewSentences", 5);
    newOption("popupMaxPreviewCharacters", 600);
    newOption("popupLastModified", true);
    newOption("popupPreviewKillTemplates", true);
    newOption("popupPreviewRawTemplates", true);
    newOption("popupPreviewFirstParOnly", true);
    newOption("popupPreviewCutHeadings", true);
    newOption("popupPreviewButton", false);
    newOption("popupPreviewButtonEvent", "click");
    newOption("popupPreviewDiffs", true);
    newOption("popupDiffMaxLines", 100);
    newOption("popupDiffContextLines", 2);
    newOption("popupDiffContextCharacters", 40);
    newOption("popupDiffDates", true);
    newOption("popupDiffDatePrinter", "toLocaleString");
    newOption("popupReviewedSummary", popupString("defaultpopupReviewedSummary"));
    newOption("popupFixDabsSummary", popupString("defaultpopupFixDabsSummary"));
    newOption("popupExtendedRevertSummary", popupString("defaultpopupExtendedRevertSummary"));
    newOption("popupRevertSummary", popupString("defaultpopupRevertSummary"));
    newOption("popupRevertToPreviousSummary", popupString("defaultpopupRevertToPreviousSummary"));
    newOption("popupQueriedRevertSummary", popupString("defaultpopupQueriedRevertSummary"));
    newOption("popupQueriedRevertToPreviousSummary", popupString("defaultpopupQueriedRevertToPreviousSummary"));
    newOption("popupFixRedirsSummary", popupString("defaultpopupFixRedirsSummary"));
    newOption("popupRedlinkSummary", popupString("defaultpopupRedlinkSummary"));
    newOption("popupRmDabLinkSummary", popupString("defaultpopupRmDabLinkSummary"));
    newOption("popupHistoryLimit", 50);
    newOption("popupFilters", [popupFilterStubDetect, popupFilterDisambigDetect, popupFilterPageSize, popupFilterCountLinks, popupFilterCountImages, popupFilterCountCategories, popupFilterLastModified]);
    newOption("extraPopupFilters", []);
    newOption("popupOnEditSelection", "cursor");
    newOption("popupPreviewHistory", true);
    newOption("popupImageLinks", true);
    newOption("popupCategoryMembers", true);
    newOption("popupUserInfo", true);
    newOption("popupHistoryPreviewLimit", 25);
    newOption("popupContribsPreviewLimit", 25);
    newOption("popupRevDelUrl", "//en.wikipedia.org/wiki/Wikipedia:Revision_deletion");
    newOption("popupShowGender", true);
    newOption("popupNewWindows", false);
    newOption("popupLinksNewWindow", {
      lastContrib: true,
      sinceMe: true
    });
    newOption("popupDabRegexp", "\\{\\{\\s*(d(ab|isamb(ig(uation)?)?)|(((geo|hn|road?|school|number)dis)|[234][lc][acw]|(road|ship)index))\\s*(\\|[^}]*)?\\}\\}|is a .*disambiguation.*page");
    newOption("popupAnchorRegexp", "anchors?");
    newOption("popupStubRegexp", "(sect)?stub[}][}]|This .*-related article is a .*stub");
    newOption("popupImageVarsRegexp", "image|image_(?:file|skyline|name|flag|seal)|cover|badge|logo");
  };
  pg.string = {
    // summary data, searching etc.
    article: "article",
    category: "category",
    categories: "categories",
    image: "image",
    images: "images",
    stub: "stub",
    "section stub": "section stub",
    "Empty page": "Empty page",
    kB: "kB",
    bytes: "bytes",
    day: "day",
    days: "days",
    hour: "hour",
    hours: "hours",
    minute: "minute",
    minutes: "minutes",
    second: "second",
    seconds: "seconds",
    week: "week",
    weeks: "weeks",
    search: "search",
    SearchHint: "Find English Wikipedia articles containing %s",
    web: "web",
    global: "global",
    // article-related actions and info
    // (some actions also apply to user pages)
    actions: "actions",
    popupsMenu: "popups",
    togglePreviewsHint: "Toggle preview generation in popups on this page",
    "enable previews": "enable previews",
    "disable previews": "disable previews",
    "toggle previews": "toggle previews",
    "show preview": "show preview",
    reset: "reset",
    "more...": "more...",
    disable: "disable popups",
    disablePopupsHint: "Disable popups on this page. Reload page to re-enable.",
    historyfeedHint: "RSS feed of recent changes to this page",
    purgePopupsHint: "Reset popups, clearing all cached popup data.",
    PopupsHint: "Reset popups, clearing all cached popup data.",
    spacebar: "space",
    view: "view",
    "view article": "view article",
    viewHint: "Go to %s",
    talk: "talk",
    "talk page": "talk page",
    "this&nbsp;revision": "this&nbsp;revision",
    "revision %s of %s": "revision %s of %s",
    "Revision %s of %s": "Revision %s of %s",
    "the revision prior to revision %s of %s": "the revision prior to revision %s of %s",
    "Toggle image size": "Click to toggle image size",
    del: "del",
    delete: "delete",
    deleteHint: "Delete %s",
    undeleteShort: "un",
    UndeleteHint: "Show the deletion history for %s",
    protect: "protect",
    protectHint: "Restrict editing rights to %s",
    unprotectShort: "un",
    unprotectHint: "Allow %s to be edited by anyone again",
    "send thanks": "send thanks",
    ThanksHint: "Send a thank you notification to this user",
    move: "move",
    "move page": "move page",
    MovepageHint: "Change the title of %s",
    edit: "edit",
    "edit article": "edit article",
    editHint: "Change the content of %s",
    "edit talk": "edit talk",
    new: "new",
    "new topic": "new topic",
    newSectionHint: "Start a new section on %s",
    "null edit": "null edit",
    nullEditHint: "Submit an edit to %s, making no changes ",
    hist: "hist",
    history: "history",
    historyHint: "List the changes made to %s",
    last: "prev",
    lastEdit: "lastEdit",
    "mark patrolled": "mark patrolled",
    markpatrolledHint: "Mark this edit as patrolled",
    "Could not marked this edit as patrolled": "Could not marked this edit as patrolled",
    "show last edit": "most recent edit",
    "Show the last edit": "Show the effects of the most recent change",
    lastContrib: "lastContrib",
    "last set of edits": "latest edits",
    lastContribHint: "Show the net effect of changes made by the last editor",
    cur: "cur",
    diffCur: "diffCur",
    "Show changes since revision %s": "Show changes since revision %s",
    "%s old": "%s old",
    oldEdit: "oldEdit",
    purge: "purge",
    purgeHint: "Demand a fresh copy of %s",
    raw: "source",
    rawHint: "Download the source of %s",
    render: "simple",
    renderHint: "Show a plain HTML version of %s",
    "Show the edit made to get revision": "Show the edit made to get revision",
    sinceMe: "sinceMe",
    "changes since mine": "diff my edit",
    sinceMeHint: "Show changes since my last edit",
    "Couldn't find an edit by %s\nin the last %s edits to\n%s": "Couldn't find an edit by %s\nin the last %s edits to\n%s",
    eds: "eds",
    editors: "editors",
    editorListHint: "List the users who have edited %s",
    related: "related",
    relatedChanges: "relatedChanges",
    "related changes": "related changes",
    RecentchangeslinkedHint: "Show changes in articles related to %s",
    editOld: "editOld",
    rv: "rv",
    revert: "revert",
    revertHint: "Revert to %s",
    defaultpopupReviewedSummary: "Accepted by reviewing the [[Special:diff/%s/%s|difference]] between this version and previously accepted version using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupRedlinkSummary: "Removing link to empty page [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupFixDabsSummary: "Disambiguate [[%s]] to [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupFixRedirsSummary: "Redirect bypass from [[%s]] to [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupExtendedRevertSummary: "Revert to revision dated %s by %s, oldid %s using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupRevertToPreviousSummary: "Revert to the revision prior to revision %s using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupRevertSummary: "Revert to revision %s using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupQueriedRevertToPreviousSummary: "Revert to the revision prior to revision $1 dated $2 by $3 using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupQueriedRevertSummary: "Revert to revision $1 dated $2 by $3 using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    defaultpopupRmDabLinkSummary: "Remove link to dab page [[%s]] using [[:enwiki:Wikipedia:Tools/Navigation_popups|popups]]",
    Redirects: "Redirects",
    " to ": " to ",
    "Bypass redirect": "Bypass redirect",
    "Fix this redirect": "Fix this redirect",
    disambig: "disambig",
    disambigHint: "Disambiguate this link to [[%s]]",
    "Click to disambiguate this link to:": "Click to disambiguate this link to:",
    "remove this link": "remove this link",
    "remove all links to this page from this article": "remove all links to this page from this article",
    "remove all links to this disambig page from this article": "remove all links to this disambig page from this article",
    mainlink: "mainlink",
    wikiLink: "wikiLink",
    wikiLinks: "wikiLinks",
    "links here": "links here",
    whatLinksHere: "whatLinksHere",
    "what links here": "what links here",
    WhatlinkshereHint: "List the pages that are hyperlinked to %s",
    unwatchShort: "un",
    watchThingy: "watch",
    watchHint: "Add %s to my watchlist",
    unwatchHint: "Remove %s from my watchlist",
    "Only found one editor: %s made %s edits": "Only found one editor: %s made %s edits",
    "%s seems to be the last editor to the page %s": "%s seems to be the last editor to the page %s",
    rss: "rss",
    // diff previews
    "Diff truncated for performance reasons": "Diff truncated for performance reasons",
    "Old revision": "Old revision",
    "New revision": "New revision",
    "Something went wrong :-(": "Something went wrong :-(",
    "Empty revision, maybe non-existent": "Empty revision, maybe non-existent",
    "Unknown date": "Unknown date",
    // other special previews
    "Empty category": "Empty category",
    "Category members (%s shown)": "Category members (%s shown)",
    "No image links found": "No image links found",
    "File links": "File links",
    "No image found": "No image found",
    "Image from Commons": "Image from Commons",
    "Description page": "Description page",
    "Alt text:": "Alt text:",
    revdel: "Hidden revision",
    // user-related actions and info
    user: "user",
    "user&nbsp;page": "user&nbsp;page",
    "user talk": "user talk",
    "edit user talk": "edit user talk",
    "leave comment": "leave comment",
    email: "email",
    "email user": "email user",
    EmailuserHint: "Send an email to %s",
    space: "space",
    PrefixIndexHint: "Show pages in the userspace of %s",
    count: "count",
    "edit counter": "edit counter",
    editCounterLinkHint: "Count the contributions made by %s",
    contribs: "contribs",
    contributions: "contributions",
    deletedContribs: "deleted contributions",
    DeletedcontributionsHint: "List deleted edits made by %s",
    ContributionsHint: "List the contributions made by %s",
    log: "log",
    "user log": "user log",
    userLogHint: "Show %s's user log",
    arin: "ARIN lookup",
    "Look up %s in ARIN whois database": "Look up %s in the ARIN whois database",
    unblockShort: "un",
    block: "block",
    "block user": "block user",
    IpblocklistHint: "Unblock %s",
    BlockipHint: "Prevent %s from editing",
    "block log": "block log",
    blockLogHint: "Show the block log for %s",
    protectLogHint: "Show the protection log for %s",
    pageLogHint: "Show the page log for %s",
    deleteLogHint: "Show the deletion log for %s",
    "Invalid %s %s": "The option %s is invalid: %s",
    "No backlinks found": "No backlinks found",
    " and more": " and more",
    undo: "undo",
    undoHint: "undo this edit",
    "Download preview data": "Download preview data",
    "Invalid or IP user": "Invalid or IP user",
    "Not a registered username": "Not a registered username",
    BLOCKED: "BLOCKED",
    "Has blocks": "Has blocks",
    " edits since: ": " edits since: ",
    "last edit on ": "last edit on ",
    "he/him": "he/him",
    "she/her": "she/her",
    // Autoediting
    "Enter a non-empty edit summary or press cancel to abort": "Enter a non-empty edit summary or press cancel to abort",
    "Failed to get revision information, please edit manually.\n\n": "Failed to get revision information, please edit manually.\n\n",
    "The %s button has been automatically clicked. Please wait for the next page to load.": "The %s button has been automatically clicked. Please wait for the next page to load.",
    "Could not find button %s. Please check the settings in your javascript file.": "Could not find button %s. Please check the settings in your javascript file.",
    // Popups setup
    "Open full-size image": "Open full-size image",
    autoedit_version: "np20140416"
  };
  const popupString = (str) => {
    if (message !== void 0 && message && message[str]) {
      return message[str];
    }
    if (pg.string[str]) {
      return pg.string[str];
    }
    return str;
  };
  const tprintf = (str, subs) => {
    if (typeof subs !== typeof []) {
      subs = [subs];
    }
    return simplePrintf(popupString(str), subs);
  };
  if (document.readyState === "complete") {
    autoEdit();
  } else {
    $(window).on("load", autoEdit);
  }
  (() => {
    let once = true;
    const dynamicContentHandler = ($content) => {
      if ($content.attr("id") === "mw-content-text" && once) {
        once = false;
        return;
      }
      const registerHooksForVisibleNavpops = () => {
        for (let i = 0; pg.current.links && i < pg.current.links.length; i++) {
          const navpop = pg.current.links[i].navpopup;
          if (!navpop || !navpop.isVisible()) {
            continue;
          }
          Navpopup.tracker.addHook(posCheckerHook(navpop));
        }
      };
      const doIt = () => {
        registerHooksForVisibleNavpops();
        $content.each((_index, element) => {
          element.ranSetupTooltipsAlready = false;
          setupTooltips(element);
        });
      };
      setupPopups(doIt);
    };
    mw.hook("wikipage.content").add(dynamicContentHandler);
    mw.hook("ext.echo.overlay.beforeShowingOverlay").add(($overlay) => {
      dynamicContentHandler($overlay.find(".mw-echo-state"));
    });
  })();
};
//! src/Navigation_popups/Navigation_popups.ts
$(popups);

})();

/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXRydW5jLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjAvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMC9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2hpZnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4wL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmZsYWdzLmpzIiwgInNyYy9OYXZpZ2F0aW9uX3BvcHVwcy9tb2R1bGVzL2FwaS50cyIsICJzcmMvTmF2aWdhdGlvbl9wb3B1cHMvbW9kdWxlcy9zdHJpbmcudHMiLCAic3JjL05hdmlnYXRpb25fcG9wdXBzL21vZHVsZXMvY29yZS5qcyIsICJzcmMvTmF2aWdhdGlvbl9wb3B1cHMvTmF2aWdhdGlvbl9wb3B1cHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIid1c2Ugc3RyaWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIGNoZWNrKHR5cGVvZiB0aGlzID09ICdvYmplY3QnICYmIHRoaXMpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT09IDc7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tZnVuY3Rpb24tcHJvdG90eXBlLWJpbmQgLS0gc2FmZVxuICB2YXIgdGVzdCA9IChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pLmJpbmQoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiB0eXBlb2YgdGVzdCAhPSAnZnVuY3Rpb24nIHx8IHRlc3QuaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpO1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyBjYWxsLmJpbmQoY2FsbCkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGNhbGwsIGFyZ3VtZW50cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbnZhciB1bmN1cnJ5VGhpc1dpdGhCaW5kID0gTkFUSVZFX0JJTkQgJiYgRnVuY3Rpb25Qcm90b3R5cGUuYmluZC5iaW5kKGNhbGwsIGNhbGwpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gdW5jdXJyeVRoaXNXaXRoQmluZCA6IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKHt9LnRvU3RyaW5nKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHN0cmluZ1NsaWNlKHRvU3RyaW5nKGl0KSwgOCwgLTEpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09PSAnU3RyaW5nJyA/IHNwbGl0KGl0LCAnJykgOiAkT2JqZWN0KGl0KTtcbn0gOiAkT2JqZWN0O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIHdlIGNhbid0IHVzZSBqdXN0IGBpdCA9PSBudWxsYCBzaW5jZSBvZiBgZG9jdW1lbnQuYWxsYCBzcGVjaWFsIGNhc2Vcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3QtYWVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IG51bGwgfHwgaXQgPT09IHVuZGVmaW5lZDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZChpdCkpIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90XG52YXIgZG9jdW1lbnRBbGwgPSB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCcgJiYgZG9jdW1lbnQuYWxsO1xuXG4vLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50ID09PSBkb2N1bWVudEFsbDtcbn0gOiBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pIDogZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKHt9LmlzUHJvdG90eXBlT2YpO1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIG5hdmlnYXRvciAhPSAndW5kZWZpbmVkJyAmJiBTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgJyc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBEZW5vID0gZ2xvYmFsLkRlbm87XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnMgfHwgRGVubyAmJiBEZW5vLnZlcnNpb247XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgLy8gaW4gb2xkIENocm9tZSwgdmVyc2lvbnMgb2YgVjggaXNuJ3QgVjggPSBDaHJvbWUgLyAxMFxuICAvLyBidXQgdGhlaXIgY29ycmVjdCB2ZXJzaW9ucyBhcmUgbm90IGludGVyZXN0aW5nIGZvciB1c1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gPiAwICYmIG1hdGNoWzBdIDwgNCA/IDEgOiArKG1hdGNoWzBdICsgbWF0Y2hbMV0pO1xufVxuXG4vLyBCcm93c2VyRlMgTm9kZUpTIGBwcm9jZXNzYCBwb2x5ZmlsbCBpbmNvcnJlY3RseSBzZXQgYC52OGAgdG8gYDAuMGBcbi8vIHNvIGNoZWNrIGB1c2VyQWdlbnRgIGV2ZW4gaWYgYC52OGAgZXhpc3RzLCBidXQgMFxuaWYgKCF2ZXJzaW9uICYmIHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9ICttYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgJFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCdzeW1ib2wgZGV0ZWN0aW9uJyk7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGBnZXQtb3duLXByb3BlcnR5LXN5bWJvbHNgIHBvbHlmaWxsIHN5bWJvbHMgY29udmVydGVkIHRvIG9iamVjdCBhcmUgbm90IFN5bWJvbCBpbnN0YW5jZXNcbiAgLy8gbmI6IERvIG5vdCBjYWxsIGBTdHJpbmdgIGRpcmVjdGx5IHRvIGF2b2lkIHRoaXMgYmVpbmcgb3B0aW1pemVkIG91dCB0byBgc3ltYm9sKycnYCB3aGljaCB3aWxsLFxuICAvLyBvZiBjb3Vyc2UsIGZhaWwuXG4gIHJldHVybiAhJFN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8XG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAhU3ltYm9sLnNoYW0gJiYgVjhfVkVSU0lPTiAmJiBWOF9WRVJTSU9OIDwgNDE7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NhbGxhYmxlKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcblxuLy8gYEdldE1ldGhvZGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldG1ldGhvZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoViwgUCkge1xuICB2YXIgZnVuYyA9IFZbUF07XG4gIHJldHVybiBpc051bGxPclVuZGVmaW5lZChmdW5jKSA/IHVuZGVmaW5lZCA6IGFDYWxsYWJsZShmdW5jKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBPcmRpbmFyeVRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoaXNDYWxsYWJsZShmbiA9IGlucHV0LnZhbHVlT2YpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAocHJlZiAhPT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWxUaGlzW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5cbihzdG9yZS52ZXJzaW9ucyB8fCAoc3RvcmUudmVyc2lvbnMgPSBbXSkpLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4zNy4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjQgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLFxuICBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zNy4wL0xJQ0VOU0UnLFxuICBzb3VyY2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcydcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlIHx8IHt9KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJyArIChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyB0b1N0cmluZygrK2lkICsgcG9zdGZpeCwgMzYpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sWydmb3InXSB8fCBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHtcbiAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpXG4gICAgICA/IFN5bWJvbFtuYW1lXVxuICAgICAgOiBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBleG90aWNUb1ByaW0gPSBnZXRNZXRob2QoaW5wdXQsIFRPX1BSSU1JVElWRSk7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChleG90aWNUb1ByaW0pIHtcbiAgICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ2RlZmF1bHQnO1xuICAgIHJlc3VsdCA9IGNhbGwoZXhvdGljVG9QcmltLCBpbnB1dCwgcHJlZik7XG4gICAgaWYgKCFpc09iamVjdChyZXN1bHQpIHx8IGlzU3ltYm9sKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gIH1cbiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdudW1iZXInO1xuICByZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgcHJlZik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcblxuLy8gYFRvUHJvcGVydHlLZXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3Byb3BlcnR5a2V5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsICdzdHJpbmcnKTtcbiAgcmV0dXJuIGlzU3ltYm9sKGtleSkgPyBrZXkgOiBrZXkgKyAnJztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rcyB0byBJRTggZm9yIGl0cyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPT0gNztcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBWOCB+IENocm9tZSAzNi1cbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMzMzRcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAncHJvdG90eXBlJywge1xuICAgIHZhbHVlOiA0MixcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSkucHJvdG90eXBlICE9PSA0Mjtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyICRTdHJpbmcgPSBTdHJpbmc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogVHlwZShhcmd1bWVudCkgaXMgT2JqZWN0YFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzT2JqZWN0KGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcigkU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgRU5VTUVSQUJMRSA9ICdlbnVtZXJhYmxlJztcbnZhciBDT05GSUdVUkFCTEUgPSAnY29uZmlndXJhYmxlJztcbnZhciBXUklUQUJMRSA9ICd3cml0YWJsZSc7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmICh0eXBlb2YgTyA9PT0gJ2Z1bmN0aW9uJyAmJiBQID09PSAncHJvdG90eXBlJyAmJiAndmFsdWUnIGluIEF0dHJpYnV0ZXMgJiYgV1JJVEFCTEUgaW4gQXR0cmlidXRlcyAmJiAhQXR0cmlidXRlc1tXUklUQUJMRV0pIHtcbiAgICB2YXIgY3VycmVudCA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudFtXUklUQUJMRV0pIHtcbiAgICAgIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICAgICAgQXR0cmlidXRlcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBDT05GSUdVUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbQ09ORklHVVJBQkxFXSA6IGN1cnJlbnRbQ09ORklHVVJBQkxFXSxcbiAgICAgICAgZW51bWVyYWJsZTogRU5VTUVSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tFTlVNRVJBQkxFXSA6IGN1cnJlbnRbRU5VTUVSQUJMRV0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH0gcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbn0gOiAkZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IG5ldyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldERlc2NyaXB0b3IgPSBERVNDUklQVE9SUyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgRVhJU1RTID0gaGFzT3duKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpO1xuLy8gYWRkaXRpb25hbCBwcm90ZWN0aW9uIGZyb20gbWluaWZpZWQgLyBtYW5nbGVkIC8gZHJvcHBlZCBmdW5jdGlvbiBuYW1lc1xudmFyIFBST1BFUiA9IEVYSVNUUyAmJiAoZnVuY3Rpb24gc29tZXRoaW5nKCkgeyAvKiBlbXB0eSAqLyB9KS5uYW1lID09PSAnc29tZXRoaW5nJztcbnZhciBDT05GSUdVUkFCTEUgPSBFWElTVFMgJiYgKCFERVNDUklQVE9SUyB8fCAoREVTQ1JJUFRPUlMgJiYgZ2V0RGVzY3JpcHRvcihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKS5jb25maWd1cmFibGUpKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEVYSVNUUzogRVhJU1RTLFxuICBQUk9QRVI6IFBST1BFUixcbiAgQ09ORklHVVJBQkxFOiBDT05GSUdVUkFCTEVcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvbi50b1N0cmluZyk7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICghaXNDYWxsYWJsZShzdG9yZS5pbnNwZWN0U291cmNlKSkge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcoaXQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNDYWxsYWJsZShXZWFrTWFwKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKFdlYWtNYXApKTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlYWstbWFwLWJhc2ljLWRldGVjdGlvbicpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCA9ICdPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHtcbiAgdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7XG4gIHN0b3JlLmhhcyA9IHN0b3JlLmhhcztcbiAgc3RvcmUuc2V0ID0gc3RvcmUuc2V0O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChzdG9yZS5oYXMoaXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICBzdG9yZS5zZXQoaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5nZXQoaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gc3RvcmUuaGFzKGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKGhhc093bihpdCwgU1RBVEUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJykuQ09ORklHVVJBQkxFO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgJFN0cmluZyA9IFN0cmluZztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG5cbnZhciBDT05GSUdVUkFCTEVfTEVOR1RIID0gREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgJ2xlbmd0aCcsIHsgdmFsdWU6IDggfSkubGVuZ3RoICE9PSA4O1xufSk7XG5cbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxudmFyIG1ha2VCdWlsdEluID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKHN0cmluZ1NsaWNlKCRTdHJpbmcobmFtZSksIDAsIDcpID09PSAnU3ltYm9sKCcpIHtcbiAgICBuYW1lID0gJ1snICsgcmVwbGFjZSgkU3RyaW5nKG5hbWUpLCAvXlN5bWJvbFxcKChbXildKilcXCkuKiQvLCAnJDEnKSArICddJztcbiAgfVxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdldHRlcikgbmFtZSA9ICdnZXQgJyArIG5hbWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2V0dGVyKSBuYW1lID0gJ3NldCAnICsgbmFtZTtcbiAgaWYgKCFoYXNPd24odmFsdWUsICduYW1lJykgfHwgKENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FICYmIHZhbHVlLm5hbWUgIT09IG5hbWUpKSB7XG4gICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCB7IHZhbHVlOiBuYW1lLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgZWxzZSB2YWx1ZS5uYW1lID0gbmFtZTtcbiAgfVxuICBpZiAoQ09ORklHVVJBQkxFX0xFTkdUSCAmJiBvcHRpb25zICYmIGhhc093bihvcHRpb25zLCAnYXJpdHknKSAmJiB2YWx1ZS5sZW5ndGggIT09IG9wdGlvbnMuYXJpdHkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ2xlbmd0aCcsIHsgdmFsdWU6IG9wdGlvbnMuYXJpdHkgfSk7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAob3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgJ2NvbnN0cnVjdG9yJykgJiYgb3B0aW9ucy5jb25zdHJ1Y3Rvcikge1xuICAgICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ3Byb3RvdHlwZScsIHsgd3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIC8vIGluIFY4IH4gQ2hyb21lIDUzLCBwcm90b3R5cGVzIG9mIHNvbWUgbWV0aG9kcywgbGlrZSBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AsIGFyZSBub24td3JpdGFibGVcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnByb3RvdHlwZSkgdmFsdWUucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgaWYgKCFoYXNPd24oc3RhdGUsICdzb3VyY2UnKSkge1xuICAgIHN0YXRlLnNvdXJjZSA9IGpvaW4oVEVNUExBVEUsIHR5cGVvZiBuYW1lID09ICdzdHJpbmcnID8gbmFtZSA6ICcnKTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuXG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRlbmQtbmF0aXZlIC0tIHJlcXVpcmVkXG5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBtYWtlQnVpbHRJbihmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUodGhpcykgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0sICd0b1N0cmluZycpO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIG1ha2VCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zLmVudW1lcmFibGU7XG4gIHZhciBuYW1lID0gb3B0aW9ucy5uYW1lICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5hbWUgOiBrZXk7XG4gIGlmIChpc0NhbGxhYmxlKHZhbHVlKSkgbWFrZUJ1aWx0SW4odmFsdWUsIG5hbWUsIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIGRlZmluZUdsb2JhbFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdGlvbnMudW5zYWZlKSBkZWxldGUgT1trZXldO1xuICAgICAgZWxzZSBpZiAoT1trZXldKSBzaW1wbGUgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogIW9wdGlvbnMubm9uQ29uZmlndXJhYmxlLFxuICAgICAgd3JpdGFibGU6ICFvcHRpb25zLm5vbldyaXRhYmxlXG4gICAgfSk7XG4gIH0gcmV0dXJuIE87XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYE1hdGgudHJ1bmNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLnRydW5jXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC10cnVuYyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgudHJ1bmMgfHwgZnVuY3Rpb24gdHJ1bmMoeCkge1xuICB2YXIgbiA9ICt4O1xuICByZXR1cm4gKG4gPiAwID8gZmxvb3IgOiBjZWlsKShuKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRydW5jID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtdHJ1bmMnKTtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IHRydW5jKG51bWJlcik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBsZW4gPSB0b0ludGVnZXJPckluZmluaXR5KGFyZ3VtZW50KTtcbiAgcmV0dXJuIGxlbiA+IDAgPyBtaW4obGVuLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG4vLyBgTGVuZ3RoT2ZBcnJheUxpa2VgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1sZW5ndGhvZmFycmF5bGlrZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0b0xlbmd0aChvYmoubGVuZ3RoKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9PSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9PSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuICBpbmRleE9mOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KGtleXMsIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgZXhjZXB0aW9ucykge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkgJiYgIShleGNlcHRpb25zICYmIGhhc093bihleGNlcHRpb25zLCBrZXkpKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH1cbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT09IE5BVElWRSA/IGZhbHNlXG4gICAgOiBpc0NhbGxhYmxlKGRldGVjdGlvbikgPyBmYWlscyhkZXRlY3Rpb24pXG4gICAgOiAhIWRldGVjdGlvbjtcbn07XG5cbnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlcGxhY2VtZW50LCAnLicpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgZGF0YSA9IGlzRm9yY2VkLmRhdGEgPSB7fTtcbnZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7XG52YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJztcblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgICAgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiAgb3B0aW9ucy5uYW1lICAgICAgICAgICAtIHRoZSAubmFtZSBvZiB0aGUgZnVuY3Rpb24gaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGtleVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSAmJiBnbG9iYWxbVEFSR0VUXS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5kb250Q2FsbEdldFNldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHNvdXJjZVByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cbiAgICBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmd1bWVudCkge1xuICByZXR1cm4gY2xhc3NvZihhcmd1bWVudCkgPT09ICdBcnJheSc7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gU2FmYXJpIDwgMTMgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaW4gdGhpcyBjYXNlXG52YXIgU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID0gREVTQ1JJUFRPUlMgJiYgIWZ1bmN0aW9uICgpIHtcbiAgLy8gbWFrZXMgbm8gc2Vuc2Ugd2l0aG91dCBwcm9wZXIgc3RyaWN0IG1vZGUgc3VwcG9ydFxuICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5sZW5ndGggPSAxO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgfVxufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNJTEVOVF9PTl9OT05fV1JJVEFCTEVfTEVOR1RIX1NFVCA/IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgaWYgKGlzQXJyYXkoTykgJiYgIWdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCAnbGVuZ3RoJykud3JpdGFibGUpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IHNldCByZWFkIG9ubHkgLmxlbmd0aCcpO1xuICB9IHJldHVybiBPLmxlbmd0aCA9IGxlbmd0aDtcbn0gOiBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gIHJldHVybiBPLmxlbmd0aCA9IGxlbmd0aDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBzZXRBcnJheUxlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoJyk7XG52YXIgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXInKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgSU5DT1JSRUNUX1RPX0xFTkdUSCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFtdLnB1c2guY2FsbCh7IGxlbmd0aDogMHgxMDAwMDAwMDAgfSwgMSkgIT09IDQyOTQ5NjcyOTc7XG59KTtcblxuLy8gVjggPD0gMTIxIGFuZCBTYWZhcmkgPD0gMTUuNDsgRkYgPCAyMyB0aHJvd3MgSW50ZXJuYWxFcnJvclxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTI2ODFcbnZhciBwcm9wZXJFcnJvck9uTm9uV3JpdGFibGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkucHVzaCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgfVxufTtcblxudmFyIEZPUkNFRCA9IElOQ09SUkVDVF9UT19MRU5HVEggfHwgIXByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCgpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnB1c2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucHVzaFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGFyaXR5OiAxLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIHB1c2g6IGZ1bmN0aW9uIHB1c2goaXRlbSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKGxlbiArIGFyZ0NvdW50KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ0NvdW50OyBpKyspIHtcbiAgICAgIE9bbGVuXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGxlbisrO1xuICAgIH1cbiAgICBzZXRBcnJheUxlbmd0aChPLCBsZW4pO1xuICAgIHJldHVybiBsZW47XG4gIH1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBQKSB7XG4gIGlmICghZGVsZXRlIE9bUF0pIHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3QgZGVsZXRlIHByb3BlcnR5ICcgKyB0cnlUb1N0cmluZyhQKSArICcgb2YgJyArIHRyeVRvU3RyaW5nKE8pKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBzZXRBcnJheUxlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoJyk7XG52YXIgZGVsZXRlUHJvcGVydHlPclRocm93ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdycpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyJyk7XG5cbi8vIElFOC1cbnZhciBJTkNPUlJFQ1RfUkVTVUxUID0gW10udW5zaGlmdCgwKSAhPT0gMTtcblxuLy8gVjggfiBDaHJvbWUgPCA3MSBhbmQgU2FmYXJpIDw9IDE1LjQsIEZGIDwgMjMgdGhyb3dzIEludGVybmFsRXJyb3JcbnZhciBwcm9wZXJFcnJvck9uTm9uV3JpdGFibGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkudW5zaGlmdCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgfVxufTtcblxudmFyIEZPUkNFRCA9IElOQ09SUkVDVF9SRVNVTFQgfHwgIXByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCgpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnVuc2hpZnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUudW5zaGlmdFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGFyaXR5OiAxLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIHVuc2hpZnQ6IGZ1bmN0aW9uIHVuc2hpZnQoaXRlbSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKGFyZ0NvdW50KSB7XG4gICAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgYXJnQ291bnQpO1xuICAgICAgdmFyIGsgPSBsZW47XG4gICAgICB3aGlsZSAoay0tKSB7XG4gICAgICAgIHZhciB0byA9IGsgKyBhcmdDb3VudDtcbiAgICAgICAgaWYgKGsgaW4gTykgT1t0b10gPSBPW2tdO1xuICAgICAgICBlbHNlIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhPLCB0byk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFyZ0NvdW50OyBqKyspIHtcbiAgICAgICAgT1tqXSA9IGFyZ3VtZW50c1tqXTtcbiAgICAgIH1cbiAgICB9IHJldHVybiBzZXRBcnJheUxlbmd0aChPLCBsZW4gKyBhcmdDb3VudCk7XG4gIH1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBtYWtlQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYWtlLWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgaWYgKGRlc2NyaXB0b3IuZ2V0KSBtYWtlQnVpbHRJbihkZXNjcmlwdG9yLmdldCwgbmFtZSwgeyBnZXR0ZXI6IHRydWUgfSk7XG4gIGlmIChkZXNjcmlwdG9yLnNldCkgbWFrZUJ1aWx0SW4oZGVzY3JpcHRvci5zZXQsIG5hbWUsIHsgc2V0dGVyOiB0cnVlIH0pO1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkuZih0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Ncbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmhhc0luZGljZXMpIHJlc3VsdCArPSAnZCc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnVuaWNvZGVTZXRzKSByZXN1bHQgKz0gJ3YnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yJyk7XG52YXIgcmVnRXhwRmxhZ3MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcuJywgJ2QnKSAtPiAvLi9kIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBJTkRJQ0VTX1NVUFBPUlQgPSB0cnVlO1xuICB0cnkge1xuICAgIFJlZ0V4cCgnLicsICdkJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgSU5ESUNFU19TVVBQT1JUID0gZmFsc2U7XG4gIH1cblxuICB2YXIgTyA9IHt9O1xuICAvLyBtb2Rlcm4gVjggYnVnXG4gIHZhciBjYWxscyA9ICcnO1xuICB2YXIgZXhwZWN0ZWQgPSBJTkRJQ0VTX1NVUFBPUlQgPyAnZGdpbXN5JyA6ICdnaW1zeSc7XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChrZXksIGNocikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxscyArPSBjaHI7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IH0pO1xuICB9O1xuXG4gIHZhciBwYWlycyA9IHtcbiAgICBkb3RBbGw6ICdzJyxcbiAgICBnbG9iYWw6ICdnJyxcbiAgICBpZ25vcmVDYXNlOiAnaScsXG4gICAgbXVsdGlsaW5lOiAnbScsXG4gICAgc3RpY2t5OiAneSdcbiAgfTtcblxuICBpZiAoSU5ESUNFU19TVVBQT1JUKSBwYWlycy5oYXNJbmRpY2VzID0gJ2QnO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYWlycykgYWRkR2V0dGVyKGtleSwgcGFpcnNba2V5XSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihSZWdFeHBQcm90b3R5cGUsICdmbGFncycpLmdldC5jYWxsKE8pO1xuXG4gIHJldHVybiByZXN1bHQgIT09IGV4cGVjdGVkIHx8IGNhbGxzICE9PSBleHBlY3RlZDtcbn0pO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5pZiAoRk9SQ0VEKSBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZWdFeHBGbGFnc1xufSk7XG4iLCAiaW1wb3J0IHtpbml0TXdBcGl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbmNvbnN0IGFwaTogbXcuQXBpID0gaW5pdE13QXBpKCdOYXZpZ2F0aW9uIHBvcHVwcy8xLjAnKTtcblxuZXhwb3J0IHthcGl9O1xuIiwgIi8vIFRyYW5zbGF0YWJsZSBzdHJpbmdzXG5jb25zdCBtZXNzYWdlOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHtcblx0Ly8gc3VtbWFyeSBkYXRhLCBzZWFyY2hpbmcgZXRjLlxuXHRhcnRpY2xlOiB3aW5kb3cud2dVTFMoJ+adoeebricsICfmop3nm64nKSxcblx0Y2F0ZWdvcnk6IHdpbmRvdy53Z1VMUygn5Liq5YiG57G7JywgJ+WAi+WIhumhnicpLFxuXHRjYXRlZ29yaWVzOiB3aW5kb3cud2dVTFMoJ+S4quWIhuexuycsICflgIvliIbpoZ4nKSxcblx0aW1hZ2U6IHdpbmRvdy53Z1VMUygn5Liq5paH5Lu2JywgJ+WAi+aqlOahiCcpLFxuXHRpbWFnZXM6IHdpbmRvdy53Z1VMUygn5Liq5paH5Lu2JywgJ+WAi+aqlOahiCcpLFxuXHRzdHViOiAn5bCP5L2c5ZOBJyxcblx0J3NlY3Rpb24gc3R1Yic6IHdpbmRvdy53Z1VMUygn5bCP56ug6IqCJywgJ+Wwj+eroOevgCcpLFxuXHQnRW1wdHkgcGFnZSc6IHdpbmRvdy53Z1VMUygn56m66aG16Z2iJywgJ+epuumggemdoicpLFxuXHRrQjogd2luZG93LndnVUxTKCfljYPlrZfoioI8c3ViPu+8iOS7pTEwMDDkuLrkuIDov5vvvIk8L3N1Yj4nLCAn5Y2D5L2N5YWD57WEPHN1Yj7vvIjku6UxMDAw54K65LiA6YCy77yJPC9zdWI+JyksXG5cdGJ5dGVzOiB3aW5kb3cud2dVTFMoJ+Wtl+iKgicsICfkvY3lhYPntYQnKSxcblx0ZGF5OiAn5aSpJyxcblx0ZGF5czogJ+WkqScsXG5cdGhvdXI6IHdpbmRvdy53Z1VMUygn5bCP5pe2JywgJ+Wwj+aZgicpLFxuXHRob3Vyczogd2luZG93LndnVUxTKCflsI/ml7YnLCAn5bCP5pmCJyksXG5cdG1pbnV0ZTogJ+WIhicsXG5cdG1pbnV0ZXM6ICfliIYnLFxuXHRzZWNvbmQ6ICfnp5InLFxuXHRzZWNvbmRzOiAn56eSJyxcblx0d2VlazogJ+WRqCcsXG5cdHdlZWtzOiAn5ZGoJyxcblx0bW9udGg6ICfmnIgnLFxuXHRtb250aHM6ICfmnIgnLFxuXHR5ZWFyOiAn5bm0Jyxcblx0eWVhcnM6ICflubQnLFxuXHRzZWFyY2g6IHdpbmRvdy53Z1VMUygn5pCc57SiJywgJ+aQnOWwiycpLFxuXHRTZWFyY2hIaW50OiB3aW5kb3cud2dVTFMoJ+aQnOe0ouWMheWQqyAlcyDnmoTpobXpnaInLCAn5pCc5bCL5YyF5ZCrICVzIOeahOmggemdoicpLFxuXHR3ZWI6ICdCaW5nJyxcblx0Z2xvYmFsOiAn5YWo5Z+fJyxcblx0J21vcmUuLi4nOiAn5pu05aSa4oCm4oCmJyxcblx0Ly8gYXJ0aWNsZS1yZWxhdGVkIGFjdGlvbnMgYW5kIGluZm9cblx0Ly8gKHNvbWUgYWN0aW9ucyBhbHNvIGFwcGx5IHRvIHVzZXIgcGFnZXMpXG5cdGFjdGlvbnM6IHdpbmRvdy53Z1VMUygn5pON5L2cJywgJ+WLleS9nCcpLFxuXHQvLyAvLy8gdmlldyBhcnRpY2xlcyBhbmQgdmlldyB0YWxrXG5cdHBvcHVwc01lbnU6ICdQb3B1cHMnLFxuXHQnZGlzYWJsZSBwcmV2aWV3cyc6IHdpbmRvdy53Z1VMUygn56aB55So6aKE6KeIJywgJ+emgeeUqOmgkOimvScpLFxuXHR0b2dnbGVQcmV2aWV3c0hpbnQ6IHdpbmRvdy53Z1VMUygn5YiH5o2i5pys6aG1IFBvcHVwcyDnmoTpooTop4jlvIDlhbMnLCAn5YiH5o+b5pys6aCBIFBvcHVwcyDnmoTpoJDopr3plovpl5wnKSxcblx0J3RvZ2dsZSBwcmV2aWV3cyc6IHdpbmRvdy53Z1VMUygn5YiH5o2i6aKE6KeI5byA5YWzJywgJ+WIh+aPm+mgkOimvemWi+mXnCcpLFxuXHRyZXNldDogd2luZG93LndnVUxTKCflpI3kvY0nLCAn6KSH5L2NJyksXG5cdGRpc2FibGU6ICfnpoHnlKggUG9wdXBzJyxcblx0ZGlzYWJsZVBvcHVwc0hpbnQ6IHdpbmRvdy53Z1VMUyhcblx0XHQn5Zyo5pys6aG156aB55SoIFBvcHVwc++8jOWIt+aWsOmhtemdouS7pemHjeaWsOWQr+eUqOOAgicsXG5cdFx0J+WcqOacrOmggeemgeeUqCBQb3B1cHPvvIzph43mlrDmlbTnkIbpoIHpnaLku6Xph43mlrDllZ/nlKjjgIInXG5cdCksXG5cdHB1cmdlUG9wdXBzSGludDogd2luZG93LndnVUxTKCflpI3kvY0gUG9wdXBz77yM5riF6Zmk5omA5pyJ57yT5a2Y5pWw5o2u44CCJywgJ+ikh+S9jSBQb3B1cHPvvIzmuIXpmaTmiYDmnInlv6vlj5bos4fmlpnjgIInKSxcblx0UG9wdXBzSGludDogd2luZG93LndnVUxTKCflpI3kvY0gUG9wdXBz77yM5riF6Zmk5omA5pyJ57yT5a2Y5pWw5o2u44CCJywgJ+ikh+S9jSBQb3B1cHPvvIzmuIXpmaTmiYDmnInlv6vlj5bos4fmlpnjgIInKSxcblx0c3BhY2ViYXI6ICfnqbrmoLwnLFxuXHR2aWV3OiB3aW5kb3cud2dVTFMoJ+afpeeciycsICfmqqLoppYnKSxcblx0J3ZpZXcgYXJ0aWNsZSc6IHdpbmRvdy53Z1VMUygn5p+l55yL5p2h55uuJywgJ+aqouimluaineebricpLFxuXHR2aWV3SGludDogd2luZG93LndnVUxTKCfliY3lvoAgJXMnLCAn5YmN5b6AICVzJyksXG5cdHRhbGs6IHdpbmRvdy53Z1VMUygn6K6o6K66JywgJ+iojuirlicpLFxuXHQndGFsayBwYWdlJzogd2luZG93LndnVUxTKCforqjorrrpobUnLCAn6KiO6KuW6aCBJyksXG5cdCd0aGlzJm5ic3A7cmV2aXNpb24nOiB3aW5kb3cud2dVTFMoJ+atpOS/ruiuoueJiOacrCcsICfmraTkv67oqILniYjmnKwnKSxcblx0J3JldmlzaW9uICVzIG9mICVzJzogd2luZG93LndnVUxTKCfpobXpnaIgJDIg55qE5L+u6K6i54mI5pysICQxJywgJ+mggemdoiAkMiDnmoTkv67oqILniYjmnKwgJDEnKSxcblx0J1JldmlzaW9uICVzIG9mICVzJzogd2luZG93LndnVUxTKCfpobXpnaIgJDIg55qE5L+u6K6i54mI5pysICQxJywgJ+mggemdoiAkMiDnmoTkv67oqILniYjmnKwgJDEnKSxcblx0J3RoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyBvZiAlcyc6IHdpbmRvdy53Z1VMUyhcblx0XHQn6aG16Z2iICQyIOeahOS/ruiuoueJiOacrCAkMSDkuYvliY3nmoTkv67orqLniYjmnKwnLFxuXHRcdCfpoIHpnaIgJDIg55qE5L+u6KiC54mI5pysICQxIOS5i+WJjeeahOS/ruiogueJiOacrCdcblx0KSxcblx0J1RvZ2dsZSBpbWFnZSBzaXplJzogd2luZG93LndnVUxTKCfngrnlh7vliIfmjaLlm77niYflpKflsI8nLCAn6bue5pOK5YiH5o+b5ZyW54mH5aSn5bCPJyksXG5cdGRlbDogd2luZG93LndnVUxTKCfliKDpmaQnLCAn5Yig6ZmkJyksXG5cdC8vIC8vLyBkZWxldGUsIHByb3RlY3QsIG1vdmVcblx0ZGVsZXRlOiB3aW5kb3cud2dVTFMoJ+WIoOmZpCcsICfliKDpmaQnKSxcblx0ZGVsZXRlSGludDogd2luZG93LndnVUxTKCfliKDpmaQgJXMnLCAn5Yig6ZmkICVzJyksXG5cdHVuZGVsZXRlU2hvcnQ6IHdpbmRvdy53Z1VMUygn5oGi5aSNJywgJ+aBouW+qScpLFxuXHRVbmRlbGV0ZUhpbnQ6IHdpbmRvdy53Z1VMUygn5oGi5aSNICVzJywgJ+aBouW+qSAlcycpLFxuXHRwcm90ZWN0OiB3aW5kb3cud2dVTFMoJ+S/neaKpCcsICfkv53orbcnKSxcblx0cHJvdGVjdEhpbnQ6IHdpbmRvdy53Z1VMUygn5L+d5oqkICVzJywgJ+S/neittyAlcycpLFxuXHR1bnByb3RlY3RTaG9ydDogd2luZG93LndnVUxTKCfop6PpmaQnLCAn6Kej6ZmkJyksXG5cdHVucHJvdGVjdEhpbnQ6IHdpbmRvdy53Z1VMUygn6Kej6Zmk5a+5ICVzIOeahOS/neaKpCcsICfop6PpmaTlsI0gJXMg55qE5L+d6K23JyksXG5cdG1vdmU6IHdpbmRvdy53Z1VMUygn56e75YqoJywgJ+enu+WLlScpLFxuXHQnbW92ZSBwYWdlJzogd2luZG93LndnVUxTKCfnp7vliqjpobXpnaInLCAn56e75YuV6aCB6Z2iJyksXG5cdE1vdmVwYWdlSGludDogd2luZG93LndnVUxTKCfkv67mlLkgJXMg55qE5qCH6aKYJywgJ+S/ruaUuSAlcyDnmoTmqJnpoYwnKSxcblx0ZWRpdDogd2luZG93LndnVUxTKCfnvJbovpEnLCAn57eo6LyvJyksXG5cdC8vIC8vLyBlZGl0IGFydGljbGVzIGFuZCB0YWxrXG5cdCdlZGl0IGFydGljbGUnOiB3aW5kb3cud2dVTFMoJ+e8lui+keadoeebricsICfnt6jovK/mop3nm64nKSxcblx0ZWRpdEhpbnQ6IHdpbmRvdy53Z1VMUygn5L+u5pS5ICVzIOeahOWGheWuuScsICfkv67mlLkgJXMg55qE5YWn5a65JyksXG5cdCdlZGl0IHRhbGsnOiB3aW5kb3cud2dVTFMoJ+e8lui+keiuqOiuuumhtScsICfnt6jovK/lsI3oqbHpoIEnKSxcblx0bmV3OiB3aW5kb3cud2dVTFMoJ+aWsCcsICfmlrAnKSxcblx0J25ldyB0b3BpYyc6IHdpbmRvdy53Z1VMUygn5paw6K+d6aKYJywgJ+aWsOipsemhjCcpLFxuXHRuZXdTZWN0aW9uSGludDogd2luZG93LndnVUxTKCflnKggJXMg5aKe5Yqg5paw55qE6K6o6K666K+d6aKYJywgJ+WcqCAlcyDlop7liqDmlrDnmoToqI7oq5boqbHpoYwnKSxcblx0J251bGwgZWRpdCc6IHdpbmRvdy53Z1VMUygn56m657yW6L6RJywgJ+epuue3qOi8rycpLFxuXHRudWxsRWRpdEhpbnQ6IHdpbmRvdy53Z1VMUygn6L+b6KGM5LiA5qyh5a+5ICVzIOeahOepuue8lui+kScsICfoo73pgKDkuIDmrKHlsI0gJXMg55qE56m657eo6LyvJyksXG5cdGhpc3Q6IHdpbmRvdy53Z1VMUygn5Y6G5Y+yJywgJ+att+WPsicpLFxuXHQvLyAvLy8gaGlzdG9yeSwgZGlmZnMsIGVkaXRvcnMsIHJlbGF0ZWRcblx0aGlzdG9yeTogd2luZG93LndnVUxTKCfljoblj7InLCAn5q235Y+yJyksXG5cdGhpc3RvcnlIaW50OiB3aW5kb3cud2dVTFMoJyVzIOeahOS/ruiuouWOhuWPsicsICclcyDnmoTkv67oqILmrbflj7InKSxcblx0bGFzdDogd2luZG93LndnVUxTKCfkuYvliY0nLCAn5LmL5YmNJyksXG5cdC8vIFtbTWVkaWFXaWtpOkxhc3RdXVxuXHRsYXN0RWRpdDogd2luZG93LndnVUxTKCfmnIDov5Hmm7TmlLknLCAn5pyA6L+R5pu05pS5JyksXG5cdCdzaG93IGxhc3QgZWRpdCc6IHdpbmRvdy53Z1VMUygn5pyA6L+R5LiA5qyh5pu05pS5JywgJ+acgOaWsOS4gOasoeS/ruiogicpLFxuXHQnU2hvdyB0aGUgbGFzdCBlZGl0Jzogd2luZG93LndnVUxTKCfmmL7npLrmnIDov5HkuIDmrKHmm7TmlLnnmoTlt67lvIInLCAn6aGv56S65pyA5paw5LiA5qyh5L+u6KiC55qE5beu55WwJyksXG5cdGxhc3RDb250cmliOiB3aW5kb3cud2dVTFMoJ+acgOi/kee8lui+kScsICfmnIDov5Hnt6jovK8nKSxcblx0J2xhc3Qgc2V0IG9mIGVkaXRzJzogd2luZG93LndnVUxTKCfmnIDov5HnvJbovpEnLCAn5pyA6L+R57eo6LyvJyksXG5cdGxhc3RDb250cmliSGludDogd2luZG93LndnVUxTKCfmmL7npLrnlLHmnIDlkI7kuIDkvY3nvJbovpHogIXpgKDmiJDnmoTlt67lvIInLCAn6aGv56S655Sx5pyA5b6M5LiA5L2N57eo6Lyv6ICF6KO96YCg55qE5beu55WwJyksXG5cdGN1cjogd2luZG93LndnVUxTKCflvZPliY0nLCAn55W25YmNJyksXG5cdGRpZmZDdXI6IHdpbmRvdy53Z1VMUygn5LiO5b2T5YmN54mI5pys55qE5beu5byCJywgJ+iIh+ebruWJjeeJiOacrOeahOW3rueVsCcpLFxuXHQnU2hvdyBjaGFuZ2VzIHNpbmNlIHJldmlzaW9uICVzJzogd2luZG93LndnVUxTKCfmmL7npLroh6rkv67orqLniYjmnKwgJXMg55qE5beu5byCJywgJ+mhr+ekuuiHquS/ruiogueJiOacrCAlcyDnmoTlt67nlbAnKSxcblx0JyVzIG9sZCc6IHdpbmRvdy53Z1VMUygnJXMg5YmN55qE5pyA5ZCO54mI5pysJywgJyVzIOWJjeeahOacgOWQjueJiOacrCcpLFxuXHQvLyBhcyBpbiA0IHdlZWtzIG9sZFxuXHRvbGRFZGl0OiB3aW5kb3cud2dVTFMoJ+aXp+e8lui+kScsICfoiIrnt6jovK8nKSxcblx0cHVyZ2U6IHdpbmRvdy53Z1VMUygn5riF6Zmk57yT5a2YJywgJ+a4hemZpOW/q+WPlicpLFxuXHRwdXJnZUhpbnQ6IHdpbmRvdy53Z1VMUygn5riF6Zmk5pyN5Yqh5Zmo5LitICVzIOeahOe8k+WtmCcsICfmuIXpmaTkvLrmnI3lmajkuK0gJXMg55qE5b+r5Y+WJyksXG5cdHJhdzogd2luZG93LndnVUxTKCfmupDku6PnoIEnLCAn5Y6f5aeL56K8JyksXG5cdHJhd0hpbnQ6IHdpbmRvdy53Z1VMUygn5p+l55yLICVzIOeahOa6kOS7o+eggScsICfmqqLoppYgJXMg55qE5Y6f5aeL56K8JyksXG5cdHJlbmRlcjogd2luZG93LndnVUxTKCfku4XmraPmlocnLCAn5YOF5q2j5paHJyksXG5cdHJlbmRlckhpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOe6r0hUTUzop6PmnpDvvIjku4XmraPmloflhoXlrrnvvIknLCAn6aGv56S6ICVzIOeahOe0lEhUTUzop6PmnpDvvIjlg4XmraPmloflhaflrrnvvIknKSxcblx0J1Nob3cgdGhlIGVkaXQgbWFkZSB0byBnZXQgcmV2aXNpb24nOiB3aW5kb3cud2dVTFMoJ+aYvuekuue8lui+keS7peW+l+WIsOS/ruiuoueJiOacrCcsICfpoa/npLrnt6jovK/ku6XlvpfliLDkv67oqILniYjmnKwnKSxcblx0c2luY2VNZTogd2luZG93LndnVUxTKCfoh6rmiJEnLCAn6Ieq5oiRJyksXG5cdCdjaGFuZ2VzIHNpbmNlIG1pbmUnOiB3aW5kb3cud2dVTFMoJ+iHquaIkeS/ruiuoueahOW3ruW8gicsICfoh6rmiJHkv67oqILnmoTlt67nlbAnKSxcblx0c2luY2VNZUhpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S66Ieq5oiR5LiK5qyh5L+u5pS55Lul5p2l55qE5beu5byCJywgJ+mhr+ekuuiHquaIkeS4iuasoeS/ruaUueS7peS+hueahOW3rueVsCcpLFxuXHRcIkNvdWxkbid0IGZpbmQgYW4gZWRpdCBieSAlc1xcbmluIHRoZSBsYXN0ICVzIGVkaXRzIHRvXFxuJXNcIjogd2luZG93LndnVUxTKFxuXHRcdCflnKggJDMg5pyA6L+RICQyIOasoee8lui+keS4reaJvuS4jeWIsCAkMSDlgZrlh7rnmoTkv67mlLknLFxuXHRcdCflnKggJDMg5pyA6L+RICQyIOasoee3qOi8r+S4reaJvuS4jeWIsCAkMSDlgZrlh7rnmoTkv67mlLknXG5cdCksXG5cdGVkczogd2luZG93LndnVUxTKCfnvJbovpEnLCAn57eo6LyvJyksXG5cdGVkaXRvcnM6IHdpbmRvdy53Z1VMUygn57yW6L6R6ICFJywgJ+e3qOi8r+iAhScpLFxuXHRlZGl0b3JMaXN0SGludDogd2luZG93LndnVUxTKCfliJflh7rnvJbovpHov4cgJXMg55qE55So5oi3JywgJ+WIl+WHuue3qOi8r+mBjiAlcyDnmoTkvb/nlKjogIUnKSxcblx0cmVsYXRlZDogd2luZG93LndnVUxTKCfnm7jlhbMnLCAn55u46ZecJyksXG5cdHJlbGF0ZWRDaGFuZ2VzOiB3aW5kb3cud2dVTFMoJ+ebuOWFs+abtOaUuScsICfnm7jpl5zmm7TmlLknKSxcblx0J3JlbGF0ZWQgY2hhbmdlcyc6IHdpbmRvdy53Z1VMUygn55u45YWz5pu05pS5JywgJ+ebuOmXnOabtOaUuScpLFxuXHRSZWNlbnRjaGFuZ2VzbGlua2VkSGludDogd2luZG93LndnVUxTKCfmmL7npLrnm7jlhbMgJXMg55qE5L+u5pS5JywgJ+mhr+ekuuebuOmXnCAlcyDnmoTkv67mlLknKSxcblx0ZWRpdE9sZDogd2luZG93LndnVUxTKCfnvJbovpHml6fniYgnLCAn57eo6Lyv6IiK54mIJyksXG5cdC8vIC8vLyBlZGl0IG9sZCB2ZXJzaW9uLCBvciByZXZlcnRcblx0cnY6IHdpbmRvdy53Z1VMUygn5Zue6YCAJywgJ+aBouW+qScpLFxuXHRyZXZlcnQ6IHdpbmRvdy53Z1VMUygn5Zue6YCAJywgJ+aBouW+qScpLFxuXHRyZXZlcnRIaW50OiB3aW5kb3cud2dVTFMoJ+WbnumAgOWIsCAlcycsICfmgaLlvqnliLAgJXMnKSxcblx0dW5kbzogd2luZG93LndnVUxTKCfmkqTplIAnLCAn5pKk6Yq3JyksXG5cdHVuZG9IaW50OiB3aW5kb3cud2dVTFMoJ+aSpOmUgOi/measoee8lui+kScsICfmkqTpirfpgJnmrKHnt6jovK8nKSxcblx0ZGVmYXVsdHBvcHVwUmVkbGlua1N1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHQn56e76Zmk5Yiw56m66aG16Z2iW1slc11d55qE6ZO+5o6l77yIUG9wdXBz77yJJyxcblx0XHQn56e76Zmk5Yiw56m66aCB6Z2iW1slc11d55qE6YCj57WQ77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBGaXhEYWJzU3VtbWFyeTogd2luZG93LndnVUxTKCfmtojmrafkuYlbWyVzXV3liLBbWyVzXV3vvIhQb3B1cHPvvIknLCAn5raI5q2n576pW1slc11d5YiwW1slc11d77yIUG9wdXBz77yJJyksXG5cdGRlZmF1bHRwb3B1cEZpeFJlZGlyc1N1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHQn5b+955Wl5LuOW1slc11d5YiwW1slc11d55qE6YeN5a6a5ZCR77yIUG9wdXBz77yJJyxcblx0XHQn5b+955Wl5b6eW1slc11d5YiwW1slc11d55qE6YeN5paw5bCO5ZCR77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHQn5Zue6YCA5YiwJDLlnKgkMeaXtue8lui+keeahOS/ruiuoueJiOacrCQz77yIUG9wdXBz77yJJyxcblx0XHQn6YKE5Y6f5YiwJDLlnKgkMeaZguijveS9nOeahOS/ruiogueJiOacrCQz77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCflm57pgIDliLDkv67orqLniYjmnKwlc+eahOS4iuS4gOS4queJiOacrO+8iFBvcHVwc++8iScsXG5cdFx0J+mChOWOn+WIsOS/ruiogueJiOacrCVz55qE5LiK5LiA5YCL54mI5pys77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBSZXZlcnRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WbnumAgOWIsOS/ruiuoueJiOacrCVz77yIUG9wdXBz77yJJywgJ+mChOWOn+WIsOS/ruiogueJiOacrCVz77yIUG9wdXBz77yJJyksXG5cdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCflm57pgIDliLDkv67orqLniYjmnKwkMeeahOS4iuS4gOS4queJiOacrO+8jOeUsSQz5ZyoJDLml7bnvJbovpHvvIhQb3B1cHPvvIknLFxuXHRcdCfpgoTljp/liLDkv67oqILniYjmnKwkMeeahOS4iuS4gOWAi+eJiOacrO+8jOeUsSQz5ZyoJDLmmYLoo73kvZzvvIhQb3B1cHPvvIknXG5cdCksXG5cdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0J+WbnumAgOWIsCQz5ZyoJDLml7bnvJbovpHnmoTkv67orqLniYjmnKwkMe+8iFBvcHVwc++8iScsXG5cdFx0J+mChOWOn+WIsCQz5ZyoJDLmmYLoo73kvZznmoTkv67oqILniYjmnKwkMe+8iFBvcHVwc++8iSdcblx0KSxcblx0ZGVmYXVsdHBvcHVwUm1EYWJMaW5rU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCfnp7vpmaTliLDmtojmrafkuYnpobVbWyVzXV3nmoTpk77mjqXvvIhQb3B1cHPvvIknLFxuXHRcdCfnp7vpmaTliLDmtojmrafnvqnpoIFbWyVzXV3nmoTpgKPntZDvvIhQb3B1cHPvvIknXG5cdCksXG5cdFJlZGlyZWN0czogd2luZG93LndnVUxTKCfph43lrprlkJEnLCAn6YeN5a6a5ZCRJyksXG5cdC8vIGFzIGluIFJlZGlyZWN0cyB0byAuLi5cblx0Ly8gXCIgdG8gXCI6IHdpbmRvdy53Z1VMUyggXCLliLBcIixcIuWIsFwiICksXG5cdC8vIGFzIGluIFJlZGlyZWN0cyB0byAuLi5cblx0J0J5cGFzcyByZWRpcmVjdCc6IHdpbmRvdy53Z1VMUygn5b+955Wl6YeN5a6a5ZCRJywgJ+W/veeVpemHjeaWsOWwjuWQkScpLFxuXHQnRml4IHRoaXMgcmVkaXJlY3QnOiB3aW5kb3cud2dVTFMoJ+S/ruWkjemHjeWumuWQkScsICfkv67lvqnph43mlrDlsI7lkJEnKSxcblx0ZGlzYW1iaWc6IHdpbmRvdy53Z1VMUygn5raI5q2n5LmJJywgJ+a2iOatp+e+qScpLFxuXHQvLyAvLy8gYWRkIG9yIHJlbW92ZSBkYWIgZXRjLlxuXHRkaXNhbWJpZ0hpbnQ6IHdpbmRvdy53Z1VMUygn5raI5q2n5LmJ6L+Z5Liq6ZO+5o6l5YiwIFtbJXNdXScsICfmtojmrafnvqnpgJnlgIvpgKPntZDliLAgW1slc11dJyksXG5cdCdDbGljayB0byBkaXNhbWJpZ3VhdGUgdGhpcyBsaW5rIHRvOic6IHdpbmRvdy53Z1VMUygn54K55Ye75Lul5raI5q2n5LmJ6L+Z5Liq6ZO+5o6l5Yiw77yaJywgJ+m7nuaTiuS7pea2iOatp+e+qemAmeWAi+mAo+e1kOWIsO+8micpLFxuXHQncmVtb3ZlIHRoaXMgbGluayc6IHdpbmRvdy53Z1VMUygn56e76Zmk6ZO+5o6lJywgJ+enu+mZpOmAo+e1kCcpLFxuXHQncmVtb3ZlIGFsbCBsaW5rcyB0byB0aGlzIHBhZ2UgZnJvbSB0aGlzIGFydGljbGUnOiB3aW5kb3cud2dVTFMoXG5cdFx0J+enu+mZpOatpOadoeebruWIsOi/memhteeahOaJgOaciemTvuaOpScsXG5cdFx0J+enu+mZpOatpOaineebruWIsOmAmemggeeahOaJgOaciemAo+e1kCdcblx0KSxcblx0J3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBkaXNhbWJpZyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJzogd2luZG93LndnVUxTKFxuXHRcdCfnp7vpmaTmraTmnaHnm67liLDov5nmtojmrafkuYnnmoTmiYDmnInpk77mjqUnLFxuXHRcdCfnp7vpmaTmraTmop3nm67liLDpgJnmtojmrafnvqnnmoTmiYDmnInpgKPntZAnXG5cdCksXG5cdG1haW5saW5rOiB3aW5kb3cud2dVTFMoJ+S4u+mTvuaOpScsICfkuLvpgKPntZAnKSxcblx0Ly8gLy8vIGxpbmtzLCB3YXRjaCwgdW53YXRjaFxuXHR3aWtpTGluazogd2luZG93LndnVUxTKCfkuKrlhoXpg6jpk77mjqUnLCAn5Liq5YWn6YOo6YCj57WQJyksXG5cdHdpa2lMaW5rczogd2luZG93LndnVUxTKCfkuKrlhoXpg6jpk77mjqUnLCAn5Liq5YWn6YOo6YCj57WQJyksXG5cdCdsaW5rcyBoZXJlJzogd2luZG93LndnVUxTKCfpk77lhaUnLCAn6Y+I5YWlJyksXG5cdHdoYXRMaW5rc0hlcmU6IHdpbmRvdy53Z1VMUygn6ZO+5YWl6aG16Z2iJywgJ+mPiOWFpemggemdoicpLFxuXHQnd2hhdCBsaW5rcyBoZXJlJzogd2luZG93LndnVUxTKCfpk77lhaXpobXpnaInLCAn6Y+I5YWl6aCB6Z2iJyksXG5cdFdoYXRsaW5rc2hlcmVIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuumTvuaOpeWIsCAlcyDnmoTpobXpnaInLCAn6aGv56S66YCj57WQ5YiwICVzIOeahOmggemdoicpLFxuXHR1bndhdGNoU2hvcnQ6IHdpbmRvdy53Z1VMUygn5Y+W5raIJywgJ+WPlua2iCcpLFxuXHR3YXRjaFRoaW5neTogd2luZG93LndnVUxTKCfnm5Hop4YnLCAn55uj6KaWJyksXG5cdC8vIGNhbGxlZCB3YXRjaFRoaW5neSBiZWNhdXNlIHt9LndhdGNoIGlzIGEgZnVuY3Rpb25cblx0d2F0Y2hIaW50OiB3aW5kb3cud2dVTFMoJ+WKoOWFpSAlcyDliLDmiJHnmoTnm5Hop4bliJfooagnLCAn5Yqg5YWlICVzIOWIsOaIkeeahOebo+imluWIl+ihqCcpLFxuXHR1bndhdGNoSGludDogd2luZG93LndnVUxTKCfku47miJHnmoTnm5Hop4bliJfooajnp7vpmaQgJXMnLCAn5b6e5oiR55qE55uj6KaW5YiX6KGo56e76ZmkICVzJyksXG5cdCdPbmx5IGZvdW5kIG9uZSBlZGl0b3I6ICVzIG1hZGUgJXMgZWRpdHMnOiB3aW5kb3cud2dVTFMoXG5cdFx0J+S7heaJvuWIsOS4gOS9jee8luiAhe+8miVzIOWItumAoOS6hiAlcyDmrKHnvJbovpEnLFxuXHRcdCflg4Xmib7liLDkuIDkvY3nt6jogIXvvJolcyDoo73pgKDkuoYgJXMg5qyh57eo6LyvJ1xuXHQpLFxuXHQnJXMgc2VlbXMgdG8gYmUgdGhlIGxhc3QgZWRpdG9yIHRvIHRoZSBwYWdlICVzJzogd2luZG93LndnVUxTKFxuXHRcdCclcyDnnIvkuIrljrvmmK8gJXMg6L+Z6aG155qE5pyA5ZCO5LiA5L2N57yW6ICFJyxcblx0XHQnJXMg55yL5LiK5Y675pivICVzIOmAmemggeeahOacgOW+jOS4gOS9jee3qOiAhSdcblx0KSxcblx0cnNzOiB3aW5kb3cud2dVTFMoJ1JTUycsICdSU1MnKSxcblx0Ly8gZGlmZiBwcmV2aWV3c1xuXHQnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnOiB3aW5kb3cud2dVTFMoJ+WHuuS6juaAp+iDveiAg+iZke+8jOW3ruW8guW3suiiq+aIquaWrScsICflh7rmlrzmlYjog73ogIPmha7vvIzlt67nlbDlt7LooqvmiKrmlrcnKSxcblx0J09sZCByZXZpc2lvbic6IHdpbmRvdy53Z1VMUygn5pen54mI5pysJywgJ+iIiueJiOacrCcpLFxuXHQnTmV3IHJldmlzaW9uJzogd2luZG93LndnVUxTKCfmlrDniYjmnKwnLCAn5paw54mI5pysJyksXG5cdCdTb21ldGhpbmcgd2VudCB3cm9uZyA6LSgnOiB3aW5kb3cud2dVTFMoJ+WHuumXrumimOS6hiA6LSgnLCAn5Ye65ZWP6aGM5LqGIDotKCcpLFxuXHQnRW1wdHkgcmV2aXNpb24sIG1heWJlIG5vbi1leGlzdGVudCc6IHdpbmRvdy53Z1VMUygn56m655qE5L+u6K6i77yM5Y+v6IO95bm25LiN5a2Y5ZyoJywgJ+epuueahOS/ruiogu+8jOWPr+iDveS4puS4jeWtmOWcqCcpLFxuXHQnVW5rbm93biBkYXRlJzogd2luZG93LndnVUxTKCfmnKrnn6Xml6XmnJ8nLCAn5pyq55+l5pel5pyfJyksXG5cdC8vIG90aGVyIHNwZWNpYWwgcHJldmlld3Ncblx0J0VtcHR5IGNhdGVnb3J5Jzogd2luZG93LndnVUxTKCfnqbrnmoTliIbnsbsnLCAn56m655qE5YiG6aGeJyksXG5cdCdDYXRlZ29yeSBtZW1iZXJzICglcyBzaG93biknOiB3aW5kb3cud2dVTFMoJ+WIhuexu+aIkOWRmO+8iCVzIOaYvuekuu+8iScsICfliIbpoZ7miJDlk6HvvIglcyDpoa/npLrvvIknKSxcblx0J05vIGltYWdlIGxpbmtzIGZvdW5kJzogd2luZG93LndnVUxTKCfmnKrmib7liLDmlofku7bpk77mjqUnLCAn5pyq5om+5Yiw5qqU5qGI6YCj57WQJyksXG5cdCdGaWxlIGxpbmtzJzogd2luZG93LndnVUxTKCfmlofku7bpk77mjqUnLCAn5qqU5qGI6YCj57WQJyksXG5cdCdub3QgY29tbW9ucyc6IHdpbmRvdy53Z1VMUygn57u05Z+65YWx5Lqr5Lit5peg5q2k5ZCN56ew55qE5paH5Lu244CCJywgJ+e2reWfuuWFseS6q+S4reeEoeatpOWQjeeoseeahOaqlOahiOOAgicpLFxuXHQnY29tbW9ucyBvbmx5Jzogd2luZG93LndnVUxTKCfmraTmlofku7bmnaXoh6rnu7Tln7rlhbHkuqvjgIInLCAn5q2k5qqU5qGI5L6G6Ieq57at5Z+65YWx5Lqr44CCJyksXG5cdCdObyBpbWFnZSBmb3VuZCc6IHdpbmRvdy53Z1VMUygn5om+5LiN5Yiw5paH5Lu2JywgJ+aJvuS4jeWIsOaqlOahiCcpLFxuXHQnY29tbW9ucyBkdXBlJzogd2luZG93LndnVUxTKCfnu7Tln7rlhbHkuqvkuK3lrZjlnKjmraTmlofku7bnmoTlia/mnKzjgIInLCAn57at5Z+65YWx5Lqr5Lit5a2Y5Zyo5q2k5qqU5qGI55qE5Ymv5pys44CCJyksXG5cdCdjb21tb25zIGNvbmZsaWN0Jzogd2luZG93LndnVUxTKCfnu7Tln7rlhbHkuqvkuK3lrZjlnKjmraTmlofku7blkI3np7DkuI3lkIznmoTlia/mnKzjgIInLCAn57at5Z+65YWx5Lqr5Lit5a2Y5Zyo5q2k5qqU5ZCN56ix5LiN5ZCM55qE5Ymv5pys44CCJyksXG5cdC8vIHVzZXItcmVsYXRlZCBhY3Rpb25zIGFuZCBpbmZvXG5cdHVzZXI6IHdpbmRvdy53Z1VMUygn55So5oi3JywgJ+S9v+eUqOiAhScpLFxuXHQvLyAvLy8gdXNlciBwYWdlLCB0YWxrLCBlbWFpbCwgc3BhY2Vcblx0J3VzZXImbmJzcDtwYWdlJzogd2luZG93LndnVUxTKCfnlKjmiLfpobUnLCAn5L2/55So6ICF6aCBJyksXG5cdCd1c2VyIHRhbGsnOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+iuqOiuuicsICfkvb/nlKjogIXlsI3oqbEnKSxcblx0J2VkaXQgdXNlciB0YWxrJzogd2luZG93LndnVUxTKCfnvJbovpHnlKjmiLforqjorronLCAn57eo6Lyv5L2/55So6ICF5bCN6KmxJyksXG5cdCdsZWF2ZSBjb21tZW50Jzogd2luZG93LndnVUxTKCfnlZnoqIAnLCAn55WZ6KiAJyksXG5cdGVtYWlsOiB3aW5kb3cud2dVTFMoJ+eUtemCricsICfpm7vpg7UnKSxcblx0J2VtYWlsIHVzZXInOiB3aW5kb3cud2dVTFMoJ+eUtemCrueUqOaItycsICfpm7vpg7Xkvb/nlKjogIUnKSxcblx0RW1haWx1c2VySGludDogd2luZG93LndnVUxTKCfnu5kgJXMg5Y+R6YCB55S15a2Q6YKu5Lu2JywgJ+e1piAlcyDnmbzpgIHpm7vlrZDpg7Xku7YnKSxcblx0c3BhY2U6IHdpbmRvdy53Z1VMUygn5a2Q6aG16Z2iJywgJ+WtkOmggemdoicpLFxuXHQvLyBzaG9ydCBmb3JtIGZvciB1c2VyU3BhY2UgbGlua1xuXHRQcmVmaXhpbmRleEhpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOeUqOaIt+mhteWtkOmhtemdoicsICfpoa/npLogJXMg55qE5L2/55So6ICF6aCB5a2Q6aCB6Z2iJyksXG5cdGNvdW50OiB3aW5kb3cud2dVTFMoJ+e7n+iuoScsICfntbHoqIgnKSxcblx0Ly8gLy8vIGNvbnRyaWJ1dGlvbnMsIHRyZWUsIGxvZ1xuXHQnZWRpdCBjb3VudGVyJzogd2luZG93LndnVUxTKCfnvJbovpHmrKHmlbAnLCAn57eo6Lyv5qyh5pW4JyksXG5cdGthdGVsaW5rSGludDogd2luZG93LndnVUxTKCclcyDnmoTnvJbovpHmrKHmlbAnLCAnJXMg55qE57eo6Lyv5qyh5pW4JyksXG5cdGNvbnRyaWJzOiB3aW5kb3cud2dVTFMoJ+i0oeeMricsICfosqLnjbsnKSxcblx0Y29udHJpYnV0aW9uczogd2luZG93LndnVUxTKCfotKHnjK4nLCAn6LKi5427JyksXG5cdGRlbGV0ZWRDb250cmliczogd2luZG93LndnVUxTKCflt7LliKDpmaTnmoTotKHnjK4nLCAn5bey5Yiq6Zmk55qE6LKi5427JyksXG5cdENvbnRyaWJ1dGlvbnNIaW50OiB3aW5kb3cud2dVTFMoJyVzIOeahOeUqOaIt+i0oeeMricsICclcyDnmoTkvb/nlKjogIXosqLnjbsnKSxcblx0dHJlZTogd2luZG93LndnVUxTKCfmoJEnLCAn5qi5JyksXG5cdGNvbnRyaWJzVHJlZUhpbnQ6IHdpbmRvdy53Z1VMUygn5qC55o2u5ZCN5a2X56m66Ze05p+l55yLICVzIOeahOi0oeeMricsICfmoLnmk5rlkb3lkI3nqbrplpPmqqLoppYgJXMg55qE6LKi5427JyksXG5cdGxvZzogd2luZG93LndnVUxTKCfml6Xlv5cnLCAn5pel6KqMJyksXG5cdCd1c2VyIGxvZyc6IHdpbmRvdy53Z1VMUygn55So5oi35pel5b+XJywgJ+S9v+eUqOiAheaXpeiqjCcpLFxuXHR1c2VyTG9nSGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE55So5oi35pel5b+XJywgJ+mhr+ekuiAlcyDnmoTkvb/nlKjogIXml6XoqownKSxcblx0dW5ibG9ja1Nob3J0OiB3aW5kb3cud2dVTFMoJ+ino+mZpCcsICfop6PpmaQnKSxcblx0YmxvY2s6IHdpbmRvdy53Z1VMUygn5bCB56aBJywgJ+WwgemOlicpLFxuXHQnYmxvY2sgdXNlcic6IHdpbmRvdy53Z1VMUygn5bCB56aB55So5oi3JywgJ+WwgemOluS9v+eUqOiAhScpLFxuXHRJcGJsb2NrbGlzdEhpbnQ6IHdpbmRvdy53Z1VMUygn6Kej5bCBICVzJywgJ+ino+WwgSAlcycpLFxuXHRCbG9ja2lwSGludDogd2luZG93LndnVUxTKCflsIHnpoEgJXMnLCAn5bCB6Y6WICVzJyksXG5cdCdibG9jayBsb2cnOiB3aW5kb3cud2dVTFMoJ+WwgeemgeaXpeW/lycsICflsIHpjpbml6XoqownKSxcblx0YmxvY2tMb2dIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuiAlcyDnmoTlsIHnpoHml6Xlv5cnLCAn6aGv56S6ICVzIOeahOWwgemOluaXpeiqjCcpLFxuXHRwcm90ZWN0TG9nSGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE5L+d5oqk5pel5b+XJywgJ+mhr+ekuiAlcyDnmoTkv53orbfml6XoqownKSxcblx0cGFnZUxvZ0hpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOaXpeW/lycsICfpoa/npLogJXMg55qE5pel6KqMJyksXG5cdGRlbGV0ZUxvZ0hpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOWIoOmZpOaXpeW/lycsICfpoa/npLogJXMg55qE5Yiq6Zmk5pel6KqMJyksXG5cdCdJbnZhbGlkICVzICVzJzogd2luZG93LndnVUxTKCfpgInpobkgJXMg5LiN5Y+v55So77yaJXMnLCAn6YG46aCFICVzIOS4jeWPr+eUqO+8miVzJyksXG5cdG06ICflsI8nLFxuXHQvLyBBdXRvZWRpdGluZ1xuXHQnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCc6IHdpbmRvdy53Z1VMUyhcblx0XHQn6L6T5YWl57yW6L6R5pGY6KaB77yM5oiW5oyJ5Y+W5raI5Lit5q2i5pON5L2cJyxcblx0XHQn6Ly45YWl57eo6Lyv5pGY6KaB77yM5oiW5oyJ5Y+W5raI5Lit5q2i5pON5L2cJ1xuXHQpLFxuXHQnRmFpbGVkIHRvIGdldCByZXZpc2lvbiBpbmZvcm1hdGlvbiwgcGxlYXNlIGVkaXQgbWFudWFsbHkuXFxuXFxuJzogd2luZG93LndnVUxTKFxuXHRcdCfojrflj5bkv67orqLniYjmnKzkv6Hmga/lpLHotKXvvIzor7fmiYvliqjkv67mlLnjgIJcXG5cXG4nLFxuXHRcdCfnjbLlj5bkv67oqILniYjmnKzos4foqIrlpLHmlZfvvIzoq4vmiYvli5Xkv67mlLnjgIJcXG5cXG4nXG5cdCksXG5cdCdUaGUgJXMgYnV0dG9uIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xpY2tlZC4gUGxlYXNlIHdhaXQgZm9yIHRoZSBuZXh0IHBhZ2UgdG8gbG9hZC4nOiB3aW5kb3cud2dVTFMoXG5cdFx0J+aMiemSriAlcyDlt7Looqvoh6rliqjngrnlh7vvvIzor7fnrYnlvoXkuIvkuIDkuKrpobXpnaLliqDovb3jgIInLFxuXHRcdCfmjInpiJUgJXMg5bey6KKr6Ieq5YuV6bue5pOK77yM6KuL562J5b6F5LiL5LiA5YCL6aCB6Z2i6LyJ5YWl44CCJ1xuXHQpLFxuXHQnQ291bGQgbm90IGZpbmQgYnV0dG9uICVzLiBQbGVhc2UgY2hlY2sgdGhlIHNldHRpbmdzIGluIHlvdXIgamF2YXNjcmlwdCBmaWxlLic6IHdpbmRvdy53Z1VMUyhcblx0XHQn5om+5LiN5Yiw5oyJ6ZKuICVz77yM6K+35qOA5p+l5oKoIEphdmFTY3JpcHQg5paH5Lu25Lit55qE6K6+572u44CCJyxcblx0XHQn5om+5LiN5Yiw5oyJ6YiVICVz77yM6KuL5qqi5p+l5oKoIEphdmFTY3JpcHQg5qqU5qGI5Lit55qE6Kit5a6a44CCJ1xuXHQpLFxuXHQvLyBQb3B1cHMgc2V0dXBcblx0J09wZW4gZnVsbC1zaXplIGltYWdlJzogd2luZG93LndnVUxTKCfmn6XnnIvlhajlsLrlr7jlm77lg48nLCAn5qqi6KaW5YWo5bC65a+45b2x5YOPJyksXG5cdC8vIOS7peS4i+WGheWuueeUsSBBbm5BbmdlbGEg6KGl5q2jXG5cdGJpbmdTZWFyY2hIaW50OiB3aW5kb3cud2dVTFMoJ+WcqCBCaW5nIOS4iuaQnOe0ouKAnCVz4oCdJywgJ+WcqCBiaW5nIOS4iuaQnOWwi+OAjCVz44CNJyksXG5cdCdlbmFibGUgcHJldmlld3MnOiB3aW5kb3cud2dVTFMoJ+WQr+eUqOmihOiniCcsICfllZ/nlKjpoJDopr0nKSxcblx0J3Nob3cgcHJldmlldyc6IHdpbmRvdy53Z1VMUygn56aB55So6aKE6KeIJywgJ+emgeeUqOmgkOimvScpLFxuXHRoaXN0b3J5ZmVlZEhpbnQ6IHdpbmRvdy53Z1VMUygn6K+l6aG16Z2i55qE6L+R5pyf5pu05pS5IFJTUyBmZWVkJywgJ+ipsumggemdoueahOi/keacn+abtOaUuSBSU1MgZmVlZCcpLFxuXHQnc2VuZCB0aGFua3MnOiB3aW5kb3cud2dVTFMoJ+WPkemAgeaEn+iwoicsICflgrPpgIHmhJ/orJ0nKSxcblx0VGhhbmtzSGludDogd2luZG93LndnVUxTKCflkJHor6XnlKjmiLflj5HpgIHkuIDlsIHmhJ/osKLmtojmga8nLCAn5ZCR6Kmy5L2/55So6ICF5YKz6YCB5LiA5bCB5oSf6Kyd6KiK5oGvJyksXG5cdCdtYXJrIHBhdHJvbGxlZCc6IHdpbmRvdy53Z1VMUygn5qCH6K6w5Li65bey5beh5p+lJywgJ+aomeiomOeCuuW3suW3oeafpScpLFxuXHRtYXJrcGF0cm9sbGVkSGludDogd2luZG93LndnVUxTKCfmoIforrDor6XnvJbovpHkuLrlt7Llt6Hmn6UnLCAn5qiZ6KiY6Kmy57eo6Lyv54K65bey5beh5p+lJyksXG5cdCdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnOiB3aW5kb3cud2dVTFMoJ+aXoOazleagh+iusOivpee8lui+keS4uuW3suW3oeafpScsICfnhKHms5XmqJnoqJjoqbLnt6jovK/ngrrlt7Llt6Hmn6UnKSxcblx0ZGVmYXVsdHBvcHVwUmV2aWV3ZWRTdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+agh+iusOS7jueJiOacrCVz5YiwJXPpl7TnmoTnvJbovpHkuLrlt7Llt6Hmn6UnLCAn5qiZ6KiY5b6e54mI5pysJXPliLAlc+mWk+eahOe3qOi8r+eCuuW3suW3oeafpScpLFxuXHQnSW1hZ2UgZnJvbSBDb21tb25zJzogd2luZG93LndnVUxTKCfmnaXoh6rnu7Tln7rlhbHkuqvnmoTlm77niYcnLCAn5L6G6Ieq57at5Z+65YWx55So55qE5ZyW54mHJyksXG5cdCdEZXNjcmlwdGlvbiBwYWdlJzogd2luZG93LndnVUxTKCflm77niYfmj4/ov7DpobUnLCAn5ZyW54mH5o+P6L+w6aCBJyksXG5cdCdBbHQgdGV4dDonOiB3aW5kb3cud2dVTFMoJ+abv+aNouaWh+acrO+8iEFsdO+8ie+8micsICfmm7/mj5vmloflrZfvvIhBbHTvvInvvJonKSxcblx0cmV2ZGVsOiB3aW5kb3cud2dVTFMoJ+WOhuWPsueJiOacrOiiq+makOiXjycsICfmrbflj7LniYjmnKzooqvpmrHol48nKSxcblx0RGVsZXRlZGNvbnRyaWJ1dGlvbnNIaW50OiB3aW5kb3cud2dVTFMoJ+eUqOaItyVz55qE6KKr5Yig6Zmk57yW6L6R5qyh5pWwJywgJ+S9v+eUqOiAhSVz55qE6KKr5Yiq6Zmk57eo6Lyv5qyh5pW4JyksXG5cdCdObyBiYWNrbGlua3MgZm91bmQnOiB3aW5kb3cud2dVTFMoJ+aJvuS4jeWIsOmTvuWFpemhtemdoicsICfmib7kuI3liLDpj4jlhaXpoIHpnaInKSxcblx0JyBhbmQgbW9yZSc6IHdpbmRvdy53Z1VMUygn5Lul5Y+K5YW25LuW6aG16Z2iJywgJ+S7peWPiuWFtuS7lumggemdoicpLFxuXHQnRG93bmxvYWQgcHJldmlldyBkYXRhJzogd2luZG93LndnVUxTKCfkuIvovb3pooTop4jmlbDmja4nLCAn5LiL6LyJ6aCQ6Ka96LOH5paZJyksXG5cdCdOb3QgYSByZWdpc3RlcmVkIHVzZXJuYW1lJzogd2luZG93LndnVUxTKCfpnZ7lt7Lms6jlhoznmoTnlKjmiLcnLCAn6Z2e5bey6Ki75YaK55qE5L2/55So6ICFJyksXG5cdEJMT0NLRUQ6IHdpbmRvdy53Z1VMUygn6KKr5bCB56aBJywgJ+iiq+WwgemOlicpLFxuXHQnSGFzIGJsb2Nrcyc6IHdpbmRvdy53Z1VMUygn6KKr6YOo5YiG5bCB56aBJywgJ+iiq+mDqOWIhuWwgemOlicpLFxuXHQnIGVkaXRzIHNpbmNlOiAnOiB3aW5kb3cud2dVTFMoJ+asoee8lui+ke+8jOazqOWGjOaXpeacn+S4uicsICfmrKHnt6jovK/vvIzoqLvlhorml6XmnJ/ngronKSxcblx0J2xhc3QgZWRpdCBvbiAnOiB3aW5kb3cud2dVTFMoJ+acgOWQjuS4gOasoee8lui+keS6jicsICfmnIDlvozkuIDmrKHnt6jovK/mlrwnKSxcblx0RW1haWxVc2VySGludDogd2luZG93LndnVUxTKCfnu5kgJXMg5Y+R6YCB55S15a2Q6YKu5Lu2JywgJ+e1piAlcyDnmbzpgIHpm7vlrZDpg7Xku7YnKSxcblx0UkFOR0VCTE9DS0VEOiB3aW5kb3cud2dVTFMoJ0lQ5q616KKr5bCB56aBJywgJ0lQ5q616KKr5bCB6Y6WJyksXG5cdCdJUCB1c2VyJzogd2luZG93LndnVUxTKCdJUOeUqOaItycsICdJUOS9v+eUqOiAhScpLFxuXHQn4pmAJzogJ+KZgCcsXG5cdCfimYInOiAn4pmCJyxcblx0SElEREVOOiB3aW5kb3cud2dVTFMoJ+WFqOWfn+makOiXjycsICflhajln5/pmrHol48nKSxcblx0TE9DS0VEOiB3aW5kb3cud2dVTFMoJ+WFqOWfn+mUgeWumicsICflhajln5/pjpblrponKSxcblx0J0ludmFsaWQgdXNlcic6IHdpbmRvdy53Z1VMUygn6Z2e5rOV55So5oi35ZCNJywgJ+mdnuazleS9v+eUqOiAheWQjeeosScpLFxuXHRkaWZmOiB3aW5kb3cud2dVTFMoJ+W3ruW8gicsICflt67nlbAnKSxcblx0JyB0byAnOiAn6IezJyxcblxuXHRhdXRvZWRpdF92ZXJzaW9uOiAnbnAyMDE0MDQxNicsXG5cdFByZWZpeEluZGV4SGludDogd2luZG93LndnVUxTKCfmmL7npLrnlKjmiLclc+eahOWtkOmhtemdoicsICfpoa/npLrkvb/nlKjogIUlc+eahOWtkOmggemdoicpLFxuXHRudWxsRWRpdFN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6L+b6KGM5LiA5qyh6Zu257yW6L6RJywgJ+mAsuihjOS4gOasoembtue3qOi8rycpLFxuXHQvLyDnlKjmiLfnu4TlkI3np7Dku47ns7vnu5/mtojmga/ojrflj5Zcblx0J2dyb3VwLW5vLWF1dG9jb25maXJtZWQnOiB3aW5kb3cud2dVTFMoJ+mdnuiHquWKqOehruiupOeUqOaItycsICfpnZ7oh6rli5Xnorroqo3kvb/nlKjogIUnKSxcblx0c2VwYXJhdG9yOiAn44CBJyxcblx0Y29tbWE6ICfvvIwnLFxufTtcblxuZXhwb3J0IHttZXNzYWdlfTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IHthcGl9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7bWVzc2FnZX0gZnJvbSAnLi9zdHJpbmcnO1xuXG5jb25zdCBwb3B1cHMgPSAoKSA9PiB7XG5cdC8vIFNUQVJURklMRTogbWFpbi5qc1xuXHQvLyBGaXggbGF0ZXJcblx0Ly8gR2xvYmFsc1xuXHQvL1xuXHQvLyBUcnlpbmcgdG8gc2hvdmUgYXMgbWFueSBvZiB0aGVzZSBhcyBwb3NzaWJsZSBpbnRvIHRoZSBwZyAocG9wdXAgZ2xvYmFscykgb2JqZWN0XG5cdGNvbnN0IHBnID0ge1xuXHRcdGFwaToge30sXG5cdFx0cmU6IHt9LFxuXHRcdG5zOiB7fSxcblx0XHRzdHJpbmc6IHt9LFxuXHRcdHdpa2k6IHt9LFxuXHRcdHVzZXI6IHt9LFxuXHRcdG1pc2M6IHt9LFxuXHRcdG9wdGlvbjoge30sXG5cdFx0b3B0aW9uRGVmYXVsdDoge30sXG5cdFx0ZmxhZzoge30sXG5cdFx0Y2FjaGU6IHt9LFxuXHRcdHN0cnVjdHVyZXM6IHt9LFxuXHRcdHRpbWVyOiB7fSxcblx0XHRjb3VudGVyOiB7fSxcblx0XHRjdXJyZW50OiB7fSxcblx0XHRmbjoge30sXG5cdFx0ZW5kb2ZsaXN0OiBudWxsLFxuXHR9O1xuXHQvKiBCYWlsIGlmIHRoZSBnYWRnZXQvc2NyaXB0IGlzIGJlaW5nIGxvYWRlZCB0d2ljZSAqL1xuXHQvKiBBbiBlbGVtZW50IHdpdGggaWQgXCJwZ1wiIHdvdWxkIGFkZCBhIHdpbmRvdy5wZyBwcm9wZXJ0eSwgaWdub3JlIHN1Y2ggcHJvcGVydHkgKi9cblx0aWYgKHdpbmRvdy5wZyAmJiAhKHdpbmRvdy5wZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuXHRcdHJldHVybjtcblx0fVxuXHQvKiBFeHBvcnQgdG8gZ2xvYmFsIGNvbnRleHQgKi9cblx0d2luZG93LnBnID0gcGc7XG5cdC8vIEVOREZJTEU6IG1haW4uanNcblx0Ly8gU1RBUlRGSUxFOiBhY3Rpb25zLmpzXG5cdGNvbnN0IHNldHVwVG9vbHRpcHMgPSAoY29udGFpbmVyLCByZW1vdmUsIGZvcmNlLCBwb3BEYXRhKSA9PiB7XG5cdFx0bG9nKGBzZXR1cFRvb2x0aXBzLCBjb250YWluZXI9JHtjb250YWluZXJ9LCByZW1vdmU9JHtyZW1vdmV9YCk7XG5cdFx0aWYgKCFjb250YWluZXIpIHtcblx0XHRcdC8vIHRoZSBtYWluIGluaXRpYWwgY2FsbFxuXHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwT25FZGl0U2VsZWN0aW9uJykgJiYgZG9jdW1lbnQgJiYgZG9jdW1lbnQuZWRpdGZvcm0gJiYgZG9jdW1lbnQuZWRpdGZvcm0ud3BUZXh0Ym94MSkge1xuXHRcdFx0XHRkb2N1bWVudC5lZGl0Zm9ybS53cFRleHRib3gxLm9ubW91c2V1cCA9IGRvU2VsZWN0aW9uUG9wdXA7XG5cdFx0XHR9XG5cdFx0XHQvLyBhcnRpY2xlL2NvbnRlbnQgaXMgYSBzdHJ1Y3R1cmUtZGVwZW5kZW50IHRoaW5nXG5cdFx0XHRjb250YWluZXIgPSBkZWZhdWx0UG9wdXBzQ29udGFpbmVyKCk7XG5cdFx0fVxuXHRcdGlmICghcmVtb3ZlICYmICFmb3JjZSAmJiBjb250YWluZXIucmFuU2V0dXBUb29sdGlwc0FscmVhZHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29udGFpbmVyLnJhblNldHVwVG9vbHRpcHNBbHJlYWR5ID0gIXJlbW92ZTtcblx0XHRjb25zdCBhbmNob3JzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblx0XHRzZXR1cFRvb2x0aXBzTG9vcChhbmNob3JzLCAwLCAyNTAsIDEwMCwgcmVtb3ZlLCBwb3BEYXRhKTtcblx0fTtcblx0Y29uc3QgZGVmYXVsdFBvcHVwc0NvbnRhaW5lciA9ICgpID0+IHtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBPbmx5QXJ0aWNsZUxpbmtzJykpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5za2luLXZlY3Rvci0yMDIyIC52ZWN0b3ItYm9keScpIHx8XG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd19jb250ZW50JykgfHxcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnQnKSB8fFxuXHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXJ0aWNsZScpIHx8XG5cdFx0XHRcdGRvY3VtZW50XG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH07XG5cdGNvbnN0IHNldHVwVG9vbHRpcHNMb29wID0gZnVuY3Rpb24gc2V0dXBUb29sdGlwc0xvb3AoYW5jaG9ycywgYmVnaW4sIGhvd21hbnksIHNsZWVwLCByZW1vdmUsIHBvcERhdGEsIC4uLmFyZ3MpIHtcblx0XHRsb2coXG5cdFx0XHRzaW1wbGVQcmludGYoJ3NldHVwVG9vbHRpcHNMb29wKCVzLCVzLCVzLCVzLCVzKScsIFtcblx0XHRcdFx0YW5jaG9ycyxcblx0XHRcdFx0YmVnaW4sXG5cdFx0XHRcdGhvd21hbnksXG5cdFx0XHRcdHNsZWVwLFxuXHRcdFx0XHRyZW1vdmUsXG5cdFx0XHRcdHBvcERhdGEsXG5cdFx0XHRcdC4uLmFyZ3MsXG5cdFx0XHRdKVxuXHRcdCk7XG5cdFx0Y29uc3QgZmluaXNoID0gYmVnaW4gKyBob3dtYW55O1xuXHRcdGNvbnN0IGxvb3BlbmQgPSBNYXRoLm1pbihmaW5pc2gsIGFuY2hvcnMubGVuZ3RoKTtcblx0XHRsZXQgaiA9IGxvb3BlbmQgLSBiZWdpbjtcblx0XHRsb2coXG5cdFx0XHRgc2V0dXBUb29sdGlwczogYW5jaG9ycy5sZW5ndGg9JHthbmNob3JzLmxlbmd0aH0sIGJlZ2luPSR7YmVnaW59LCBob3dtYW55PSR7aG93bWFueX0sIGxvb3BlbmQ9JHtsb29wZW5kfSwgcmVtb3ZlPSR7cmVtb3ZlfWBcblx0XHQpO1xuXHRcdGNvbnN0IGRvVG9vbHRpcCA9IHJlbW92ZSA/IHJlbW92ZVRvb2x0aXAgOiBhZGRUb29sdGlwO1xuXHRcdC8vIHRyeSBhIGZhc3RlciAoPykgbG9vcCBjb25zdHJ1Y3Rcblx0XHRpZiAoaiA+IDApIHtcblx0XHRcdGRvIHtcblx0XHRcdFx0Y29uc3QgYSA9IGFuY2hvcnNbbG9vcGVuZCAtIGpdO1xuXHRcdFx0XHRpZiAoYSA9PT0gdW5kZWZpbmVkIHx8ICFhIHx8ICFhLmhyZWYpIHtcblx0XHRcdFx0XHRsb2coYGdvdCBudWxsIGFuY2hvciBhdCBpbmRleCAke2xvb3BlbmR9YCAtIGopO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRvVG9vbHRpcChhLCBwb3BEYXRhKTtcblx0XHRcdH0gd2hpbGUgKC0taik7XG5cdFx0fVxuXHRcdGlmIChmaW5pc2ggPCBhbmNob3JzLmxlbmd0aCkge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHNldHVwVG9vbHRpcHNMb29wKGFuY2hvcnMsIGZpbmlzaCwgaG93bWFueSwgc2xlZXAsIHJlbW92ZSwgcG9wRGF0YSk7XG5cdFx0XHR9LCBzbGVlcCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghcmVtb3ZlICYmICFnZXRWYWx1ZU9mKCdwb3B1cFRvY0xpbmtzJykpIHtcblx0XHRcdFx0cm1Ub2NUb29sdGlwcygpO1xuXHRcdFx0fVxuXHRcdFx0cGcuZmxhZy5maW5pc2hlZExvYWRpbmcgPSB0cnVlO1xuXHRcdH1cblx0fTtcblx0Ly8gZWxpbWluYXRlIHBvcHVwcyBmcm9tIHRoZSBUT0Ncblx0Ly8gVGhpcyBhbHNvIGtpbGxzIGFueSBvbmNsaWNrIHN0dWZmIHRoYXQgdXNlZCB0byBiZSBnb2luZyBvbiBpbiB0aGUgdG9jXG5cdGNvbnN0IHJtVG9jVG9vbHRpcHMgPSAoKSA9PiB7XG5cdFx0Y29uc3QgdG9jID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvYycpO1xuXHRcdGlmICh0b2MpIHtcblx0XHRcdGNvbnN0IHRvY0xpbmtzID0gdG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblx0XHRcdGNvbnN0IHRvY0xlbiA9IHRvY0xpbmtzLmxlbmd0aDtcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgdG9jTGVuOyArK2opIHtcblx0XHRcdFx0cmVtb3ZlVG9vbHRpcCh0b2NMaW5rc1tqXSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhZGRUb29sdGlwID0gKGEsIHBvcERhdGEpID0+IHtcblx0XHRpZiAoIWlzUG9wdXBMaW5rKGEpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGEub25tb3VzZW92ZXIgPSBtb3VzZU92ZXJXaWtpTGluaztcblx0XHRhLm9ubW91c2VvdXQgPSBtb3VzZU91dFdpa2lMaW5rO1xuXHRcdGEub25tb3VzZWRvd24gPSBraWxsUG9wdXA7XG5cdFx0YS5oYXNQb3B1cCA9IHRydWU7XG5cdFx0YS5wb3BEYXRhID0gcG9wRGF0YTtcblx0fTtcblx0Y29uc3QgcmVtb3ZlVG9vbHRpcCA9IChhKSA9PiB7XG5cdFx0aWYgKCFhLmhhc1BvcHVwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGEub25tb3VzZW92ZXIgPSBudWxsO1xuXHRcdGEub25tb3VzZW91dCA9IG51bGw7XG5cdFx0aWYgKGEub3JpZ2luYWxUaXRsZSkge1xuXHRcdFx0YS50aXRsZSA9IGEub3JpZ2luYWxUaXRsZTtcblx0XHR9XG5cdFx0YS5oYXNQb3B1cCA9IGZhbHNlO1xuXHR9O1xuXHRjb25zdCByZW1vdmVUaXRsZSA9IChhKSA9PiB7XG5cdFx0aWYgKCFhLm9yaWdpbmFsVGl0bGUpIHtcblx0XHRcdGEub3JpZ2luYWxUaXRsZSA9IGEudGl0bGU7XG5cdFx0fVxuXHRcdGEudGl0bGUgPSAnJztcblx0fTtcblx0Y29uc3QgcmVzdG9yZVRpdGxlID0gKGEpID0+IHtcblx0XHRpZiAoYS50aXRsZSB8fCAhYS5vcmlnaW5hbFRpdGxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGEudGl0bGUgPSBhLm9yaWdpbmFsVGl0bGU7XG5cdH07XG5cdGNvbnN0IHJlZ2lzdGVySG9va3MgPSAobnApID0+IHtcblx0XHRjb25zdCBwb3B1cE1heFdpZHRoID0gZ2V0VmFsdWVPZigncG9wdXBNYXhXaWR0aCcpO1xuXHRcdGlmICh0eXBlb2YgcG9wdXBNYXhXaWR0aCA9PT0gJ251bWJlcicpIHtcblx0XHRcdGNvbnN0IHNldE1heFdpZHRoID0gKCkgPT4ge1xuXHRcdFx0XHRucC5tYWluRGl2LnN0eWxlLm1heFdpZHRoID0gYCR7cG9wdXBNYXhXaWR0aH1weGA7XG5cdFx0XHRcdG5wLm1heFdpZHRoID0gcG9wdXBNYXhXaWR0aDtcblx0XHRcdH07XG5cdFx0XHRucC5hZGRIb29rKHNldE1heFdpZHRoLCAndW5oaWRlJywgJ2JlZm9yZScpO1xuXHRcdH1cblx0XHRucC5hZGRIb29rKGFkZFBvcHVwU2hvcnRjdXRzLCAndW5oaWRlJywgJ2FmdGVyJyk7XG5cdFx0bnAuYWRkSG9vayhybVBvcHVwU2hvcnRjdXRzLCAnaGlkZScsICdiZWZvcmUnKTtcblx0fTtcblx0Y29uc3QgcmVtb3ZlTW9kaWZpZXJLZXlMaXN0ZW5lciA9IChhKSA9PiB7XG5cdFx0Ly8gcmVtb3ZlIGxpc3RlbmVycyBmb3IgbW9kaWZpZXIga2V5IGlmIGFueSB0aGF0IHdlcmUgYWRkZWQgaW4gbW91c2VPdmVyV2lraUxpbmtcblx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYS5tb2RpZmllcktleUxpc3RlbmVyLCBmYWxzZSk7XG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBhLm1vZGlmaWVyS2V5TGlzdGVuZXIsIGZhbHNlKTtcblx0fTtcblx0Y29uc3QgbW91c2VPdmVyV2lraUxpbmsgPSBmdW5jdGlvbiBtb3VzZU92ZXJXaWtpTGluayhldnQpIHtcblx0XHRpZiAoIWV2dCAmJiB3aW5kb3cuZXZlbnQpIHtcblx0XHRcdGV2dCA9IHdpbmRvdy5ldmVudDtcblx0XHR9XG5cdFx0Ly8gaWYgdGhlIG1vZGlmaWVyIGlzIG5lZWRlZCwgbGlzdGVuIGZvciBpdCxcblx0XHQvLyB3ZSB3aWxsIHJlbW92ZSB0aGUgbGlzdGVuZXIgd2hlbiB3ZSBtb3VzZW91dCBvZiB0aGlzIGxpbmsgb3Iga2lsbCBwb3B1cC5cblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBNb2RpZmllcicpKSB7XG5cdFx0XHQvLyBpZiBwb3B1cE1vZGlmaWVyQWN0aW9uID0gZW5hYmxlLCB3ZSBzaG91bGQgcG9wdXAgd2hlbiB0aGUgbW9kaWZpZXIgaXMgcHJlc3NlZFxuXHRcdFx0Ly8gaWYgcG9wdXBNb2RpZmllckFjdGlvbiA9IGRpc2FibGUsIHdlIHNob3VsZCBwb3B1cCB1bmxlc3MgdGhlIG1vZGlmaWVyIGlzIHByZXNzZWRcblx0XHRcdGNvbnN0IGFjdGlvbiA9IGdldFZhbHVlT2YoJ3BvcHVwTW9kaWZpZXJBY3Rpb24nKTtcblx0XHRcdGNvbnN0IGtleSA9IGFjdGlvbiA9PT0gJ2Rpc2FibGUnID8gJ2tleXVwJyA6ICdrZXlkb3duJztcblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0c2VsZi5tb2RpZmllcktleUxpc3RlbmVyID0gKGV2dCkgPT4ge1xuXHRcdFx0XHRtb3VzZU92ZXJXaWtpTGluazIoc2VsZiwgZXZ0KTtcblx0XHRcdH07XG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGtleSwgc2VsZi5tb2RpZmllcktleUxpc3RlbmVyLCBmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiBtb3VzZU92ZXJXaWtpTGluazIodGhpcywgZXZ0KTtcblx0fTtcblx0LyoqXG5cdCAqIEdldHMgdGhlIHJlZmVyZW5jZXMgbGlzdCBpdGVtIHRoYXQgdGhlIHByb3ZpZGVkIGZvb3Rub3RlIGxpbmsgdGFyZ2V0cy4gVGhpc1xuXHQgKiBpcyB0eXBpY2FsbHkgYSBsaSBlbGVtZW50IHdpdGhpbiB0aGUgb2wucmVmZXJlbmNlcyBlbGVtZW50IGluc2lkZSB0aGUgcmVmbGlzdC5cblx0ICpcblx0ICogQHBhcmFtIHtFbGVtZW50fSBhIC0gQSBmb290bm90ZSBsaW5rLlxuXHQgKiBAcmV0dXJuIHtFbGVtZW50fGJvb2xlYW59IFRoZSB0YXJnZXRlZCBlbGVtZW50LCBvciBmYWxzZSBpZiBvbmUgY2FuJ3QgYmUgZm91bmQuXG5cdCAqL1xuXHRjb25zdCBmb290bm90ZVRhcmdldCA9IChhKSA9PiB7XG5cdFx0Y29uc3QgYVRpdGxlID0gVGl0bGUuZnJvbUFuY2hvcihhKTtcblx0XHQvLyBXZSB3YW50IFwiLjNBXCIgcmF0aGVyIHRoYW4gXCIlM0FcIiBvciBcIj9cIiBoZXJlLCBzbyB1c2UgdGhlIGFuY2hvciBwcm9wZXJ0eSBkaXJlY3RseVxuXHRcdGNvbnN0IGFuY2ggPSBhVGl0bGUuYW5jaG9yO1xuXHRcdGlmICghL14oY2l0ZV9ub3RlLXxfbm90ZS18ZW5kbm90ZSkvLnRlc3QoYW5jaCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgbFRpdGxlID0gVGl0bGUuZnJvbVVSTChsb2NhdGlvbi5ocmVmKTtcblx0XHRpZiAobFRpdGxlLnRvU3RyaW5nKHRydWUpICE9PSBhVGl0bGUudG9TdHJpbmcodHJ1ZSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0bGV0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7YW5jaH1gKTtcblx0XHR3aGlsZSAoZWwgJiYgdHlwZW9mIGVsLm5vZGVOYW1lID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y29uc3QgbnQgPSBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aWYgKG50ID09PSAnbGknKSB7XG5cdFx0XHRcdHJldHVybiBlbDtcblx0XHRcdH0gZWxzZSBpZiAobnQgPT09ICdib2R5Jykge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKGVsLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0ZWwgPSBlbC5wYXJlbnROb2RlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdGNvbnN0IGZvb3Rub3RlUHJldmlldyA9ICh4LCBuYXZwb3ApID0+IHtcblx0XHRzZXRQb3B1cEhUTUwoYDxocj4ke3guaW5uZXJIVE1MfWAsICdwb3B1cFByZXZpZXcnLCBuYXZwb3AuaWROdW1iZXIpO1xuXHR9O1xuXHRjb25zdCBtb2RpZmllclByZXNzZWQgPSAoZXZ0KSA9PiB7XG5cdFx0Y29uc3QgbW9kID0gZ2V0VmFsdWVPZigncG9wdXBNb2RpZmllcicpO1xuXHRcdGlmICghbW9kKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghZXZ0ICYmIHdpbmRvdy5ldmVudCkge1xuXHRcdFx0ZXZ0ID0gd2luZG93LmV2ZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gZXZ0ICYmIG1vZCAmJiBldnRbYCR7bW9kLnRvTG93ZXJDYXNlKCl9S2V5YF07XG5cdH07XG5cdC8vIENoZWNrcyBpZiB0aGUgY29ycmVjdCBtb2RpZmllciBwcmVzc2VkL3VucHJlc3NlZCBpZiBuZWVkZWRcblx0Y29uc3QgaXNDb3JyZWN0TW9kaWZpZXIgPSAoX2EsIGV2dCkgPT4ge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBNb2RpZmllcicpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gaWYgcG9wdXBNb2RpZmllckFjdGlvbiA9IGVuYWJsZSwgd2Ugc2hvdWxkIHBvcHVwIHdoZW4gdGhlIG1vZGlmaWVyIGlzIHByZXNzZWRcblx0XHQvLyBpZiBwb3B1cE1vZGlmaWVyQWN0aW9uID0gZGlzYWJsZSwgd2Ugc2hvdWxkIHBvcHVwIHVubGVzcyB0aGUgbW9kaWZpZXIgaXMgcHJlc3NlZFxuXHRcdGNvbnN0IGFjdGlvbiA9IGdldFZhbHVlT2YoJ3BvcHVwTW9kaWZpZXJBY3Rpb24nKTtcblx0XHRyZXR1cm4gKGFjdGlvbiA9PT0gJ2VuYWJsZScgJiYgbW9kaWZpZXJQcmVzc2VkKGV2dCkpIHx8IChhY3Rpb24gPT09ICdkaXNhYmxlJyAmJiAhbW9kaWZpZXJQcmVzc2VkKGV2dCkpO1xuXHR9O1xuXHRjb25zdCBtb3VzZU92ZXJXaWtpTGluazIgPSAoYSwgZXZ0KSA9PiB7XG5cdFx0aWYgKCFpc0NvcnJlY3RNb2RpZmllcihhLCBldnQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChnZXRWYWx1ZU9mKCdyZW1vdmVUaXRsZXMnKSkge1xuXHRcdFx0cmVtb3ZlVGl0bGUoYSk7XG5cdFx0fVxuXHRcdGlmIChhID09PSBwZy5jdXJyZW50LmxpbmsgJiYgYS5uYXZwb3B1cCAmJiBhLm5hdnBvcHVwLmlzVmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHBnLmN1cnJlbnQubGluayA9IGE7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3NpbXBsZVBvcHVwcycpICYmICFwZy5vcHRpb24ucG9wdXBTdHJ1Y3R1cmUpIHtcblx0XHRcdC8vIHJlc2V0ICpkZWZhdWx0IHZhbHVlKiBvZiBwb3B1cFN0cnVjdHVyZVxuXHRcdFx0c2V0RGVmYXVsdCgncG9wdXBTdHJ1Y3R1cmUnLCAnb3JpZ2luYWwnKTtcblx0XHR9XG5cdFx0Y29uc3QgYXJ0aWNsZSA9IG5ldyBUaXRsZSgpLmZyb21BbmNob3IoYSk7XG5cdFx0Ly8gc2V0IGdsb2JhbCB2YXJpYWJsZSAodWdoKSB0byBob2xkIGFydGljbGUgKHdpa2lwYWdlKVxuXHRcdHBnLmN1cnJlbnQuYXJ0aWNsZSA9IGFydGljbGU7XG5cdFx0aWYgKCFhLm5hdnBvcHVwKSB7XG5cdFx0XHRhLm5hdnBvcHVwID0gbmV3TmF2cG9wdXAoYSwgYXJ0aWNsZSk7XG5cdFx0XHRwZy5jdXJyZW50LmxpbmtzSGFzaFthLmhyZWZdID0gYS5uYXZwb3B1cDtcblx0XHRcdHBnLmN1cnJlbnQubGlua3MucHVzaChhKTtcblx0XHR9XG5cdFx0aWYgKGEubmF2cG9wdXAucGVuZGluZyA9PT0gbnVsbCB8fCBhLm5hdnBvcHVwLnBlbmRpbmcgIT09IDApIHtcblx0XHRcdC8vIGVpdGhlciBmcmVzaCBwb3B1cHMgb3IgdGhvc2Ugd2l0aCB1bmZpbnNoZWQgYnVzaW5lc3MgYXJlIHJlZG9uZSBmcm9tIHNjcmF0Y2hcblx0XHRcdHNpbXBsZVBvcHVwQ29udGVudChhLCBhcnRpY2xlKTtcblx0XHR9XG5cdFx0YS5uYXZwb3B1cC5zaG93U29vbklmU3RhYmxlKGEubmF2cG9wdXAuZGVsYXkpO1xuXHRcdGNsZWFySW50ZXJ2YWwocGcudGltZXIuY2hlY2tQb3B1cFBvc2l0aW9uKTtcblx0XHRwZy50aW1lci5jaGVja1BvcHVwUG9zaXRpb24gPSBzZXRJbnRlcnZhbChjaGVja1BvcHVwUG9zaXRpb24sIDYwMCk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3NpbXBsZVBvcHVwcycpICYmIGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld0J1dHRvbicpICYmICFhLnNpbXBsZU5vTW9yZSkge1xuXHRcdFx0Y29uc3QgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0ZC5jbGFzc05hbWUgPSAncG9wdXBQcmV2aWV3QnV0dG9uRGl2Jztcblx0XHRcdGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHRkLmFwcGVuZChzKTtcblx0XHRcdHMuY2xhc3NOYW1lID0gJ3BvcHVwUHJldmlld0J1dHRvbic7XG5cdFx0XHRzW2BvbiR7Z2V0VmFsdWVPZigncG9wdXBQcmV2aWV3QnV0dG9uRXZlbnQnKX1gXSA9ICgpID0+IHtcblx0XHRcdFx0YS5zaW1wbGVOb01vcmUgPSB0cnVlO1xuXHRcdFx0XHRkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRcdG5vbnNpbXBsZVBvcHVwQ29udGVudChhLCBhcnRpY2xlKTtcblx0XHRcdH07XG5cdFx0XHRzLmlubmVySFRNTCA9IHBvcHVwU3RyaW5nKCdzaG93IHByZXZpZXcnKTtcblx0XHRcdHNldFBvcHVwSFRNTChkLCAncG9wdXBQcmV2aWV3JywgYS5uYXZwb3B1cC5pZE51bWJlcik7XG5cdFx0fVxuXHRcdGlmIChhLm5hdnBvcHVwLnBlbmRpbmcgIT09IDApIHtcblx0XHRcdG5vbnNpbXBsZVBvcHVwQ29udGVudChhLCBhcnRpY2xlKTtcblx0XHR9XG5cdH07XG5cdC8vIHNpbXBsZVBvcHVwQ29udGVudDogdGhlIGNvbnRlbnQgdGhhdCBkbyBub3QgcmVxdWlyZSBhZGRpdGlvbmFsIGRvd25sb2FkXG5cdC8vIChpdCBpcyBzaG93biBldmVuIHdoZW4gc2ltcGxlUG9wdXBzIGlzIHRydWUpXG5cdGNvbnN0IHNpbXBsZVBvcHVwQ29udGVudCA9IChhLCBhcnRpY2xlKSA9PiB7XG5cdFx0LyogRklYTUUgaGFjayAqL1xuXHRcdGEubmF2cG9wdXAuaGFzUG9wdXBNZW51ID0gZmFsc2U7XG5cdFx0YS5uYXZwb3B1cC5zZXRJbm5lckhUTUwocG9wdXBIVE1MKGEpKTtcblx0XHRmaWxsRW1wdHlTcGFucyh7XG5cdFx0XHRuYXZwb3B1cDogYS5uYXZwb3B1cCxcblx0XHR9KTtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBEcmFnZ2FibGUnKSkge1xuXHRcdFx0bGV0IGRyYWdIYW5kbGUgPSBnZXRWYWx1ZU9mKCdwb3B1cERyYWdIYW5kbGUnKSB8fCBudWxsO1xuXHRcdFx0aWYgKGRyYWdIYW5kbGUgJiYgZHJhZ0hhbmRsZSAhPT0gJ2FsbCcpIHtcblx0XHRcdFx0ZHJhZ0hhbmRsZSArPSBhLm5hdnBvcHVwLmlkTnVtYmVyO1xuXHRcdFx0fVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGEubmF2cG9wdXAubWFrZURyYWdnYWJsZShkcmFnSGFuZGxlKTtcblx0XHRcdH0sIDE1MCk7XG5cdFx0fVxuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFJlZGxpbmtSZW1vdmFsJykgJiYgYS5jbGFzc05hbWUgPT09ICduZXcnKSB7XG5cdFx0XHRzZXRQb3B1cEhUTUwoYDxicj4ke3BvcHVwUmVkbGlua0hUTUwoYXJ0aWNsZSl9YCwgJ3BvcHVwUmVkbGluaycsIGEubmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZGVidWdEYXRhID0gKG5hdnBvcHVwKSA9PiB7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwRGVidWdnaW5nJykgJiYgbmF2cG9wdXAuaWROdW1iZXIpIHtcblx0XHRcdHNldFBvcHVwSFRNTChgaWROdW1iZXI9JHtuYXZwb3B1cC5pZE51bWJlcn0sIHBlbmRpbmc9JHtuYXZwb3B1cC5wZW5kaW5nfWAsICdwb3B1cEVycm9yJywgbmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgbmV3TmF2cG9wdXAgPSAoYSwgYXJ0aWNsZSkgPT4ge1xuXHRcdGNvbnN0IG5hdnBvcHVwID0gbmV3IE5hdnBvcHVwKCk7XG5cdFx0bmF2cG9wdXAuZnV6eiA9IDU7XG5cdFx0bmF2cG9wdXAuZGVsYXkgPSBnZXRWYWx1ZU9mKCdwb3B1cERlbGF5JykgKiAxMDAwO1xuXHRcdC8vIGluY3JlbWVudCBnbG9iYWwgY291bnRlciBub3dcblx0XHRuYXZwb3B1cC5pZE51bWJlciA9ICsrcGcuaWROdW1iZXI7XG5cdFx0bmF2cG9wdXAucGFyZW50QW5jaG9yID0gYTtcblx0XHRuYXZwb3B1cC5wYXJlbnRQb3B1cCA9IGEucG9wRGF0YSAmJiBhLnBvcERhdGEub3duZXI7XG5cdFx0bmF2cG9wdXAuYXJ0aWNsZSA9IGFydGljbGU7XG5cdFx0cmVnaXN0ZXJIb29rcyhuYXZwb3B1cCk7XG5cdFx0cmV0dXJuIG5hdnBvcHVwO1xuXHR9O1xuXHQvLyBTaG91bGQgd2Ugc2hvdyBub25zaW1wbGUgY29udGV4dD9cblx0Ly8gSWYgc2ltcGxlUG9wdXBzIGlzIHNldCB0byB0cnVlLCB0aGVuIHdlIGRvIG5vdCBzaG93IG5vbnNpbXBsZSBjb250ZXh0LFxuXHQvLyBidXQgaWYgYSBib3R0b20gXCJzaG93IHByZXZpZXdcIiB3YXMgY2xpY2tlZCB3ZSBkbyBzaG93IG5vbnNpbXBsZSBjb250ZXh0XG5cdGNvbnN0IHNob3VsZFNob3dOb25TaW1wbGUgPSAoYSkgPT4ge1xuXHRcdHJldHVybiAhZ2V0VmFsdWVPZignc2ltcGxlUG9wdXBzJykgfHwgYS5zaW1wbGVOb01vcmU7XG5cdH07XG5cdC8vIFNob3VsZCB3ZSBzaG93IG5vbnNpbXBsZSBjb250ZXh0IGdvdmVybiBieSB0aGUgb3B0aW9uIChlLmcuIHBvcHVwVXNlckluZm8pP1xuXHQvLyBJZiB0aGUgdXNlciBleHBsaWNpdGx5IGFza2VkIGZvciBub25zaW1wbGUgY29udGV4dCBieSBzZXR0aW5nIHRoZSBvcHRpb24gdG8gdHJ1ZSxcblx0Ly8gdGhlbiB3ZSBzaG93IGl0IGV2ZW4gaW4gbm9uc2ltcGxlIG1vZGUuXG5cdGNvbnN0IHNob3VsZFNob3cgPSAoYSwgb3B0aW9uKSA9PiB7XG5cdFx0aWYgKHNob3VsZFNob3dOb25TaW1wbGUoYSkpIHtcblx0XHRcdHJldHVybiBnZXRWYWx1ZU9mKG9wdGlvbik7XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3dbb3B0aW9uXSAhPT0gdW5kZWZpbmVkICYmIHdpbmRvd1tvcHRpb25dO1xuXHR9O1xuXHRjb25zdCBub25zaW1wbGVQb3B1cENvbnRlbnQgPSAoYSwgYXJ0aWNsZSkgPT4ge1xuXHRcdGxldCBkaWZmO1xuXHRcdGxldCBoaXN0b3J5O1xuXHRcdGNvbnN0IHBhcmFtcyA9IHBhcnNlUGFyYW1zKGEuaHJlZik7XG5cdFx0Y29uc3Qgb2xkaWQgPSBwYXJhbXMub2xkaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBwYXJhbXMub2xkaWQ7XG5cdFx0aWYgKHNob3VsZFNob3coYSwgJ3BvcHVwUHJldmlld0RpZmZzJykpIHtcblx0XHRcdCh7ZGlmZn0gPSBwYXJhbXMpO1xuXHRcdH1cblx0XHRpZiAoc2hvdWxkU2hvdyhhLCAncG9wdXBQcmV2aWV3SGlzdG9yeScpKSB7XG5cdFx0XHRoaXN0b3J5ID0gcGFyYW1zLmFjdGlvbiA9PT0gJ2hpc3RvcnknO1xuXHRcdH1cblx0XHRhLm5hdnBvcHVwLnBlbmRpbmcgPSAwO1xuXHRcdGNvbnN0IHJlZmVyZW5jZUVsZW1lbnQgPSBmb290bm90ZVRhcmdldChhKTtcblx0XHRpZiAocmVmZXJlbmNlRWxlbWVudCkge1xuXHRcdFx0Zm9vdG5vdGVQcmV2aWV3KHJlZmVyZW5jZUVsZW1lbnQsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoZGlmZiB8fCBkaWZmID09PSAwKSB7XG5cdFx0XHRsb2FkRGlmZihhcnRpY2xlLCBvbGRpZCwgZGlmZiwgYS5uYXZwb3B1cCk7XG5cdFx0fSBlbHNlIGlmIChoaXN0b3J5KSB7XG5cdFx0XHRsb2FkQVBJUHJldmlldygnaGlzdG9yeScsIGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoc2hvdWxkU2hvd05vblNpbXBsZShhKSAmJiBwZy5yZS5jb250cmlicy50ZXN0KGEuaHJlZikpIHtcblx0XHRcdGxvYWRBUElQcmV2aWV3KCdjb250cmlicycsIGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoc2hvdWxkU2hvd05vblNpbXBsZShhKSAmJiBwZy5yZS5iYWNrbGlua3MudGVzdChhLmhyZWYpKSB7XG5cdFx0XHRsb2FkQVBJUHJldmlldygnYmFja2xpbmtzJywgYXJ0aWNsZSwgYS5uYXZwb3B1cCk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdC8vIEZJWE1FIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhbGwgcHJldmlldyBjb21iaW5hdGlvbnMgd2l0aCBvcHRpb25zXG5cdFx0XHRhcnRpY2xlLm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zSW1hZ2VJZCAmJlxuXHRcdFx0KHNob3VsZFNob3coYSwgJ2ltYWdlUG9wdXBzRm9ySW1hZ2VzJykgfHwgIWFuY2hvckNvbnRhaW5zSW1hZ2UoYSkpXG5cdFx0KSB7XG5cdFx0XHRsb2FkQVBJUHJldmlldygnaW1hZ2VwYWdlcHJldmlldycsIGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdFx0bG9hZEltYWdlKGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYXJ0aWNsZS5uYW1lc3BhY2VJZCgpID09PSBwZy5uc0NhdGVnb3J5SWQgJiYgc2hvdWxkU2hvdyhhLCAncG9wdXBDYXRlZ29yeU1lbWJlcnMnKSkge1xuXHRcdFx0XHRsb2FkQVBJUHJldmlldygnY2F0ZWdvcnknLCBhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChhcnRpY2xlLm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zVXNlcklkIHx8IGFydGljbGUubmFtZXNwYWNlSWQoKSA9PT0gcGcubnNVc2VydGFsa0lkKSAmJlxuXHRcdFx0XHRzaG91bGRTaG93KGEsICdwb3B1cFVzZXJJbmZvJylcblx0XHRcdCkge1xuXHRcdFx0XHRsb2FkQVBJUHJldmlldygndXNlcmluZm8nLCBhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHRcdH1cblx0XHRcdGlmIChzaG91bGRTaG93Tm9uU2ltcGxlKGEpKSB7XG5cdFx0XHRcdHN0YXJ0QXJ0aWNsZVByZXZpZXcoYXJ0aWNsZSwgb2xkaWQsIGEubmF2cG9wdXApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgcGVuZGluZ05hdnBvcFRhc2sgPSAobmF2cG9wKSA9PiB7XG5cdFx0aWYgKG5hdnBvcCAmJiBuYXZwb3AucGVuZGluZyA9PT0gbnVsbCkge1xuXHRcdFx0bmF2cG9wLnBlbmRpbmcgPSAwO1xuXHRcdH1cblx0XHQrK25hdnBvcC5wZW5kaW5nO1xuXHRcdGRlYnVnRGF0YShuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBjb21wbGV0ZWROYXZwb3BUYXNrID0gKG5hdnBvcCkgPT4ge1xuXHRcdGlmIChuYXZwb3AgJiYgbmF2cG9wLnBlbmRpbmcpIHtcblx0XHRcdC0tbmF2cG9wLnBlbmRpbmc7XG5cdFx0fVxuXHRcdGRlYnVnRGF0YShuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBzdGFydEFydGljbGVQcmV2aWV3ID0gKGFydGljbGUsIG9sZGlkLCBuYXZwb3ApID0+IHtcblx0XHRuYXZwb3AucmVkaXIgPSAwO1xuXHRcdGxvYWRQcmV2aWV3KGFydGljbGUsIG9sZGlkLCBuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBsb2FkUHJldmlldyA9IChhcnRpY2xlLCBvbGRpZCwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKCFuYXZwb3AucmVkaXIpIHtcblx0XHRcdG5hdnBvcC5vcmlnaW5hbEFydGljbGUgPSBhcnRpY2xlO1xuXHRcdH1cblx0XHRhcnRpY2xlLm9sZGlkID0gb2xkaWQ7XG5cdFx0bG9hZEFQSVByZXZpZXcoJ3JldmlzaW9uJywgYXJ0aWNsZSwgbmF2cG9wKTtcblx0fTtcblx0Y29uc3QgbG9hZFByZXZpZXdGcm9tUmVkaXIgPSAocmVkaXJNYXRjaCwgbmF2cG9wKSA9PiB7XG5cdFx0Ly8gcmVkaXJNYXRjaCBpcyBhIHJlZ2V4IG1hdGNoXG5cdFx0Y29uc3QgdGFyZ2V0ID0gbmV3IFRpdGxlKCkuZnJvbVdpa2lUZXh0KHJlZGlyTWF0Y2hbMl0pO1xuXHRcdC8vIG92ZXJ3cml0ZSAob3IgYWRkKSBhbmNob3IgZnJvbSBvcmlnaW5hbCB0YXJnZXRcblx0XHQvLyBtZWRpYXdpa2kgZG9lcyBvdmVyd3JpdGVcblx0XHRpZiAobmF2cG9wLmFydGljbGUuYW5jaG9yKSB7XG5cdFx0XHR0YXJnZXQuYW5jaG9yID0gbmF2cG9wLmFydGljbGUuYW5jaG9yO1xuXHRcdH1cblx0XHRuYXZwb3AucmVkaXIrKztcblx0XHRuYXZwb3AucmVkaXJUYXJnZXQgPSB0YXJnZXQ7XG5cdFx0Y29uc3Qgd2FyblJlZGlyID0gcmVkaXJMaW5rKHRhcmdldCwgbmF2cG9wLmFydGljbGUpO1xuXHRcdHNldFBvcHVwSFRNTCh3YXJuUmVkaXIsICdwb3B1cFdhcm5SZWRpcicsIG5hdnBvcC5pZE51bWJlcik7XG5cdFx0bmF2cG9wLmFydGljbGUgPSB0YXJnZXQ7XG5cdFx0ZmlsbEVtcHR5U3BhbnMoe1xuXHRcdFx0cmVkaXI6IHRydWUsXG5cdFx0XHRyZWRpclRhcmdldDogdGFyZ2V0LFxuXHRcdFx0bmF2cG9wdXA6IG5hdnBvcCxcblx0XHR9KTtcblx0XHRyZXR1cm4gbG9hZFByZXZpZXcodGFyZ2V0LCBudWxsLCBuYXZwb3ApO1xuXHR9O1xuXHRjb25zdCBpbnNlcnRQcmV2aWV3ID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0aWYgKCFkb3dubG9hZC5vd25lcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCByZWRpck1hdGNoID0gcGcucmUucmVkaXJlY3QuZXhlYyhkb3dubG9hZC5kYXRhKTtcblx0XHRpZiAoZG93bmxvYWQub3duZXIucmVkaXIgPT09IDAgJiYgcmVkaXJNYXRjaCkge1xuXHRcdFx0bG9hZFByZXZpZXdGcm9tUmVkaXIocmVkaXJNYXRjaCwgZG93bmxvYWQub3duZXIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZG93bmxvYWQub3duZXIudmlzaWJsZSB8fCAhZ2V0VmFsdWVPZigncG9wdXBMYXp5UHJldmlld3MnKSkge1xuXHRcdFx0aW5zZXJ0UHJldmlld05vdyhkb3dubG9hZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGlkID0gZG93bmxvYWQub3duZXIucmVkaXIgPyAnUFJFVklFV19SRURJUl9IT09LJyA6ICdQUkVWSUVXX0hPT0snO1xuXHRcdFx0ZG93bmxvYWQub3duZXIuYWRkSG9vayhcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGluc2VydFByZXZpZXdOb3coZG93bmxvYWQpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQndW5oaWRlJyxcblx0XHRcdFx0J2FmdGVyJyxcblx0XHRcdFx0aWRcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBpbnNlcnRQcmV2aWV3Tm93ID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0aWYgKCFkb3dubG9hZC5vd25lcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB3aWtpVGV4dCA9IGRvd25sb2FkLmRhdGE7XG5cdFx0Y29uc3QgbmF2cG9wID0gZG93bmxvYWQub3duZXI7XG5cdFx0Y29uc3QgYXJ0ID0gbmF2cG9wLnJlZGlyVGFyZ2V0IHx8IG5hdnBvcC5vcmlnaW5hbEFydGljbGU7XG5cdFx0bWFrZUZpeERhYnMod2lraVRleHQsIG5hdnBvcCk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwU3VtbWFyeURhdGEnKSkge1xuXHRcdFx0Z2V0UGFnZUluZm8od2lraVRleHQsIGRvd25sb2FkKTtcblx0XHRcdHNldFBvcHVwVHJhaWxlcihnZXRQYWdlSW5mbyh3aWtpVGV4dCwgZG93bmxvYWQpLCBuYXZwb3AuaWROdW1iZXIpO1xuXHRcdH1cblx0XHRsZXQgaW1hZ2VQYWdlID0gJyc7XG5cdFx0aW1hZ2VQYWdlID0gYXJ0Lm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zSW1hZ2VJZCA/IGFydC50b1N0cmluZygpIDogZ2V0VmFsaWRJbWFnZUZyb21XaWtpVGV4dCh3aWtpVGV4dCk7XG5cdFx0aWYgKGltYWdlUGFnZSkge1xuXHRcdFx0bG9hZEltYWdlKFRpdGxlLmZyb21XaWtpVGV4dChpbWFnZVBhZ2UpLCBuYXZwb3ApO1xuXHRcdH1cblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3cycpKSB7XG5cdFx0XHRpbnNlcnRBcnRpY2xlUHJldmlldyhkb3dubG9hZCwgYXJ0LCBuYXZwb3ApO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgaW5zZXJ0QXJ0aWNsZVByZXZpZXcgPSAoZG93bmxvYWQsIGFydCwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKGRvd25sb2FkICYmIHR5cGVvZiBkb3dubG9hZC5kYXRhID09PSB0eXBlb2YgJycpIHtcblx0XHRcdGlmIChhcnQubmFtZXNwYWNlSWQoKSA9PT0gcGcubnNUZW1wbGF0ZUlkICYmIGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld1Jhd1RlbXBsYXRlcycpKSB7XG5cdFx0XHRcdC8vIEZJWE1FIGNvbXBhcmUvY29uc29saWRhdGUgd2l0aCBkaWZmIGVzY2FwaW5nIGNvZGUgZm9yIHdpa2l0ZXh0XG5cdFx0XHRcdGNvbnN0IGggPSBgPGhyPjxzcGFuIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj4ke2Rvd25sb2FkLmRhdGFcblx0XHRcdFx0XHQuZW50aWZ5KClcblx0XHRcdFx0XHQuc3BsaXQoJ1xcXFxuJylcblx0XHRcdFx0XHQuam9pbignPGJyPlxcXFxuJyl9PC9zcGFuPmA7XG5cdFx0XHRcdHNldFBvcHVwSFRNTChoLCAncG9wdXBQcmV2aWV3JywgbmF2cG9wLmlkTnVtYmVyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHAgPSBwcmVwUHJldmlld21ha2VyKGRvd25sb2FkLmRhdGEsIGFydCwgbmF2cG9wKTtcblx0XHRcdFx0cC5zaG93UHJldmlldygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgcHJlcFByZXZpZXdtYWtlciA9IChkYXRhLCBhcnRpY2xlLCBuYXZwb3ApID0+IHtcblx0XHQvLyBkZWFsIHdpdGggdHJpY2tzeSBhbmNob3JzXG5cdFx0Y29uc3QgZCA9IGFuY2hvcml6ZShkYXRhLCBhcnRpY2xlLmFuY2hvclN0cmluZygpKTtcblx0XHRjb25zdCB1cmxCYXNlID0gam9pblBhdGgoW3BnLndpa2kuYXJ0aWNsZWJhc2UsIGFydGljbGUudXJsU3RyaW5nKCldKTtcblx0XHRjb25zdCBwID0gbmV3IFByZXZpZXdtYWtlcihkLCB1cmxCYXNlLCBuYXZwb3ApO1xuXHRcdHJldHVybiBwO1xuXHR9O1xuXHQvLyBUcnkgdG8gaW1pdGF0ZSB0aGUgd2F5IG1lZGlhd2lraSBnZW5lcmF0ZXMgSFRNTCBhbmNob3JzIGZyb20gc2VjdGlvbiB0aXRsZXNcblx0Y29uc3QgYW5jaG9yaXplID0gKGQsIGFuY2gpID0+IHtcblx0XHRpZiAoIWFuY2gpIHtcblx0XHRcdHJldHVybiBkO1xuXHRcdH1cblx0XHRjb25zdCBhbmNoUmUgPSBuZXcgUmVnRXhwKFxuXHRcdFx0YCg/Oj0rXFxcXHMqJHtsaXRlcmFsaXplUmVnZXgoYW5jaCkucmVwbGFjZSgvWyBfXS9nLCAnW18gXScpfVxcXFxzKj0rfFxcXFx7XFxcXHtcXFxccyoke2dldFZhbHVlT2YoXG5cdFx0XHRcdCdwb3B1cEFuY2hvclJlZ2V4cCdcblx0XHRcdCl9XFxcXHMqKD86XFxcXHxbXnx9XSopKj9cXFxccyoke2xpdGVyYWxpemVSZWdleChhbmNoKX1cXFxccyooPzpcXFxcfFtefV0qKT99fSlgXG5cdFx0KTtcblx0XHRjb25zdCBtYXRjaCA9IGQubWF0Y2goYW5jaFJlKTtcblx0XHRpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMCAmJiBtYXRjaFswXSkge1xuXHRcdFx0cmV0dXJuIGQuc2xpY2UoTWF0aC5tYXgoMCwgZC5pbmRleE9mKG1hdGNoWzBdKSkpO1xuXHRcdH1cblx0XHQvLyBub3cgdHJ5IHRvIGRlYWwgd2l0aCA9PT0gZm9vIFtbYmFyfGJhel1dIGJvb20gPT09IC0+ICNmb29fYmF6X2Jvb21cblx0XHRjb25zdCBsaW5lcyA9IGQuc3BsaXQoJ1xcbicpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcblx0XHRcdGxpbmVzW2ldID0gbGluZXNbaV1cblx0XHRcdFx0LnJlcGxhY2UoL1xcW3syfShbXlxcXXxdKj9cXHwpPyguKj8pXXsyfS9nLCAnJDInKVxuXHRcdFx0XHQucmVwbGFjZSgvJycnKFteJ10pL2csICckMScpXG5cdFx0XHRcdC5yZXBsYWNlKC8nJyhbXiddKS9nLCAnJDEnKTtcblx0XHRcdGlmIChhbmNoUmUudGVzdChsaW5lc1tpXSkpIHtcblx0XHRcdFx0cmV0dXJuIGRcblx0XHRcdFx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0XHRcdFx0LnNsaWNlKGkpXG5cdFx0XHRcdFx0LmpvaW4oJ1xcbicpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL15bXj1dKi8sICcnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGQ7XG5cdH07XG5cdGNvbnN0IGtpbGxQb3B1cCA9IGZ1bmN0aW9uIGtpbGxQb3B1cCgpIHtcblx0XHRyZW1vdmVNb2RpZmllcktleUxpc3RlbmVyKHRoaXMpO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFNob3J0Y3V0S2V5cycpKSB7XG5cdFx0XHRybVBvcHVwU2hvcnRjdXRzKCk7XG5cdFx0fVxuXHRcdGlmICghcGcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHBnLmN1cnJlbnQubGluayAmJiBwZy5jdXJyZW50LmxpbmsubmF2cG9wdXApIHtcblx0XHRcdHBnLmN1cnJlbnQubGluay5uYXZwb3B1cC5iYW5pc2goKTtcblx0XHR9XG5cdFx0cGcuY3VycmVudC5saW5rID0gbnVsbDtcblx0XHRhYm9ydEFsbERvd25sb2FkcygpO1xuXHRcdGlmIChwZy50aW1lci5jaGVja1BvcHVwUG9zaXRpb24pIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwocGcudGltZXIuY2hlY2tQb3B1cFBvc2l0aW9uKTtcblx0XHRcdHBnLnRpbWVyLmNoZWNrUG9wdXBQb3NpdGlvbiA9IG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlOyAvLyBwcmVzZXJ2ZSBkZWZhdWx0IGFjdGlvblxuXHR9O1xuXHQvLyBFTkRGSUxFOiBhY3Rpb25zLmpzXG5cdC8vIFNUQVJURklMRTogZG9tZHJhZy5qc1xuXHQvKipcblx0ICogQGZpbGVvdmVydmlld1xuXHQgKiBUaGUge0Bzb3VyY2UgRHJhZ30gb2JqZWN0LCB3aGljaCBlbmFibGVzIG9iamVjdHMgdG8gYmUgZHJhZ2dlZCBhcm91bmQuXG5cdCAqIDxwcmU+XG5cdCAqXG5cdCAqIGRvbS1kcmFnLmpzXG5cdCAqIDA5LjI1LjIwMDFcblx0ICogd3d3LnlvdW5ncHVwLm5ldFxuXHQgKlxuXHQgKiAxMC4yOC4yMDAxIC0gZml4ZWQgbWlub3IgYnVnIHdoZXJlIGV2ZW50c1xuXHQgKlxuXHQgKiBzb21ldGltZXMgZmlyZWQgb2ZmIHRoZSBoYW5kbGUsIG5vdCB0aGUgcm9vdC5cblx0ICogUGFyZWQgZG93biwgc29tZSBob29rcyBhZGRlZCBieSBMdXBpblxuXHQgKiBDb3B5cmlnaHQgQWFyb24gQm9vZG1hbi5cblx0ICogU2F5aW5nIHN0dXBpZCB0aGluZ3MgZGFpbHkgc2luY2UgTWFyY2ggMjAwMS5cblx0ICogPC9wcmU+XG5cdCAqL1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBEcmFnIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIG1ha2UgdmFyaW91cyBET00gZWxlbWVudHMgZHJhZ2dhYmxlLlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdGNsYXNzIERyYWcge1xuXHRcdGNvbnN0cnVjdG9yKCkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBDb25kaXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRvIGRyYWcuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHRha2Ugb25lIHBhcmFtZXRlcixcblx0XHRcdCAqIGFuIEV2ZW50LiAgVG8gZGlzYWJsZSB0aGlzLCBzZXQgaXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRnVuY3Rpb25cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5zdGFydENvbmRpdGlvbiA9IG51bGw7XG5cdFx0XHQvKipcblx0XHRcdCAqIEhvb2sgdG8gYmUgcnVuIHdoZW4gdGhlIGRyYWcgZmluaXNoZXMuIFRoaXMgaXMgcGFzc2VkIHRoZSBmaW5hbCBjb29yZGluYXRlcyBvZiB0aGVcblx0XHRcdCAqIGRyYWdnZWQgb2JqZWN0ICh0d28gaW50ZWdlcnMsIHggYW5kIHkpLiBUbyBkaXNhYmxlcyB0aGlzLCBzZXQgaXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRnVuY3Rpb25cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5lbmRIb29rID0gbnVsbDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogR2V0cyBhbiBldmVudCBpbiBhIGNyb3NzLWJyb3dzZXIgbWFubmVyLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0c3RhdGljIGZpeEUoZSkge1xuXHRcdFx0aWYgKGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRlID0gd2luZG93LmV2ZW50O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGUubGF5ZXJYID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZS5sYXllclggPSBlLm9mZnNldFg7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZS5sYXllclkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRlLmxheWVyWSA9IGUub2Zmc2V0WTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBlO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBJbml0aWFsaXNlcyB0aGUgRHJhZyBpbnN0YW5jZSBieSB0ZWxsaW5nIGl0IHdoaWNoIG9iamVjdCB5b3Ugd2FudCB0byBiZSBkcmFnZ2FibGUsIGFuZCB3aGF0XG5cdFx0ICogeW91IHdhbnQgdG8gZHJhZyBpdCBieS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbyBUaGUgXCJoYW5kbGVcIiBieSB3aGljaCA8Y29kZT5vUm9vdDwvY29kZT4gaXMgZHJhZ2dlZC5cblx0XHQgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG9Sb290IFRoZSBvYmplY3Qgd2hpY2ggbW92ZXMgd2hlbiA8Y29kZT5vPC9jb2RlPiBpcyBkcmFnZ2VkLCBvciA8Y29kZT5vPC9jb2RlPiBpZiBvbWl0dGVkLlxuXHRcdCAqL1xuXHRcdGluaXQobywgb1Jvb3QpIHtcblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0dGhpcy5vYmogPSBvO1xuXHRcdFx0by5vbm1vdXNlZG93biA9IChlKSA9PiB7XG5cdFx0XHRcdHNlbGYuc3RhcnQoZSk7XG5cdFx0XHR9O1xuXHRcdFx0by5kcmFnZ2luZyA9IGZhbHNlO1xuXHRcdFx0by5wb3B1cHNfZHJhZ2dhYmxlID0gdHJ1ZTtcblx0XHRcdG8uaG1vZGUgPSB0cnVlO1xuXHRcdFx0by52bW9kZSA9IHRydWU7XG5cdFx0XHRvLnJvb3QgPSBvUm9vdCB8fCBvO1xuXHRcdFx0aWYgKE51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoby5yb290LnN0eWxlLmxlZnQsIDEwKSkpIHtcblx0XHRcdFx0by5yb290LnN0eWxlLmxlZnQgPSAnMHB4Jztcblx0XHRcdH1cblx0XHRcdGlmIChOdW1iZXIuaXNOYU4oTnVtYmVyLnBhcnNlSW50KG8ucm9vdC5zdHlsZS50b3AsIDEwKSkpIHtcblx0XHRcdFx0by5yb290LnN0eWxlLnRvcCA9ICcwcHgnO1xuXHRcdFx0fVxuXHRcdFx0by5yb290Lm9udGhpc1N0YXJ0ID0gKCkgPT4ge307XG5cdFx0XHRvLnJvb3Qub250aGlzRW5kID0gKCkgPT4ge307XG5cdFx0XHRvLnJvb3Qub250aGlzID0gKCkgPT4ge307XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFN0YXJ0cyB0aGUgZHJhZy5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZVxuXHRcdCAqL1xuXHRcdHN0YXJ0KGUpIHtcblx0XHRcdGNvbnN0IG8gPSB0aGlzLm9iajsgLy8gPSB0aGlzO1xuXHRcdFx0ZSA9IERyYWcuZml4RShlKTtcblx0XHRcdGlmICh0aGlzLnN0YXJ0Q29uZGl0aW9uICYmICF0aGlzLnN0YXJ0Q29uZGl0aW9uKGUpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHkgPSBOdW1iZXIucGFyc2VJbnQoby52bW9kZSA/IG8ucm9vdC5zdHlsZS50b3AgOiBvLnJvb3Quc3R5bGUuYm90dG9tLCAxMCk7XG5cdFx0XHRjb25zdCB4ID0gTnVtYmVyLnBhcnNlSW50KG8uaG1vZGUgPyBvLnJvb3Quc3R5bGUubGVmdCA6IG8ucm9vdC5zdHlsZS5yaWdodCwgMTApO1xuXHRcdFx0by5yb290Lm9udGhpc1N0YXJ0KHgsIHkpO1xuXHRcdFx0by5sYXN0TW91c2VYID0gZS5jbGllbnRYO1xuXHRcdFx0by5sYXN0TW91c2VZID0gZS5jbGllbnRZO1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHRvLm9ubW91c2Vtb3ZlRGVmYXVsdCA9IGRvY3VtZW50Lm9ubW91c2Vtb3ZlO1xuXHRcdFx0by5kcmFnZ2luZyA9IHRydWU7XG5cdFx0XHRkb2N1bWVudC5vbm1vdXNlbW92ZSA9IChlKSA9PiB7XG5cdFx0XHRcdHNlbGYuZHJhZyhlKTtcblx0XHRcdH07XG5cdFx0XHRkb2N1bWVudC5vbm1vdXNldXAgPSAoZSkgPT4ge1xuXHRcdFx0XHRzZWxmLmVuZChlKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIERvZXMgdGhlIGRyYWcuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRkcmFnKGUpIHtcblx0XHRcdGUgPSBEcmFnLmZpeEUoZSk7XG5cdFx0XHRjb25zdCBvID0gdGhpcy5vYmo7XG5cdFx0XHRjb25zdCBleSA9IGUuY2xpZW50WTtcblx0XHRcdGNvbnN0IGV4ID0gZS5jbGllbnRYO1xuXHRcdFx0Y29uc3QgeSA9IE51bWJlci5wYXJzZUludChvLnZtb2RlID8gby5yb290LnN0eWxlLnRvcCA6IG8ucm9vdC5zdHlsZS5ib3R0b20sIDEwKTtcblx0XHRcdGNvbnN0IHggPSBOdW1iZXIucGFyc2VJbnQoby5obW9kZSA/IG8ucm9vdC5zdHlsZS5sZWZ0IDogby5yb290LnN0eWxlLnJpZ2h0LCAxMCk7XG5cdFx0XHRjb25zdCBueCA9IHggKyAoZXggLSBvLmxhc3RNb3VzZVgpICogKG8uaG1vZGUgPyAxIDogLTEpO1xuXHRcdFx0Y29uc3QgbnkgPSB5ICsgKGV5IC0gby5sYXN0TW91c2VZKSAqIChvLnZtb2RlID8gMSA6IC0xKTtcblx0XHRcdHRoaXMub2JqLnJvb3Quc3R5bGVbby5obW9kZSA/ICdsZWZ0JyA6ICdyaWdodCddID0gYCR7bnh9cHhgO1xuXHRcdFx0dGhpcy5vYmoucm9vdC5zdHlsZVtvLnZtb2RlID8gJ3RvcCcgOiAnYm90dG9tJ10gPSBgJHtueX1weGA7XG5cdFx0XHR0aGlzLm9iai5sYXN0TW91c2VYID0gZXg7XG5cdFx0XHR0aGlzLm9iai5sYXN0TW91c2VZID0gZXk7XG5cdFx0XHR0aGlzLm9iai5yb290Lm9udGhpcyhueCwgbnkpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBFbmRzIHRoZSBkcmFnLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRlbmQoKSB7XG5cdFx0XHRkb2N1bWVudC5vbm1vdXNlbW92ZSA9IHRoaXMub2JqLm9ubW91c2Vtb3ZlRGVmYXVsdDtcblx0XHRcdGRvY3VtZW50Lm9ubW91c2V1cCA9IG51bGw7XG5cdFx0XHR0aGlzLm9iai5kcmFnZ2luZyA9IGZhbHNlO1xuXHRcdFx0aWYgKHRoaXMuZW5kSG9vaykge1xuXHRcdFx0XHR0aGlzLmVuZEhvb2soXG5cdFx0XHRcdFx0TnVtYmVyLnBhcnNlSW50KHRoaXMub2JqLnJvb3Quc3R5bGVbdGhpcy5vYmouaG1vZGUgPyAnbGVmdCcgOiAncmlnaHQnXSwgMTApLFxuXHRcdFx0XHRcdE51bWJlci5wYXJzZUludCh0aGlzLm9iai5yb290LnN0eWxlW3RoaXMub2JqLnZtb2RlID8gJ3RvcCcgOiAnYm90dG9tJ10sIDEwKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvLyBFTkRGSUxFOiBkb21kcmFnLmpzXG5cdC8vIFNUQVJURklMRTogc3RydWN0dXJlcy5qc1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsID0ge307XG5cdHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBMYXlvdXQgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdCdwb3B1cEVycm9yJyxcblx0XHRcdCdwb3B1cEltYWdlJyxcblx0XHRcdCdwb3B1cFRvcExpbmtzJyxcblx0XHRcdCdwb3B1cFRpdGxlJyxcblx0XHRcdCdwb3B1cFVzZXJEYXRhJyxcblx0XHRcdCdwb3B1cERhdGEnLFxuXHRcdFx0J3BvcHVwT3RoZXJMaW5rcycsXG5cdFx0XHQncG9wdXBSZWRpcicsXG5cdFx0XHRbJ3BvcHVwV2FyblJlZGlyJywgJ3BvcHVwUmVkaXJUb3BMaW5rcycsICdwb3B1cFJlZGlyVGl0bGUnLCAncG9wdXBSZWRpckRhdGEnLCAncG9wdXBSZWRpck90aGVyTGlua3MnXSxcblx0XHRcdCdwb3B1cE1pc2NUb29scycsXG5cdFx0XHRbJ3BvcHVwUmVkbGluayddLFxuXHRcdFx0J3BvcHVwUHJlUHJldmlld1NlcCcsXG5cdFx0XHQncG9wdXBQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cFNlY29uZFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwUHJldmlld01vcmUnLFxuXHRcdFx0J3BvcHVwUG9zdFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwRml4RGFiJyxcblx0XHRdO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwUmVkaXJTcGFucyA9ICgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J3BvcHVwUmVkaXInLFxuXHRcdFx0J3BvcHVwV2FyblJlZGlyJyxcblx0XHRcdCdwb3B1cFJlZGlyVG9wTGlua3MnLFxuXHRcdFx0J3BvcHVwUmVkaXJUaXRsZScsXG5cdFx0XHQncG9wdXBSZWRpckRhdGEnLFxuXHRcdFx0J3BvcHVwUmVkaXJPdGhlckxpbmtzJyxcblx0XHRdO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwVGl0bGUgPSAoeCkgPT4ge1xuXHRcdGxvZygnZGVmYXVsdHN0cnVjdHVyZS5wb3B1cFRpdGxlJyk7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cE5hdkxpbmtzJykpIHtcblx0XHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKCc8Yj48PG1haW5saW5rPj48L2I+JywgeC5hcnRpY2xlLCB4LnBhcmFtcyk7XG5cdFx0fVxuXHRcdHJldHVybiAnJztcblx0fTtcblx0cGcuc3RydWN0dXJlcy5vcmlnaW5hbC5wb3B1cFRvcExpbmtzID0gKHgpID0+IHtcblx0XHRsb2coJ2RlZmF1bHRzdHJ1Y3R1cmUucG9wdXBUb3BMaW5rcycpO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cE5hdkxpbmtzJykpIHtcblx0XHRcdHJldHVybiBuYXZMaW5rc0hUTUwoeC5hcnRpY2xlLCB4LmhpbnQsIHgucGFyYW1zKTtcblx0XHR9XG5cdFx0cmV0dXJuICcnO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwSW1hZ2UgPSAoeCkgPT4ge1xuXHRcdGxvZyhgb3JpZ2luYWwucG9wdXBJbWFnZSwgeC5hcnRpY2xlPSR7eC5hcnRpY2xlfSwgeC5uYXZwb3AuaWROdW1iZXI9JHt4Lm5hdnBvcC5pZE51bWJlcn1gKTtcblx0XHRyZXR1cm4gaW1hZ2VIVE1MKHguYXJ0aWNsZSwgeC5uYXZwb3AuaWROdW1iZXIpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwUmVkaXJUaXRsZSA9IHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBUaXRsZTtcblx0cGcuc3RydWN0dXJlcy5vcmlnaW5hbC5wb3B1cFJlZGlyVG9wTGlua3MgPSBwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwVG9wTGlua3M7XG5cdGNvbnN0IGNvcHlTdHJ1Y3R1cmUgPSAob2xkU3RydWN0dXJlLCBuZXdTdHJ1Y3R1cmUpID0+IHtcblx0XHRwZy5zdHJ1Y3R1cmVzW25ld1N0cnVjdHVyZV0gPSB7fTtcblx0XHRmb3IgKGNvbnN0IHByb3AgaW4gcGcuc3RydWN0dXJlc1tvbGRTdHJ1Y3R1cmVdKSB7XG5cdFx0XHRpZiAoIU9iamVjdC5oYXNPd24ocGcuc3RydWN0dXJlc1tvbGRTdHJ1Y3R1cmVdLCBwcm9wKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdHBnLnN0cnVjdHVyZXNbbmV3U3RydWN0dXJlXVtwcm9wXSA9IHBnLnN0cnVjdHVyZXNbb2xkU3RydWN0dXJlXVtwcm9wXTtcblx0XHR9XG5cdH07XG5cdGNvcHlTdHJ1Y3R1cmUoJ29yaWdpbmFsJywgJ25vc3RhbGdpYScpO1xuXHRwZy5zdHJ1Y3R1cmVzLm5vc3RhbGdpYS5wb3B1cFRvcExpbmtzID0gKHgpID0+IHtcblx0XHRsZXQgc3RyID0gJyc7XG5cdFx0c3RyICs9ICc8Yj48PG1haW5saW5rfHNob3J0Y3V0PSA+PjwvYj4nO1xuXHRcdC8vIHVzZXIgbGlua3Ncblx0XHQvLyBjb250cmlicyAtIGxvZyAtIGNvdW50IC0gZW1haWwgLSBibG9ja1xuXHRcdC8vIGNvdW50IG9ubHkgaWYgYXBwbGljYWJsZTsgYmxvY2sgb25seSBpZiBwb3B1cEFkbWluTGlua3Ncblx0XHRzdHIgKz0gJ2lmKHVzZXIpezxicj48PGNvbnRyaWJzfHNob3J0Y3V0PWM+Pic7XG5cdFx0c3RyICs9ICdpZih3aWtpbWVkaWEpeyo8PGNvdW50fHNob3J0Y3V0PSM+Pn0nO1xuXHRcdHN0ciArPSAnaWYoaXB1c2VyKXt9ZWxzZXsqPDxlbWFpbHxzaG9ydGN1dD1FPj59aWYoYWRtaW4peyo8PGJsb2NrfHNob3J0Y3V0PWI+Pn19Jztcblx0XHQvLyBlZGl0aW5nIGxpbmtzXG5cdFx0Ly8gdGFsa3BhZ2UgICAtPiBlZGl0fG5ldyAtIGhpc3RvcnkgLSB1bnx3YXRjaCAtIGFydGljbGV8ZWRpdFxuXHRcdC8vIG90aGVyIHBhZ2UgLT4gZWRpdCAtIGhpc3RvcnkgLSB1bnx3YXRjaCAtIHRhbGt8ZWRpdHxuZXdcblx0XHRjb25zdCBlZGl0c3RyID0gJzw8ZWRpdHxzaG9ydGN1dD1lPj4nO1xuXHRcdGNvbnN0IGVkaXRPbGRpZFN0ciA9IGBpZihvbGRpZCl7PDxlZGl0T2xkfHNob3J0Y3V0PWU+Pnw8PHJldmVydHxzaG9ydGN1dD12fHJ2Pj58PDxlZGl0fGN1cj4+fWVsc2V7JHtlZGl0c3RyfX1gO1xuXHRcdGNvbnN0IGhpc3RvcnlzdHIgPSAnPDxoaXN0b3J5fHNob3J0Y3V0PWg+Pic7XG5cdFx0Y29uc3Qgd2F0Y2hzdHIgPSAnPDx1bndhdGNofHVud2F0Y2hTaG9ydD4+fDw8d2F0Y2h8c2hvcnRjdXQ9d3x3YXRjaFRoaW5neT4+Jztcblx0XHRzdHIgKz1cblx0XHRcdGA8YnI+aWYodGFsayl7JHtlZGl0T2xkaWRTdHJ9fDw8bmV3fHNob3J0Y3V0PSs+PmAgK1xuXHRcdFx0YCoke2hpc3RvcnlzdHJ9KiR7d2F0Y2hzdHJ9KmAgK1xuXHRcdFx0JzxiPjw8YXJ0aWNsZXxzaG9ydGN1dD1hPj48L2I+fDw8ZWRpdEFydGljbGV8ZWRpdD4+JyArXG5cdFx0XHRgfWVsc2V7JHtcblx0XHRcdFx0Ly8gbm90IGEgdGFsayBwYWdlXG5cdFx0XHRcdGVkaXRPbGRpZFN0clxuXHRcdFx0fSoke2hpc3RvcnlzdHJ9KiR7d2F0Y2hzdHJ9KmAgK1xuXHRcdFx0JzxiPjw8dGFsa3xzaG9ydGN1dD10Pj48L2I+fDw8ZWRpdFRhbGt8ZWRpdD4+fDw8bmV3VGFsa3xzaG9ydGN1dD0rfG5ldz4+fSc7XG5cdFx0Ly8gbWlzYyBsaW5rc1xuXHRcdHN0ciArPSAnPGJyPjw8d2hhdExpbmtzSGVyZXxzaG9ydGN1dD1sPj4qPDxyZWxhdGVkQ2hhbmdlc3xzaG9ydGN1dD1yPj4nO1xuXHRcdHN0ciArPSAnaWYoYWRtaW4pezxicj59ZWxzZXsqfTw8bW92ZXxzaG9ydGN1dD1tPj4nO1xuXHRcdC8vIGFkbWluIGxpbmtzXG5cdFx0c3RyICs9XG5cdFx0XHQnaWYoYWRtaW4peyo8PHVucHJvdGVjdHx1bnByb3RlY3RTaG9ydD4+fDw8cHJvdGVjdHxzaG9ydGN1dD1wPj4qJyArXG5cdFx0XHQnPDx1bmRlbGV0ZXx1bmRlbGV0ZVNob3J0Pj58PDxkZWxldGV8c2hvcnRjdXQ9ZD4+fSc7XG5cdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoc3RyLCB4LmFydGljbGUsIHgucGFyYW1zKTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5ub3N0YWxnaWEucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5ub3N0YWxnaWEucG9wdXBUb3BMaW5rcztcblx0LyoqIC0tIGZhbmN5IC0tICovXG5cdGNvcHlTdHJ1Y3R1cmUoJ29yaWdpbmFsJywgJ2ZhbmN5Jyk7XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBUaXRsZSA9ICh4KSA9PiB7XG5cdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoJzxmb250IHNpemU9KzA+PDxtYWlubGluaz4+PC9mb250PicsIHguYXJ0aWNsZSwgeC5wYXJhbXMpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwVG9wTGlua3MgPSAoeCkgPT4ge1xuXHRcdGNvbnN0IGhpc3QgPSAnPDxoaXN0b3J5fHNob3J0Y3V0PWh8aGlzdD4+fDw8bGFzdEVkaXR8c2hvcnRjdXQ9L3xsYXN0Pj58PDxlZGl0b3JzfHNob3J0Y3V0PUV8ZWRzPj4nO1xuXHRcdGNvbnN0IHdhdGNoID0gJzw8dW53YXRjaHx1bndhdGNoU2hvcnQ+Pnw8PHdhdGNofHNob3J0Y3V0PXd8d2F0Y2hUaGluZ3k+Pic7XG5cdFx0Y29uc3QgbW92ZSA9ICc8PG1vdmV8c2hvcnRjdXQ9bXxtb3ZlPj4nO1xuXHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKFxuXHRcdFx0J2lmKHRhbGspeycgK1xuXHRcdFx0XHRgPDxlZGl0fHNob3J0Y3V0PWU+Pnw8PG5ld3xzaG9ydGN1dD0rfCs+Pioke2hpc3R9KmAgK1xuXHRcdFx0XHQnPDxhcnRpY2xlfHNob3J0Y3V0PWE+Pnw8PGVkaXRBcnRpY2xlfGVkaXQ+PicgK1xuXHRcdFx0XHRgKiR7d2F0Y2h9KiR7bW92ZX19ZWxzZXs8PGVkaXR8c2hvcnRjdXQ9ZT4+KiR7aGlzdH0qPDx0YWxrfHNob3J0Y3V0PXR8Pj58PDxlZGl0VGFsa3xlZGl0Pj58PDxuZXdUYWxrfHNob3J0Y3V0PSt8bmV3Pj5gICtcblx0XHRcdFx0YCoke3dhdGNofSoke21vdmV9fTxicj5gLFxuXHRcdFx0eC5hcnRpY2xlLFxuXHRcdFx0eC5wYXJhbXNcblx0XHQpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwT3RoZXJMaW5rcyA9ICh4KSA9PiB7XG5cdFx0Y29uc3QgYWRtaW4gPVxuXHRcdFx0Jzw8dW5wcm90ZWN0fHVucHJvdGVjdFNob3J0Pj58PDxwcm90ZWN0fHNob3J0Y3V0PXA+Pio8PHVuZGVsZXRlfHVuZGVsZXRlU2hvcnQ+Pnw8PGRlbGV0ZXxzaG9ydGN1dD1kfGRlbD4+Jztcblx0XHRsZXQgdXNlciA9ICc8PGNvbnRyaWJzfHNob3J0Y3V0PWM+PmlmKHdpa2ltZWRpYSl7fDw8Y291bnR8c2hvcnRjdXQ9I3wjPj59Jztcblx0XHR1c2VyICs9IGBpZihpcHVzZXIpe3w8PGFyaW4+Pn1lbHNleyo8PGVtYWlsfHNob3J0Y3V0PUV8JHtwb3B1cFN0cmluZyhcblx0XHRcdCdlbWFpbCdcblx0XHQpfT4+fWlmKGFkbWluKXsqPDxibG9ja3xzaG9ydGN1dD1iPj59YDtcblx0XHRjb25zdCBub3JtYWwgPSAnPDx3aGF0TGlua3NIZXJlfHNob3J0Y3V0PWx8bGlua3MgaGVyZT4+Kjw8cmVsYXRlZENoYW5nZXN8c2hvcnRjdXQ9cnxyZWxhdGVkPj4nO1xuXHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKFxuXHRcdFx0YDxicj5pZih1c2VyKXske3VzZXJ9Kn1pZihhZG1pbil7JHthZG1pbn1pZih1c2VyKXs8YnI+fWVsc2V7Kn19JHtub3JtYWx9YCxcblx0XHRcdHguYXJ0aWNsZSxcblx0XHRcdHgucGFyYW1zXG5cdFx0KTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cFJlZGlyVGl0bGUgPSBwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwVGl0bGU7XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cFRvcExpbmtzO1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwUmVkaXJPdGhlckxpbmtzID0gcGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cE90aGVyTGlua3M7XG5cdC8qKiAtLSBmYW5jeTIgLS0gKi9cblx0Ly8gaGFjayBmb3IgTWFjR3l2ZXJNYWdpY1xuXHRjb3B5U3RydWN0dXJlKCdmYW5jeScsICdmYW5jeTInKTtcblx0cGcuc3RydWN0dXJlcy5mYW5jeTIucG9wdXBUb3BMaW5rcyA9IC8vIGhhY2sgb3V0IHRoZSA8YnI+IGF0IHRoZSBlbmQgYW5kIHB1dCBvbmUgYXQgdGhlIGJlZ2lubmluZ1xuXHRcdCh4KSA9PiB7XG5cdFx0XHRyZXR1cm4gYDxicj4ke3BnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBUb3BMaW5rcyh4KS5yZXBsYWNlKC88YnI+JC9pLCAnJyl9YDtcblx0XHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5Mi5wb3B1cExheW91dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J3BvcHVwRXJyb3InLFxuXHRcdFx0J3BvcHVwSW1hZ2UnLFxuXHRcdFx0J3BvcHVwVGl0bGUnLFxuXHRcdFx0J3BvcHVwVXNlckRhdGEnLFxuXHRcdFx0J3BvcHVwRGF0YScsXG5cdFx0XHQncG9wdXBUb3BMaW5rcycsXG5cdFx0XHQncG9wdXBPdGhlckxpbmtzJyxcblx0XHRcdCdwb3B1cFJlZGlyJyxcblx0XHRcdFsncG9wdXBXYXJuUmVkaXInLCAncG9wdXBSZWRpclRvcExpbmtzJywgJ3BvcHVwUmVkaXJUaXRsZScsICdwb3B1cFJlZGlyRGF0YScsICdwb3B1cFJlZGlyT3RoZXJMaW5rcyddLFxuXHRcdFx0J3BvcHVwTWlzY1Rvb2xzJyxcblx0XHRcdFsncG9wdXBSZWRsaW5rJ10sXG5cdFx0XHQncG9wdXBQcmVQcmV2aWV3U2VwJyxcblx0XHRcdCdwb3B1cFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwU2Vjb25kUHJldmlldycsXG5cdFx0XHQncG9wdXBQcmV2aWV3TW9yZScsXG5cdFx0XHQncG9wdXBQb3N0UHJldmlldycsXG5cdFx0XHQncG9wdXBGaXhEYWInLFxuXHRcdF07XG5cdH07XG5cdC8qKiAtLSBtZW51cyAtLSAqL1xuXHRjb3B5U3RydWN0dXJlKCdvcmlnaW5hbCcsICdtZW51cycpO1xuXHRwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwTGF5b3V0ID0gKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHQncG9wdXBFcnJvcicsXG5cdFx0XHQncG9wdXBJbWFnZScsXG5cdFx0XHQncG9wdXBUb3BMaW5rcycsXG5cdFx0XHQncG9wdXBUaXRsZScsXG5cdFx0XHQncG9wdXBPdGhlckxpbmtzJyxcblx0XHRcdCdwb3B1cFJlZGlyJyxcblx0XHRcdFsncG9wdXBXYXJuUmVkaXInLCAncG9wdXBSZWRpclRvcExpbmtzJywgJ3BvcHVwUmVkaXJUaXRsZScsICdwb3B1cFJlZGlyRGF0YScsICdwb3B1cFJlZGlyT3RoZXJMaW5rcyddLFxuXHRcdFx0J3BvcHVwVXNlckRhdGEnLFxuXHRcdFx0J3BvcHVwRGF0YScsXG5cdFx0XHQncG9wdXBNaXNjVG9vbHMnLFxuXHRcdFx0Wydwb3B1cFJlZGxpbmsnXSxcblx0XHRcdCdwb3B1cFByZVByZXZpZXdTZXAnLFxuXHRcdFx0J3BvcHVwUHJldmlldycsXG5cdFx0XHQncG9wdXBTZWNvbmRQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cFByZXZpZXdNb3JlJyxcblx0XHRcdCdwb3B1cFBvc3RQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cEZpeERhYicsXG5cdFx0XTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFRvcExpbmtzID0gKHgsIHNob3J0ZXIpID0+IHtcblx0XHQvLyBGSVhNRSBtYXliZSB0aGlzIHN0dWZmIHNob3VsZCBiZSBjYWNoZWRcblx0XHRjb25zdCBzID0gW107XG5cdFx0Y29uc3QgZHJvcGRpdiA9ICc8ZGl2IGNsYXNzPVwicG9wdXBfZHJvcFwiPic7XG5cdFx0Y29uc3QgZW5kZGl2ID0gJzwvZGl2Pic7XG5cdFx0bGV0IGhpc3QgPSAnPDxoaXN0b3J5fHNob3J0Y3V0PWg+Pic7XG5cdFx0aWYgKCFzaG9ydGVyKSB7XG5cdFx0XHRoaXN0ID0gYDxtZW51cm93PiR7aGlzdH18PDxoaXN0b3J5ZmVlZHxyc3M+Pnw8PGVkaXRvcnN8c2hvcnRjdXQ9RT4+PC9tZW51cm93PmA7XG5cdFx0fVxuXHRcdGNvbnN0IGxhc3RlZGl0ID0gJzw8bGFzdEVkaXR8c2hvcnRjdXQ9L3xzaG93IGxhc3QgZWRpdD4+Jztcblx0XHRjb25zdCB0aGFuayA9ICdpZihkaWZmKXs8PHRoYW5rfHNlbmQgdGhhbmtzPj59Jztcblx0XHRjb25zdCBqc0hpc3RvcnkgPSAnPDxsYXN0Q29udHJpYnxsYXN0IHNldCBvZiBlZGl0cz4+PDxzaW5jZU1lfGNoYW5nZXMgc2luY2UgbWluZT4+Jztcblx0XHRjb25zdCBsaW5rc2hlcmUgPSAnPDx3aGF0TGlua3NIZXJlfHNob3J0Y3V0PWx8d2hhdCBsaW5rcyBoZXJlPj4nO1xuXHRcdGNvbnN0IHJlbGF0ZWQgPSAnPDxyZWxhdGVkQ2hhbmdlc3xzaG9ydGN1dD1yfHJlbGF0ZWQgY2hhbmdlcz4+Jztcblx0XHRjb25zdCBzZWFyY2ggPSAnPG1lbnVyb3c+PDxzZWFyY2h8c2hvcnRjdXQ9cz4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3Qgd2F0Y2ggPSAnPG1lbnVyb3c+PDx1bndhdGNofHVud2F0Y2hTaG9ydD4+fDw8d2F0Y2h8c2hvcnRjdXQ9d3x3YXRjaFRoaW5neT4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3QgcHJvdGVjdCA9ICc8bWVudXJvdz48PHVucHJvdGVjdHx1bnByb3RlY3RTaG9ydD4+fDw8cHJvdGVjdHxzaG9ydGN1dD1wPj58PDxwcm90ZWN0bG9nfGxvZz4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3QgZGVsID0gJzxtZW51cm93Pjw8dW5kZWxldGV8dW5kZWxldGVTaG9ydD4+fDw8ZGVsZXRlfHNob3J0Y3V0PWQ+Pnw8PGRlbGV0ZWxvZ3xsb2c+PjwvbWVudXJvdz4nO1xuXHRcdGNvbnN0IG1vdmUgPSAnPDxtb3ZlfHNob3J0Y3V0PW18bW92ZSBwYWdlPj4nO1xuXHRcdGNvbnN0IG51bGxQdXJnZSA9ICc8bWVudXJvdz48PG51bGxFZGl0fHNob3J0Y3V0PW58bnVsbCBlZGl0Pj58PDxwdXJnZXxzaG9ydGN1dD1QPj48L21lbnVyb3c+Jztcblx0XHRjb25zdCB2aWV3T3B0aW9ucyA9ICc8bWVudXJvdz48PHZpZXd8c2hvcnRjdXQ9dj4+fDw8cmVuZGVyfHNob3J0Y3V0PVM+Pnw8PHJhdz4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3QgZWRpdFJvdyA9XG5cdFx0XHQnaWYob2xkaWQpeycgK1xuXHRcdFx0JzxtZW51cm93Pjw8ZWRpdHxzaG9ydGN1dD1lPj58PDxlZGl0T2xkfHNob3J0Y3V0PWV8dGhpcyZuYnNwO3JldmlzaW9uPj48L21lbnVyb3c+JyArXG5cdFx0XHQnPG1lbnVyb3c+PDxyZXZlcnR8c2hvcnRjdXQ9dj4+fDw8dW5kbz4+PC9tZW51cm93PicgK1xuXHRcdFx0J31lbHNlezw8ZWRpdHxzaG9ydGN1dD1lPj59Jztcblx0XHRjb25zdCBtYXJrUGF0cm9sbGVkID0gJ2lmKHJjaWQpezw8bWFya3BhdHJvbGxlZHxtYXJrIHBhdHJvbGxlZD4+fSc7XG5cdFx0Y29uc3QgbmV3VG9waWMgPSAnaWYodGFsayl7PDxuZXd8c2hvcnRjdXQ9K3xuZXcgdG9waWM+Pn0nO1xuXHRcdGNvbnN0IHByb3RlY3REZWxldGUgPSBgaWYoYWRtaW4peyR7cHJvdGVjdH0ke2RlbH19YDtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBBY3Rpb25zTWVudScpKSB7XG5cdFx0XHRzLnB1c2goYDw8bWFpbmxpbms+Pioke2Ryb3BkaXZ9JHttZW51VGl0bGUoJ2FjdGlvbnMnKX1gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cy5wdXNoKGAke2Ryb3BkaXZ9PDxtYWlubGluaz4+YCk7XG5cdFx0fVxuXHRcdHMucHVzaCgnPG1lbnU+JywgZWRpdFJvdyArIG1hcmtQYXRyb2xsZWQgKyBuZXdUb3BpYyArIGhpc3QgKyBsYXN0ZWRpdCArIHRoYW5rKTtcblx0XHRpZiAoIXNob3J0ZXIpIHtcblx0XHRcdHMucHVzaChqc0hpc3RvcnkpO1xuXHRcdH1cblx0XHRzLnB1c2gobW92ZSArIGxpbmtzaGVyZSArIHJlbGF0ZWQpO1xuXHRcdGlmICghc2hvcnRlcikge1xuXHRcdFx0cy5wdXNoKG51bGxQdXJnZSArIHNlYXJjaCk7XG5cdFx0fVxuXHRcdGlmICghc2hvcnRlcikge1xuXHRcdFx0cy5wdXNoKHZpZXdPcHRpb25zKTtcblx0XHR9XG5cdFx0cy5wdXNoKFxuXHRcdFx0YDxocj4ke3dhdGNofSR7cHJvdGVjdERlbGV0ZX1gLFxuXHRcdFx0Jzxocj4nICtcblx0XHRcdFx0J2lmKHRhbGspezw8YXJ0aWNsZXxzaG9ydGN1dD1hfHZpZXcgYXJ0aWNsZT4+PDxlZGl0QXJ0aWNsZXxlZGl0IGFydGljbGU+Pn0nICtcblx0XHRcdFx0J2Vsc2V7PDx0YWxrfHNob3J0Y3V0PXR8dGFsayBwYWdlPj48PGVkaXRUYWxrfGVkaXQgdGFsaz4+JyArXG5cdFx0XHRcdGA8PG5ld1RhbGt8c2hvcnRjdXQ9K3xuZXcgdG9waWM+Pn08L21lbnU+JHtlbmRkaXZ9YFxuXHRcdCk7XG5cdFx0Ly8gdXNlciBtZW51IHN0YXJ0cyBoZXJlXG5cdFx0Y29uc3QgZW1haWwgPSAnPDxlbWFpbHxzaG9ydGN1dD1FfGVtYWlsIHVzZXI+Pic7XG5cdFx0Y29uc3QgY29udHJpYnMgPVxuXHRcdFx0J2lmKHdpa2ltZWRpYSl7PG1lbnVyb3c+fTw8Y29udHJpYnN8c2hvcnRjdXQ9Y3xjb250cmlidXRpb25zPj5pZih3aWtpbWVkaWEpezwvbWVudXJvdz59JyArXG5cdFx0XHQnaWYoYWRtaW4pezxtZW51cm93Pjw8ZGVsZXRlZENvbnRyaWJzPj48L21lbnVyb3c+fSc7XG5cdFx0cy5wdXNoKFxuXHRcdFx0YGlmKHVzZXIpeyoke2Ryb3BkaXZ9JHttZW51VGl0bGUoJ3VzZXInKX1gLFxuXHRcdFx0JzxtZW51PicsXG5cdFx0XHQnPG1lbnVyb3c+PDx1c2VyUGFnZXxzaG9ydGN1dD11fHVzZXImbmJzcDtwYWdlPj58PDx1c2VyU3BhY2V8c3BhY2U+PjwvbWVudXJvdz4nLFxuXHRcdFx0Jzw8dXNlclRhbGt8c2hvcnRjdXQ9dHx1c2VyIHRhbGs+Pjw8ZWRpdFVzZXJUYWxrfGVkaXQgdXNlciB0YWxrPj4nICtcblx0XHRcdFx0Jzw8bmV3VXNlclRhbGt8c2hvcnRjdXQ9K3xsZWF2ZSBjb21tZW50Pj4nXG5cdFx0KTtcblx0XHRpZiAoc2hvcnRlcikge1xuXHRcdFx0cy5wdXNoKGBpZihpcHVzZXIpe31lbHNleyR7ZW1haWx9fWApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzLnB1c2goYGlmKGlwdXNlcil7PDxhcmluPj59ZWxzZXske2VtYWlsfX1gKTtcblx0XHR9XG5cdFx0cy5wdXNoKFxuXHRcdFx0YDxocj4ke2NvbnRyaWJzfTw8dXNlcmxvZ3xzaG9ydGN1dD1MfHVzZXIgbG9nPj5gLFxuXHRcdFx0J2lmKHdpa2ltZWRpYSl7PDxjb3VudHxzaG9ydGN1dD0jfGVkaXQgY291bnRlcj4+fScsXG5cdFx0XHQnaWYoYWRtaW4pezxtZW51cm93Pjw8dW5ibG9ja3x1bmJsb2NrU2hvcnQ+Pnw8PGJsb2NrfHNob3J0Y3V0PWJ8YmxvY2sgdXNlcj4+PC9tZW51cm93Pn0nLFxuXHRcdFx0Jzw8YmxvY2tsb2d8c2hvcnRjdXQ9QnxibG9jayBsb2c+PicsXG5cdFx0XHRgPC9tZW51PiR7ZW5kZGl2fX1gXG5cdFx0KTtcblx0XHQvLyBwb3B1cHMgbWVudSBzdGFydHMgaGVyZVxuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFNldHVwTWVudScpICYmICF4Lm5hdnBvcC5oYXNQb3B1cE1lbnUgLyogRklYTUU6IGhhY2sgKi8pIHtcblx0XHRcdHgubmF2cG9wLmhhc1BvcHVwTWVudSA9IHRydWU7XG5cdFx0XHRzLnB1c2goXG5cdFx0XHRcdGAqJHtkcm9wZGl2fSR7bWVudVRpdGxlKCdwb3B1cHNNZW51Jyl9PG1lbnU+YCxcblx0XHRcdFx0Jzw8dG9nZ2xlUHJldmlld3N8dG9nZ2xlIHByZXZpZXdzPj4nLFxuXHRcdFx0XHQnPDxwdXJnZVBvcHVwc3xyZXNldD4+Jyxcblx0XHRcdFx0Jzw8ZGlzYWJsZVBvcHVwc3xkaXNhYmxlPj4nLFxuXHRcdFx0XHRgPC9tZW51PiR7ZW5kZGl2fWBcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKHMuam9pbignJyksIHguYXJ0aWNsZSwgeC5wYXJhbXMpO1xuXHR9O1xuXHRjb25zdCBtZW51VGl0bGUgPSAocykgPT4ge1xuXHRcdHJldHVybiBgPGEgaHJlZj1cIiNcIiBub1BvcHVwPTE+JHtwb3B1cFN0cmluZyhzKX08L2E+YDtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFJlZGlyVGl0bGUgPSBwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwVGl0bGU7XG5cdHBnLnN0cnVjdHVyZXMubWVudXMucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFRvcExpbmtzO1xuXHRjb3B5U3RydWN0dXJlKCdtZW51cycsICdzaG9ydG1lbnVzJyk7XG5cdHBnLnN0cnVjdHVyZXMuc2hvcnRtZW51cy5wb3B1cFRvcExpbmtzID0gKHgpID0+IHtcblx0XHRyZXR1cm4gcGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFRvcExpbmtzKHgsIHRydWUpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLnNob3J0bWVudXMucG9wdXBSZWRpclRvcExpbmtzID0gcGcuc3RydWN0dXJlcy5zaG9ydG1lbnVzLnBvcHVwVG9wTGlua3M7XG5cdHBnLnN0cnVjdHVyZXMubGl0ZSA9IHt9O1xuXHRwZy5zdHJ1Y3R1cmVzLmxpdGUucG9wdXBMYXlvdXQgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIFsncG9wdXBUaXRsZScsICdwb3B1cFByZXZpZXcnXTtcblx0fTtcblx0cGcuc3RydWN0dXJlcy5saXRlLnBvcHVwVGl0bGUgPSAoeCkgPT4ge1xuXHRcdGxvZyhgJHt4LmFydGljbGV9OiBzdHJ1Y3R1cmVzLmxpdGUucG9wdXBUaXRsZWApO1xuXHRcdC8vIHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKCc8Yj48PG1haW5saW5rPj48L2I+Jyx4LmFydGljbGUseC5wYXJhbXMpO1xuXHRcdHJldHVybiBgPGRpdj48c3BhbiBjbGFzcz1cInBvcHVwX21haW5saW5rXCI+PGI+JHt4LmFydGljbGUudG9TdHJpbmcoKX08L2I+PC9zcGFuPjwvZGl2PmA7XG5cdH07XG5cdC8vIEVOREZJTEU6IHN0cnVjdHVyZXMuanNcblx0Ly8gU1RBUlRGSUxFOiBhdXRvZWRpdC5qc1xuXHRjb25zdCBzdWJzdGl0dXRlID0gKGRhdGEsIGNtZEJvZHkpID0+IHtcblx0XHQvLyBtdy5ub3RpZnkoYHN1YlxcbmZyb206ICR7Y21kQm9keS5mcm9tfVxcbnRvOiAke2NtZEJvZHkudG99XFxuZmxhZ3M6ICR7Y21kQm9keS5mbGFnc31gLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ3dhcm4nfSk7XG5cdFx0Y29uc3QgZnJvbVJlID0gbmV3IFJlZ0V4cChjbWRCb2R5LmZyb20sIGNtZEJvZHkuZmxhZ3MpO1xuXHRcdHJldHVybiBkYXRhLnJlcGxhY2UoZnJvbVJlLCBjbWRCb2R5LnRvKTtcblx0fTtcblx0Y29uc3QgZXhlY0NtZHMgPSAoZGF0YSwgY21kTGlzdCkgPT4ge1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBjbWRMaXN0KSB7XG5cdFx0XHRkYXRhID0gZWxlbWVudC5hY3Rpb24oZGF0YSwgZWxlbWVudCk7XG5cdFx0fVxuXHRcdHJldHVybiBkYXRhO1xuXHR9O1xuXHRjb25zdCBwYXJzZUNtZCA9IGZ1bmN0aW9uIHBhcnNlQ21kKHN0cikge1xuXHRcdC8vIHJldHVybnMgYSBsaXN0IG9mIGNvbW1hbmRzXG5cdFx0aWYgKHN0ci5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cdFx0bGV0IHAgPSBmYWxzZTtcblx0XHRzd2l0Y2ggKHN0ci5jaGFyQXQoMCkpIHtcblx0XHRcdGNhc2UgJ3MnOlxuXHRcdFx0XHRwID0gcGFyc2VTdWJzdGl0dXRlKHN0cik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAocCkge1xuXHRcdFx0cmV0dXJuIFtwLCBwYXJzZUNtZChwLnJlbWFpbmRlcildO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdC8vIEZJWE1FOiBPbmx5IHVzZWQgb25jZSBoZXJlLCBjb25mdXNpbmcgd2l0aCBuYXRpdmUgKGFuZCBtb3JlIHdpZGVseS11c2VkKSB1bmVzY2FwZSwgc2hvdWxkIHByb2JhYmx5IGJlIHJlcGxhY2VkXG5cdC8vIFRoZW4gYWdhaW4sIHVuZXNjYXBlIGlzIHNlbWktc29mdC1kZXByZWNhdGVkLCBzbyB3ZSBzaG91bGQgbG9vayBpbnRvIHJlcGxhY2luZyB0aGF0IHRvb1xuXHRjb25zdCB1bkVzY2FwZSA9IChzdHIsIHNlcCkgPT4ge1xuXHRcdHJldHVybiBzdHIuc3BsaXQoJ1xcXFxcXFxcJykuam9pbignXFxcXCcpLnNwbGl0KGBcXFxcJHtzZXB9YCkuam9pbihzZXApLnNwbGl0KCdcXFxcbicpLmpvaW4oJ1xcbicpO1xuXHR9O1xuXHRjb25zdCBwYXJzZVN1YnN0aXR1dGUgPSAoc3RyKSA9PiB7XG5cdFx0Ly8gdGFrZXMgYSBzdHJpbmcgbGlrZSBzL2EvYi9mbGFncztvdGhlcmNtZHMgYW5kIHBhcnNlcyBpdFxuXHRcdGxldCBmcm9tO1xuXHRcdGxldCB0bztcblx0XHRsZXQgZmxhZ3M7XG5cdFx0bGV0IHRtcDtcblx0XHRpZiAoc3RyLmxlbmd0aCA8IDQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qgc2VwID0gc3RyLmNoYXJBdCgxKTtcblx0XHRzdHIgPSBzdHIuc2xpY2UoMik7XG5cdFx0dG1wID0gc2tpcE92ZXIoc3RyLCBzZXApO1xuXHRcdGlmICh0bXApIHtcblx0XHRcdGZyb20gPSB0bXAuc2VnbWVudDtcblx0XHRcdHN0ciA9IHRtcC5yZW1haW5kZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dG1wID0gc2tpcE92ZXIoc3RyLCBzZXApO1xuXHRcdGlmICh0bXApIHtcblx0XHRcdHRvID0gdG1wLnNlZ21lbnQ7XG5cdFx0XHRzdHIgPSB0bXAucmVtYWluZGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGZsYWdzID0gJyc7XG5cdFx0aWYgKHN0ci5sZW5ndGggPiAwKSB7XG5cdFx0XHR0bXAgPSBza2lwT3ZlcihzdHIsICc7JykgfHwgc2tpcFRvRW5kKHN0ciwgJzsnKTtcblx0XHRcdGlmICh0bXApIHtcblx0XHRcdFx0ZmxhZ3MgPSB0bXAuc2VnbWVudDtcblx0XHRcdFx0c3RyID0gdG1wLnJlbWFpbmRlcjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFjdGlvbjogc3Vic3RpdHV0ZSxcblx0XHRcdGZyb20sXG5cdFx0XHR0byxcblx0XHRcdGZsYWdzLFxuXHRcdFx0cmVtYWluZGVyOiBzdHIsXG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc2tpcE92ZXIgPSAoc3RyLCBzZXApID0+IHtcblx0XHRjb25zdCBlbmRTZWdtZW50ID0gZmluZE5leHQoc3RyLCBzZXApO1xuXHRcdGlmIChlbmRTZWdtZW50IDwgMCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBzZWdtZW50ID0gdW5Fc2NhcGUoc3RyLnNsaWNlKDAsIE1hdGgubWF4KDAsIGVuZFNlZ21lbnQpKSwgc2VwKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VnbWVudCxcblx0XHRcdHJlbWFpbmRlcjogc3RyLnNsaWNlKE1hdGgubWF4KDAsIGVuZFNlZ21lbnQgKyAxKSksXG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc2tpcFRvRW5kID0gKHN0ciwgX3NlcCkgPT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWdtZW50OiBzdHIsXG5cdFx0XHRyZW1haW5kZXI6ICcnLFxuXHRcdH07XG5cdH07XG5cdGNvbnN0IGZpbmROZXh0ID0gKHN0ciwgY2gpID0+IHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKHN0ci5jaGFyQXQoaSkgPT09ICdcXFxcJykge1xuXHRcdFx0XHRpICs9IDI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RyLmNoYXJBdChpKSA9PT0gY2gpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fTtcblx0Y29uc3Qgc2V0Q2hlY2tib3ggPSAocGFyYW0sIGJveCkgPT4ge1xuXHRcdGNvbnN0IHZhbCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZShwYXJhbSk7XG5cdFx0aWYgKHZhbCkge1xuXHRcdFx0c3dpdGNoICh2YWwpIHtcblx0XHRcdFx0Y2FzZSAnMSc6XG5cdFx0XHRcdGNhc2UgJ3llcyc6XG5cdFx0XHRcdGNhc2UgJ3RydWUnOlxuXHRcdFx0XHRcdGJveC5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnMCc6XG5cdFx0XHRcdGNhc2UgJ25vJzpcblx0XHRcdFx0Y2FzZSAnZmFsc2UnOlxuXHRcdFx0XHRcdGJveC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhdXRvRWRpdCA9IGZ1bmN0aW9uIGF1dG9FZGl0KCkge1xuXHRcdHNldHVwUG9wdXBzKCgpID0+IHtcblx0XHRcdGlmIChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2F1dG9pbXBsJykgIT09IHBvcHVwU3RyaW5nKCdhdXRvZWRpdF92ZXJzaW9uJykpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3dhdGNobGlzdCcpICYmIG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYWN0b2tlbicpID09PSBhdXRvQ2xpY2tUb2tlbigpKSB7XG5cdFx0XHRcdHBnLmZuLm1vZGlmeVdhdGNobGlzdChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3RpdGxlJyksIG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYWN0aW9uJykpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFkb2N1bWVudC5lZGl0Zm9ybSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYXV0b0VkaXQuYWxyZWFkeVJhbikge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRhdXRvRWRpdC5hbHJlYWR5UmFuID0gdHJ1ZTtcblx0XHRcdGNvbnN0IGNtZFN0cmluZyA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b2VkaXQnKTtcblx0XHRcdGlmIChjbWRTdHJpbmcpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBlZGl0Ym94ID0gZG9jdW1lbnQuZWRpdGZvcm0ud3BUZXh0Ym94MTtcblx0XHRcdFx0XHRjb25zdCBjbWRMaXN0ID0gcGFyc2VDbWQoY21kU3RyaW5nKTtcblx0XHRcdFx0XHRjb25zdCBpbnB1dCA9IGVkaXRib3gudmFsdWU7XG5cdFx0XHRcdFx0Y29uc3Qgb3V0cHV0ID0gZXhlY0NtZHMoaW5wdXQsIGNtZExpc3QpO1xuXHRcdFx0XHRcdGVkaXRib3gudmFsdWUgPSBvdXRwdXQ7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0c2V0Q2hlY2tib3goJ2F1dG9taW5vcicsIGRvY3VtZW50LmVkaXRmb3JtLndwTWlub3JlZGl0KTtcblx0XHRcdHNldENoZWNrYm94KCdhdXRvd2F0Y2gnLCBkb2N1bWVudC5lZGl0Zm9ybS53cFdhdGNodGhpcyk7XG5cdFx0XHRjb25zdCBydmlkID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvcnYnKTtcblx0XHRcdGlmIChydmlkKSB7XG5cdFx0XHRcdGNvbnN0IHVybCA9IGAke3BnLndpa2kuYXBpd2lraWJhc2V9P2FjdGlvbj1xdWVyeSZmb3JtYXQ9anNvbiZmb3JtYXR2ZXJzaW9uPTImcHJvcD1yZXZpc2lvbnMmcmV2aWRzPSR7cnZpZH1gO1xuXHRcdFx0XHRzdGFydERvd25sb2FkKHVybCwgbnVsbCwgYXV0b0VkaXQyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGF1dG9FZGl0MigpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBhdXRvRWRpdDIgPSAoZCkgPT4ge1xuXHRcdGxldCBzdW1tYXJ5ID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvc3VtbWFyeScpO1xuXHRcdGxldCBzdW1tYXJ5cHJvbXB0ID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvc3VtbWFyeXByb21wdCcpO1xuXHRcdGxldCBzdW1tYXJ5bm90aWNlID0gJyc7XG5cdFx0aWYgKGQgJiYgZC5kYXRhICYmIG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3J2JykpIHtcblx0XHRcdGNvbnN0IHMgPSBnZXRSdlN1bW1hcnkoc3VtbWFyeSwgZC5kYXRhKTtcblx0XHRcdGlmIChzID09PSBmYWxzZSkge1xuXHRcdFx0XHRzdW1tYXJ5cHJvbXB0ID0gdHJ1ZTtcblx0XHRcdFx0c3VtbWFyeW5vdGljZSA9IHBvcHVwU3RyaW5nKCdGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIGluZm9ybWF0aW9uLCBwbGVhc2UgZWRpdCBtYW51YWxseS5cXG5cXG4nKTtcblx0XHRcdFx0c3VtbWFyeSA9IHNpbXBsZVByaW50ZihzdW1tYXJ5LCBbbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvcnYnKSwgJyh1bmtub3duKScsICcodW5rbm93biknXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdW1tYXJ5ID0gcztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHN1bW1hcnlwcm9tcHQpIHtcblx0XHRcdGNvbnN0IHR4dCA9IHN1bW1hcnlub3RpY2UgKyBwb3B1cFN0cmluZygnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCcpO1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBwcm9tcHQodHh0LCBzdW1tYXJ5KTtcblx0XHRcdGlmIChyZXNwb25zZSkge1xuXHRcdFx0XHRzdW1tYXJ5ID0gcmVzcG9uc2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzdW1tYXJ5KSB7XG5cdFx0XHRkb2N1bWVudC5lZGl0Zm9ybS53cFN1bW1hcnkudmFsdWUgPSBzdW1tYXJ5O1xuXHRcdH1cblx0XHQvLyBBdHRlbXB0IHRvIGF2b2lkIHBvc3NpYmxlIHByZW1hdHVyZSBjbGlja2luZyBvZiB0aGUgc2F2ZSBidXR0b25cblx0XHQvLyAobWF5YmUgZGVsYXlzIGluIHVwZGF0ZXMgdG8gdGhlIERPTSBhcmUgdG8gYmxhbWU/PyBvciBhIHJlZCBoZXJyaW5nKVxuXHRcdHNldFRpbWVvdXQoYXV0b0VkaXQzLCAxMDApO1xuXHR9O1xuXHRjb25zdCBhdXRvQ2xpY2tUb2tlbiA9ICgpID0+IHtcblx0XHRyZXR1cm4gbXcudXNlci5zZXNzaW9uSWQoKTtcblx0fTtcblx0Y29uc3QgYXV0b0VkaXQzID0gKCkgPT4ge1xuXHRcdGlmIChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2FjdG9rZW4nKSAhPT0gYXV0b0NsaWNrVG9rZW4oKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBidG4gPSBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2F1dG9jbGljaycpO1xuXHRcdGlmIChidG4pIHtcblx0XHRcdGlmIChkb2N1bWVudC5lZGl0Zm9ybSAmJiBkb2N1bWVudC5lZGl0Zm9ybVtidG5dKSB7XG5cdFx0XHRcdGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmVkaXRmb3JtW2J0bl07XG5cdFx0XHRcdGNvbnN0IG1zZyA9IHRwcmludGYoXG5cdFx0XHRcdFx0J1RoZSAlcyBidXR0b24gaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbGlja2VkLiBQbGVhc2Ugd2FpdCBmb3IgdGhlIG5leHQgcGFnZSB0byBsb2FkLicsXG5cdFx0XHRcdFx0W2J1dHRvbi52YWx1ZV1cblx0XHRcdFx0KTtcblx0XHRcdFx0YmFubmVyTWVzc2FnZShtc2cpO1xuXHRcdFx0XHRkb2N1bWVudC50aXRsZSA9IGAoJHtkb2N1bWVudC50aXRsZX0pYDtcblx0XHRcdFx0YnV0dG9uLmNsaWNrKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2b2lkIG13Lm5vdGlmeShcblx0XHRcdFx0XHR0cHJpbnRmKCdDb3VsZCBub3QgZmluZCBidXR0b24gJXMuIFBsZWFzZSBjaGVjayB0aGUgc2V0dGluZ3MgaW4geW91ciBqYXZhc2NyaXB0IGZpbGUuJywgW2J0bl0pLFxuXHRcdFx0XHRcdHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgYmFubmVyTWVzc2FnZSA9IChzKSA9PiB7XG5cdFx0Y29uc3QgaGVhZGluZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMScpO1xuXHRcdGlmIChoZWFkaW5ncykge1xuXHRcdFx0Y29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRkaXYuaW5uZXJIVE1MID0gYDxmb250IHNpemU9KzE+PGI+JHtwZy5lc2NhcGVRdW90ZXNIVE1MKHMpfTwvYj48L2ZvbnQ+YDtcblx0XHRcdGhlYWRpbmdzWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgaGVhZGluZ3NbMF0pO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZ2V0UnZTdW1tYXJ5ID0gKHRlbXBsYXRlLCBqc29uKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG8gPSBnZXRKc09iaihqc29uKTtcblx0XHRcdGNvbnN0IFtlZGl0XSA9IGFueUNoaWxkKG8ucXVlcnkucGFnZXMpLnJldmlzaW9ucztcblx0XHRcdGNvbnN0IHRpbWVzdGFtcCA9IGVkaXQudGltZXN0YW1wXG5cdFx0XHRcdC5zcGxpdCgvW0EtWl0vZylcblx0XHRcdFx0LmpvaW4oJyAnKVxuXHRcdFx0XHQucmVwbGFjZSgvXiAqfCAqJC9nLCAnJyk7XG5cdFx0XHRyZXR1cm4gc2ltcGxlUHJpbnRmKHRlbXBsYXRlLCBbZWRpdC5yZXZpZCwgdGltZXN0YW1wLCBlZGl0LnVzZXJoaWRkZW4gPyAnKGhpZGRlbiknIDogZWRpdC51c2VyXSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXHQvLyBFTkRGSUxFOiBhdXRvZWRpdC5qc1xuXHQvLyBTVEFSVEZJTEU6IGRvd25sb2FkZXIuanNcblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICoge0Bzb3VyY2UgRG93bmxvYWRlcn0sIGEgeG1saHR0cHJlcXVlc3Qgd3JhcHBlciwgYW5kIGhlbHBlciBmdW5jdGlvbnMuXG5cdCAqL1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBEb3dubG9hZGVyXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAY2xhc3MgVGhlIERvd25sb2FkZXIgY2xhc3MuIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIGRvd25sb2FkIHN0dWZmLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSB1cmwgdG8gZG93bmxvYWQuIFRoaXMgY2FuIGJlIG9taXR0ZWQgYW5kIHN1cHBsaWVkIGxhdGVyLlxuXHQgKi9cblx0Y2xhc3MgRG93bmxvYWRlciB7XG5cdFx0Y29uc3RydWN0b3IodXJsKSB7XG5cdFx0XHRpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHRcdH1cblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIHVybCB0byBkb3dubG9hZFxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnVybCA9IHVybDtcblx0XHRcdC8qKlxuXHRcdFx0ICogQSB1bml2ZXJzYWxseSB1bmlxdWUgSUQgbnVtYmVyXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgaW50ZWdlclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmlkID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogTW9kaWZpY2F0aW9uIGRhdGUsIHRvIGJlIGN1bGxlZCBmcm9tIHRoZSBpbmNvbWluZyBoZWFkZXJzXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRGF0ZVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5sYXN0TW9kaWZpZWQgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBXaGF0IHRvIGRvIHdoZW4gdGhlIGRvd25sb2FkIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHlcblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBGdW5jdGlvblxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5jYWxsYmFja0Z1bmN0aW9uID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogV2hhdCB0byBkbyBvbiBmYWlsdXJlXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgRnVuY3Rpb25cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMub25GYWlsdXJlID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyBzZXQgb24gPGNvZGU+YWJvcnQ8L2NvZGU+XG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmFib3J0ZWQgPSBmYWxzZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogSFRUUCBtZXRob2QuIFNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWM5Lmh0bWwgZm9yXG5cdFx0XHQgKiBwb3NzaWJpbGl0aWVzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdFx0ICovXG5cdFx0XHR0aGlzLm1ldGhvZCA9ICdHRVQnO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBBc3luYyBmbGFnLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIGJvb2xlYW5cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5hc3luYyA9IHRydWU7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFN1Ym1pdHMgdGhlIGh0dHAgcmVxdWVzdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Kn0geFxuXHRcdCAqL1xuXHRcdHNlbmQoeCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLnNlbmQoeCk7XG5cdFx0fVxuXHRcdC8qIEFib3J0cyB0aGUgZG93bmxvYWQsIHNldHRpbmcgdGhlIDxjb2RlPmFib3J0ZWQ8L2NvZGU+IGZpZWxkIHRvIHRydWUuICovXG5cdFx0YWJvcnQoKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHRoaXMuYWJvcnRlZCA9IHRydWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLmFib3J0KCk7XG5cdFx0fVxuXHRcdC8qKiBSZXR1cm5zIHRoZSBkb3dubG9hZGVkIGRhdGEuICovXG5cdFx0Z2V0RGF0YSgpIHtcblx0XHRcdGlmICghdGhpcy5odHRwKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuaHR0cC5yZXNwb25zZVRleHQ7XG5cdFx0fVxuXHRcdC8qKiBQcmVwYXJlcyB0aGUgZG93bmxvYWQuICovXG5cdFx0c2V0VGFyZ2V0KCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmh0dHAub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRoaXMuYXN5bmMpO1xuXHRcdFx0dGhpcy5odHRwLnNldFJlcXVlc3RIZWFkZXIoJ0FwaS1Vc2VyLUFnZW50JywgcGcuYXBpLnVzZXJBZ2VudCk7XG5cdFx0fVxuXHRcdC8qKiBHZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZG93bmxvYWQuICovXG5cdFx0Z2V0UmVhZHlTdGF0ZSgpIHtcblx0XHRcdGlmICghdGhpcy5odHRwKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuaHR0cC5yZWFkeVN0YXRlO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTdGFydHMgdGhlIGRvd25sb2FkLlxuXHRcdCAqIE5vdGUgdGhhdCBzZXRUYXJnZXQge0Bzb3VyY2UgRG93bmxvYWRlciNzZXRUYXJnZXR9IG11c3QgYmUgcnVuIGZpcnN0XG5cdFx0ICovXG5cdFx0c3RhcnQoKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdHBnLm1pc2MuZG93bmxvYWRzSW5Qcm9ncmVzc1t0aGlzLmlkXSA9IHNlbGY7XG5cdFx0XHR0aGlzLmh0dHAuc2VuZChudWxsKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogR2V0cyB0aGUgJ0xhc3QtTW9kaWZpZWQnIGRhdGUgZnJvbSB0aGUgZG93bmxvYWQgaGVhZGVycy5cblx0XHQgKiBTaG91bGQgYmUgcnVuIGFmdGVyIHRoZSBkb3dubG9hZCBjb21wbGV0ZXMuXG5cdFx0ICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBvbiBmYWlsdXJlLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7RGF0ZX1cblx0XHQgKi9cblx0XHRnZXRMYXN0TW9kaWZpZWREYXRlKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRsZXQgbGFzdG1vZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxhc3Rtb2QgPSB0aGlzLmh0dHAuZ2V0UmVzcG9uc2VIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBlbXB0eSAqL1xuXHRcdFx0fVxuXHRcdFx0aWYgKGxhc3Rtb2QpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBEYXRlKGxhc3Rtb2QpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNldHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZiBjYWxsYmFjayBmdW5jdGlvbiwgY2FsbGVkIGFzIDxjb2RlPmYodGhpcyk8L2NvZGU+IG9uIHN1Y2Nlc3Ncblx0XHQgKi9cblx0XHRzZXRDYWxsYmFjayhmKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmh0dHAub25yZWFkeXN0YXRlY2hhbmdlID0gZjtcblx0XHR9XG5cdFx0Z2V0U3RhdHVzKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLnN0YXR1cztcblx0XHR9XG5cdH1cblx0bmV3IERvd25sb2FkZXIoKTtcblx0cGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzID0ge307XG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcge0Bzb3VyY2UgRG93bmxvYWRlcn0gYW5kIHByZXBhcmVzIGl0IGZvciBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybCB0byBkb3dubG9hZFxuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGlkIFRoZSBJRCBvZiB0aGUge0Bzb3VyY2UgRG93bmxvYWRlcn0gb2JqZWN0XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIG9uIHN1Y2Nlc3Ncblx0ICogQHBhcmFtIHtudW1iZXJ9IG9uZmFpbHVyZVxuXHQgKiBAcmV0dXJuIHtTdHJpbmcvRG93bmxvYWRlcn0gdGhlIHtAc291cmNlIERvd25sb2FkZXJ9IG9iamVjdCBjcmVhdGVkLCBvciAnb2hkZWFyJyBpZiBhbiB1bnN1cHBvcnRlZCBicm93c2VyXG5cdCAqL1xuXHRjb25zdCBuZXdEb3dubG9hZCA9IGZ1bmN0aW9uIG5ld0Rvd25sb2FkKHVybCwgaWQsIGNhbGxiYWNrLCBvbmZhaWx1cmUpIHtcblx0XHRjb25zdCBkID0gbmV3IERvd25sb2FkZXIodXJsKTtcblx0XHRpZiAoIWQuaHR0cCkge1xuXHRcdFx0cmV0dXJuICdvaGRlYXInO1xuXHRcdH1cblx0XHRkLmlkID0gaWQ7XG5cdFx0ZC5zZXRUYXJnZXQoKTtcblx0XHRpZiAoIW9uZmFpbHVyZSkge1xuXHRcdFx0b25mYWlsdXJlID0gMjtcblx0XHR9XG5cdFx0Y29uc3QgZiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChkLmdldFJlYWR5U3RhdGUoKSA9PT0gNCkge1xuXHRcdFx0XHRkZWxldGUgcGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzW3RoaXMuaWRdO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlmIChkLmdldFN0YXR1cygpID09PSAyMDApIHtcblx0XHRcdFx0XHRcdGQuZGF0YSA9IGQuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0ZC5sYXN0TW9kaWZpZWQgPSBkLmdldExhc3RNb2RpZmllZERhdGUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrKGQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIG9uZmFpbHVyZSA9PT0gdHlwZW9mIDEpIHtcblx0XHRcdFx0XHRcdGlmIChvbmZhaWx1cmUgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHJldHJ5XG5cdFx0XHRcdFx0XHRcdG5ld0Rvd25sb2FkKHVybCwgaWQsIGNhbGxiYWNrLCBvbmZhaWx1cmUgLSAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBvbmZhaWx1cmUgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdG9uZmFpbHVyZShkLCB1cmwsIGlkLCBjYWxsYmFjayk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvKiBpZ25vcmUgaXQgKi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0ZC5zZXRDYWxsYmFjayhmKTtcblx0XHRyZXR1cm4gZDtcblx0fTtcblx0LyoqXG5cdCAqIFNpbXVsYXRlcyBhIGRvd25sb2FkIGZyb20gY2FjaGVkIGRhdGEuXG5cdCAqIFRoZSBzdXBwbGllZCBkYXRhIGlzIHB1dCBpbnRvIGEge0Bzb3VyY2UgRG93bmxvYWRlcn0gYXMgaWYgaXQgaGFkIGRvd25sb2FkZWQgaXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybC5cblx0ICogQHBhcmFtIHtpbnRlZ2VyfSBpZCBUaGUgSUQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjaywgd2hpY2ggaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhcyA8Y29kZT5jYWxsYmFjayhkKTwvY29kZT4sXG5cdCAqIHdoZXJlIDxjb2RlPmQ8L2NvZGU+IGlzIHRoZSBuZXcge0Bzb3VyY2UgRG93bmxvYWRlcn0uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFRoZSAoY2FjaGVkKSBkYXRhLlxuXHQgKiBAcGFyYW0ge0RhdGV9IGxhc3RNb2RpZmllZCBUaGUgKGNhY2hlZCkgbGFzdCBtb2RpZmllZCBkYXRlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gb3duZXJcblx0ICovXG5cdGNvbnN0IGZha2VEb3dubG9hZCA9ICh1cmwsIGlkLCBjYWxsYmFjaywgZGF0YSwgbGFzdE1vZGlmaWVkLCBvd25lcikgPT4ge1xuXHRcdGNvbnN0IGQgPSBuZXdEb3dubG9hZCh1cmwsIGNhbGxiYWNrKTtcblx0XHRkLm93bmVyID0gb3duZXI7XG5cdFx0ZC5pZCA9IGlkO1xuXHRcdGQuZGF0YSA9IGRhdGE7XG5cdFx0ZC5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7XG5cdFx0cmV0dXJuIGNhbGxiYWNrKGQpO1xuXHR9O1xuXHQvKipcblx0ICogU3RhcnRzIGEgZG93bmxvYWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybCB0byBkb3dubG9hZFxuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGlkIFRoZSBJRCBvZiB0aGUge0Bzb3VyY2UgRG93bmxvYWRlcn0gb2JqZWN0XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbnZva2VkIG9uIHN1Y2Nlc3Ncblx0ICogQHJldHVybiB7U3RyaW5nL0Rvd25sb2FkZXJ9IHRoZSB7QHNvdXJjZSBEb3dubG9hZGVyfSBvYmplY3QgY3JlYXRlZCwgb3IgJ29oZGVhcicgaWYgYW4gdW5zdXBwb3J0ZWQgYnJvd3NlclxuXHQgKi9cblx0Y29uc3Qgc3RhcnREb3dubG9hZCA9ICh1cmwsIGlkLCBjYWxsYmFjaykgPT4ge1xuXHRcdGNvbnN0IGQgPSBuZXdEb3dubG9hZCh1cmwsIGlkLCBjYWxsYmFjayk7XG5cdFx0aWYgKHR5cGVvZiBkID09PSB0eXBlb2YgJycpIHtcblx0XHRcdHJldHVybiBkO1xuXHRcdH1cblx0XHRkLnN0YXJ0KCk7XG5cdFx0cmV0dXJuIGQ7XG5cdH07XG5cdC8qKlxuXHQgKiBBYm9ydHMgYWxsIGRvd25sb2FkcyB3aGljaCBoYXZlIGJlZW4gc3RhcnRlZC5cblx0ICovXG5cdGNvbnN0IGFib3J0QWxsRG93bmxvYWRzID0gKCkgPT4ge1xuXHRcdGZvciAoY29uc3QgeCBpbiBwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3MpIHtcblx0XHRcdGlmICghT2JqZWN0Lmhhc093bihwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3MsIHgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzW3hdLmFib3J0ZWQgPSB0cnVlO1xuXHRcdFx0XHRwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3NbeF0uYWJvcnQoKTtcblx0XHRcdFx0ZGVsZXRlIHBnLm1pc2MuZG93bmxvYWRzSW5Qcm9ncmVzc1t4XTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBlbXB0eSAqL1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Ly8gRU5ERklMRTogZG93bmxvYWRlci5qc1xuXHQvLyBTVEFSVEZJTEU6IGxpdmVwcmV2aWV3LmpzXG5cdC8vIFRPRE86IGxvY2F0aW9uIGlzIG9mdGVuIG5vdCBjb3JyZWN0IChlZyByZWxhdGl2ZSBsaW5rcyBpbiBwcmV2aWV3cylcblx0Ly8gTk9URTogcmVtb3ZlZCBtZDUgYW5kIGltYWdlIGFuZCBtYXRoIHBhcnNpbmcuIHdhcyBicm9rZW4sIGxvdHMgb2YgYnl0ZXMuXG5cdC8qKlxuXHQgKiBJbnN0YVZpZXcgLSBhIE1lZGlhd2lraSB0byBIVE1MIGNvbnZlcnRlciBpbiBKYXZhU2NyaXB0XG5cdCAqIFZlcnNpb24gMC42LjFcblx0ICogQ29weXJpZ2h0IChDKSBQZWRybyBGYXlvbGxlIDIwMDUtMjAwNlxuXHQgKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVXNlcjpQaWxhZn1cblx0ICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlXG5cdCAqXG5cdCAqIENoYW5nZWxvZzpcblx0ICpcblx0ICogMC42LjFcblx0ICogLSBGaXhlZCBwcm9ibGVtIGNhdXNlZCBieSBcXHIgY2hhcmFjdGVyc1xuXHQgKiAtIEltcHJvdmVkIGlubGluZSBmb3JtYXR0aW5nIHBhcnNlclxuXHQgKlxuXHQgKiAwLjZcblx0ICogLSBDaGFuZ2VkIG5hbWUgdG8gSW5zdGFWaWV3XG5cdCAqIC0gU29tZSBtYWpvciBjb2RlIHJlb3JnYW5pemF0aW9ucyBhbmQgZmFjdG9yZWQgb3V0IHNvbWUgY29tbW9uIGZ1bmN0aW9uc1xuXHQgKiAtIEhhbmRsZWQgY29udmVyc2lvbiBvZiByZWxhdGl2ZSBsaW5rcyAoaS5lLiBbWy9mb29dXSlcblx0ICogLSBGaXhlZCBtaXNyZW5kZXJpbmcgb2YgYWRqYWNlbnQgZGVmaW5pdGlvbiBsaXN0IGl0ZW1zXG5cdCAqIC0gRml4ZWQgYnVnIGluIHRhYmxlIGhlYWRpbmdzIGhhbmRsaW5nXG5cdCAqIC0gQ2hhbmdlZCBkYXRlIGZvcm1hdCBpbiBzaWduYXR1cmVzIHRvIHJlZmxlY3QgTWVkaWF3aWtpJ3Ncblx0ICogLSBGaXhlZCBoYW5kbGluZyBvZiBbWzpJbWFnZTouLi5dXVxuXHQgKiAtIFVwZGF0ZWQgTUQ1IGZ1bmN0aW9uIChob3BlZnVsbHkgaXQgd2lsbCB3b3JrIHdpdGggVVRGLTgpXG5cdCAqIC0gRml4ZWQgYnVnIGluIGhhbmRsaW5nIG9mIGxpbmtzIGluc2lkZSBpbWFnZXNcblx0ICpcblx0ICogVG8gZG86XG5cdCAqIC0gQmV0dGVyIHN1cHBvcnQgZm9yIG1hdGggdGFnc1xuXHQgKiAtIEZ1bGwgc3VwcG9ydCBmb3Igbm93aWtpIHRhZ1xuXHQgKiAtIFBhcnNlci1iYXNlZCAoYXMgb3Bwb3NlZCB0byBSZWdFeHAtYmFzZWQpIGlubGluZSB3aWtpY29kZSBoYW5kbGluZyAobWFrZSBpdCBvbmUtcGFzcyBhbmRcblx0ICogICBidWxsZXQtcHJvb2YpXG5cdCAqIC0gU3VwcG9ydCBmb3IgdGVtcGxhdGVzICh0aHJvdWdoIEFKQVgpXG5cdCAqIC0gU3VwcG9ydCBmb3IgY29sb3VyZWQgbGlua3MgKEFKQVgpXG5cdCAqL1xuXHRjb25zdCBJbnN0YSA9IHt9O1xuXHRjb25zdCBzZXR1cExpdmVQcmV2aWV3ID0gKCkgPT4ge1xuXHRcdGxldCBfYjtcblx0XHQvLyBvcHRpb25zXG5cdFx0SW5zdGEuY29uZiA9IHtcblx0XHRcdGJhc2VVcmw6ICcnLFxuXHRcdFx0dXNlcjoge30sXG5cdFx0XHR3aWtpOiB7XG5cdFx0XHRcdGxhbmc6IHBnLndpa2kubGFuZyxcblx0XHRcdFx0aW50ZXJ3aWtpOiBwZy53aWtpLmludGVyd2lraSxcblx0XHRcdFx0ZGVmYXVsdF90aHVtYl93aWR0aDogMTgwLFxuXHRcdFx0fSxcblx0XHRcdHBhdGhzOiB7XG5cdFx0XHRcdGFydGljbGVzOiBgJHtwZy53aWtpLmFydGljbGVQYXRofS9gLFxuXHRcdFx0XHQvLyBPbmx5IHVzZWQgZm9yIEluc3RhIHByZXZpZXdzIHdpdGggaW1hZ2VzLiAobm90IGluIHBvcHVwcylcblx0XHRcdFx0bWF0aDogJy9tYXRoLycsXG5cdFx0XHRcdGltYWdlczogJ2h0dHBzOi8vdHUuemhvbmd3ZW4ud2lraS9pbWFnZXMvcWl1d2VuYmFpa2UvemgvJyxcblx0XHRcdFx0aW1hZ2VzX2ZhbGxiYWNrOiAnLy93bS56aG9uZ3dlbi53aWtpL2NvbW1vbnMvJyxcblx0XHRcdH0sXG5cdFx0XHRsb2NhbGU6IHtcblx0XHRcdFx0dXNlcjogbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNVc2VySWRdLFxuXHRcdFx0XHRpbWFnZTogbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNJbWFnZUlkXSxcblx0XHRcdFx0Y2F0ZWdvcnk6IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zQ2F0ZWdvcnlJZF0sXG5cdFx0XHRcdC8vIHNob3VsZG4ndCBiZSB1c2VkIGluIHBvcHVwIHByZXZpZXdzLCBpIHRoaW5rXG5cdFx0XHRcdG1vbnRoczogWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddLFxuXHRcdFx0fSxcblx0XHR9O1xuXHRcdC8vIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBvciBiYWNrcmVmZXJlbmNlc1xuXHRcdChfYiA9IEluc3RhLmNvbmYudXNlcikubmFtZSB8fCAoX2IubmFtZSA9ICdRaXV3ZW4gQmFpa2UgY29udHJpYnV0b3JzJyk7XG5cdFx0SW5zdGEuY29uZi51c2VyLnNpZ25hdHVyZSA9IGBbWyR7SW5zdGEuY29uZi5sb2NhbGUudXNlcn06JHtJbnN0YS5jb25mLnVzZXIubmFtZX18JHtJbnN0YS5jb25mLnVzZXIubmFtZX1dXWA7XG5cdFx0Ly8gZGVmaW5lIGNvbnN0YW50c1xuXHRcdEluc3RhLkJMT0NLX0lNQUdFID0gbmV3IFJlZ0V4cChcblx0XHRcdGBeXFxcXFtcXFxcWyg/OkZpbGV8SW1hZ2V8JHtJbnN0YS5jb25mLmxvY2FsZS5pbWFnZX0pOi4qP1xcXFx8Lio/KD86ZnJhbWV8dGh1bWJuYWlsfHRodW1ifG5vbmV8cmlnaHR8bGVmdHxjZW50ZXIpYCxcblx0XHRcdCdpJ1xuXHRcdCk7XG5cdH07XG5cdEluc3RhLmR1bXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcblx0XHRpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRmcm9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZnJvbX1gKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB0byA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHRvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dG99YCk7XG5cdFx0fVxuXHRcdHRvLmlubmVySFRNTCA9IHRoaXMuY29udmVydChmcm9tLnZhbHVlKTtcblx0fTtcblx0SW5zdGEuY29udmVydCA9ICh3aWtpKSA9PiB7XG5cdFx0Y29uc3QgbGwgPSB0eXBlb2Ygd2lraSA9PT0gJ3N0cmluZycgPyB3aWtpLnJlcGxhY2UoL1xcci9nLCAnJykuc3BsaXQoL1xcbi8pIDogd2lraTsgLy8gbGluZXMgb2Ygd2lraWNvZGVcblx0XHRsZXQgbyA9ICcnOyAvLyByZXN1bHQgb2YgcGFzc2luZyBhIHJlZ2V4cCB0byBjb21wYXJlTGluZVN0cmluZ09yUmVnKClcblx0XHRsZXQgcCA9IDA7XG5cdFx0bGV0IHI7XG5cdFx0Ly8gc29tZSBzaG9ydGhhbmRzXG5cdFx0Y29uc3QgcmVtYWluID0gKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxsLmxlbmd0aDtcblx0XHR9O1xuXHRcdGNvbnN0IHNoID0gKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxsLnNoaWZ0KCk7XG5cdFx0fTsgLy8gc2hpZnRcblx0XHRjb25zdCBwcyA9IChzKSA9PiB7XG5cdFx0XHRvICs9IHM7XG5cdFx0fTsgLy8gcHVzaFxuXG5cdFx0Ly8gc2ltaWxhciB0byBDJ3MgcHJpbnRmLCB1c2VzID8gYXMgcGxhY2Vob2xkZXJzLCA/PyB0byBlc2NhcGUgcXVlc3Rpb24gbWFya3Ncblx0XHRjb25zdCBmID0gZnVuY3Rpb24gZiguLi5hcmdzKSB7XG5cdFx0XHRsZXQgaSA9IDE7XG5cdFx0XHRjb25zdCBhID0gYXJncztcblx0XHRcdGxldCBbZl0gPSBhO1xuXHRcdFx0bGV0IG8gPSAnJztcblx0XHRcdGxldCBjO1xuXHRcdFx0bGV0IHA7XG5cdFx0XHRmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKChwID0gZi5pbmRleE9mKCc/JykpICsgMSkge1xuXHRcdFx0XHRcdC8vIGFsbG93IGNoYXJhY3RlciBlc2NhcGluZ1xuXHRcdFx0XHRcdGMgPSBmLmNoYXJBdChwICsgMSkgPT09ICc/JyA/IDEgOiAwO1xuXHRcdFx0XHRcdGkgLT0gYztcblx0XHRcdFx0XHRvICs9IGYuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcCkpICsgKGMgPyAnPycgOiBhW2ldKTtcblx0XHRcdFx0XHRmID0gZi5zbGljZShwICsgMSArIGMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbyArIGY7XG5cdFx0fTtcblx0XHRjb25zdCBodG1sX2VudGl0aWVzID0gKHMpID0+IHtcblx0XHRcdHJldHVybiBzLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0XHR9O1xuXHRcdC8vIFdpa2kgdGV4dCBwYXJzaW5nIHRvIGh0bWwgaXMgYSBuaWdodG1hcmUuXG5cdFx0Ly8gVGhlIGJlbG93IGZ1bmN0aW9ucyBkZWxpYmVyYXRlbHkgZG9uJ3QgZXNjYXBlIHRoZSBhbXBlcnNhbmQgc2luY2UgdGhpcyB3b3VsZCBtYWtlIGl0IG1vcmVcblx0XHQvLyBkaWZmaWN1bHQsIGFuZCB3ZSBkb24ndCBhYnNvbHV0ZWx5IG5lZWQgdG8gZm9yIGhvdyB3ZSBuZWVkIGl0LiBUaGlzIG1lYW5zIHRoYXQgYW55XG5cdFx0Ly8gdW5lc2NhcGVkIGFtcGVyc2FuZHMgaW4gd2lraXRleHQgd2lsbCByZW1haW4gdW5lc2NhcGVkIGFuZCBjYW4gY2F1c2UgaW52YWxpZCBIVE1MLlxuXHRcdC8vIEJyb3dzZXJzIHNob3VsZCBhbGwgYmUgYWJsZSB0byBoYW5kbGUgaXQgdGhvdWdoLiBXZSBhbHNvIGVzY2FwZSBzaWduaWZpY2FudCB3aWtpbWFya3VwXG5cdFx0Ly8gY2hhcmFjdGVycyB0byBwcmV2ZW50IGZ1cnRoZXIgbWF0Y2hpbmcgb24gdGhlIHByb2Nlc3NlZCB0ZXh0LlxuXHRcdGNvbnN0IGh0bWxlc2NhcGVfdGV4dCA9IChzKSA9PiB7XG5cdFx0XHRyZXR1cm4gc1xuXHRcdFx0XHQucmVwbGFjZSgvPC9nLCAnJmx0OycpXG5cdFx0XHRcdC5yZXBsYWNlKC8+L2csICcmZ3Q7Jylcblx0XHRcdFx0LnJlcGxhY2UoLzovZywgJyYjNTg7Jylcblx0XHRcdFx0LnJlcGxhY2UoL1xcWy9nLCAnJiM5MTsnKVxuXHRcdFx0XHQucmVwbGFjZSgvXS9nLCAnJiM5MzsnKTtcblx0XHR9O1xuXHRcdGNvbnN0IGh0bWxlc2NhcGVfYXR0ciA9IChzKSA9PiB7XG5cdFx0XHRyZXR1cm4gaHRtbGVzY2FwZV90ZXh0KHMpLnJlcGxhY2UoLycvZywgJyYjMzk7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXHRcdH07XG5cdFx0Ly8gcmV0dXJuIHRoZSBmaXJzdCBub24gbWF0Y2hpbmcgY2hhcmFjdGVyIHBvc2l0aW9uIGJldHdlZW4gdHdvIHN0cmluZ3Ncblx0XHRjb25zdCBzdHJfaW1hdGNoID0gKGEsIGIpID0+IHtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IGw7XG5cdFx0XHRmb3IgKGkgPSAwLCBsID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRpZiAoYS5jaGFyQXQoaSkgIT09IGIuY2hhckF0KGkpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBpO1xuXHRcdH07XG5cdFx0Ly8gY29tcGFyZSBjdXJyZW50IGxpbmUgYWdhaW5zdCBhIHN0cmluZyBvciByZWdleHBcblx0XHQvLyBpZiBwYXNzZWQgYSBzdHJpbmcgaXQgd2lsbCBjb21wYXJlIG9ubHkgdGhlIGZpcnN0IHN0cmluZy5sZW5ndGggY2hhcmFjdGVyc1xuXHRcdC8vIGlmIHBhc3NlZCBhIHJlZ2V4cCB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbiByXG5cdFx0Y29uc3QgY29tcGFyZUxpbmVTdHJpbmdPclJlZyA9IChjKSA9PiB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gbGxbMF0gJiYgbGxbMF0uc2xpY2UoMCwgYy5sZW5ndGgpID09PSBjIDogKHIgPSBsbFswXSAmJiBsbFswXS5tYXRjaChjKSk7XG5cdFx0fTtcblx0XHRjb25zdCBjb21wYXJlTGluZVN0cmluZyA9IChjKSA9PiB7XG5cdFx0XHRyZXR1cm4gbGxbMF0gPT09IGM7XG5cdFx0fTsgLy8gY29tcGFyZSBjdXJyZW50IGxpbmUgYWdhaW5zdCBhIHN0cmluZ1xuXHRcdGNvbnN0IGNoYXJBdFBvaW50ID0gKHApID0+IHtcblx0XHRcdHJldHVybiBsbFswXS5jaGFyQXQocCk7XG5cdFx0fTsgLy8gcmV0dXJuIGNoYXIgYXQgcG9zIHBcblx0XHRjb25zdCBlbmRsID0gKHMpID0+IHtcblx0XHRcdHBzKHMpO1xuXHRcdFx0c2goKTtcblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX2xpc3QgPSAoKSA9PiB7XG5cdFx0XHRsZXQgcHJldiA9ICcnO1xuXHRcdFx0d2hpbGUgKHJlbWFpbigpICYmIGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL14oWyMqOjtdKykoLiopJC8pKSB7XG5cdFx0XHRcdGNvbnN0IGxfbWF0Y2ggPSByO1xuXHRcdFx0XHRzaCgpO1xuXHRcdFx0XHRjb25zdCBpcG9zID0gc3RyX2ltYXRjaChwcmV2LCBsX21hdGNoWzFdKTtcblx0XHRcdFx0Ly8gY2xvc2UgdW5jb250aW51ZWQgbGlzdHNcblx0XHRcdFx0Zm9yIChsZXQgcHJldlBvcyA9IHByZXYubGVuZ3RoIC0gMTsgcHJldlBvcyA+PSBpcG9zOyBwcmV2UG9zLS0pIHtcblx0XHRcdFx0XHRjb25zdCBwaSA9IHByZXYuY2hhckF0KHByZXZQb3MpO1xuXHRcdFx0XHRcdGlmIChwaSA9PT0gJyonKSB7XG5cdFx0XHRcdFx0XHRwcygnPC91bD4nKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBpID09PSAnIycpIHtcblx0XHRcdFx0XHRcdHBzKCc8L29sPicpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoWycnLCAnKicsICcjJ10uaW5kZXhPZihsX21hdGNoWzFdLmNoYXJBdChwcmV2UG9zKSkpIHtcblx0XHRcdFx0XHRcdC8vIGNsb3NlIGEgZGwgb25seSBpZiB0aGUgbmV3IGl0ZW0gaXMgbm90IGEgZGwgaXRlbSAoOiwgOyBvciBlbXB0eSlcblx0XHRcdFx0XHRcdHBzKCc8L2RsPicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBvcGVuIG5ldyBsaXN0c1xuXHRcdFx0XHRmb3IgKGxldCBtYXRjaFBvcyA9IGlwb3M7IG1hdGNoUG9zIDwgbF9tYXRjaFsxXS5sZW5ndGg7IG1hdGNoUG9zKyspIHtcblx0XHRcdFx0XHRjb25zdCBsaSA9IGxfbWF0Y2hbMV0uY2hhckF0KG1hdGNoUG9zKTtcblx0XHRcdFx0XHRpZiAobGkgPT09ICcqJykge1xuXHRcdFx0XHRcdFx0cHMoJzx1bD4nKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxpID09PSAnIycpIHtcblx0XHRcdFx0XHRcdHBzKCc8b2w+Jyk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChbJycsICcqJywgJyMnXS5pbmRleE9mKHByZXYuY2hhckF0KG1hdGNoUG9zKSkpIHtcblx0XHRcdFx0XHRcdC8vIG9wZW4gYSBuZXcgZGwgb25seSBpZiB0aGUgcHJldiBpdGVtIGlzIG5vdCBhIGRsIGl0ZW0gKDosIDsgb3IgZW1wdHkpXG5cdFx0XHRcdFx0XHRwcygnPGRsPicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzd2l0Y2ggKGxfbWF0Y2hbMV0uYXQoLTEpKSB7XG5cdFx0XHRcdFx0Y2FzZSAnKic6XG5cdFx0XHRcdFx0Y2FzZSAnIyc6XG5cdFx0XHRcdFx0XHRwcyhgPGxpPiR7cGFyc2VfaW5saW5lX25vd2lraShsX21hdGNoWzJdKX1gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJzsnOiB7XG5cdFx0XHRcdFx0XHRwcygnPGR0PicpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHRfbWF0Y2ggPSBsX21hdGNoWzJdLm1hdGNoKC8oLio/KSg6Lio/KSQvKTtcblx0XHRcdFx0XHRcdC8vIGhhbmRsZSA7ZHQgOmRkIGZvcm1hdFxuXHRcdFx0XHRcdFx0aWYgKGR0X21hdGNoKSB7XG5cdFx0XHRcdFx0XHRcdHBzKHBhcnNlX2lubGluZV9ub3dpa2koZHRfbWF0Y2hbMV0pKTtcblx0XHRcdFx0XHRcdFx0bGwudW5zaGlmdChkdF9tYXRjaFsyXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcyhwYXJzZV9pbmxpbmVfbm93aWtpKGxfbWF0Y2hbMl0pKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjYXNlICc6Jzpcblx0XHRcdFx0XHRcdHBzKGA8ZGQ+JHtwYXJzZV9pbmxpbmVfbm93aWtpKGxfbWF0Y2hbMl0pfWApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFssIHByZXZdID0gbF9tYXRjaDtcblx0XHRcdH1cblx0XHRcdC8vIGNsb3NlIHJlbWFpbmluZyBsaXN0c1xuXHRcdFx0Zm9yIChsZXQgaSA9IHByZXYubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdFx0cHMoZignPC8/PicsIHByZXYuY2hhckF0KGkpID09PSAnKicgPyAndWwnIDogcHJldi5jaGFyQXQoaSkgPT09ICcjJyA/ICdvbCcgOiAnZGwnKSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBwYXJzZV90YWJsZSA9ICgpID0+IHtcblx0XHRcdGVuZGwoZignPHRhYmxlPicsIGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL157XFx8KCAuKikkLykgPyByWzFdIDogJycpKTtcblx0XHRcdGZvciAoOyByZW1haW4oKTsgKSB7XG5cdFx0XHRcdGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKCd8JykpIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGNoYXJBdFBvaW50KDEpKSB7XG5cdFx0XHRcdFx0XHRjYXNlICd9Jzpcblx0XHRcdFx0XHRcdFx0ZW5kbCgnPC90YWJsZT4nKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0Y2FzZSAnLSc6XG5cdFx0XHRcdFx0XHRcdGVuZGwoZignPHRyPicsIGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL1xcfC0qKC4qKS8pWzFdKSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0cGFyc2VfdGFibGVfZGF0YSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKCchJykpIHtcblx0XHRcdFx0XHRwYXJzZV90YWJsZV9kYXRhKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfdGFibGVfZGF0YSA9ICgpID0+IHtcblx0XHRcdGxldCB0ZF9saW5lO1xuXHRcdFx0bGV0IG1hdGNoX2k7XG5cdFx0XHQvLyAxOiBcInwrXCIsICd8JyBvciAnKydcblx0XHRcdC8vIDI6ID8/XG5cdFx0XHQvLyAzOiBhdHRyaWJ1dGVzID8/XG5cdFx0XHQvLyBUT0RPOiBmaW5pc2ggY29tbWVudGluZyB0aGlzIHJlZ2V4cFxuXHRcdFx0Y29uc3QgdGRfbWF0Y2ggPSBzaCgpLm1hdGNoKC9eKFxcfFxcK3xcXHx8ISkoKD86KFteW3xdKj8pXFx8KD8hXFx8KSk/KC4qKSkkLyk7XG5cdFx0XHRpZiAodGRfbWF0Y2hbMV0gPT09ICd8KycpIHtcblx0XHRcdFx0cHMoJzxjYXB0aW9uJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcyhgPHQke3RkX21hdGNoWzFdID09PSAnfCcgPyAnZCcgOiAnaCd9YCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGRfbWF0Y2hbM10pIHtcblx0XHRcdFx0Ly8gcHMoJyAnICsgdGRfbWF0Y2hbM10pXG5cdFx0XHRcdG1hdGNoX2kgPSA0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2hfaSA9IDI7XG5cdFx0XHR9XG5cdFx0XHRwcygnPicpO1xuXHRcdFx0aWYgKHRkX21hdGNoWzFdID09PSAnfCsnKSB7XG5cdFx0XHRcdHBzKHBhcnNlX2lubGluZV9ub3dpa2kodGRfbWF0Y2hbbWF0Y2hfaV0pKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHVzZSB8fCBvciAhISBhcyBhIGNlbGwgc2VwYXJhdG9yIGRlcGVuZGluZyBvbiBjb250ZXh0XG5cdFx0XHRcdC8vIE5PVEU6IHdoZW4gc3BsaXQoKSBpcyBwYXNzZWQgYSByZWdleHAgbWFrZSBzdXJlIHRvIHVzZSBub24tY2FwdHVyaW5nIGJyYWNrZXRzXG5cdFx0XHRcdHRkX2xpbmUgPSB0ZF9tYXRjaFttYXRjaF9pXS5zcGxpdCh0ZF9tYXRjaFsxXSA9PT0gJ3wnID8gJ3x8JyA6IC9cXHxcXHx8ISEvKTtcblx0XHRcdFx0cHMocGFyc2VfaW5saW5lX25vd2lraSh0ZF9saW5lLnNoaWZ0KCkpKTtcblx0XHRcdFx0d2hpbGUgKHRkX2xpbmUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGxsLnVuc2hpZnQodGRfbWF0Y2hbMV0gKyB0ZF9saW5lLnBvcCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV0IHRjID0gMDtcblx0XHRcdGNvbnN0IHRkID0gW107XG5cdFx0XHR3aGlsZSAocmVtYWluKCkpIHtcblx0XHRcdFx0dGQucHVzaChzaCgpKTtcblx0XHRcdFx0aWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJ3wnKSkge1xuXHRcdFx0XHRcdGlmICghdGMpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY2hhckF0UG9pbnQoMSkgPT09ICd9Jykge1xuXHRcdFx0XHRcdFx0Ly8gd2UncmUgYXQgdGhlIG91dGVyLW1vc3QgbGV2ZWwgKG5vIG5lc3RlZCB0YWJsZXMpLCBza2lwIHRvIHRkIHBhcnNlXG5cdFx0XHRcdFx0XHR0Yy0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICghdGMgJiYgY29tcGFyZUxpbmVTdHJpbmdPclJlZygnIScpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygne3wnKSkge1xuXHRcdFx0XHRcdHRjKys7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0ZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHBzKEluc3RhLmNvbnZlcnQodGQpKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX3ByZSA9ICgpID0+IHtcblx0XHRcdHBzKCc8cHJlPicpO1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHRlbmRsKGAke3BhcnNlX2lubGluZV9ub3dpa2kobGxbMF0uc2xpY2UoMSkpfVxcbmApO1xuXHRcdFx0fSB3aGlsZSAocmVtYWluKCkgJiYgY29tcGFyZUxpbmVTdHJpbmdPclJlZygnICcpKTtcblx0XHRcdHBzKCc8L3ByZT4nKTtcblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX2Jsb2NrX2ltYWdlID0gKCkgPT4ge1xuXHRcdFx0cHMocGFyc2VfaW1hZ2Uoc2goKSkpO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfaW1hZ2UgPSAoc3RyKSA9PiB7XG5cdFx0XHQvLyBnZXQgd2hhdCdzIGluIGJldHdlZW4gXCJbW0ltYWdlOlwiIGFuZCBcIl1dXCJcblx0XHRcdGxldCB0YWcgPSBzdHIuc3Vic3RyaW5nKHN0ci5pbmRleE9mKCc6JykgKyAxLCBzdHIubGVuZ3RoIC0gMik7XG5cdFx0XHRsZXQgd2lkdGg7XG5cdFx0XHRsZXQgYXR0ciA9IFtdO1xuXHRcdFx0bGV0IGZpbGVuYW1lO1xuXHRcdFx0bGV0IGNhcHRpb24gPSAnJztcblx0XHRcdGxldCB0aHVtYiA9IDA7XG5cdFx0XHRsZXQgZnJhbWUgPSAwO1xuXHRcdFx0bGV0IGNlbnRlciA9IDA7XG5cdFx0XHRsZXQgYWxpZ24gPSAnJztcblx0XHRcdGlmICgvXFx8Ly50ZXN0KHRhZykpIHtcblx0XHRcdFx0Ly8gbWFuYWdlIG5lc3RlZCBsaW5rc1xuXHRcdFx0XHRsZXQgbmVzdGluZyA9IDA7XG5cdFx0XHRcdGxldCBsYXN0X2F0dHI7XG5cdFx0XHRcdGZvciAobGV0IGkgPSB0YWcubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0XHRcdGlmICh0YWcuY2hhckF0KGkpID09PSAnfCcgJiYgIW5lc3RpbmcpIHtcblx0XHRcdFx0XHRcdGxhc3RfYXR0ciA9IHRhZy5zbGljZShpICsgMSk7XG5cdFx0XHRcdFx0XHR0YWcgPSB0YWcuc2xpY2UoMCwgTWF0aC5tYXgoMCwgaSkpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAodGFnLnNsaWNlKGkgLSAxLCBpIC0gMSArIDIpKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ11dJzpcblx0XHRcdFx0XHRcdFx0XHRuZXN0aW5nKys7XG5cdFx0XHRcdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdbWyc6XG5cdFx0XHRcdFx0XHRcdFx0bmVzdGluZy0tO1xuXHRcdFx0XHRcdFx0XHRcdGktLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YXR0ciA9IHRhZy5zcGxpdCgvXFxzKlxcfFxccyovKTtcblx0XHRcdFx0YXR0ci5wdXNoKGxhc3RfYXR0cik7XG5cdFx0XHRcdGZpbGVuYW1lID0gYXR0ci5zaGlmdCgpO1xuXHRcdFx0XHRsZXQgd19tYXRjaDtcblx0XHRcdFx0Zm9yICg7IGF0dHIubGVuZ3RoID4gMDsgYXR0ci5zaGlmdCgpKSB7XG5cdFx0XHRcdFx0d19tYXRjaCA9IGF0dHJbMF0ubWF0Y2goL14oXFxkKikoPzpbcHhdKlxcZCopP3B4JC8pO1xuXHRcdFx0XHRcdGlmICh3X21hdGNoKSB7XG5cdFx0XHRcdFx0XHRbLCB3aWR0aF0gPSB3X21hdGNoO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKGF0dHJbMF0pIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSAndGh1bWInOlxuXHRcdFx0XHRcdFx0XHRjYXNlICd0aHVtYm5haWwnOlxuXHRcdFx0XHRcdFx0XHRcdHRodW1iID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRmcmFtZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2ZyYW1lJzpcblx0XHRcdFx0XHRcdFx0XHRmcmFtZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ25vbmUnOlxuXHRcdFx0XHRcdFx0XHRjYXNlICdyaWdodCc6XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2xlZnQnOlxuXHRcdFx0XHRcdFx0XHRcdGNlbnRlciA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFthbGlnbl0gPSBhdHRyO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdjZW50ZXInOlxuXHRcdFx0XHRcdFx0XHRcdGNlbnRlciA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0YWxpZ24gPSAnbm9uZSc7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHIubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRbY2FwdGlvbl0gPSBhdHRyO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZpbGVuYW1lID0gdGFnO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfaW5saW5lX25vd2lraSA9IChzdHIpID0+IHtcblx0XHRcdGxldCBzdGFydDtcblx0XHRcdGxldCBsYXN0ZW5kID0gMDtcblx0XHRcdGxldCBzdWJzdGFydCA9IDA7XG5cdFx0XHRsZXQgbmVzdGxldiA9IDA7XG5cdFx0XHRsZXQgb3Blbjtcblx0XHRcdGxldCBjbG9zZTtcblx0XHRcdGxldCBzdWJsb29wO1xuXHRcdFx0bGV0IGh0bWwgPSAnJztcblx0XHRcdHdoaWxlICgoc3RhcnQgPSBzdHIuaW5kZXhPZignPG5vJy5jb25jYXQoJ3dpa2knLCAnPicpLCBzdWJzdGFydCkpICE9PSAtMSkge1xuXHRcdFx0XHRodG1sICs9IHBhcnNlX2lubGluZV93aWtpKHN0ci5zdWJzdHJpbmcobGFzdGVuZCwgc3RhcnQpKTtcblx0XHRcdFx0c3RhcnQgKz0gODtcblx0XHRcdFx0c3Vic3RhcnQgPSBzdGFydDtcblx0XHRcdFx0c3VibG9vcCA9IHRydWU7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRvcGVuID0gc3RyLmluZGV4T2YoJzxubycuY29uY2F0KCd3aWtpJywgJz4nKSwgc3Vic3RhcnQpO1xuXHRcdFx0XHRcdGNsb3NlID0gc3RyLmluZGV4T2YoJzwvbm8nLmNvbmNhdCgnd2lraScsICc+JyksIHN1YnN0YXJ0KTtcblx0XHRcdFx0XHRpZiAoY2xvc2UgPD0gb3BlbiB8fCBvcGVuID09PSAtMSkge1xuXHRcdFx0XHRcdFx0aWYgKGNsb3NlID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaHRtbCArIGh0bWxfZW50aXRpZXMoc3RyLnNsaWNlKHN0YXJ0KSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzdWJzdGFydCA9IGNsb3NlICsgOTtcblx0XHRcdFx0XHRcdGlmIChuZXN0bGV2KSB7XG5cdFx0XHRcdFx0XHRcdG5lc3RsZXYtLTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGxhc3RlbmQgPSBzdWJzdGFydDtcblx0XHRcdFx0XHRcdFx0aHRtbCArPSBodG1sX2VudGl0aWVzKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGxhc3RlbmQgLSA5KSk7XG5cdFx0XHRcdFx0XHRcdHN1Ymxvb3AgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3Vic3RhcnQgPSBvcGVuICsgODtcblx0XHRcdFx0XHRcdG5lc3RsZXYrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKHN1Ymxvb3ApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGh0bWwgKyBwYXJzZV9pbmxpbmVfd2lraShzdHIuc2xpY2UobGFzdGVuZCkpO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfaW5saW5lX2ltYWdlcyA9IChzdHIpID0+IHtcblx0XHRcdGxldCBzdGFydDtcblx0XHRcdGxldCBzdWJzdGFydCA9IDA7XG5cdFx0XHRsZXQgbmVzdGxldiA9IDA7XG5cdFx0XHRsZXQgbG9vcDtcblx0XHRcdGxldCBjbG9zZTtcblx0XHRcdGxldCBvcGVuO1xuXHRcdFx0bGV0IHdpa2k7XG5cdFx0XHRsZXQgaHRtbDtcblx0XHRcdHdoaWxlICgoc3RhcnQgPSBzdHIuaW5kZXhPZignW1snLCBzdWJzdGFydCkpICE9PSAtMSkge1xuXHRcdFx0XHRpZiAobmV3IFJlZ0V4cChgXihJbWFnZXxGaWxlfCR7SW5zdGEuY29uZi5sb2NhbGUuaW1hZ2V9KTpgLCAnaScpLnRlc3Qoc3RyLnNsaWNlKHN0YXJ0ICsgMikpKSB7XG5cdFx0XHRcdFx0bG9vcCA9IHRydWU7XG5cdFx0XHRcdFx0c3Vic3RhcnQgPSBzdGFydDtcblx0XHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0XHRzdWJzdGFydCArPSAyO1xuXHRcdFx0XHRcdFx0Y2xvc2UgPSBzdHIuaW5kZXhPZignXV0nLCBzdWJzdGFydCk7XG5cdFx0XHRcdFx0XHRvcGVuID0gc3RyLmluZGV4T2YoJ1tbJywgc3Vic3RhcnQpO1xuXHRcdFx0XHRcdFx0aWYgKGNsb3NlIDw9IG9wZW4gfHwgb3BlbiA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGNsb3NlID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBzdHI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0c3Vic3RhcnQgPSBjbG9zZTtcblx0XHRcdFx0XHRcdFx0aWYgKG5lc3RsZXYpIHtcblx0XHRcdFx0XHRcdFx0XHRuZXN0bGV2LS07XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lraSA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGNsb3NlICsgMik7XG5cdFx0XHRcdFx0XHRcdFx0aHRtbCA9IHBhcnNlX2ltYWdlKHdpa2kpO1xuXHRcdFx0XHRcdFx0XHRcdHN0ciA9IHN0ci5yZXBsYWNlKHdpa2ksIGh0bWwpO1xuXHRcdFx0XHRcdFx0XHRcdHN1YnN0YXJ0ID0gc3RhcnQgKyBodG1sLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRsb29wID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN1YnN0YXJ0ID0gb3Blbjtcblx0XHRcdFx0XHRcdFx0bmVzdGxldisrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gd2hpbGUgKGxvb3ApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3RyO1xuXHRcdH07XG5cdFx0Ly8gdGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVzcGVjdCB0aGUgRklMTyBzdHJ1Y3R1cmUgb2YgSFRNTFxuXHRcdC8vIGJ1dCBzaW5jZSBtb3N0IGJyb3dzZXJzIGNhbiBoYW5kbGUgaXQgSSdsbCBzYXZlIG15c2VsZiB0aGUgaGFzc2xlXG5cdFx0Y29uc3QgcGFyc2VfaW5saW5lX2Zvcm1hdHRpbmcgPSAoc3RyKSA9PiB7XG5cdFx0XHRsZXQgZW07XG5cdFx0XHRsZXQgc3Q7XG5cdFx0XHRsZXQgaTtcblx0XHRcdGxldCBsaTtcblx0XHRcdGxldCBvID0gJyc7XG5cdFx0XHR3aGlsZSAoKGkgPSBzdHIuaW5kZXhPZihcIicnXCIsIGxpKSkgKyAxKSB7XG5cdFx0XHRcdG8gKz0gc3RyLnN1YnN0cmluZyhsaSwgaSk7XG5cdFx0XHRcdGxpID0gaSArIDI7XG5cdFx0XHRcdGlmIChzdHIuY2hhckF0KGkgKyAyKSA9PT0gXCInXCIpIHtcblx0XHRcdFx0XHRsaSsrO1xuXHRcdFx0XHRcdHN0ID0gIXN0O1xuXHRcdFx0XHRcdG8gKz0gc3QgPyAnPHN0cm9uZz4nIDogJzwvc3Ryb25nPic7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZW0gPSAhZW07XG5cdFx0XHRcdFx0byArPSBlbSA/ICc8ZW0+JyA6ICc8L2VtPic7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvICsgc3RyLnNsaWNlKGxpKTtcblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX2lubGluZV93aWtpID0gKHN0cikgPT4ge1xuXHRcdFx0c3RyID0gcGFyc2VfaW5saW5lX2ltYWdlcyhzdHIpO1xuXHRcdFx0c3RyID0gcGFyc2VfaW5saW5lX2Zvcm1hdHRpbmcoc3RyKTtcblx0XHRcdC8vIG1hdGhcblx0XHRcdHN0ciA9IHN0ci5yZXBsYWNlKC88bWF0aD4oLio/KTxcXC9tYXRoPi9naSwgJycpO1xuXHRcdFx0Ly8gQnVpbGQgYSBNZWRpYXdpa2ktZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG5cdFx0XHRsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XG5cdFx0XHRsZXQgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpO1xuXHRcdFx0aWYgKG1pbnV0ZXMgPCAxMCkge1xuXHRcdFx0XHRtaW51dGVzID0gYDAke21pbnV0ZXN9YDtcblx0XHRcdH1cblx0XHRcdGRhdGUgPSBmKFxuXHRcdFx0XHQnPzo/LCA/ID8gPyAoVVRDKScsXG5cdFx0XHRcdGRhdGUuZ2V0VVRDSG91cnMoKSxcblx0XHRcdFx0bWludXRlcyxcblx0XHRcdFx0ZGF0ZS5nZXRVVENEYXRlKCksXG5cdFx0XHRcdEluc3RhLmNvbmYubG9jYWxlLm1vbnRoc1tkYXRlLmdldFVUQ01vbnRoKCldLFxuXHRcdFx0XHRkYXRlLmdldFVUQ0Z1bGxZZWFyKClcblx0XHRcdCk7XG5cdFx0XHQvLyB0ZXh0IGZvcm1hdHRpbmdcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHN0clxuXHRcdFx0XHRcdC8vIHNpZ25hdHVyZXNcblx0XHRcdFx0XHQucmVwbGFjZSgvfns1fSg/IX4pL2csIGRhdGUpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL357NH0oPyF+KS9nLCBgJHtJbnN0YS5jb25mLnVzZXIubmFtZX0gJHtkYXRlfWApXG5cdFx0XHRcdFx0LnJlcGxhY2UoL357M30oPyF+KS9nLCBJbnN0YS5jb25mLnVzZXIubmFtZSlcblx0XHRcdFx0XHQvLyBbWzpDYXRlZ29yeTouLi5dXSwgW1s6SW1hZ2U6Li4uXV0sIGV0Yy4uLlxuXHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0YFxcXFxbXFxcXFs6KCg/OiR7SW5zdGEuY29uZi5sb2NhbGUuY2F0ZWdvcnl9fEltYWdlfEZpbGV8JHtJbnN0YS5jb25mLmxvY2FsZS5pbWFnZX18JHtJbnN0YS5jb25mLndpa2kuaW50ZXJ3aWtpfSk6W158XSo/KVxcXFxdXFxcXF0oXFxcXHcqKWAsXG5cdFx0XHRcdFx0XHRcdCdnaSdcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHQoXyQwLCAkMSwgJDIpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSc/Jz4/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRcdEluc3RhLmNvbmYucGF0aHMuYXJ0aWNsZXMgKyBodG1sZXNjYXBlX2F0dHIoJDEpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMSkgKyBodG1sZXNjYXBlX3RleHQoJDIpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC8vIHJlbW92ZSBzdHJhaWdodCBjYXRlZ29yeSBhbmQgaW50ZXJ3aWtpIHRhZ3Ncblx0XHRcdFx0XHQucmVwbGFjZShcblx0XHRcdFx0XHRcdG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRcdGBcXFxcW1xcXFxbKD86JHtJbnN0YS5jb25mLmxvY2FsZS5jYXRlZ29yeX18JHtJbnN0YS5jb25mLndpa2kuaW50ZXJ3aWtpfSk6Lio/XFxcXF1cXFxcXWAsXG5cdFx0XHRcdFx0XHRcdCdnaSdcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHQnJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQvLyBbWzpDYXRlZ29yeTouLi58TGlua3NdXSwgW1s6SW1hZ2U6Li4ufExpbmtzXV0sIGV0Yy4uLlxuXHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0YFxcXFxbXFxcXFs6KCg/OiR7SW5zdGEuY29uZi5sb2NhbGUuY2F0ZWdvcnl9fEltYWdlfEZpbGV8JHtJbnN0YS5jb25mLmxvY2FsZS5pbWFnZX18JHtJbnN0YS5jb25mLndpa2kuaW50ZXJ3aWtpfSk6Lio/KVxcXFx8KFteXFxcXF1dKz8pXFxcXF1cXFxcXShcXFxcdyopYCxcblx0XHRcdFx0XHRcdFx0J2dpJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdChfJDAsICQxLCAkMiwgJDMpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSc/Jz4/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRcdEluc3RhLmNvbmYucGF0aHMuYXJ0aWNsZXMgKyBodG1sZXNjYXBlX2F0dHIoJDEpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMikgKyBodG1sZXNjYXBlX3RleHQoJDMpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC8vIFtbL1JlbGF0aXZlIGxpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFxcL1tefF0qPyldXS9nLCAoXyQwLCAkMSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXCI8YSBocmVmPSc/Jz4/PC9hPlwiLCBJbnN0YS5jb25mLmJhc2VVcmwgKyBodG1sZXNjYXBlX2F0dHIoJDEpLCBodG1sZXNjYXBlX3RleHQoJDEpKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC8vIFtbL1JlcGxhY2VkfFJlbGF0aXZlIGxpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFxcLy4qPylcXHwoLis/KV1dL2csIChfJDAsICQxLCAkMikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXCI8YSBocmVmPSc/Jz4/PC9hPlwiLCBJbnN0YS5jb25mLmJhc2VVcmwgKyBodG1sZXNjYXBlX2F0dHIoJDEpLCBodG1sZXNjYXBlX3RleHQoJDIpKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC8vIFtbQ29tbW9uIGxpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFteW3xdKj8pXV0oXFx3KikvZywgKF8kMCwgJDEsICQyKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSc/Jz4/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzICsgaHRtbGVzY2FwZV9hdHRyKCQxKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQxKSArIGh0bWxlc2NhcGVfdGV4dCgkMilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQvLyBbW1JlcGxhY2VkfExpbmtzXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFteW10qPylcXHwoW15cXF1dKz8pXV0oXFx3KikvZywgKF8kMCwgJDEsICQyLCAkMykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFwiPGEgaHJlZj0nPyc+PzwvYT5cIixcblx0XHRcdFx0XHRcdFx0SW5zdGEuY29uZi5wYXRocy5hcnRpY2xlcyArIGh0bWxlc2NhcGVfYXR0cigkMSksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMikgKyBodG1sZXNjYXBlX3RleHQoJDMpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Ly8gW1tTdHJpcHBlZDpOYW1lc3BhY2V8TmFtZXNwYWNlXV1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbXFxbKFteXFxdXSo/Oik/KC4qPykoICpcXCguKj9cXCkpP1xcfF1dL2csIChfJDAsICQxLCAkMiwgJDMpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmKFxuXHRcdFx0XHRcdFx0XHRcIjxhIGhyZWY9Jz8nPj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdEluc3RhLmNvbmYucGF0aHMuYXJ0aWNsZXMgKyBodG1sZXNjYXBlX2F0dHIoJDEpICsgaHRtbGVzY2FwZV9hdHRyKCQyKSArIGh0bWxlc2NhcGVfYXR0cigkMyksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQvLyBFeHRlcm5hbCBsaW5rc1xuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFsoaHR0cHM/fG5ld3N8ZnRwfG1haWx0b3xnb3BoZXJ8aXJjKTooXFwvKikoW15cXF1dKj8pICguKj8pXS9nLCAoXyQwLCAkMSwgJDIsICQzLCAkNCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFwiPGEgY2xhc3M9J2V4dGVybmFsJyBocmVmPSc/Oj8nPj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfYXR0cigkMSksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfYXR0cigkMikgKyBodG1sZXNjYXBlX2F0dHIoJDMpLFxuXHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX3RleHQoJDQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnJlcGxhY2UoL1xcW2h0dHA6XFwvXFwvKC4qPyldL2csIChfJDAsICQxKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcIjxhIGNsYXNzPSdleHRlcm5hbCcgaHJlZj0naHR0cDovLz8nPlsjXTwvYT5cIiwgaHRtbGVzY2FwZV9hdHRyKCQxKSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbKG5ld3N8ZnRwfG1haWx0b3xnb3BoZXJ8aXJjKTooXFwvKikoLio/KV0vZywgKF8kMCwgJDEsICQyLCAkMykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFwiPGEgY2xhc3M9J2V4dGVybmFsJyBocmVmPSc/Oj8nPj86PzwvYT5cIixcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQxKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQyKSArIGh0bWxlc2NhcGVfYXR0cigkMyksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMSksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMikgKyBodG1sZXNjYXBlX3RleHQoJDMpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnJlcGxhY2UoXG5cdFx0XHRcdFx0XHQvKF58ICkoaHR0cHM/fG5ld3N8ZnRwfG1haWx0b3xnb3BoZXJ8aXJjKTooXFwvKikoW14gJF0qW14gISQsLjo7P10pL2csXG5cdFx0XHRcdFx0XHQoXyQwLCAkMSwgJDIsICQzLCAkNCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XHRcIj88YSBjbGFzcz0nZXh0ZXJuYWwnIGhyZWY9Jz86Pyc+Pzo/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMSksXG5cdFx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQyKSxcblx0XHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX2F0dHIoJDMpICsgaHRtbGVzY2FwZV9hdHRyKCQ0KSxcblx0XHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX3RleHQoJDIpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMykgKyBodG1sZXNjYXBlX3RleHQoJDQpXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5yZXBsYWNlKCdfX05PVE9DX18nLCAnJylcblx0XHRcdFx0XHQucmVwbGFjZSgnX19OT0lOREVYX18nLCAnJylcblx0XHRcdFx0XHQucmVwbGFjZSgnX19JTkRFWF9fJywgJycpXG5cdFx0XHRcdFx0LnJlcGxhY2UoJ19fTk9FRElUU0VDVElPTl9fJywgJycpXG5cdFx0XHQpO1xuXHRcdH07XG5cdFx0Ly8gYmVnaW4gcGFyc2luZ1xuXHRcdGZvciAoOyByZW1haW4oKTsgKSB7XG5cdFx0XHRpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXig9ezEsNn0pKC4qKVxcMSguKikkLykpIHtcblx0XHRcdFx0cCA9IDA7XG5cdFx0XHRcdGVuZGwoZignPGg/Pj88L2g/Pj8nLCByWzFdLmxlbmd0aCwgcGFyc2VfaW5saW5lX25vd2lraShyWzJdKSwgclsxXS5sZW5ndGgsIHJbM10pKTtcblx0XHRcdH0gZWxzZSBpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXlsjKjo7XS8pKSB7XG5cdFx0XHRcdHAgPSAwO1xuXHRcdFx0XHRwYXJzZV9saXN0KCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJyAnKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0cGFyc2VfcHJlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJ3t8JykpIHtcblx0XHRcdFx0cCA9IDA7XG5cdFx0XHRcdHBhcnNlX3RhYmxlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoL14tLS0tKyQvKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0ZW5kbCgnPGhyPicpO1xuXHRcdFx0fSBlbHNlIGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKEluc3RhLkJMT0NLX0lNQUdFKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0cGFyc2VfYmxvY2tfaW1hZ2UoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGhhbmRsZSBwYXJhZ3JhcGhzXG5cdFx0XHRcdGlmIChjb21wYXJlTGluZVN0cmluZygnJykpIHtcblx0XHRcdFx0XHRwID0gcmVtYWluKCkgPiAxICYmIGxsWzFdID09PSAnJztcblx0XHRcdFx0XHRpZiAocCkge1xuXHRcdFx0XHRcdFx0ZW5kbCgnPHA+PGJyPicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoIXApIHtcblx0XHRcdFx0XHRcdHBzKCc8cD4nKTtcblx0XHRcdFx0XHRcdHAgPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwcyhgJHtwYXJzZV9pbmxpbmVfbm93aWtpKGxsWzBdKX0gYCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2goKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG87XG5cdH07XG5cdGNvbnN0IHdpa2kyaHRtbCA9ICh0eHQsIGJhc2V1cmwpID0+IHtcblx0XHRJbnN0YS5jb25mLmJhc2VVcmwgPSBiYXNldXJsO1xuXHRcdHJldHVybiBJbnN0YS5jb252ZXJ0KHR4dCk7XG5cdH07XG5cdC8vIEVOREZJTEU6IGxpdmVwcmV2aWV3LmpzXG5cdC8vIFNUQVJURklMRTogcGFnZWluZm8uanNcblx0Y29uc3QgcG9wdXBGaWx0ZXJQYWdlU2l6ZSA9IChkYXRhKSA9PiB7XG5cdFx0cmV0dXJuIGZvcm1hdEJ5dGVzKGRhdGEubGVuZ3RoKTtcblx0fTtcblx0Y29uc3QgcG9wdXBGaWx0ZXJDb3VudExpbmtzID0gKGRhdGEpID0+IHtcblx0XHRjb25zdCBudW0gPSBjb3VudExpbmtzKGRhdGEpO1xuXHRcdHJldHVybiBgJHtTdHJpbmcobnVtKX0mbmJzcDske251bSA9PT0gMSA/IHBvcHVwU3RyaW5nKCd3aWtpTGluaycpIDogcG9wdXBTdHJpbmcoJ3dpa2lMaW5rcycpfWA7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyQ291bnRJbWFnZXMgPSAoZGF0YSkgPT4ge1xuXHRcdGNvbnN0IG51bSA9IGNvdW50SW1hZ2VzKGRhdGEpO1xuXHRcdHJldHVybiBgJHtTdHJpbmcobnVtKX0mbmJzcDske251bSA9PT0gMSA/IHBvcHVwU3RyaW5nKCdpbWFnZScpIDogcG9wdXBTdHJpbmcoJ2ltYWdlcycpfWA7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyQ291bnRDYXRlZ29yaWVzID0gKGRhdGEpID0+IHtcblx0XHRjb25zdCBudW0gPSBjb3VudENhdGVnb3JpZXMoZGF0YSk7XG5cdFx0cmV0dXJuIGAke1N0cmluZyhudW0pfSZuYnNwOyR7bnVtID09PSAxID8gcG9wdXBTdHJpbmcoJ2NhdGVnb3J5JykgOiBwb3B1cFN0cmluZygnY2F0ZWdvcmllcycpfWA7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyTGFzdE1vZGlmaWVkID0gKF9kYXRhLCBkb3dubG9hZCkgPT4ge1xuXHRcdGNvbnN0IGxhc3Rtb2QgPSBkb3dubG9hZC5sYXN0TW9kaWZpZWQ7XG5cdFx0Y29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblx0XHRjb25zdCBhZ2UgPSBub3cgLSBsYXN0bW9kO1xuXHRcdGlmIChsYXN0bW9kICYmIGdldFZhbHVlT2YoJ3BvcHVwTGFzdE1vZGlmaWVkJykpIHtcblx0XHRcdHJldHVybiB0cHJpbnRmKCclcyBvbGQnLCBbZm9ybWF0QWdlKGFnZSldKS5yZXBsYWNlKC8gL2csICcmbmJzcDsnKTtcblx0XHR9XG5cdFx0cmV0dXJuICcnO1xuXHR9O1xuXHRjb25zdCBmb3JtYXRBZ2UgPSAoYWdlKSA9PiB7XG5cdFx0Ly8gY29lcmNlIGludG8gYSBudW1iZXJcblx0XHRsZXQgYSA9IDAgKyBhZ2U7XG5cdFx0Y29uc3QgYWEgPSBhO1xuXHRcdGNvbnN0IHNlY2xlbiA9IDEwMDA7XG5cdFx0Y29uc3QgbWlubGVuID0gNjAgKiBzZWNsZW47XG5cdFx0Y29uc3QgaG91cmxlbiA9IDYwICogbWlubGVuO1xuXHRcdGNvbnN0IGRheWxlbiA9IDI0ICogaG91cmxlbjtcblx0XHRjb25zdCB3ZWVrbGVuID0gNyAqIGRheWxlbjtcblx0XHRjb25zdCBudW13ZWVrcyA9IChhIC0gKGEgJSB3ZWVrbGVuKSkgLyB3ZWVrbGVuO1xuXHRcdGEgLT0gbnVtd2Vla3MgKiB3ZWVrbGVuO1xuXHRcdGNvbnN0IHN3ZWVrcyA9IGFkZHVuaXQobnVtd2Vla3MsICd3ZWVrJyk7XG5cdFx0Y29uc3QgbnVtZGF5cyA9IChhIC0gKGEgJSBkYXlsZW4pKSAvIGRheWxlbjtcblx0XHRhIC09IG51bWRheXMgKiBkYXlsZW47XG5cdFx0Y29uc3Qgc2RheXMgPSBhZGR1bml0KG51bWRheXMsICdkYXknKTtcblx0XHRjb25zdCBudW1ob3VycyA9IChhIC0gKGEgJSBob3VybGVuKSkgLyBob3VybGVuO1xuXHRcdGEgLT0gbnVtaG91cnMgKiBob3VybGVuO1xuXHRcdGNvbnN0IHNob3VycyA9IGFkZHVuaXQobnVtaG91cnMsICdob3VyJyk7XG5cdFx0Y29uc3QgbnVtbWlucyA9IChhIC0gKGEgJSBtaW5sZW4pKSAvIG1pbmxlbjtcblx0XHRhIC09IG51bW1pbnMgKiBtaW5sZW47XG5cdFx0Y29uc3Qgc21pbnMgPSBhZGR1bml0KG51bW1pbnMsICdtaW51dGUnKTtcblx0XHRjb25zdCBudW1zZWNzID0gKGEgLSAoYSAlIHNlY2xlbikpIC8gc2VjbGVuO1xuXHRcdGEgLT0gbnVtc2VjcyAqIHNlY2xlbjtcblx0XHRjb25zdCBzc2VjcyA9IGFkZHVuaXQobnVtc2VjcywgJ3NlY29uZCcpO1xuXHRcdGlmIChhYSA+IDQgKiB3ZWVrbGVuKSB7XG5cdFx0XHRyZXR1cm4gc3dlZWtzO1xuXHRcdH1cblx0XHRpZiAoYWEgPiB3ZWVrbGVuKSB7XG5cdFx0XHRyZXR1cm4gYCR7c3dlZWtzfSAke3NkYXlzfWA7XG5cdFx0fVxuXHRcdGlmIChhYSA+IGRheWxlbikge1xuXHRcdFx0cmV0dXJuIGAke3NkYXlzfSAke3Nob3Vyc31gO1xuXHRcdH1cblx0XHRpZiAoYWEgPiA2ICogaG91cmxlbikge1xuXHRcdFx0cmV0dXJuIHNob3Vycztcblx0XHR9XG5cdFx0aWYgKGFhID4gaG91cmxlbikge1xuXHRcdFx0cmV0dXJuIGAke3Nob3Vyc30gJHtzbWluc31gO1xuXHRcdH1cblx0XHRpZiAoYWEgPiAxMCAqIG1pbmxlbikge1xuXHRcdFx0cmV0dXJuIHNtaW5zO1xuXHRcdH1cblx0XHRpZiAoYWEgPiBtaW5sZW4pIHtcblx0XHRcdHJldHVybiBgJHtzbWluc30gJHtzc2Vjc31gO1xuXHRcdH1cblx0XHRyZXR1cm4gc3NlY3M7XG5cdH07XG5cdGNvbnN0IGFkZHVuaXQgPSAobnVtLCBzdHIpID0+IHtcblx0XHRyZXR1cm4gYCR7bnVtfSAke251bSA9PT0gMSA/IHBvcHVwU3RyaW5nKHN0cikgOiBwb3B1cFN0cmluZyhgJHtzdHJ9c2ApfWA7XG5cdH07XG5cdGNvbnN0IHJ1blBvcHVwRmlsdGVycyA9IChsaXN0LCBkYXRhLCBkb3dubG9hZCkgPT4ge1xuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBsaXN0KSB7XG5cdFx0XHRpZiAoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjb25zdCBzID0gZWxlbWVudChkYXRhLCBkb3dubG9hZCwgZG93bmxvYWQub3duZXIuYXJ0aWNsZSk7XG5cdFx0XHRcdGlmIChzKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2gocyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgZ2V0UGFnZUluZm8gPSAoZGF0YSwgZG93bmxvYWQpID0+IHtcblx0XHRpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBwb3B1cFN0cmluZygnRW1wdHkgcGFnZScpO1xuXHRcdH1cblx0XHRjb25zdCBwb3B1cEZpbHRlcnMgPSBnZXRWYWx1ZU9mKCdwb3B1cEZpbHRlcnMnKSB8fCBbXTtcblx0XHRjb25zdCBleHRyYVBvcHVwRmlsdGVycyA9IGdldFZhbHVlT2YoJ2V4dHJhUG9wdXBGaWx0ZXJzJykgfHwgW107XG5cdFx0Y29uc3QgcGFnZUluZm9BcnJheSA9IHJ1blBvcHVwRmlsdGVycyhbLi4ucG9wdXBGaWx0ZXJzLCAuLi5leHRyYVBvcHVwRmlsdGVyc10sIGRhdGEsIGRvd25sb2FkKTtcblx0XHRsZXQgcGFnZUluZm8gPSBwYWdlSW5mb0FycmF5LmpvaW4oJywgJyk7XG5cdFx0aWYgKHBhZ2VJbmZvICE9PSAnJykge1xuXHRcdFx0cGFnZUluZm8gPSB1cGNhc2VGaXJzdChwYWdlSW5mbyk7XG5cdFx0fVxuXHRcdHJldHVybiBwYWdlSW5mbztcblx0fTtcblx0Ly8gdGhpcyBjb3VsZCBiZSBpbXByb3ZlZCFcblx0Y29uc3QgY291bnRMaW5rcyA9ICh3aWtpVGV4dCkgPT4ge1xuXHRcdHJldHVybiB3aWtpVGV4dC5zcGxpdCgnW1snKS5sZW5ndGggLSAxO1xuXHR9O1xuXHQvLyBpZiBOID0gIyBtYXRjaGVzLCBuID0gIyBicmFja2V0cywgdGhlblxuXHQvLyBTdHJpbmcuc3BsaXQocmVnZXgpIGludGVyc3BlcnNlcyB0aGUgTisxIHNwbGl0IGVsZW1lbnRzXG5cdC8vIHdpdGggTm4gb3RoZXIgZWxlbWVudHMuIFNvIHRvdGFsIGxlbmd0aCBpc1xuXHQvLyBMPSBOKzEgKyBObiA9IE4obisxKSsxLiBTbyBOPShMLTEpLyhuKzEpLlxuXHRjb25zdCBjb3VudEltYWdlcyA9ICh3aWtpVGV4dCkgPT4ge1xuXHRcdHJldHVybiAod2lraVRleHQuc3BsaXQocGcucmUuaW1hZ2UpLmxlbmd0aCAtIDEpIC8gKHBnLnJlLmltYWdlQnJhY2tldENvdW50ICsgMSk7XG5cdH07XG5cdGNvbnN0IGNvdW50Q2F0ZWdvcmllcyA9ICh3aWtpVGV4dCkgPT4ge1xuXHRcdHJldHVybiAod2lraVRleHQuc3BsaXQocGcucmUuY2F0ZWdvcnkpLmxlbmd0aCAtIDEpIC8gKHBnLnJlLmNhdGVnb3J5QnJhY2tldENvdW50ICsgMSk7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyU3R1YkRldGVjdCA9IChkYXRhLCBfZG93bmxvYWQsIGFydGljbGUpID0+IHtcblx0XHRjb25zdCBjb3VudHMgPSBzdHViQ291bnQoZGF0YSwgYXJ0aWNsZSk7XG5cdFx0aWYgKGNvdW50cy5yZWFsKSB7XG5cdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ3N0dWInKTtcblx0XHR9XG5cdFx0aWYgKGNvdW50cy5zZWN0KSB7XG5cdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ3NlY3Rpb24gc3R1YicpO1xuXHRcdH1cblx0XHRyZXR1cm4gJyc7XG5cdH07XG5cdGNvbnN0IHBvcHVwRmlsdGVyRGlzYW1iaWdEZXRlY3QgPSAoZGF0YSwgX2Rvd25sb2FkLCBhcnRpY2xlKSA9PiB7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cEFsbERhYnNTdHVicycpICYmIGFydGljbGUubmFtZXNwYWNlKCkpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cdFx0cmV0dXJuIGlzRGlzYW1iaWcoZGF0YSwgYXJ0aWNsZSkgPyBwb3B1cFN0cmluZygnZGlzYW1iaWcnKSA6ICcnO1xuXHR9O1xuXHRjb25zdCBmb3JtYXRCeXRlcyA9IChudW0pID0+IHtcblx0XHRyZXR1cm4gbnVtID4gOTQ5ID8gTWF0aC5yb3VuZChudW0gLyAxMDApIC8gMTAgKyBwb3B1cFN0cmluZygna0InKSA6IGAke251bX0mbmJzcDske3BvcHVwU3RyaW5nKCdieXRlcycpfWA7XG5cdH07XG5cdC8vIEVOREZJTEU6IHBhZ2VpbmZvLmpzXG5cdC8vIFNUQVJURklMRTogdGl0bGVzLmpzXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3IERlZmluZXMgdGhlIHtAc291cmNlIFRpdGxlfSBjbGFzcywgYW5kIGFzc29jaWF0ZWQgY3J1ZnR5IGZ1bmN0aW9ucy5cblx0ICpcblx0ICogPGNvZGU+VGl0bGU8L2NvZGU+IGRlYWxzIHdpdGggYXJ0aWNsZSB0aXRsZXMgYW5kIHRoZWlyIHZhcmlvdXNcblx0ICogZm9ybXMuICB7QHNvdXJjZSBTdHJpbmd3cmFwcGVyfSBpcyB0aGUgcGFyZW50IGNsYXNzIG9mXG5cdCAqIDxjb2RlPlRpdGxlPC9jb2RlPiwgd2hpY2ggZXhpc3RzIHNpbXBseSB0byBtYWtlIHRoaW5ncyBhIGxpdHRsZVxuXHQgKiBuZWF0ZXIuXG5cdCAqL1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBTdHJpbmd3cmFwcGVyLlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICpcblx0ICogQGNsYXNzIHRoZSBTdHJpbmd3cmFwcGVyIGNsYXNzLiBUaGlzIGJhc2UgY2xhc3MgaXMgbm90IHJlYWxseVxuXHQgKiB1c2VmdWwgb24gaXRzIG93bjsgaXQganVzdCB3cmFwcyB2YXJpb3VzIGNvbW1vbiBzdHJpbmcgb3BlcmF0aW9ucy5cblx0ICovXG5cdGNvbnN0IFN0cmluZ3dyYXBwZXIgPSBmdW5jdGlvbiBTdHJpbmd3cmFwcGVyKCkge1xuXHRcdC8qKlxuXHRcdCAqIFdyYXBwZXIgZm9yIHRoaXMudG9TdHJpbmcoKS5pbmRleE9mKClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB4XG5cdFx0ICogQHR5cGUgaW50ZWdlclxuXHRcdCAqL1xuXHRcdHRoaXMuaW5kZXhPZiA9IGZ1bmN0aW9uICh4KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLmluZGV4T2YoeCk7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBSZXR1cm5zIHRoaXMudmFsdWUuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHR0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWU7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBXcmFwcGVyIGZvciB7QHNvdXJjZSBTdHJpbmcjcGFyZW5TcGxpdH0gYXBwbGllZCB0byB0aGlzLnRvU3RyaW5nKClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7UmVnRXhwfSB4XG5cdFx0ICogQHR5cGUgQXJyYXlcblx0XHQgKi9cblx0XHR0aGlzLnNwbGl0ID0gZnVuY3Rpb24gKHgpIHtcblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkuc3BsaXQoeCk7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBXcmFwcGVyIGZvciB0aGlzLnRvU3RyaW5nKCkuc3Vic3RyaW5nKClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB4XG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHkgKG9wdGlvbmFsKVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdHRoaXMuc3Vic3RyaW5nID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0XHRcdGlmICh5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMudG9TdHJpbmcoKS5zbGljZShNYXRoLm1heCgwLCB4KSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLnN1YnN0cmluZyh4LCB5KTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIFdyYXBwZXIgZm9yIHRoaXMudG9TdHJpbmcoKS5zcGxpdCgpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30geFxuXHRcdCAqIEB0eXBlIEFycmF5XG5cdFx0ICovXG5cdFx0dGhpcy5zcGxpdCA9IGZ1bmN0aW9uICh4KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLnNwbGl0KHgpO1xuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogV3JhcHBlciBmb3IgdGhpcy50b1N0cmluZygpLnJlcGxhY2UoKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHhcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30geVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdHRoaXMucmVwbGFjZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLnJlcGxhY2UoeCwgeSk7XG5cdFx0fTtcblx0fTtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGl0bGU8L2NvZGU+LlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICpcblx0ICogQGNsYXNzIFRoZSBUaXRsZSBjbGFzcy4gSG9sZHMgYXJ0aWNsZSB0aXRsZXMgYW5kIGNvbnZlcnRzIHRoZW0gaW50b1xuXHQgKiB2YXJpb3VzIGZvcm1zLiBBbHNvIGRlYWxzIHdpdGggYW5jaG9ycywgYnkgd2hpY2ggd2UgbWVhbiB0aGUgYml0c1xuXHQgKiBvZiB0aGUgYXJ0aWNsZSBVUkwgYWZ0ZXIgYSAjIGNoYXJhY3RlciwgcmVwcmVzZW50aW5nIGxvY2F0aW9uc1xuXHQgKiB3aXRoaW4gYW4gYXJ0aWNsZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBpbml0aWFsIHZhbHVlIHRvIGFzc2lnbiB0byB0aGVcblx0ICogYXJ0aWNsZS4gVGhpcyBtdXN0IGJlIHRoZSBjYW5vbmljYWwgdGl0bGUgKHNlZSB7QGxpbmtcblx0ICogVGl0bGUjdmFsdWV9LiBPbWl0IHRoaXMgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB1c2UgYW5vdGhlciBmdW5jdGlvblxuXHQgKiB0byBzZXQgdGhlIHRpdGxlIGlmIHRoaXMgaXMgdW5hdmFpbGFibGUuXG5cdCAqL1xuXHRjbGFzcyBUaXRsZSBleHRlbmRzIFN0cmluZ3dyYXBwZXIge1xuXHRcdGNvbnN0cnVjdG9yKHZhbCkge1xuXHRcdFx0c3VwZXIoKTtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGNhbm9uaWNhbCBhcnRpY2xlIHRpdGxlLiBUaGlzIG11c3QgYmUgaW4gVVRGLTggd2l0aCBub1xuXHRcdFx0ICogZW50aXRpZXMsIGVzY2FwaW5nIG9yIG5hc3RpZXMuIEFsc28sIHVuZGVyc2NvcmVzIHNob3VsZCBiZVxuXHRcdFx0ICogcmVwbGFjZWQgd2l0aCBzcGFjZXMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGNhbm9uaWNhbCBmb3JtIG9mIHRoZSBhbmNob3IuIFRoaXMgc2hvdWxkIGJlIGV4YWN0bHkgYXNcblx0XHRcdCAqIGl0IGFwcGVhcnMgaW4gdGhlIFVSTCwgaS5lLiB3aXRoIHRoZSAuQzMuMEEgYml0cyBpbi5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5hbmNob3IgPSAnJztcblx0XHRcdHRoaXMuc2V0VXRmKHZhbCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXJ0aWNsZSB0aXRsZSwgb3B0aW9uYWxseSB3aXRob3V0IGFuY2hvci5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gb21pdEFuY2hvclxuXHRcdCAqIEBmaXhtZSBEZWNpZGUgc3BlY3MgZm9yIGFuY2hvclxuXHRcdCAqIEByZXR1cm4gU3RyaW5nIFRoZSBhcnRpY2xlIHRpdGxlIGFuZCB0aGUgYW5jaG9yLlxuXHRcdCAqL1xuXHRcdHRvU3RyaW5nKG9taXRBbmNob3IpIHtcblx0XHRcdHJldHVybiB0aGlzLnZhbHVlICsgKCFvbWl0QW5jaG9yICYmIHRoaXMuYW5jaG9yID8gYCMke3RoaXMuYW5jaG9yU3RyaW5nKCl9YCA6ICcnKTtcblx0XHR9XG5cdFx0YW5jaG9yU3RyaW5nKCkge1xuXHRcdFx0aWYgKCF0aGlzLmFuY2hvcikge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzcGxpdCA9IHRoaXMuYW5jaG9yLnNwbGl0KC8oKD86XFwuW1xcZEEtRl17Mn0pKykvKTtcblx0XHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdGZvciAobGV0IGogPSAxOyBqIDwgbGVuOyBqICs9IDIpIHtcblx0XHRcdFx0Ly8gRklYTUUgcy9kZWNvZGVVUkkvZGVjb2RlVVJJQ29tcG9uZW50L2cgP1xuXHRcdFx0XHR2YWx1ZSA9IHNwbGl0W2pdLnNwbGl0KCcuJykuam9pbignJScpO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Ly8gY2Fubm90IGRlY29kZVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNwbGl0W2pdID0gdmFsdWUuc3BsaXQoJ18nKS5qb2luKCcgJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3BsaXQuam9pbignJyk7XG5cdFx0fVxuXHRcdHVybEFuY2hvcigpIHtcblx0XHRcdGNvbnN0IHNwbGl0ID0gdGhpcy5hbmNob3Iuc3BsaXQoJy8oKD86WyVdWzAtOUEtRl17Mn0pKykvJyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBqID0gMTsgaiA8IGxlbjsgaiArPSAyKSB7XG5cdFx0XHRcdHNwbGl0W2pdID0gc3BsaXRbal0uc3BsaXQoJyUnKS5qb2luKCcuJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3BsaXQuam9pbignJyk7XG5cdFx0fVxuXHRcdGFuY2hvckZyb21VdGYoc3RyKSB7XG5cdFx0XHR0aGlzLmFuY2hvciA9IGVuY29kZVVSSUNvbXBvbmVudChzdHIuc3BsaXQoJyAnKS5qb2luKCdfJykpXG5cdFx0XHRcdC5zcGxpdCgnJTNBJylcblx0XHRcdFx0LmpvaW4oJzonKVxuXHRcdFx0XHQuc3BsaXQoXCInXCIpXG5cdFx0XHRcdC5qb2luKCclMjcnKVxuXHRcdFx0XHQuc3BsaXQoJyUnKVxuXHRcdFx0XHQuam9pbignLicpO1xuXHRcdH1cblx0XHRmcm9tVVJMKGgpIHtcblx0XHRcdGlmICh0eXBlb2YgaCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTk9URSA6IHBsYXlpbmcgd2l0aCBkZWNvZGVVUkksIGVuY29kZVVSSSwgZXNjYXBlLCB1bmVzY2FwZSxcblx0XHRcdC8vIHdlIHNlZW0gdG8gYmUgYWJsZSB0byByZXBsaWNhdGUgdGhlIElFIGJvcmtlZCBlbmNvZGluZ1xuXHRcdFx0Ly8gSUUgZG9lc24ndCBkbyB0aGlzIG5ldy1mYW5nbGVkIHV0Zi04IHRoaW5nLlxuXHRcdFx0Ly8gYW5kIGl0J3Mgd29yc2UgdGhhbiB0aGF0LlxuXHRcdFx0Ly8gSUUgc2VlbXMgdG8gdHJlYXQgdGhlIHF1ZXJ5IHN0cmluZyBkaWZmZXJlbnRseSB0byB0aGUgcmVzdCBvZiB0aGUgdXJsXG5cdFx0XHQvLyB0aGUgcXVlcnkgaXMgdHJlYXRlZCBhcyBib25hLWZpZGUgdXRmOCwgYnV0IHRoZSBmaXJzdCBiaXQgb2YgdGhlIHVybCBpcyBwaXNzZWQgYXJvdW5kIHdpdGhcblx0XHRcdC8vIHdlIGZpeCB1cCAmIGZvciBhbGwgYnJvd3NlcnMsIGp1c3QgaW4gY2FzZS5cblx0XHRcdGNvbnN0IHNwbGl0dGVkID0gaC5zcGxpdCgnPycpO1xuXHRcdFx0c3BsaXR0ZWRbMF0gPSBzcGxpdHRlZFswXS5zcGxpdCgnJicpLmpvaW4oJyUyNicpO1xuXHRcdFx0aCA9IHNwbGl0dGVkLmpvaW4oJz8nKTtcblx0XHRcdGNvbnN0IGNvbnRyaWJzID0gcGcucmUuY29udHJpYnMuZXhlYyhoKTtcblx0XHRcdGlmIChjb250cmlicykge1xuXHRcdFx0XHRpZiAoY29udHJpYnNbMV0gPT09ICd0aXRsZT0nKSB7XG5cdFx0XHRcdFx0Y29udHJpYnNbM10gPSBjb250cmlic1szXS5zcGxpdCgnKycpLmpvaW4oJyAnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB1ID0gbmV3IFRpdGxlKGNvbnRyaWJzWzNdKTtcblx0XHRcdFx0dGhpcy5zZXRVdGYoXG5cdFx0XHRcdFx0VGl0bGUuZGVjb2RlTmFzdGllcyhgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1VzZXJJZF19OiR7dS5zdHJpcE5hbWVzcGFjZSgpfWApXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZW1haWwgPSBwZy5yZS5lbWFpbC5leGVjKGgpO1xuXHRcdFx0aWYgKGVtYWlsKSB7XG5cdFx0XHRcdHRoaXMuc2V0VXRmKFxuXHRcdFx0XHRcdFRpdGxlLmRlY29kZU5hc3RpZXMoXG5cdFx0XHRcdFx0XHRgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1VzZXJJZF19OiR7bmV3IFRpdGxlKGVtYWlsWzNdKS5zdHJpcE5hbWVzcGFjZSgpfWBcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYmFja2xpbmtzID0gcGcucmUuYmFja2xpbmtzLmV4ZWMoaCk7XG5cdFx0XHRpZiAoYmFja2xpbmtzKSB7XG5cdFx0XHRcdHRoaXMuc2V0VXRmKFRpdGxlLmRlY29kZU5hc3RpZXMobmV3IFRpdGxlKGJhY2tsaW5rc1szXSkpKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHQvLyBBIGR1bW15IHRpdGxlIG9iamVjdCBmb3IgYSBTcGVjaWFsOkRpZmYgbGluay5cblx0XHRcdGNvbnN0IHNwZWNpYWxkaWZmID0gcGcucmUuc3BlY2lhbGRpZmYuZXhlYyhoKTtcblx0XHRcdGlmIChzcGVjaWFsZGlmZikge1xuXHRcdFx0XHR0aGlzLnNldFV0Zihcblx0XHRcdFx0XHRUaXRsZS5kZWNvZGVOYXN0aWVzKG5ldyBUaXRsZShgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1NwZWNpYWxJZF19OkRpZmZgKSlcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHQvLyBubyBtb3JlIHNwZWNpYWwgY2FzZXMgdG8gY2hlY2sgLS1cblx0XHRcdC8vIGhvcGVmdWxseSBpdCdzIG5vdCBhIGRpc2d1aXNlZCB1c2VyLXJlbGF0ZWQgb3Igc3BlY2lhbGx5IHRyZWF0ZWQgc3BlY2lhbCBwYWdlXG5cdFx0XHQvLyBJbmNsdWRlcyByZWZlcmVuY2VzXG5cdFx0XHRjb25zdCBtID0gcGcucmUubWFpbi5leGVjKGgpO1xuXHRcdFx0aWYgKG0gPT09IG51bGwpIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmcm9tQm90SW50ZXJmYWNlID0gL1xcPyguKyYpP3RpdGxlPS8udGVzdChoKTtcblx0XHRcdFx0aWYgKGZyb21Cb3RJbnRlcmZhY2UpIHtcblx0XHRcdFx0XHRtWzJdID0gbVsyXS5zcGxpdCgnKycpLmpvaW4oJ18nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBleHRyYWN0ZWQgPSBtWzJdICsgKG1bM10gPyBgIyR7bVszXX1gIDogJycpO1xuXHRcdFx0XHRpZiAocGcuZmxhZy5pc1NhZmFyaSAmJiAvJTI1W1xcZEEtRmEtZl17Mn0vLnRlc3QoZXh0cmFjdGVkKSkge1xuXHRcdFx0XHRcdC8vIEZpeCBTYWZhcmkgaXNzdWVcblx0XHRcdFx0XHQvLyBTYWZhcmkgc29tZXRpbWVzIGVuY29kZXMgJSBhcyAlMjUgaW4gVVRGLTggZW5jb2RlZCBzdHJpbmdzIGxpa2UgJUU1JUEzIC0+ICUyNUU1JTI1QTMuXG5cdFx0XHRcdFx0dGhpcy5zZXRVdGYoZGVjb2RlVVJJQ29tcG9uZW50KHVuZXNjYXBlKGV4dHJhY3RlZCkpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnNldFV0ZihUaXRsZS5kZWNvZGVOYXN0aWVzKGV4dHJhY3RlZCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0c3RhdGljIGRlY29kZU5hc3RpZXModHh0KSB7XG5cdFx0XHQvLyBteURlY29kZVVSSSB1c2VzIGRlY29kZUV4dHJhcywgd2hpY2ggcmVtb3ZlcyBfLFxuXHRcdFx0Ly8gdGh1cyBydWluaW5nIGNpdGF0aW9ucyBwcmV2aWV3cywgd2hpY2ggYXJlIGZvcm1hdGVkIGFzIFwiY2l0ZV9ub3RlLTFcIlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bGV0IHJldCA9IGRlY29kZVVSSShUaXRsZS5kZWNvZGVFc2NhcGVzKHR4dCkpO1xuXHRcdFx0XHRyZXQgPSByZXQucmVwbGFjZSgvWyBfXSokLywgJycpO1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHJldHVybiB0eHQ7IC8vIGNhbm5vdCBkZWNvZGVcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gRGVjb2RlIHZhbGlkICUtZW5jb2RpbmdzLCBvdGhlcndpc2UgZXNjYXBlIHRoZW1cblx0XHRzdGF0aWMgZGVjb2RlRXNjYXBlcyh0eHQpIHtcblx0XHRcdGNvbnN0IHNwbGl0ID0gdHh0LnNwbGl0KC8oKD86JVtcXGRBLUZhLWZdezJ9KSspLyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cdFx0XHQvLyBObyAlLWVuY29kZWQgaXRlbXMgZm91bmQsIHNvIHJlcGxhY2UgdGhlIGxpdGVyYWwgJVxuXHRcdFx0aWYgKGxlbiA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc3BsaXRbMF0ucmVwbGFjZSgvJSg/IVtcXGRBLUZhLWZdezJ9KS9nLCAnJTI1Jyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSArPSAyKSB7XG5cdFx0XHRcdHNwbGl0W2ldID0gZGVjb2RlVVJJQ29tcG9uZW50KHNwbGl0W2ldKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzcGxpdC5qb2luKCcnKTtcblx0XHR9XG5cdFx0ZnJvbUFuY2hvcihhKSB7XG5cdFx0XHRpZiAoIWEpIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZnJvbVVSTChhLmhyZWYpO1xuXHRcdH1cblx0XHRmcm9tV2lraVRleHQodHh0KSB7XG5cdFx0XHQvLyBGSVhNRSAtIHRlc3RpbmcgbmVlZGVkXG5cdFx0XHR0eHQgPSBteURlY29kZVVSSSh0eHQpO1xuXHRcdFx0dGhpcy5zZXRVdGYodHh0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRoaW50VmFsdWUoKSB7XG5cdFx0XHRpZiAoIXRoaXMudmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNhZmVEZWNvZGVVUkkodGhpcy52YWx1ZSk7XG5cdFx0fVxuXHRcdHRvVXNlck5hbWUod2l0aE5zKSB7XG5cdFx0XHRpZiAodGhpcy5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc1VzZXJJZCAmJiB0aGlzLm5hbWVzcGFjZUlkKCkgIT09IHBnLm5zVXNlcnRhbGtJZCkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy52YWx1ZSA9XG5cdFx0XHRcdCh3aXRoTnMgPyBgJHttdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1VzZXJJZF19OmAgOiAnJykgK1xuXHRcdFx0XHR0aGlzLnN0cmlwTmFtZXNwYWNlKCkuc3BsaXQoJy8nKVswXTtcblx0XHR9XG5cdFx0dXNlck5hbWUod2l0aE5zKSB7XG5cdFx0XHRjb25zdCB0ID0gbmV3IFRpdGxlKHRoaXMudmFsdWUpO1xuXHRcdFx0dC50b1VzZXJOYW1lKHdpdGhOcyk7XG5cdFx0XHRpZiAodC52YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHR0b1RhbGtQYWdlKCkge1xuXHRcdFx0Ly8gY29udmVydCBhcnRpY2xlIHRvIGEgdGFsayBwYWdlLCBvciBpZiB3ZSBjYW4ndCwgcmV0dXJuIG51bGxcblx0XHRcdC8vIEluIG90aGVyIHdvcmRzOiByZXR1cm4gbnVsbCBpZiB0aGlzIEFMUkVBRFkgSVMgYSB0YWxrIHBhZ2Vcblx0XHRcdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdGFsayBwYWdlIG90aGVyd2lzZVxuXHRcdFx0Ly9cblx0XHRcdC8vIFBlciB7QGxpbmsgaHR0cHM6Ly93d3cubWVkaWF3aWtpLm9yZy93aWtpL01hbnVhbDpOYW1lc3BhY2UjU3ViamVjdF9hbmRfdGFsa19uYW1lc3BhY2VzfVxuXHRcdFx0Ly8gKiBBbGwgZGlzY3Vzc2lvbiBuYW1lc3BhY2VzIGhhdmUgb2RkLWludGVnZXIgaW5kaWNlc1xuXHRcdFx0Ly8gKiBUaGUgZGlzY3Vzc2lvbiBuYW1lc3BhY2UgaW5kZXggZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlIHdpdGggaW5kZXggbiBpcyBuICsgMVxuXHRcdFx0aWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuYW1lc3BhY2VJZCA9IHRoaXMubmFtZXNwYWNlSWQoKTtcblx0XHRcdGlmIChuYW1lc3BhY2VJZCA+PSAwICYmIG5hbWVzcGFjZUlkICUgMiA9PT0gMCkge1xuXHRcdFx0XHQvLyBub24tc3BlY2lhbCBhbmQgc3ViamVjdCBuYW1lc3BhY2Vcblx0XHRcdFx0Y29uc3QgbG9jYWxpemVkTmFtZXNwYWNlID0gbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbbmFtZXNwYWNlSWQgKyAxXTtcblx0XHRcdFx0aWYgKGxvY2FsaXplZE5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy52YWx1ZSA9XG5cdFx0XHRcdFx0XHRsb2NhbGl6ZWROYW1lc3BhY2UgPT09ICcnXG5cdFx0XHRcdFx0XHRcdD8gdGhpcy5zdHJpcE5hbWVzcGFjZSgpXG5cdFx0XHRcdFx0XHRcdDogYCR7bG9jYWxpemVkTmFtZXNwYWNlLnNwbGl0KCcgJykuam9pbignXycpfToke3RoaXMuc3RyaXBOYW1lc3BhY2UoKX1gO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHQvLyBSZXR1cm4gY2Fub25pY2FsLCBsb2NhbGl6ZWQgbmFtZXNwYWNlXG5cdFx0bmFtZXNwYWNlKCkge1xuXHRcdFx0cmV0dXJuIG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3RoaXMubmFtZXNwYWNlSWQoKV07XG5cdFx0fVxuXHRcdG5hbWVzcGFjZUlkKCkge1xuXHRcdFx0Y29uc3QgbiA9IHRoaXMudmFsdWUuaW5kZXhPZignOicpO1xuXHRcdFx0aWYgKG4gPCAwKSB7XG5cdFx0XHRcdHJldHVybiAwOyAvLyBtYWluc3BhY2Vcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hbWVzcGFjZUlkID1cblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKVt0aGlzLnZhbHVlLnNsaWNlKDAsIE1hdGgubWF4KDAsIG4pKS5zcGxpdCgnICcpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpXTtcblx0XHRcdGlmIChuYW1lc3BhY2VJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiAwOyAvLyBtYWluc3BhY2Vcblx0XHRcdH1cblx0XHRcdHJldHVybiBuYW1lc3BhY2VJZDtcblx0XHR9XG5cdFx0dGFsa1BhZ2UoKSB7XG5cdFx0XHRjb25zdCB0ID0gbmV3IFRpdGxlKHRoaXMudmFsdWUpO1xuXHRcdFx0dC50b1RhbGtQYWdlKCk7XG5cdFx0XHRpZiAodC52YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRpc1RhbGtQYWdlKCkge1xuXHRcdFx0aWYgKHRoaXMudGFsa1BhZ2UoKSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dG9BcnRpY2xlRnJvbVRhbGtQYWdlKCkge1xuXHRcdFx0Ly8gbGFyZ2VseSBjb3B5L3Bhc3RlIGZyb20gdG9UYWxrUGFnZSBhYm92ZS5cblx0XHRcdGlmICh0aGlzLnZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbmFtZXNwYWNlSWQgPSB0aGlzLm5hbWVzcGFjZUlkKCk7XG5cdFx0XHRpZiAobmFtZXNwYWNlSWQgPj0gMCAmJiBuYW1lc3BhY2VJZCAlIDIgPT09IDEpIHtcblx0XHRcdFx0Ly8gbm9uLXNwZWNpYWwgYW5kIHRhbGsgbmFtZXNwYWNlXG5cdFx0XHRcdGNvbnN0IGxvY2FsaXplZE5hbWVzcGFjZSA9IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW25hbWVzcGFjZUlkIC0gMV07XG5cdFx0XHRcdGlmIChsb2NhbGl6ZWROYW1lc3BhY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRoaXMudmFsdWUgPVxuXHRcdFx0XHRcdFx0bG9jYWxpemVkTmFtZXNwYWNlID09PSAnJ1xuXHRcdFx0XHRcdFx0XHQ/IHRoaXMuc3RyaXBOYW1lc3BhY2UoKVxuXHRcdFx0XHRcdFx0XHQ6IGAke2xvY2FsaXplZE5hbWVzcGFjZS5zcGxpdCgnICcpLmpvaW4oJ18nKX06JHt0aGlzLnN0cmlwTmFtZXNwYWNlKCl9YDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy52YWx1ZSA9IG51bGw7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0YXJ0aWNsZUZyb21UYWxrUGFnZSgpIHtcblx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUodGhpcy52YWx1ZSk7XG5cdFx0XHR0LnRvQXJ0aWNsZUZyb21UYWxrUGFnZSgpO1xuXHRcdFx0aWYgKHQudmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0YXJ0aWNsZUZyb21UYWxrT3JBcnRpY2xlKCkge1xuXHRcdFx0Y29uc3QgdCA9IG5ldyBUaXRsZSh0aGlzLnZhbHVlKTtcblx0XHRcdGlmICh0LnRvQXJ0aWNsZUZyb21UYWxrUGFnZSgpKSB7XG5cdFx0XHRcdHJldHVybiB0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlzSXBVc2VyKCkge1xuXHRcdFx0cmV0dXJuIHBnLnJlLmlwVXNlci50ZXN0KHRoaXMudXNlck5hbWUoKSk7XG5cdFx0fVxuXHRcdHN0cmlwTmFtZXNwYWNlKCkge1xuXHRcdFx0Ly8gcmV0dXJucyBhIHN0cmluZywgbm90IGEgVGl0bGVcblx0XHRcdGNvbnN0IG4gPSB0aGlzLnZhbHVlLmluZGV4T2YoJzonKTtcblx0XHRcdGlmIChuIDwgMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hbWVzcGFjZUlkID0gdGhpcy5uYW1lc3BhY2VJZCgpO1xuXHRcdFx0aWYgKG5hbWVzcGFjZUlkID09PSBwZy5uc01haW5zcGFjZUlkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWUuc2xpY2UoTWF0aC5tYXgoMCwgbiArIDEpKTtcblx0XHR9XG5cdFx0c2V0VXRmKHZhbHVlKSB7XG5cdFx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSAnJztcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYW5jaCA9IHZhbHVlLmluZGV4T2YoJyMnKTtcblx0XHRcdGlmIChhbmNoIDwgMCkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsdWUuc3BsaXQoJ18nKS5qb2luKCcgJyk7XG5cdFx0XHRcdHRoaXMuYW5jaG9yID0gJyc7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBNYXRoLm1heCgwLCBhbmNoKSkuc3BsaXQoJ18nKS5qb2luKCcgJyk7XG5cdFx0XHR0aGlzLmFuY2hvciA9IHZhbHVlLnNsaWNlKE1hdGgubWF4KDAsIGFuY2ggKyAxKSk7XG5cdFx0XHR0aGlzLm5zID0gbnVsbDsgLy8gd2FpdCB1bnRpbCBuYW1lc3BhY2UoKSBpcyBjYWxsZWRcblx0XHR9XG5cdFx0c2V0VXJsKHVybGZyYWcpIHtcblx0XHRcdGNvbnN0IGFuY2ggPSB1cmxmcmFnLmluZGV4T2YoJyMnKTtcblx0XHRcdHRoaXMudmFsdWUgPSBzYWZlRGVjb2RlVVJJKHVybGZyYWcuc2xpY2UoMCwgTWF0aC5tYXgoMCwgYW5jaCkpKTtcblx0XHRcdHRoaXMuYW5jaG9yID0gdGhpcy52YWx1ZS5zbGljZShNYXRoLm1heCgwLCBhbmNoICsgMSkpO1xuXHRcdH1cblx0XHRhcHBlbmQoeCkge1xuXHRcdFx0dGhpcy5zZXRVdGYodGhpcy52YWx1ZSArIHgpO1xuXHRcdH1cblx0XHR1cmxTdHJpbmcoeCkge1xuXHRcdFx0aWYgKCF4KSB7XG5cdFx0XHRcdHggPSB7fTtcblx0XHRcdH1cblx0XHRcdGxldCB2ID0gdGhpcy50b1N0cmluZyh0cnVlKTtcblx0XHRcdGlmICgheC5vbWl0QW5jaG9yICYmIHRoaXMuYW5jaG9yKSB7XG5cdFx0XHRcdHYgKz0gYCMke3RoaXMudXJsQW5jaG9yKCl9YDtcblx0XHRcdH1cblx0XHRcdGlmICgheC5rZWVwU3BhY2VzKSB7XG5cdFx0XHRcdHYgPSB2LnNwbGl0KCcgJykuam9pbignXycpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGVuY29kZVVSSSh2KS5zcGxpdCgnJicpLmpvaW4oJyUyNicpLnNwbGl0KCc/Jykuam9pbignJTNGJykuc3BsaXQoJysnKS5qb2luKCclMkInKTtcblx0XHR9XG5cdFx0cmVtb3ZlQW5jaG9yKCkge1xuXHRcdFx0cmV0dXJuIG5ldyBUaXRsZSh0aGlzLnRvU3RyaW5nKHRydWUpKTtcblx0XHR9XG5cdFx0dG9VcmwoKSB7XG5cdFx0XHRyZXR1cm4gcGcud2lraS50aXRsZWJhc2UgKyB0aGlzLnVybFN0cmluZygpO1xuXHRcdH1cblx0fVxuXHRUaXRsZS5mcm9tVVJMID0gKGgpID0+IHtcblx0XHRyZXR1cm4gbmV3IFRpdGxlKCkuZnJvbVVSTChoKTtcblx0fTtcblx0VGl0bGUuZnJvbUFuY2hvciA9IChhKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBUaXRsZSgpLmZyb21BbmNob3IoYSk7XG5cdH07XG5cdFRpdGxlLmZyb21XaWtpVGV4dCA9ICh0eHQpID0+IHtcblx0XHRyZXR1cm4gbmV3IFRpdGxlKCkuZnJvbVdpa2lUZXh0KHR4dCk7XG5cdH07XG5cdGNvbnN0IHBhcnNlUGFyYW1zID0gKHVybCkgPT4ge1xuXHRcdGNvbnN0IHNwZWNpYWxEaWZmID0gcGcucmUuc3BlY2lhbGRpZmYuZXhlYyh1cmwpO1xuXHRcdGlmIChzcGVjaWFsRGlmZikge1xuXHRcdFx0Y29uc3Qgc3BsaXQgPSBzcGVjaWFsRGlmZlsxXS5zcGxpdCgnLycpO1xuXHRcdFx0aWYgKHNwbGl0Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZGlkOiBzcGxpdFswXSxcblx0XHRcdFx0XHRkaWZmOiAncHJldicsXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYgKHNwbGl0Lmxlbmd0aCA9PT0gMikge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZGlkOiBzcGxpdFswXSxcblx0XHRcdFx0XHRkaWZmOiBzcGxpdFsxXSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgcmV0ID0ge307XG5cdFx0aWYgKCF1cmwuaW5jbHVkZXMoJz8nKSkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0W3VybF0gPSB1cmwuc3BsaXQoJyMnKTtcblx0XHRjb25zdCBzID0gdXJsLnNwbGl0KCc/Jykuc2xpY2UoMSkuam9pbignLCcpO1xuXHRcdGNvbnN0IHQgPSBzLnNwbGl0KCcmJyk7XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHQpIHtcblx0XHRcdGNvbnN0IHogPSBlbGVtZW50LnNwbGl0KCc9Jyk7XG5cdFx0XHR6LnB1c2gobnVsbCk7XG5cdFx0XHRbLCByZXRbelswXV1dID0gejtcblx0XHR9XG5cdFx0Ly8gRGlmZiByZXZpc2lvbiB3aXRoIG5vIG9sZGlkIGlzIGludGVycHJldGVkIGFzIGEgZGlmZiB0byB0aGUgcHJldmlvdXMgcmV2aXNpb24gYnkgTWVkaWFXaWtpXG5cdFx0aWYgKHJldC5kaWZmICYmIHJldC5vbGRpZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXQub2xkaWQgPSAncHJldic7XG5cdFx0fVxuXHRcdC8vIERvY3VtZW50YXRpb24gc2VlbXMgdG8gc2F5IHNvbWV0aGluZyBkaWZmZXJlbnQsIGJ1dCBvbGRpZCBjYW4gYWxzbyBhY2NlcHQgcHJldi9uZXh0LCBhbmRcblx0XHQvLyBFY2hvIGlzIGVtaXR0aW5nIHN1Y2ggVVJMcy4gU2ltcGxlIGZpeHVwIGR1cmluZyBwYXJhbWV0ZXIgZGVjb2Rpbmc6XG5cdFx0aWYgKHJldC5vbGRpZCAmJiAocmV0Lm9sZGlkID09PSAncHJldicgfHwgcmV0Lm9sZGlkID09PSAnbmV4dCcgfHwgcmV0Lm9sZGlkID09PSAnY3VyJykpIHtcblx0XHRcdGNvbnN0IGhlbHBlciA9IHJldC5kaWZmO1xuXHRcdFx0cmV0LmRpZmYgPSByZXQub2xkaWQ7XG5cdFx0XHRyZXQub2xkaWQgPSBoZWxwZXI7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdC8vIChhKSBteURlY29kZVVSSSAoZmlyc3Qgc3RhbmRhcmQgZGVjb2RlVVJJLCB0aGVuIHBnLnJlLnVybE5vUG9wdXApXG5cdC8vIChiKSBjaGFuZ2Ugc3BhY2VzIHRvIHVuZGVyc2NvcmVzXG5cdC8vIChjKSBlbmNvZGVVUkkgKGp1c3QgdGhlIHN0cmFpZ2h0IG9uZSwgbm8gcGcucmUudXJsTm9Qb3B1cClcblx0Y29uc3QgbXlEZWNvZGVVUkkgPSAoc3RyKSA9PiB7XG5cdFx0bGV0IHJldDtcblx0XHQvLyBGSVhNRSBkZWNvZGVVUklDb21wb25lbnQ/P1xuXHRcdHRyeSB7XG5cdFx0XHRyZXQgPSBkZWNvZGVVUkkoc3RyLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHN0cjtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwZy5taXNjLmRlY29kZUV4dHJhcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0Y29uc3Qge2Zyb219ID0gcGcubWlzYy5kZWNvZGVFeHRyYXNbaV07XG5cdFx0XHRjb25zdCB7dG99ID0gcGcubWlzYy5kZWNvZGVFeHRyYXNbaV07XG5cdFx0XHRyZXQgPSByZXQuc3BsaXQoZnJvbSkuam9pbih0byk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IHNhZmVEZWNvZGVVUkkgPSAoc3RyKSA9PiB7XG5cdFx0Y29uc3QgcmV0ID0gbXlEZWNvZGVVUkkoc3RyKTtcblx0XHRyZXR1cm4gcmV0IHx8IHN0cjtcblx0fTtcblx0Ly8gVEVTVFMgLy9cblx0Y29uc3QgaXNEaXNhbWJpZyA9IChkYXRhLCBhcnRpY2xlKSA9PiB7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cEFsbERhYnNTdHVicycpICYmIGFydGljbGUubmFtZXNwYWNlKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuICFhcnRpY2xlLmlzVGFsa1BhZ2UoKSAmJiBwZy5yZS5kaXNhbWJpZy50ZXN0KGRhdGEpO1xuXHR9O1xuXHRjb25zdCBzdHViQ291bnQgPSAoZGF0YSwgYXJ0aWNsZSkgPT4ge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBBbGxEYWJzU3R1YnMnKSAmJiBhcnRpY2xlLm5hbWVzcGFjZSgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGxldCBzZWN0U3R1YiA9IDA7XG5cdFx0bGV0IHJlYWxTdHViID0gMDtcblx0XHRpZiAocGcucmUuc3R1Yi50ZXN0KGRhdGEpKSB7XG5cdFx0XHRjb25zdCBzID0gZGF0YS5zcGxpdChwZy5yZS5zdHViKTtcblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgcy5sZW5ndGg7IGkgKz0gMikge1xuXHRcdFx0XHRpZiAoc1tpXSkge1xuXHRcdFx0XHRcdCsrc2VjdFN0dWI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KytyZWFsU3R1Yjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVhbDogcmVhbFN0dWIsXG5cdFx0XHRzZWN0OiBzZWN0U3R1Yixcblx0XHR9O1xuXHR9O1xuXHRjb25zdCBpc1ZhbGlkSW1hZ2VOYW1lID0gKHN0cikgPT4ge1xuXHRcdHJldHVybiAhc3RyLmluY2x1ZGVzKCd7Jyk7XG5cdH07XG5cdGNvbnN0IGlzSW5TdHJpcHBhYmxlTmFtZXNwYWNlID0gKGFydGljbGUpID0+IHtcblx0XHRyZXR1cm4gYXJ0aWNsZS5uYW1lc3BhY2VJZCgpICE9PSAwO1xuXHR9O1xuXHRjb25zdCBpc0luTWFpbk5hbWVzcGFjZSA9IChhcnRpY2xlKSA9PiB7XG5cdFx0cmV0dXJuIGFydGljbGUubmFtZXNwYWNlSWQoKSA9PT0gMDtcblx0fTtcblx0Y29uc3QgYW5jaG9yQ29udGFpbnNJbWFnZSA9IChhKSA9PiB7XG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGNoaWxkcmVuIG9mIGFuY2hvciBhXG5cdFx0Ly8gc2VlIGlmIGFueSBhcmUgaW1hZ2VzXG5cdFx0aWYgKGEgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qga2lkcyA9IGEuY2hpbGROb2Rlcztcblx0XHRmb3IgKGNvbnN0IGtpZCBvZiBraWRzKSB7XG5cdFx0XHRpZiAoa2lkLm5vZGVOYW1lID09PSAnSU1HJykge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRjb25zdCBpc1BvcHVwTGluayA9IChhKSA9PiB7XG5cdFx0Ly8gTkIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIFRPQyBsaW5rcyBnZW5lcmFsbHkgcmV0dXJuIHRydWVcblx0XHQvLyB0aGV5IHNob3VsZCBiZSBzdHJpcHBlZCBvdXQgbGF0ZXJcblx0XHRpZiAoIW1hcmtOb3BvcHVwU3BhbkxpbmtzLmRvbmUpIHtcblx0XHRcdG1hcmtOb3BvcHVwU3BhbkxpbmtzKCk7XG5cdFx0fVxuXHRcdGlmIChhLmluTm9wb3B1cFNwYW4pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gRklYTUUgaXMgdGhpcyBmYXN0ZXIgaW5saW5lP1xuXHRcdGlmIChhLm9ubW91c2Vkb3duIHx8IGEuZ2V0QXR0cmlidXRlKCdub3BvcHVwJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgaCA9IGEuaHJlZjtcblx0XHRpZiAoaCA9PT0gYCR7ZG9jdW1lbnQubG9jYXRpb24uaHJlZn0jYCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIXBnLnJlLmJhc2VuYW1lcy50ZXN0KGgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghcGcucmUudXJsTm9Qb3B1cC50ZXN0KGgpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdChwZy5yZS5lbWFpbC50ZXN0KGgpIHx8IHBnLnJlLmNvbnRyaWJzLnRlc3QoaCkgfHwgcGcucmUuYmFja2xpbmtzLnRlc3QoaCkgfHwgcGcucmUuc3BlY2lhbGRpZmYudGVzdChoKSkgJiZcblx0XHRcdCFoLmluY2x1ZGVzKCcmbGltaXQ9Jylcblx0XHQpO1xuXHR9O1xuXHRjb25zdCBtYXJrTm9wb3B1cFNwYW5MaW5rcyA9IGZ1bmN0aW9uIG1hcmtOb3BvcHVwU3BhbkxpbmtzKCkge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBPbmx5QXJ0aWNsZUxpbmtzJykpIHtcblx0XHRcdGZpeFZlY3Rvck1lbnVQb3B1cHMoKTtcblx0XHR9XG5cdFx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdFx0Y29uc3QgcyA9ICRib2R5LmZpbmQoJy5ub3BvcHVwcycpLnRvQXJyYXkoKTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygcykge1xuXHRcdFx0Y29uc3QgYXMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblx0XHRcdGZvciAoY29uc3QgYSBvZiBhcykge1xuXHRcdFx0XHRhLmluTm9wb3B1cFNwYW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtYXJrTm9wb3B1cFNwYW5MaW5rcy5kb25lID0gdHJ1ZTtcblx0fTtcblx0Y29uc3QgZml4VmVjdG9yTWVudVBvcHVwcyA9ICgpID0+IHtcblx0XHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0XHQkYm9keS5maW5kKCduYXYudmVjdG9yLW1lbnUgaDM6Zmlyc3QgYTpmaXJzdCcpLnByb3AoJ2luTm9wb3B1cFNwYW4nLCB0cnVlKTtcblx0fTtcblx0Ly8gRU5ERklMRTogdGl0bGVzLmpzXG5cdC8vIFNUQVJURklMRTogZ2V0cGFnZS5qc1xuXHQvLyBXaWtpLXNwZWNpZmljIGRvd25sb2FkaW5nXG5cdC8vXG5cdC8vIFNjaGVtYXRpYyBmb3IgYSBnZXRXaWtpIGNhbGxcblx0Ly9cblx0Ly8gICAgICAgICAgICAgZ2V0UGFnZVdpdGhDYWNoaW5nXG5cdC8vXHRcdFx0XHRcdHxcblx0Ly9cdCAgIGZhbHNlXHRcdHxcdFx0ICB0cnVlXG5cdC8vIGdldFBhZ2U8LVtmaW5kUGljdHVyZUluQ2FjaGVdLT4tb25Db21wbGV0ZShhIGZha2UgZG93bmxvYWQpXG5cdC8vICAgXFwuXG5cdC8vXHQgKGFzeW5jKS0+YWRkUGFnZVRvQ2FjaGUoZG93bmxvYWQpLT4tb25Db21wbGV0ZShkb3dubG9hZClcblx0Ly8gY2hlY2sgY2FjaGUgdG8gc2VlIGlmIHBhZ2UgZXhpc3RzXG5cdGNvbnN0IGdldFBhZ2VXaXRoQ2FjaGluZyA9ICh1cmwsIG9uQ29tcGxldGUsIG93bmVyKSA9PiB7XG5cdFx0bG9nKGBnZXRQYWdlV2l0aENhY2hpbmcsIHVybD0ke3VybH1gKTtcblx0XHRjb25zdCBpID0gZmluZEluUGFnZUNhY2hlKHVybCk7XG5cdFx0bGV0IGQ7XG5cdFx0aWYgKGkgPiAtMSkge1xuXHRcdFx0ZCA9IGZha2VEb3dubG9hZChcblx0XHRcdFx0dXJsLFxuXHRcdFx0XHRvd25lci5pZE51bWJlcixcblx0XHRcdFx0b25Db21wbGV0ZSxcblx0XHRcdFx0cGcuY2FjaGUucGFnZXNbaV0uZGF0YSxcblx0XHRcdFx0cGcuY2FjaGUucGFnZXNbaV0ubGFzdE1vZGlmaWVkLFxuXHRcdFx0XHRvd25lclxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZCA9IGdldFBhZ2UodXJsLCBvbkNvbXBsZXRlLCBvd25lcik7XG5cdFx0XHRpZiAoZCAmJiBvd25lciAmJiBvd25lci5hZGREb3dubG9hZCkge1xuXHRcdFx0XHRvd25lci5hZGREb3dubG9hZChkKTtcblx0XHRcdFx0ZC5vd25lciA9IG93bmVyO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgZ2V0UGFnZSA9ICh1cmwsIG9uQ29tcGxldGUsIG93bmVyKSA9PiB7XG5cdFx0bG9nKCdnZXRQYWdlJyk7XG5cdFx0Y29uc3QgY2FsbGJhY2sgPSAoZCkgPT4ge1xuXHRcdFx0aWYgKCFkLmFib3J0ZWQpIHtcblx0XHRcdFx0YWRkUGFnZVRvQ2FjaGUoZCk7XG5cdFx0XHRcdG9uQ29tcGxldGUoZCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4gc3RhcnREb3dubG9hZCh1cmwsIG93bmVyLmlkTnVtYmVyLCBjYWxsYmFjayk7XG5cdH07XG5cdGNvbnN0IGZpbmRJblBhZ2VDYWNoZSA9ICh1cmwpID0+IHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBnLmNhY2hlLnBhZ2VzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAodXJsID09PSBwZy5jYWNoZS5wYWdlc1tpXS51cmwpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fTtcblx0Y29uc3QgYWRkUGFnZVRvQ2FjaGUgPSAoZG93bmxvYWQpID0+IHtcblx0XHRsb2coYGFkZFBhZ2VUb0NhY2hlICR7ZG93bmxvYWQudXJsfWApO1xuXHRcdGNvbnN0IHBhZ2UgPSB7XG5cdFx0XHR1cmw6IGRvd25sb2FkLnVybCxcblx0XHRcdGRhdGE6IGRvd25sb2FkLmRhdGEsXG5cdFx0XHRsYXN0TW9kaWZpZWQ6IGRvd25sb2FkLmxhc3RNb2RpZmllZCxcblx0XHR9O1xuXHRcdHJldHVybiBwZy5jYWNoZS5wYWdlcy5wdXNoKHBhZ2UpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBnZXRwYWdlLmpzXG5cdC8vIFNUQVJURklMRTogdG9vbHMuanNcblx0Ly8gSUUgbWFkbmVzcyB3aXRoIGVuY29kaW5nXG5cdC8vID09PT09PT09PT09PT09PT09PT09PT09PVxuXHQvL1xuXHQvLyBzdXBwb3NlIHRocm91Z2hvdXQgdGhhdCB0aGUgcGFnZSBpcyBpbiB1dGY4LCBsaWtlIHdpa2lwZWRpYVxuXHQvL1xuXHQvLyBpZiBhIGlzIGFuIGFuY2hvciBET00gZWxlbWVudCBhbmQgYS5ocmVmIHNob3VsZCBjb25zaXN0IG9mXG5cdC8vXG5cdC8vIGh0dHA6Ly9ob3N0Lm5hbWUuaGVyZS93aWtpL2Zvbz9iYXI9YmF6XG5cdC8vXG5cdC8vIHRoZW4gSUUgZ2l2ZXMgZm9vIGFzIFwibGF0aW4xLWVuY29kZWRcIiB1dGY4OyB3ZSBoYXZlIGZvbyA9IGRlY29kZV91dGY4KGRlY29kZVVSSShmb29faWUpKVxuXHQvLyBidXQgSUUgZ2l2ZXMgYmFyPWJheiBjb3JyZWN0bHkgYXMgcGxhaW4gdXRmOFxuXHQvL1xuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cblx0Ly8gSUUncyB4bWxodHRwIGRvZXNuJ3QgdW5kZXJzdGFuZCB1dGY4IHVybHMuIEhhdmUgdG8gdXNlIGVuY29kZVVSSSBoZXJlLlxuXHQvL1xuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cblx0Ly8gc3VtbWF0IGVsc2Vcblx0Ly8gU291cmNlOiBodHRwOi8vYWt0dWVsbC5kZS5zZWxmaHRtbC5vcmcvYXJ0aWtlbC9qYXZhc2NyaXB0L3V0ZjhiNjQvdXRmOC5odG1cblx0Y29uc3QgZ2V0SnNPYmogPSAoanNvbikgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBqc29uX3JldCA9IEpTT04ucGFyc2UoanNvbik7XG5cdFx0XHRpZiAoanNvbl9yZXQud2FybmluZ3MpIHtcblx0XHRcdFx0Zm9yIChsZXQgdyA9IDA7IHcgPCBqc29uX3JldC53YXJuaW5ncy5sZW5ndGg7IHcrKykge1xuXHRcdFx0XHRcdGlmIChqc29uX3JldC53YXJuaW5nc1t3XVsnKiddKSB7XG5cdFx0XHRcdFx0XHRsb2coanNvbl9yZXQud2FybmluZ3Nbd11bJyonXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGxvZyhqc29uX3JldC53YXJuaW5nc1t3XS53YXJuaW5ncyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGpzb25fcmV0LmVycm9yKSB7XG5cdFx0XHRcdGVycmxvZyhgJHtqc29uX3JldC5lcnJvci5jb2RlfTogJHtqc29uX3JldC5lcnJvci5pbmZvfWApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGpzb25fcmV0O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0ZXJybG9nKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGdldEpzT2JqLCBqc29uPSR7anNvbn1gKTtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgYW55Q2hpbGQgPSAob2JqKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBwIGluIG9iaikge1xuXHRcdFx0aWYgKCFPYmplY3QuaGFzT3duKG9iaiwgcCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2JqW3BdO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblx0Y29uc3QgdXBjYXNlRmlyc3QgPSAoc3RyKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBzdHIgIT09IHR5cGVvZiAnJyB8fCBzdHIgPT09ICcnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG5cdH07XG5cdGNvbnN0IGZpbmRJbkFycmF5ID0gKGFyciwgZm9vKSA9PiB7XG5cdFx0aWYgKCFhcnIgfHwgYXJyLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdH1cblx0XHRjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdGlmIChhcnJbaV0gPT09IGZvbykge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9O1xuXHRjb25zdCBuZXh0T25lID0gKGFycmF5LCB2YWx1ZSkgPT4ge1xuXHRcdC8vIE5CIGlmIHRoZSBhcnJheSBoYXMgdHdvIGNvbnNlY3V0aXZlIGVudHJpZXMgZXF1YWxcblx0XHQvL1x0dGhlbiB0aGlzIHdpbGwgbG9vcCBvbiBzdWNjZXNzaXZlIGNhbGxzXG5cdFx0Y29uc3QgaSA9IGZpbmRJbkFycmF5KGFycmF5LCB2YWx1ZSk7XG5cdFx0aWYgKGkgPCAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIGFycmF5W2kgKyAxXTtcblx0fTtcblx0Y29uc3QgbGl0ZXJhbGl6ZVJlZ2V4ID0gKHN0cikgPT4ge1xuXHRcdHJldHVybiBtdy51dGlsLmVzY2FwZVJlZ0V4cChzdHIpO1xuXHR9O1xuXHRTdHJpbmcucHJvdG90eXBlLmVudGlmeSA9IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBsZXQgc2h5ID0gJyZzaHk7Jztcblx0XHRyZXR1cm4gdGhpcy5zcGxpdCgnJicpXG5cdFx0XHQuam9pbignJmFtcDsnKVxuXHRcdFx0LnNwbGl0KCc8Jylcblx0XHRcdC5qb2luKCcmbHQ7Jylcblx0XHRcdC5zcGxpdCgnPicpXG5cdFx0XHQuam9pbignJmd0OycgLyogK3NoeSAqLylcblx0XHRcdC5zcGxpdCgnXCInKVxuXHRcdFx0LmpvaW4oJyZxdW90OycpO1xuXHR9O1xuXHQvLyBBcnJheSBmaWx0ZXIgZnVuY3Rpb25cblx0Y29uc3QgcmVtb3ZlTnVsbHMgPSAodmFsKSA9PiB7XG5cdFx0cmV0dXJuIHZhbCAhPT0gbnVsbDtcblx0fTtcblx0Y29uc3Qgam9pblBhdGggPSAobGlzdCkgPT4ge1xuXHRcdHJldHVybiBsaXN0LmZpbHRlcihyZW1vdmVOdWxscykuam9pbignLycpO1xuXHR9O1xuXHRjb25zdCBzaW1wbGVQcmludGYgPSAoc3RyLCBzdWJzKSA9PiB7XG5cdFx0aWYgKCFzdHIgfHwgIXN1YnMpIHtcblx0XHRcdHJldHVybiBzdHI7XG5cdFx0fVxuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGNvbnN0IHMgPSBzdHIuc3BsaXQoLyglc3xcXCRcXGQrKS8pO1xuXHRcdGxldCBpID0gMDtcblx0XHRkbyB7XG5cdFx0XHRyZXQucHVzaChzLnNoaWZ0KCkpO1xuXHRcdFx0aWYgKHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY21kID0gcy5zaGlmdCgpO1xuXHRcdFx0aWYgKGNtZCA9PT0gJyVzJykge1xuXHRcdFx0XHRpZiAoaSA8IHN1YnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goc3Vic1tpXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goY21kKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQrK2k7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBqID0gTnVtYmVyLnBhcnNlSW50KGNtZC5yZXBsYWNlKCckJywgJycpLCAxMCkgLSAxO1xuXHRcdFx0XHRpZiAoaiA+IC0xICYmIGogPCBzdWJzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldC5wdXNoKHN1YnNbal0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldC5wdXNoKGNtZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IHdoaWxlIChzLmxlbmd0aCA+IDApO1xuXHRcdHJldHVybiByZXQuam9pbignJyk7XG5cdH07XG5cdGNvbnN0IGlzU3RyaW5nID0gKHgpID0+IHtcblx0XHRyZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnIHx8IHggaW5zdGFuY2VvZiBTdHJpbmc7XG5cdH07XG5cdGNvbnN0IGlzTnVtYmVyID0gKHgpID0+IHtcblx0XHRyZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInIHx8IHggaW5zdGFuY2VvZiBOdW1iZXI7XG5cdH07XG5cdGNvbnN0IGlzUmVnRXhwID0gKHgpID0+IHtcblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mIFJlZ0V4cDtcblx0fTtcblx0Y29uc3QgaXNBcnJheSA9ICh4KSA9PiB7XG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkoeCk7XG5cdH07XG5cdGNvbnN0IGlzT2JqZWN0ID0gKHgpID0+IHtcblx0XHRyZXR1cm4geCBpbnN0YW5jZW9mIE9iamVjdDtcblx0fTtcblx0Y29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB7XG5cdFx0cmV0dXJuICFpc1JlZ0V4cCh4KSAmJiAodHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgeCBpbnN0YW5jZW9mIEZ1bmN0aW9uKTtcblx0fTtcblx0Y29uc3QgcmVwZWF0U3RyaW5nID0gKHMsIG11bHQpID0+IHtcblx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtdWx0OyArK2kpIHtcblx0XHRcdHJldCArPSBzO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCB6ZXJvRmlsbCA9IChzLCBtaW4pID0+IHtcblx0XHRtaW4gfHw9IDI7XG5cdFx0Y29uc3QgdCA9IHMudG9TdHJpbmcoKTtcblx0XHRyZXR1cm4gcmVwZWF0U3RyaW5nKCcwJywgbWluIC0gdC5sZW5ndGgpICsgdDtcblx0fTtcblx0Y29uc3QgbWFwID0gKGYsIG8pID0+IHtcblx0XHRpZiAoaXNBcnJheShvKSkge1xuXHRcdFx0cmV0dXJuIG1hcF9hcnJheShmLCBvKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hcF9vYmplY3QoZiwgbyk7XG5cdH07XG5cdGNvbnN0IG1hcF9hcnJheSA9IChmLCBvKSA9PiB7XG5cdFx0Y29uc3QgcmV0ID0gW107XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIG8pIHtcblx0XHRcdHJldC5wdXNoKGYoZWxlbWVudCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBtYXBfb2JqZWN0ID0gKGYsIG8pID0+IHtcblx0XHRjb25zdCByZXQgPSB7fTtcblx0XHRmb3IgKGNvbnN0IGkgaW4gbykge1xuXHRcdFx0aWYgKCFPYmplY3QuaGFzT3duKG8sIGkpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0W29dID0gZihvW2ldKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0cGcuZXNjYXBlUXVvdGVzSFRNTCA9ICh0ZXh0KSA9PiB7XG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblx0fTtcblx0cGcudW5lc2NhcGVRdW90ZXNIVE1MID0gKGh0bWwpID0+IHtcblx0XHQvLyBGcm9tIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNzM5NDc4N31cblx0XHQvLyBUaGlzIHNlZW1zIHRvIGJlIGltcGxlbWVudGVkIGNvcnJlY3RseSBvbiBhbGwgbWFqb3IgYnJvd3NlcnMgbm93LCBzbyB3ZVxuXHRcdC8vIGRvbid0IGhhdmUgdG8gbWFrZSBvdXIgb3duIGZ1bmN0aW9uLlxuXHRcdGNvbnN0IHR4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG5cdFx0dHh0LmlubmVySFRNTCA9IGh0bWw7XG5cdFx0cmV0dXJuIHR4dC52YWx1ZTtcblx0fTtcblx0Ly8gRU5ERklMRTogdG9vbHMuanNcblx0Ly8gU1RBUlRGSUxFOiBkYWIuanNcblx0Ly8gRGFiLWZpeGluZyBjb2RlXG5cdC8vXG5cdGNvbnN0IHJldGFyZ2V0RGFiID0gKG5ld1RhcmdldCwgb2xkVGFyZ2V0LCBmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSwgdGl0bGVUb0VkaXQpID0+IHtcblx0XHRsb2coYHJldGFyZ2V0RGFiOiBuZXdUYXJnZXQ9JHtuZXdUYXJnZXR9IG9sZFRhcmdldD0ke29sZFRhcmdldH1gKTtcblx0XHRyZXR1cm4gY2hhbmdlTGlua1RhcmdldExpbmsoe1xuXHRcdFx0bmV3VGFyZ2V0LFxuXHRcdFx0dGV4dDogbmV3VGFyZ2V0LnNwbGl0KCcgJykuam9pbignJm5ic3A7JyksXG5cdFx0XHRoaW50OiB0cHJpbnRmKCdkaXNhbWJpZ0hpbnQnLCBbbmV3VGFyZ2V0XSksXG5cdFx0XHRzdW1tYXJ5OiBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBGaXhEYWJzU3VtbWFyeScpLCBbZnJpZW5kbHlDdXJyZW50QXJ0aWNsZU5hbWUsIG5ld1RhcmdldF0pLFxuXHRcdFx0Y2xpY2tCdXR0b246IGdldFZhbHVlT2YoJ3BvcHVwRGFic0F1dG9DbGljaycpLFxuXHRcdFx0bWlub3I6IHRydWUsXG5cdFx0XHRvbGRUYXJnZXQsXG5cdFx0XHR3YXRjaDogZ2V0VmFsdWVPZigncG9wdXBXYXRjaERpc2FtYmlnZ2VkUGFnZXMnKSxcblx0XHRcdHRpdGxlOiB0aXRsZVRvRWRpdCxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgbGlzdExpbmtzID0gKHdpa2l0ZXh0LCBvbGRUYXJnZXQsIHRpdGxlVG9FZGl0KSA9PiB7XG5cdFx0Ly8gbWVkaWF3aWtpIHN0cmlwcyB0cmFpbGluZyBzcGFjZXMsIHNvIHdlIGRvIHRoZSBzYW1lXG5cdFx0Ly8gdGVzdGNhc2U6IHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvdy9pbmRleC5waHA/dGl0bGU9UmFkaWFsJm9sZGlkPTk3MzY1NjMzfVxuXHRcdGNvbnN0IHJlZyA9IC9cXFtcXFsoW158XSo/KSAqKFxcfHxdXSkvZ2k7XG5cdFx0bGV0IHJldCA9IFtdO1xuXHRcdGNvbnN0IHNwbGl0dGVkID0gd2lraXRleHQuc3BsaXQocmVnKTtcblx0XHQvLyBeW2Etel0rIHNob3VsZCBtYXRjaCBpbnRlcndpa2kgbGlua3MsIGhvcGVmdWxseSAoY2FzZS1pbnNlbnNpdGl2ZSlcblx0XHQvLyBhbmQgXlthLXpdKiBzaG91bGQgbWF0Y2ggdGhvc2UgYW5kIFtbOkNhdGVnb3J5Li4uXV0gc3R5bGUgbGlua3MgdG9vXG5cdFx0Y29uc3Qgb21pdFJlZ2V4ID0gL15bYS16XSo6fF5bU3NdcGVjaWFsOnxeW0lpXW1hZ2V8XltDY11hdGVnb3J5Lztcblx0XHRjb25zdCBmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSA9IG9sZFRhcmdldC50b1N0cmluZygpO1xuXHRcdGNvbnN0IHdpa1BvcyA9IGdldFZhbHVlT2YoJ3BvcHVwRGFiV2lrdGlvbmFyeScpO1xuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdGlmICh0eXBlb2Ygc3BsaXR0ZWRbaV0gPT09IHR5cGVvZiAnc3RyaW5nJyAmJiBzcGxpdHRlZFtpXS5sZW5ndGggPiAwICYmICFvbWl0UmVnZXgudGVzdChzcGxpdHRlZFtpXSkpIHtcblx0XHRcdFx0cmV0LnB1c2gocmV0YXJnZXREYWIoc3BsaXR0ZWRbaV0sIG9sZFRhcmdldCwgZnJpZW5kbHlDdXJyZW50QXJ0aWNsZU5hbWUsIHRpdGxlVG9FZGl0KSk7XG5cdFx0XHR9IC8qIGlmICovXG5cdFx0fSAvKiBmb3IgbG9vcCAqL1xuXHRcdHJldCA9IHJtRHVwZXNGcm9tU29ydGVkTGlzdChyZXQuc29ydCgpKTtcblx0XHRpZiAod2lrUG9zKSB7XG5cdFx0XHRjb25zdCB3aWtUYXJnZXQgPSBgd2lrdGlvbmFyeToke2ZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lLnJlcGxhY2UoL14oLispXFxzK1xcKFteKV0rXFwpXFxzKiQvLCAnJDEnKX1gO1xuXHRcdFx0Y29uc3QgbWV0aCA9IHdpa1Bvcy50b0xvd2VyQ2FzZSgpID09PSAnZmlyc3QnID8gJ3Vuc2hpZnQnIDogJ3B1c2gnO1xuXHRcdFx0cmV0W21ldGhdKHJldGFyZ2V0RGFiKHdpa1RhcmdldCwgb2xkVGFyZ2V0LCBmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSwgdGl0bGVUb0VkaXQpKTtcblx0XHR9XG5cdFx0cmV0LnB1c2goXG5cdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdG5ld1RhcmdldDogbnVsbCxcblx0XHRcdFx0dGV4dDogcG9wdXBTdHJpbmcoJ3JlbW92ZSB0aGlzIGxpbmsnKS5zcGxpdCgnICcpLmpvaW4oJyZuYnNwOycpLFxuXHRcdFx0XHRoaW50OiBwb3B1cFN0cmluZygncmVtb3ZlIGFsbCBsaW5rcyB0byB0aGlzIGRpc2FtYmlnIHBhZ2UgZnJvbSB0aGlzIGFydGljbGUnKSxcblx0XHRcdFx0Y2xpY2tCdXR0b246IGdldFZhbHVlT2YoJ3BvcHVwRGFic0F1dG9DbGljaycpLFxuXHRcdFx0XHRvbGRUYXJnZXQsXG5cdFx0XHRcdHN1bW1hcnk6IHNpbXBsZVByaW50ZihnZXRWYWx1ZU9mKCdwb3B1cFJtRGFiTGlua1N1bW1hcnknKSwgW2ZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lXSksXG5cdFx0XHRcdHdhdGNoOiBnZXRWYWx1ZU9mKCdwb3B1cFdhdGNoRGlzYW1iaWdnZWRQYWdlcycpLFxuXHRcdFx0XHR0aXRsZTogdGl0bGVUb0VkaXQsXG5cdFx0XHR9KVxuXHRcdCk7XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3Qgcm1EdXBlc0Zyb21Tb3J0ZWRMaXN0ID0gKGxpc3QpID0+IHtcblx0XHRjb25zdCByZXQgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgbGlzdCkge1xuXHRcdFx0aWYgKHJldC5sZW5ndGggPT09IDAgfHwgZWxlbWVudCAhPT0gcmV0LmF0KC0xKSkge1xuXHRcdFx0XHRyZXQucHVzaChlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgbWFrZUZpeERhYiA9IChkYXRhLCBuYXZwb3ApID0+IHtcblx0XHQvLyBncmFiIHRpdGxlIGZyb20gcGFyZW50IHBvcHVwIGlmIHRoZXJlIGlzIG9uZTsgZGVmYXVsdCBleGlzdHMgaW4gY2hhbmdlTGlua1RhcmdldExpbmtcblx0XHRjb25zdCB0aXRsZVRvRWRpdCA9IG5hdnBvcC5wYXJlbnRQb3B1cCAmJiBuYXZwb3AucGFyZW50UG9wdXAuYXJ0aWNsZS50b1N0cmluZygpO1xuXHRcdGNvbnN0IGxpc3QgPSBsaXN0TGlua3MoZGF0YSwgbmF2cG9wLm9yaWdpbmFsQXJ0aWNsZSwgdGl0bGVUb0VkaXQpO1xuXHRcdGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0bG9nKCdsaXN0TGlua3MgcmV0dXJuZWQgZW1wdHkgbGlzdCcpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGxldCBodG1sID0gYDxocj4ke3BvcHVwU3RyaW5nKCdDbGljayB0byBkaXNhbWJpZ3VhdGUgdGhpcyBsaW5rIHRvOicpfTxicj5gO1xuXHRcdGh0bWwgKz0gbGlzdC5qb2luKCcsICcpO1xuXHRcdHJldHVybiBodG1sO1xuXHR9O1xuXHRjb25zdCBtYWtlRml4RGFicyA9ICh3aWtpVGV4dCwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0Z2V0VmFsdWVPZigncG9wdXBGaXhEYWJzJykgJiZcblx0XHRcdGlzRGlzYW1iaWcod2lraVRleHQsIG5hdnBvcC5hcnRpY2xlKSAmJlxuXHRcdFx0VGl0bGUuZnJvbVVSTChsb2NhdGlvbi5ocmVmKS5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc1NwZWNpYWxJZCAmJlxuXHRcdFx0bmF2cG9wLmFydGljbGUudGFsa1BhZ2UoKVxuXHRcdCkge1xuXHRcdFx0c2V0UG9wdXBIVE1MKG1ha2VGaXhEYWIod2lraVRleHQsIG5hdnBvcCksICdwb3B1cEZpeERhYicsIG5hdnBvcC5pZE51bWJlcik7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBwb3B1cFJlZGxpbmtIVE1MID0gKGFydGljbGUpID0+IHtcblx0XHRyZXR1cm4gY2hhbmdlTGlua1RhcmdldExpbmsoe1xuXHRcdFx0bmV3VGFyZ2V0OiBudWxsLFxuXHRcdFx0dGV4dDogcG9wdXBTdHJpbmcoJ3JlbW92ZSB0aGlzIGxpbmsnKS5zcGxpdCgnICcpLmpvaW4oJyZuYnNwOycpLFxuXHRcdFx0aGludDogcG9wdXBTdHJpbmcoJ3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJyksXG5cdFx0XHRjbGlja0J1dHRvbjogZ2V0VmFsdWVPZigncG9wdXBSZWRsaW5rQXV0b0NsaWNrJyksXG5cdFx0XHRvbGRUYXJnZXQ6IGFydGljbGUudG9TdHJpbmcoKSxcblx0XHRcdHN1bW1hcnk6IHNpbXBsZVByaW50ZihnZXRWYWx1ZU9mKCdwb3B1cFJlZGxpbmtTdW1tYXJ5JyksIFthcnRpY2xlLnRvU3RyaW5nKCldKSxcblx0XHR9KTtcblx0fTtcblx0Ly8gRU5ERklMRTogZGFiLmpzXG5cdC8vIFNUQVJURklMRTogaHRtbG91dHB1dC5qc1xuXHQvLyB0aGlzIGhhcyB0byB1c2UgYSB0aW1lciBsb29wIGFzIHdlIGRvbid0IGtub3cgaWYgdGhlIERPTSBlbGVtZW50IGV4aXN0cyB3aGVuIHdlIHdhbnQgdG8gc2V0IHRoZSB0ZXh0XG5cdGNvbnN0IHNldFBvcHVwSFRNTCA9IGZ1bmN0aW9uIHNldFBvcHVwSFRNTChzdHIsIGVsZW1lbnRJZCwgcG9wdXBJZCwgb25TdWNjZXNzLCBhcHBlbmQpIHtcblx0XHRpZiAocG9wdXBJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBjb25zb2xlLmVycm9yKCdbUG9wdXBzXSBwb3B1cElkIGlzIG5vdCBkZWZpbmVkIGluIHNldFBvcHVwSFRNTCwgaHRtbD0nK3N0ci5zdWJzdHJpbmcoMCwxMDApKTtcblx0XHRcdHBvcHVwSWQgPSBwZy5pZE51bWJlcjtcblx0XHR9XG5cdFx0Y29uc3QgcG9wdXBFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudElkfSR7cG9wdXBJZH1gKTtcblx0XHRpZiAocG9wdXBFbGVtZW50KSB7XG5cdFx0XHRpZiAoIWFwcGVuZCkge1xuXHRcdFx0XHRwb3B1cEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTdHJpbmcoc3RyKSkge1xuXHRcdFx0XHRwb3B1cEVsZW1lbnQuaW5uZXJIVE1MICs9IHN0cjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBvcHVwRWxlbWVudC5hcHBlbmQoc3RyKTtcblx0XHRcdH1cblx0XHRcdGlmIChvblN1Y2Nlc3MpIHtcblx0XHRcdFx0b25TdWNjZXNzKCk7XG5cdFx0XHR9XG5cdFx0XHRzZXRUaW1lb3V0KGNoZWNrUG9wdXBQb3NpdGlvbiwgMTAwKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHQvLyBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4gaW4gYSBsaXR0bGUgd2hpbGUuLi5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHNldFBvcHVwSFRNTChzdHIsIGVsZW1lbnRJZCwgcG9wdXBJZCwgb25TdWNjZXNzKTtcblx0XHR9LCA2MDApO1xuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXHRjb25zdCBzZXRQb3B1cFRyYWlsZXIgPSAoc3RyLCBpZCkgPT4ge1xuXHRcdHJldHVybiBzZXRQb3B1cEhUTUwoc3RyLCAncG9wdXBEYXRhJywgaWQpO1xuXHR9O1xuXHQvLyBhcmdzLm5hdnBvcHVwIGlzIG1hbmRhdG9yeVxuXHQvLyBvcHRpb25hbDogYXJncy5yZWRpciwgYXJncy5yZWRpclRhcmdldFxuXHQvLyBGSVhNRTogeWUgZ29kcywgdGhpcyBpcyB1Z2x5IHN0dWZmXG5cdGNvbnN0IGZpbGxFbXB0eVNwYW5zID0gKGFyZ3MpID0+IHtcblx0XHQvLyBpZiByZWRpciBpcyBwcmVzZW50IGFuZCB0cnVlIHRoZW4gcmVkaXJUYXJnZXQgaXMgbWFuZGF0b3J5XG5cdFx0bGV0IHJlZGlyID0gdHJ1ZTtcblx0XHRsZXQgcmNpZDtcblx0XHRpZiAodHlwZW9mIGFyZ3MgIT09ICdvYmplY3QnIHx8IGFyZ3MucmVkaXIgPT09IHVuZGVmaW5lZCB8fCAhYXJncy5yZWRpcikge1xuXHRcdFx0cmVkaXIgPSBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgYSA9IGFyZ3MubmF2cG9wdXAucGFyZW50QW5jaG9yO1xuXHRcdGxldCBhcnRpY2xlO1xuXHRcdGxldCBoaW50O1xuXHRcdGxldCBvbGRpZDtcblx0XHRsZXQgcGFyYW1zID0ge307XG5cdFx0aWYgKHJlZGlyICYmIHR5cGVvZiBhcmdzLnJlZGlyVGFyZ2V0ID09PSB0eXBlb2Yge30pIHtcblx0XHRcdGFydGljbGUgPSBhcmdzLnJlZGlyVGFyZ2V0O1xuXHRcdFx0Ly8gaGludD1hcnRpY2xlLmhpbnRWYWx1ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcnRpY2xlID0gbmV3IFRpdGxlKCkuZnJvbUFuY2hvcihhKTtcblx0XHRcdGhpbnQgPSBhLm9yaWdpbmFsVGl0bGUgfHwgYXJ0aWNsZS5oaW50VmFsdWUoKTtcblx0XHRcdHBhcmFtcyA9IHBhcnNlUGFyYW1zKGEuaHJlZik7XG5cdFx0XHRvbGRpZCA9IGdldFZhbHVlT2YoJ3BvcHVwSGlzdG9yaWNhbExpbmtzJykgPyBwYXJhbXMub2xkaWQgOiBudWxsO1xuXHRcdFx0KHtyY2lkfSA9IHBhcmFtcyk7XG5cdFx0fVxuXHRcdGNvbnN0IHggPSB7XG5cdFx0XHRhcnRpY2xlLFxuXHRcdFx0aGludCxcblx0XHRcdG9sZGlkLFxuXHRcdFx0cmNpZCxcblx0XHRcdG5hdnBvcDogYXJncy5uYXZwb3B1cCxcblx0XHRcdHBhcmFtcyxcblx0XHR9O1xuXHRcdGNvbnN0IHN0cnVjdHVyZSA9IHBnLnN0cnVjdHVyZXNbZ2V0VmFsdWVPZigncG9wdXBTdHJ1Y3R1cmUnKV07XG5cdFx0aWYgKHR5cGVvZiBzdHJ1Y3R1cmUgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRzZXRQb3B1cEhUTUwoXG5cdFx0XHRcdCdwb3B1cEVycm9yJyxcblx0XHRcdFx0YFVua25vd24gc3RydWN0dXJlICh0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4pOiAke3BnLm9wdGlvbi5wb3B1cFN0cnVjdHVyZX1gLFxuXHRcdFx0XHRhcmdzLm5hdnBvcHVwLmlkTnVtYmVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBzcGFucyA9IGZsYXR0ZW4ocGcubWlzYy5sYXlvdXQpO1xuXHRcdGNvbnN0IG51bXNwYW5zID0gc3BhbnMubGVuZ3RoO1xuXHRcdGNvbnN0IHJlZGlycyA9IHBnLm1pc2MucmVkaXJTcGFucztcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG51bXNwYW5zOyArK2kpIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gcmVkaXJzICYmIHJlZGlycy5pbmNsdWRlcyhzcGFuc1tpXSk7XG5cdFx0XHQvLyBsb2coJ3JlZGlyPScgKyByZWRpciArICcsIGZvdW5kPScgKyBmb3VuZCArICcsIHNwYW5zW2ldPScgKyBzcGFuc1tpXSk7XG5cdFx0XHRpZiAoKGZvdW5kICYmICFyZWRpcikgfHwgKCFmb3VuZCAmJiByZWRpcikpIHtcblx0XHRcdFx0Ly8gbG9nKCdza2lwcGluZyB0aGlzIHNldCBvZiB0aGUgbG9vcCcpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHN0cnVjdHVyZWZuID0gc3RydWN0dXJlW3NwYW5zW2ldXTtcblx0XHRcdGlmIChzdHJ1Y3R1cmVmbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIG5vdGhpbmcgdG8gZG8gZm9yIHRoaXMgc3RydWN0dXJlIHBhcnRcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRsZXQgc2V0Zm4gPSBzZXRQb3B1cEhUTUw7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwQWN0aXZlTmF2bGlua3MnKSAmJlxuXHRcdFx0XHQoc3BhbnNbaV0uaW5kZXhPZigncG9wdXBUb3BMaW5rcycpID09PSAwIHx8IHNwYW5zW2ldLmluZGV4T2YoJ3BvcHVwUmVkaXJUb3BMaW5rcycpID09PSAwKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNldGZuID0gc2V0UG9wdXBUaXBzQW5kSFRNTDtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAodHlwZW9mIHN0cnVjdHVyZWZuKSB7XG5cdFx0XHRcdGNhc2UgJ2Z1bmN0aW9uJzpcblx0XHRcdFx0XHRsb2coYHJ1bm5pbmcgJHtzcGFuc1tpXX0oe1xuXHRcdFx0XHRcdFx0YXJ0aWNsZToke3guYXJ0aWNsZX0sIGhpbnQ6JHt4LmhpbnR9LCBvbGRpZDogJHt4Lm9sZGlkfX0pYCk7XG5cdFx0XHRcdFx0c2V0Zm4oc3RydWN0dXJlZm4oeCksIHNwYW5zW2ldLCBhcmdzLm5hdnBvcHVwLmlkTnVtYmVyKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnc3RyaW5nJzpcblx0XHRcdFx0XHRzZXRmbihzdHJ1Y3R1cmVmbiwgc3BhbnNbaV0sIGFyZ3MubmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGVycmxvZyhgdW5rbm93biB0aGluZyB3aXRoIGxhYmVsICR7c3BhbnNbaV19IChzcGFuIGluZGV4IHdhcyAke2l9KWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Ly8gZmxhdHRlbiBhbiBhcnJheVxuXHRjb25zdCBmbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbihsaXN0LCBzdGFydCkge1xuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzdGFydCA9IDA7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICh0eXBlb2YgbGlzdFtpXSA9PT0gdHlwZW9mIFtdKSB7XG5cdFx0XHRcdHJldHVybiBbLi4ucmV0LCAuLi5mbGF0dGVuKGxpc3RbaV0pLCAuLi5mbGF0dGVuKGxpc3QsIGkgKyAxKV07XG5cdFx0XHR9XG5cdFx0XHRyZXQucHVzaChsaXN0W2ldKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Ly8gR2VuZXJhdGUgaHRtbCBmb3Igd2hvbGUgcG9wdXBcblx0Y29uc3QgcG9wdXBIVE1MID0gZnVuY3Rpb24gcG9wdXBIVE1MKGEpIHtcblx0XHRnZXRWYWx1ZU9mKCdwb3B1cFN0cnVjdHVyZScpO1xuXHRcdGNvbnN0IHN0cnVjdHVyZSA9IHBnLnN0cnVjdHVyZXNbcGcub3B0aW9uLnBvcHVwU3RydWN0dXJlXTtcblx0XHRpZiAodHlwZW9mIHN0cnVjdHVyZSAhPT0gJ29iamVjdCcpIHtcblx0XHRcdC8vIHJldHVybiAnVW5rbm93biBzdHJ1Y3R1cmU6ICcrcGcub3B0aW9uLnBvcHVwU3RydWN0dXJlO1xuXHRcdFx0Ly8gb3ZlcnJpZGUgdXNlciBjaG9pY2Vcblx0XHRcdHBnLm9wdGlvbi5wb3B1cFN0cnVjdHVyZSA9IHBnLm9wdGlvbkRlZmF1bHQucG9wdXBTdHJ1Y3R1cmU7XG5cdFx0XHRyZXR1cm4gcG9wdXBIVE1MKGEpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHN0cnVjdHVyZS5wb3B1cExheW91dCAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuICdCYWQgbGF5b3V0Jztcblx0XHR9XG5cdFx0cGcubWlzYy5sYXlvdXQgPSBzdHJ1Y3R1cmUucG9wdXBMYXlvdXQoKTtcblx0XHRwZy5taXNjLnJlZGlyU3BhbnMgPSB0eXBlb2Ygc3RydWN0dXJlLnBvcHVwUmVkaXJTcGFucyA9PT0gJ2Z1bmN0aW9uJyA/IHN0cnVjdHVyZS5wb3B1cFJlZGlyU3BhbnMoKSA6IFtdO1xuXHRcdHJldHVybiBtYWtlRW1wdHlTcGFucyhwZy5taXNjLmxheW91dCwgYS5uYXZwb3B1cCk7XG5cdH07XG5cdGNvbnN0IG1ha2VFbXB0eVNwYW5zID0gZnVuY3Rpb24gbWFrZUVtcHR5U3BhbnMobGlzdCwgbmF2cG9wKSB7XG5cdFx0bGV0IHJldCA9ICcnO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBsaXN0KSB7XG5cdFx0XHRpZiAodHlwZW9mIGVsZW1lbnQgPT09IHR5cGVvZiAnJykge1xuXHRcdFx0XHRyZXQgKz0gZW1wdHlTcGFuSFRNTChlbGVtZW50LCBuYXZwb3AuaWROdW1iZXIsICdkaXYnKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09IHR5cGVvZiBbXSAmJiBlbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0ID0gcmV0LnNwbGl0KC8oPFxcL1tePl0qPz4kKS8pLmpvaW4obWFrZUVtcHR5U3BhbnMoZWxlbWVudCwgbmF2cG9wKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlb2Yge30gJiYgZWxlbWVudC5ub2RlVHlwZSkge1xuXHRcdFx0XHRyZXQgKz0gZW1wdHlTcGFuSFRNTChlbGVtZW50Lm5hbWUsIG5hdnBvcC5pZE51bWJlciwgZWxlbWVudC5ub2RlVHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IGVtcHR5U3BhbkhUTUwgPSBmdW5jdGlvbiBlbXB0eVNwYW5IVE1MKG5hbWUsIGlkLCB0YWcsIGNsYXNzbmFtZSkge1xuXHRcdHRhZyB8fD0gJ3NwYW4nO1xuXHRcdGlmICghY2xhc3NuYW1lKSB7XG5cdFx0XHRjbGFzc25hbWUgPSBlbXB0eVNwYW5IVE1MLmNsYXNzQWxpYXNlc1tuYW1lXTtcblx0XHR9XG5cdFx0Y2xhc3NuYW1lIHx8PSBuYW1lO1xuXHRcdGlmIChuYW1lID09PSBnZXRWYWx1ZU9mKCdwb3B1cERyYWdIYW5kbGUnKSkge1xuXHRcdFx0Y2xhc3NuYW1lICs9ICcgcG9wdXBEcmFnSGFuZGxlJztcblx0XHR9XG5cdFx0cmV0dXJuIHNpbXBsZVByaW50ZignPCVzIGlkPVwiJXNcIiBjbGFzcz1cIiVzXCI+PC8lcz4nLCBbdGFnLCBuYW1lICsgaWQsIGNsYXNzbmFtZSwgdGFnXSk7XG5cdH07XG5cdGVtcHR5U3BhbkhUTUwuY2xhc3NBbGlhc2VzID0ge1xuXHRcdHBvcHVwU2Vjb25kUHJldmlldzogJ3BvcHVwUHJldmlldycsXG5cdH07XG5cdC8vIGdlbmVyYXRlIGh0bWwgZm9yIHBvcHVwIGltYWdlXG5cdC8vIDxhIGlkPVwicG9wdXBJbWFnZUxpbmtuXCI+PGltZyBpZD1cInBvcHVwSW1hZ2VuXCI+XG5cdC8vIHdoZXJlIG49aWROdW1iZXJcblx0Y29uc3QgaW1hZ2VIVE1MID0gKF9hcnRpY2xlLCBpZE51bWJlcikgPT4ge1xuXHRcdHJldHVybiBzaW1wbGVQcmludGYoXG5cdFx0XHQnPGEgaWQ9XCJwb3B1cEltYWdlTGluayQxXCI+JyArXG5cdFx0XHRcdCc8aW1nIGFsaWduPVwicmlnaHRcIiB2YWxpZ249XCJ0b3BcIiBpZD1cInBvcHVwSW1nJDFcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvaW1nPicgK1xuXHRcdFx0XHQnPC9hPicsXG5cdFx0XHRbaWROdW1iZXJdXG5cdFx0KTtcblx0fTtcblx0Y29uc3QgcG9wVGlwc1Nvb25GbiA9IChpZCwgd2hlbiwgcG9wRGF0YSkgPT4ge1xuXHRcdGlmICghd2hlbikge1xuXHRcdFx0d2hlbiA9IDI1MDtcblx0XHR9XG5cdFx0Y29uc3QgcG9wVGlwcyA9ICgpID0+IHtcblx0XHRcdHNldHVwVG9vbHRpcHMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9YCksIGZhbHNlLCB0cnVlLCBwb3BEYXRhKTtcblx0XHR9O1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRzZXRUaW1lb3V0KHBvcFRpcHMsIHdoZW4sIHBvcERhdGEpO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IHNldFBvcHVwVGlwc0FuZEhUTUwgPSAoaHRtbCwgZGl2bmFtZSwgaWRudW1iZXIsIHBvcERhdGEpID0+IHtcblx0XHRzZXRQb3B1cEhUTUwoXG5cdFx0XHRodG1sLFxuXHRcdFx0ZGl2bmFtZSxcblx0XHRcdGlkbnVtYmVyLFxuXHRcdFx0Z2V0VmFsdWVPZigncG9wdXBTdWJwb3B1cHMnKSA/IHBvcFRpcHNTb29uRm4oZGl2bmFtZSArIGlkbnVtYmVyLCBudWxsLCBwb3BEYXRhKSA6IG51bGxcblx0XHQpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBodG1sb3V0cHV0LmpzXG5cdC8vIFNUQVJURklMRTogbW91c2VvdXQuanNcblx0Ly8gZnV6enkgY2hlY2tzXG5cdGNvbnN0IGZ1enp5Q3Vyc29yT2ZmTWVudXMgPSAoX3gsIF95LCBfZnV6eiwgcGFyZW50KSA9PiB7XG5cdFx0aWYgKCFwYXJlbnQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCB1bHMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbCgndWwnKTtcblx0XHRmb3IgKGNvbnN0IHVsIG9mIHVscykge1xuXHRcdFx0aWYgKHVsLmNsYXNzTmFtZSA9PT0gJ3BvcHVwX21lbnUnICYmIHVsLm9mZnNldFdpZHRoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IC8vIGVsc2UgeyBkb2N1bWVudC50aXRsZSs9Jy4nOyB9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXHRjb25zdCBjaGVja1BvcHVwUG9zaXRpb24gPSAoKSA9PiB7XG5cdFx0Ly8gc3RvcCB0aGUgcG9wdXAgcnVubmluZyBvZmYgdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW5cblx0XHQvLyBGSVhNRSBhdm9pZCBwZy5jdXJyZW50Lmxpbmtcblx0XHRpZiAocGcuY3VycmVudC5saW5rICYmIHBnLmN1cnJlbnQubGluay5uYXZwb3B1cCkge1xuXHRcdFx0cGcuY3VycmVudC5saW5rLm5hdnBvcHVwLmxpbWl0SG9yaXpvbnRhbFBvc2l0aW9uKCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBtb3VzZU91dFdpa2lMaW5rID0gZnVuY3Rpb24gbW91c2VPdXRXaWtpTGluaygpIHtcblx0XHQvLyBjb25zb2xlICgnbW91c2VPdXRXaWtpTGluaycpO1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdHJlbW92ZU1vZGlmaWVyS2V5TGlzdGVuZXIoc2VsZik7XG5cdFx0aWYgKHNlbGYubmF2cG9wdXAgPT09IG51bGwgfHwgc2VsZi5uYXZwb3B1cCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghc2VsZi5uYXZwb3B1cC5pc1Zpc2libGUoKSkge1xuXHRcdFx0c2VsZi5uYXZwb3B1cC5iYW5pc2goKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmVzdG9yZVRpdGxlKHNlbGYpO1xuXHRcdE5hdnBvcHVwLnRyYWNrZXIuYWRkSG9vayhwb3NDaGVja2VySG9vayhzZWxmLm5hdnBvcHVwKSk7XG5cdH07XG5cdGNvbnN0IHBvc0NoZWNrZXJIb29rID0gKG5hdnBvcCkgPT4ge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRpZiAoIW5hdnBvcC5pc1Zpc2libGUoKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLyogcmVtb3ZlIHRoaXMgaG9vayAqL1xuXHRcdFx0fVxuXHRcdFx0aWYgKE5hdnBvcHVwLnRyYWNrZXIuZGlydHkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qge3h9ID0gTmF2cG9wdXAudHJhY2tlcjtcblx0XHRcdGNvbnN0IHt5fSA9IE5hdnBvcHVwLnRyYWNrZXI7XG5cdFx0XHRjb25zdCBtb3VzZU92ZXJOYXZwb3AgPVxuXHRcdFx0XHRuYXZwb3AuaXNXaXRoaW4oeCwgeSwgbmF2cG9wLmZ1enosIG5hdnBvcC5tYWluRGl2KSB8fFxuXHRcdFx0XHQhZnV6enlDdXJzb3JPZmZNZW51cyh4LCB5LCBuYXZwb3AuZnV6eiwgbmF2cG9wLm1haW5EaXYpO1xuXHRcdFx0Ly8gRklYTUUgaXQnZCBiZSBwcmV0dGllciB0byBkbyB0aGlzIGludGVybmFsIHRvIHRoZSBOYXZwb3B1cCBvYmplY3RzXG5cdFx0XHRsZXQgdCA9IGdldFZhbHVlT2YoJ3BvcHVwSGlkZURlbGF5Jyk7XG5cdFx0XHRpZiAodCkge1xuXHRcdFx0XHR0ICo9IDEwMDA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXQpIHtcblx0XHRcdFx0aWYgKCFtb3VzZU92ZXJOYXZwb3ApIHtcblx0XHRcdFx0XHRpZiAobmF2cG9wLnBhcmVudEFuY2hvcikge1xuXHRcdFx0XHRcdFx0cmVzdG9yZVRpdGxlKG5hdnBvcC5wYXJlbnRBbmNob3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuYXZwb3AuYmFuaXNoKCk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7IC8qIHJlbW92ZSB0aGlzIGhvb2sgKi9cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHQvLyB3ZSBoYXZlIGEgaGlkZSBkZWxheSBzZXRcblx0XHRcdGNvbnN0IGQgPSBEYXRlLm5vdygpO1xuXHRcdFx0aWYgKCFuYXZwb3AubW91c2VMZWF2aW5nVGltZSkge1xuXHRcdFx0XHRuYXZwb3AubW91c2VMZWF2aW5nVGltZSA9IGQ7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChtb3VzZU92ZXJOYXZwb3ApIHtcblx0XHRcdFx0bmF2cG9wLm1vdXNlTGVhdmluZ1RpbWUgPSBudWxsO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZCAtIG5hdnBvcC5tb3VzZUxlYXZpbmdUaW1lID4gdCkge1xuXHRcdFx0XHRuYXZwb3AubW91c2VMZWF2aW5nVGltZSA9IG51bGw7XG5cdFx0XHRcdG5hdnBvcC5iYW5pc2goKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7IC8qIHJlbW92ZSB0aGlzIGhvb2sgKi9cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXHR9O1xuXHRjb25zdCBydW5TdG9wUG9wdXBUaW1lciA9IChuYXZwb3ApID0+IHtcblx0XHQvLyBhdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBsZWZ0IHRoZSBsaW5rIGJ1dCByZW1haW4gd2l0aGluIHRoZSBwb3B1cFxuXHRcdC8vIHNvIHdlIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiB1bnRpbCB3ZSBsZWF2ZSB0aGUgcG9wdXAuXG5cdFx0aWYgKCFuYXZwb3Auc3RvcFBvcHVwVGltZXIpIHtcblx0XHRcdG5hdnBvcC5zdG9wUG9wdXBUaW1lciA9IHNldEludGVydmFsKHBvc0NoZWNrZXJIb29rKG5hdnBvcCksIDUwMCk7XG5cdFx0XHRuYXZwb3AuYWRkSG9vayhcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwobmF2cG9wLnN0b3BQb3B1cFRpbWVyKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J2hpZGUnLFxuXHRcdFx0XHQnYmVmb3JlJ1xuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdC8vIEVOREZJTEU6IG1vdXNlb3V0LmpzXG5cdC8vIFNUQVJURklMRTogcHJldmlld21ha2VyLmpzXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIERlZmluZXMgdGhlIHtAc291cmNlIFByZXZpZXdtYWtlcn0gb2JqZWN0LCB3aGljaCBnZW5lcmF0ZXMgc2hvcnQgcHJldmlld3MgZnJvbSB3aWtpIG1hcmt1cC5cblx0ICovXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFByZXZpZXdtYWtlclxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQGNsYXNzIFRoZSBQcmV2aWV3bWFrZXIgY2xhc3MuIFVzZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHRvIGdlbmVyYXRlIHNob3J0IHByZXZpZXdzIGZyb20gV2lraXRleHQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB3aWtpVGV4dCBUaGUgV2lraXRleHQgc291cmNlIG9mIHRoZSBwYWdlIHdlIHdpc2ggdG8gcHJldmlldy5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVcmwgVGhlIHVybCB3ZSBzaG91bGQgcHJlcGVuZCB3aGVuIGNyZWF0aW5nIHJlbGF0aXZlIHVybHMuXG5cdCAqIEBwYXJhbSB7TmF2cG9wdXB9IG93bmVyIFRoZSBuYXZwb3AgYXNzb2NpYXRlZCB0byB0aGlzIHByZXZpZXcgZ2VuZXJhdG9yXG5cdCAqL1xuXHRjbGFzcyBQcmV2aWV3bWFrZXIge1xuXHRcdGNvbnN0cnVjdG9yKHdpa2lUZXh0LCBiYXNlVXJsLCBvd25lcikge1xuXHRcdFx0LyoqIFRoZSB3aWtpdGV4dCB3aGljaCBpcyBtYW5pcHVsYXRlZCB0byBnZW5lcmF0ZSB0aGUgcHJldmlldy4gKi9cblx0XHRcdHRoaXMub3JpZ2luYWxEYXRhID0gd2lraVRleHQ7XG5cdFx0XHR0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHRcdFx0dGhpcy5vd25lciA9IG93bmVyO1xuXHRcdFx0dGhpcy5tYXhDaGFyYWN0ZXJzID0gZ2V0VmFsdWVPZigncG9wdXBNYXhQcmV2aWV3Q2hhcmFjdGVycycpO1xuXHRcdFx0dGhpcy5tYXhTZW50ZW5jZXMgPSBnZXRWYWx1ZU9mKCdwb3B1cE1heFByZXZpZXdTZW50ZW5jZXMnKTtcblx0XHRcdHRoaXMuc2V0RGF0YSgpO1xuXHRcdH1cblx0XHRzZXREYXRhKCkge1xuXHRcdFx0Y29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KDFlNCwgMiAqIHRoaXMubWF4Q2hhcmFjdGVycyk7XG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLm9yaWdpbmFsRGF0YS5zbGljZSgwLCBNYXRoLm1heCgwLCBtYXhTaXplKSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJlbW92ZSBIVE1MIGNvbW1lbnRzXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxDb21tZW50cygpIHtcblx0XHRcdC8vIHRoaXMgYWxzbyBraWxscyBvbmUgdHJhaWxpbmcgbmV3bGluZSwgZWcgW1tkaWFteW9dXVxuXHRcdFx0dGhpcy5kYXRhID0gdGhpcy5kYXRhLnJlcGxhY2UoL148IS0tW14kXSo/LS0+XFxufFxcbjwhLS1bXiRdKj8tLT4oPz1cXG4pfDwhLS1bXiRdKj8tLT4vZywgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxEaXZzKCkge1xuXHRcdFx0Ly8gc2F5IGdvb2RieWUsIGRpdnMgKGNhbiBiZSBuZXN0ZWQsIHNvIHVzZSAqIG5vdCAqPylcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC88ICpkaXZbXj5dKiAqPltcXFNcXHNdKj88ICpcXC8gKmRpdiAqPi9naSwgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxHYWxsZXJpZXMoKSB7XG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvPCAqZ2FsbGVyeVtePl0qICo+W1xcU1xcc10qPzwgKlxcLyAqZ2FsbGVyeSAqPi9naSwgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3BlbmluZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBjbG9zaW5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN1Ym9wZW5pbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3ViY2xvc2luZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSByZXBsXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRraWxsKG9wZW5pbmcsIGNsb3NpbmcsIHN1Ym9wZW5pbmcsIHN1YmNsb3NpbmcsIHJlcGwpIHtcblx0XHRcdGxldCBvbGRrID0gdGhpcy5kYXRhO1xuXHRcdFx0bGV0IGsgPSBQcmV2aWV3bWFrZXIua2lsbFN0dWZmKHRoaXMuZGF0YSwgb3BlbmluZywgY2xvc2luZywgc3Vib3BlbmluZywgc3ViY2xvc2luZywgcmVwbCk7XG5cdFx0XHR3aGlsZSAoay5sZW5ndGggPCBvbGRrLmxlbmd0aCkge1xuXHRcdFx0XHRvbGRrID0gaztcblx0XHRcdFx0ayA9IFByZXZpZXdtYWtlci5raWxsU3R1ZmYoaywgb3BlbmluZywgY2xvc2luZywgc3Vib3BlbmluZywgc3ViY2xvc2luZywgcmVwbCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRhdGEgPSBrO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gdHh0XG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wZW5pbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gY2xvc2luZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdWJvcGVuaW5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN1YmNsb3Npbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gcmVwbFxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0c3RhdGljIGtpbGxTdHVmZih0eHQsIG9wZW5pbmcsIGNsb3NpbmcsIHN1Ym9wZW5pbmcsIHN1YmNsb3NpbmcsIHJlcGwpIHtcblx0XHRcdGNvbnN0IG9wID0gUHJldmlld21ha2VyLm1ha2VSZWdleHAob3BlbmluZyk7XG5cdFx0XHRjb25zdCBjbCA9IFByZXZpZXdtYWtlci5tYWtlUmVnZXhwKGNsb3NpbmcsICdeJyk7XG5cdFx0XHRjb25zdCBzYiA9IHN1Ym9wZW5pbmcgPyBQcmV2aWV3bWFrZXIubWFrZVJlZ2V4cChzdWJvcGVuaW5nLCAnXicpIDogbnVsbDtcblx0XHRcdGNvbnN0IHNjID0gc3ViY2xvc2luZyA/IFByZXZpZXdtYWtlci5tYWtlUmVnZXhwKHN1YmNsb3NpbmcsICdeJykgOiBjbDtcblx0XHRcdGlmICghb3AgfHwgIWNsKSB7XG5cdFx0XHRcdHZvaWQgbXcubm90aWZ5KCdOYXZpZ2F0aW9uIFBvcHVwcyBlcnJvcjogb3Agb3IgY2wgaXMgbnVsbCEgc29tZXRoaW5nIGlzIHdyb25nLicsIHtcblx0XHRcdFx0XHR0YWc6ICdwb3B1cHMnLFxuXHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9wLnRlc3QodHh0KSkge1xuXHRcdFx0XHRyZXR1cm4gdHh0O1xuXHRcdFx0fVxuXHRcdFx0bGV0IHJldCA9ICcnO1xuXHRcdFx0Y29uc3Qgb3BSZXN1bHQgPSBvcC5leGVjKHR4dCk7XG5cdFx0XHRyZXQgPSB0eHQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgb3BSZXN1bHQuaW5kZXgpKTtcblx0XHRcdHR4dCA9IHR4dC5zbGljZShNYXRoLm1heCgwLCBvcFJlc3VsdC5pbmRleCArIG9wUmVzdWx0WzBdLmxlbmd0aCkpO1xuXHRcdFx0bGV0IGRlcHRoID0gMTtcblx0XHRcdHdoaWxlICh0eHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsZXQgcmVtb3ZhbCA9IDA7XG5cdFx0XHRcdGlmIChkZXB0aCA9PT0gMSAmJiBjbC50ZXN0KHR4dCkpIHtcblx0XHRcdFx0XHRkZXB0aC0tO1xuXHRcdFx0XHRcdHJlbW92YWwgPSBjbC5leGVjKHR4dClbMF0ubGVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGRlcHRoID4gMSAmJiBzYy50ZXN0KHR4dCkpIHtcblx0XHRcdFx0XHRkZXB0aC0tO1xuXHRcdFx0XHRcdHJlbW92YWwgPSBzYy5leGVjKHR4dClbMF0ubGVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNiICYmIHNiLnRlc3QodHh0KSkge1xuXHRcdFx0XHRcdGRlcHRoKys7XG5cdFx0XHRcdFx0cmVtb3ZhbCA9IHNiLmV4ZWModHh0KVswXS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFyZW1vdmFsKSB7XG5cdFx0XHRcdFx0cmVtb3ZhbCA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0dHh0ID0gdHh0LnNsaWNlKE1hdGgubWF4KDAsIHJlbW92YWwpKTtcblx0XHRcdFx0aWYgKGRlcHRoID09PSAwKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQgKyAocmVwbCB8fCAnJykgKyB0eHQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0geFxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gcHJlZml4XG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8UmVnRXhwfSBzdWZmaXhcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHN0YXRpYyBtYWtlUmVnZXhwKHgsIHByZWZpeCwgc3VmZml4KSB7XG5cdFx0XHRwcmVmaXggfHw9ICcnO1xuXHRcdFx0c3VmZml4IHx8PSAnJztcblx0XHRcdGxldCByZVN0ciA9ICcnO1xuXHRcdFx0bGV0IGZsYWdzID0gJyc7XG5cdFx0XHRpZiAoaXNTdHJpbmcoeCkpIHtcblx0XHRcdFx0cmVTdHIgPSBwcmVmaXggKyBsaXRlcmFsaXplUmVnZXgoeCkgKyBzdWZmaXg7XG5cdFx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKHgpKSB7XG5cdFx0XHRcdGxldCBzID0geC50b1N0cmluZygpLnNsaWNlKDEpO1xuXHRcdFx0XHRjb25zdCBzcCA9IHMuc3BsaXQoJy8nKTtcblx0XHRcdFx0ZmxhZ3MgPSBzcC5hdCgtMSk7XG5cdFx0XHRcdHNwW3NwLmxlbmd0aCAtIDFdID0gJyc7XG5cdFx0XHRcdHMgPSBzcC5qb2luKCcvJyk7XG5cdFx0XHRcdHMgPSBzLnNsaWNlKDAsIE1hdGgubWF4KDAsIHMubGVuZ3RoIC0gMSkpO1xuXHRcdFx0XHRyZVN0ciA9IHByZWZpeCArIHMgKyBzdWZmaXg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsb2coJ21ha2VSZWdleHAgZmFpbGVkJyk7XG5cdFx0XHR9XG5cdFx0XHRsb2coYG1ha2VSZWdleHA6IGdvdCByZVN0cj0ke3JlU3RyfSwgZmxhZ3M9JHtmbGFnc31gKTtcblx0XHRcdHJldHVybiBuZXcgUmVnRXhwKHJlU3RyLCBmbGFncyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEJveFRlbXBsYXRlcygpIHtcblx0XHRcdC8vIHRheG9ib3ggcmVtb3ZhbC4uLiBpbiBmYWN0LCB0aGVyZSdzIGEgc2F1ZGlwcmluY2Vib3hfYmVnaW4sIHNvIGxldCdzIGJlIG1vcmUgZ2VuZXJhbFxuXHRcdFx0Ly8gYWxzbywgaGF2ZSBmbG9hdF9iZWdpbiwgLi4uIGZsb2F0X2VuZFxuXHRcdFx0dGhpcy5raWxsKC97e1teXFxze3x9XSo/KGZsb2F0fGJveClbIF9dKGJlZ2lufHN0YXJ0KS9pLCAvfX1cXHMqLywgJ3t7Jyk7XG5cdFx0XHQvLyBpbmZvYm94ZXMgZXRjXG5cdFx0XHQvLyBmcm9tIFp5eHc6IGtpbGwgZnJhbWVzIHRvb1xuXHRcdFx0dGhpcy5raWxsKC97e1teXFxze3x9XSo/KGluZm9ib3h8ZWxlbWVudGJveHxmcmFtZSlbIF9dL2ksIC99fVxccyovLCAne3snKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRraWxsVGVtcGxhdGVzKCkge1xuXHRcdFx0dGhpcy5raWxsKCd7eycsICd9fScsICd7JywgJ30nLCAnICcpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxUYWJsZXMoKSB7XG5cdFx0XHQvLyB0YWJsZXMgYXJlIGJhZCwgdG9vXG5cdFx0XHQvLyB0aGlzIGNhbiBiZSBzbG93LCBidXQgaXQncyBhbiBpbnByb3ZlbWVudCBvdmVyIGEgYnJvd3NlciBoYW5nXG5cdFx0XHQvLyB0b3J0dXJlIHRlc3Q6IFtbQ29tcGFyaXNvbl9vZl9JbnRlbF9DZW50cmFsX1Byb2Nlc3NpbmdfVW5pdHNdXVxuXHRcdFx0dGhpcy5raWxsKCd7fCcsIC9cXHx9XFxzKi8sICd7fCcpO1xuXHRcdFx0dGhpcy5raWxsKC88dGFibGUuKj8+L2ksIC88XFwvdGFibGUuKj8+L2ksIC88dGFibGUuKj8+L2kpO1xuXHRcdFx0Ly8gcmVtb3ZlIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBwaXBlIGZvciB0aGUgaGVsbCBvZiBpdCAoPylcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eXFx8LiokL2dtLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEltYWdlcygpIHtcblx0XHRcdGNvbnN0IGZvcmJpZGRlbk5hbWVzcGFjZUFsaWFzZXMgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgW2xvY2FsaXplZE5hbWVzcGFjZUxjLCBuYW1lc3BhY2VJZF0gb2YgT2JqZWN0LmVudHJpZXMobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKSkpIHtcblx0XHRcdFx0aWYgKG5hbWVzcGFjZUlkICE9PSBwZy5uc0ltYWdlSWQgJiYgbmFtZXNwYWNlSWQgIT09IHBnLm5zQ2F0ZWdvcnlJZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JiaWRkZW5OYW1lc3BhY2VBbGlhc2VzLnB1c2gobG9jYWxpemVkTmFtZXNwYWNlTGMuc3BsaXQoJyAnKS5qb2luKCdbIF9dJykpOyAvLyB0b2RvOiBlc2NhcGUgcmVnZXhwIGZyYWdtZW50cyFcblx0XHRcdH1cblx0XHRcdC8vIGltYWdlcyBhbmQgY2F0ZWdvcmllcyBhcmUgYSBub25vXG5cdFx0XHR0aGlzLmtpbGwobmV3IFJlZ0V4cChgW1tdW1tdXFxcXHMqKCR7Zm9yYmlkZGVuTmFtZXNwYWNlQWxpYXNlcy5qb2luKCd8Jyl9KVxcXFxzKjpgLCAnaScpLCAvXV1cXHMqLywgJ1snLCAnXScpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxIVE1MKCkge1xuXHRcdFx0Ly8ga2lsbCA8cmVmIC4uLj4uLi48L3JlZj5cblx0XHRcdHRoaXMua2lsbCgvPHJlZlxcYlteLz5dKj8+L2ksIC88XFwvcmVmPi9pKTtcblx0XHRcdC8vIGxldCdzIGFsc28gZGVsZXRlIGVudGlyZSBsaW5lcyBzdGFydGluZyB3aXRoIDwuIGl0J3Mgd29ydGggYSB0cnkuXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKF58XFxuKSAqPC4qL2csICdcXG4nKTtcblx0XHRcdC8vIGFuZCB0aG9zZSBwZXNreSBodG1sIHRhZ3MsIGJ1dCBub3Qgbm93aWtpIG9yIGJsb2NrcXVvdGUgdGFnc1xuXHRcdFx0Y29uc3Qgc3BsaXR0ZWQgPSB0aGlzLmRhdGEuc3BsaXQoLyg8W1xcV1xcd10qPyg/Oj58JHwoPz08KSkpLyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdHRlZC5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSArPSAyKSB7XG5cdFx0XHRcdHN3aXRjaCAoc3BsaXR0ZWRbaV0pIHtcblx0XHRcdFx0XHRjYXNlICc8bm8nLmNvbmNhdCgnd2lraScsICc+Jyk6XG5cdFx0XHRcdFx0Y2FzZSAnPC9ubycuY29uY2F0KCd3aWtpJywgJz4nKTpcblx0XHRcdFx0XHRjYXNlICc8YmxvY2snLmNvbmNhdCgncXVvdGUnLCAnPicpOlxuXHRcdFx0XHRcdGNhc2UgJzwvYmxvY2snLmNvbmNhdCgncXVvdGUnLCAnPicpOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHNwbGl0dGVkW2ldID0gJyc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuZGF0YSA9IHNwbGl0dGVkLmpvaW4oJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxDaHVua3MoKSB7XG5cdFx0XHQvLyBoZXVyaXN0aWNzIGFsZXJ0XG5cdFx0XHQvLyBjaHVua3Mgb2YgaXRhbGljIHRleHQ/IHlvdSBjcmF6eSwgbWFuP1xuXHRcdFx0Y29uc3QgaXRhbGljQ2h1bmtSZWdleCA9IC8oKF58XFxuKVxccyo6KlxccyonJ1teJ10oW14nXXwnJyd8J1teJ10pezIwfSgufFxcblteXFxuXSkqJydbXFxzIS4/XSpcXG4pKy9nO1xuXHRcdFx0Ly8ga2VlcCBzdHVmZiBzZXBhcmF0ZWQsIHRob3VnaCwgc28gc3RpY2sgaW4gXFxuIChmaXhlcyBbW1VuaW9uIEphY2tdXT9cblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKGl0YWxpY0NodW5rUmVnZXgsICdcXG4nKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRtb3B1cCgpIHtcblx0XHRcdC8vIHdlIHNpbXBseSAqY2FuJ3QqIGJlIGRvaW5nIHdpdGggaG9yaXpvbnRhbCBydWxlcyByaWdodCBub3dcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eLXs0LH0vZ20sICcnKTtcblx0XHRcdC8vIG5vIGluZGVudGVkIGxpbmVzXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKF58XFxuKSAqOlteXFxuXSovZywgJycpO1xuXHRcdFx0Ly8gcmVwbGFjZSBfX1RPQ19fLCBfX05PVE9DX18gYW5kIHdoYXRldmVyIGVsc2UgdGhlcmUgaXNcblx0XHRcdC8vIHRoaXMnbGwgcHJvYmFibHkgZG9cblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eX19bX2Etel0qX18gKiQvZ2ltLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Zmlyc3RCaXQoKSB7XG5cdFx0XHQvLyBkb250J3QgYmUgZ2l2aW4nIG1lIG5vIHN1YnNlcXVlbnQgcGFyYWdyYXBocywgeW91IGhlYXIgbWU/XG5cdFx0XHQvLyAvIGZpcnN0IHdlIFwibm9ybWFsaXplXCIgc2VjdGlvbiBoZWFkaW5ncywgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhZnRlciwgYWRkaW5nIGJlZm9yZVxuXHRcdFx0bGV0IGQgPSB0aGlzLmRhdGE7XG5cdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3Q3V0SGVhZGluZ3MnKSkge1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXFxzKig9PStbXj1dKj09KylcXHMqL2csICdcXG5cXG4kMSAnKTtcblx0XHRcdFx0Ly8gLyB0aGVuIHdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBwYXJhZ3JhcGggYnJlYWtzIHdob3NlIHRleHQgZW5kcyBiYWRseVxuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKFs6O10pICpcXG57Mix9L2csICckMVxcbicpO1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXlxccyovLCAnJyk7XG5cdFx0XHRcdGNvbnN0IHN0dWZmID0gL14oW15cXG5dfFxcblxcUykqLy5leGVjKHRoaXMuZGF0YSk7XG5cdFx0XHRcdGlmIChzdHVmZikge1xuXHRcdFx0XHRcdFtkXSA9IHN0dWZmO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3Rmlyc3RQYXJPbmx5JykpIHtcblx0XHRcdFx0XHRkID0gdGhpcy5kYXRhO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIC8gbm93IHB1dCBcXG5cXG4gYWZ0ZXIgc2VjdGlvbnMgc28gdGhhdCBidWxsZXRzIGFuZCBudW1iZXJlZCBsaXN0cyB3b3JrXG5cdFx0XHRcdGQgPSBkLnJlcGxhY2UoLyg9PStbXj1dKj09KylcXHMqL2csICckMVxcblxcbicpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3BsaXQgc2VudGVuY2VzLiBTdXBlcmZsdW91cyBzZW50ZW5jZXMgYXJlIFJJR0hUIE9VVC5cblx0XHRcdC8vIG5vdGU6IGV4YWN0bHkgMSBzZXQgb2YgcGFyZW5zIGhlcmUgbmVlZGVkIHRvIG1ha2UgdGhlIHNsaWNlIHdvcmtcblx0XHRcdGQgPSBkLnNwbGl0KC8oWyEuP10rW1wiJ10qXFxzKS9nKTtcblx0XHRcdC8vIGxlYWRpbmcgc3BhY2UgaXMgYmFkLCBtbWtheT9cblx0XHRcdGRbMF0gPSBkWzBdLnJlcGxhY2UoL15cXHMqLywgJycpO1xuXHRcdFx0Y29uc3Qgbm90U2VudGVuY2VFbmRzID0gLyhbXi5dW2Etel1cXC4gKlthLXpdfGV0Y3xzaWN8ZHJ8bXJ8bXJzfG1zfHN0fG5vfG9wfGNpdHxcXFtbXlxcXV0qfFxcc1thLXpdKSQvaTtcblx0XHRcdGQgPSB0aGlzLmZpeFNlbnRlbmNlRW5kcyhkLCBub3RTZW50ZW5jZUVuZHMpO1xuXHRcdFx0dGhpcy5mdWxsTGVuZ3RoID0gZC5qb2luKCcnKS5sZW5ndGg7XG5cdFx0XHRsZXQgbiA9IHRoaXMubWF4U2VudGVuY2VzO1xuXHRcdFx0bGV0IGRkID0gUHJldmlld21ha2VyLmZpcnN0U2VudGVuY2VzKGQsIG4pO1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHRkZCA9IFByZXZpZXdtYWtlci5maXJzdFNlbnRlbmNlcyhkLCBuKTtcblx0XHRcdFx0LS1uO1xuXHRcdFx0fSB3aGlsZSAoZGQubGVuZ3RoID4gdGhpcy5tYXhDaGFyYWN0ZXJzICYmIG4gIT09IDApO1xuXHRcdFx0dGhpcy5kYXRhID0gZGQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJzXG5cdFx0ICogQHBhcmFtIHtSZWdFeHB9IHJlZ1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Zml4U2VudGVuY2VFbmRzKHN0cnMsIHJlZykge1xuXHRcdFx0Ly8gdGFrZSBhbiBhcnJheSBvZiBzdHJpbmdzLCBzdHJzXG5cdFx0XHQvLyBqb2luIHN0cnNbaV0gdG8gc3Ryc1tpKzFdICYgc3Ryc1tpKzJdIGlmIHN0cnNbaV0gbWF0Y2hlcyByZWdleCByZWdcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGggLSAyOyArK2kpIHtcblx0XHRcdFx0aWYgKHJlZy50ZXN0KHN0cnNbaV0pKSB7XG5cdFx0XHRcdFx0Y29uc3QgYSA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgc3Rycy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHRcdFx0aWYgKGogPCBpKSB7XG5cdFx0XHRcdFx0XHRcdGFbal0gPSBzdHJzW2pdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGogPT09IGkpIHtcblx0XHRcdFx0XHRcdFx0YVtpXSA9IHN0cnNbaV0gKyBzdHJzW2kgKyAxXSArIHN0cnNbaSArIDJdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGogPiBpICsgMikge1xuXHRcdFx0XHRcdFx0XHRhW2ogLSAyXSA9IHN0cnNbal07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmZpeFNlbnRlbmNlRW5kcyhhLCByZWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3Rycztcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmdbXX0gc3Ryc1xuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBob3dtYW55XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMgZmlyc3RTZW50ZW5jZXMoc3RycywgaG93bWFueSkge1xuXHRcdFx0Y29uc3QgdCA9IHN0cnMuc2xpY2UoMCwgMiAqIGhvd21hbnkpO1xuXHRcdFx0cmV0dXJuIHQuam9pbignJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEJhZFdoaXRlc3BhY2UoKSB7XG5cdFx0XHQvLyBhbHNvIGNsZWFucyB1cCBpc29sYXRlZCAnJycnXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXiAqJysgKiQvZ20sICcnKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUnVucyB0aGUgdmFyaW91cyBtZXRob2RzIHRvIGdlbmVyYXRlIHRoZSBwcmV2aWV3LlxuXHRcdCAqIFRoZSBwcmV2aWV3IGlzIHN0b3JlZCBpbiB0aGUgPGNvZGU+aHRtbDwvaHRtbD4gZmllbGQuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG1ha2VQcmV2aWV3KCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLm93bmVyLmFydGljbGUubmFtZXNwYWNlSWQoKSAhPT0gcGcubnNUZW1wbGF0ZUlkICYmXG5cdFx0XHRcdHRoaXMub3duZXIuYXJ0aWNsZS5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc0ltYWdlSWRcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmtpbGxDb21tZW50cygpO1xuXHRcdFx0XHR0aGlzLmtpbGxEaXZzKCk7XG5cdFx0XHRcdHRoaXMua2lsbEdhbGxlcmllcygpO1xuXHRcdFx0XHR0aGlzLmtpbGxCb3hUZW1wbGF0ZXMoKTtcblx0XHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld0tpbGxUZW1wbGF0ZXMnKSkge1xuXHRcdFx0XHRcdHRoaXMua2lsbFRlbXBsYXRlcygpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMua2lsbE11bHRpbGluZVRlbXBsYXRlcygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMua2lsbFRhYmxlcygpO1xuXHRcdFx0XHR0aGlzLmtpbGxJbWFnZXMoKTtcblx0XHRcdFx0dGhpcy5raWxsSFRNTCgpO1xuXHRcdFx0XHR0aGlzLmtpbGxDaHVua3MoKTtcblx0XHRcdFx0dGhpcy5tb3B1cCgpO1xuXHRcdFx0XHR0aGlzLmZpcnN0Qml0KCk7XG5cdFx0XHRcdHRoaXMua2lsbEJhZFdoaXRlc3BhY2UoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMua2lsbEhUTUwoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaHRtbCA9IHdpa2kyaHRtbCh0aGlzLmRhdGEsIHRoaXMuYmFzZVVybCk7IC8vIG5lZWRzIGxpdmVwcmV2aWV3XG5cdFx0XHR0aGlzLmZpeEhUTUwoKTtcblx0XHRcdHRoaXMuc3RyaXBMb25nVGVtcGxhdGVzKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMgZXNXaWtpMkh0bWxQYXJ0KGRhdGEpIHtcblx0XHRcdGNvbnN0IHJlTGlua3MgPSAvKD86XFxbXFxbKFteXFxdfF0qKSg/OlxcfChbXlxcXXxdKikpKl1dKFthLXpdKikpL2dpOyAvLyBtYXRjaCBhIHdpa2lsaW5rXG5cdFx0XHRyZUxpbmtzLmxhc3RJbmRleCA9IDA7IC8vIHJlc2V0IHJlZ2V4XG5cdFx0XHRsZXQgbWF0Y2g7XG5cdFx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cdFx0XHRsZXQgcG9zdGZpeEluZGV4ID0gMDtcblx0XHRcdHdoaWxlICgobWF0Y2ggPSByZUxpbmtzLmV4ZWMoZGF0YSkpICE9PSBudWxsKSB7XG5cdFx0XHRcdC8vIG1hdGNoIGFsbCB3aWtpbGlua3Ncblx0XHRcdFx0Ly8gRklYTUU6IHRoZSB3YXkgdGhhdCBsaW5rIGlzIGJ1aWx0IGhlcmUgaXNuJ3QgcGVyZmVjdC4gSXQgaXMgY2xpY2thYmxlLCBidXQgcG9wdXBzIHByZXZpZXcgd29uJ3QgcmVjb2duaXplIGl0IGluIHNvbWUgY2FzZXMuXG5cdFx0XHRcdHJlc3VsdCArPSBgJHtwZy5lc2NhcGVRdW90ZXNIVE1MKGRhdGEuc3Vic3RyaW5nKHBvc3RmaXhJbmRleCwgbWF0Y2guaW5kZXgpKX08YSBocmVmPVwiJHtcblx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzXG5cdFx0XHRcdH0ke3BnLmVzY2FwZVF1b3Rlc0hUTUwobWF0Y2hbMV0pfVwiPiR7cGcuZXNjYXBlUXVvdGVzSFRNTCgobWF0Y2hbMl0gPz8gbWF0Y2hbMV0pICsgbWF0Y2hbM10pfTwvYT5gO1xuXHRcdFx0XHRwb3N0Zml4SW5kZXggPSByZUxpbmtzLmxhc3RJbmRleDtcblx0XHRcdH1cblx0XHRcdC8vIGFwcGVuZCB0aGUgcmVzdFxuXHRcdFx0cmVzdWx0ICs9IHBnLmVzY2FwZVF1b3Rlc0hUTUwoZGF0YS5zbGljZShNYXRoLm1heCgwLCBwb3N0Zml4SW5kZXgpKSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHRlZGl0U3VtbWFyeVByZXZpZXcoKSB7XG5cdFx0XHRjb25zdCByZUFlcyA9IC9cXC9cXCogKiguKj8pICpcXCpcXC8vZzsgLy8gbWF0Y2ggdGhlIGZpcnN0IHNlY3Rpb24gbWFya2VyXG5cdFx0XHRyZUFlcy5sYXN0SW5kZXggPSAwOyAvLyByZXNldCByZWdleFxuXHRcdFx0Y29uc3QgbWF0Y2ggPSByZUFlcy5leGVjKHRoaXMuZGF0YSk7XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0Ly8gd2UgaGF2ZSBhIHNlY3Rpb24gbGluay4gU3BsaXQgaXQsIHByb2Nlc3MgaXQsIGNvbWJpbmUgaXQuXG5cdFx0XHRcdGNvbnN0IHByZWZpeCA9IHRoaXMuZGF0YS5zbGljZSgwLCBNYXRoLm1heCgwLCBtYXRjaC5pbmRleCAtIDEpKTtcblx0XHRcdFx0Y29uc3QgWywgc2VjdGlvbl0gPSBtYXRjaDtcblx0XHRcdFx0Y29uc3QgcG9zdGZpeCA9IHRoaXMuZGF0YS5zbGljZShNYXRoLm1heCgwLCByZUFlcy5sYXN0SW5kZXgpKTtcblx0XHRcdFx0bGV0IHN0YXJ0ID0gXCI8c3BhbiBjbGFzcz0nYXV0b2NvbW1lbnQnPlwiO1xuXHRcdFx0XHRsZXQgZW5kID0gJzwvc3Bhbj4nO1xuXHRcdFx0XHRpZiAocHJlZml4Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRzdGFydCA9IGAke1ByZXZpZXdtYWtlci5lc1dpa2kySHRtbFBhcnQocHJlZml4KX0gJHtzdGFydH0tIGA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBvc3RmaXgubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGVuZCA9IGA6ICR7ZW5kfSR7UHJldmlld21ha2VyLmVzV2lraTJIdG1sUGFydChwb3N0Zml4KX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUoKS5mcm9tVVJMKHRoaXMuYmFzZVVybCk7XG5cdFx0XHRcdHQuYW5jaG9yRnJvbVV0ZihzZWN0aW9uKTtcblx0XHRcdFx0Y29uc3Qgc2VjdGlvbkxpbmsgPSBgJHtcblx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzICsgcGcuZXNjYXBlUXVvdGVzSFRNTCh0LnRvU3RyaW5nKHRydWUpKVxuXHRcdFx0XHR9IyR7cGcuZXNjYXBlUXVvdGVzSFRNTCh0LmFuY2hvcil9YDtcblx0XHRcdFx0cmV0dXJuIGAke3N0YXJ0fTxhIGhyZWY9XCIke3NlY3Rpb25MaW5rfVwiPiZyYXJyOzwvYT4gJHtwZy5lc2NhcGVRdW90ZXNIVE1MKHNlY3Rpb24pfSR7ZW5kfWA7XG5cdFx0XHR9XG5cdFx0XHQvLyBlbHNlIHRoZXJlJ3Mgbm8gc2VjdGlvbiBsaW5rLCBodG1saWZ5IHRoZSB3aG9sZSB0aGluZy5cblx0XHRcdHJldHVybiBQcmV2aWV3bWFrZXIuZXNXaWtpMkh0bWxQYXJ0KHRoaXMuZGF0YSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFdvcmtzIGFyb3VuZCBsaXZlcHJldmlldyBidWdzLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRmaXhIVE1MKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0bWwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHJldCA9IHRoaXMuaHRtbDtcblx0XHRcdC8vIGZpeCBxdWVzdGlvbiBtYXJrcyBpbiB3aWtpIGxpbmtzXG5cdFx0XHQvLyBtYXliZSB0aGlzJ2xsIGJyZWFrIHNvbWUgc3R1ZmYgOi0oXG5cdFx0XHRyZXQgPSByZXQucmVwbGFjZShuZXcgUmVnRXhwKGAoPGEgaHJlZj1cIiR7cGcud2lraS5hcnRpY2xlUGF0aH0vW15cIl0qKVs/XSguKj9cIilgLCAnZycpLCAnJDElM0YkMicpO1xuXHRcdFx0cmV0ID0gcmV0LnJlcGxhY2UobmV3IFJlZ0V4cChgKDxhIGhyZWY9JyR7cGcud2lraS5hcnRpY2xlUGF0aH0vW14nXSopWz9dKC4qPycpYCwgJ2cnKSwgJyQxJTNGJDInKTtcblx0XHRcdC8vIEZJWE1FIGZpeCB1cCAlIHRvb1xuXHRcdFx0dGhpcy5odG1sID0gcmV0O1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBHZW5lcmF0ZXMgdGhlIHByZXZpZXcgYW5kIGRpc3BsYXlzIGl0IGluIHRoZSBjdXJyZW50IHBvcHVwLlxuXHRcdCAqIERvZXMgbm90aGluZyBpZiB0aGUgZ2VuZXJhdGVkIHByZXZpZXcgaXMgaW52YWxpZCBvciBjb25zaXN0cyBvZiB3aGl0ZXNwYWNlIG9ubHkuXG5cdFx0ICogQWxzbyBhY3RpdmF0ZXMgd2lraWxpbmtzIGluIHRoZSBwcmV2aWV3IGZvciBzdWJwb3B1cHMgaWYgdGhlIHBvcHVwU3VicG9wdXBzIG9wdGlvbiBpcyB0cnVlLlxuXHRcdCAqL1xuXHRcdHNob3dQcmV2aWV3KCkge1xuXHRcdFx0dGhpcy5tYWtlUHJldmlldygpO1xuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLmh0bWwgIT09IHR5cGVvZiAnJykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoL15cXHMqJC8udGVzdCh0aGlzLmh0bWwpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHNldFBvcHVwSFRNTCgnPGhyPicsICdwb3B1cFByZVByZXZpZXdTZXAnLCB0aGlzLm93bmVyLmlkTnVtYmVyKTtcblx0XHRcdHNldFBvcHVwVGlwc0FuZEhUTUwodGhpcy5odG1sLCAncG9wdXBQcmV2aWV3JywgdGhpcy5vd25lci5pZE51bWJlciwge1xuXHRcdFx0XHRvd25lcjogdGhpcy5vd25lcixcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgbW9yZSA9IHRoaXMuZnVsbExlbmd0aCA+IHRoaXMuZGF0YS5sZW5ndGggPyB0aGlzLm1vcmVMaW5rKCkgOiAnJztcblx0XHRcdHNldFBvcHVwSFRNTChtb3JlLCAncG9wdXBQcmV2aWV3TW9yZScsIHRoaXMub3duZXIuaWROdW1iZXIpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG1vcmVMaW5rKCkge1xuXHRcdFx0Y29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdGEuY2xhc3NOYW1lID0gJ3BvcHVwTW9yZUxpbmsnO1xuXHRcdFx0YS5pbm5lckhUTUwgPSBwb3B1cFN0cmluZygnbW9yZS4uLicpO1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHRhLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHRcdHNlbGYubWF4Q2hhcmFjdGVycyArPSAyMDAwO1xuXHRcdFx0XHRzZWxmLm1heFNlbnRlbmNlcyArPSAyMDtcblx0XHRcdFx0c2VsZi5zZXREYXRhKCk7XG5cdFx0XHRcdHNlbGYuc2hvd1ByZXZpZXcoKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdHJpcExvbmdUZW1wbGF0ZXMoKSB7XG5cdFx0XHQvLyBvcGVyYXRlcyBvbiB0aGUgSFRNTCFcblx0XHRcdHRoaXMuaHRtbCA9IHRoaXMuaHRtbC5yZXBsYWNlKC9eLnswLDEwMDB9e3tbXn1dKj8oPChwfGJyKSggXFwvKT8+XFxzKil7Mix9KFtee31dKj99fSk/L2dpLCAnJyk7XG5cdFx0XHR0aGlzLmh0bWwgPSB0aGlzLmh0bWwuc3BsaXQoJ1xcbicpLmpvaW4oJyAnKTsgLy8gd29ya2Fyb3VuZCBmb3IgPHByZT4gdGVtcGxhdGVzXG5cdFx0XHR0aGlzLmh0bWwgPSB0aGlzLmh0bWwucmVwbGFjZSgve3tbXn1dKjxwcmU+W159XSp9fS9naSwgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxNdWx0aWxpbmVUZW1wbGF0ZXMoKSB7XG5cdFx0XHR0aGlzLmtpbGwoJ3t7eycsICd9fX0nKTtcblx0XHRcdHRoaXMua2lsbCgvXFxzKnt7W157fV0qXFxuLywgJ319JywgJ3t7Jyk7XG5cdFx0fVxuXHR9XG5cdC8vIEVOREZJTEU6IHByZXZpZXdtYWtlci5qc1xuXHQvLyBTVEFSVEZJTEU6IHF1ZXJ5cHJldmlldy5qc1xuXHRjb25zdCBsb2FkQVBJUHJldmlldyA9IChxdWVyeVR5cGUsIGFydGljbGUsIG5hdnBvcCkgPT4ge1xuXHRcdGNvbnN0IGFydCA9IG5ldyBUaXRsZShhcnRpY2xlKS51cmxTdHJpbmcoKTtcblx0XHRsZXQgdXJsID0gYCR7cGcud2lraS5hcGl3aWtpYmFzZX0/Zm9ybWF0PWpzb24mZm9ybWF0dmVyc2lvbj0yJmFjdGlvbj1xdWVyeSZgO1xuXHRcdGxldCBodG1sR2VuZXJhdG9yID0gKCkgPT4gLyogYSwgZCAqLyB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSgnaW52YWxpZCBodG1sIGdlbmVyYXRvcicsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfSk7XG5cdFx0fTtcblx0XHRsZXQgdXNlcm5hbWVhcnQgPSAnJztcblx0XHRzd2l0Y2ggKHF1ZXJ5VHlwZSkge1xuXHRcdFx0Y2FzZSAnaGlzdG9yeSc6XG5cdFx0XHRcdHVybCArPSBgdGl0bGVzPSR7YXJ0fSZwcm9wPXJldmlzaW9ucyZydmxpbWl0PSR7Z2V0VmFsdWVPZigncG9wdXBIaXN0b3J5UHJldmlld0xpbWl0Jyl9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSWhpc3RvcnlQcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjYXRlZ29yeSc6XG5cdFx0XHRcdHVybCArPSBgbGlzdD1jYXRlZ29yeW1lbWJlcnMmY210aXRsZT0ke2FydH1gO1xuXHRcdFx0XHRodG1sR2VuZXJhdG9yID0gQVBJY2F0ZWdvcnlQcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyaW5mbyc6IHtcblx0XHRcdFx0Y29uc3QgdXNlcm5hbWUgPSBuZXcgVGl0bGUoYXJ0aWNsZSkudXNlck5hbWUoKTtcblx0XHRcdFx0dXNlcm5hbWVhcnQgPSBlbmNvZGVVUklDb21wb25lbnQodXNlcm5hbWUpO1xuXHRcdFx0XHR1cmwgKz0gcGcucmUuaXBVc2VyLnRlc3QodXNlcm5hbWUpXG5cdFx0XHRcdFx0PyBgbGlzdD1ibG9ja3MmYmtwcm9wPXJhbmdlfHJlc3RyaWN0aW9ucyZia2lwPSR7dXNlcm5hbWVhcnR9YFxuXHRcdFx0XHRcdDogYGxpc3Q9dXNlcnN8dXNlcmNvbnRyaWJzJnVzcHJvcD1ibG9ja2luZm98Z3JvdXBzfGVkaXRjb3VudHxyZWdpc3RyYXRpb258Z2VuZGVyJnVzdXNlcnM9JHt1c2VybmFtZWFydH0mbWV0YT1nbG9iYWx1c2VyaW5mbyZndWlwcm9wPWdyb3Vwc3x1bmF0dGFjaGVkJmd1aXVzZXI9JHt1c2VybmFtZWFydH0mdWNsaW1pdD0xJnVjcHJvcD10aW1lc3RhbXAmdWN1c2VyPSR7dXNlcm5hbWVhcnR9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSXVzZXJJbmZvUHJldmlld0hUTUw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnY29udHJpYnMnOlxuXHRcdFx0XHR1c2VybmFtZWFydCA9IGVuY29kZVVSSUNvbXBvbmVudChuZXcgVGl0bGUoYXJ0aWNsZSkudXNlck5hbWUoKSk7XG5cdFx0XHRcdHVybCArPSBgbGlzdD11c2VyY29udHJpYnMmdWN1c2VyPSR7dXNlcm5hbWVhcnR9JnVjbGltaXQ9JHtnZXRWYWx1ZU9mKCdwb3B1cENvbnRyaWJzUHJldmlld0xpbWl0Jyl9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSWNvbnRyaWJzUHJldmlld0hUTUw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnaW1hZ2VwYWdlcHJldmlldyc6IHtcblx0XHRcdFx0bGV0IHRyYWlsID0gJyc7XG5cdFx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cEltYWdlTGlua3MnKSkge1xuXHRcdFx0XHRcdHRyYWlsID0gYCZsaXN0PWltYWdldXNhZ2UmaXV0aXRsZT0ke2FydH1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHVybCArPSBgdGl0bGVzPSR7YXJ0fSZwcm9wPXJldmlzaW9uc3xpbWFnZWluZm8mcnZwcm9wPWNvbnRlbnQke3RyYWlsfWA7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUElpbWFnZXBhZ2VQcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdiYWNrbGlua3MnOlxuXHRcdFx0XHR1cmwgKz0gYGxpc3Q9YmFja2xpbmtzJmJsdGl0bGU9JHthcnR9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSWJhY2tsaW5rc1ByZXZpZXdIVE1MO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JldmlzaW9uJzpcblx0XHRcdFx0dXJsICs9IGFydGljbGUub2xkaWQgPyBgcmV2aWRzPSR7YXJ0aWNsZS5vbGRpZH1gIDogYHRpdGxlcz0ke2FydGljbGUucmVtb3ZlQW5jaG9yKCkudXJsU3RyaW5nKCl9YDtcblx0XHRcdFx0dXJsICs9XG5cdFx0XHRcdFx0JyZwcm9wPXJldmlzaW9uc3xwYWdlcHJvcHN8aW5mb3xpbWFnZXN8Y2F0ZWdvcmllcyZydnByb3A9aWRzfHRpbWVzdGFtcHxmbGFnc3xjb21tZW50fHVzZXJ8Y29udGVudCZjbGxpbWl0PW1heCZpbWxpbWl0PW1heCc7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUElyZXZpc2lvblByZXZpZXdIVE1MO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cGVuZGluZ05hdnBvcFRhc2sobmF2cG9wKTtcblx0XHRjb25zdCBjYWxsYmFjayA9IChkKSA9PiB7XG5cdFx0XHRsb2coJ2NhbGxiYWNrIG9mIEFQSSBmdW5jdGlvbnMgd2FzIGhpdCcpO1xuXHRcdFx0aWYgKHF1ZXJ5VHlwZSA9PT0gJ3VzZXJpbmZvJykge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGRvIGFub3RoZXIgQVBJIHJlcXVlc3Rcblx0XHRcdFx0ZmV0Y2hVc2VyR3JvdXBOYW1lcyhkLmRhdGEpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHNob3dBUElQcmV2aWV3KHF1ZXJ5VHlwZSwgaHRtbEdlbmVyYXRvcihhcnRpY2xlLCBkLCBuYXZwb3ApLCBuYXZwb3AuaWROdW1iZXIsIG5hdnBvcCwgZCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRzaG93QVBJUHJldmlldyhxdWVyeVR5cGUsIGh0bWxHZW5lcmF0b3IoYXJ0aWNsZSwgZCwgbmF2cG9wKSwgbmF2cG9wLmlkTnVtYmVyLCBuYXZwb3AsIGQpO1xuXHRcdH07XG5cdFx0Y29uc3QgZ28gPSAoKSA9PiB7XG5cdFx0XHRnZXRQYWdlV2l0aENhY2hpbmcodXJsLCBjYWxsYmFjaywgbmF2cG9wKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdFx0aWYgKG5hdnBvcC52aXNpYmxlIHx8ICFnZXRWYWx1ZU9mKCdwb3B1cExhenlEb3dubG9hZHMnKSkge1xuXHRcdFx0Z28oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2cG9wLmFkZEhvb2soZ28sICd1bmhpZGUnLCAnYmVmb3JlJywgYERPV05MT0FEXyR7cXVlcnlUeXBlfV9RVUVSWV9EQVRBYCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBsaW5rTGlzdCA9IChsaXN0KSA9PiB7XG5cdFx0bGlzdC5zb3J0KCh4LCB5KSA9PiB7XG5cdFx0XHRyZXR1cm4geCA9PT0geSA/IDAgOiB4IDwgeSA/IC0xIDogMTtcblx0XHR9KTtcblx0XHRjb25zdCBidWYgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgbGlzdCkge1xuXHRcdFx0YnVmLnB1c2goXG5cdFx0XHRcdHdpa2lMaW5rKHtcblx0XHRcdFx0XHRhcnRpY2xlOiBuZXcgVGl0bGUoZWxlbWVudCksXG5cdFx0XHRcdFx0dGV4dDogZWxlbWVudC5zcGxpdCgnICcpLmpvaW4oJyZuYnNwOycpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ3ZpZXcnLFxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGJ1Zi5qb2luKCcsICcpO1xuXHR9O1xuXHRjb25zdCBnZXRUaW1lT2Zmc2V0ID0gKCkgPT4ge1xuXHRcdGNvbnN0IHR6ID0gbXcudXNlci5vcHRpb25zLmdldCgndGltZWNvcnJlY3Rpb24nKTtcblx0XHRpZiAodHogJiYgdHouaW5jbHVkZXMoJ3wnKSkge1xuXHRcdFx0Ly8gTmV3IGZvcm1hdFxuXHRcdFx0cmV0dXJuIE51bWJlci5wYXJzZUludCh0ei5zcGxpdCgnfCcpWzFdLCAxMCk7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9O1xuXHRjb25zdCBnZXRUaW1lWm9uZSA9ICgpID0+IHtcblx0XHRpZiAoIXBnLnVzZXIudGltZVpvbmUpIHtcblx0XHRcdGNvbnN0IHR6ID0gbXcudXNlci5vcHRpb25zLmdldCgndGltZWNvcnJlY3Rpb24nKTtcblx0XHRcdHBnLnVzZXIudGltZVpvbmUgPSAnVVRDJztcblx0XHRcdGlmICh0eikge1xuXHRcdFx0XHRjb25zdCB0ekNvbXBvbmVudHMgPSB0ei5zcGxpdCgnfCcpO1xuXHRcdFx0XHRpZiAodHpDb21wb25lbnRzLmxlbmd0aCA9PT0gMyAmJiB0ekNvbXBvbmVudHNbMF0gPT09ICdab25lSW5mbycpIHtcblx0XHRcdFx0XHRbLCAsIHBnLnVzZXIudGltZVpvbmVdID0gdHpDb21wb25lbnRzO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVycmxvZyhgVW5leHBlY3RlZCB0aW1lem9uZSBpbmZvcm1hdGlvbjogJHt0en1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcGcudXNlci50aW1lWm9uZTtcblx0fTtcblx0LyoqXG5cdCAqIFNob3VsZCB3ZSB1c2UgYW4gb2Zmc2V0IG9yIGNhbiB3ZSB1c2UgcHJvcGVyIHRpbWV6b25lc1xuXHQgKi9cblx0Y29uc3QgdXNlVGltZU9mZnNldCA9ICgpID0+IHtcblx0XHRpZiAoSW50bC5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VG9QYXJ0cyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJRSAxMVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IHR6ID0gbXcudXNlci5vcHRpb25zLmdldCgndGltZWNvcnJlY3Rpb24nKTtcblx0XHRpZiAodHogJiYgIXR6LmluY2x1ZGVzKCdab25lSW5mb3wnKSkge1xuXHRcdFx0Ly8gU3lzdGVtfCBEZWZhdWx0IHN5c3RlbSB0aW1lLCBkZWZhdWx0IGZvciB1c2VycyB3aG8gZGlkbid0IGNvbmZpZ3VyZSB0aW1lem9uZVxuXHRcdFx0Ly8gT2Zmc2V0fCBNYW51YWwgZGVmaW5lZCBvZmZzZXQgYnkgdXNlclxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0LyoqXG5cdCAqIEFycmF5IG9mIGxvY2FsZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGphdmFzY3JpcHQgbG9jYWxlIGJhc2VkIGZvcm1hdHRpbmdcblx0ICogRmlsdGVycyBkb3duIHRvIHRob3NlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4gRW1wdHkgW10gPT09IFN5c3RlbSdzIGRlZmF1bHQgbG9jYWxlXG5cdCAqL1xuXHRjb25zdCBnZXRMb2NhbGVzID0gKCkgPT4ge1xuXHRcdGlmICghcGcudXNlci5sb2NhbGVzKSB7XG5cdFx0XHRsZXQgdXNlckxhbmd1YWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpLmdldEF0dHJpYnV0ZSgnbGFuZycpOyAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBIVE1MIGxvY2FsZVxuXHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwTG9jYWxlJykpIHtcblx0XHRcdFx0dXNlckxhbmd1YWdlID0gZ2V0VmFsdWVPZigncG9wdXBMb2NhbGUnKTtcblx0XHRcdH0gZWxzZSBpZiAodXNlckxhbmd1YWdlID09PSAnZW4nKSB7XG5cdFx0XHRcdC8vIGVuLndwIHRlbmRzIHRvIHRyZWF0IHRoaXMgYXMgaW50ZXJuYXRpb25hbCBlbmdsaXNoIC8gdW5zcGVjaWZpZWRcblx0XHRcdFx0Ly8gYnV0IHdlIGhhdmUgbW9yZSBzcGVjaWZpYyBzZXR0aW5ncyBpbiB1c2VyIG9wdGlvbnNcblx0XHRcdFx0dXNlckxhbmd1YWdlID0gZ2V0TVdEYXRlRm9ybWF0KCkgPT09ICdtZHknID8gJ2VuLVVTJyA6ICdlbi1HQic7XG5cdFx0XHR9XG5cdFx0XHRwZy51c2VyLmxvY2FsZXMgPSBJbnRsLkRhdGVUaW1lRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihbdXNlckxhbmd1YWdlLCBuYXZpZ2F0b3IubGFuZ3VhZ2VdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHBnLnVzZXIubG9jYWxlcztcblx0fTtcblx0LyoqXG5cdCAqIFJldHJpZXZlIGNvbmZpZ3VyZWQgTVcgZGF0ZSBmb3JtYXQgZm9yIHRoaXMgdXNlclxuXHQgKiBUaGVzZSBjYW4gYmVcblx0ICogZGVmYXVsdFxuXHQgKiBkbXk6IHRpbWUsIGRteVxuXHQgKiBtZHk6IHRpbWUsIG1keVxuXHQgKiB5bWQ6IHRpbWUsIHltZFxuXHQgKiBkbXl0OiBkbXksIHRpbWVcblx0ICogZG15dHM6IGRteSwgdGltZSArIHNlY29uZHNcblx0ICogSVNPIDg2MDE6IFlZWVktTU0tRERUaGg6bW06c3MgKGxvY2FsIHRpbWUpXG5cdCAqXG5cdCAqIFRoaXMgaXNuJ3QgdG9vIHVzZWZ1bCBmb3IgdXMsIGFzIEpTIGRvZXNuJ3QgaGF2ZSBmb3JtYXR0ZXJzIHRvIG1hdGNoIHRoZXNlIHByaXZhdGUgc3BlY2lmaWVyc1xuXHQgKi9cblx0Y29uc3QgZ2V0TVdEYXRlRm9ybWF0ID0gKCkgPT4ge1xuXHRcdHJldHVybiBtdy51c2VyLm9wdGlvbnMuZ2V0KCdkYXRlJyk7XG5cdH07XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgSFRNTCB0YWJsZSB0aGF0J3Mgc2hvd24gaW4gdGhlIGhpc3RvcnkgYW5kIHVzZXItY29udHJpYnMgcG9wdXBzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWNsZVxuXHQgKiBAcGFyYW0ge09iamVjdFtdfSBoIC0gYSBsaXN0IG9mIHJldmlzaW9ucywgcmV0dXJuZWQgZnJvbSB0aGUgQVBJXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVhbGx5Q29udHJpYnMgLSB0cnVlIG9ubHkgaWYgd2UncmUgZGlzcGxheWluZyB1c2VyIGNvbnRyaWJ1dGlvbnNcblx0ICovXG5cdGNvbnN0IGVkaXRQcmV2aWV3VGFibGUgPSAoYXJ0aWNsZSwgaCwgcmVhbGx5Q29udHJpYnMpID0+IHtcblx0XHRsZXQgaHRtbCA9IFsnPHRhYmxlPiddO1xuXHRcdGxldCBkYXk7XG5cdFx0bGV0IGN1cmFydCA9IGFydGljbGU7XG5cdFx0bGV0IHBhZ2U7XG5cdFx0bGV0IG1ha2VGaXJzdENvbHVtbkxpbmtzO1xuXHRcdGlmIChyZWFsbHlDb250cmlicykge1xuXHRcdFx0Ly8gV2UncmUgc2hvd2luZyB1c2VyIGNvbnRyaWJ1dGlvbnMsIHNvIG1ha2UgKGRpZmYgfCBoaXN0KSBsaW5rc1xuXHRcdFx0bWFrZUZpcnN0Q29sdW1uTGlua3MgPSAoY3VycmVudFJldmlzaW9uKSA9PiB7XG5cdFx0XHRcdGxldCByZXN1bHQgPSAnKCc7XG5cdFx0XHRcdHJlc3VsdCArPVxuXHRcdFx0XHRcdGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke25ldyBUaXRsZShjdXJyZW50UmV2aXNpb24udGl0bGUpLnVybFN0cmluZygpfSZkaWZmPXByZXZgICtcblx0XHRcdFx0XHRgJm9sZGlkPSR7Y3VycmVudFJldmlzaW9uLnJldmlkfVwiPiR7cG9wdXBTdHJpbmcoJ2RpZmYnKX08L2E+YDtcblx0XHRcdFx0cmVzdWx0ICs9ICcmbmJzcDt8Jm5ic3A7Jztcblx0XHRcdFx0cmVzdWx0ICs9IGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke25ldyBUaXRsZShcblx0XHRcdFx0XHRjdXJyZW50UmV2aXNpb24udGl0bGVcblx0XHRcdFx0KS51cmxTdHJpbmcoKX0mYWN0aW9uPWhpc3RvcnlcIj4ke3BvcHVwU3RyaW5nKCdoaXN0Jyl9PC9hPmA7XG5cdFx0XHRcdHJlc3VsdCArPSAnKSc7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJdCdzIGEgcmVndWxhciBoaXN0b3J5IHBhZ2UsIHNvIG1ha2UgKGN1ciB8IGxhc3QpIGxpbmtzXG5cdFx0XHRjb25zdCBmaXJzdFJldmlkID0gaFswXS5yZXZpZDtcblx0XHRcdG1ha2VGaXJzdENvbHVtbkxpbmtzID0gKGN1cnJlbnRSZXZpc2lvbikgPT4ge1xuXHRcdFx0XHRsZXQgcmVzdWx0ID0gJygnO1xuXHRcdFx0XHRyZXN1bHQgKz0gYDxhIGhyZWY9XCIke3BnLndpa2kudGl0bGViYXNlfSR7bmV3IFRpdGxlKGN1cmFydCkudXJsU3RyaW5nKCl9JmRpZmY9JHtmaXJzdFJldmlkfSZvbGRpZD0ke1xuXHRcdFx0XHRcdGN1cnJlbnRSZXZpc2lvbi5yZXZpZFxuXHRcdFx0XHR9XCI+JHtwb3B1cFN0cmluZygnY3VyJyl9PC9hPmA7XG5cdFx0XHRcdHJlc3VsdCArPSAnJm5ic3A7fCZuYnNwOyc7XG5cdFx0XHRcdHJlc3VsdCArPSBgPGEgaHJlZj1cIiR7cGcud2lraS50aXRsZWJhc2V9JHtuZXcgVGl0bGUoY3VyYXJ0KS51cmxTdHJpbmcoKX0mZGlmZj1wcmV2Jm9sZGlkPSR7XG5cdFx0XHRcdFx0Y3VycmVudFJldmlzaW9uLnJldmlkXG5cdFx0XHRcdH1cIj4ke3BvcHVwU3RyaW5nKCdsYXN0Jyl9PC9hPmA7XG5cdFx0XHRcdHJlc3VsdCArPSAnKSc7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IFtpLCBlbGVtZW50XSBvZiBoLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKHJlYWxseUNvbnRyaWJzKSB7XG5cdFx0XHRcdHBhZ2UgPSBlbGVtZW50LnRpdGxlO1xuXHRcdFx0XHRjdXJhcnQgPSBuZXcgVGl0bGUocGFnZSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBtaW5vciA9IGVsZW1lbnQubWlub3IgPyAnPGI+bSA8L2I+JyA6ICcnO1xuXHRcdFx0Y29uc3QgZWRpdERhdGUgPSBuZXcgRGF0ZShlbGVtZW50LnRpbWVzdGFtcCk7XG5cdFx0XHRsZXQgdGhpc0RheSA9IGZvcm1hdHRlZERhdGUoZWRpdERhdGUpO1xuXHRcdFx0Y29uc3QgdGhpc1RpbWUgPSBmb3JtYXR0ZWRUaW1lKGVkaXREYXRlKTtcblx0XHRcdGlmICh0aGlzRGF5ID09PSBkYXkpIHtcblx0XHRcdFx0dGhpc0RheSA9ICcnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF5ID0gdGhpc0RheTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzRGF5KSB7XG5cdFx0XHRcdGh0bWwucHVzaChgPHRyPjx0ZCBjb2xzcGFuPTM+PHNwYW4gY2xhc3M9XCJwb3B1cF9oaXN0b3J5X2RhdGVcIj4ke3RoaXNEYXl9PC9zcGFuPjwvdGQ+PC90cj5gKTtcblx0XHRcdH1cblx0XHRcdGh0bWwucHVzaChcblx0XHRcdFx0YDx0ciBjbGFzcz1cInBvcHVwX2hpc3Rvcnlfcm93XyR7aSAlIDIgPyAnb2RkJyA6ICdldmVuJ31cIj5gLFxuXHRcdFx0XHRgPHRkPiR7bWFrZUZpcnN0Q29sdW1uTGlua3MoZWxlbWVudCl9PC90ZD5gLFxuXHRcdFx0XHQnPHRkPicgK1xuXHRcdFx0XHRcdGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke25ldyBUaXRsZShjdXJhcnQpLnVybFN0cmluZygpfSZvbGRpZD0ke1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5yZXZpZFxuXHRcdFx0XHRcdH1cIj4ke3RoaXNUaW1lfTwvYT48L3RkPmBcblx0XHRcdCk7XG5cdFx0XHRsZXQgY29sM3VybCA9ICcnO1xuXHRcdFx0bGV0IGNvbDN0eHQgPSAnJztcblx0XHRcdGlmIChyZWFsbHlDb250cmlicykge1xuXHRcdFx0XHRjb2wzdXJsID0gcGcud2lraS50aXRsZWJhc2UgKyBjdXJhcnQudXJsU3RyaW5nKCk7XG5cdFx0XHRcdGNvbDN0eHQgPSBwZy5lc2NhcGVRdW90ZXNIVE1MKHBhZ2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qge3VzZXJ9ID0gZWxlbWVudDtcblx0XHRcdFx0aWYgKGVsZW1lbnQudXNlcmhpZGRlbikge1xuXHRcdFx0XHRcdGNvbDN1cmwgPSBnZXRWYWx1ZU9mKCdwb3B1cFJldkRlbFVybCcpO1xuXHRcdFx0XHRcdGNvbDN0eHQgPSBwZy5lc2NhcGVRdW90ZXNIVE1MKHBvcHVwU3RyaW5nKCdyZXZkZWwnKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29sM3VybCA9IHBnLnJlLmlwVXNlci50ZXN0KHVzZXIpXG5cdFx0XHRcdFx0XHQ/IGAke1xuXHRcdFx0XHRcdFx0XHRcdHBnLndpa2kudGl0bGViYXNlICsgbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNTcGVjaWFsSWRdXG5cdFx0XHRcdFx0XHRcdH06Q29udHJpYnV0aW9ucyZ0YXJnZXQ9JHtuZXcgVGl0bGUodXNlcikudXJsU3RyaW5nKCl9YFxuXHRcdFx0XHRcdFx0OiBgJHtwZy53aWtpLnRpdGxlYmFzZSArIG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zVXNlcklkXX06JHtuZXcgVGl0bGUoXG5cdFx0XHRcdFx0XHRcdFx0dXNlclxuXHRcdFx0XHRcdFx0XHQpLnVybFN0cmluZygpfWA7XG5cdFx0XHRcdFx0Y29sM3R4dCA9IHBnLmVzY2FwZVF1b3Rlc0hUTUwodXNlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGh0bWwucHVzaChgPHRkPiR7cmVhbGx5Q29udHJpYnMgPyBtaW5vciA6ICcnfTxhIGhyZWY9XCIke2NvbDN1cmx9XCI+JHtjb2wzdHh0fTwvYT48L3RkPmApO1xuXHRcdFx0bGV0IGNvbW1lbnQgPSAnJztcblx0XHRcdGNvbnN0IGMgPSBlbGVtZW50LmNvbW1lbnQgfHwgZWxlbWVudC5jb250ZW50O1xuXHRcdFx0aWYgKGMpIHtcblx0XHRcdFx0Y29tbWVudCA9IG5ldyBQcmV2aWV3bWFrZXIoYywgbmV3IFRpdGxlKGN1cmFydCkudG9VcmwoKSkuZWRpdFN1bW1hcnlQcmV2aWV3KCk7XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuY29tbWVudGhpZGRlbikge1xuXHRcdFx0XHRjb21tZW50ID0gcG9wdXBTdHJpbmcoJ3JldmRlbCcpO1xuXHRcdFx0fVxuXHRcdFx0aHRtbC5wdXNoKGA8dGQ+JHtyZWFsbHlDb250cmlicyA/ICcnIDogbWlub3J9JHtjb21tZW50fTwvdGQ+YCwgJzwvdHI+Jyk7XG5cdFx0XHRodG1sID0gW2h0bWwuam9pbignJyldO1xuXHRcdH1cblx0XHRodG1sLnB1c2goJzwvdGFibGU+Jyk7XG5cdFx0cmV0dXJuIGh0bWwuam9pbignJyk7XG5cdH07XG5cdGNvbnN0IGFkanVzdERhdGUgPSAoZCwgb2Zmc2V0KSA9PiB7XG5cdFx0Ly8gb2Zmc2V0IGlzIGluIG1pbnV0ZXNcblx0XHRjb25zdCBvID0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXHRcdHJldHVybiBuZXcgRGF0ZSgrZCArIG8pO1xuXHR9O1xuXHQvKipcblx0ICogVGhpcyByZWxpZXMgb24gdGhlIERhdGUgcGFyc2VyIHVuZGVyc3RhbmRpbmcgZW4tVVMgZGF0ZXMsXG5cdCAqIHdoaWNoIGlzIHByZXR0eSBzYWZlIGFzc3VtcHRpb24sIGJ1dCBub3QgcGVyZmVjdC5cblx0ICpcblx0ICogQHBhcmFtIHtEYXRlfSBkYXRlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lWm9uZVxuXHQgKi9cblx0Y29uc3QgY29udmVydFRpbWVab25lID0gKGRhdGUsIHRpbWVab25lKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKGRhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywge3RpbWVab25lfSkpO1xuXHR9O1xuXHRjb25zdCBmb3JtYXR0ZWREYXRlVGltZSA9IChkYXRlKSA9PiB7XG5cdFx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYW5kIHVua25vd24gdGltZXpvbmVzXG5cdFx0aWYgKHVzZVRpbWVPZmZzZXQoKSkge1xuXHRcdFx0cmV0dXJuIGAke2Zvcm1hdHRlZERhdGUoZGF0ZSl9ICR7Zm9ybWF0dGVkVGltZShkYXRlKX1gO1xuXHRcdH1cblx0XHRpZiAoZ2V0TVdEYXRlRm9ybWF0KCkgPT09ICdJU08gODYwMScpIHtcblx0XHRcdGNvbnN0IGQyID0gY29udmVydFRpbWVab25lKGRhdGUsIGdldFRpbWVab25lKCkpO1xuXHRcdFx0cmV0dXJuIGAke21hcCh6ZXJvRmlsbCwgW2QyLmdldEZ1bGxZZWFyKCksIGQyLmdldE1vbnRoKCkgKyAxLCBkMi5nZXREYXRlKCldKS5qb2luKCctJyl9VCR7bWFwKHplcm9GaWxsLCBbXG5cdFx0XHRcdGQyLmdldEhvdXJzKCksXG5cdFx0XHRcdGQyLmdldE1pbnV0ZXMoKSxcblx0XHRcdFx0ZDIuZ2V0U2Vjb25kcygpLFxuXHRcdFx0XSkuam9pbignOicpfWA7XG5cdFx0fVxuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXRWYWx1ZU9mKCdwb3B1cERhdGVUaW1lRm9ybWF0dGVyT3B0aW9ucycpO1xuXHRcdG9wdGlvbnMudGltZVpvbmUgPSBnZXRUaW1lWm9uZSgpO1xuXHRcdHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKGdldExvY2FsZXMoKSwgb3B0aW9ucyk7XG5cdH07XG5cdGNvbnN0IGZvcm1hdHRlZERhdGUgPSAoZGF0ZSkgPT4ge1xuXHRcdGxldCBkMjtcblx0XHQvLyBmYWxsYmFjayBmb3IgSUUxMSBhbmQgdW5rbm93biB0aW1lem9uZXNcblx0XHRpZiAodXNlVGltZU9mZnNldCgpKSB7XG5cdFx0XHQvLyB3ZSBhZGp1c3QgdGhlIFVUQyB0aW1lLCBzbyB3ZSBwcmludCB0aGUgYWRqdXN0ZWQgVVRDLCBidXQgbm90IHJlYWxseSBVVEMgdmFsdWVzXG5cdFx0XHRkMiA9IGFkanVzdERhdGUoZGF0ZSwgZ2V0VGltZU9mZnNldCgpKTtcblx0XHRcdHJldHVybiBtYXAoemVyb0ZpbGwsIFtkMi5nZXRVVENGdWxsWWVhcigpLCBkMi5nZXRVVENNb250aCgpICsgMSwgZDIuZ2V0VVRDRGF0ZSgpXSkuam9pbignLScpO1xuXHRcdH1cblx0XHRpZiAoZ2V0TVdEYXRlRm9ybWF0KCkgPT09ICdJU08gODYwMScpIHtcblx0XHRcdGQyID0gY29udmVydFRpbWVab25lKGRhdGUsIGdldFRpbWVab25lKCkpO1xuXHRcdFx0cmV0dXJuIG1hcCh6ZXJvRmlsbCwgW2QyLmdldEZ1bGxZZWFyKCksIGQyLmdldE1vbnRoKCkgKyAxLCBkMi5nZXREYXRlKCldKS5qb2luKCctJyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXRWYWx1ZU9mKCdwb3B1cERhdGVGb3JtYXR0ZXJPcHRpb25zJyk7XG5cdFx0b3B0aW9ucy50aW1lWm9uZSA9IGdldFRpbWVab25lKCk7XG5cdFx0cmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGdldExvY2FsZXMoKSwgb3B0aW9ucyk7XG5cdH07XG5cdGNvbnN0IGZvcm1hdHRlZFRpbWUgPSAoZGF0ZSkgPT4ge1xuXHRcdGxldCBkMjtcblx0XHQvLyBmYWxsYmFjayBmb3IgSUUxMSBhbmQgdW5rbm93biB0aW1lem9uZXNcblx0XHRpZiAodXNlVGltZU9mZnNldCgpKSB7XG5cdFx0XHQvLyB3ZSBhZGp1c3QgdGhlIFVUQyB0aW1lLCBzbyB3ZSBwcmludCB0aGUgYWRqdXN0ZWQgVVRDLCBidXQgbm90IHJlYWxseSBVVEMgdmFsdWVzXG5cdFx0XHRkMiA9IGFkanVzdERhdGUoZGF0ZSwgZ2V0VGltZU9mZnNldCgpKTtcblx0XHRcdHJldHVybiBtYXAoemVyb0ZpbGwsIFtkMi5nZXRVVENIb3VycygpLCBkMi5nZXRVVENNaW51dGVzKCksIGQyLmdldFVUQ1NlY29uZHMoKV0pLmpvaW4oJzonKTtcblx0XHR9XG5cdFx0aWYgKGdldE1XRGF0ZUZvcm1hdCgpID09PSAnSVNPIDg2MDEnKSB7XG5cdFx0XHRkMiA9IGNvbnZlcnRUaW1lWm9uZShkYXRlLCBnZXRUaW1lWm9uZSgpKTtcblx0XHRcdHJldHVybiBtYXAoemVyb0ZpbGwsIFtkMi5nZXRIb3VycygpLCBkMi5nZXRNaW51dGVzKCksIGQyLmdldFNlY29uZHMoKV0pLmpvaW4oJzonKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3B0aW9ucyA9IGdldFZhbHVlT2YoJ3BvcHVwVGltZUZvcm1hdHRlck9wdGlvbnMnKTtcblx0XHRvcHRpb25zLnRpbWVab25lID0gZ2V0VGltZVpvbmUoKTtcblx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoZ2V0TG9jYWxlcygpLCBvcHRpb25zKTtcblx0fTtcblx0Ly8gR2V0IHRoZSBwcm9wZXIgZ3JvdXBuYW1lcyBmb3IgdGhlIHRlY2huaWNhbGdyb3Vwc1xuXHRjb25zdCBmZXRjaFVzZXJHcm91cE5hbWVzID0gKHVzZXJpbmZvUmVzcG9uc2UpID0+IHtcblx0XHRjb25zdCBxdWVyeU9iaiA9IGdldEpzT2JqKHVzZXJpbmZvUmVzcG9uc2UpLnF1ZXJ5O1xuXHRcdGNvbnN0IHVzZXIgPSBhbnlDaGlsZChxdWVyeU9iai51c2Vycyk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSBbXTtcblx0XHRpZiAodXNlci5ncm91cHMpIHtcblx0XHRcdGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIHVzZXIuZ3JvdXBzKSB7XG5cdFx0XHRcdGlmICghWycqJywgJ3VzZXInLCAnYXV0b2NvbmZpcm1lZCddLmluY2x1ZGVzKGdyb3VwTmFtZSkpIHtcblx0XHRcdFx0XHRtZXNzYWdlcy5wdXNoKGBncm91cC0ke2dyb3VwTmFtZX0tbWVtYmVyYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHF1ZXJ5T2JqLmdsb2JhbHVzZXJpbmZvICYmIHF1ZXJ5T2JqLmdsb2JhbHVzZXJpbmZvLmdyb3Vwcykge1xuXHRcdFx0Zm9yIChjb25zdCBncm91cE5hbWUgb2YgcXVlcnlPYmouZ2xvYmFsdXNlcmluZm8uZ3JvdXBzKSB7XG5cdFx0XHRcdG1lc3NhZ2VzLnB1c2goYGdyb3VwLSR7Z3JvdXBOYW1lfS1tZW1iZXJgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGdldE13QXBpKCkubG9hZE1lc3NhZ2VzSWZNaXNzaW5nKG1lc3NhZ2VzKTtcblx0fTtcblx0Y29uc3Qgc2hvd0FQSVByZXZpZXcgPSAocXVlcnlUeXBlLCBodG1sLCBpZCwgbmF2cG9wLCBkb3dubG9hZCkgPT4ge1xuXHRcdC8vIERKOiBkb25lXG5cdFx0bGV0IHRhcmdldCA9ICdwb3B1cFByZXZpZXcnO1xuXHRcdGNvbXBsZXRlZE5hdnBvcFRhc2sobmF2cG9wKTtcblx0XHRzd2l0Y2ggKHF1ZXJ5VHlwZSkge1xuXHRcdFx0Y2FzZSAnaW1hZ2VsaW5rcyc6XG5cdFx0XHRjYXNlICdjYXRlZ29yeSc6XG5cdFx0XHRcdHRhcmdldCA9ICdwb3B1cFBvc3RQcmV2aWV3Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyaW5mbyc6XG5cdFx0XHRcdHRhcmdldCA9ICdwb3B1cFVzZXJEYXRhJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyZXZpc2lvbic6XG5cdFx0XHRcdGluc2VydFByZXZpZXcoZG93bmxvYWQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHNldFBvcHVwVGlwc0FuZEhUTUwoaHRtbCwgdGFyZ2V0LCBpZCk7XG5cdH07XG5cdGNvbnN0IEFQSXJldmlzaW9uUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzT2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBwYWdlID0gYW55Q2hpbGQoanNPYmoucXVlcnkucGFnZXMpO1xuXHRcdFx0aWYgKHBhZ2UubWlzc2luZykge1xuXHRcdFx0XHQvLyBUT0RPIHdlIG5lZWQgdG8gZml4IHRoaXMgcHJvcGVyIGxhdGVyIG9uXG5cdFx0XHRcdGRvd25sb2FkLm93bmVyID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udGVudCA9XG5cdFx0XHRcdHBhZ2UgJiYgcGFnZS5yZXZpc2lvbnMgJiYgcGFnZS5yZXZpc2lvbnNbMF0uY29udGVudG1vZGVsID09PSAnd2lraXRleHQnXG5cdFx0XHRcdFx0PyBwYWdlLnJldmlzaW9uc1swXS5jb250ZW50XG5cdFx0XHRcdFx0OiBudWxsO1xuXHRcdFx0aWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRkb3dubG9hZC5kYXRhID0gY29udGVudDtcblx0XHRcdFx0ZG93bmxvYWQubGFzdE1vZGlmaWVkID0gbmV3IERhdGUocGFnZS5yZXZpc2lvbnNbMF0udGltZXN0YW1wKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiAnUmV2aXNpb24gcHJldmlldyBmYWlsZWQgOignO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgQVBJYmFja2xpbmtzUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkIC8qICwgbmF2cG9wICovKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzT2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBsaXN0ID0ganNPYmoucXVlcnkuYmFja2xpbmtzO1xuXHRcdFx0bGV0IGh0bWwgPSBbXTtcblx0XHRcdGlmICghbGlzdCkge1xuXHRcdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ05vIGJhY2tsaW5rcyBmb3VuZCcpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdFx0Y29uc3QgdCA9IG5ldyBUaXRsZShlbGVtZW50LnRpdGxlKTtcblx0XHRcdFx0aHRtbC5wdXNoKGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke3QudXJsU3RyaW5nKCl9XCI+JHt0LnRvU3RyaW5nKCkuZW50aWZ5KCl9PC9hPmApO1xuXHRcdFx0fVxuXHRcdFx0aHRtbCA9IGh0bWwuam9pbignLCAnKTtcblx0XHRcdGlmIChqc09iai5jb250aW51ZSAmJiBqc09iai5jb250aW51ZS5ibGNvbnRpbnVlKSB7XG5cdFx0XHRcdGh0bWwgKz0gcG9wdXBTdHJpbmcoJyBhbmQgbW9yZScpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGh0bWw7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gJ2JhY2tsaW5rc1ByZXZpZXdIVE1MIHdlbnQgd29ua3knO1xuXHRcdH1cblx0fTtcblx0cGcuZm4uQVBJc2hhcmVkSW1hZ2VQYWdlUHJldmlld0hUTUwgPSAob2JqKSA9PiB7XG5cdFx0bG9nKCdBUElzaGFyZWRJbWFnZVBhZ2VQcmV2aWV3SFRNTCcpO1xuXHRcdGNvbnN0IHBvcHVwaWQgPSBvYmoucmVxdWVzdGlkO1xuXHRcdGlmIChvYmoucXVlcnkgJiYgb2JqLnF1ZXJ5LnBhZ2VzKSB7XG5cdFx0XHRjb25zdCBwYWdlID0gYW55Q2hpbGQob2JqLnF1ZXJ5LnBhZ2VzKTtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPVxuXHRcdFx0XHRwYWdlICYmIHBhZ2UucmV2aXNpb25zICYmIHBhZ2UucmV2aXNpb25zWzBdLmNvbnRlbnRtb2RlbCA9PT0gJ3dpa2l0ZXh0J1xuXHRcdFx0XHRcdD8gcGFnZS5yZXZpc2lvbnNbMF0uY29udGVudFxuXHRcdFx0XHRcdDogbnVsbDtcblx0XHRcdGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycgJiYgcGcgJiYgcGcuY3VycmVudCAmJiBwZy5jdXJyZW50LmxpbmsgJiYgcGcuY3VycmVudC5saW5rLm5hdnBvcHVwKSB7XG5cdFx0XHRcdC8qIE5vdCBlbnRpcmVseSBzYWZlLCBidXQgdGhlIGJlc3Qgd2UgY2FuIGRvICovXG5cdFx0XHRcdGNvbnN0IHAgPSBuZXcgUHJldmlld21ha2VyKGNvbnRlbnQsIHBnLmN1cnJlbnQubGluay5uYXZwb3B1cC5hcnRpY2xlLCBwZy5jdXJyZW50LmxpbmsubmF2cG9wdXApO1xuXHRcdFx0XHRwLm1ha2VQcmV2aWV3KCk7XG5cdFx0XHRcdHNldFBvcHVwSFRNTChwLmh0bWwsICdwb3B1cFNlY29uZFByZXZpZXcnLCBwb3B1cGlkKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNvbnN0IEFQSWltYWdlcGFnZVByZXZpZXdIVE1MID0gKGFydGljbGUsIGRvd25sb2FkLCBuYXZwb3ApID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QganNPYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHRcdGNvbnN0IHBhZ2UgPSBhbnlDaGlsZChqc09iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRjb25zdCBjb250ZW50ID1cblx0XHRcdFx0cGFnZSAmJiBwYWdlLnJldmlzaW9ucyAmJiBwYWdlLnJldmlzaW9uc1swXS5jb250ZW50bW9kZWwgPT09ICd3aWtpdGV4dCdcblx0XHRcdFx0XHQ/IHBhZ2UucmV2aXNpb25zWzBdLmNvbnRlbnRcblx0XHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0XHRsZXQgYWx0ID0gJyc7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRbe2FsdH1dID0gbmF2cG9wLnBhcmVudEFuY2hvci5jaGlsZE5vZGVzO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGVtcHR5ICovXG5cdFx0XHR9XG5cdFx0XHRpZiAoYWx0KSB7XG5cdFx0XHRcdHJldCA9IGAke3JldH08aHI+PGI+JHtwb3B1cFN0cmluZygnQWx0IHRleHQ6Jyl9PC9iPiAke3BnLmVzY2FwZVF1b3Rlc0hUTUwoYWx0KX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRjb25zdCBwID0gcHJlcFByZXZpZXdtYWtlcihjb250ZW50LCBhcnRpY2xlLCBuYXZwb3ApO1xuXHRcdFx0XHRwLm1ha2VQcmV2aWV3KCk7XG5cdFx0XHRcdGlmIChwLmh0bWwpIHtcblx0XHRcdFx0XHRyZXQgKz0gYDxocj4ke3AuaHRtbH1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFN1bW1hcnlEYXRhJykpIHtcblx0XHRcdFx0XHRjb25zdCBpbmZvID0gZ2V0UGFnZUluZm8oY29udGVudCwgZG93bmxvYWQpO1xuXHRcdFx0XHRcdGxvZyhpbmZvKTtcblx0XHRcdFx0XHRzZXRQb3B1cFRyYWlsZXIoaW5mbywgbmF2cG9wLmlkTnVtYmVyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHBhZ2UgJiYgcGFnZS5pbWFnZXJlcG9zaXRvcnkgPT09ICdzaGFyZWQnKSB7XG5cdFx0XHRcdGNvbnN0IGFydCA9IG5ldyBUaXRsZShhcnRpY2xlKTtcblx0XHRcdFx0Y29uc3QgZW5jYXJ0ID0gZW5jb2RlVVJJQ29tcG9uZW50KGBGaWxlOiR7YXJ0LnN0cmlwTmFtZXNwYWNlKCl9YCk7XG5cdFx0XHRcdGNvbnN0IHNoYXJlZF91cmwgPVxuXHRcdFx0XHRcdGAke3BnLndpa2kuYXBpY29tbW9uc2Jhc2V9P2Zvcm1hdD1qc29uJmZvcm1hdHZlcnNpb249MmAgK1xuXHRcdFx0XHRcdCcmY2FsbGJhY2s9cGcuZm4uQVBJc2hhcmVkSW1hZ2VQYWdlUHJldmlld0hUTUwnICtcblx0XHRcdFx0XHRgJnJlcXVlc3RpZD0ke25hdnBvcC5pZE51bWJlcn0mYWN0aW9uPXF1ZXJ5JnByb3A9cmV2aXNpb25zJnJ2cHJvcD1jb250ZW50JnRpdGxlcz0ke2VuY2FydH1gO1xuXHRcdFx0XHRyZXQgPSBgJHtyZXR9PGhyPiR7cG9wdXBTdHJpbmcoJ0ltYWdlIGZyb20gQ29tbW9ucycpfTogPGEgaHJlZj1cIiR7XG5cdFx0XHRcdFx0cGcud2lraS5jb21tb25zYmFzZVxuXHRcdFx0XHR9P3RpdGxlPSR7ZW5jYXJ0fVwiPiR7cG9wdXBTdHJpbmcoJ0Rlc2NyaXB0aW9uIHBhZ2UnKX08L2E+YDtcblx0XHRcdFx0bXcubG9hZGVyLmxvYWQoc2hhcmVkX3VybCk7XG5cdFx0XHR9XG5cdFx0XHRzaG93QVBJUHJldmlldygnaW1hZ2VsaW5rcycsIEFQSWltYWdlbGlua3NQcmV2aWV3SFRNTChhcnRpY2xlLCBkb3dubG9hZCksIG5hdnBvcC5pZE51bWJlciwgZG93bmxvYWQpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiAnQVBJIGltYWdlcGFnZSBwcmV2aWV3IGZhaWxlZCA6KCc7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBBUElpbWFnZWxpbmtzUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzb2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBsaXN0ID0ganNvYmoucXVlcnkuaW1hZ2V1c2FnZTtcblx0XHRcdGlmIChsaXN0KSB7XG5cdFx0XHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgbGlzdCkge1xuXHRcdFx0XHRcdHJldC5wdXNoKGVsZW1lbnQudGl0bGUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZXQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvcHVwU3RyaW5nKCdObyBpbWFnZSBsaW5rcyBmb3VuZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBgPGgyPiR7cG9wdXBTdHJpbmcoJ0ZpbGUgbGlua3MnKX08L2gyPiR7bGlua0xpc3QocmV0KX1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBvcHVwU3RyaW5nKCdObyBpbWFnZSBsaW5rcyBmb3VuZCcpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdJbWFnZSBsaW5rcyBwcmV2aWV3IGdlbmVyYXRpb24gZmFpbGVkIDooJztcblx0XHR9XG5cdH07XG5cdGNvbnN0IEFQSWNhdGVnb3J5UHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzb2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBsaXN0ID0ganNvYmoucXVlcnkuY2F0ZWdvcnltZW1iZXJzO1xuXHRcdFx0bGV0IHJldCA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdFx0cmV0LnB1c2goZWxlbWVudC50aXRsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmV0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmcoJ0VtcHR5IGNhdGVnb3J5Jyk7XG5cdFx0XHR9XG5cdFx0XHRyZXQgPSBgPGgyPiR7dHByaW50ZignQ2F0ZWdvcnkgbWVtYmVycyAoJXMgc2hvd24pJywgW3JldC5sZW5ndGhdKX08L2gyPiR7bGlua0xpc3QocmV0KX1gO1xuXHRcdFx0aWYgKGpzb2JqLmNvbnRpbnVlICYmIGpzb2JqLmNvbnRpbnVlLmNtY29udGludWUpIHtcblx0XHRcdFx0cmV0ICs9IHBvcHVwU3RyaW5nKCcgYW5kIG1vcmUnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gJ0NhdGVnb3J5IHByZXZpZXcgZmFpbGVkIDooJztcblx0XHR9XG5cdH07XG5cdGNvbnN0IEFQSXVzZXJJbmZvUHJldmlld0hUTUwgPSAoX2FydGljbGUsIGRvd25sb2FkKSA9PiB7XG5cdFx0bGV0IHJldCA9IFtdO1xuXHRcdGxldCBxdWVyeW9iaiA9IHt9O1xuXHRcdHRyeSB7XG5cdFx0XHRxdWVyeW9iaiA9IGdldEpzT2JqKGRvd25sb2FkLmRhdGEpLnF1ZXJ5O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdVc2VyaW5mbyBwcmV2aWV3IGZhaWxlZCA6KCc7XG5cdFx0fVxuXHRcdGNvbnN0IHVzZXIgPSBhbnlDaGlsZChxdWVyeW9iai51c2Vycyk7XG5cdFx0aWYgKHVzZXIpIHtcblx0XHRcdGNvbnN0IHtnbG9iYWx1c2VyaW5mb30gPSBxdWVyeW9iajtcblx0XHRcdGlmICh1c2VyLmludmFsaWQgPT09ICcnKSB7XG5cdFx0XHRcdHJldC5wdXNoKHBvcHVwU3RyaW5nKCdJbnZhbGlkIHVzZXInKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHVzZXIubWlzc2luZyA9PT0gJycpIHtcblx0XHRcdFx0cmV0LnB1c2gocG9wdXBTdHJpbmcoJ05vdCBhIHJlZ2lzdGVyZWQgdXNlcm5hbWUnKSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodXNlci5ibG9ja2VkYnkpIHtcblx0XHRcdFx0aWYgKHVzZXIuYmxvY2twYXJ0aWFsKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goYDxiPiR7cG9wdXBTdHJpbmcoJ0hhcyBibG9ja3MnKX08L2I+YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goYDxiPiR7cG9wdXBTdHJpbmcoJ0JMT0NLRUQnKX08L2I+YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChnbG9iYWx1c2VyaW5mbyAmJiAoJ2xvY2tlZCcgaW4gZ2xvYmFsdXNlcmluZm8gfHwgJ2hpZGRlbicgaW4gZ2xvYmFsdXNlcmluZm8pKSB7XG5cdFx0XHRcdGxldCBsb2NrZWRTdWxBY2NvdW50SXNBdHRhY2hlZFRvVGhpcyA9IHRydWU7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBnbG9iYWx1c2VyaW5mby51bmF0dGFjaGVkICYmIGkgPCBnbG9iYWx1c2VyaW5mby51bmF0dGFjaGVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKGdsb2JhbHVzZXJpbmZvLnVuYXR0YWNoZWRbaV0ud2lraSA9PT0gbXcuY29uZmlnLmdldCgnd2dEQm5hbWUnKSkge1xuXHRcdFx0XHRcdFx0bG9ja2VkU3VsQWNjb3VudElzQXR0YWNoZWRUb1RoaXMgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobG9ja2VkU3VsQWNjb3VudElzQXR0YWNoZWRUb1RoaXMpIHtcblx0XHRcdFx0XHRpZiAoJ2xvY2tlZCcgaW4gZ2xvYmFsdXNlcmluZm8pIHtcblx0XHRcdFx0XHRcdHJldC5wdXNoKGA8Yj48aT4ke3BvcHVwU3RyaW5nKCdMT0NLRUQnKX08L2k+PC9iPmApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoJ2hpZGRlbicgaW4gZ2xvYmFsdXNlcmluZm8pIHtcblx0XHRcdFx0XHRcdHJldC5wdXNoKGA8Yj48aT4ke3BvcHVwU3RyaW5nKCdISURERU4nKX08L2k+PC9iPmApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwU2hvd0dlbmRlcicpICYmIHVzZXIuZ2VuZGVyKSB7XG5cdFx0XHRcdHN3aXRjaCAodXNlci5nZW5kZXIpIHtcblx0XHRcdFx0XHRjYXNlICdtYWxlJzpcblx0XHRcdFx0XHRcdHJldC5wdXNoKGAke3BvcHVwU3RyaW5nKCdoZS9oaW0nKX0gwrcgYCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmZW1hbGUnOlxuXHRcdFx0XHRcdFx0cmV0LnB1c2goYCR7cG9wdXBTdHJpbmcoJ3NoZS9oZXInKX0gwrcgYCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHVzZXIuZ3JvdXBzKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIHVzZXIuZ3JvdXBzKSB7XG5cdFx0XHRcdFx0aWYgKCFbJyonLCAndXNlcicsICdhdXRvY29uZmlybWVkJ10uaW5jbHVkZXMoZ3JvdXBOYW1lKSkge1xuXHRcdFx0XHRcdFx0Ly8gTWVzc2FnZXMgdGhhdCBjYW4gYmUgdXNlZCBoZXJlOlxuXHRcdFx0XHRcdFx0Ly8gKiBzZWUgW1tTcGVjaWFsOlByZWZpeEluZGV4L01lZGlhV2lraTpHcm91cC1dXVxuXHRcdFx0XHRcdFx0Ly8gKiBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHRcdFx0XHRcdFx0cmV0LnB1c2gocGcuZXNjYXBlUXVvdGVzSFRNTChtdy5tZXNzYWdlKGBncm91cC0ke2dyb3VwTmFtZX0tbWVtYmVyYCwgdXNlci5nZW5kZXIpLnRleHQoKSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGdsb2JhbHVzZXJpbmZvICYmIGdsb2JhbHVzZXJpbmZvLmdyb3Vwcykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiBnbG9iYWx1c2VyaW5mby5ncm91cHMpIHtcblx0XHRcdFx0XHRyZXQucHVzaChcblx0XHRcdFx0XHRcdC8vIE1lc3NhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaGVyZTpcblx0XHRcdFx0XHRcdC8vICogc2VlIFtbU3BlY2lhbDpQcmVmaXhJbmRleC9NZWRpYVdpa2k6R3JvdXAtXV1cblx0XHRcdFx0XHRcdC8vICogZm9yIG1vcmUgaW5mb3JtYXRpb25cblx0XHRcdFx0XHRcdGA8aT4ke3BnLmVzY2FwZVF1b3Rlc0hUTUwobXcubWVzc2FnZShgZ3JvdXAtJHtncm91cE5hbWV9LW1lbWJlcmAsIHVzZXIuZ2VuZGVyKS50ZXh0KCkpfTwvaT5gXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHVzZXIucmVnaXN0cmF0aW9uKSB7XG5cdFx0XHRcdHJldC5wdXNoKFxuXHRcdFx0XHRcdHBnLmVzY2FwZVF1b3Rlc0hUTUwoXG5cdFx0XHRcdFx0XHQodXNlci5lZGl0Y291bnQgPz8gJzAnKSArXG5cdFx0XHRcdFx0XHRcdHBvcHVwU3RyaW5nKCcgZWRpdHMgc2luY2U6ICcpICtcblx0XHRcdFx0XHRcdFx0KHVzZXIucmVnaXN0cmF0aW9uID8gZm9ybWF0dGVkRGF0ZShuZXcgRGF0ZSh1c2VyLnJlZ2lzdHJhdGlvbikpIDogJycpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAocXVlcnlvYmoudXNlcmNvbnRyaWJzICYmIHF1ZXJ5b2JqLnVzZXJjb250cmlicy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXQucHVzaChwb3B1cFN0cmluZygnbGFzdCBlZGl0IG9uICcpICsgZm9ybWF0dGVkRGF0ZShuZXcgRGF0ZShxdWVyeW9iai51c2VyY29udHJpYnNbMF0udGltZXN0YW1wKSkpO1xuXHRcdH1cblx0XHRpZiAocXVlcnlvYmouYmxvY2tzKSB7XG5cdFx0XHRyZXQucHVzaChwb3B1cFN0cmluZygnSVAgdXNlcicpKTsgLy8gd2Ugb25seSByZXF1ZXN0IGxpc3Q9YmxvY2tzIGZvciBJUHNcblx0XHRcdGZvciAobGV0IGwgPSAwOyBsIDwgcXVlcnlvYmouYmxvY2tzLmxlbmd0aDsgbCsrKSB7XG5cdFx0XHRcdGxldCByYnN0ciA9IHF1ZXJ5b2JqLmJsb2Nrc1tsXS5yYW5nZXN0YXJ0ID09PSBxdWVyeW9iai5ibG9ja3NbbF0ucmFuZ2VlbmQgPyAnQkxPQ0snIDogJ1JBTkdFQkxPQ0snO1xuXHRcdFx0XHRyYnN0ciA9IEFycmF5LmlzQXJyYXkocXVlcnlvYmouYmxvY2tzW2xdLnJlc3RyaWN0aW9ucykgPyBgJHtyYnN0cn1FRGAgOiBgSGFzICR7cmJzdHIudG9Mb3dlckNhc2UoKX1zYDtcblx0XHRcdFx0cmV0LnB1c2goYDxiPiR7cG9wdXBTdHJpbmcocmJzdHIpfTwvYj5gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gaWYgYW55IGVsZW1lbnQgb2YgcmV0IGVuZHMgd2l0aCAnIMK3ICcsIG1lcmdlIGl0IHdpdGggdGhlIG5leHQgZWxlbWVudCB0byBhdm9pZFxuXHRcdC8vIHRoZSAuam9pbignLCAnKSBjYWxsIGluc2VydGluZyBhIGNvbW1hIGFmdGVyIGl0XG5cdFx0Zm9yIChsZXQgbSA9IDA7IG0gPCByZXQubGVuZ3RoIC0gMTsgbSsrKSB7XG5cdFx0XHRpZiAocmV0W21dLmxlbmd0aCA+IDMgJiYgcmV0W21dLnNsaWNlKE1hdGgubWF4KDAsIHJldFttXS5sZW5ndGggLSAzKSkgPT09ICcgwrcgJykge1xuXHRcdFx0XHRyZXRbbV0gKz0gcmV0W20gKyAxXTtcblx0XHRcdFx0cmV0LnNwbGljZShtICsgMSwgMSk7IC8vIGRlbGV0ZSBlbGVtZW50IGF0IGluZGV4IG0rMVxuXHRcdFx0XHRtLS07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldCA9IGA8aHI+JHtyZXQuam9pbignLCAnKX1gO1xuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IEFQSWNvbnRyaWJzUHJldmlld0hUTUwgPSAoYXJ0aWNsZSwgZG93bmxvYWQsIG5hdnBvcCkgPT4ge1xuXHRcdHJldHVybiBBUEloaXN0b3J5UHJldmlld0hUTUwoYXJ0aWNsZSwgZG93bmxvYWQsIG5hdnBvcCwgdHJ1ZSk7XG5cdH07XG5cdGNvbnN0IEFQSWhpc3RvcnlQcmV2aWV3SFRNTCA9IChhcnRpY2xlLCBkb3dubG9hZCwgX25hdnBvcCwgcmVhbGx5Q29udHJpYnMpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QganNvYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHRcdGxldCBlZGl0cyA9IFtdO1xuXHRcdFx0ZWRpdHMgPSByZWFsbHlDb250cmlicyA/IGpzb2JqLnF1ZXJ5LnVzZXJjb250cmlicyA6IGFueUNoaWxkKGpzb2JqLnF1ZXJ5LnBhZ2VzKS5yZXZpc2lvbnM7XG5cdFx0XHRjb25zdCByZXQgPSBlZGl0UHJldmlld1RhYmxlKGFydGljbGUsIGVkaXRzLCByZWFsbHlDb250cmlicyk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdIaXN0b3J5IHByZXZpZXcgZmFpbGVkIDotKCc7XG5cdFx0fVxuXHR9O1xuXHQvLyBFTkRGSUxFOiBxdWVyeXByZXZpZXcuanNcblx0Ly8gU1RBUlRGSUxFOiBkZWJ1Zy5qc1xuXHQvLyBEZWJ1Z2dpbmcgZnVuY3Rpb25zXG5cdGNvbnN0IHNldHVwRGVidWdnaW5nID0gKCkgPT4ge1xuXHRcdGlmICh3aW5kb3cucG9wdXBEZWJ1Zykge1xuXHRcdFx0Ly8gcG9wdXBEZWJ1ZyBpcyBzZXQgZnJvbSAudmVyc2lvblxuXHRcdFx0d2luZG93LmxvZyA9ICh4KSA9PiB7XG5cdFx0XHRcdC8vIGlmIChnIE1zZyAhPT0gJycpIHsgZ01zZyArPSAnXFxuJzsgZ01zZys9dGltZSgpICsgJyAnICsgeDsgfVxuXHRcdFx0XHRjb25zb2xlLmxvZyh4KTtcblx0XHRcdH07XG5cdFx0XHR3aW5kb3cuZXJybG9nID0gKHgpID0+IHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihgW1BvcHVwc10gJHt4fWApO1xuXHRcdFx0fTtcblx0XHRcdGxvZygnSW5pdGlhbGl6aW5nIGxvZ2dlcicpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aW5kb3cubG9nID0gKCkgPT4ge307XG5cdFx0XHR3aW5kb3cuZXJybG9nID0gKCkgPT4ge307XG5cdFx0fVxuXHR9O1xuXHQvLyBFTkRGSUxFOiBkZWJ1Zy5qc1xuXHQvLyBTVEFSVEZJTEU6IGltYWdlcy5qc1xuXHQvLyBsb2FkIGltYWdlIG9mIHR5cGUgVGl0bGUuXG5cdGNvbnN0IGxvYWRJbWFnZSA9IChpbWFnZSwgbmF2cG9wKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpbWFnZS5zdHJpcE5hbWVzcGFjZSAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoJ2xvYWRJbWFnZXMgYmFkJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHR9XG5cdFx0Ly8gQVBJIGNhbGwgdG8gcmV0cmlldmUgaW1hZ2UgaW5mby5cblx0XHRpZiAoIWdldFZhbHVlT2YoJ3BvcHVwSW1hZ2VzJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKCFpc1ZhbGlkSW1hZ2VOYW1lKGltYWdlLnRvU3RyaW5nKCkpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IGFydCA9IGltYWdlLnVybFN0cmluZygpO1xuXHRcdGxldCB1cmwgPSBgJHtwZy53aWtpLmFwaXdpa2liYXNlfT9mb3JtYXQ9anNvbiZmb3JtYXR2ZXJzaW9uPTImYWN0aW9uPXF1ZXJ5YDtcblx0XHR1cmwgKz0gYCZwcm9wPWltYWdlaW5mbyZpaXByb3A9dXJsfG1pbWUmaWl1cmx3aWR0aD0ke2dldFZhbHVlT2YoJ3BvcHVwSW1hZ2VTaXplTGFyZ2UnKX1gO1xuXHRcdHVybCArPSBgJnRpdGxlcz0ke2FydH1gO1xuXHRcdHBlbmRpbmdOYXZwb3BUYXNrKG5hdnBvcCk7XG5cdFx0Y29uc3QgY2FsbGJhY2sgPSAoZCkgPT4ge1xuXHRcdFx0cG9wdXBzSW5zZXJ0SW1hZ2UobmF2cG9wLmlkTnVtYmVyLCBuYXZwb3AsIGQpO1xuXHRcdH07XG5cdFx0Y29uc3QgZ28gPSAoKSA9PiB7XG5cdFx0XHRnZXRQYWdlV2l0aENhY2hpbmcodXJsLCBjYWxsYmFjaywgbmF2cG9wKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdFx0aWYgKG5hdnBvcC52aXNpYmxlIHx8ICFnZXRWYWx1ZU9mKCdwb3B1cExhenlEb3dubG9hZHMnKSkge1xuXHRcdFx0Z28oKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2cG9wLmFkZEhvb2soZ28sICd1bmhpZGUnLCAnYWZ0ZXInLCAnRE9XTkxPQURfSU1BR0VfUVVFUllfREFUQScpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcG9wdXBzSW5zZXJ0SW1hZ2UgPSAoaWQsIF9uYXZwb3AsIGRvd25sb2FkKSA9PiB7XG5cdFx0bG9nKCdwb3B1cHNJbnNlcnRJbWFnZScpO1xuXHRcdGxldCBpbWFnZWluZm87XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzT2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBpbWFnZXBhZ2UgPSBhbnlDaGlsZChqc09iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRpZiAoaW1hZ2VwYWdlLmltYWdlaW5mbyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdFtpbWFnZWluZm9dID0gaW1hZ2VwYWdlLmltYWdlaW5mbztcblx0XHR9IGNhdGNoIHtcblx0XHRcdGxvZygncG9wdXBzSW5zZXJ0SW1hZ2UgZmFpbGVkIDooJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHBvcHVwSW1hZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjcG9wdXBJbWcke2lkfWApO1xuXHRcdGlmICghcG9wdXBJbWFnZSkge1xuXHRcdFx0bG9nKCdjb3VsZCBub3QgZmluZCBpbnNlcnRpb24gcG9pbnQgZm9yIGltYWdlJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHBvcHVwSW1hZ2Uud2lkdGggPSBnZXRWYWx1ZU9mKCdwb3B1cEltYWdlU2l6ZScpO1xuXHRcdHBvcHVwSW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuXHRcdC8vIFNldCB0aGUgc291cmNlIGZvciB0aGUgaW1hZ2UuXG5cdFx0aWYgKGltYWdlaW5mby50aHVtYnVybCkge1xuXHRcdFx0cG9wdXBJbWFnZS5zcmMgPSBpbWFnZWluZm8udGh1bWJ1cmw7XG5cdFx0fSBlbHNlIGlmIChpbWFnZWluZm8ubWltZS5pbmRleE9mKCdpbWFnZScpID09PSAwKSB7XG5cdFx0XHRwb3B1cEltYWdlLnNyYyA9IGltYWdlaW5mby51cmw7XG5cdFx0XHRsb2coJ2EgdGh1bWIgY291bGQgbm90IGJlIGZvdW5kLCB1c2luZyBvcmlnaW5hbCBpbWFnZScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb2coXCJmdWxsc2l6ZSBpbWFnZXRodW1iLCBidXQgbm90IHN1cmUgaWYgaXQncyBhbiBpbWFnZVwiKTtcblx0XHR9XG5cdFx0Y29uc3QgYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNwb3B1cEltYWdlTGluayR7aWR9YCk7XG5cdFx0aWYgKGEgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHQvLyBEZXRlcm1pbmUgdGhlIGFjdGlvbiBvZiB0aGUgc3Vycm91ZGluZyBpbWFnZWxpbmsuXG5cdFx0c3dpdGNoIChnZXRWYWx1ZU9mKCdwb3B1cFRodW1iQWN0aW9uJykpIHtcblx0XHRcdGNhc2UgJ2ltYWdlcGFnZSc6XG5cdFx0XHRcdGlmIChwZy5jdXJyZW50LmFydGljbGUubmFtZXNwYWNlSWQoKSAhPT0gcGcubnNJbWFnZUlkKSB7XG5cdFx0XHRcdFx0YS5ocmVmID0gaW1hZ2VpbmZvLmRlc2NyaXB0aW9udXJsO1xuXHRcdFx0XHRcdC8vIEZJWE1FOiB1bnJlbGlhYmxlIHBnLmlkTnVtYmVyXG5cdFx0XHRcdFx0cG9wVGlwc1Nvb25GbihgcG9wdXBJbWFnZSR7aWR9YCkoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnc2l6ZXRvZ2dsZSc6XG5cdFx0XHRcdGEub25jbGljayA9IHRvZ2dsZVNpemU7XG5cdFx0XHRcdGEudGl0bGUgPSBwb3B1cFN0cmluZygnVG9nZ2xlIGltYWdlIHNpemUnKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0Y2FzZSAnbGlua2Z1bGwnOlxuXHRcdFx0XHRhLmhyZWYgPSBpbWFnZWluZm8udXJsO1xuXHRcdFx0XHRhLnRpdGxlID0gcG9wdXBTdHJpbmcoJ09wZW4gZnVsbC1zaXplIGltYWdlJyk7XG5cdFx0fVxuXHR9O1xuXHQvLyBUb2dnbGVzIHRoZSBpbWFnZSBiZXR3ZWVuIGlubGluZSBzbWFsbCBhbmQgbmF2cG9wIGZ1bGx3aWR0aC5cblx0Ly8gSXQncyB0aGUgc2FtZSBpbWFnZSwgbm8gYWN0dWFsIHNpemVjaGFuZ2Ugb2NjdXJzLCBvbmx5IGRpc3BsYXkgd2lkdGguXG5cdGNvbnN0IHRvZ2dsZVNpemUgPSBmdW5jdGlvbiB0b2dnbGVTaXplKCkge1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdGlmICghc2VsZikge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoJ3NlbGYgaXMgbnVsbCA6LycsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGltZyA9IHNlbGYuZmlyc3RDaGlsZDtcblx0XHRpZiAoIWltZykge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoJ2ltZyBpcyBudWxsIDovJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW1nLnN0eWxlLndpZHRoID0gIWltZy5zdHlsZS53aWR0aCB8fCBpbWcuc3R5bGUud2lkdGggPT09ICcnID8gJzEwMCUnIDogJyc7XG5cdH07XG5cdC8vIFJldHVybnMgb25lIHRpdGxlIG9mIGFuIGltYWdlIGZyb20gd2lraVRleHQuXG5cdGNvbnN0IGdldFZhbGlkSW1hZ2VGcm9tV2lraVRleHQgPSAod2lraVRleHQpID0+IHtcblx0XHQvLyBuYiBpbiBwZy5yZS5pbWFnZSB3ZSdyZSBpbnRlcmVzdGVkIGluIHRoZSBzZWNvbmQgYnJhY2tldGVkIGV4cHJlc3Npb25cblx0XHQvLyB0aGlzIG1heSBjaGFuZ2UgaWYgdGhlIHJlZ2V4IGNoYW5nZXMgOi0oXG5cdFx0Ly8gbGV0IG1hdGNoPXBnLnJlLmltYWdlLmV4ZWMod2lraVRleHQpO1xuXHRcdGxldCBtYXRjaGVkO1xuXHRcdGxldCBtYXRjaDtcblx0XHQvLyBzdHJpcCBodG1sIGNvbW1lbnRzLCB1c2VkIGJ5IGV2aWwgYm90cyA6LShcblx0XHRjb25zdCB0ID0gcmVtb3ZlTWF0Y2hlc1VubGVzcyh3aWtpVGV4dCwgLyg8IS0tW1xcU1xcc10qPy0tPikvLCAxLCAvXjwhLS1bXltdKnBvcHVwL2kpO1xuXHRcdHdoaWxlICgobWF0Y2ggPSBwZy5yZS5pbWFnZS5leGVjKHQpKSAhPT0gbnVsbCkge1xuXHRcdFx0Ly8gbm93IGZpbmQgYSBzYW5lIGltYWdlIG5hbWUgLSBleGNsdWRlIHRlbXBsYXRlcyBieSBzZWVraW5nIHtcblx0XHRcdGNvbnN0IG0gPSBtYXRjaFsyXSB8fCBtYXRjaFs2XTtcblx0XHRcdGlmIChpc1ZhbGlkSW1hZ2VOYW1lKG0pKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0cGcucmUuaW1hZ2UubGFzdEluZGV4ID0gMDtcblx0XHRpZiAoIW1hdGNoZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7bXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNJbWFnZUlkXX06JHt1cGNhc2VGaXJzdChtYXRjaGVkKX1gO1xuXHR9O1xuXHRjb25zdCByZW1vdmVNYXRjaGVzVW5sZXNzID0gKHN0ciwgcmUxLCBwYXJlbmNvdW50LCByZTIpID0+IHtcblx0XHRjb25zdCBzcGxpdCA9IHN0ci5zcGxpdChyZTEpO1xuXHRcdGNvbnN0IGMgPSBwYXJlbmNvdW50ICsgMTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAoaSAlIGMgPT09IDAgfHwgcmUyLnRlc3Qoc3BsaXRbaV0pKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0c3BsaXRbaV0gPSAnJztcblx0XHR9XG5cdFx0cmV0dXJuIHNwbGl0LmpvaW4oJycpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBpbWFnZXMuanNcblx0Ly8gU1RBUlRGSUxFOiBuYW1lc3BhY2VzLmpzXG5cdC8vIFNldCB1cCBuYW1lc3BhY2VzIGFuZCBvdGhlciBub24tc3RyaW5ncy5qcyBsb2NhbGl6YXRpb25cblx0Ly8gKGN1cnJlbnRseSB0aGF0IG1lYW5zIHJlZGlycyB0b28pXG5cdGNvbnN0IHNldE5hbWVzcGFjZXMgPSAoKSA9PiB7XG5cdFx0cGcubnNTcGVjaWFsSWQgPSAtMTtcblx0XHRwZy5uc01haW5zcGFjZUlkID0gMDtcblx0XHRwZy5uc0ltYWdlSWQgPSA2O1xuXHRcdHBnLm5zVXNlcklkID0gMjtcblx0XHRwZy5uc1VzZXJ0YWxrSWQgPSAzO1xuXHRcdHBnLm5zQ2F0ZWdvcnlJZCA9IDE0O1xuXHRcdHBnLm5zVGVtcGxhdGVJZCA9IDEwO1xuXHR9O1xuXHRjb25zdCBzZXRSZWRpcnMgPSAoKSA9PiB7XG5cdFx0Y29uc3QgciA9ICdyZWRpcmVjdCc7XG5cdFx0Y29uc3QgUiA9ICdSRURJUkVDVCc7XG5cdFx0Y29uc3QgcmVkaXJMaXN0cyA9IHtcblx0XHRcdGFyOiBbUiwgJ9iq2K3ZiNmK2YQnXSxcblx0XHRcdGJlOiBbciwgJ9C/0LXRgNCw0L3QsNC60ZbRgNCw0LLQsNC90YzQvdC1J10sXG5cdFx0XHRiZzogW3IsICfQv9GA0LXQvdCw0YHQvtGH0LLQsNC90LUnLCAn0LLQuNC2J10sXG5cdFx0XHRiczogW3IsICdQcmV1c21qZXJpJywgJ3ByZXVzbWplcmknLCAnUFJFVVNNSkVSSSddLFxuXHRcdFx0Ym46IFtSLCAn4Kaq4KeB4Kao4Kaw4KeN4Kao4Ka/4Kaw4KeN4Kam4KeH4Ka2J10sXG5cdFx0XHRjczogW1IsICdQxZhFU03EmlJVSiddLFxuXHRcdFx0Y3k6IFtyLCAnYWlsLWN5ZmVpcmlvJ10sXG5cdFx0XHRkZTogW1IsICdXRUlURVJMRUlUVU5HJ10sXG5cdFx0XHRlbDogW1IsICfOkc6dzpHOms6RzqTOlc6lzpjOpc6dzqPOlyddLFxuXHRcdFx0ZW86IFtSLCAnQUxJRElSRUtUVScsICdBTElESVJFS1RJJ10sXG5cdFx0XHRlczogW1IsICdSRURJUkVDQ0nDk04nXSxcblx0XHRcdGV0OiBbciwgJ3N1dW5hJ10sXG5cdFx0XHRnYTogW3IsICdhdGhzaGVvbGFkaCddLFxuXHRcdFx0Z2w6IFtyLCAnUkVESVJFQ0NJw5NOJywgJ1JFRElSRUNJT05BTUVOVE8nXSxcblx0XHRcdGhlOiBbUiwgJ9eU16TXoNeZ15QnXSxcblx0XHRcdGh1OiBbUiwgJ8OBVElSw4FOWcONVMOBUyddLFxuXHRcdFx0aXM6IFtyLCAndGlsdsOtc3VuJywgJ1RJTFbDjVNVTiddLFxuXHRcdFx0aXQ6IFtSLCAnUklOVklBJywgJ1JpbnZpYSddLFxuXHRcdFx0amE6IFtSLCAn6Lui6YCBJ10sXG5cdFx0XHRtazogW3IsICfQv9GA0LXQvdCw0YHQvtGH0YPQstCw0ZrQtScsICfQstC40LTQuCddLFxuXHRcdFx0bmRzOiBbciwgJ3dpZWRlcmxlaWRlbiddLFxuXHRcdFx0J25kcy1ubCc6IFtSLCAnREVVUlZFUldJRVpJTkcnLCAnRFVVUlZFUldJRVpJTkcnXSxcblx0XHRcdG5sOiBbUiwgJ0RPT1JWRVJXSUpaSU5HJ10sXG5cdFx0XHRubjogW3IsICdvbWRpcmlnZXInXSxcblx0XHRcdHBsOiBbUiwgJ1BBVFJaJywgJ1BSWkVLSUVSVUonLCAnVEFNJ10sXG5cdFx0XHRwdDogW1IsICdyZWRpciddLFxuXHRcdFx0cnU6IFtSLCAn0J/QldCg0JXQndCQ0J/QoNCQ0JLQm9CV0J3QmNCVJywgJ9Cf0JXQoNCV0J3QkNCf0KAnXSxcblx0XHRcdHNrOiBbciwgJ3ByZXNtZXJ1aiddLFxuXHRcdFx0c3I6IFtyLCAn0J/RgNC10YPRgdC80LXRgNC4JywgJ9C/0YDQtdGD0YHQvNC10YDQuCcsICfQn9Cg0JXQo9Ch0JzQldCg0JgnLCAnUHJldXNtZXJpJywgJ3ByZXVzbWVyaScsICdQUkVVU01FUkknXSxcblx0XHRcdHR0OiBbUiwgJ3nDvG7DpGx0w7wnLCAn0L/QtdGA0LXQvdCw0L/RgNCw0LLQu9C10L3QuNC1JywgJ9C/0LXRgNC10L3QsNC/0YAnXSxcblx0XHRcdHVrOiBbUiwgJ9Cf0JXQoNCV0J3QkNCf0KDQkNCS0JvQldCd0J3QrycsICfQn9CV0KDQldCd0JDQn9CgJ10sXG5cdFx0XHR2aTogW3IsICfEkeG7lWknXSxcblx0XHRcdHlpOiBbUiwgJ9eV15XXmdeZ15jXoteo16TXmdeo158nXSxcblx0XHRcdHpoOiBbUiwgJ+mHjeWumuWQkSddLCAvLyBubyBjb21tYVxuXHRcdH07XG5cdFx0Y29uc3QgcmVkaXJMaXN0ID0gcmVkaXJMaXN0c1twZy53aWtpLmxhbmddIHx8IFtyLCBSXTtcblx0XHQvLyBNZWRpYXdpa2kgaXMgdmVyeSB0b2xlcmFudCBhYm91dCB3aGF0IGNvbWVzIGFmdGVyIHRoZSAjcmVkaXJlY3QgYXQgdGhlIHN0YXJ0XG5cdFx0cGcucmUucmVkaXJlY3QgPSBuZXcgUmVnRXhwKFxuXHRcdFx0YF5cXFxccypbI10oJHtyZWRpckxpc3Quam9pbignfCcpfSkuKj9cXFxcW3syfShbXlxcXFx8XFxcXF1dKikofFteXFxcXF1dKik/XFxcXF17Mn1cXFxccyooLiopYCxcblx0XHRcdCdpJ1xuXHRcdCk7XG5cdH07XG5cdGNvbnN0IHNldEludGVyd2lraSA9ICgpID0+IHtcblx0XHRpZiAocGcud2lraS53aWtpbWVkaWEpIHtcblx0XHRcdC8vIEZyb20ge0BsaW5rIGh0dHBzOi8vbWV0YS53aWtpbWVkaWEub3JnL3dpa2kvTGlzdF9vZl9XaWtpcGVkaWFzfVxuXHRcdFx0Ly8ge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93L2FwaS5waHA/YWN0aW9uPXNpdGVtYXRyaXgmZm9ybWF0PWpzb24mc210eXBlPWxhbmd1YWdlJnNtbGFuZ3Byb3A9Y29kZSZmb3JtYXR2ZXJzaW9uPTJ9XG5cdFx0XHRwZy53aWtpLmludGVyd2lraSA9XG5cdFx0XHRcdCdhYXxhYnxhY2V8YWZ8YWt8YWxzfGFtfGFufGFuZ3xhcnxhcmN8YXJ6fGFzfGFzdHxhdnxheXxhenxiYXxiYXJ8YmF0LXNtZ3xiY2x8YmV8YmUteC1vbGR8Ymd8Ymh8Yml8YmpufGJtfGJufGJvfGJweXxicnxic3xidWd8YnhyfGNhfGNiay16YW18Y2RvfGNlfGNlYnxjaHxjaG98Y2hyfGNoeXxja2J8Y298Y3J8Y3JofGNzfGNzYnxjdXxjdnxjeXxkYXxkZXxkaXF8ZHNifGR2fGR6fGVlfGVsfGVtbHxlbnxlb3xlc3xldHxldXxleHR8ZmF8ZmZ8Zml8Zml1LXZyb3xmanxmb3xmcnxmcnB8ZnJyfGZ1cnxmeXxnYXxnYWd8Z2FufGdkfGdsfGdsa3xnbnxnb3R8Z3V8Z3Z8aGF8aGFrfGhhd3xoZXxoaXxoaWZ8aG98aHJ8aHNifGh0fGh1fGh5fGh6fGlhfGlkfGllfGlnfGlpfGlrfGlsb3xpb3xpc3xpdHxpdXxqYXxqYm98anZ8a2F8a2FhfGthYnxrYmR8a2d8a2l8a2p8a2t8a2x8a218a258a298a29pfGtyfGtyY3xrc3xrc2h8a3V8a3Z8a3d8a3l8bGF8bGFkfGxifGxiZXxsZ3xsaXxsaWp8bG1vfGxufGxvfGx0fGx0Z3xsdnxtYXAtYm1zfG1kZnxtZ3xtaHxtaHJ8bWl8bWt8bWx8bW58bW98bXJ8bXJqfG1zfG10fG11c3xtd2x8bXl8bXl2fG16bnxuYXxuYWh8bmFwfG5kc3xuZHMtbmx8bmV8bmV3fG5nfG5sfG5ufG5vfG5vdnxucm18bnZ8bnl8b2N8b218b3J8b3N8cGF8cGFnfHBhbXxwYXB8cGNkfHBkY3xwZmx8cGl8cGlofHBsfHBtc3xwbmJ8cG50fHBzfHB0fHF1fHJtfHJteXxybnxyb3xyb2EtcnVwfHJvYS10YXJhfHJ1fHJ1ZXxyd3xzYXxzYWh8c2N8c2NufHNjb3xzZHxzZXxzZ3xzaHxzaXxzaW1wbGV8c2t8c2x8c218c258c298c3F8c3J8c3JufHNzfHN0fHN0cXxzdXxzdnxzd3xzemx8dGF8dGV8dGV0fHRnfHRofHRpfHRrfHRsfHRufHRvfHRwaXx0cnx0c3x0dHx0dW18dHd8dHl8dWRtfHVnfHVrfHVyfHV6fHZlfHZlY3x2aXx2bHN8dm98d2F8d2FyfHdvfHd1dXx4YWx8eGh8eWl8eW98emF8emVhfHpofHpoLWNsYXNzaWNhbHx6aC1taW4tbmFufHpoLXl1ZXx6dSc7XG5cdFx0XHRwZy5yZS5pbnRlcndpa2kgPSBuZXcgUmVnRXhwKGBeJHtwZy53aWtpLmludGVyd2lraX06YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBnLndpa2kuaW50ZXJ3aWtpID0gbnVsbDtcblx0XHRcdHBnLnJlLmludGVyd2lraSA9IC9eJC87XG5cdFx0fVxuXHR9O1xuXHQvLyByZXR1cm4gYSByZWdleHAgcGF0dGVybiBtYXRjaGluZyBhbGwgdmFyaWFudHMgdG8gd3JpdGUgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHRjb25zdCBuc1JlID0gKG5hbWVzcGFjZUlkKSA9PiB7XG5cdFx0Y29uc3QgaW1hZ2VOYW1lc3BhY2VWYXJpYW50cyA9IFtdO1xuXHRcdGZvciAoY29uc3QgW19sb2NhbGl6ZWROYW1lc3BhY2VMYywgX25hbWVzcGFjZUlkXSBvZiBPYmplY3QuZW50cmllcyhtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpKSkge1xuXHRcdFx0aWYgKF9uYW1lc3BhY2VJZCAhPT0gbmFtZXNwYWNlSWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBsb2NhbGl6ZWROYW1lc3BhY2VMYyA9IHVwY2FzZUZpcnN0KF9sb2NhbGl6ZWROYW1lc3BhY2VMYyk7XG5cdFx0XHRpbWFnZU5hbWVzcGFjZVZhcmlhbnRzLnB1c2goXG5cdFx0XHRcdG13LnV0aWwuZXNjYXBlUmVnRXhwKGxvY2FsaXplZE5hbWVzcGFjZUxjKS5zcGxpdCgnICcpLmpvaW4oJ1sgX10nKSxcblx0XHRcdFx0bXcudXRpbC5lc2NhcGVSZWdFeHAoZW5jb2RlVVJJKGxvY2FsaXplZE5hbWVzcGFjZUxjKSlcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBgKD86JHtpbWFnZU5hbWVzcGFjZVZhcmlhbnRzLmpvaW4oJ3wnKX0pYDtcblx0fTtcblx0Y29uc3QgbnNSZUltYWdlID0gKCkgPT4ge1xuXHRcdHJldHVybiBuc1JlKHBnLm5zSW1hZ2VJZCk7XG5cdH07XG5cdC8vIEVOREZJTEU6IG5hbWVzcGFjZXMuanNcblx0Ly8gU1RBUlRGSUxFOiBzZWxwb3AuanNcblx0Y29uc3QgZ2V0RWRpdGJveFNlbGVjdGlvbiA9ICgpID0+IHtcblx0XHQvLyBzZWUge0BsaW5rIGh0dHA6Ly93d3cud2ViZ3VydXNmb3J1bS5jb20vOC8xMi8wfVxuXHRcdGxldCBlZGl0Ym94O1xuXHRcdHRyeSB7XG5cdFx0XHRlZGl0Ym94ID0gZG9jdW1lbnQuZWRpdGZvcm0ud3BUZXh0Ym94MTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gSUUsIE9wZXJhXG5cdFx0aWYgKGRvY3VtZW50LnNlbGVjdGlvbikge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQ7XG5cdFx0fVxuXHRcdC8vIE1vemlsbGFcblx0XHRjb25zdCBzZWxTdGFydCA9IGVkaXRib3guc2VsZWN0aW9uU3RhcnQ7XG5cdFx0Y29uc3Qgc2VsRW5kID0gZWRpdGJveC5zZWxlY3Rpb25FbmQ7XG5cdFx0cmV0dXJuIGVkaXRib3gudmFsdWUuc3Vic3RyaW5nKHNlbFN0YXJ0LCBzZWxFbmQpO1xuXHR9O1xuXHRjb25zdCBkb1NlbGVjdGlvblBvcHVwID0gKCkgPT4ge1xuXHRcdC8vIHBvcHVwIGlmIHRoZSBzZWxlY3Rpb24gbG9va3MgbGlrZSBbW2Zvb3xhbnl0aGluZyBhZnRlcndhcmRzIGF0IGFsbFxuXHRcdC8vIG9yIFtbZm9vfGJhcl1ddGV4dCB3aXRob3V0ICddXSdcblx0XHQvLyBvciBbW2Zvb3xiYXJdXVxuXHRcdGNvbnN0IHNlbCA9IGdldEVkaXRib3hTZWxlY3Rpb24oKTtcblx0XHRjb25zdCBvcGVuID0gc2VsLmluZGV4T2YoJ1tbJyk7XG5cdFx0Y29uc3QgcGlwZSA9IHNlbC5pbmRleE9mKCd8Jyk7XG5cdFx0Y29uc3QgY2xvc2UgPSBzZWwuaW5kZXhPZignXV0nKTtcblx0XHRpZiAob3BlbiA9PT0gLTEgfHwgKHBpcGUgPT09IC0xICYmIGNsb3NlID09PSAtMSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKChwaXBlICE9PSAtMSAmJiBvcGVuID4gcGlwZSkgfHwgKGNsb3NlICE9PSAtMSAmJiBvcGVuID4gY2xvc2UpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGFydGljbGUgPSBuZXcgVGl0bGUoc2VsLnN1YnN0cmluZyhvcGVuICsgMiwgcGlwZSA8IDAgPyBjbG9zZSA6IHBpcGUpKTtcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBPbkVkaXRTZWxlY3Rpb24nKSA9PT0gJ2JveHByZXZpZXcnKSB7XG5cdFx0XHRyZXR1cm4gZG9TZXBhcmF0ZVNlbGVjdGlvblBvcHVwKHNlbCwgYXJ0aWNsZSk7XG5cdFx0fVxuXHRcdGlmIChjbG9zZSA+IDAgJiYgc2VsLnNsaWNlKE1hdGgubWF4KDAsIGNsb3NlICsgMikpLmluY2x1ZGVzKCdbWycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0YS5ocmVmID0gcGcud2lraS50aXRsZWJhc2UgKyBhcnRpY2xlLnVybFN0cmluZygpO1xuXHRcdG1vdXNlT3Zlcldpa2lMaW5rMihhKTtcblx0XHRpZiAoYS5uYXZwb3B1cCkge1xuXHRcdFx0YS5uYXZwb3B1cC5hZGRIb29rKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cnVuU3RvcFBvcHVwVGltZXIoYS5uYXZwb3B1cCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd1bmhpZGUnLFxuXHRcdFx0XHQnYWZ0ZXInXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZG9TZXBhcmF0ZVNlbGVjdGlvblBvcHVwID0gKHN0ciwgYXJ0aWNsZSkgPT4ge1xuXHRcdGxldCBkaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VsZWN0aW9uUHJldmlldycpO1xuXHRcdGlmICghZGl2KSB7XG5cdFx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGRpdi5pZCA9ICdzZWxlY3Rpb25QcmV2aWV3Jztcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGJveCA9IGRvY3VtZW50LmVkaXRmb3JtLndwVGV4dGJveDE7XG5cdFx0XHRcdGJveC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIGJveCk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBwID0gcHJlcFByZXZpZXdtYWtlcihzdHIsIGFydGljbGUsIG5ld05hdnBvcHVwKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSwgYXJ0aWNsZSkpO1xuXHRcdHAubWFrZVByZXZpZXcoKTtcblx0XHRpZiAocC5odG1sKSB7XG5cdFx0XHRkaXYuaW5uZXJIVE1MID0gcC5odG1sO1xuXHRcdH1cblx0XHRkaXYucmFuU2V0dXBUb29sdGlwc0FscmVhZHkgPSBmYWxzZTtcblx0XHRwb3BUaXBzU29vbkZuKCdzZWxlY3Rpb25QcmV2aWV3JykoKTtcblx0fTtcblx0Ly8gRU5ERklMRTogc2VscG9wLmpzXG5cdC8vIFNUQVJURklMRTogbmF2cG9wdXAuanNcblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXcgIERlZmluZXMgdHdvIGNsYXNzZXM6IHtAc291cmNlIE5hdnBvcHVwfSBhbmQge0Bzb3VyY2UgTW91c2V0cmFja2VyfS5cblx0ICpcblx0ICogPGNvZGU+TmF2cG9wdXA8L2NvZGU+IGRlc2NyaWJlcyBwb3B1cHM6IHdoZW4gdGhleSBhcHBlYXIsIHdoZXJlLCB3aGF0XG5cdCAqIHRoZXkgbG9vayBsaWtlIGFuZCBzbyBvbi5cblx0ICpcblx0ICogPGNvZGU+TW91c2V0cmFja2VyPC9jb2RlPiBcImNhcHR1cmVzXCIgdGhlIG1vdXNlIHVzaW5nXG5cdCAqIDxjb2RlPmRvY3VtZW50Lm9ubW91c2Vtb3ZlPC9jb2RlPi5cblx0ICovXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IE1vdXNldHJhY2tlci5cblx0ICpcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBjbGFzcyBUaGUgTW91c2V0cmFja2VyIGNsYXNzLiBUaGlzIG1vbml0b3JzIG1vdXNlIG1vdmVtZW50cyBhbmQgbWFuYWdlcyBhc3NvY2lhdGVkIGhvb2tzLlxuXHQgKi9cblx0Y2xhc3MgTW91c2V0cmFja2VyIHtcblx0XHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSW50ZXJ2YWwgdG8gcmVndWxhcmx5IHJ1biB0aGUgaG9va3MgYW55d2F5LCBpbiBtaWxsaXNlY29uZHMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgSW50ZWdlclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmxvb3BEZWxheSA9IDQwMDtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGltZXIgZm9yIHRoZSBsb29wLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIFRpbWVyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudGltZXIgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBGbGFnIC0gYXJlIHdlIHN3aXRjaGVkIG9uP1xuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIEJvb2xlYW5cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyAtIGFyZSB3ZSBwcm9iYWJseSBpbmFjY3VyYXRlLCBpLmUuIG5vdCByZWZsZWN0aW5nIHRoZSBhY3R1YWwgbW91c2UgcG9zaXRpb24/XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuZGlydHkgPSB0cnVlO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBBcnJheSBvZiBob29rIGZ1bmN0aW9ucy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUgQXJyYXlcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ob29rcyA9IFtdO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBBZGRzIGEgaG9vaywgdG8gYmUgY2FsbGVkIHdoZW4gd2UgZ2V0IGV2ZW50cy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGYgQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgYXNcblx0XHQgKiA8Y29kZT5mKHgseSk8L2NvZGU+LiBJdCBzaG91bGQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gaXRcblx0XHQgKiB3YW50cyB0byBiZSByZW1vdmVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS5cblx0XHQgKi9cblx0XHRhZGRIb29rKGYpIHtcblx0XHRcdHRoaXMuaG9va3MucHVzaChmKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUnVucyBob29rcywgcGFzc2luZyB0aGVtIHRoZSB4XG5cdFx0ICogYW5kIHkgY29vcmRzIG9mIHRoZSBtb3VzZS4gIEhvb2sgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRydWUgYXJlXG5cdFx0ICogcGFzc2VkIHRvIHtAc291cmNlIE1vdXNldHJhY2tlciNyZW1vdmVIb29rc30gZm9yIHJlbW92YWwuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHJ1bkhvb2tzKCkge1xuXHRcdFx0aWYgKCF0aGlzLmhvb2tzIHx8IHRoaXMuaG9va3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIGxvZygnTW91c2V0cmFja2VyLnJ1bkhvb2tzOyB3ZSBnb3Qgc29tZSBob29rcyB0byBydW4nKTtcblx0XHRcdGxldCByZW1vdmUgPSBmYWxzZTtcblx0XHRcdGNvbnN0IHJlbW92ZU9iaiA9IHt9O1xuXHRcdFx0Ly8gdGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgYSBMT1QgLVxuXHRcdFx0Ly8gcHJlLWNhY2hlIHNvbWUgdmFyaWFibGVzXG5cdFx0XHRjb25zdCB7eH0gPSB0aGlzO1xuXHRcdFx0Y29uc3Qge3l9ID0gdGhpcztcblx0XHRcdGNvbnN0IGxlbiA9IHRoaXMuaG9va3MubGVuZ3RoO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0XHQvLyB+IHJ1biB0aGUgaG9vayBmdW5jdGlvbiwgYW5kIHJlbW92ZSBpdCBpZiBpdCByZXR1cm5zIHRydWVcblx0XHRcdFx0aWYgKHRoaXMuaG9va3NbaV0oeCwgeSkgPT09IHRydWUpIHtcblx0XHRcdFx0XHRyZW1vdmUgPSB0cnVlO1xuXHRcdFx0XHRcdHJlbW92ZU9ialtpXSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChyZW1vdmUpIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVIb29rcyhyZW1vdmVPYmopO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBSZW1vdmVzIGhvb2tzLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gcmVtb3ZlT2JqIEFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0aGUgaW5kZXhcblx0XHQgKiBudW1iZXJzIG9mIGZ1bmN0aW9ucyBmb3IgcmVtb3ZhbCwgd2l0aCB2YWx1ZXMgdGhhdCBldmFsdWF0ZSB0byB0cnVlXG5cdFx0ICovXG5cdFx0cmVtb3ZlSG9va3MocmVtb3ZlT2JqKSB7XG5cdFx0XHRjb25zdCBuZXdIb29rcyA9IFtdO1xuXHRcdFx0Y29uc3QgbGVuID0gdGhpcy5ob29rcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRcdGlmICghcmVtb3ZlT2JqW2ldKSB7XG5cdFx0XHRcdFx0bmV3SG9va3MucHVzaCh0aGlzLmhvb2tzW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5ob29rcyA9IG5ld0hvb2tzO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBFdmVudCBsaXN0ZW5lciBmb3IgbW91c2Ugd2lnZ2xlcy5cblx0XHQgKiBXZSBzaW1wbHkgZ3JhYiB0aGUgZXZlbnQsIHNldCB4IGFuZCB5IGFuZCBydW4gdGhlIGhvb2tzLlxuXHRcdCAqIFRoaXMgbWFrZXMgdGhlIGNwdSBhbGwgaG90IGFuZCBib3RoZXJlZCA6LShcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZSBNb3VzZW1vdmUgZXZlbnRcblx0XHQgKi9cblx0XHR0cmFjayhlKSB7XG5cdFx0XHQvLyB+IEFwcGFyZW50bHkgdGhpcyBpcyBuZWVkZWQgaW4gSUUuXG5cdFx0XHRlIHx8PSB3aW5kb3cuZXZlbnQ7XG5cdFx0XHRsZXQgeDtcblx0XHRcdGxldCB5O1xuXHRcdFx0aWYgKGUpIHtcblx0XHRcdFx0aWYgKGUucGFnZVgpIHtcblx0XHRcdFx0XHR4ID0gZS5wYWdlWDtcblx0XHRcdFx0XHR5ID0gZS5wYWdlWTtcblx0XHRcdFx0fSBlbHNlIGlmIChlLmNsaWVudFggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsZXQgbGVmdDtcblx0XHRcdFx0XHRsZXQgdG9wO1xuXHRcdFx0XHRcdGNvbnN0IGRvY0VsdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0XHRpZiAoZG9jRWx0KSB7XG5cdFx0XHRcdFx0XHRsZWZ0ID0gZG9jRWx0LnNjcm9sbExlZnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxlZnQgfHw9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LnNjcm9sbExlZnQgfHwgMDtcblx0XHRcdFx0XHRpZiAoZG9jRWx0KSB7XG5cdFx0XHRcdFx0XHR0b3AgPSBkb2NFbHQuc2Nyb2xsVG9wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0b3AgfHw9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuc2Nyb2xsVG9wIHx8IDA7XG5cdFx0XHRcdFx0eCA9IGUuY2xpZW50WCArIGxlZnQ7XG5cdFx0XHRcdFx0eSA9IGUuY2xpZW50WSArIHRvcDtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTZXRzIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIHN0b3JlZCBhbmQgdGFrZXMgYXBwcm9wcmlhdGUgYWN0aW9uLFxuXHRcdCAqIHJ1bm5pbmcgaG9va3MgYXMgYXBwcm9wcmlhdGUuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0ludGVnZXJ9IHgsIHkgU2NyZWVuIGNvb3JkaW5hdGVzIHRvIHNldFxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB4XG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHlcblx0XHQgKi9cblx0XHRzZXRQb3NpdGlvbih4LCB5KSB7XG5cdFx0XHR0aGlzLnggPSB4O1xuXHRcdFx0dGhpcy55ID0geTtcblx0XHRcdGlmICh0aGlzLmRpcnR5IHx8IHRoaXMuaG9va3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLmxhc3RIb29rX3ggIT09ICdudW1iZXInKSB7XG5cdFx0XHRcdHRoaXMubGFzdEhvb2tfeCA9IC0xMDA7XG5cdFx0XHRcdHRoaXMubGFzdEhvb2tfeSA9IC0xMDA7XG5cdFx0XHR9XG5cdFx0XHRsZXQgZGlmZiA9ICh0aGlzLmxhc3RIb29rX3ggLSB4KSAqICh0aGlzLmxhc3RIb29rX3kgLSB5KTtcblx0XHRcdGRpZmYgPSBkaWZmID49IDAgPyBkaWZmIDogLWRpZmY7XG5cdFx0XHRpZiAoZGlmZiA+IDEpIHtcblx0XHRcdFx0dGhpcy5sYXN0SG9va194ID0geDtcblx0XHRcdFx0dGhpcy5sYXN0SG9va195ID0geTtcblx0XHRcdFx0aWYgKHRoaXMuZGlydHkpIHtcblx0XHRcdFx0XHR0aGlzLmRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5ydW5Ib29rcygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNldHMgdGhpbmdzIGluIG1vdGlvbiwgdW5sZXNzIHRoZXkgYXJlIGFscmVhZHkgdGhhdCBpcywgcmVnaXN0ZXJpbmcgYW4gZXZlbnQgbGlzdGVuZXIgb25cblx0XHQgKiA8Y29kZT5kb2N1bWVudC5vbm1vdXNlbW92ZTwvY29kZT4uIEEgaGFsZi1oZWFydGVkIGF0dGVtcHQgaXMgbWFkZSB0byBwcmVzZXJ2ZSB0aGUgb2xkIGV2ZW50XG5cdFx0ICogbGlzdGVuZXIgaWYgdGhlcmUgaXMgb25lLlxuXHRcdCAqL1xuXHRcdGVuYWJsZSgpIHtcblx0XHRcdGlmICh0aGlzLmFjdGl2ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdFx0XHQvLyB+IFNhdmUgdGhlIGN1cnJlbnQgbGlzdGVuZXIgZm9yIG1vdXNlbW92ZSBldmVudHMuIFRoaXMgaXNuJ3QgdG9vXG5cdFx0XHQvLyB+IHJvYnVzdCwgb2YgY291cnNlLlxuXHRcdFx0dGhpcy5zYXZlZExpc3RlbmVyID0gZG9jdW1lbnQub25tb3VzZW1vdmU7XG5cdFx0XHQvLyB+IEdvdHRhIHNhdmUgQHR0e3RoaXN9IGFnYWluIGZvciB0aGUgY2xvc3VyZSwgYW5kIHVzZSBhcHBseSBmb3Jcblx0XHRcdC8vIH4gdGhlIG1lbWJlciBmdW5jdGlvbi5cblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0ZG9jdW1lbnQub25tb3VzZW1vdmUgPSAoZSkgPT4ge1xuXHRcdFx0XHRzZWxmLnRyYWNrKGUpO1xuXHRcdFx0fTtcblx0XHRcdGlmICh0aGlzLmxvb3BEZWxheSkge1xuXHRcdFx0XHR0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0XHRcdC8vIGxvZygnbG9vcCBkZWxheSBpbiBtb3VzZXRyYWNrZXIgaXMgd29ya2luZycpO1xuXHRcdFx0XHRcdHNlbGYucnVuSG9va3MoKTtcblx0XHRcdFx0fSwgdGhpcy5sb29wRGVsYXkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBEaXNhYmxlcyB0aGUgdHJhY2tlciwgcmVtb3ZpbmcgdGhlIGV2ZW50IGxpc3RlbmVyLlxuXHRcdCAqL1xuXHRcdGRpc2FibGUoKSB7XG5cdFx0XHRpZiAoIXRoaXMuYWN0aXZlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgdGhpcy5zYXZlZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gdGhpcy5zYXZlZExpc3RlbmVyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIGRvY3VtZW50Lm9ubW91c2Vtb3ZlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMudGltZXIpIHtcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IE5hdnBvcHVwLlxuXHQgKiBHZXRzIGEgVUlEIGZvciB0aGUgcG9wdXAgYW5kXG5cdCAqXG5cdCAqIEBwYXJhbSBpbml0IENvbnRydWN0b3Igb2JqZWN0LiBJZiA8Y29kZT5pbml0LmRyYWdnYWJsZTwvY29kZT4gaXMgdHJ1ZSBvciBhYnNlbnQsIHRoZSBwb3B1cCBiZWNvbWVzIGRyYWdnYWJsZS5cblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBjbGFzcyBUaGUgTmF2cG9wdXAgY2xhc3MuIFRoaXMgZ2VuZXJhdGVzIHBvcHVwIGhpbnRzLCBhbmQgZG9lcyBzb21lIG1hbmFnZW1lbnQgb2YgdGhlbS5cblx0ICovXG5cdGNsYXNzIE5hdnBvcHVwIHtcblx0XHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcdC8vIG13Lm5vdGlmeSgnbmV3IE5hdnBvcHVwKGluaXQpJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICd3YXJuJ30pO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBVSUQgZm9yIGVhY2ggTmF2cG9wdXAgaW5zdGFuY2UuXG5cdFx0XHQgKiBSZWFkLW9ubHkuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgaW50ZWdlclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnVpZCA9IE5hdnBvcHVwLnVpZCsrO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZWFkLW9ubHkgZmxhZyBmb3IgY3VycmVudCB2aXNpYmlsaXR5IG9mIHRoZSBwb3B1cC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnZpc2libGUgPSBmYWxzZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyB0byBiZSBzZXQgd2hlbiB3ZSB3YW50IHRvIGNhbmNlbCBhIHByZXZpb3VzIHJlcXVlc3QgdG9cblx0XHRcdCAqIHNob3cgdGhlIHBvcHVwIGluIGEgbGl0dGxlIHdoaWxlLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubm9zaG93ID0gZmFsc2U7XG5cdFx0XHQvKipcblx0XHRcdCAqIENhdGVnb3Jpc2VkIGxpc3Qgb2YgaG9va3MuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHNlZSAjcnVuSG9va3Ncblx0XHRcdCAqIEBzZWUgI2FkZEhvb2tcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSBPYmplY3Rcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ob29rcyA9IHtcblx0XHRcdFx0Y3JlYXRlOiBbXSxcblx0XHRcdFx0dW5oaWRlOiBbXSxcblx0XHRcdFx0aGlkZTogW10sXG5cdFx0XHR9O1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBsaXN0IG9mIHVuaXF1ZSBJRHMgb2YgaG9vayBmdW5jdGlvbnMsIHRvIGF2b2lkIGR1cGxpY2F0ZXNcblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmhvb2tJZHMgPSB7fTtcblx0XHRcdC8qKlxuXHRcdFx0ICogTGlzdCBvZiBkb3dubG9hZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3B1cC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUgQXJyYXlcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5kb3dubG9hZHMgPSBbXTtcblx0XHRcdC8qKlxuXHRcdFx0ICogTnVtYmVyIG9mIHVuY29tcGxldGVkIGRvd25sb2Fkcy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBpbnRlZ2VyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMucGVuZGluZyA9IG51bGw7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRvbGVyYW5jZSBpbiBwaXhlbHMgd2hlbiBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbW91c2UgaGFzIGxlZnQgdGhlIHBvcHVwLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIGludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5mdXp6ID0gNTtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyB0byB0b2dnbGUgcnVubmluZyB7QHNvdXJjZSAjbGltaXRIb3Jpem9udGFsUG9zaXRpb259IHRvIHJlZ3VsYXRlIHRoZSBwb3B1cCdzIHBvc2l0aW9uLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIGJvb2xlYW5cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5jb25zdHJhaW5lZCA9IHRydWU7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBwb3B1cCB3aWR0aCBpbiBwaXhlbHMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEB0eXBlIGludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy53aWR0aCA9IDA7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBwb3B1cCB3aWR0aCBpbiBwaXhlbHMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEB0eXBlIGludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5oZWlnaHQgPSAwO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgbWFpbiBjb250ZW50IERJViBlbGVtZW50LlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIEhUTUxEaXZFbGVtZW50XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubWFpbkRpdiA9IG51bGw7XG5cdFx0XHR0aGlzLmNyZWF0ZU1haW5EaXYoKTtcblx0XHRcdC8vXHRpZiAoIWluaXQgfHwgdHlwZW9mIGluaXQucG9wdXBzX2RyYWdnYWJsZT09J3VuZGVmaW5lZCcgfHwgaW5pdC5wb3B1cHNfZHJhZ2dhYmxlKSB7XG5cdFx0XHQvL1x0XHR0aGlzLm1ha2VEcmFnZ2FibGUodHJ1ZSk7XG5cdFx0XHQvL1x0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBSZXRyaWV2ZXMgdGhlIHtAc291cmNlICN2aXNpYmxlfSBhdHRyaWJ1dGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgcG9wdXAgaXMgY3VycmVudGx5IHZpc2libGUuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0ICovXG5cdFx0aXNWaXNpYmxlKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudmlzaWJsZTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUmVwb3NpdGlvbnMgcG9wdXAgdXNpbmcgQ1NTIHN0eWxlLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge2ludGVnZXJ9IHggeC1jb29yZGluYXRlIChweClcblx0XHQgKiBAcGFyYW0ge2ludGVnZXJ9IHkgeS1jb29yZGluYXRlIChweClcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IG5vTGltaXRIb3IgRG9uJ3QgY2FsbCB7QHNvdXJjZSAjbGltaXRIb3Jpem9udGFsUG9zaXRpb259XG5cdFx0ICovXG5cdFx0cmVwb3NpdGlvbih4LCB5LCBub0xpbWl0SG9yKSB7XG5cdFx0XHRsb2coYHJlcG9zaXRpb24oJHt4fSwke3l9LCR7bm9MaW1pdEhvcn0pYCk7XG5cdFx0XHRpZiAoeCAhPT0gdW5kZWZpbmVkICYmIHggIT09IG51bGwpIHtcblx0XHRcdFx0dGhpcy5sZWZ0ID0geDtcblx0XHRcdH1cblx0XHRcdGlmICh5ICE9PSB1bmRlZmluZWQgJiYgeSAhPT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLnRvcCA9IHk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy50b3AgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUubGVmdCA9IGAke3RoaXMubGVmdH1weGA7XG5cdFx0XHRcdHRoaXMubWFpbkRpdi5zdHlsZS50b3AgPSBgJHt0aGlzLnRvcH1weGA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW5vTGltaXRIb3IpIHtcblx0XHRcdFx0dGhpcy5saW1pdEhvcml6b250YWxQb3NpdGlvbigpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBQcmV2ZW50cyBwb3B1cHMgZnJvbSBiZWluZyBpbiBzaWxseSBsb2NhdGlvbnMuIEhvcGVmdWxseS5cblx0XHQgKiBTaG91bGQgbm90IGJlIHJ1biBpZiB7QHNvdXJjZSAjY29uc3RyYWluZWR9IGlzIHRydWUuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGxpbWl0SG9yaXpvbnRhbFBvc2l0aW9uKCkge1xuXHRcdFx0aWYgKCF0aGlzLmNvbnN0cmFpbmVkIHx8IHRoaXMudG9vV2lkZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnVwZGF0ZURpbWVuc2lvbnMoKTtcblx0XHRcdGNvbnN0IHggPSB0aGlzLmxlZnQ7XG5cdFx0XHRjb25zdCB3ID0gdGhpcy53aWR0aDtcblx0XHRcdGNvbnN0IGNXaWR0aCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jbGllbnRXaWR0aDtcblx0XHRcdC8vXHRsb2coJ2xpbWl0SG9yaXpvbnRhbFBvc2l0aW9uOiB4PScreCtcblx0XHRcdC8vXHRcdFx0JywgdGhpcy5sZWZ0PScgKyB0aGlzLmxlZnQgK1xuXHRcdFx0Ly9cdFx0XHQnLCB0aGlzLndpZHRoPScgKyB0aGlzLndpZHRoICtcblx0XHRcdC8vXHRcdFx0JywgY1dpZHRoPScgKyBjV2lkdGgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR4ICsgdyA+PSBjV2lkdGggfHxcblx0XHRcdFx0KHggPiAwICYmXG5cdFx0XHRcdFx0dGhpcy5tYXhXaWR0aCAmJlxuXHRcdFx0XHRcdHRoaXMud2lkdGggPCB0aGlzLm1heFdpZHRoICYmXG5cdFx0XHRcdFx0dGhpcy5oZWlnaHQgPiB0aGlzLndpZHRoICYmXG5cdFx0XHRcdFx0eCA+IGNXaWR0aCAtIHRoaXMubWF4V2lkdGgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIHZlcnkgbmFzdHkgaGFjay4gVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSFcblx0XHRcdFx0Ly8gV2UgZmluZCB0aGUgXCJuYXR1cmFsXCIgd2lkdGggb2YgdGhlIGRpdiBieSBwb3NpdGlvbmluZyBpdCBhdCB0aGUgZmFyIGxlZnRcblx0XHRcdFx0Ly8gdGhlbiByZXNldCBpdCBzbyB0aGF0IGl0IHNob3VsZCBiZSBmbHVzaCByaWdodCAod2VsbCwgbmVhcmx5KVxuXHRcdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUubGVmdCA9ICctMTAwMDBweCc7XG5cdFx0XHRcdHRoaXMubWFpbkRpdi5zdHlsZS53aWR0aCA9IGAke3RoaXMubWF4V2lkdGh9cHhgO1xuXHRcdFx0XHRjb25zdCBuYXR1cmFsV2lkdGggPSBOdW1iZXIucGFyc2VJbnQodGhpcy5tYWluRGl2Lm9mZnNldFdpZHRoLCAxMCk7XG5cdFx0XHRcdGxldCBuZXdMZWZ0ID0gY1dpZHRoIC0gbmF0dXJhbFdpZHRoIC0gMTtcblx0XHRcdFx0aWYgKG5ld0xlZnQgPCAwKSB7XG5cdFx0XHRcdFx0bmV3TGVmdCA9IDA7XG5cdFx0XHRcdFx0dGhpcy50b29XaWRlID0gdHJ1ZTtcblx0XHRcdFx0fSAvLyBzdGlsbCB1bnN0YWJsZSBmb3IgcmVhbGx5IHdpZGUgcG9wdXBzP1xuXHRcdFx0XHRsb2coXG5cdFx0XHRcdFx0YGxpbWl0SG9yaXpvbnRhbFBvc2l0aW9uOiBtb3ZpbmcgdG8gKCR7bmV3TGVmdH0sJHt0aGlzLnRvcH0pO2AgK1xuXHRcdFx0XHRcdFx0YCBuYXR1cmFsV2lkdGg9JHtuYXR1cmFsV2lkdGh9LCBjbGllbnRXaWR0aD0ke2NXaWR0aH1gXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoaXMucmVwb3NpdGlvbihuZXdMZWZ0LCBudWxsLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQnJpbmdzIHBvcHVwIHRvIHRoZSB0b3Agb2YgdGhlIHotb3JkZXIuXG5cdFx0ICogV2UgaW5jcmVtZW50IHRoZSB7QHNvdXJjZSAjaGlnaGVzdH0gcHJvcGVydHkgb2YgdGhlIGNvbnRydWN0b3IgaGVyZS5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0cmFpc2UoKSB7XG5cdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUuekluZGV4ID0gTmF2cG9wdXAuaGlnaGVzdCArIDE7XG5cdFx0XHQrK05hdnBvcHVwLmhpZ2hlc3Q7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNob3dzIHRoZSBwb3B1cCBwcm92aWRlZCB7QHNvdXJjZSAjbm9zaG93fSBpcyBub3QgdHJ1ZS5cblx0XHQgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiwgYnJpbmdzIHRoZSBwb3B1cCB0byB0aGUgdG9wIG9mIHRoZSB6LW9yZGVyIGFuZCB1bmhpZGVzIGl0LlxuXHRcdCAqL1xuXHRcdHNob3coKSB7XG5cdFx0XHQvLyBkb2N1bWVudC50aXRsZSs9J3MnO1xuXHRcdFx0aWYgKHRoaXMubm9zaG93KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIGRvY3VtZW50LnRpdGxlKz0ndCc7XG5cdFx0XHR0aGlzLnJlcG9zaXRpb24oKTtcblx0XHRcdHRoaXMucmFpc2UoKTtcblx0XHRcdHRoaXMudW5oaWRlKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIENoZWNrcyB0byBzZWUgaWYgdGhlIG1vdXNlIHBvaW50ZXIgaGFzXG5cdFx0ICogc3RhYmlsaXNlZCAoY2hlY2tpbmcgZXZlcnkgPGNvZGU+dGltZTwvY29kZT4vMiBtaWxsaXNlY29uZHMpIGFuZCBydW5zIHRoZVxuXHRcdCAqIHtAc291cmNlICNzaG93fSBtZXRob2QgaWYgaXQgaGFzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lIFRoZSBtaW5pbXVtIHRpbWUgKG1zKSBiZWZvcmUgdGhlIHBvcHVwIG1heSBiZSBzaG93bi5cblx0XHQgKi9cblx0XHRzaG93U29vbklmU3RhYmxlKHRpbWUpIHtcblx0XHRcdGxvZyhgc2hvd1Nvb25JZlN0YWJsZSwgdGltZT0ke3RpbWV9YCk7XG5cdFx0XHRpZiAodGhpcy52aXNpYmxlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMubm9zaG93ID0gZmFsc2U7XG5cdFx0XHQvLyB+IGluaXRpYWxpemUgdGhlc2UgdmFyaWFibGVzIHNvIHRoYXQgd2UgbmV2ZXIgcnVuIEB0dHtzaG93fSBhZnRlclxuXHRcdFx0Ly8gfiBqdXN0IGhhbGYgdGhlIHRpbWVcblx0XHRcdHRoaXMuc3RhYmxlX3ggPSAtMWU0O1xuXHRcdFx0dGhpcy5zdGFibGVfeSA9IC0xZTQ7XG5cdFx0XHRjb25zdCBzdGFibGVTaG93ID0gKCkgPT4ge1xuXHRcdFx0XHRsb2coJ3N0YWJsZVNob3cgY2FsbGVkJyk7XG5cdFx0XHRcdGNvbnN0IG5ld194ID0gTmF2cG9wdXAudHJhY2tlci54O1xuXHRcdFx0XHRjb25zdCBuZXdfeSA9IE5hdnBvcHVwLnRyYWNrZXIueTtcblx0XHRcdFx0Y29uc3QgZHggPSBzZWxmLnN0YWJsZV94IC0gbmV3X3g7XG5cdFx0XHRcdGNvbnN0IGR5ID0gc2VsZi5zdGFibGVfeSAtIG5ld195O1xuXHRcdFx0XHRjb25zdCBmdXp6MiA9IDA7IC8vIHNhdmVkVGhpcy5mdXp6ICogc2F2ZWRUaGlzLmZ1eno7XG5cdFx0XHRcdC8vIGRvY3VtZW50LnRpdGxlICs9ICdbJyArIFtzYXZlZFRoaXMuc3RhYmxlX3gsbmV3X3gsIHNhdmVkVGhpcy5zdGFibGVfeSxuZXdfeSwgZHgsIGR5LCBmdXp6Ml0uam9pbignLCcpICsgJ10gJztcblx0XHRcdFx0aWYgKGR4ICogZHggPD0gZnV6ejIgJiYgZHkgKiBkeSA8PSBmdXp6Mikge1xuXHRcdFx0XHRcdGxvZygnbW91c2UgaXMgc3RhYmxlJyk7XG5cdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbChzZWxmLnNob3dTb29uU3RhYmxlVGltZXIpO1xuXHRcdFx0XHRcdHNlbGYucmVwb3NpdGlvbihuZXdfeCArIDIsIG5ld195ICsgMik7XG5cdFx0XHRcdFx0c2VsZi5zaG93KCk7XG5cdFx0XHRcdFx0c2VsZi5saW1pdEhvcml6b250YWxQb3NpdGlvbigpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxmLnN0YWJsZV94ID0gbmV3X3g7XG5cdFx0XHRcdHNlbGYuc3RhYmxlX3kgPSBuZXdfeTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdHRoaXMuc2hvd1Nvb25TdGFibGVUaW1lciA9IHNldEludGVydmFsKHN0YWJsZVNob3csIHRpbWUgLyAyKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU2V0cyB0aGUge0Bzb3VyY2UgI25vc2hvd30gZmxhZyBhbmQgaGlkZXMgdGhlIHBvcHVwLiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcblx0XHQgKiB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGxpbmsgYmVmb3JlXG5cdFx0ICogKG9yIGFmdGVyKSBpdCdzIGFjdHVhbGx5IGJlZW4gZGlzcGxheWVkLlxuXHRcdCAqL1xuXHRcdGJhbmlzaCgpIHtcblx0XHRcdGxvZygnYmFuaXNoIGNhbGxlZCcpO1xuXHRcdFx0Ly8gaGlkZSBhbmQgcHJldmVudCBzaG93aW5nIHdpdGggc2hvd1Nvb24gaW4gdGhlIGZ1dHVyZVxuXHRcdFx0dGhpcy5ub3Nob3cgPSB0cnVlO1xuXHRcdFx0aWYgKHRoaXMuc2hvd1Nvb25TdGFibGVUaW1lcikge1xuXHRcdFx0XHRsb2coJ2NsZWFyaW5nIHNob3dTb29uU3RhYmxlVGltZXInKTtcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnNob3dTb29uU3RhYmxlVGltZXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5oaWRlKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJ1bnMgaG9va3MgYWRkZWQgd2l0aCB7QHNvdXJjZSAjYWRkSG9va30uXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IG5hbWUgb2YgdGhlIHtAc291cmNlICNob29rc30gYXJyYXkgLSBvbmUgb2YgJ2NyZWF0ZScsICd1bmhpZGUnLCAnaGlkZSdcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gd2hlbiBDb250cm9scyBleGFjdGx5IHdoZW4gdGhlIGhvb2sgaXMgcnVuOiBlaXRoZXIgJ2JlZm9yZScgb3IgJ2FmdGVyJ1xuXHRcdCAqL1xuXHRcdHJ1bkhvb2tzKGtleSwgd2hlbikge1xuXHRcdFx0aWYgKCF0aGlzLmhvb2tzW2tleV0pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qga2V5SG9va3MgPSB0aGlzLmhvb2tzW2tleV07XG5cdFx0XHRjb25zdCBsZW4gPSBrZXlIb29rcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRcdGlmIChrZXlIb29rc1tpXSAmJiBrZXlIb29rc1tpXS53aGVuID09PSB3aGVuICYmIFJlZmxlY3QuYXBwbHkoa2V5SG9va3NbaV0uaG9vaywgdGhpcywgW10pKSB7XG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHRoZSBob29rXG5cdFx0XHRcdFx0aWYgKGtleUhvb2tzW2ldLmhvb2tJZCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaG9va0lkc1trZXlIb29rc1tpXS5ob29rSWRdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRrZXlIb29rc1tpXSA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQWRkcyBhIGhvb2sgdG8gdGhlIHBvcHVwLiBIb29rIGZ1bmN0aW9ucyBhcmUgcnVuIHdpdGggPGNvZGU+dGhpczwvY29kZT4gc2V0IHRvIHJlZmVyIHRvIHRoZVxuXHRcdCAqIE5hdnBvcHVwIGluc3RhbmNlLCBhbmQgbm8gYXJndW1lbnRzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gaG9vayBUaGUgaG9vayBmdW5jdGlvbi4gRnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRydWUgYXJlIGRlbGV0ZWQuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgbmFtZSBvZiB0aGUge0Bzb3VyY2UgI2hvb2tzfSBhcnJheSAtIG9uZSBvZiAnY3JlYXRlJywgJ3VuaGlkZScsICdoaWRlJ1xuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB3aGVuIENvbnRyb2xzIGV4YWN0bHkgd2hlbiB0aGUgaG9vayBpcyBydW46IGVpdGhlciAnYmVmb3JlJyBvciAnYWZ0ZXInXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHVpZCBBIHRydXRoeSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGhvb2sgZnVuY3Rpb247IGlmIGl0IG1hdGNoZXMgYW5vdGhlciBob29rXG5cdFx0ICogaW4gdGhpcyBwb3NpdGlvbiwgaXQgd29uJ3QgYmUgYWRkZWQgYWdhaW4uXG5cdFx0ICovXG5cdFx0YWRkSG9vayhob29rLCBrZXksIHdoZW4sIHVpZCkge1xuXHRcdFx0d2hlbiB8fD0gJ2FmdGVyJztcblx0XHRcdGlmICghdGhpcy5ob29rc1trZXldKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIGlmIHVpZCBpcyBzcGVjaWZpZWQsIGRvbid0IGFkZCBkdXBsaWNhdGVzXG5cdFx0XHRsZXQgaG9va0lkO1xuXHRcdFx0aWYgKHVpZCkge1xuXHRcdFx0XHRob29rSWQgPSBba2V5LCB3aGVuLCB1aWRdLmpvaW4oJ3wnKTtcblx0XHRcdFx0aWYgKHRoaXMuaG9va0lkc1tob29rSWRdKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaG9va0lkc1tob29rSWRdID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaG9va3Nba2V5XS5wdXNoKHtcblx0XHRcdFx0aG9vayxcblx0XHRcdFx0d2hlbixcblx0XHRcdFx0aG9va0lkLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIENyZWF0ZXMgdGhlIG1haW4gRElWIGVsZW1lbnQsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgYWN0dWFsIHBvcHVwIGNvbnRlbnQuXG5cdFx0ICogUnVucyBob29rcyB3aXRoIGtleSAnY3JlYXRlJy5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Y3JlYXRlTWFpbkRpdigpIHtcblx0XHRcdGlmICh0aGlzLm1haW5EaXYpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5ydW5Ib29rcygnY3JlYXRlJywgJ2JlZm9yZScpO1xuXHRcdFx0Y29uc3QgbWFpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHRtYWluRGl2Lm9uY2xpY2sgPSAoZSkgPT4ge1xuXHRcdFx0XHRzZWxmLm9uY2xpY2tMaXN0ZW5lcihlKTtcblx0XHRcdH07XG5cdFx0XHRtYWluRGl2LmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lID8/ICduYXZwb3B1cF9tYWluZGl2Jztcblx0XHRcdG1haW5EaXYuaWQgPSBtYWluRGl2LmNsYXNzTmFtZSArIHRoaXMudWlkO1xuXHRcdFx0bWFpbkRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRtYWluRGl2LnN0eWxlLm1pbldpZHRoID0gJzM1MHB4Jztcblx0XHRcdG1haW5EaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdG1haW5EaXYuY2xhc3NOYW1lID0gJ25hdnBvcHVwJztcblx0XHRcdC8vIGVhc3kgYWNjZXNzIHRvIGphdmFzY3JpcHQgb2JqZWN0IHRocm91Z2ggRE9NIGZ1bmN0aW9uc1xuXHRcdFx0bWFpbkRpdi5uYXZwb3B1cCA9IHRoaXM7XG5cdFx0XHR0aGlzLm1haW5EaXYgPSBtYWluRGl2O1xuXHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmFwcGVuZChtYWluRGl2KTtcblx0XHRcdHRoaXMucnVuSG9va3MoJ2NyZWF0ZScsICdhZnRlcicpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBDYWxscyB0aGUge0Bzb3VyY2UgI3JhaXNlfSBtZXRob2QuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG9uY2xpY2tMaXN0ZW5lcigpIHtcblx0XHRcdHRoaXMucmFpc2UoKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogTWFrZXMgdGhlIHBvcHVwIGRyYWdnYWJsZSwgdXNpbmcgYSB7QHNvdXJjZSBEcmFnfSBvYmplY3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaGFuZGxlTmFtZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0bWFrZURyYWdnYWJsZShoYW5kbGVOYW1lKSB7XG5cdFx0XHRpZiAoIXRoaXMubWFpbkRpdikge1xuXHRcdFx0XHR0aGlzLmNyZWF0ZU1haW5EaXYoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGRyYWcgPSBuZXcgRHJhZygpO1xuXHRcdFx0aWYgKCFoYW5kbGVOYW1lKSB7XG5cdFx0XHRcdGRyYWcuc3RhcnRDb25kaXRpb24gPSAoZSkgPT4ge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRpZiAoIWUuc2hpZnRLZXkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGxldCBkcmFnSGFuZGxlO1xuXHRcdFx0aWYgKGhhbmRsZU5hbWUpIHtcblx0XHRcdFx0ZHJhZ0hhbmRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2hhbmRsZU5hbWV9YCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWRyYWdIYW5kbGUpIHtcblx0XHRcdFx0ZHJhZ0hhbmRsZSA9IHRoaXMubWFpbkRpdjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0ZHJhZy5lbmRIb29rID0gKHgsIHkpID0+IHtcblx0XHRcdFx0TmF2cG9wdXAudHJhY2tlci5kaXJ0eSA9IHRydWU7XG5cdFx0XHRcdHNlbGYucmVwb3NpdGlvbih4LCB5KTtcblx0XHRcdH07XG5cdFx0XHRkcmFnLmluaXQoZHJhZ0hhbmRsZSwgdGhpcy5tYWluRGl2KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogSGlkZXMgdGhlIHBvcHVwIHVzaW5nIENTUy4gUnVucyBob29rcyB3aXRoIGtleSAnaGlkZScuXG5cdFx0ICogU2V0cyB7QHNvdXJjZSAjdmlzaWJsZX0gYXBwcm9wcmlhdGVseS5cblx0XHQgKiB7QHNvdXJjZSAjYmFuaXNofSBzaG91bGQgYmUgY2FsbGVkIGV4dGVybmFsbHkgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0aGlkZSgpIHtcblx0XHRcdHRoaXMucnVuSG9va3MoJ2hpZGUnLCAnYmVmb3JlJyk7XG5cdFx0XHR0aGlzLmFib3J0RG93bmxvYWRzKCk7XG5cdFx0XHRpZiAodGhpcy52aXNpYmxlICE9PSB1bmRlZmluZWQgJiYgdGhpcy52aXNpYmxlKSB7XG5cdFx0XHRcdHRoaXMubWFpbkRpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHR0aGlzLnZpc2libGUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMucnVuSG9va3MoJ2hpZGUnLCAnYWZ0ZXInKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU2hvd3MgdGhlIHBvcHVwIHVzaW5nIENTUy4gUnVucyBob29rcyB3aXRoIGtleSAndW5oaWRlJy5cblx0XHQgKiBTZXRzIHtAc291cmNlICN2aXNpYmxlfSBhcHByb3ByaWF0ZWx5LiAgIHtAc291cmNlICNzaG93fSBzaG91bGQgYmUgY2FsbGVkIGV4dGVybmFsbHkgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dW5oaWRlKCkge1xuXHRcdFx0dGhpcy5ydW5Ib29rcygndW5oaWRlJywgJ2JlZm9yZScpO1xuXHRcdFx0aWYgKHRoaXMudmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmICF0aGlzLnZpc2libGUpIHtcblx0XHRcdFx0dGhpcy5tYWluRGl2LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcblx0XHRcdFx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMucnVuSG9va3MoJ3VuaGlkZScsICdhZnRlcicpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTZXRzIHRoZSA8Y29kZT5pbm5lckhUTUw8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgbWFpbiBkaXYgY29udGFpbmluZyB0aGUgcG9wdXAgY29udGVudC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIFRoZSBIVE1MIHRvIHNldC5cblx0XHQgKi9cblx0XHRzZXRJbm5lckhUTUwoaHRtbCkge1xuXHRcdFx0dGhpcy5tYWluRGl2LmlubmVySFRNTCA9IGh0bWw7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZXMgdGhlIHtAc291cmNlICN3aWR0aH0gYW5kIHtAc291cmNlICNoZWlnaHR9IGF0dHJpYnV0ZXMgd2l0aCB0aGUgQ1NTIHByb3BlcnRpZXMuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHVwZGF0ZURpbWVuc2lvbnMoKSB7XG5cdFx0XHR0aGlzLndpZHRoID0gTnVtYmVyLnBhcnNlSW50KHRoaXMubWFpbkRpdi5vZmZzZXRXaWR0aCwgMTApO1xuXHRcdFx0dGhpcy5oZWlnaHQgPSBOdW1iZXIucGFyc2VJbnQodGhpcy5tYWluRGl2Lm9mZnNldEhlaWdodCwgMTApO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBDaGVja3MgaWYgdGhlIHBvaW50ICh4LHkpIGlzIHdpdGhpbiB7QHNvdXJjZSAjZnV6en0gb2YgdGhlXG5cdFx0ICoge0Bzb3VyY2UgI21haW5EaXZ9LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB4IHgtY29vcmRpbmF0ZSAocHgpXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB5IHktY29vcmRpbmF0ZSAocHgpXG5cdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdCAqL1xuXHRcdGlzV2l0aGluKHgsIHkpIHtcblx0XHRcdC8vIH4gSWYgd2UncmUgbm90IGV2ZW4gdmlzaWJsZSwgbm8gcG9pbnQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXNcblx0XHRcdC8vIH4gYmVpbmcgd2l0aGluIHRoZSBwb3B1cC5cblx0XHRcdGlmICghdGhpcy52aXNpYmxlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHRoaXMudXBkYXRlRGltZW5zaW9ucygpO1xuXHRcdFx0Y29uc3QgZnV6eiA9IHRoaXMuZnV6eiB8fCAwO1xuXHRcdFx0Ly8gfiBVc2UgYSBzaW1wbGUgYm94IG1ldHJpYyBoZXJlLlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0eCArIGZ1enogPj0gdGhpcy5sZWZ0ICYmXG5cdFx0XHRcdHggLSBmdXp6IDw9IHRoaXMubGVmdCArIHRoaXMud2lkdGggJiZcblx0XHRcdFx0eSArIGZ1enogPj0gdGhpcy50b3AgJiZcblx0XHRcdFx0eSAtIGZ1enogPD0gdGhpcy50b3AgKyB0aGlzLmhlaWdodFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQWRkcyBhIGRvd25sb2FkIHRvIHtAc291cmNlICNkb3dubG9hZHN9LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtEb3dubG9hZGVyfSBkb3dubG9hZFxuXHRcdCAqL1xuXHRcdGFkZERvd25sb2FkKGRvd25sb2FkKSB7XG5cdFx0XHRpZiAoIWRvd25sb2FkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuZG93bmxvYWRzLnB1c2goZG93bmxvYWQpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBBYm9ydHMgdGhlIGRvd25sb2FkcyBsaXN0ZWQgaW4ge0Bzb3VyY2UgI2Rvd25sb2Fkc30uXG5cdFx0ICpcblx0XHQgKiBAc2VlIERvd25sb2FkZXIjYWJvcnRcblx0XHQgKi9cblx0XHRhYm9ydERvd25sb2FkcygpIHtcblx0XHRcdGZvciAoY29uc3QgZCBvZiB0aGlzLmRvd25sb2Fkcykge1xuXHRcdFx0XHRpZiAoZCAmJiBkLmFib3J0KSB7XG5cdFx0XHRcdFx0ZC5hYm9ydCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRvd25sb2FkcyA9IFtdO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogQSBVSUQgZm9yIGVhY2ggTmF2cG9wdXAuIFRoaXMgY29uc3RydWN0b3IgcHJvcGVydHkgaXMganVzdCBhIGNvdW50ZXIuXG5cdCAqXG5cdCAqIEB0eXBlIGludGVnZXJcblx0ICogQHByaXZhdGVcblx0ICovXG5cdE5hdnBvcHVwLnVpZCA9IDA7XG5cdC8qKlxuXHQgKiBDb3VudGVyIGluZGljYXRpbmcgdGhlIHotb3JkZXIgb2YgdGhlIFwiaGlnaGVzdFwiIHBvcHVwLlxuXHQgKiBXZSBzdGFydCB0aGUgei1pbmRleCBhdCAxMDAwIHNvIHRoYXQgcG9wdXBzIGFyZSBhYm92ZSBldmVyeXRoaW5nXG5cdCAqIGVsc2Ugb24gdGhlIHNjcmVlbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHR5cGUgaW50ZWdlclxuXHQgKi9cblx0TmF2cG9wdXAuaGlnaGVzdCA9IDEwMDA7XG5cdC8qKlxuXHQgKiBBIHtAc291cmNlIE1vdXNldHJhY2tlcn0gaW5zdGFuY2Ugd2hpY2ggaXMgYSBwcm9wZXJ0eSBvZiB0aGUgY29uc3RydWN0b3IgKHBzZXVkby1nbG9iYWwpLlxuXHQgKi9cblx0TmF2cG9wdXAudHJhY2tlciA9IG5ldyBNb3VzZXRyYWNrZXIoKTtcblx0Ly8gRU5ERklMRTogbmF2cG9wdXAuanNcblx0Ly8gU1RBUlRGSUxFOiBkaWZmLmpzXG5cdC8qKlxuXHQgKiBKYXZhc2NyaXB0IERpZmYgQWxnb3JpdGhtIEJ5IEpvaG4gUmVzaWcgKGh0dHA6Ly9lam9obi5vcmcvKSBhbmQgTHVwaW5cblx0ICpcblx0ICogTW9yZSBJbmZvOiBodHRwOi8vZWpvaG4ub3JnL3Byb2plY3RzL2phdmFzY3JpcHQtZGlmZi1hbGdvcml0aG0vXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nW119IHhcblx0ICovXG5cdGNvbnN0IGRlbEZtdCA9ICh4KSA9PiB7XG5cdFx0aWYgKHgubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdHJldHVybiBgPGRlbCBjbGFzcz0ncG9wdXBEaWZmJz4ke3guam9pbignJyl9PC9kZWw+YDtcblx0fTtcblx0Y29uc3QgaW5zRm10ID0gKHgpID0+IHtcblx0XHRpZiAoeC5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cdFx0cmV0dXJuIGA8aW5zIGNsYXNzPSdwb3B1cERpZmYnPiR7eC5qb2luKCcnKX08L2lucz5gO1xuXHR9O1xuXHRjb25zdCBjb3VudENyb3NzaW5ncyA9IChhLCBiLCBpLCBlamVjdCkgPT4ge1xuXHRcdC8vIGNvdW50IHRoZSBjcm9zc2luZ3Mgb24gdGhlIGVkZ2Ugc3RhcnRpbmcgYXQgYltpXVxuXHRcdGlmICghYltpXS5yb3cgJiYgYltpXS5yb3cgIT09IDApIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cdFx0bGV0IGNvdW50ID0gMDtcblx0XHRmb3IgKGNvbnN0IFtqLCBlbGVtZW50XSBvZiBhLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKCFlbGVtZW50LnJvdyAmJiBlbGVtZW50LnJvdyAhPT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICgoaiAtIGJbaV0ucm93KSAqIChpIC0gZWxlbWVudC5yb3cpID4gMCkge1xuXHRcdFx0XHRpZiAoZWplY3QpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY291bnQ7XG5cdH07XG5cdGNvbnN0IHNob3J0ZW5EaWZmU3RyaW5nID0gZnVuY3Rpb24gc2hvcnRlbkRpZmZTdHJpbmcoc3RyLCBjb250ZXh0KSB7XG5cdFx0Y29uc3QgcmUgPSAvKDxkZWxbXFxTXFxzXSo/PFxcL2RlbD58PGluc1tcXFNcXHNdKj88XFwvaW5zPikvO1xuXHRcdGNvbnN0IHNwbGl0dGVkID0gc3RyLnNwbGl0KHJlKTtcblx0XHRsZXQgcmV0ID0gWycnXTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0dGVkLmxlbmd0aDsgaSArPSAyKSB7XG5cdFx0XHRpZiAoc3BsaXR0ZWRbaV0ubGVuZ3RoIDwgMiAqIGNvbnRleHQpIHtcblx0XHRcdFx0cmV0W3JldC5sZW5ndGggLSAxXSArPSBzcGxpdHRlZFtpXTtcblx0XHRcdFx0aWYgKGkgKyAxIDwgc3BsaXR0ZWQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0W3JldC5sZW5ndGggLSAxXSArPSBzcGxpdHRlZFtpICsgMV07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRyZXRbcmV0Lmxlbmd0aCAtIDFdICs9IHNwbGl0dGVkW2ldLnNsaWNlKDAsIE1hdGgubWF4KDAsIGNvbnRleHQpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaSArIDEgPCBzcGxpdHRlZC5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXQucHVzaChzcGxpdHRlZFtpXS5zbGljZShNYXRoLm1heCgwLCBzcGxpdHRlZFtpXS5sZW5ndGggLSBjb250ZXh0KSkgKyBzcGxpdHRlZFtpICsgMV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlIChyZXQubGVuZ3RoID4gMCAmJiAhcmV0WzBdKSB7XG5cdFx0XHRyZXQgPSByZXQuc2xpY2UoMSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IGRpZmZTdHJpbmcgPSAobywgbikgPT4ge1xuXHRcdC8vICBXZSBuZWVkIHRvIHNwbGl0IHRoZSBzdHJpbmdzIG8gYW5kIG4gZmlyc3QsIGFuZCBlbnRpZnkoKSB0aGUgcGFydHNcblx0XHQvLyAgaW5kaXZpZHVhbGx5LCBzbyB0aGF0IHRoZSBIVE1MIGVudGl0aWVzIGFyZSBuZXZlciBjdXQgYXBhcnQuIChBeGVsQm9sZHQpXG5cdFx0bGV0IGk7XG5cdFx0Y29uc3Qgb1NwbGl0dGVkID0gby5zcGxpdCgvXFxiLyk7XG5cdFx0Y29uc3QgblNwbGl0dGVkID0gbi5zcGxpdCgvXFxiLyk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IG9TcGxpdHRlZC5sZW5ndGg7ICsraSkge1xuXHRcdFx0b1NwbGl0dGVkW2ldID0gb1NwbGl0dGVkW2ldLmVudGlmeSgpO1xuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgblNwbGl0dGVkLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRuU3BsaXR0ZWRbaV0gPSBuU3BsaXR0ZWRbaV0uZW50aWZ5KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG91dCA9IGRpZmYob1NwbGl0dGVkLCBuU3BsaXR0ZWQpO1xuXHRcdGxldCBzdHIgPSAnJztcblx0XHRsZXQgYWNjID0gW107IC8vIGFjY3VtdWxhdG9yIGZvciBwcmV0dGllciBvdXRwdXRcblxuXHRcdC8vIGNyb3NzaW5nIHBhaXJpbmdzIC0tIGVnICdBIEInIHZzICdCIEEnIC0tIGNhdXNlIHByb2JsZW1zLCBzbyBsZXQncyBpcm9uIHRoZW0gb3V0XG5cdFx0Ly8gdGhpcyBkb2Vzbid0IGFsd2F5cyBkbyB0aGluZ3Mgb3B0aW1hbGx5IGJ1dCBpdCBzaG91bGQgYmUgZmFzdCBlbm91Z2hcblx0XHRsZXQgbWF4T3V0cHV0UGFpciA9IDA7XG5cdFx0Zm9yIChpID0gMDsgaSA8IG91dC5uLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAob3V0Lm5baV0ucGFpcmVkKSB7XG5cdFx0XHRcdGlmIChtYXhPdXRwdXRQYWlyID4gb3V0Lm5baV0ucm93KSB7XG5cdFx0XHRcdFx0Ly8gdGFuZ2xlIC0gZGVsZXRlIHBhaXJpbmdcblx0XHRcdFx0XHRvdXQub1tvdXQubltpXS5yb3ddID0gb3V0Lm9bb3V0Lm5baV0ucm93XS50ZXh0O1xuXHRcdFx0XHRcdG91dC5uW2ldID0gb3V0Lm5baV0udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobWF4T3V0cHV0UGFpciA8IG91dC5uW2ldLnJvdykge1xuXHRcdFx0XHRcdG1heE91dHB1dFBhaXIgPSBvdXQubltpXS5yb3c7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gb3V0cHV0IHRoZSBzdHVmZiBwcmVjZWRpbmcgdGhlIGZpcnN0IHBhaXJlZCBvbGQgbGluZVxuXHRcdGZvciAoaSA9IDA7IGkgPCBvdXQuby5sZW5ndGggJiYgIW91dC5vW2ldLnBhaXJlZDsgKytpKSB7XG5cdFx0XHRhY2MucHVzaChvdXQub1tpXSk7XG5cdFx0fVxuXHRcdHN0ciArPSBkZWxGbXQoYWNjKTtcblx0XHRhY2MgPSBbXTtcblx0XHQvLyBtYWluIGxvb3Bcblx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0Lm4ubGVuZ3RoOyArK2kpIHtcblx0XHRcdC8vIG91dHB1dCB1bnBhaXJlZCBuZXcgXCJsaW5lc1wiXG5cdFx0XHR3aGlsZSAoaSA8IG91dC5uLmxlbmd0aCAmJiAhb3V0Lm5baV0ucGFpcmVkKSB7XG5cdFx0XHRcdGFjYy5wdXNoKG91dC5uW2krK10pO1xuXHRcdFx0fVxuXHRcdFx0c3RyICs9IGluc0ZtdChhY2MpO1xuXHRcdFx0YWNjID0gW107XG5cdFx0XHRpZiAoaSA8IG91dC5uLmxlbmd0aCkge1xuXHRcdFx0XHQvLyB0aGlzIG5ldyBcImxpbmVcIiBpcyBwYWlyZWQgd2l0aCB0aGUgKG91dC5uW2ldLnJvdyl0aCBvbGQgXCJsaW5lXCJcblx0XHRcdFx0c3RyICs9IG91dC5uW2ldLnRleHQ7XG5cdFx0XHRcdC8vIG91dHB1dCB1bnBhaXJlZCBvbGQgcm93cyBzdGFydGluZyBhZnRlciB0aGlzIG5ldyBsaW5lJ3MgcGFydG5lclxuXHRcdFx0XHRsZXQgbSA9IG91dC5uW2ldLnJvdyArIDE7XG5cdFx0XHRcdHdoaWxlIChtIDwgb3V0Lm8ubGVuZ3RoICYmICFvdXQub1ttXS5wYWlyZWQpIHtcblx0XHRcdFx0XHRhY2MucHVzaChvdXQub1ttKytdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdHIgKz0gZGVsRm10KGFjYyk7XG5cdFx0XHRcdGFjYyA9IFtdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9O1xuXHQvLyBzZWUge0BsaW5rIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZTpHbG9iYWxfT2JqZWN0czpPYmplY3R9XG5cdC8vIEZJWE1FOiB1c2Ugb2JqLmhhc093blByb3BlcnR5IGluc3RlYWQgb2YgdGhpcyBrbHVkZ2UhXG5cdGNvbnN0IGpzUmVzZXJ2ZWRQcm9wZXJ0aWVzID0gbmV3IFJlZ0V4cChcblx0XHQnXihjb25zdHJ1Y3Rvcnxwcm90b3R5cGV8X18oKGRlZmluZXxsb29rdXApW0dTXWV0dGVyKV9fJyArXG5cdFx0XHQnfGV2YWx8aGFzT3duUHJvcGVydHl8cHJvcGVydHlJc0VudW1lcmFibGUnICtcblx0XHRcdCd8dG8oU291cmNlfFN0cmluZ3xMb2NhbGVTdHJpbmcpfCh1bik/d2F0Y2h8dmFsdWVPZikkJ1xuXHQpO1xuXHRjb25zdCBkaWZmQnVnQWxlcnQgPSBmdW5jdGlvbiBkaWZmQnVnQWxlcnQod29yZCkge1xuXHRcdGlmICghZGlmZkJ1Z0FsZXJ0Lmxpc3Rbd29yZF0pIHtcblx0XHRcdGRpZmZCdWdBbGVydC5saXN0W3dvcmRdID0gMTtcblx0XHRcdHZvaWQgbXcubm90aWZ5KGBCYWQgd29yZDogJHt3b3JkfVxcblxcblBsZWFzZSByZXBvcnQgdGhpcyBidWcuYCwge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHR9XG5cdH07XG5cdGRpZmZCdWdBbGVydC5saXN0ID0ge307XG5cdGNvbnN0IG1ha2VEaWZmSGFzaHRhYmxlID0gKHNyYykgPT4ge1xuXHRcdGNvbnN0IHJldCA9IHt9O1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoanNSZXNlcnZlZFByb3BlcnRpZXMudGVzdChzcmNbaV0pKSB7XG5cdFx0XHRcdHNyY1tpXSArPSAnPCEtLSAtLT4nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFyZXRbc3JjW2ldXSkge1xuXHRcdFx0XHRyZXRbc3JjW2ldXSA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0W3NyY1tpXV0ucHVzaChpKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRkaWZmQnVnQWxlcnQoc3JjW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgZGlmZiA9IChvLCBuKSA9PiB7XG5cdFx0Ly8gcGFzcyAxOiBtYWtlIGhhc2h0YWJsZSBucyB3aXRoIG5ldyByb3dzIGFzIGtleXNcblx0XHRjb25zdCBucyA9IG1ha2VEaWZmSGFzaHRhYmxlKG4pO1xuXHRcdC8vIHBhc3MgMjogbWFrZSBoYXNodGFibGUgb3Mgd2l0aCBvbGQgcm93cyBhcyBrZXlzXG5cdFx0Y29uc3Qgb3MgPSBtYWtlRGlmZkhhc2h0YWJsZShvKTtcblx0XHQvLyBwYXNzIDM6IHBhaXIgdW5pcXVlIG5ldyByb3dzIGFuZCBtYXRjaGluZyB1bmlxdWUgb2xkIHJvd3Ncblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgaW4gbnMpIHtcblx0XHRcdGlmIChuc1tpXS5sZW5ndGggPT09IDEgJiYgb3NbaV0gJiYgb3NbaV0ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG5bbnNbaV1bMF1dID0ge1xuXHRcdFx0XHRcdHRleHQ6IG5bbnNbaV1bMF1dLFxuXHRcdFx0XHRcdHJvdzogb3NbaV1bMF0sXG5cdFx0XHRcdFx0cGFpcmVkOiB0cnVlLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvW29zW2ldWzBdXSA9IHtcblx0XHRcdFx0XHR0ZXh0OiBvW29zW2ldWzBdXSxcblx0XHRcdFx0XHRyb3c6IG5zW2ldWzBdLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGFzcyA0OiBwYWlyIG1hdGNoaW5nIHJvd3MgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHBhaXJlZCByb3dzIChub3QgbmVjZXNzYXJpbHkgdW5pcXVlKVxuXHRcdGZvciAoaSA9IDA7IGkgPCBuLmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRuW2ldLnBhaXJlZCAmJlxuXHRcdFx0XHQhbltpICsgMV0ucGFpcmVkICYmXG5cdFx0XHRcdG5baV0ucm93ICsgMSA8IG8ubGVuZ3RoICYmXG5cdFx0XHRcdCFvW25baV0ucm93ICsgMV0ucGFpcmVkICYmXG5cdFx0XHRcdG5baSArIDFdID09PSBvW25baV0ucm93ICsgMV1cblx0XHRcdCkge1xuXHRcdFx0XHRuW2kgKyAxXSA9IHtcblx0XHRcdFx0XHR0ZXh0OiBuW2kgKyAxXSxcblx0XHRcdFx0XHRyb3c6IG5baV0ucm93ICsgMSxcblx0XHRcdFx0XHRwYWlyZWQ6IHRydWUsXG5cdFx0XHRcdH07XG5cdFx0XHRcdG9bbltpXS5yb3cgKyAxXSA9IHtcblx0XHRcdFx0XHR0ZXh0OiBvW25baV0ucm93ICsgMV0sXG5cdFx0XHRcdFx0cm93OiBpICsgMSxcblx0XHRcdFx0XHRwYWlyZWQ6IHRydWUsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHBhc3MgNTogcGFpciBtYXRjaGluZyByb3dzIGltbWVkaWF0ZWx5IHByZWNlZGluZyBwYWlyZWQgcm93cyAobm90IG5lY2Vzc2FyaWx5IHVuaXF1ZSlcblx0XHRmb3IgKGkgPSBuLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcblx0XHRcdGlmIChcblx0XHRcdFx0bltpXS5wYWlyZWQgJiZcblx0XHRcdFx0IW5baSAtIDFdLnBhaXJlZCAmJlxuXHRcdFx0XHRuW2ldLnJvdyA+IDAgJiZcblx0XHRcdFx0IW9bbltpXS5yb3cgLSAxXS5wYWlyZWQgJiZcblx0XHRcdFx0bltpIC0gMV0gPT09IG9bbltpXS5yb3cgLSAxXVxuXHRcdFx0KSB7XG5cdFx0XHRcdG5baSAtIDFdID0ge1xuXHRcdFx0XHRcdHRleHQ6IG5baSAtIDFdLFxuXHRcdFx0XHRcdHJvdzogbltpXS5yb3cgLSAxLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdFx0b1tuW2ldLnJvdyAtIDFdID0ge1xuXHRcdFx0XHRcdHRleHQ6IG9bbltpXS5yb3cgLSAxXSxcblx0XHRcdFx0XHRyb3c6IGkgLSAxLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdG8sXG5cdFx0XHRuLFxuXHRcdH07XG5cdH07XG5cdC8vIEVOREZJTEU6IGRpZmYuanNcblx0Ly8gU1RBUlRGSUxFOiBpbml0LmpzXG5cdGNvbnN0IHNldFNpdGVJbmZvID0gKCkgPT4ge1xuXHRcdGlmICh3aW5kb3cucG9wdXBMb2NhbERlYnVnKSB7XG5cdFx0XHRwZy53aWtpLmhvc3RuYW1lID0gJ2VuLndpa2lwZWRpYS5vcmcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwZy53aWtpLmhvc3RuYW1lID0gbG9jYXRpb24uaG9zdG5hbWU7IC8vIHVzZSBpbiBwcmVmZXJlbmNlIHRvIGxvY2F0aW9uLmhvc3RuYW1lIGZvciBmbGV4aWJpbGl0eSAoPylcblx0XHR9XG5cdFx0cGcud2lraS53aWtpbWVkaWEgPVxuXHRcdFx0Lyh3aWtpKFttcF1lZGlhfHNvdXJjZXxib29rc3xuZXdzfHF1b3RlfHZlcnNpdHl8c3BlY2llc3x2b3lhZ2V8ZGF0YSl8bWV0YXdpa2l8d2lrdGlvbmFyeXxtZWRpYXdpa2kpXFwub3JnLy50ZXN0KFxuXHRcdFx0XHRwZy53aWtpLmhvc3RuYW1lXG5cdFx0XHQpO1xuXHRcdHBnLndpa2kud2lraWEgPSAvXFwud2lraWFcXC5jb20kL2kudGVzdChwZy53aWtpLmhvc3RuYW1lKTtcblx0XHRwZy53aWtpLmlzTG9jYWwgPSBwZy53aWtpLmhvc3RuYW1lLnN0YXJ0c1dpdGgoJ2xvY2FsaG9zdCcpO1xuXHRcdHBnLndpa2kuY29tbW9ucyA9XG5cdFx0XHRwZy53aWtpLndpa2ltZWRpYSAmJiBwZy53aWtpLmhvc3RuYW1lICE9PSAnY29tbW9ucy53aWtpbWVkaWEub3JnJyA/ICdjb21tb25zLndpa2ltZWRpYS5vcmcnIDogbnVsbDtcblx0XHRwZy53aWtpLmxhbmcgPSBtdy5jb25maWcuZ2V0KCd3Z0NvbnRlbnRMYW5ndWFnZScpO1xuXHRcdGNvbnN0IHBvcnQgPSBsb2NhdGlvbi5wb3J0ID8gYDoke2xvY2F0aW9uLnBvcnR9YCA6ICcnO1xuXHRcdHBnLndpa2kuc2l0ZWJhc2UgPSBwZy53aWtpLmhvc3RuYW1lICsgcG9ydDtcblx0fTtcblx0Y29uc3Qgc2V0VXNlckluZm8gPSAoKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0bGlzdDogJ3VzZXJzJyxcblx0XHRcdHVzdXNlcnM6IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSxcblx0XHRcdHVzcHJvcDogJ3JpZ2h0cycsXG5cdFx0fTtcblx0XHRwZy51c2VyLmNhblJldmlldyA9IGZhbHNlO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFJldmlldycpKSB7XG5cdFx0XHRnZXRNd0FwaSgpXG5cdFx0XHRcdC5nZXQocGFyYW1zKVxuXHRcdFx0XHQuZG9uZSgoZGF0YSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IFt7cmlnaHRzfV0gPSBkYXRhLnF1ZXJ5LnVzZXJzO1xuXHRcdFx0XHRcdHBnLnVzZXIuY2FuUmV2aWV3ID0gcmlnaHRzLmluY2x1ZGVzKCdyZXZpZXcnKTsgLy8gVE9ETzogU2hvdWxkIGl0IGJlIGEgZ2V0VmFsdWVPZignUmV2aWV3UmlnaHQnKSA/XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmV0Y2hTcGVjaWFsUGFnZU5hbWVzID0gKCkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdFx0Zm9ybWF0dmVyc2lvbjogJzInLFxuXHRcdFx0bWF4YWdlOiAzNjAwLFxuXHRcdFx0bWV0YTogJ3NpdGVpbmZvJyxcblx0XHRcdHNpcHJvcDogJ3NwZWNpYWxwYWdlYWxpYXNlcycsXG5cdFx0XHQvLyBjYWNoZSBmb3IgYW4gaG91clxuXHRcdFx0dXNlbGFuZzogJ2NvbnRlbnQnLFxuXHRcdH07XG5cdFx0cmV0dXJuIGdldE13QXBpKClcblx0XHRcdC5nZXQocGFyYW1zKVxuXHRcdFx0LnRoZW4oKGRhdGEpID0+IHtcblx0XHRcdFx0cGcud2lraS5zcGVjaWFscGFnZWFsaWFzZXMgPSBkYXRhLnF1ZXJ5LnNwZWNpYWxwYWdlYWxpYXNlcztcblx0XHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzZXRUaXRsZUJhc2UgPSAoKSA9PiB7XG5cdFx0Y29uc3QgcHJvdG9jb2wgPSB3aW5kb3cucG9wdXBMb2NhbERlYnVnID8gJ2h0dHA6JyA6IGxvY2F0aW9uLnByb3RvY29sO1xuXHRcdHBnLndpa2kuYXJ0aWNsZVBhdGggPSBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVQYXRoJykucmVwbGFjZSgvXFwvXFwkMS8sICcnKTsgLy8gYXMgaW4gaHR0cDovL3NvbWUudGhpbmcuY29tL3dpa2kvQXJ0aWNsZVxuXHRcdHBnLndpa2kuYm90SW50ZXJmYWNlUGF0aCA9IG13LmNvbmZpZy5nZXQoJ3dnU2NyaXB0Jyk7XG5cdFx0cGcud2lraS5BUElQYXRoID0gYCR7bXcuY29uZmlnLmdldCgnd2dTY3JpcHRQYXRoJyl9L2FwaS5waHBgO1xuXHRcdC8vIGRlZmF1bHQgbWVkaWF3aWtpIHNldHRpbmcgaXMgcGF0aHMgbGlrZSBodHRwOi8vc29tZS50aGluZy5jb20vYXJ0aWNsZVBhdGgvaW5kZXgucGhwP3RpdGxlPWZvb1xuXHRcdGNvbnN0IHRpdGxldGFpbCA9IGAke3BnLndpa2kuYm90SW50ZXJmYWNlUGF0aH0/dGl0bGU9YDtcblx0XHQvLyBsZXQgdGl0bGV0YWlsMiA9IGpvaW5QYXRoKFtwZy53aWtpLmJvdEludGVyZmFjZVBhdGgsICd3aWtpLnBodG1sP3RpdGxlPSddKTtcblx0XHQvLyBvdGhlciBzaXRlcyBtYXkgbmVlZCB0byBhZGQgY29kZSBoZXJlIHRvIHNldCB0aXRsZXRhaWwgZGVwZW5kaW5nIG9uIGhvdyB0aGVpciB1cmxzIHdvcmtcblx0XHRwZy53aWtpLnRpdGxlYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7dGl0bGV0YWlsfWA7XG5cdFx0Ly8gcGcud2lraS50aXRsZWJhc2UyICA9IHByb3RvY29sICsgJy8vJyArIGpvaW5QYXRoKFtwZy53aWtpLnNpdGViYXNlLCB0aXRsZXRhaWwyXSk7XG5cdFx0cGcud2lraS53aWtpYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7cGcud2lraS5ib3RJbnRlcmZhY2VQYXRofWA7XG5cdFx0cGcud2lraS5hcGl3aWtpYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7cGcud2lraS5BUElQYXRofWA7XG5cdFx0cGcud2lraS5hcnRpY2xlYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLnNpdGViYXNlfSR7cGcud2lraS5hcnRpY2xlUGF0aH1gO1xuXHRcdHBnLndpa2kuY29tbW9uc2Jhc2UgPSBgJHtwcm90b2NvbH0vLyR7cGcud2lraS5jb21tb25zfSR7cGcud2lraS5ib3RJbnRlcmZhY2VQYXRofWA7XG5cdFx0cGcud2lraS5hcGljb21tb25zYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLmNvbW1vbnN9JHtwZy53aWtpLkFQSVBhdGh9YDtcblx0XHRwZy5yZS5iYXNlbmFtZXMgPSBuZXcgUmVnRXhwKGBeKCR7bWFwKGxpdGVyYWxpemVSZWdleCwgW3BnLndpa2kudGl0bGViYXNlLCBwZy53aWtpLmFydGljbGViYXNlXSkuam9pbignfCcpfSlgKTtcblx0fTtcblx0Ly8gR2xvYmFsIHJlZ2V4cHNcblx0Y29uc3Qgc2V0TWFpblJlZ2V4ID0gKCkgPT4ge1xuXHRcdGNvbnN0IHJlU3RhcnQgPSAnW146XSo6Ly8nO1xuXHRcdGxldCBwcmVUaXRsZXMgPSBgJHtsaXRlcmFsaXplUmVnZXgobXcuY29uZmlnLmdldCgnd2dTY3JpcHRQYXRoJykpfS8oPzppbmRleFsuXXBocHx3aWtpWy5dcGh0bWwpWz9ddGl0bGU9YDtcblx0XHRwcmVUaXRsZXMgKz0gYHwke2xpdGVyYWxpemVSZWdleChgJHtwZy53aWtpLmFydGljbGVQYXRofS9gKX1gO1xuXHRcdGNvbnN0IHJlRW5kID0gYCgke3ByZVRpdGxlc30pKFteJj8jXSopW14jXSooPzojKC4rKSk/YDtcblx0XHRwZy5yZS5tYWluID0gbmV3IFJlZ0V4cChyZVN0YXJ0ICsgbGl0ZXJhbGl6ZVJlZ2V4KHBnLndpa2kuc2l0ZWJhc2UpICsgcmVFbmQpO1xuXHR9O1xuXHRjb25zdCBidWlsZFNwZWNpYWxQYWdlR3JvdXAgPSAoc3BlY2lhbFBhZ2VPYmopID0+IHtcblx0XHRjb25zdCB2YXJpYW50cyA9IFtdO1xuXHRcdHZhcmlhbnRzLnB1c2goXG5cdFx0XHRtdy51dGlsLmVzY2FwZVJlZ0V4cChzcGVjaWFsUGFnZU9iai5yZWFsbmFtZSksXG5cdFx0XHRtdy51dGlsLmVzY2FwZVJlZ0V4cChlbmNvZGVVUkkoc3BlY2lhbFBhZ2VPYmoucmVhbG5hbWUpKVxuXHRcdCk7XG5cdFx0Zm9yIChjb25zdCBhbGlhcyBvZiBzcGVjaWFsUGFnZU9iai5hbGlhc2VzKSB7XG5cdFx0XHR2YXJpYW50cy5wdXNoKG13LnV0aWwuZXNjYXBlUmVnRXhwKGFsaWFzKSwgbXcudXRpbC5lc2NhcGVSZWdFeHAoZW5jb2RlVVJJKGFsaWFzKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFudHMuam9pbignfCcpO1xuXHR9O1xuXHRjb25zdCBzZXRSZWdleHBzID0gKCkgPT4ge1xuXHRcdHNldE1haW5SZWdleCgpO1xuXHRcdGNvbnN0IHNwID0gbnNSZShwZy5uc1NwZWNpYWxJZCk7XG5cdFx0cGcucmUudXJsTm9Qb3B1cCA9IG5ldyBSZWdFeHAoYCgodGl0bGU9fC8pJHtzcH0oPzolM0F8Oil8c2VjdGlvbj1bMC05XXxeIyQpYCk7XG5cdFx0Zm9yIChjb25zdCBzcGVjaWFscGFnZSBvZiBwZy53aWtpLnNwZWNpYWxwYWdlYWxpYXNlcykge1xuXHRcdFx0c3dpdGNoIChzcGVjaWFscGFnZS5yZWFsbmFtZSkge1xuXHRcdFx0XHRjYXNlICdDb250cmlidXRpb25zJzpcblx0XHRcdFx0XHRwZy5yZS5jb250cmlicyA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgKHRpdGxlPXwvKSR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSlgICtcblx0XHRcdFx0XHRcdFx0YCgmdGFyZ2V0PXwvfC8ke25zUmUocGcubnNVc2VySWQpfTopKC4qKWAsXG5cdFx0XHRcdFx0XHQnaSdcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdEaWZmJzpcblx0XHRcdFx0XHRwZy5yZS5zcGVjaWFsZGlmZiA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgLyR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSkvKFtePyNdKilgLFxuXHRcdFx0XHRcdFx0J2knXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRW1haWx1c2VyJzpcblx0XHRcdFx0XHRwZy5yZS5lbWFpbCA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgKHRpdGxlPXwvKSR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSlgICtcblx0XHRcdFx0XHRcdFx0YCgmdGFyZ2V0PXwvfC8oPzoke25zUmUocGcubnNVc2VySWQpfTopPykoLiopYCxcblx0XHRcdFx0XHRcdCdpJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1doYXRsaW5rc2hlcmUnOlxuXHRcdFx0XHRcdHBnLnJlLmJhY2tsaW5rcyA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRgKHRpdGxlPXwvKSR7c3B9KD86JTNBfDopKD86JHtidWlsZFNwZWNpYWxQYWdlR3JvdXAoc3BlY2lhbHBhZ2UpfSkoJnRhcmdldD18LykoW14mXSopYCxcblx0XHRcdFx0XHRcdCdpJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGltID0gbnNSZUltYWdlKCk7XG5cdFx0Ly8gbm90ZTogdHJpZXMgdG8gZ2V0IGltYWdlcyBpbiBpbmZvYm94IHRlbXBsYXRlcyB0b28sIGUuZy4gbW92aWUgcGFnZXMsIGFsYnVtIHBhZ2VzIGV0Y1xuXHRcdC8vXHRcdFx0XHRcdCAgKF58XFxbXFxbKWltYWdlOiAqKFtefFxcXV0qW158XFxdIF0pICpcblx0XHQvL1x0XHRcdFx0XHQgIChefFxcW1xcWylpbWFnZTogKihbXnxcXF1dKltefFxcXSBdKShbXjAtOVxcXV0qKFswLTldKykgKnB4KT9cblx0XHQvL1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkNCA9IDEyMCBhcyBpbiAxMjBweFxuXHRcdHBnLnJlLmltYWdlID0gbmV3IFJlZ0V4cChcblx0XHRcdGAoXnxcXFxcW1xcXFxbKSR7aW19OiAqKFtefFxcXFxdXSpbXnxcXFxcXSBdKWAgK1xuXHRcdFx0XHQnKFteMC05XFxcXF1dKihbMC05XSspICpweCk/fCg/OlxcXFxuICpbfF0/fFt8XSkgKicgK1xuXHRcdFx0XHRgKCR7Z2V0VmFsdWVPZigncG9wdXBJbWFnZVZhcnNSZWdleHAnKX0pYCArXG5cdFx0XHRcdGAgKj0gKig/OlxcXFxbXFxcXFsgKik/KD86JHtpbX06KT9gICtcblx0XHRcdFx0JyhbXnxdKj8pKD86XFxcXF1cXFxcXSk/ICpbfF0/ICpcXFxcbicsXG5cdFx0XHQnaW1nJ1xuXHRcdCk7XG5cdFx0cGcucmUuaW1hZ2VCcmFja2V0Q291bnQgPSA2O1xuXHRcdHBnLnJlLmNhdGVnb3J5ID0gbmV3IFJlZ0V4cChgXFxcXFtcXFxcWyR7bnNSZShwZy5uc0NhdGVnb3J5SWQpfTogKihbXnxcXFxcXV0qW158XFxcXF0gXSkgKmAsICdpJyk7XG5cdFx0cGcucmUuY2F0ZWdvcnlCcmFja2V0Q291bnQgPSAxO1xuXHRcdC8vIElQdjYgfCBJUHY0XG5cdFx0cGcucmUuaXBVc2VyID1cblx0XHRcdC9eKD86Oig/Ojp8KD86OltcXGRBLUZhLWZdezEsNH0pezEsN30pfFtcXGRBLUZhLWZdezEsNH0oPzo6W1xcZEEtRmEtZl17MSw0fSl7MCw2fTo6fFtcXGRBLUZhLWZdezEsNH0oPzo6W1xcZEEtRmEtZl17MSw0fSl7N30pfCgoKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKVxcLil7M30oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKSQvO1xuXHRcdHBnLnJlLnN0dWIgPSBuZXcgUmVnRXhwKGdldFZhbHVlT2YoJ3BvcHVwU3R1YlJlZ2V4cCcpLCAnaW0nKTtcblx0XHRwZy5yZS5kaXNhbWJpZyA9IG5ldyBSZWdFeHAoZ2V0VmFsdWVPZigncG9wdXBEYWJSZWdleHAnKSwgJ2ltJyk7XG5cdFx0Ly8gRklYTUUgcmVwbGFjZSB3aXRoIGdlbmVyYWwgcGFyYW1ldGVyIHBhcnNpbmcgZnVuY3Rpb24sIHRoaXMgaXMgZGFmdFxuXHRcdHBnLnJlLm9sZGlkID0gL1smP11vbGRpZD0oW14mXSopLztcblx0XHRwZy5yZS5kaWZmID0gL1smP11kaWZmPShbXiZdKikvO1xuXHR9O1xuXHQvLyBtaXNjZWxsYW55XG5cdGNvbnN0IHNldHVwQ2FjaGUgPSAoKSA9PiB7XG5cdFx0Ly8gcGFnZSBjYWNoaW5nXG5cdFx0cGcuY2FjaGUucGFnZXMgPSBbXTtcblx0fTtcblx0Y29uc3Qgc2V0TWlzYyA9ICgpID0+IHtcblx0XHRwZy5jdXJyZW50LmxpbmsgPSBudWxsO1xuXHRcdHBnLmN1cnJlbnQubGlua3MgPSBbXTtcblx0XHRwZy5jdXJyZW50LmxpbmtzSGFzaCA9IHt9O1xuXHRcdHNldHVwQ2FjaGUoKTtcblx0XHRwZy50aW1lci5jaGVja1BvcHVwUG9zaXRpb24gPSBudWxsO1xuXHRcdHBnLmNvdW50ZXIubG9vcCA9IDA7XG5cdFx0Ly8gaWRzIGNoYW5nZSB3aXRoIGVhY2ggcG9wdXA6IHBvcHVwSW1hZ2UwLCBwb3B1cEltYWdlMSBldGNcblx0XHRwZy5pZE51bWJlciA9IDA7XG5cdFx0Ly8gZm9yIG15RGVjb2RlVVJJXG5cdFx0cGcubWlzYy5kZWNvZGVFeHRyYXMgPSBbXG5cdFx0XHR7ZnJvbTogJyUyQycsIHRvOiAnLCd9LFxuXHRcdFx0e2Zyb206ICdfJywgdG86ICcgJ30sXG5cdFx0XHR7ZnJvbTogJyUyNCcsIHRvOiAnJCd9LFxuXHRcdFx0e2Zyb206ICclMjYnLCB0bzogJyYnfSwgLy8gbm8gLFxuXHRcdF07XG5cdH07XG5cdGNvbnN0IGdldE13QXBpID0gKCkgPT4ge1xuXHRcdGlmICghcGcuYXBpLmNsaWVudCkge1xuXHRcdFx0cGcuYXBpLnVzZXJBZ2VudCA9ICdOYXZpZ2F0aW9uIHBvcHVwcy8xLjAnO1xuXHRcdFx0cGcuYXBpLmNsaWVudCA9IGFwaTtcblx0XHR9XG5cdFx0cmV0dXJuIHBnLmFwaS5jbGllbnQ7XG5cdH07XG5cdC8vIFdlIG5lZWQgYSBjYWxsYmFjayBzaW5jZSB0aGlzIG1pZ2h0IGVuZCB1cCBhc3luY2hyb25vdXMgYmVjYXVzZSBvZlxuXHQvLyB0aGUgbXcubG9hZGVyLnVzaW5nKCkgY2FsbC5cblx0Y29uc3Qgc2V0dXBQb3B1cHMgPSBmdW5jdGlvbiBzZXR1cFBvcHVwcyhjYWxsYmFjaykge1xuXHRcdGlmIChzZXR1cFBvcHVwcy5jb21wbGV0ZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gVGhlc2UgZGVwZW5kZW5jaWVzIHNob3VsZCBhbHNlIGJlIGVuZm9yY2VkIGZyb20gdGhlIGdhZGdldCxcblx0XHQvLyBidXQgbm90IGV2ZXJ5b25lIGxvYWRzIHRoaXMgYXMgYSBnYWRnZXQsIHNvIGRvdWJsZSBjaGVja1xuXHRcdGZldGNoU3BlY2lhbFBhZ2VOYW1lcygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Ly8gTkIgdHJhbnNsYXRhYmxlIHN0cmluZ3Mgc2hvdWxkIGJlIHNldCB1cCBmaXJzdCAoc3RyaW5ncy5qcylcblx0XHRcdC8vIGJhc2ljc1xuXHRcdFx0c2V0dXBEZWJ1Z2dpbmcoKTtcblx0XHRcdHNldFNpdGVJbmZvKCk7XG5cdFx0XHRzZXRUaXRsZUJhc2UoKTtcblx0XHRcdHNldE9wdGlvbnMoKTsgLy8gc2VlIG9wdGlvbnMuanNcblx0XHRcdHNldFVzZXJJbmZvKCk7XG5cdFx0XHQvLyBuYW1lc3BhY2VzIGV0Y1xuXHRcdFx0c2V0TmFtZXNwYWNlcygpO1xuXHRcdFx0c2V0SW50ZXJ3aWtpKCk7XG5cdFx0XHQvLyByZWdleHBzXG5cdFx0XHRzZXRSZWdleHBzKCk7XG5cdFx0XHRzZXRSZWRpcnMoKTtcblx0XHRcdC8vIG90aGVyIHN0dWZmXG5cdFx0XHRzZXRNaXNjKCk7XG5cdFx0XHRzZXR1cExpdmVQcmV2aWV3KCk7XG5cdFx0XHQvLyBtYWluIGRlYWwgaGVyZVxuXHRcdFx0c2V0dXBUb29sdGlwcygpO1xuXHRcdFx0bG9nKCdJbiBzZXR1cFBvcHVwcygpLCBqdXN0IGNhbGxlZCBzZXR1cFRvb2x0aXBzKCknKTtcblx0XHRcdE5hdnBvcHVwLnRyYWNrZXIuZW5hYmxlKCk7XG5cdFx0XHRzZXR1cFBvcHVwcy5jb21wbGV0ZWQgPSB0cnVlO1xuXHRcdFx0aWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBpbml0LmpzXG5cdC8vIFNUQVJURklMRTogbmF2bGlua3MuanNcblx0Ly8gbmF2bGlua3MuLi4gbGV0IHRoZSBmdW4gYmVnaW5cblx0Ly9cblx0Y29uc3QgZGVmYXVsdE5hdmxpbmtTcGVjID0gKCkgPT4ge1xuXHRcdGxldCBzdHIgPSAnJztcblx0XHRzdHIgKz0gJzxiPjw8bWFpbmxpbmt8c2hvcnRjdXQ9ID4+PC9iPic7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwTGFzdEVkaXRMaW5rJykpIHtcblx0XHRcdHN0ciArPSAnKjw8bGFzdEVkaXR8c2hvcnRjdXQ9Lz4+fDw8bGFzdENvbnRyaWI+Pnw8PHNpbmNlTWU+PmlmKG9sZGlkKXt8PDxvbGRFZGl0Pj58PDxkaWZmQ3VyPj59Jztcblx0XHR9XG5cdFx0Ly8gdXNlciBsaW5rc1xuXHRcdC8vIGNvbnRyaWJzIC0gbG9nIC0gY291bnQgLSBlbWFpbCAtIGJsb2NrXG5cdFx0Ly8gY291bnQgb25seSBpZiBhcHBsaWNhYmxlOyBibG9jayBvbmx5IGlmIHBvcHVwQWRtaW5MaW5rc1xuXHRcdHN0ciArPSAnaWYodXNlcil7PGJyPjw8Y29udHJpYnN8c2hvcnRjdXQ9Yz4+Kjw8dXNlcmxvZ3xzaG9ydGN1dD1MfGxvZz4+Jztcblx0XHRzdHIgKz0gJ2lmKGlwdXNlcil7Kjw8YXJpbj4+fWlmKHdpa2ltZWRpYSl7Kjw8Y291bnR8c2hvcnRjdXQ9Iz4+fSc7XG5cdFx0c3RyICs9ICdpZihpcHVzZXIpe31lbHNleyo8PGVtYWlsfHNob3J0Y3V0PUU+Pn1pZihhZG1pbil7Kjw8YmxvY2t8c2hvcnRjdXQ9Yj4+fDw8YmxvY2tsb2d8bG9nPj59fSc7XG5cdFx0Ly8gZWRpdGluZyBsaW5rc1xuXHRcdC8vIHRhbGtwYWdlICAgLT4gZWRpdHxuZXcgLSBoaXN0b3J5IC0gdW58d2F0Y2ggLSBhcnRpY2xlfGVkaXRcblx0XHQvLyBvdGhlciBwYWdlIC0+IGVkaXQgLSBoaXN0b3J5IC0gdW58d2F0Y2ggLSB0YWxrfGVkaXR8bmV3XG5cdFx0Y29uc3QgZWRpdHN0ciA9ICc8PGVkaXR8c2hvcnRjdXQ9ZT4+Jztcblx0XHRjb25zdCBlZGl0T2xkaWRTdHIgPSBgaWYob2xkaWQpezw8ZWRpdE9sZHxzaG9ydGN1dD1lPj58PDxyZXZlcnR8c2hvcnRjdXQ9dnxydj4+fDw8ZWRpdHxjdXI+Pn1lbHNleyR7ZWRpdHN0cn19YDtcblx0XHRjb25zdCBoaXN0b3J5c3RyID0gJzw8aGlzdG9yeXxzaG9ydGN1dD1oPj58PDxlZGl0b3JzfHNob3J0Y3V0PUV8Pj4nO1xuXHRcdGNvbnN0IHdhdGNoc3RyID0gJzw8dW53YXRjaHx1bndhdGNoU2hvcnQ+Pnw8PHdhdGNofHNob3J0Y3V0PXd8d2F0Y2hUaGluZ3k+Pic7XG5cdFx0c3RyICs9XG5cdFx0XHRgPGJyPmlmKHRhbGspeyR7ZWRpdE9sZGlkU3RyfXw8PG5ld3xzaG9ydGN1dD0rPj5gICtcblx0XHRcdGAqJHtoaXN0b3J5c3RyfSoke3dhdGNoc3RyfSpgICtcblx0XHRcdCc8Yj48PGFydGljbGV8c2hvcnRjdXQ9YT4+PC9iPnw8PGVkaXRBcnRpY2xlfGVkaXQ+PicgK1xuXHRcdFx0YH1lbHNleyR7XG5cdFx0XHRcdC8vIG5vdCBhIHRhbGsgcGFnZVxuXHRcdFx0XHRlZGl0T2xkaWRTdHJcblx0XHRcdH0qJHtoaXN0b3J5c3RyfSoke3dhdGNoc3RyfSpgICtcblx0XHRcdCc8Yj48PHRhbGt8c2hvcnRjdXQ9dD4+PC9iPnw8PGVkaXRUYWxrfGVkaXQ+Pnw8PG5ld1RhbGt8c2hvcnRjdXQ9K3xuZXc+Pn0nO1xuXHRcdC8vIG1pc2MgbGlua3Ncblx0XHRzdHIgKz0gJzxicj48PHdoYXRMaW5rc0hlcmV8c2hvcnRjdXQ9bD4+Kjw8cmVsYXRlZENoYW5nZXN8c2hvcnRjdXQ9cj4+Kjw8bW92ZXxzaG9ydGN1dD1tPj4nO1xuXHRcdC8vIGFkbWluIGxpbmtzXG5cdFx0c3RyICs9XG5cdFx0XHQnaWYoYWRtaW4pezxicj48PHVucHJvdGVjdHx1bnByb3RlY3RTaG9ydD4+fDw8cHJvdGVjdHxzaG9ydGN1dD1wPj58PDxwcm90ZWN0bG9nfGxvZz4+KicgK1xuXHRcdFx0Jzw8dW5kZWxldGV8dW5kZWxldGVTaG9ydD4+fDw8ZGVsZXRlfHNob3J0Y3V0PWQ+Pnw8PGRlbGV0ZWxvZ3xsb2c+Pn0nO1xuXHRcdHJldHVybiBzdHI7XG5cdH07XG5cdGNvbnN0IG5hdkxpbmtzSFRNTCA9IChhcnRpY2xlLCBfaGludCwgcGFyYW1zKSA9PiB7XG5cdFx0Ly8gb2xkaWQsIHJjaWQpIHtcblx0XHRjb25zdCBzdHIgPSBgPHNwYW4gY2xhc3M9XCJwb3B1cE5hdkxpbmtzXCI+JHtkZWZhdWx0TmF2bGlua1NwZWMoKX08L3NwYW4+YDtcblx0XHQvLyBCQU1cblx0XHRyZXR1cm4gbmF2bGlua1N0cmluZ1RvSFRNTChzdHIsIGFydGljbGUsIHBhcmFtcyk7XG5cdH07XG5cdGNvbnN0IGV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyA9IGZ1bmN0aW9uIGV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyhzLCBhcnRpY2xlLCB6LCByZWN1cnNpb25Db3VudCkge1xuXHRcdGNvbnN0IHtvbGRpZH0gPSB6O1xuXHRcdGNvbnN0IHtyY2lkfSA9IHo7XG5cdFx0Y29uc3Qge2RpZmZ9ID0gejtcblx0XHQvLyBuZXN0ZWQgY29uZGl0aW9uYWxzICh1cCB0byAxMCBkZWVwKSBhcmUgb2ssIGhvcGVmdWxseSEgKHdvcmsgZnJvbSB0aGUgaW5zaWRlIG91dClcblx0XHRpZiAodHlwZW9mIHJlY3Vyc2lvbkNvdW50ICE9PSB0eXBlb2YgMCkge1xuXHRcdFx0cmVjdXJzaW9uQ291bnQgPSAwO1xuXHRcdH1cblx0XHQvLyAoMVx0IGlmXHRcXFxcKFx0KDJcdDIpXHRcXFxcKVx0ICB7KDNcdDMpfSAgKDQgICBlbHNlXHQgIHsoNVx0IDUpfSAgNCkxKVxuXHRcdGNvbnN0IGNvbmRpdGlvbmFsU3BsaXRSZWdleCA9IC8oOz9cXHMqaWZcXHMqXFwoXFxzKihcXHcqKVxccypcXClcXHMqeyhbXnt9XSopfShcXHMqZWxzZVxccyp7KFtee31dKj8pfXwpKS9pO1xuXHRcdGNvbnN0IHNwbGl0dGVkID0gcy5zcGxpdChjb25kaXRpb25hbFNwbGl0UmVnZXgpO1xuXHRcdC8vICQxOiB3aG9sZSBjb25kaXRpb25hbFxuXHRcdC8vICQyOiB0ZXN0IGNvbmRpdGlvblxuXHRcdC8vICQzOiB0cnVlIGV4cGFuc2lvblxuXHRcdC8vICQ0OiBlbHNlIGNsYXVzZSAocG9zc2libHkgZW1wdHkpXG5cdFx0Ly8gJDU6IGZhbHNlIGV4cGFuc2lvbiAocG9zc2libHkgbnVsbClcblx0XHRjb25zdCBudW1QYXJlbnMgPSA1O1xuXHRcdGxldCBbcmV0XSA9IHNwbGl0dGVkO1xuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpID0gaSArIG51bVBhcmVucyArIDEpIHtcblx0XHRcdGNvbnN0IHRlc3RTdHJpbmcgPSBzcGxpdHRlZFtpICsgMiAtIDFdO1xuXHRcdFx0Y29uc3QgdHJ1ZVN0cmluZyA9IHNwbGl0dGVkW2kgKyAzIC0gMV07XG5cdFx0XHRsZXQgZmFsc2VTdHJpbmcgPSBzcGxpdHRlZFtpICsgNSAtIDFdO1xuXHRcdFx0aWYgKGZhbHNlU3RyaW5nID09PSB1bmRlZmluZWQgfHwgIWZhbHNlU3RyaW5nKSB7XG5cdFx0XHRcdGZhbHNlU3RyaW5nID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRsZXQgdGVzdFJlc3VsdDtcblx0XHRcdHN3aXRjaCAodGVzdFN0cmluZykge1xuXHRcdFx0XHRjYXNlICd1c2VyJzpcblx0XHRcdFx0XHR0ZXN0UmVzdWx0ID0gISFhcnRpY2xlLnVzZXJOYW1lKCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3RhbGsnOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhYXJ0aWNsZS50YWxrUGFnZSgpOyAvLyB0YWxrUGFnZSBjb252ZXJ0cyBfYXJ0aWNsZXNfIHRvIHRhbGtQYWdlc1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdhZG1pbic6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhZ2V0VmFsdWVPZigncG9wdXBBZG1pbkxpbmtzJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ29sZGlkJzpcblx0XHRcdFx0XHR0ZXN0UmVzdWx0ID0gISEob2xkaWQgIT09IHVuZGVmaW5lZCAmJiBvbGRpZCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3JjaWQnOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhIShyY2lkICE9PSB1bmRlZmluZWQgJiYgcmNpZCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2lwdXNlcic6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhYXJ0aWNsZS5pc0lwVXNlcigpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdtYWluc3BhY2VfZW4nOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSBpc0luTWFpbk5hbWVzcGFjZShhcnRpY2xlKSAmJiBwZy53aWtpLmhvc3RuYW1lID09PSAnZW4ud2lraXBlZGlhLm9yZyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3dpa2ltZWRpYSc6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhcGcud2lraS53aWtpbWVkaWE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RpZmYnOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhIShkaWZmICE9PSB1bmRlZmluZWQgJiYgZGlmZik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHRlc3RSZXN1bHQpIHtcblx0XHRcdFx0Y2FzZSBudWxsOlxuXHRcdFx0XHRcdHJldCArPSBzcGxpdHRlZFtpXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSB0cnVlOlxuXHRcdFx0XHRcdHJldCArPSB0cnVlU3RyaW5nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIGZhbHNlOlxuXHRcdFx0XHRcdHJldCArPSBmYWxzZVN0cmluZztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdC8vIGFwcGVuZCBub24tY29uZGl0aW9uYWwgc3RyaW5nXG5cdFx0XHRyZXQgKz0gc3BsaXR0ZWRbaSArIG51bVBhcmVuc107XG5cdFx0fVxuXHRcdGlmIChjb25kaXRpb25hbFNwbGl0UmVnZXgudGVzdChyZXQpICYmIHJlY3Vyc2lvbkNvdW50IDwgMTApIHtcblx0XHRcdHJldHVybiBleHBhbmRDb25kaXRpb25hbE5hdmxpbmtTdHJpbmcocmV0LCBhcnRpY2xlLCB6LCByZWN1cnNpb25Db3VudCArIDEpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBuYXZsaW5rU3RyaW5nVG9BcnJheSA9IChzLCBhcnRpY2xlLCBwYXJhbXMpID0+IHtcblx0XHRzID0gZXhwYW5kQ29uZGl0aW9uYWxOYXZsaW5rU3RyaW5nKHMsIGFydGljbGUsIHBhcmFtcyk7XG5cdFx0Y29uc3Qgc3BsaXR0ZWQgPSBzLnNwbGl0KC88PCguKj8pPj4vKTtcblx0XHRjb25zdCByZXQgPSBbXTtcblx0XHRmb3IgKGNvbnN0IFtpLCBlbGVtZW50XSBvZiBzcGxpdHRlZC5lbnRyaWVzKCkpIHtcblx0XHRcdGlmIChpICUgMikge1xuXHRcdFx0XHQvLyBpIG9kZCwgc28gcyBpcyBhIHRhZ1xuXHRcdFx0XHRjb25zdCB0ID0gbmV3IG5hdmxpbmtUYWcoKTtcblx0XHRcdFx0Y29uc3Qgc3MgPSBlbGVtZW50LnNwbGl0KCd8Jyk7XG5cdFx0XHRcdFt0LmlkXSA9IHNzO1xuXHRcdFx0XHRmb3IgKGxldCBqID0gMTsgaiA8IHNzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3NzID0gc3Nbal0uc3BsaXQoJz0nKTtcblx0XHRcdFx0XHRpZiAoc3NzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFssIHRbc3NzWzBdXV0gPSBzc3M7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIG5vIGFzc2lnbm1lbnQgKG5vIFwiPVwiKSwgc28gdHJlYXQgdGhpcyBhcyBhIHRpdGxlIChvdmVyd3JpdGluZyB0aGUgbGFzdCBvbmUpXG5cdFx0XHRcdFx0XHR0LnRleHQgPSBwb3B1cFN0cmluZyhzc3NbMF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0LmFydGljbGUgPSBhcnRpY2xlO1xuXHRcdFx0XHRjb25zdCB7b2xkaWR9ID0gcGFyYW1zO1xuXHRcdFx0XHRjb25zdCB7cmNpZH0gPSBwYXJhbXM7XG5cdFx0XHRcdGNvbnN0IHtkaWZmfSA9IHBhcmFtcztcblx0XHRcdFx0aWYgKG9sZGlkICE9PSB1bmRlZmluZWQgJiYgb2xkaWQgIT09IG51bGwpIHtcblx0XHRcdFx0XHR0Lm9sZGlkID0gb2xkaWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJjaWQgIT09IHVuZGVmaW5lZCAmJiByY2lkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0dC5yY2lkID0gcmNpZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZGlmZiAhPT0gdW5kZWZpbmVkICYmIGRpZmYgIT09IG51bGwpIHtcblx0XHRcdFx0XHR0LmRpZmYgPSBkaWZmO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghdC50ZXh0ICYmIHQuaWQgIT09ICdtYWlubGluaycpIHtcblx0XHRcdFx0XHR0LnRleHQgPSBwb3B1cFN0cmluZyh0LmlkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXQucHVzaCh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHBsYWluIEhUTUxcblx0XHRcdFx0cmV0LnB1c2goZWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IG5hdmxpbmtTdWJzdGl0dXRlSFRNTCA9IChzKSA9PiB7XG5cdFx0cmV0dXJuIHNcblx0XHRcdC5zcGxpdCgnKicpXG5cdFx0XHQuam9pbihnZXRWYWx1ZU9mKCdwb3B1cE5hdkxpbmtTZXBhcmF0b3InKSlcblx0XHRcdC5zcGxpdCgnPG1lbnVyb3c+Jylcblx0XHRcdC5qb2luKCc8bGkgY2xhc3M9XCJwb3B1cF9tZW51X3Jvd1wiPicpXG5cdFx0XHQuc3BsaXQoJzwvbWVudXJvdz4nKVxuXHRcdFx0LmpvaW4oJzwvbGk+Jylcblx0XHRcdC5zcGxpdCgnPG1lbnU+Jylcblx0XHRcdC5qb2luKCc8dWwgY2xhc3M9XCJwb3B1cF9tZW51XCI+Jylcblx0XHRcdC5zcGxpdCgnPC9tZW51PicpXG5cdFx0XHQuam9pbignPC91bD4nKTtcblx0fTtcblx0Y29uc3QgbmF2bGlua0RlcHRoID0gKG1hZ2ljLCBzKSA9PiB7XG5cdFx0cmV0dXJuIHMuc3BsaXQoYDwke21hZ2ljfT5gKS5sZW5ndGggLSBzLnNwbGl0KGA8LyR7bWFnaWN9PmApLmxlbmd0aDtcblx0fTtcblx0Ly8gbmF2bGlua1N0cmluZzogKiBiZWNvbWVzIHRoZSBzZXBhcmF0b3Jcblx0Ly9cdFx0XHRcdDw8Zm9vfGJhcj1iYXp8ZnViYXI+PiBiZWNvbWVzIGEgZm9vLWxpbmsgd2l0aCBhdHRyaWJ1dGUgYmFyPSdiYXonXG5cdC8vXHRcdFx0XHRcdFx0XHRcdFx0ICBhbmQgdmlzaWJsZSB0ZXh0ICdmdWJhcidcblx0Ly9cdFx0XHRcdGlmKHRlc3Qpey4uLn0gYW5kIGlmKHRlc3Qpey4uLn1lbHNley4uLn0gd29yayB0b28gKG5lc3RlZCBvaylcblx0Y29uc3QgbmF2bGlua1N0cmluZ1RvSFRNTCA9IChzLCBhcnRpY2xlLCBwYXJhbXMpID0+IHtcblx0XHQvLyBsaW1pdEFsZXJ0KG5hdmxpbmtTdHJpbmdUb0hUTUwsIDUsICduYXZsaW5rU3RyaW5nVG9IVE1MXFxuJyArIGFydGljbGUgKyAnXFxuJyArICh0eXBlb2YgYXJ0aWNsZSkpO1xuXHRcdGNvbnN0IHAgPSBuYXZsaW5rU3RyaW5nVG9BcnJheShzLCBhcnRpY2xlLCBwYXJhbXMpO1xuXHRcdGxldCBodG1sID0gJyc7XG5cdFx0bGV0IG1lbnVkZXB0aCA9IDA7IC8vIG5lc3RlZCBtZW51cyBub3QgY3VycmVudGx5IGFsbG93ZWQsIGJ1dCBkb2Vzbid0IGRvIGFueSBoYXJtIHRvIGNvZGUgZm9yIGl0XG5cdFx0bGV0IG1lbnVyb3dkZXB0aCA9IDA7XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHApIHtcblx0XHRcdGlmICh0eXBlb2YgZWxlbWVudCA9PT0gdHlwZW9mICcnKSB7XG5cdFx0XHRcdGh0bWwgKz0gbmF2bGlua1N1YnN0aXR1dGVIVE1MKGVsZW1lbnQpO1xuXHRcdFx0XHRtZW51ZGVwdGggKz0gbmF2bGlua0RlcHRoKCdtZW51JywgZWxlbWVudCk7XG5cdFx0XHRcdG1lbnVyb3dkZXB0aCArPSBuYXZsaW5rRGVwdGgoJ21lbnVyb3cnLCBlbGVtZW50KTtcblx0XHRcdFx0Ly9cdFx0XHRpZiAobWVudWRlcHRoID09PSAwKSB7XG5cdFx0XHRcdC8vXHRcdFx0XHR0YWdUeXBlPSdzcGFuJztcblx0XHRcdFx0Ly9cdFx0XHR9IGVsc2UgaWYgKG1lbnVyb3dkZXB0aCA9PT0gMCkge1xuXHRcdFx0XHQvL1x0XHRcdFx0dGFnVHlwZT0nbGknO1xuXHRcdFx0XHQvL1x0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vXHRcdFx0XHR0YWdUeXBlID0gbnVsbDtcblx0XHRcdFx0Ly9cdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQudHlwZSA9PT0gJ25hdmxpbmtUYWcnKSB7XG5cdFx0XHRcdGh0bWwgKz1cblx0XHRcdFx0XHRtZW51ZGVwdGggPiAwICYmIG1lbnVyb3dkZXB0aCA9PT0gMFxuXHRcdFx0XHRcdFx0PyBgPGxpIGNsYXNzPVwicG9wdXBfbWVudV9pdGVtXCI+JHtlbGVtZW50Lmh0bWwoKX08L2xpPmBcblx0XHRcdFx0XHRcdDogZWxlbWVudC5odG1sKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBodG1sO1xuXHR9O1xuXHRjbGFzcyBuYXZsaW5rVGFnIHtcblx0XHRjb25zdHJ1Y3RvcigpIHtcblx0XHRcdHRoaXMudHlwZSA9ICduYXZsaW5rVGFnJztcblx0XHR9XG5cdFx0aHRtbCgpIHtcblx0XHRcdHRoaXMuZ2V0TmV3V2luKCk7XG5cdFx0XHR0aGlzLmdldFByaW50RnVuY3Rpb24oKTtcblx0XHRcdGxldCBodG1sID0gJyc7XG5cdFx0XHRsZXQgb3BlbmluZztcblx0XHRcdGxldCBjbG9zaW5nO1xuXHRcdFx0Y29uc3QgdGFnVHlwZSA9ICdzcGFuJztcblx0XHRcdGlmICh0YWdUeXBlKSB7XG5cdFx0XHRcdG9wZW5pbmcgPSBgPCR7dGFnVHlwZX0gY2xhc3M9XCJwb3B1cF8ke3RoaXMuaWR9XCI+YDtcblx0XHRcdFx0Y2xvc2luZyA9IGA8LyR7dGFnVHlwZX0+YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wZW5pbmcgPSAnJztcblx0XHRcdFx0Y2xvc2luZyA9ICcnO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLnByaW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGh0bWwgPSB0aGlzLnByaW50KHRoaXMpO1xuXHRcdFx0XHRpZiAodHlwZW9mIGh0bWwgIT09IHR5cGVvZiAnJykge1xuXHRcdFx0XHRcdGh0bWwgPSAnJztcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNob3J0Y3V0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRodG1sID0gYWRkUG9wdXBTaG9ydGN1dChodG1sLCB0aGlzLnNob3J0Y3V0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXJybG9nKGBPaCBkZWFyIC0gaW52YWxpZCBwcmludCBmdW5jdGlvbiBmb3IgYSBuYXZsaW5rVGFnLCBpZD0ke3RoaXMuaWR9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3BlbmluZyArIGh0bWwgKyBjbG9zaW5nO1xuXHRcdH1cblx0XHRnZXROZXdXaW4oKSB7XG5cdFx0XHRnZXRWYWx1ZU9mKCdwb3B1cExpbmtzTmV3V2luZG93Jyk7XG5cdFx0XHRpZiAocGcub3B0aW9uLnBvcHVwTGlua3NOZXdXaW5kb3dbdGhpcy5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLm5ld1dpbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm5ld1dpbiA9IHBnLm9wdGlvbi5wb3B1cExpbmtzTmV3V2luZG93W3RoaXMuaWRdO1xuXHRcdH1cblx0XHRnZXRQcmludEZ1bmN0aW9uKCkge1xuXHRcdFx0Ly8gdGhpbmsgYWJvdXQgdGhpcyBzb21lIG1vcmVcblx0XHRcdC8vIHRoaXMuaWQgYW5kIHRoaXMuYXJ0aWNsZSBzaG91bGQgYWxyZWFkeSBiZSBkZWZpbmVkXG5cdFx0XHRpZiAodHlwZW9mIHRoaXMuaWQgIT09IHR5cGVvZiAnJyB8fCB0eXBlb2YgdGhpcy5hcnRpY2xlICE9PSB0eXBlb2Yge30pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5ub1BvcHVwID0gMTtcblx0XHRcdHN3aXRjaCAodGhpcy5pZCkge1xuXHRcdFx0XHRjYXNlICdjb250cmlicyc6XG5cdFx0XHRcdGNhc2UgJ2hpc3RvcnknOlxuXHRcdFx0XHRjYXNlICd3aGF0TGlua3NIZXJlJzpcblx0XHRcdFx0Y2FzZSAndXNlclBhZ2UnOlxuXHRcdFx0XHRjYXNlICd1c2VyVGFsayc6XG5cdFx0XHRcdGNhc2UgJ3RhbGsnOlxuXHRcdFx0XHRjYXNlICdhcnRpY2xlJzpcblx0XHRcdFx0Y2FzZSAnbGFzdEVkaXQnOlxuXHRcdFx0XHRcdHRoaXMubm9Qb3B1cCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHRoaXMuaWQpIHtcblx0XHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0XHRjYXNlICdjb250cmlicyc6XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrJzpcblx0XHRcdFx0Y2FzZSAndW5ibG9jayc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJsb2cnOlxuXHRcdFx0XHRjYXNlICd1c2VyU3BhY2UnOlxuXHRcdFx0XHRjYXNlICdkZWxldGVkQ29udHJpYnMnOlxuXHRcdFx0XHRcdHRoaXMuYXJ0aWNsZSA9IHRoaXMuYXJ0aWNsZS51c2VyTmFtZSgpO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoICh0aGlzLmlkKSB7XG5cdFx0XHRcdGNhc2UgJ3VzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAnbmV3VXNlclRhbGsnOlxuXHRcdFx0XHRjYXNlICdlZGl0VXNlclRhbGsnOlxuXHRcdFx0XHRjYXNlICd1c2VyUGFnZSc6XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrbG9nJzpcblx0XHRcdFx0XHR0aGlzLmFydGljbGUgPSB0aGlzLmFydGljbGUudXNlck5hbWUodHJ1ZSk7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0Y2FzZSAncGFnZWxvZyc6XG5cdFx0XHRcdGNhc2UgJ2RlbGV0ZWxvZyc6XG5cdFx0XHRcdGNhc2UgJ3Byb3RlY3Rsb2cnOlxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLm9sZGlkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuaWQgIT09ICdtYWlubGluaycpIHtcblx0XHRcdFx0Ly8gRklYTUUgYW5jaG9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lIGRpZmZlcmVudGx5IHdpdGggVGl0bGUgb2JqZWN0XG5cdFx0XHRcdHRoaXMuYXJ0aWNsZSA9IHRoaXMuYXJ0aWNsZS5yZW1vdmVBbmNob3IoKTtcblx0XHRcdFx0Ly8gaWYgKHR5cGVvZiB0aGlzLnRleHQ9PSd1bmRlZmluZWQnKSB7IHRoaXMudGV4dD1wb3B1cFN0cmluZyh0aGlzLmlkKTsgfVxuXHRcdFx0fVxuXHRcdFx0c3dpdGNoICh0aGlzLmlkKSB7XG5cdFx0XHRcdGNhc2UgJ3VuZGVsZXRlJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdVbmRlbGV0ZSc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnLyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3doYXRMaW5rc0hlcmUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1doYXRsaW5rc2hlcmUnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyZWxhdGVkQ2hhbmdlcyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnUmVjZW50Y2hhbmdlc2xpbmtlZCc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ21vdmUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ01vdmVwYWdlJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnY29udHJpYnMnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0NvbnRyaWJ1dGlvbnMnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkZWxldGVkQ29udHJpYnMnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0RlbGV0ZWRjb250cmlidXRpb25zJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0VtYWlsVXNlcic7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnLyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdCbG9ja2lwJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcmaXA9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndW5ibG9jayc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnSXBibG9ja2xpc3QnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZhY3Rpb249dW5ibG9jayZpcD0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1c2VybG9nJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdMb2cnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZ1c2VyPSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Jsb2NrbG9nJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdMb2cnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZ0eXBlPWJsb2NrJnBhZ2U9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncGFnZWxvZyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnTG9nJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcmcGFnZT0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdwcm90ZWN0bG9nJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdMb2cnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZ0eXBlPXByb3RlY3QmcGFnZT0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkZWxldGVsb2cnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0xvZyc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJnR5cGU9ZGVsZXRlJnBhZ2U9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndXNlclNwYWNlJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdQcmVmaXhJbmRleCc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJm5hbWVzcGFjZT0yJnByZWZpeD0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdzZWFyY2gnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1NlYXJjaCc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJmZ1bGx0ZXh0PVNlYXJjaCZzZWFyY2g9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndGhhbmsnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1RoYW5rcyc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnLyc7XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlLnZhbHVlID0gdGhpcy5kaWZmID09PSAncHJldicgPyB0aGlzLm9sZGlkIDogdGhpcy5kaWZmO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1bndhdGNoJzpcblx0XHRcdFx0Y2FzZSAnd2F0Y2gnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBtYWdpY1dhdGNoTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9IGAke3RoaXMuaWR9JmF1dG93YXRjaGxpc3Q9MSZhdXRvaW1wbD0ke3BvcHVwU3RyaW5nKFxuXHRcdFx0XHRcdFx0J2F1dG9lZGl0X3ZlcnNpb24nXG5cdFx0XHRcdFx0KX0mYWN0b2tlbj0ke2F1dG9DbGlja1Rva2VuKCl9YDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnaGlzdG9yeSc6XG5cdFx0XHRcdGNhc2UgJ2hpc3RvcnlmZWVkJzpcblx0XHRcdFx0Y2FzZSAndW5wcm90ZWN0Jzpcblx0XHRcdFx0Y2FzZSAncHJvdGVjdCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gdGhpcy5pZDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnZGVsZXRlJztcblx0XHRcdFx0XHRpZiAodGhpcy5hcnRpY2xlLm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zSW1hZ2VJZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaW1nID0gdGhpcy5hcnRpY2xlLnN0cmlwTmFtZXNwYWNlKCk7XG5cdFx0XHRcdFx0XHR0aGlzLmFjdGlvbiArPSBgJmltYWdlPSR7aW1nfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdtYXJrcGF0cm9sbGVkJzpcblx0XHRcdFx0Y2FzZSAnZWRpdCc6XG5cdFx0XHRcdFx0Ly8gZWRpdE9sZCBzaG91bGQga2VlcCB0aGUgb2xkaWQsIGJ1dCBlZGl0IHNob3VsZCBub3QuXG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMub2xkaWQ7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0Y2FzZSAndmlldyc6XG5cdFx0XHRcdGNhc2UgJ3B1cmdlJzpcblx0XHRcdFx0Y2FzZSAncmVuZGVyJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSB0aGlzLmlkO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyYXcnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdyYXcnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICduZXcnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdlZGl0JnNlY3Rpb249bmV3Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbWFpbmxpbmsnOlxuXHRcdFx0XHRcdGlmICh0aGlzLnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0ID0gdGhpcy5hcnRpY2xlLnRvU3RyaW5nKCkuZW50aWZ5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFNpbXBsaWZ5TWFpbkxpbmsnKSAmJiBpc0luU3RyaXBwYWJsZU5hbWVzcGFjZSh0aGlzLmFydGljbGUpKSB7XG5cdFx0XHRcdFx0XHQvLyBvbmx5IHNob3cgdGhlIC9zdWJwYWdlIHBhcnQgb2YgdGhlIHRpdGxlIHRleHRcblx0XHRcdFx0XHRcdGNvbnN0IHMgPSB0aGlzLnRleHQuc3BsaXQoJy8nKTtcblx0XHRcdFx0XHRcdHRoaXMudGV4dCA9IHMuYXQoLTEpO1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMudGV4dCA9PT0gJycgJiYgcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMudGV4dCA9IHMuYXQoLTIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkV2lraUxpbms7XG5cdFx0XHRcdFx0aWYgKHRoaXMudGl0bGUgPT09IHVuZGVmaW5lZCAmJiBwZy5jdXJyZW50LmxpbmsgJiYgcGcuY3VycmVudC5saW5rLmhyZWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhpcy50aXRsZSA9IHNhZmVEZWNvZGVVUkkocGcuY3VycmVudC5saW5rLm9yaWdpbmFsVGl0bGUgPz8gdGhpcy5hcnRpY2xlKTtcblx0XHRcdFx0XHRcdGlmICh0aGlzLm9sZGlkICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vbGRpZCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRpdGxlID0gdHByaW50ZignUmV2aXNpb24gJXMgb2YgJXMnLCBbdGhpcy5vbGRpZCwgdGhpcy50aXRsZV0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICd2aWV3Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndXNlclBhZ2UnOlxuXHRcdFx0XHRjYXNlICdhcnRpY2xlJzpcblx0XHRcdFx0Y2FzZSAnZWRpdEFydGljbGUnOlxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLm9sZGlkO1xuXHRcdFx0XHRcdC8vIG13Lm5vdGlmeShgJHt0aGlzLmlkfVxcbiR7dGhpcy5hcnRpY2xlfVxcbiR7dHlwZW9mIHRoaXMuYXJ0aWNsZX1gLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ3dhcm4nfSk7XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLmFydGljbGVGcm9tVGFsa09yQXJ0aWNsZSgpO1xuXHRcdFx0XHRcdC8vIG13Lm5vdGlmeShgJHt0aGlzLmlkfVxcbiR7dGhpcy5hcnRpY2xlfVxcbiR7dHlwZW9mIHRoaXMuYXJ0aWNsZX1gLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ3dhcm4nfSk7XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gdGhpcy5pZC5pbmRleE9mKCdlZGl0JykgPT09IDAgPyAnZWRpdCcgOiAndmlldyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3VzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAndGFsayc6XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLnRhbGtQYWdlKCk7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMub2xkaWQ7XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ3ZpZXcnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdhcmluJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gYXJpbkxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2NvdW50Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gZWRpdENvdW50ZXJMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdlZGl0b3JzJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gZWRpdG9yTGlzdExpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2xhc3RFZGl0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkRGlmZkxpbms7XG5cdFx0XHRcdFx0dGhpcy50aXRsZSA9IHBvcHVwU3RyaW5nKCdTaG93IHRoZSBsYXN0IGVkaXQnKTtcblx0XHRcdFx0XHR0aGlzLmZyb20gPSAncHJldic7XG5cdFx0XHRcdFx0dGhpcy50byA9ICdjdXInO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdvbGRFZGl0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkRGlmZkxpbms7XG5cdFx0XHRcdFx0dGhpcy50aXRsZSA9IGAke3BvcHVwU3RyaW5nKCdTaG93IHRoZSBlZGl0IG1hZGUgdG8gZ2V0IHJldmlzaW9uJyl9ICR7dGhpcy5vbGRpZH1gO1xuXHRcdFx0XHRcdHRoaXMuZnJvbSA9ICdwcmV2Jztcblx0XHRcdFx0XHR0aGlzLnRvID0gdGhpcy5vbGRpZDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZWRpdE9sZCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ2VkaXQnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1bmRvJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnZWRpdCZ1bmRvPSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3JldmVydCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ3JldmVydCc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ251bGxFZGl0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnbnVsbEVkaXQnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkaWZmQ3VyJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gdGl0bGVkRGlmZkxpbms7XG5cdFx0XHRcdFx0dGhpcy50aXRsZSA9IHRwcmludGYoJ1Nob3cgY2hhbmdlcyBzaW5jZSByZXZpc2lvbiAlcycsIFt0aGlzLm9sZGlkXSk7XG5cdFx0XHRcdFx0dGhpcy5mcm9tID0gdGhpcy5vbGRpZDtcblx0XHRcdFx0XHR0aGlzLnRvID0gJ2N1cic7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2VkaXRVc2VyVGFsayc6XG5cdFx0XHRcdGNhc2UgJ2VkaXRUYWxrJzpcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5vbGRpZDtcblx0XHRcdFx0XHR0aGlzLmFydGljbGUgPSB0aGlzLmFydGljbGUudGFsa1BhZ2UoKTtcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdlZGl0Jztcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ25ld1VzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAnbmV3VGFsayc6XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLnRhbGtQYWdlKCk7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnZWRpdCZzZWN0aW9uPW5ldyc7XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdsYXN0Q29udHJpYic6XG5cdFx0XHRcdGNhc2UgJ3NpbmNlTWUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBtYWdpY0hpc3RvcnlMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd0b2dnbGVQcmV2aWV3cyc6XG5cdFx0XHRcdFx0dGhpcy50ZXh0ID0gcG9wdXBTdHJpbmcocGcub3B0aW9uLnNpbXBsZVBvcHVwcyA/ICdlbmFibGUgcHJldmlld3MnIDogJ2Rpc2FibGUgcHJldmlld3MnKTtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlICdkaXNhYmxlUG9wdXBzJzpcblx0XHRcdFx0Y2FzZSAncHVyZ2VQb3B1cHMnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBwb3B1cE1lbnVMaW5rO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYFVua25vd24gbmF2bGluayB0eXBlOiAke3RoaXMuaWR9YDtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvL1xuXHQvLyAgZW5kIG5hdmxpbmtzXG5cdC8vIEVOREZJTEU6IG5hdmxpbmtzLmpzXG5cdC8vIFNUQVJURklMRTogc2hvcnRjdXRrZXlzLmpzXG5cdGNvbnN0IHBvcHVwSGFuZGxlS2V5cHJlc3MgPSBmdW5jdGlvbiBwb3B1cEhhbmRsZUtleXByZXNzKGV2dCkge1xuXHRcdGNvbnN0IGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyB3aW5kb3cuZXZlbnQua2V5Q29kZSA6IGV2dC5rZXlDb2RlID8/IGV2dC53aGljaDtcblx0XHRpZiAoIWtleUNvZGUgfHwgIXBnLmN1cnJlbnQubGluayB8fCAhcGcuY3VycmVudC5saW5rLm5hdnBvcHVwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChrZXlDb2RlID09PSAyNykge1xuXHRcdFx0Ly8gZXNjYXBlXG5cdFx0XHRraWxsUG9wdXAoKTtcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gc3dhbGxvdyBrZXlwcmVzc1xuXHRcdH1cblx0XHRjb25zdCBsZXR0ZXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChrZXlDb2RlKTtcblx0XHRjb25zdCBsaW5rcyA9IHBnLmN1cnJlbnQubGluay5uYXZwb3B1cC5tYWluRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ0EnKTtcblx0XHRsZXQgc3RhcnRMaW5rID0gMDtcblx0XHRsZXQgaTtcblx0XHRsZXQgajtcblx0XHRpZiAocG9wdXBIYW5kbGVLZXlwcmVzcy5sYXN0UG9wdXBMaW5rU2VsZWN0ZWQpIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHRpZiAobGlua3NbaV0gPT09IHBvcHVwSGFuZGxlS2V5cHJlc3MubGFzdFBvcHVwTGlua1NlbGVjdGVkKSB7XG5cdFx0XHRcdFx0c3RhcnRMaW5rID0gaTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGogPSAwOyBqIDwgbGlua3MubGVuZ3RoOyArK2opIHtcblx0XHRcdGkgPSAoc3RhcnRMaW5rICsgaiArIDEpICUgbGlua3MubGVuZ3RoO1xuXHRcdFx0aWYgKGxpbmtzW2ldLmdldEF0dHJpYnV0ZSgncG9wdXBrZXknKSA9PT0gbGV0dGVyKSB7XG5cdFx0XHRcdGlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7XG5cdFx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGlua3NbaV0uZm9jdXMoKTtcblx0XHRcdFx0cG9wdXBIYW5kbGVLZXlwcmVzcy5sYXN0UG9wdXBMaW5rU2VsZWN0ZWQgPSBsaW5rc1tpXTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBzd2FsbG93IGtleXByZXNzXG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHBhc3Mga2V5cHJlc3Mgb25cblx0XHRpZiAoZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzKSB7XG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzKGV2dCk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXHRjb25zdCBhZGRQb3B1cFNob3J0Y3V0cyA9ICgpID0+IHtcblx0XHRpZiAoZG9jdW1lbnQub25rZXlwcmVzcyAhPT0gcG9wdXBIYW5kbGVLZXlwcmVzcykge1xuXHRcdFx0ZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzID0gZG9jdW1lbnQub25rZXlwcmVzcztcblx0XHR9XG5cdFx0ZG9jdW1lbnQub25rZXlwcmVzcyA9IHBvcHVwSGFuZGxlS2V5cHJlc3M7XG5cdH07XG5cdGNvbnN0IHJtUG9wdXBTaG9ydGN1dHMgPSAoKSA9PiB7XG5cdFx0cG9wdXBIYW5kbGVLZXlwcmVzcy5sYXN0UG9wdXBMaW5rU2VsZWN0ZWQgPSBudWxsO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzICYmIGRvY3VtZW50Lm9sZFBvcHVwT25rZXlwcmVzcyA9PT0gcG9wdXBIYW5kbGVLZXlwcmVzcykge1xuXHRcdFx0XHQvLyBwYW5pY1xuXHRcdFx0XHRkb2N1bWVudC5vbmtleXByZXNzID0gbnVsbDsgLy8gKCkgPT4ge307XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGRvY3VtZW50Lm9ua2V5cHJlc3MgPSBkb2N1bWVudC5vbGRQb3B1cE9ua2V5cHJlc3M7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBJRSBnb2VzIGhlcmUgKi9cblx0XHR9XG5cdH07XG5cdGNvbnN0IGFkZExpbmtQcm9wZXJ0eSA9IChodG1sLCBwcm9wZXJ0eSkgPT4ge1xuXHRcdC8vIHRha2UgXCI8YSBocmVmPS4uLj4uLi48L2E+IGFuZCBhZGQgYSBwcm9wZXJ0eVxuXHRcdC8vIG5vdCBzb3BoaXN0aWNhdGVkIGF0IGFsbCwgZWFzaWx5IGJyb2tlblxuXHRcdGNvbnN0IGkgPSBodG1sLmluZGV4T2YoJz4nKTtcblx0XHRpZiAoaSA8IDApIHtcblx0XHRcdHJldHVybiBodG1sO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7aHRtbC5zbGljZSgwLCBNYXRoLm1heCgwLCBpKSl9ICR7cHJvcGVydHl9JHtodG1sLnNsaWNlKE1hdGgubWF4KDAsIGkpKX1gO1xuXHR9O1xuXHRjb25zdCBhZGRQb3B1cFNob3J0Y3V0ID0gKGh0bWwsIGtleSkgPT4ge1xuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBTaG9ydGN1dEtleXMnKSkge1xuXHRcdFx0cmV0dXJuIGh0bWw7XG5cdFx0fVxuXHRcdGNvbnN0IHJldCA9IGFkZExpbmtQcm9wZXJ0eShodG1sLCBgcG9wdXBrZXk9XCIke2tleX1cImApO1xuXHRcdGlmIChrZXkgPT09ICcgJykge1xuXHRcdFx0a2V5ID0gcG9wdXBTdHJpbmcoJ3NwYWNlYmFyJyk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQucmVwbGFjZSgvXiguKj8pKHRpdGxlPVwiKSguKj8pKFwiLiopJC9pLCBgJDEkMiQzIFske2tleX1dJDRgKTtcblx0fTtcblx0Ly8gRU5ERklMRTogc2hvcnRjdXRrZXlzLmpzXG5cdC8vIFNUQVJURklMRTogZGlmZnByZXZpZXcuanNcblx0Ly8gbGV0cyBqdW1wIHRocm91Z2ggaG9vcHMgdG8gZmluZCB0aGUgcmV2IGlkcyB3ZSBuZWVkIHRvIHJldHJpZXZlXG5cdGNvbnN0IGxvYWREaWZmID0gKGFydGljbGUsIG9sZGlkLCBkaWZmLCBuYXZwb3ApID0+IHtcblx0XHRuYXZwb3AuZGlmZkRhdGEgPSB7XG5cdFx0XHRvbGRSZXY6IHt9LFxuXHRcdFx0bmV3UmV2OiB7fSxcblx0XHR9O1xuXHRcdGNvbnN0IGFwaSA9IGdldE13QXBpKCk7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0YWN0aW9uOiAnY29tcGFyZScsXG5cdFx0XHRwcm9wOiBbJ2lkcycsICd0aXRsZSddLFxuXHRcdH07XG5cdFx0aWYgKGFydGljbGUudGl0bGUpIHtcblx0XHRcdHBhcmFtcy5mcm9tdGl0bGUgPSBhcnRpY2xlLnRpdGxlO1xuXHRcdH1cblx0XHRzd2l0Y2ggKGRpZmYpIHtcblx0XHRcdGNhc2UgJ2N1cic6XG5cdFx0XHRcdHN3aXRjaCAob2xkaWQpIHtcblx0XHRcdFx0XHRjYXNlIG51bGw6XG5cdFx0XHRcdFx0Y2FzZSAnJzpcblx0XHRcdFx0XHRjYXNlICdwcmV2Jzpcblx0XHRcdFx0XHRcdC8vIHRoaXMgY2FuIG9ubHkgd29yayBpZiB3ZSBoYXZlIHRoZSB0aXRsZVxuXHRcdFx0XHRcdFx0Ly8gY3VyIC0+IHByZXZcblx0XHRcdFx0XHRcdHBhcmFtcy50b3JlbGF0aXZlID0gJ3ByZXYnO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHBhcmFtcy5mcm9tcmV2ID0gb2xkaWQ7XG5cdFx0XHRcdFx0XHRwYXJhbXMudG9yZWxhdGl2ZSA9ICdjdXInO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwcmV2Jzpcblx0XHRcdFx0aWYgKG9sZGlkKSB7XG5cdFx0XHRcdFx0cGFyYW1zLmZyb21yZXYgPSBvbGRpZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJhbXMuZnJvbXRpdGxlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhcmFtcy50b3JlbGF0aXZlID0gJ3ByZXYnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ25leHQnOlxuXHRcdFx0XHRwYXJhbXMuZnJvbXJldiA9IG9sZGlkIHx8IDA7XG5cdFx0XHRcdHBhcmFtcy50b3JlbGF0aXZlID0gJ25leHQnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHBhcmFtcy5mcm9tcmV2ID0gb2xkaWQgfHwgMDtcblx0XHRcdFx0cGFyYW1zLnRvcmV2ID0gZGlmZiB8fCAwO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0YXBpLmdldChwYXJhbXMpLnRoZW4oKGRhdGEpID0+IHtcblx0XHRcdG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQgPSBkYXRhLmNvbXBhcmUuZnJvbXJldmlkO1xuXHRcdFx0bmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpZCA9IGRhdGEuY29tcGFyZS50b3JldmlkO1xuXHRcdFx0YWRkUmV2aWV3TGluayhuYXZwb3AsICdwb3B1cE1pc2NUb29scycpO1xuXHRcdFx0Y29uc3QgZ28gPSAoKSA9PiB7XG5cdFx0XHRcdHBlbmRpbmdOYXZwb3BUYXNrKG5hdnBvcCk7XG5cdFx0XHRcdGxldCB1cmwgPSBgJHtwZy53aWtpLmFwaXdpa2liYXNlfT9mb3JtYXQ9anNvbiZmb3JtYXR2ZXJzaW9uPTImYWN0aW9uPXF1ZXJ5JmA7XG5cdFx0XHRcdHVybCArPSBgcmV2aWRzPSR7bmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZH18JHtuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkfWA7XG5cdFx0XHRcdHVybCArPSAnJnByb3A9cmV2aXNpb25zJnJ2cHJvcD1pZHN8dGltZXN0YW1wfGNvbnRlbnQnO1xuXHRcdFx0XHRnZXRQYWdlV2l0aENhY2hpbmcodXJsLCBkb25lRGlmZiwgbmF2cG9wKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7IC8vIHJlbW92ZSBob29rIG9uY2UgcnVuXG5cdFx0XHR9O1xuXHRcdFx0aWYgKG5hdnBvcC52aXNpYmxlIHx8ICFnZXRWYWx1ZU9mKCdwb3B1cExhenlEb3dubG9hZHMnKSkge1xuXHRcdFx0XHRnbygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmF2cG9wLmFkZEhvb2soZ28sICd1bmhpZGUnLCAnYmVmb3JlJywgJ0RPV05MT0FEX0RJRkZTJyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cdC8vIFB1dCBhIFwibWFyayBwYXRyb2xsZWRcIiBsaW5rIHRvIGFuIGVsZW1lbnQgdGFyZ2V0XG5cdC8vIFRPRE86IEFsbG93IHBhdHJvbCBhIHJldmlzaW9uLCBhcyB3ZWxsIGFzIGEgZGlmZlxuXHRjb25zdCBhZGRSZXZpZXdMaW5rID0gKG5hdnBvcCwgdGFyZ2V0KSA9PiB7XG5cdFx0aWYgKCFwZy51c2VyLmNhblJldmlldykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBJZiAnbmV3UmV2JyBpcyBvbGRlciB0aGFuICdvbGRSZXYnIHRoYW4gaXQgY291bGQgYmUgY29uZnVzaW5nLCBzbyB3ZSBkbyBub3Qgc2hvdyB0aGUgcmV2aWV3IGxpbmsuXG5cdFx0aWYgKG5hdnBvcC5kaWZmRGF0YS5uZXdSZXYucmV2aWQgPD0gbmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdGZvcm1hdHZlcnNpb246ICcyJyxcblx0XHRcdHByb3A6IFsnaW5mbycsICdmbGFnZ2VkJ10sXG5cdFx0XHRyZXZpZHM6IG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQsXG5cdFx0fTtcblx0XHRnZXRNd0FwaSgpXG5cdFx0XHQuZ2V0KHBhcmFtcylcblx0XHRcdC50aGVuKChkYXRhKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0YWJsZV9yZXZpZCA9IChkYXRhLnF1ZXJ5LnBhZ2VzWzBdLmZsYWdnZWQgJiYgZGF0YS5xdWVyeS5wYWdlc1swXS5mbGFnZ2VkLnN0YWJsZV9yZXZpZCkgfHwgMDtcblx0XHRcdFx0Ly8gVGhlIGRpZmYgY2FuIGJlIHJldmlld2VkIGlmIHRoZSBvbGQgdmVyc2lvbiBpcyB0aGUgbGFzdCByZXZpZXdlZCB2ZXJzaW9uXG5cdFx0XHRcdC8vIFRPRE86IE90aGVyIHBvc3NpYmxlIGNvbmRpdGlvbnMgdGhhdCB3ZSBtYXkgd2FudCB0byBpbXBsZW1lbnQgaW5zdGVhZCBvZiB0aGlzIG9uZTpcblx0XHRcdFx0Ly8gLSBvbGQgdmVyc2lvbiBpcyBwYXRyb2xsZWQgYW5kIHRoZSBuZXcgdmVyc2lvbiBpcyBub3QgcGF0cm9sbGVkXG5cdFx0XHRcdC8vIC0gb2xkIHZlcnNpb24gaXMgcGF0cm9sbGVkIGFuZCB0aGUgbmV3IHZlcnNpb24gaXMgbW9yZSByZWNlbnQgdGhhbiB0aGUgbGFzdCByZXZpZXdlZCB2ZXJzaW9uXG5cdFx0XHRcdGlmIChzdGFibGVfcmV2aWQgPT09IG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQpIHtcblx0XHRcdFx0XHRjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRcdGEuaW5uZXJIVE1MID0gcG9wdXBTdHJpbmcoJ21hcmsgcGF0cm9sbGVkJyk7XG5cdFx0XHRcdFx0YS50aXRsZSA9IHBvcHVwU3RyaW5nKCdtYXJrcGF0cm9sbGVkSGludCcpO1xuXHRcdFx0XHRcdGEub25jbGljayA9ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiAncmV2aWV3Jyxcblx0XHRcdFx0XHRcdFx0Y29tbWVudDogdHByaW50ZignZGVmYXVsdHBvcHVwUmV2aWV3ZWRTdW1tYXJ5JywgW1xuXHRcdFx0XHRcdFx0XHRcdG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aWQsXG5cdFx0XHRcdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpZCxcblx0XHRcdFx0XHRcdFx0XSksXG5cdFx0XHRcdFx0XHRcdHJldmlkOiBuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGdldE13QXBpKClcblx0XHRcdFx0XHRcdFx0LnBvc3RXaXRoVG9rZW4oJ2NzcmYnLCBwYXJhbXMpXG5cdFx0XHRcdFx0XHRcdC5kb25lKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogVXBkYXRlIGN1cnJlbnQgcGFnZSBhbmQgb3RoZXIgYWxyZWFkeSBjb25zdHJ1Y3RlZCBwb3B1cHNcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmZhaWwoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHZvaWQgbXcubm90aWZ5KHBvcHVwU3RyaW5nKCdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnKSwge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFnOiAncG9wdXBzJyxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0c2V0UG9wdXBIVE1MKGEsIHRhcmdldCwgbmF2cG9wLmlkTnVtYmVyLCBudWxsLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH07XG5cdGNvbnN0IGRvbmVEaWZmID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0aWYgKCFkb3dubG9hZC5vd25lciB8fCAhZG93bmxvYWQub3duZXIuZGlmZkRhdGEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgbmF2cG9wID0gZG93bmxvYWQub3duZXI7XG5cdFx0Y29tcGxldGVkTmF2cG9wVGFzayhuYXZwb3ApO1xuXHRcdGxldCBwYWdlcztcblx0XHRsZXQgcmV2aXNpb25zID0gW107XG5cdFx0dHJ5IHtcblx0XHRcdC8vIFByb2Nlc3MgdGhlIGRvd25sb2Fkc1xuXHRcdFx0KHtwYWdlc30gPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKS5xdWVyeSk7XG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcblx0XHRcdFx0cmV2aXNpb25zID0gWy4uLnJldmlzaW9ucywgLi4ucGFnZS5yZXZpc2lvbnNdO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCByZXZpc2lvbiBvZiByZXZpc2lvbnMpIHtcblx0XHRcdFx0aWYgKHJldmlzaW9uLnJldmlkID09PSBuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlkKSB7XG5cdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpc2lvbiA9IHJldmlzaW9uO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJldmlzaW9uLnJldmlkID09PSBuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkKSB7XG5cdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpc2lvbiA9IHJldmlzaW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRlcnJsb2coJ0NvdWxkIG5vdCBnZXQgZGlmZicpO1xuXHRcdH1cblx0XHRpbnNlcnREaWZmKG5hdnBvcCk7XG5cdH07XG5cdGNvbnN0IHJtQm9yaW5nTGluZXMgPSAoYSwgYiwgY29udGV4dCkgPT4ge1xuXHRcdGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnRleHQgPSAyO1xuXHRcdH1cblx0XHQvLyB0aGlzIGlzIGZhaXJseSBzbG93Li4uIGkgdGhpbmsgaXQncyBxdWlja2VyIHRoYW4gZG9pbmcgYSB3b3JkLWJhc2VkIGRpZmYgZnJvbSB0aGUgb2ZmLCB0aG91Z2hcblx0XHRjb25zdCBhYSA9IFtdO1xuXHRcdGNvbnN0IGFhYSA9IFtdO1xuXHRcdGNvbnN0IGJiID0gW107XG5cdFx0Y29uc3QgYmJiID0gW107XG5cdFx0bGV0IGk7XG5cdFx0bGV0IGo7XG5cdFx0Ly8gZmlyc3QsIGdhdGhlciBhbGwgZGlzY29ubmVjdGVkIG5vZGVzIGluIGEgYW5kIGFsbCBjcm9zc2luZyBub2RlcyBpbiBhIGFuZCBiXG5cdFx0Zm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICghYVtpXS5wYWlyZWQpIHtcblx0XHRcdFx0YWFbaV0gPSAxO1xuXHRcdFx0fSBlbHNlIGlmIChjb3VudENyb3NzaW5ncyhiLCBhLCBpLCB0cnVlKSkge1xuXHRcdFx0XHRhYVtpXSA9IDE7XG5cdFx0XHRcdGJiW2FbaV0ucm93XSA9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHBpY2sgdXAgcmVtYWluaW5nIGRpc2Nvbm5lY3RlZCBub2RlcyBpbiBiXG5cdFx0Zm9yIChpID0gMDsgaSA8IGIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA9PT0gMSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICghYltpXS5wYWlyZWQpIHtcblx0XHRcdFx0YmJbaV0gPSAxO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBhbm90aGVyIHBhc3MgdG8gZ2F0aGVyIGNvbnRleHQ6IHdlIHdhbnQgdGhlIG5laWdoYm91cnMgb2YgaW5jbHVkZWQgbm9kZXMgd2hpY2ggYXJlIG5vdFxuXHRcdC8vIHlldCBpbmNsdWRlZCB3ZSBoYXZlIHRvIGFkZCBpbiBwYXJ0bmVycyBvZiB0aGVzZSBub2RlcywgYnV0IHdlIGRvbid0IHdhbnQgdG8gYWRkIGNvbnRleHRcblx0XHQvLyBmb3IgKnRob3NlKiBub2RlcyBpbiB0aGUgbmV4dCBwYXNzXG5cdFx0Zm9yIChpID0gMDsgaSA8IGIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA9PT0gMSkge1xuXHRcdFx0XHRmb3IgKGogPSBNYXRoLm1heCgwLCBpIC0gY29udGV4dCk7IGogPCBNYXRoLm1pbihiLmxlbmd0aCwgaSArIGNvbnRleHQpOyArK2opIHtcblx0XHRcdFx0XHRpZiAoIWJiW2pdKSB7XG5cdFx0XHRcdFx0XHRiYltqXSA9IDE7XG5cdFx0XHRcdFx0XHRhYVtiW2pdLnJvd10gPSAwLjU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAoYWFbaV0gPT09IDEpIHtcblx0XHRcdFx0Zm9yIChqID0gTWF0aC5tYXgoMCwgaSAtIGNvbnRleHQpOyBqIDwgTWF0aC5taW4oYS5sZW5ndGgsIGkgKyBjb250ZXh0KTsgKytqKSB7XG5cdFx0XHRcdFx0aWYgKCFhYVtqXSkge1xuXHRcdFx0XHRcdFx0YWFbal0gPSAxO1xuXHRcdFx0XHRcdFx0YmJbYVtqXS5yb3ddID0gMC41O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgYmIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA+IDApIHtcblx0XHRcdFx0Ly8gaXQncyBhIHJvdyB3ZSBuZWVkXG5cdFx0XHRcdGlmIChiW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRcdGJiYi5wdXNoKGJbaV0udGV4dCk7IC8vIGpvaW5lZDsgcGFydG5lciBzaG91bGQgYmUgaW4gYWFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRiYmIucHVzaChiW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgYWEubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChhYVtpXSA+IDApIHtcblx0XHRcdFx0Ly8gaXQncyBhIHJvdyB3ZSBuZWVkXG5cdFx0XHRcdGlmIChhW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRcdGFhYS5wdXNoKGFbaV0udGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gam9pbmVkOyBwYXJ0bmVyIHNob3VsZCBiZSBpbiBhYVxuXHRcdFx0XHRcdGFhYS5wdXNoKGFbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRhOiBhYWEsXG5cdFx0XHRiOiBiYmIsXG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc3RyaXBPdXRlckNvbW1vbkxpbmVzID0gKGEsIGIsIGNvbnRleHQpID0+IHtcblx0XHRsZXQgaSA9IDA7XG5cdFx0d2hpbGUgKGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggJiYgYVtpXSA9PT0gYltpXSkge1xuXHRcdFx0KytpO1xuXHRcdH1cblx0XHRsZXQgaiA9IGEubGVuZ3RoIC0gMTtcblx0XHRsZXQgayA9IGIubGVuZ3RoIC0gMTtcblx0XHR3aGlsZSAoaiA+PSAwICYmIGsgPj0gMCAmJiBhW2pdID09PSBiW2tdKSB7XG5cdFx0XHQtLWo7XG5cdFx0XHQtLWs7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRhOiBhLnNsaWNlKE1hdGgubWF4KDAsIGkgLSAxIC0gY29udGV4dCksIE1hdGgubWluKGEubGVuZ3RoICsgMSwgaiArIGNvbnRleHQgKyAxKSksXG5cdFx0XHRiOiBiLnNsaWNlKE1hdGgubWF4KDAsIGkgLSAxIC0gY29udGV4dCksIE1hdGgubWluKGIubGVuZ3RoICsgMSwgayArIGNvbnRleHQgKyAxKSksXG5cdFx0fTtcblx0fTtcblx0Y29uc3QgaW5zZXJ0RGlmZiA9IChuYXZwb3ApID0+IHtcblx0XHQvLyBmb3Igc3BlZWQgcmVhc29ucywgd2UgZmlyc3QgZG8gYSBsaW5lLWJhc2VkIGRpZmYsIGRpc2NhcmQgc3R1ZmYgdGhhdCBzZWVtcyBib3JpbmcsIHRoZW5cblx0XHQvLyBkbyBhIHdvcmQtYmFzZWQgZGlmZlxuXHRcdC8vIEZJWE1FOiBzb21ldGltZXMgdGhpcyBnaXZlcyBtaXNsZWFkaW5nIGRpZmZzIGFzIGRpc3RhbnQgY2h1bmtzIGFyZSBzcXVhc2hlZCB0b2dldGhlclxuXHRcdGxldCBvbGRsaW5lcyA9IG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aXNpb24uY29udGVudC5zcGxpdCgnXFxuJyk7XG5cdFx0bGV0IG5ld2xpbmVzID0gbmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpc2lvbi5jb250ZW50LnNwbGl0KCdcXG4nKTtcblx0XHRsZXQgaW5uZXIgPSBzdHJpcE91dGVyQ29tbW9uTGluZXMob2xkbGluZXMsIG5ld2xpbmVzLCBnZXRWYWx1ZU9mKCdwb3B1cERpZmZDb250ZXh0TGluZXMnKSk7XG5cdFx0b2xkbGluZXMgPSBpbm5lci5hO1xuXHRcdG5ld2xpbmVzID0gaW5uZXIuYjtcblx0XHRsZXQgdHJ1bmNhdGVkID0gZmFsc2U7XG5cdFx0Z2V0VmFsdWVPZigncG9wdXBEaWZmTWF4TGluZXMnKTtcblx0XHRpZiAob2xkbGluZXMubGVuZ3RoID4gcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzIHx8IG5ld2xpbmVzLmxlbmd0aCA+IHBnLm9wdGlvbi5wb3B1cERpZmZNYXhMaW5lcykge1xuXHRcdFx0Ly8gdHJ1bmNhdGVcblx0XHRcdHRydW5jYXRlZCA9IHRydWU7XG5cdFx0XHRpbm5lciA9IHN0cmlwT3V0ZXJDb21tb25MaW5lcyhcblx0XHRcdFx0b2xkbGluZXMuc2xpY2UoMCwgcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzKSxcblx0XHRcdFx0bmV3bGluZXMuc2xpY2UoMCwgcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzKSxcblx0XHRcdFx0cGcub3B0aW9uLnBvcHVwRGlmZkNvbnRleHRMaW5lc1xuXHRcdFx0KTtcblx0XHRcdG9sZGxpbmVzID0gaW5uZXIuYTtcblx0XHRcdG5ld2xpbmVzID0gaW5uZXIuYjtcblx0XHR9XG5cdFx0Y29uc3QgbGluZURpZmYgPSBkaWZmKG9sZGxpbmVzLCBuZXdsaW5lcyk7XG5cdFx0Y29uc3QgbGluZXMyID0gcm1Cb3JpbmdMaW5lcyhsaW5lRGlmZi5vLCBsaW5lRGlmZi5uKTtcblx0XHRjb25zdCBvbGRsaW5lczIgPSBsaW5lczIuYTtcblx0XHRjb25zdCBuZXdsaW5lczIgPSBsaW5lczIuYjtcblx0XHRsZXQgaHRtbCA9ICc8aHI+Jztcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBEaWZmRGF0ZXMnKSkge1xuXHRcdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZShuYXZwb3ApO1xuXHRcdFx0aHRtbCArPSAnPGhyPic7XG5cdFx0fVxuXHRcdGh0bWwgKz0gc2hvcnRlbkRpZmZTdHJpbmcoXG5cdFx0XHRkaWZmU3RyaW5nKG9sZGxpbmVzMi5qb2luKCdcXG4nKSwgbmV3bGluZXMyLmpvaW4oJ1xcbicpKSxcblx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwRGlmZkNvbnRleHRDaGFyYWN0ZXJzJylcblx0XHQpLmpvaW4oJzxocj4nKTtcblx0XHRzZXRQb3B1cFRpcHNBbmRIVE1MKFxuXHRcdFx0aHRtbC5zcGxpdCgnXFxuJykuam9pbignPGJyPicpICtcblx0XHRcdFx0KHRydW5jYXRlZCA/IGA8aHI+PGI+JHtwb3B1cFN0cmluZygnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnKX08L2I+YCA6ICcnKSxcblx0XHRcdCdwb3B1cFByZXZpZXcnLFxuXHRcdFx0bmF2cG9wLmlkTnVtYmVyXG5cdFx0KTtcblx0fTtcblx0Y29uc3QgZGlmZkRhdGVzVGFibGUgPSAobmF2cG9wKSA9PiB7XG5cdFx0bGV0IGh0bWwgPSAnPHRhYmxlIGNsYXNzPVwicG9wdXBfZGlmZl9kYXRlc1wiPic7XG5cdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZVJvdyhuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlzaW9uLCB0cHJpbnRmKCdOZXcgcmV2aXNpb24nKSk7XG5cdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZVJvdyhuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlzaW9uLCB0cHJpbnRmKCdPbGQgcmV2aXNpb24nKSk7XG5cdFx0aHRtbCArPSAnPC90YWJsZT4nO1xuXHRcdHJldHVybiBodG1sO1xuXHR9O1xuXHRjb25zdCBkaWZmRGF0ZXNUYWJsZVJvdyA9IChyZXZpc2lvbiwgbGFiZWwpID0+IHtcblx0XHRsZXQgdHh0ID0gJyc7XG5cdFx0Y29uc3QgbGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKHJldmlzaW9uLnRpbWVzdGFtcCk7XG5cdFx0dHh0ID0gZm9ybWF0dGVkRGF0ZVRpbWUobGFzdE1vZGlmaWVkRGF0ZSk7XG5cdFx0Y29uc3QgcmV2bGluayA9IGdlbmVyYWxMaW5rKHtcblx0XHRcdHVybDogYCR7bXcuY29uZmlnLmdldCgnd2dTY3JpcHQnKX0/b2xkaWQ9JHtyZXZpc2lvbi5yZXZpZH1gLFxuXHRcdFx0dGV4dDogbGFiZWwsXG5cdFx0XHR0aXRsZTogbGFiZWwsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHNpbXBsZVByaW50ZignPHRyPjx0ZD4lczwvdGQ+PHRkPiVzPC90ZD48L3RyPicsIFtyZXZsaW5rLCB0eHRdKTtcblx0fTtcblx0Ly8gRU5ERklMRTogZGlmZnByZXZpZXcuanNcblx0Ly8gU1RBUlRGSUxFOiBsaW5rcy5qc1xuXHQvLyBMSU5LIEdFTkVSQVRJT04gLy9cblx0Ly8gdGl0bGVkRGlmZkxpbmsgLS0+IHRpdGxlZFdpa2lMaW5rIC0tPiBnZW5lcmFsTGlua1xuXHQvLyB3aWtpTGlua1x0ICAgLS0+IHRpdGxlZFdpa2lMaW5rIC0tPiBnZW5lcmFsTGlua1xuXHQvLyBlZGl0Q291bnRlckxpbmsgLS0+IGdlbmVyYWxMaW5rXG5cdC8vIFRPRE8gTWFrZSB0aGVzZSBmdW5jdGlvbnMgcmV0dXJuIEVsZW1lbnQgb2JqZWN0cywgbm90IGp1c3QgcmF3IEhUTUwgc3RyaW5ncy5cblx0Y29uc3QgdGl0bGVkRGlmZkxpbmsgPSAobCkgPT4ge1xuXHRcdHJldHVybiB0aXRsZWRXaWtpTGluayh7XG5cdFx0XHRhcnRpY2xlOiBsLmFydGljbGUsXG5cdFx0XHRhY3Rpb246IGAke2wudG99Jm9sZGlkPSR7bC5mcm9tfWAsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0bm9Qb3B1cDogbC5ub1BvcHVwLFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0dGl0bGU6IGwudGl0bGUsXG5cdFx0XHQvKiBoYWNrOiBubyBvbGRpZCBoZXJlICovXG5cdFx0XHRhY3Rpb25OYW1lOiAnZGlmZicsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHdpa2lMaW5rID0gKGwpID0+IHtcblx0XHQvLyB7YXJ0aWNsZTphcnRpY2xlLCBhY3Rpb246YWN0aW9uLCB0ZXh0OnRleHQsIG9sZGlkLCBuZXdpZH0pIHtcblx0XHRpZiAoISh0eXBlb2YgbC5hcnRpY2xlID09PSB0eXBlb2Yge30gJiYgdHlwZW9mIGwuYWN0aW9uID09PSB0eXBlb2YgJycgJiYgdHlwZW9mIGwudGV4dCA9PT0gdHlwZW9mICcnKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGlmIChsLm9sZGlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGwub2xkaWQgPSBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBzYXZlZE9sZGlkID0gbC5vbGRpZDtcblx0XHRpZiAoIS9eKGVkaXR8dmlld3xyZXZlcnR8cmVuZGVyKSR8XnJhdy8udGVzdChsLmFjdGlvbikpIHtcblx0XHRcdGwub2xkaWQgPSBudWxsO1xuXHRcdH1cblx0XHRsZXQgaGludCA9IHBvcHVwU3RyaW5nKGAke2wuYWN0aW9ufUhpbnRgKTsgLy8gcmV2ZXJ0SGludCBldGMgZXRjIGV0Y1xuXHRcdGNvbnN0IG9sZGlkRGF0YSA9IFtsLm9sZGlkLCBzYWZlRGVjb2RlVVJJKGwuYXJ0aWNsZSldO1xuXHRcdGxldCByZXZpc2lvblN0cmluZyA9IHRwcmludGYoJ3JldmlzaW9uICVzIG9mICVzJywgb2xkaWREYXRhKTtcblx0XHRsb2coYHJldmlzaW9uU3RyaW5nPSR7cmV2aXNpb25TdHJpbmd9YCk7XG5cdFx0c3dpdGNoIChsLmFjdGlvbikge1xuXHRcdFx0Y2FzZSAnZWRpdCZzZWN0aW9uPW5ldyc6XG5cdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygnbmV3U2VjdGlvbkhpbnQnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlZGl0JnVuZG89Jzpcblx0XHRcdFx0aWYgKGwuZGlmZiAmJiBsLmRpZmYgIT09ICdwcmV2JyAmJiBzYXZlZE9sZGlkKSB7XG5cdFx0XHRcdFx0bC5hY3Rpb24gKz0gYCR7bC5kaWZmfSZ1bmRvYWZ0ZXI9JHtzYXZlZE9sZGlkfWA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc2F2ZWRPbGRpZCkge1xuXHRcdFx0XHRcdGwuYWN0aW9uICs9IHNhdmVkT2xkaWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGludCA9IHBvcHVwU3RyaW5nKCd1bmRvSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JhdyZjdHlwZT10ZXh0L2Nzcyc6XG5cdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygncmF3SGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JldmVydCc6IHtcblx0XHRcdFx0Y29uc3QgcCA9IHBhcnNlUGFyYW1zKHBnLmN1cnJlbnQubGluay5ocmVmKTtcblx0XHRcdFx0bC5hY3Rpb24gPSBgZWRpdCZhdXRvY2xpY2s9d3BTYXZlJmFjdG9rZW49JHthdXRvQ2xpY2tUb2tlbigpfSZhdXRvaW1wbD0ke3BvcHVwU3RyaW5nKFxuXHRcdFx0XHRcdCdhdXRvZWRpdF92ZXJzaW9uJ1xuXHRcdFx0XHQpfSZhdXRvc3VtbWFyeT0ke3JldmVydFN1bW1hcnkobC5vbGRpZCwgcC5kaWZmKX1gO1xuXHRcdFx0XHRpZiAocC5kaWZmID09PSAncHJldicpIHtcblx0XHRcdFx0XHRsLmFjdGlvbiArPSAnJmRpcmVjdGlvbj1wcmV2Jztcblx0XHRcdFx0XHRyZXZpc2lvblN0cmluZyA9IHRwcmludGYoJ3RoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyBvZiAlcycsIG9sZGlkRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUmV2ZXJ0U3VtbWFyeVByb21wdCcpKSB7XG5cdFx0XHRcdFx0bC5hY3Rpb24gKz0gJyZhdXRvc3VtbWFyeXByb21wdD10cnVlJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBNaW5vclJldmVydHMnKSkge1xuXHRcdFx0XHRcdGwuYWN0aW9uICs9ICcmYXV0b21pbm9yPXRydWUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxvZyhgcmV2aXNpb25TdHJpbmcgaXMgbm93ICR7cmV2aXNpb25TdHJpbmd9YCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnbnVsbEVkaXQnOlxuXHRcdFx0XHRsLmFjdGlvbiA9IGBlZGl0JmF1dG9jbGljaz13cFNhdmUmYWN0b2tlbj0ke2F1dG9DbGlja1Rva2VuKCl9JmF1dG9pbXBsPSR7cG9wdXBTdHJpbmcoXG5cdFx0XHRcdFx0J2F1dG9lZGl0X3ZlcnNpb24nXG5cdFx0XHRcdCl9JmF1dG9zdW1tYXJ5PW51bGxgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2hpc3RvcnlmZWVkJzpcblx0XHRcdFx0bC5hY3Rpb24gPSAnaGlzdG9yeSZmZWVkPXJzcyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWFya3BhdHJvbGxlZCc6XG5cdFx0XHRcdGwuYWN0aW9uID0gYG1hcmtwYXRyb2xsZWQmcmNpZD0ke2wucmNpZH1gO1xuXHRcdH1cblx0XHRpZiAoaGludCkge1xuXHRcdFx0aGludCA9IGwub2xkaWQgPyBzaW1wbGVQcmludGYoaGludCwgW3JldmlzaW9uU3RyaW5nXSkgOiBzaW1wbGVQcmludGYoaGludCwgW3NhZmVEZWNvZGVVUkkobC5hcnRpY2xlKV0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaW50ID0gc2FmZURlY29kZVVSSShgJHtsLmFydGljbGV9JmFjdGlvbj0ke2wuYWN0aW9ufWApICsgbC5vbGRpZCA/IGAmb2xkaWQ9JHtsLm9sZGlkfWAgOiAnJztcblx0XHR9XG5cdFx0cmV0dXJuIHRpdGxlZFdpa2lMaW5rKHtcblx0XHRcdGFydGljbGU6IGwuYXJ0aWNsZSxcblx0XHRcdGFjdGlvbjogbC5hY3Rpb24sXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0dGl0bGU6IGhpbnQsXG5cdFx0XHRvbGRpZDogbC5vbGRpZCxcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHRcdG9uY2xpY2s6IGwub25jbGljayxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcmV2ZXJ0U3VtbWFyeSA9IChvbGRpZCwgZGlmZikgPT4ge1xuXHRcdGxldCByZXQgPSAnJztcblx0XHRyZXQgPVxuXHRcdFx0ZGlmZiA9PT0gJ3ByZXYnXG5cdFx0XHRcdD8gZ2V0VmFsdWVPZigncG9wdXBRdWVyaWVkUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnknKVxuXHRcdFx0XHQ6IGdldFZhbHVlT2YoJ3BvcHVwUXVlcmllZFJldmVydFN1bW1hcnknKTtcblx0XHRyZXR1cm4gYCR7cmV0fSZhdXRvcnY9JHtvbGRpZH1gO1xuXHR9O1xuXHRjb25zdCB0aXRsZWRXaWtpTGluayA9IChsKSA9PiB7XG5cdFx0Ly8gcG9zc2libGUgcHJvcGVydGllcyBvZiBhcmd1bWVudDpcblx0XHQvLyBhcnRpY2xlLCBhY3Rpb24sIHRleHQsIHRpdGxlLCBvbGRpZCwgYWN0aW9uTmFtZSwgY2xhc3NOYW1lLCBub1BvcHVwXG5cdFx0Ly8gb2xkaWQgPSBudWxsIGlzIGZpbmUgaGVyZVxuXHRcdC8vIGFydGljbGUgYW5kIGFjdGlvbiBhcmUgbWFuZGF0b3J5IGFyZ3Ncblx0XHRpZiAobC5hcnRpY2xlID09PSB1bmRlZmluZWQgfHwgbC5hY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXJybG9nKCdnb3QgdW5kZWZpbmVkIGFydGljbGUgb3IgYWN0aW9uIGluIHRpdGxlZFdpa2lMaW5rJyk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgYmFzZSA9IHBnLndpa2kudGl0bGViYXNlICsgbC5hcnRpY2xlLnVybFN0cmluZygpO1xuXHRcdGxldCB1cmwgPSBiYXNlO1xuXHRcdGlmIChsLmFjdGlvbk5hbWUgPT09IHVuZGVmaW5lZCB8fCAhbC5hY3Rpb25OYW1lKSB7XG5cdFx0XHRsLmFjdGlvbk5hbWUgPSAnYWN0aW9uJztcblx0XHR9XG5cdFx0Ly8gbm8gbmVlZCB0byBhZGQgJmFjdGlvbj12aWV3LCBhbmQgdGhpcyBjb25mdXNlcyBhbmNob3JzXG5cdFx0aWYgKGwuYWN0aW9uICE9PSAndmlldycpIHtcblx0XHRcdHVybCA9IGAke2Jhc2V9JiR7bC5hY3Rpb25OYW1lfT0ke2wuYWN0aW9ufWA7XG5cdFx0fVxuXHRcdGlmIChsLm9sZGlkICE9PSB1bmRlZmluZWQgJiYgbC5vbGRpZCkge1xuXHRcdFx0dXJsICs9IGAmb2xkaWQ9JHtsLm9sZGlkfWA7XG5cdFx0fVxuXHRcdGxldCBjc3NDbGFzcyA9IHBnLm1pc2MuZGVmYXVsdE5hdmxpbmtDbGFzc25hbWU7XG5cdFx0aWYgKGwuY2xhc3NOYW1lICE9PSB1bmRlZmluZWQgJiYgbC5jbGFzc05hbWUpIHtcblx0XHRcdGNzc0NsYXNzID0gbC5jbGFzc05hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmwsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0dGl0bGU6IGwudGl0bGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBsLnRpdGxlLFxuXHRcdFx0dGV4dDogbC50ZXh0ID09PSB1bmRlZmluZWQgPyBudWxsIDogbC50ZXh0LFxuXHRcdFx0Y2xhc3NOYW1lOiBjc3NDbGFzcyxcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHRcdG9uY2xpY2s6IGwub25jbGljayxcblx0XHR9KTtcblx0fTtcblx0cGcuZm4uZ2V0TGFzdENvbnRyaWIgPSAod2lraXBhZ2UsIG5ld1dpbikgPT4ge1xuXHRcdGdldEhpc3RvcnlJbmZvKHdpa2lwYWdlLCAoeCkgPT4ge1xuXHRcdFx0cHJvY2Vzc0xhc3RDb250cmliSW5mbyh4LCB7cGFnZTogd2lraXBhZ2UsIG5ld1dpbn0pO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBwcm9jZXNzTGFzdENvbnRyaWJJbmZvID0gKGluZm8sIHN0dWZmKSA9PiB7XG5cdFx0aWYgKCFpbmZvLmVkaXRzIHx8IGluZm8uZWRpdHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSgnUG9wdXBzOiBhbiBvZGQgdGhpbmcgaGFwcGVuZWQuIFBsZWFzZSByZXRyeS4nLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ2Vycm9yJ30pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIWluZm8uZmlyc3ROZXdFZGl0b3IpIHtcblx0XHRcdHZvaWQgbXcubm90aWZ5KFxuXHRcdFx0XHR0cHJpbnRmKCdPbmx5IGZvdW5kIG9uZSBlZGl0b3I6ICVzIG1hZGUgJXMgZWRpdHMnLCBbaW5mby5lZGl0c1swXS5lZGl0b3IsIGluZm8uZWRpdHMubGVuZ3RoXSksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICdwb3B1cHMnLFxuXHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG5ld1VybCA9IGAke3BnLndpa2kudGl0bGViYXNlICsgbmV3IFRpdGxlKHN0dWZmLnBhZ2UpLnVybFN0cmluZygpfSZkaWZmPWN1ciZvbGRpZD0ke1xuXHRcdFx0aW5mby5maXJzdE5ld0VkaXRvci5vbGRpZFxuXHRcdH1gO1xuXHRcdGRpc3BsYXlVcmwobmV3VXJsLCBzdHVmZi5uZXdXaW4pO1xuXHR9O1xuXHRwZy5mbi5nZXREaWZmU2luY2VNeUVkaXQgPSAod2lraXBhZ2UsIG5ld1dpbikgPT4ge1xuXHRcdGdldEhpc3RvcnlJbmZvKHdpa2lwYWdlLCAoeCkgPT4ge1xuXHRcdFx0cHJvY2Vzc0RpZmZTaW5jZU15RWRpdCh4LCB7cGFnZTogd2lraXBhZ2UsIG5ld1dpbn0pO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBwcm9jZXNzRGlmZlNpbmNlTXlFZGl0ID0gKGluZm8sIHN0dWZmKSA9PiB7XG5cdFx0aWYgKCFpbmZvLmVkaXRzIHx8IGluZm8uZWRpdHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSgnUG9wdXBzOiBzb21ldGhpbmcgZmlzaHkgaGFwcGVuZWQuIFBsZWFzZSB0cnkgYWdhaW4uJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZnJpZW5kbHlOYW1lID0gc3R1ZmYucGFnZS5zcGxpdCgnXycpLmpvaW4oJyAnKTtcblx0XHRpZiAoIWluZm8ubXlMYXN0RWRpdCkge1xuXHRcdFx0dm9pZCBtdy5ub3RpZnkoXG5cdFx0XHRcdHRwcmludGYoXCJDb3VsZG4ndCBmaW5kIGFuIGVkaXQgYnkgJXNcXG5pbiB0aGUgbGFzdCAlcyBlZGl0cyB0b1xcbiVzXCIsIFtcblx0XHRcdFx0XHRpbmZvLnVzZXJOYW1lLFxuXHRcdFx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwSGlzdG9yeUxpbWl0JyksXG5cdFx0XHRcdFx0ZnJpZW5kbHlOYW1lLFxuXHRcdFx0XHRdKSxcblx0XHRcdFx0e3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9XG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoaW5mby5teUxhc3RFZGl0LmluZGV4ID09PSAwKSB7XG5cdFx0XHR2b2lkIG13Lm5vdGlmeSh0cHJpbnRmKCclcyBzZWVtcyB0byBiZSB0aGUgbGFzdCBlZGl0b3IgdG8gdGhlIHBhZ2UgJXMnLCBbaW5mby51c2VyTmFtZSwgZnJpZW5kbHlOYW1lXSksIHtcblx0XHRcdFx0dHlwZTogJ2Vycm9yJyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBuZXdVcmwgPSBgJHtwZy53aWtpLnRpdGxlYmFzZSArIG5ldyBUaXRsZShzdHVmZi5wYWdlKS51cmxTdHJpbmcoKX0mZGlmZj1jdXImb2xkaWQ9JHtcblx0XHRcdGluZm8ubXlMYXN0RWRpdC5vbGRpZFxuXHRcdH1gO1xuXHRcdGRpc3BsYXlVcmwobmV3VXJsLCBzdHVmZi5uZXdXaW4pO1xuXHR9O1xuXHRjb25zdCBkaXNwbGF5VXJsID0gKHVybCwgbmV3V2luKSA9PiB7XG5cdFx0aWYgKG5ld1dpbikge1xuXHRcdFx0d2luZG93Lm9wZW4odXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZG9jdW1lbnQubG9jYXRpb24gPSB1cmw7XG5cdFx0fVxuXHR9O1xuXHRwZy5mbi5wdXJnZVBvcHVwcyA9ICgpID0+IHtcblx0XHRwcm9jZXNzQWxsUG9wdXBzKHRydWUpO1xuXHRcdHNldHVwQ2FjaGUoKTsgLy8gZGVsZXRlcyBhbGwgY2FjaGVkIGl0ZW1zIChub3QgYnJvd3NlciBjYWNoZWQsIHRob3VnaC4uLilcblx0XHRwZy5vcHRpb24gPSB7fTtcblx0XHRhYm9ydEFsbERvd25sb2FkcygpO1xuXHR9O1xuXHRjb25zdCBwcm9jZXNzQWxsUG9wdXBzID0gKG51bGxpZnksIGJhbmlzaCkgPT4ge1xuXHRcdGZvciAobGV0IGkgPSAwOyBwZy5jdXJyZW50LmxpbmtzICYmIGkgPCBwZy5jdXJyZW50LmxpbmtzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAoIXBnLmN1cnJlbnQubGlua3NbaV0ubmF2cG9wdXApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAobnVsbGlmeSB8fCBiYW5pc2gpIHtcblx0XHRcdFx0cGcuY3VycmVudC5saW5rc1tpXS5uYXZwb3B1cC5iYW5pc2goKTtcblx0XHRcdH1cblx0XHRcdHBnLmN1cnJlbnQubGlua3NbaV0uc2ltcGxlTm9Nb3JlID0gZmFsc2U7XG5cdFx0XHRpZiAobnVsbGlmeSkge1xuXHRcdFx0XHRwZy5jdXJyZW50LmxpbmtzW2ldLm5hdnBvcHVwID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdHBnLmZuLmRpc2FibGVQb3B1cHMgPSAoKSA9PiB7XG5cdFx0cHJvY2Vzc0FsbFBvcHVwcyhmYWxzZSwgdHJ1ZSk7XG5cdFx0c2V0dXBUb29sdGlwcyhudWxsLCB0cnVlKTtcblx0fTtcblx0cGcuZm4udG9nZ2xlUHJldmlld3MgPSAoKSA9PiB7XG5cdFx0cHJvY2Vzc0FsbFBvcHVwcyh0cnVlLCB0cnVlKTtcblx0XHRwZy5vcHRpb24uc2ltcGxlUG9wdXBzID0gIXBnLm9wdGlvbi5zaW1wbGVQb3B1cHM7XG5cdFx0YWJvcnRBbGxEb3dubG9hZHMoKTtcblx0fTtcblx0Y29uc3QgbWFnaWNXYXRjaExpbmsgPSBmdW5jdGlvbiBtYWdpY1dhdGNoTGluayhsKSB7XG5cdFx0Ly8gWXVjayEhIFdvdWxkIHJlcXVpcmUgYSB0aG9yb3VnaCByZWRlc2lnbiB0byBhZGQgdGhpcyBhcyBhIGNsaWNrIGV2ZW50IHRob3VnaCAuLi5cblx0XHRsLm9uY2xpY2sgPSBzaW1wbGVQcmludGYoXCJwZy5mbi5tb2RpZnlXYXRjaGxpc3QoJyVzJywnJXMnKTtyZXR1cm4gZmFsc2U7XCIsIFtcblx0XHRcdGwuYXJ0aWNsZS50b1N0cmluZyh0cnVlKS5zcGxpdCgnXFxcXCcpLmpvaW4oJ1xcXFxcXFxcJykuc3BsaXQoXCInXCIpLmpvaW4oXCJcXFxcJ1wiKSxcblx0XHRcdHRoaXMuaWQsXG5cdFx0XSk7XG5cdFx0cmV0dXJuIHdpa2lMaW5rKGwpO1xuXHR9O1xuXHRwZy5mbi5tb2RpZnlXYXRjaGxpc3QgPSBhc3luYyAodGl0bGUsIGFjdGlvbikgPT4ge1xuXHRcdGNvbnN0IHJlcURhdGEgPSB7XG5cdFx0XHRhY3Rpb246ICd3YXRjaCcsXG5cdFx0XHRmb3JtYXR2ZXJzaW9uOiAnMicsXG5cdFx0XHR0aXRsZXM6IHRpdGxlLFxuXHRcdFx0dXNlbGFuZzogbXcuY29uZmlnLmdldCgnd2dVc2VyTGFuZ3VhZ2UnKSxcblx0XHR9O1xuXHRcdGlmIChhY3Rpb24gPT09ICd1bndhdGNoJykge1xuXHRcdFx0cmVxRGF0YS51bndhdGNoID0gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gTG9hZCB0aGUgQWRkZWR3YXRjaHRleHQgb3IgUmVtb3ZlZHdhdGNodGV4dCBtZXNzYWdlIGFuZCBzaG93IGl0XG5cdFx0Y29uc3QgbXdUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRpdGxlKTtcblx0XHRsZXQgbWVzc2FnZU5hbWU7XG5cdFx0aWYgKG13VGl0bGUgJiYgbXdUaXRsZS5nZXROYW1lc3BhY2VJZCgpID4gMCAmJiBtd1RpdGxlLmdldE5hbWVzcGFjZUlkKCkgJSAyID09PSAxKSB7XG5cdFx0XHRtZXNzYWdlTmFtZSA9IGFjdGlvbiA9PT0gJ3dhdGNoJyA/ICdhZGRlZHdhdGNodGV4dC10YWxrJyA6ICdyZW1vdmVkd2F0Y2h0ZXh0LXRhbGsnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZXNzYWdlTmFtZSA9IGFjdGlvbiA9PT0gJ3dhdGNoJyA/ICdhZGRlZHdhdGNodGV4dCcgOiAncmVtb3ZlZHdhdGNodGV4dCc7XG5cdFx0fVxuXHRcdGF3YWl0IGdldE13QXBpKCkucG9zdFdpdGhUb2tlbignd2F0Y2gnLCByZXFEYXRhKTtcblx0XHRhd2FpdCBnZXRNd0FwaSgpLmxvYWRNZXNzYWdlc0lmTWlzc2luZyhbbWVzc2FnZU5hbWVdKTtcblx0XHQvLyBNZXNzYWdlcyB0aGF0IGNhbiBiZSB1c2VkIGhlcmU6XG5cdFx0Ly8gKiBzZWUgc3RyaW5nLmpzXG5cdFx0Ly8gKiBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHRcdHZvaWQgbXcubm90aWZ5KG13Lm1lc3NhZ2UobWVzc2FnZU5hbWUsIHRpdGxlKS5wYXJzZURvbSgpLCB7dGFnOiAncG9wdXBzJ30pO1xuXHR9O1xuXHRjb25zdCBtYWdpY0hpc3RvcnlMaW5rID0gKGwpID0+IHtcblx0XHQvLyBGSVhNRSB1c2Ugb25jbGljayBjaGFuZ2UgaHJlZiB0cmljayB0byBzb3J0IHRoaXMgb3V0IGluc3RlYWQgb2Ygd2luZG93Lm9wZW5cblx0XHRsZXQganNVcmwgPSAnJztcblx0XHRsZXQgdGl0bGUgPSAnJztcblx0XHRsZXQgb25DbGljayA9ICcnO1xuXHRcdHN3aXRjaCAobC5pZCkge1xuXHRcdFx0Y2FzZSAnbGFzdENvbnRyaWInOlxuXHRcdFx0XHRvbkNsaWNrID0gc2ltcGxlUHJpbnRmKFwicGcuZm4uZ2V0TGFzdENvbnRyaWIoJyVzJywlcylcIiwgW1xuXHRcdFx0XHRcdGwuYXJ0aWNsZS50b1N0cmluZyh0cnVlKS5zcGxpdCgnXFxcXCcpLmpvaW4oJ1xcXFxcXFxcJykuc3BsaXQoXCInXCIpLmpvaW4oXCJcXFxcJ1wiKSxcblx0XHRcdFx0XHRsLm5ld1dpbixcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHRpdGxlID0gcG9wdXBTdHJpbmcoJ2xhc3RDb250cmliSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NpbmNlTWUnOlxuXHRcdFx0XHRvbkNsaWNrID0gc2ltcGxlUHJpbnRmKFwicGcuZm4uZ2V0RGlmZlNpbmNlTXlFZGl0KCclcycsJXMpXCIsIFtcblx0XHRcdFx0XHRsLmFydGljbGUudG9TdHJpbmcodHJ1ZSkuc3BsaXQoJ1xcXFwnKS5qb2luKCdcXFxcXFxcXCcpLnNwbGl0KFwiJ1wiKS5qb2luKFwiXFxcXCdcIiksXG5cdFx0XHRcdFx0bC5uZXdXaW4sXG5cdFx0XHRcdF0pO1xuXHRcdFx0XHR0aXRsZSA9IHBvcHVwU3RyaW5nKCdzaW5jZU1lSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0anNVcmwgPSBgamF2YXNjcmlwdDoke29uQ2xpY2t9YDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0b25DbGljayArPSAnO3JldHVybiBmYWxzZTsnO1xuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmw6IGpzVXJsLFxuXHRcdFx0bmV3V2luOiBmYWxzZSxcblx0XHRcdHRpdGxlLFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0bm9Qb3B1cDogbC5ub1BvcHVwLFxuXHRcdFx0b25jbGljazogb25DbGljayxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcG9wdXBNZW51TGluayA9IChsKSA9PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNjcmlwdC11cmxcblx0XHRjb25zdCBqc1VybCA9IHNpbXBsZVByaW50ZignamF2YXNjcmlwdDpwZy5mbi4lcygpJywgW2wuaWRdKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0Y29uc3QgdGl0bGUgPSBwb3B1cFN0cmluZyhzaW1wbGVQcmludGYoJyVzSGludCcsIFtsLmlkXSkpO1xuXHRcdGNvbnN0IG9uQ2xpY2sgPSBzaW1wbGVQcmludGYoJ3BnLmZuLiVzKCk7cmV0dXJuIGZhbHNlOycsIFtsLmlkXSk7XG5cdFx0cmV0dXJuIGdlbmVyYWxOYXZMaW5rKHtcblx0XHRcdHVybDoganNVcmwsXG5cdFx0XHRuZXdXaW46IGZhbHNlLFxuXHRcdFx0dGl0bGUsXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRub1BvcHVwOiBsLm5vUG9wdXAsXG5cdFx0XHRvbmNsaWNrOiBvbkNsaWNrLFxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzcGVjaWFsTGluayA9IChsKSA9PiB7XG5cdFx0Ly8gcHJvcGVydGllczogYXJ0aWNsZSwgc3BlY2lhbHBhZ2UsIHRleHQsIHNlcFxuXHRcdGlmIChsLnNwZWNpYWxwYWdlID09PSB1bmRlZmluZWQgfHwgIWwuc3BlY2lhbHBhZ2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBiYXNlID0gYCR7cGcud2lraS50aXRsZWJhc2UgKyBtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1NwZWNpYWxJZF19OiR7bC5zcGVjaWFscGFnZX1gO1xuXHRcdGlmIChsLnNlcCA9PT0gdW5kZWZpbmVkIHx8IGwuc2VwID09PSBudWxsKSB7XG5cdFx0XHRsLnNlcCA9ICcmdGFyZ2V0PSc7XG5cdFx0fVxuXHRcdGxldCBhcnRpY2xlID0gbC5hcnRpY2xlLnVybFN0cmluZyh7XG5cdFx0XHRrZWVwU3BhY2VzOiBsLnNwZWNpYWxwYWdlID09PSAnU2VhcmNoJyxcblx0XHR9KTtcblx0XHRsZXQgaGludCA9IHBvcHVwU3RyaW5nKGAke2wuc3BlY2lhbHBhZ2V9SGludGApO1xuXHRcdHN3aXRjaCAobC5zcGVjaWFscGFnZSkge1xuXHRcdFx0Y2FzZSAnTG9nJzpcblx0XHRcdFx0c3dpdGNoIChsLnNlcCkge1xuXHRcdFx0XHRcdGNhc2UgJyZ1c2VyPSc6XG5cdFx0XHRcdFx0XHRoaW50ID0gcG9wdXBTdHJpbmcoJ3VzZXJMb2dIaW50Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICcmdHlwZT1ibG9jayZwYWdlPSc6XG5cdFx0XHRcdFx0XHRoaW50ID0gcG9wdXBTdHJpbmcoJ2Jsb2NrTG9nSGludCcpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnJnBhZ2U9Jzpcblx0XHRcdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygncGFnZUxvZ0hpbnQnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJyZ0eXBlPXByb3RlY3QmcGFnZT0nOlxuXHRcdFx0XHRcdFx0aGludCA9IHBvcHVwU3RyaW5nKCdwcm90ZWN0TG9nSGludCcpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnJnR5cGU9ZGVsZXRlJnBhZ2U9Jzpcblx0XHRcdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygnZGVsZXRlTG9nSGludCcpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGxvZyhgVW5rbm93biBsb2cgdHlwZSwgc2VwPSR7bC5zZXB9YCk7XG5cdFx0XHRcdFx0XHRoaW50ID0gJ01pc3NpbmcgaGludCAoRklYTUUpJztcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ1ByZWZpeEluZGV4Jzpcblx0XHRcdFx0YXJ0aWNsZSArPSAnLyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRoaW50ID0gaGludCA/IHNpbXBsZVByaW50ZihoaW50LCBbc2FmZURlY29kZVVSSShsLmFydGljbGUpXSkgOiBzYWZlRGVjb2RlVVJJKGAke2wuc3BlY2lhbHBhZ2V9OiR7bC5hcnRpY2xlfWApO1xuXHRcdGNvbnN0IHVybCA9IGJhc2UgKyBsLnNlcCArIGFydGljbGU7XG5cdFx0cmV0dXJuIGdlbmVyYWxOYXZMaW5rKHtcblx0XHRcdHVybCxcblx0XHRcdHRpdGxlOiBoaW50LFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgZ2VuZXJhbExpbmsgPSAobCkgPT4ge1xuXHRcdC8vIGwudXJsLCBsLnRleHQsIGwudGl0bGUsIGwubmV3V2luLCBsLmNsYXNzTmFtZSwgbC5ub1BvcHVwLCBsLm9uY2xpY2tcblx0XHRpZiAobC51cmwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8vIG9ubHkgcXVvdGF0aW9uIG1hcmtzIGluIHRoZSB1cmwgY2FuIHNjcmV3IHVzIHVwIG5vdy4uLiBJIHRoaW5rXG5cdFx0Y29uc3QgdXJsID0gbC51cmwuc3BsaXQoJ1wiJykuam9pbignJTIyJyk7XG5cdFx0bGV0IHJldCA9IGA8YSBocmVmPVwiJHt1cmx9XCJgO1xuXHRcdGlmIChsLnRpdGxlICE9PSB1bmRlZmluZWQgJiYgbC50aXRsZSkge1xuXHRcdFx0cmV0ICs9IGAgdGl0bGU9XCIke3BnLmVzY2FwZVF1b3Rlc0hUTUwobC50aXRsZSl9XCJgO1xuXHRcdH1cblx0XHRpZiAobC5vbmNsaWNrICE9PSB1bmRlZmluZWQgJiYgbC5vbmNsaWNrKSB7XG5cdFx0XHRyZXQgKz0gYCBvbmNsaWNrPVwiJHtwZy5lc2NhcGVRdW90ZXNIVE1MKGwub25jbGljayl9XCJgO1xuXHRcdH1cblx0XHRpZiAobC5ub1BvcHVwKSB7XG5cdFx0XHRyZXQgKz0gJyBub1BvcHVwPTEnO1xuXHRcdH1cblx0XHRsZXQgbmV3V2luO1xuXHRcdGlmIChsLm5ld1dpbiA9PT0gdW5kZWZpbmVkIHx8IGwubmV3V2luID09PSBudWxsKSB7XG5cdFx0XHRuZXdXaW4gPSBnZXRWYWx1ZU9mKCdwb3B1cE5ld1dpbmRvd3MnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0KHtuZXdXaW59ID0gbCk7XG5cdFx0fVxuXHRcdGlmIChuZXdXaW4pIHtcblx0XHRcdHJldCArPSAnIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCInO1xuXHRcdH1cblx0XHRpZiAobC5jbGFzc05hbWUgIT09IHVuZGVmaW5lZCAmJiBsLmNsYXNzTmFtZSkge1xuXHRcdFx0cmV0ICs9IGAgY2xhc3M9XCIke2wuY2xhc3NOYW1lfVwiYDtcblx0XHR9XG5cdFx0cmV0ICs9ICc+Jztcblx0XHRpZiAodHlwZW9mIGwudGV4dCA9PT0gdHlwZW9mICcnKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIEhUTUwtZXNjYXBlIHRoaXMgdG8gYXZvaWQgWFNTLCBidXQgd2UgYWxzbyB3YW50IHRvXG5cdFx0XHQvLyBkaXNwbGF5IGFueSBleGlzdGluZyBIVE1MIGVudGl0aWVzIGNvcnJlY3RseSwgc28gdW5lc2NhcGUgaXQgZmlyc3QuXG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgdGhlIGRpc3BsYXkgdGV4dCBvZiB0aGUgdXNlciBwYWdlIG1lbnUgaXRlbSBpcyBkZWZpbmVkXG5cdFx0XHQvLyBhcyBcInVzZXImbmJzcDtwYWdlXCIsIHNvIHdlIG5lZWQgdG8gdW5lc2NhcGUgZmlyc3QgdG8gYXZvaWQgaXQgYmVpbmdcblx0XHRcdC8vIGVzY2FwZWQgdG8gXCJ1c2VyJmFtcDtuYnNwO3BhZ2VcIi5cblx0XHRcdHJldCArPSBwZy5lc2NhcGVRdW90ZXNIVE1MKHBnLnVuZXNjYXBlUXVvdGVzSFRNTChsLnRleHQpKTtcblx0XHR9XG5cdFx0cmV0ICs9ICc8L2E+Jztcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBhcHBlbmRQYXJhbXNUb0xpbmsgPSAobGlua3N0ciwgcGFyYW1zKSA9PiB7XG5cdFx0Y29uc3Qgc3AgPSBsaW5rc3RyLnNwbGl0KC8oaHJlZj1cIlteXCJdKz8pXCIvaSk7XG5cdFx0aWYgKHNwLmxlbmd0aCA8IDIpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRsZXQgcmV0ID0gc3Auc2hpZnQoKSArIHNwLnNoaWZ0KCk7XG5cdFx0cmV0ICs9IGAmJHtwYXJhbXN9XCJgO1xuXHRcdHJldCArPSBzcC5qb2luKCcnKTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBjaGFuZ2VMaW5rVGFyZ2V0TGluayA9ICh4KSA9PiB7XG5cdFx0Ly8gbmV3VGFyZ2V0LCB0ZXh0LCBoaW50LCBzdW1tYXJ5LCBjbGlja0J1dHRvbiwgbWlub3IsIHRpdGxlIChvcHRpb25hbCksIGFsc29DaGFuZ2VMYWJlbCB7XG5cdFx0aWYgKHgubmV3VGFyZ2V0KSB7XG5cdFx0XHRsb2coYGNoYW5nZUxpbmtUYXJnZXRMaW5rOiBuZXdUYXJnZXQ9JHt4Lm5ld1RhcmdldH1gKTtcblx0XHR9XG5cdFx0aWYgKHgub2xkVGFyZ2V0ICE9PSBkZWNvZGVVUklDb21wb25lbnQoeC5vbGRUYXJnZXQpKSB7XG5cdFx0XHRsb2coYFRoaXMgbWlnaHQgYmUgYW4gaW5wdXQgcHJvYmxlbTogJHt4Lm9sZFRhcmdldH1gKTtcblx0XHR9XG5cdFx0Ly8gRklYTUU6IGZpcnN0IGNoYXJhY3RlciBvZiBwYWdlIHRpdGxlIGFzIHdlbGwgYXMgbmFtZXNwYWNlIHNob3VsZCBiZSBjYXNlIGluc2Vuc2l0aXZlXG5cdFx0Ly8gZWcgW1s6Y2F0ZWdvcnk6WDFdXSBhbmQgW1s6Q2F0ZWdvcnk6WDFdXSBhcmUgZXF1aXZhbGVudFxuXHRcdC8vIHRoaXMnbGwgYnJlYWsgaWYgY2hhckF0KDApIGlzIG5hc3R5XG5cdFx0Y29uc3QgY0EgPSBtdy51dGlsLmVzY2FwZVJlZ0V4cCh4Lm9sZFRhcmdldCk7XG5cdFx0bGV0IGNocyA9IGNBLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuXHRcdGNocyA9IGBbJHtjaHN9JHtjaHMudG9Mb3dlckNhc2UoKX1dYDtcblx0XHRsZXQgY3VycmVudEFydGljbGVSZWdleEJpdCA9IGNocyArIGNBLnNsaWNlKDEpO1xuXHRcdGN1cnJlbnRBcnRpY2xlUmVnZXhCaXQgPSBjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0XG5cdFx0XHQuc3BsaXQoL1sgX10rfCUyMC9nKVxuXHRcdFx0LmpvaW4oJyg/OltfIF0rfCUyMCknKVxuXHRcdFx0LnNwbGl0KCdcXFxcKCcpXG5cdFx0XHQuam9pbignKD86JTI4fFxcXFwoKScpXG5cdFx0XHQuc3BsaXQoJ1xcXFwpJylcblx0XHRcdC5qb2luKCcoPzolMjl8XFxcXCkpJyk7IC8vIHdoeSBkb2VzIHRoaXMgbmVlZCB0byBtYXRjaCBlbmNvZGVkIHN0cmluZ3MgPyBsaW5rcyBpbiB0aGUgZG9jdW1lbnQgP1xuXG5cdFx0Ly8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2Ugc2hvdWxkIGJlIGlnbm9yZWQsIGFuZCBhbmNob3IgYml0cyBvcHRpb25hbDpcblx0XHRjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0ID0gYFxcXFxzKigke2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9KD86I1teXFxcXFtcXFxcfF0qKT8pXFxcXHMqYDtcblx0XHQvLyBlLmcuIENvbXB1dGVyIChhcmNoYWljKSAtPiBcXHMqKFtDY11vbXB1dGVyW18gXSg/OiUyNTI4fFxcKClhcmNoYWljKD86JTI1Mjh8XFwpKSlcXHMqXG5cdFx0Ly8gYXV0b2VkaXQ9c35cXFtcXFsoW0NjXWFkKVxcXVxcXX5bW0NvbXB1dGVyLWFpZGVkJTIwZGVzaWdufCQxXV1+ZztzflxcW1xcWyhbQ2NdQUQpW3xdfltbQ29tcHV0ZXItYWlkZWQlMjBkZXNpZ258fmdcblx0XHRjb25zdCB0aXRsZSA9IHgudGl0bGUgfHwgbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLnNwbGl0KCdfJykuam9pbignICcpO1xuXHRcdGNvbnN0IGxrID0gdGl0bGVkV2lraUxpbmsoe1xuXHRcdFx0YXJ0aWNsZTogbmV3IFRpdGxlKHRpdGxlKSxcblx0XHRcdG5ld1dpbjogeC5uZXdXaW4sXG5cdFx0XHRhY3Rpb246ICdlZGl0Jyxcblx0XHRcdHRleHQ6IHgudGV4dCxcblx0XHRcdHRpdGxlOiB4LmhpbnQsXG5cdFx0XHRjbGFzc05hbWU6ICdwb3B1cF9jaGFuZ2VfdGl0bGVfbGluaycsXG5cdFx0fSk7XG5cdFx0bGV0IGNtZCA9ICcnO1xuXHRcdGlmICh4Lm5ld1RhcmdldCkge1xuXHRcdFx0Ly8gZXNjYXBlICcmJyBhbmQgb3RoZXIgbmFzdGllc1xuXHRcdFx0Y29uc3QgdCA9IHgubmV3VGFyZ2V0O1xuXHRcdFx0Y29uc3QgcyA9IG13LnV0aWwuZXNjYXBlUmVnRXhwKHgubmV3VGFyZ2V0KTtcblx0XHRcdGlmICh4LmFsc29DaGFuZ2VMYWJlbCkge1xuXHRcdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7Y3VycmVudEFydGljbGVSZWdleEJpdH1cXFxcXVxcXFxdfltbJHt0fV1dfmc7YDtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9W3xdfltbJHt0fXx+ZztgO1xuXHRcdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7c31cXFxcfCR7c31cXFxcXVxcXFxdfltbJHt0fV1dfmdgO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9XFxcXF1cXFxcXX5bWyR7dH18JDFdXX5nO2A7XG5cdFx0XHRcdGNtZCArPSBgc35cXFxcW1xcXFxbJHtjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0fVt8XX5bWyR7dH18fmc7YDtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske3N9XFxcXHwke3N9XFxcXF1cXFxcXX5bWyR7dH1dXX5nYDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9XFxcXF1cXFxcXX4kMX5nO2A7XG5cdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7Y3VycmVudEFydGljbGVSZWdleEJpdH1bfF0oLio/KVxcXFxdXFxcXF1+JDJ+Z2A7XG5cdFx0fVxuXHRcdC8vIEJ1aWxkIHF1ZXJ5XG5cdFx0Y21kID0gYGF1dG9lZGl0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNtZCl9YDtcblx0XHRjbWQgKz0gYCZhdXRvY2xpY2s9JHtlbmNvZGVVUklDb21wb25lbnQoeC5jbGlja0J1dHRvbil9JmFjdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQoYXV0b0NsaWNrVG9rZW4oKSl9YDtcblx0XHRjbWQgKz0geC5taW5vciA9PT0gbnVsbCA/ICcnIDogYCZhdXRvbWlub3I9JHtlbmNvZGVVUklDb21wb25lbnQoeC5taW5vcil9YDtcblx0XHRjbWQgKz0geC53YXRjaCA9PT0gbnVsbCA/ICcnIDogYCZhdXRvd2F0Y2g9JHtlbmNvZGVVUklDb21wb25lbnQoeC53YXRjaCl9YDtcblx0XHRjbWQgKz0gYCZhdXRvc3VtbWFyeT0ke2VuY29kZVVSSUNvbXBvbmVudCh4LnN1bW1hcnkpfWA7XG5cdFx0Y21kICs9IGAmYXV0b2ltcGw9JHtlbmNvZGVVUklDb21wb25lbnQocG9wdXBTdHJpbmcoJ2F1dG9lZGl0X3ZlcnNpb24nKSl9YDtcblx0XHRyZXR1cm4gYXBwZW5kUGFyYW1zVG9MaW5rKGxrLCBjbWQpO1xuXHR9O1xuXHRjb25zdCByZWRpckxpbmsgPSAocmVkaXJNYXRjaCwgYXJ0aWNsZSkgPT4ge1xuXHRcdC8vIE5CIHJlZGlyTWF0Y2ggaXMgaW4gd2lraVRleHRcblx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwQXBwZW5kUmVkaXJOYXZMaW5rcycpICYmIGdldFZhbHVlT2YoJ3BvcHVwTmF2TGlua3MnKSkge1xuXHRcdFx0cmV0ICs9ICc8aHI+Jztcblx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cEZpeFJlZGlycycpICYmIGF1dG9FZGl0ICE9PSB1bmRlZmluZWQgJiYgYXV0b0VkaXQpIHtcblx0XHRcdFx0cmV0ICs9IHBvcHVwU3RyaW5nKCdSZWRpcmVjdHMgdG86IChGaXggJyk7XG5cdFx0XHRcdGxvZyhgcmVkaXJMaW5rOiBuZXdUYXJnZXQ9JHtyZWRpck1hdGNofWApO1xuXHRcdFx0XHRyZXQgKz0gYWRkUG9wdXBTaG9ydGN1dChcblx0XHRcdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdFx0XHRuZXdUYXJnZXQ6IHJlZGlyTWF0Y2gsXG5cdFx0XHRcdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygndGFyZ2V0JyksXG5cdFx0XHRcdFx0XHRoaW50OiBwb3B1cFN0cmluZygnRml4IHRoaXMgcmVkaXJlY3QsIGNoYW5naW5nIGp1c3QgdGhlIGxpbmsgdGFyZ2V0JyksXG5cdFx0XHRcdFx0XHRzdW1tYXJ5OiBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBGaXhSZWRpcnNTdW1tYXJ5JyksIFthcnRpY2xlLnRvU3RyaW5nKCksIHJlZGlyTWF0Y2hdKSxcblx0XHRcdFx0XHRcdG9sZFRhcmdldDogYXJ0aWNsZS50b1N0cmluZygpLFxuXHRcdFx0XHRcdFx0Y2xpY2tCdXR0b246IGdldFZhbHVlT2YoJ3BvcHVwUmVkaXJBdXRvQ2xpY2snKSxcblx0XHRcdFx0XHRcdG1pbm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0d2F0Y2g6IGdldFZhbHVlT2YoJ3BvcHVwV2F0Y2hSZWRpcnJlZFBhZ2VzJyksXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0J1InXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldCArPSBwb3B1cFN0cmluZygnIG9yICcpO1xuXHRcdFx0XHRyZXQgKz0gYWRkUG9wdXBTaG9ydGN1dChcblx0XHRcdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdFx0XHRuZXdUYXJnZXQ6IHJlZGlyTWF0Y2gsXG5cdFx0XHRcdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygndGFyZ2V0ICYgbGFiZWwnKSxcblx0XHRcdFx0XHRcdGhpbnQ6IHBvcHVwU3RyaW5nKCdGaXggdGhpcyByZWRpcmVjdCwgY2hhbmdpbmcgdGhlIGxpbmsgdGFyZ2V0IGFuZCBsYWJlbCcpLFxuXHRcdFx0XHRcdFx0c3VtbWFyeTogc2ltcGxlUHJpbnRmKGdldFZhbHVlT2YoJ3BvcHVwRml4UmVkaXJzU3VtbWFyeScpLCBbYXJ0aWNsZS50b1N0cmluZygpLCByZWRpck1hdGNoXSksXG5cdFx0XHRcdFx0XHRvbGRUYXJnZXQ6IGFydGljbGUudG9TdHJpbmcoKSxcblx0XHRcdFx0XHRcdGNsaWNrQnV0dG9uOiBnZXRWYWx1ZU9mKCdwb3B1cFJlZGlyQXV0b0NsaWNrJyksXG5cdFx0XHRcdFx0XHRtaW5vcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHdhdGNoOiBnZXRWYWx1ZU9mKCdwb3B1cFdhdGNoUmVkaXJyZWRQYWdlcycpLFxuXHRcdFx0XHRcdFx0YWxzb0NoYW5nZUxhYmVsOiB0cnVlLFxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdCdSJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXQgKz0gcG9wdXBTdHJpbmcoJyknKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldCArPSBwb3B1cFN0cmluZygnUmVkaXJlY3RzJykgKyBwb3B1cFN0cmluZygnIHRvICcpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0cmV0dXJuIGA8YnI+ICR7cG9wdXBTdHJpbmcoJ1JlZGlyZWN0cycpfSR7cG9wdXBTdHJpbmcoJyB0byAnKX0ke3RpdGxlZFdpa2lMaW5rKHtcblx0XHRcdGFydGljbGU6IG5ldyBUaXRsZSgpLmZyb21XaWtpVGV4dChyZWRpck1hdGNoKSxcblx0XHRcdGFjdGlvbjogJ3ZpZXcnIC8qIEZJWE1FOiBuZXdXaW4gKi8sXG5cdFx0XHR0ZXh0OiBzYWZlRGVjb2RlVVJJKHJlZGlyTWF0Y2gpLFxuXHRcdFx0dGl0bGU6IHBvcHVwU3RyaW5nKCdCeXBhc3MgcmVkaXJlY3QnKSxcblx0XHR9KX1gO1xuXHR9O1xuXHRjb25zdCBhcmluTGluayA9IChsKSA9PiB7XG5cdFx0aWYgKCFzYW5lTGlua0NoZWNrKGwpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKCFsLmFydGljbGUuaXNJcFVzZXIoKSB8fCAhcGcud2lraS53aWtpbWVkaWEpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCB1TiA9IGwuYXJ0aWNsZS51c2VyTmFtZSgpO1xuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmw6IGBodHRwOi8vd3MuYXJpbi5uZXQvY2dpLWJpbi93aG9pcy5wbD9xdWVyeWlucHV0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVOKX1gLFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdHRpdGxlOiB0cHJpbnRmKCdMb29rIHVwICVzIGluIEFSSU4gd2hvaXMgZGF0YWJhc2UnLCBbdU5dKSxcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5vUG9wdXA6IDEsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHRvb2xEYk5hbWUgPSAoY29va2llU3R5bGUpID0+IHtcblx0XHRsZXQgcmV0ID0gbXcuY29uZmlnLmdldCgnd2dEQm5hbWUnKTtcblx0XHRpZiAoIWNvb2tpZVN0eWxlKSB7XG5cdFx0XHRyZXQgKz0gJ19wJztcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3Qgc2FuZUxpbmtDaGVjayA9IChsKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBsLmFydGljbGUgIT09IHR5cGVvZiB7fSB8fCB0eXBlb2YgbC50ZXh0ICE9PSB0eXBlb2YgJycpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IGVkaXRDb3VudGVyTGluayA9IChsKSA9PiB7XG5cdFx0aWYgKCFzYW5lTGlua0NoZWNrKGwpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKCFwZy53aWtpLndpa2ltZWRpYSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IHVOID0gbC5hcnRpY2xlLnVzZXJOYW1lKCk7XG5cdFx0Y29uc3QgdG9vbCA9IGdldFZhbHVlT2YoJ3BvcHVwRWRpdENvdW50ZXJUb29sJyk7XG5cdFx0bGV0IHVybDtcblx0XHRjb25zdCBkZWZhdWx0VG9vbFVybCA9ICcvL3Rvb2xzLndtZmxhYnMub3JnL3N1cGVyY291bnQvaW5kZXgucGhwP3VzZXI9JDEmcHJvamVjdD0kMi4kMyc7XG5cdFx0c3dpdGNoICh0b29sKSB7XG5cdFx0XHRjYXNlICdjdXN0b20nOlxuXHRcdFx0XHR1cmwgPSBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBFZGl0Q291bnRlclVybCcpLCBbZW5jb2RlVVJJQ29tcG9uZW50KHVOKSwgdG9vbERiTmFtZSgpXSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRjb25zdCB0aGVXaWtpID0gcGcud2lraS5ob3N0bmFtZS5zcGxpdCgnLicpO1xuXHRcdFx0XHR1cmwgPSBzaW1wbGVQcmludGYoZGVmYXVsdFRvb2xVcmwsIFtlbmNvZGVVUklDb21wb25lbnQodU4pLCB0aGVXaWtpWzBdLCB0aGVXaWtpWzFdXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmwsXG5cdFx0XHR0aXRsZTogdHByaW50ZignZWRpdENvdW50ZXJMaW5rSGludCcsIFt1Tl0pLFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5vUG9wdXA6IDEsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IGVkaXRvckxpc3RMaW5rID0gKGwpID0+IHtcblx0XHRpZiAoIXNhbmVMaW5rQ2hlY2sobCkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhcnRpY2xlID0gbC5hcnRpY2xlLmFydGljbGVGcm9tVGFsa1BhZ2UoKSB8fCBsLmFydGljbGU7XG5cdFx0Y29uc3QgdXJsID0gYGh0dHBzOi8veHRvb2xzLndtZmxhYnMub3JnL2FydGljbGVpbmZvLyR7ZW5jb2RlVVJJKFxuXHRcdFx0cGcud2lraS5ob3N0bmFtZVxuXHRcdCl9LyR7YXJ0aWNsZS51cmxTdHJpbmcoKX0/dXNlbGFuZz0ke213LmNvbmZpZy5nZXQoJ3dnVXNlckxhbmd1YWdlJyl9YDtcblx0XHRyZXR1cm4gZ2VuZXJhbE5hdkxpbmsoe1xuXHRcdFx0dXJsLFxuXHRcdFx0dGl0bGU6IHRwcmludGYoJ2VkaXRvckxpc3RIaW50JywgW2FydGljbGVdKSxcblx0XHRcdG5ld1dpbjogbC5uZXdXaW4sXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRub1BvcHVwOiAxLFxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBnZW5lcmFsTmF2TGluayA9IChsKSA9PiB7XG5cdFx0bC5jbGFzc05hbWUgPSBsLmNsYXNzTmFtZSA9PT0gbnVsbCA/ICdwb3B1cE5hdkxpbmsnIDogbC5jbGFzc05hbWU7XG5cdFx0cmV0dXJuIGdlbmVyYWxMaW5rKGwpO1xuXHR9O1xuXHQvLyBtYWdpYyBoaXN0b3J5IGxpbmtzXG5cdC8vXG5cdGNvbnN0IGdldEhpc3RvcnlJbmZvID0gKHdpa2lwYWdlLCB3aGF0TmV4dCkgPT4ge1xuXHRcdGxvZygnZ2V0SGlzdG9yeUluZm8nKTtcblx0XHRnZXRIaXN0b3J5KFxuXHRcdFx0d2lraXBhZ2UsXG5cdFx0XHR3aGF0TmV4dFxuXHRcdFx0XHQ/IChkKSA9PiB7XG5cdFx0XHRcdFx0XHR3aGF0TmV4dChwcm9jZXNzSGlzdG9yeShkKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQ6IHByb2Nlc3NIaXN0b3J5XG5cdFx0KTtcblx0fTtcblx0Ly8gRklYTUUgZWxpbWluYXRlIHBnLmlkTnVtYmVyIC4uLiBob3c/IDotKFxuXHRjb25zdCBnZXRIaXN0b3J5ID0gKHdpa2lwYWdlLCBvbkNvbXBsZXRlKSA9PiB7XG5cdFx0bG9nKCdnZXRIaXN0b3J5Jyk7XG5cdFx0Y29uc3QgdXJsID0gYCR7cGcud2lraS5hcGl3aWtpYmFzZX0/Zm9ybWF0PWpzb24mZm9ybWF0dmVyc2lvbj0yJmFjdGlvbj1xdWVyeSZwcm9wPXJldmlzaW9ucyZ0aXRsZXM9JHtuZXcgVGl0bGUoXG5cdFx0XHR3aWtpcGFnZVxuXHRcdCkudXJsU3RyaW5nKCl9JnJ2bGltaXQ9JHtnZXRWYWx1ZU9mKCdwb3B1cEhpc3RvcnlMaW1pdCcpfWA7XG5cdFx0bG9nKGBnZXRIaXN0b3J5OiB1cmw9JHt1cmx9YCk7XG5cdFx0cmV0dXJuIHN0YXJ0RG93bmxvYWQodXJsLCBgJHtwZy5pZE51bWJlcn1oaXN0b3J5YCwgb25Db21wbGV0ZSk7XG5cdH07XG5cdGNvbnN0IHByb2Nlc3NIaXN0b3J5ID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0Y29uc3QganNvYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qge3JldmlzaW9uc30gPSBhbnlDaGlsZChqc29iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRjb25zdCBlZGl0cyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCByZXZpc2lvbiBvZiByZXZpc2lvbnMpIHtcblx0XHRcdFx0ZWRpdHMucHVzaCh7XG5cdFx0XHRcdFx0b2xkaWQ6IHJldmlzaW9uLnJldmlkLFxuXHRcdFx0XHRcdGVkaXRvcjogcmV2aXNpb24udXNlcixcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRsb2coYHByb2Nlc3NlZCAke2VkaXRzLmxlbmd0aH0gZWRpdHNgKTtcblx0XHRcdHJldHVybiBmaW5pc2hQcm9jZXNzSGlzdG9yeShlZGl0cywgbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGxvZygnU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBKU09OIGJ1c2luZXNzJyk7XG5cdFx0XHRyZXR1cm4gZmluaXNoUHJvY2Vzc0hpc3RvcnkoW10pO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmluaXNoUHJvY2Vzc0hpc3RvcnkgPSAoZWRpdHMsIHVzZXJOYW1lKSA9PiB7XG5cdFx0Y29uc3QgaGlzdEluZm8gPSB7fTtcblx0XHRoaXN0SW5mby5lZGl0cyA9IGVkaXRzO1xuXHRcdGhpc3RJbmZvLnVzZXJOYW1lID0gdXNlck5hbWU7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlZGl0cy5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKGhpc3RJbmZvLm15TGFzdEVkaXQgPT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZSAmJiBlZGl0c1tpXS5lZGl0b3IgPT09IHVzZXJOYW1lKSB7XG5cdFx0XHRcdGhpc3RJbmZvLm15TGFzdEVkaXQgPSB7XG5cdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0b2xkaWQ6IGVkaXRzW2ldLm9sZGlkLFxuXHRcdFx0XHRcdHByZXZpZDogaSA9PT0gMCA/IG51bGwgOiBlZGl0c1tpIC0gMV0ub2xkaWQsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAoaGlzdEluZm8uZmlyc3ROZXdFZGl0b3IgPT09IHVuZGVmaW5lZCAmJiBlZGl0c1tpXS5lZGl0b3IgIT09IGVkaXRzWzBdLmVkaXRvcikge1xuXHRcdFx0XHRoaXN0SW5mby5maXJzdE5ld0VkaXRvciA9IHtcblx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRvbGRpZDogZWRpdHNbaV0ub2xkaWQsXG5cdFx0XHRcdFx0cHJldmlkOiBpID09PSAwID8gbnVsbCA6IGVkaXRzW2kgLSAxXS5vbGRpZCxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGcubWlzYy5oaXN0b3J5SW5mbz1oaXN0SW5mbztcblx0XHRyZXR1cm4gaGlzdEluZm87XG5cdH07XG5cdC8vIEVOREZJTEU6IGxpbmtzLmpzXG5cdC8vIFNUQVJURklMRTogb3B0aW9ucy5qc1xuXHQvLyBvcHRpb25zXG5cdC8vIGNoZWNrIGZvciBleGlzdGluZyB2YWx1ZSwgZWxzZSB1c2UgZGVmYXVsdFxuXHRjb25zdCBkZWZhdWx0aXplID0gKHgpID0+IHtcblx0XHRpZiAocGcub3B0aW9uW3hdID09PSBudWxsIHx8IHBnLm9wdGlvblt4XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwZy5vcHRpb25beF0gPSB3aW5kb3dbeF0gPT09IHVuZGVmaW5lZCA/IHBnLm9wdGlvbkRlZmF1bHRbeF0gOiB3aW5kb3dbeF07XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBuZXdPcHRpb24gPSAoeCwgZGVmKSA9PiB7XG5cdFx0cGcub3B0aW9uRGVmYXVsdFt4XSA9IGRlZjtcblx0fTtcblx0Y29uc3Qgc2V0RGVmYXVsdCA9ICh4LCBkZWYpID0+IHtcblx0XHRyZXR1cm4gbmV3T3B0aW9uKHgsIGRlZik7XG5cdH07XG5cdGNvbnN0IGdldFZhbHVlT2YgPSAodmFyTmFtZSkgPT4ge1xuXHRcdGRlZmF1bHRpemUodmFyTmFtZSk7XG5cdFx0cmV0dXJuIHBnLm9wdGlvblt2YXJOYW1lXTtcblx0fTtcblx0Y29uc3Qgc2V0T3B0aW9ucyA9ICgpID0+IHtcblx0XHQvLyB1c2VyLXNldHRhYmxlIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHRzXG5cdFx0bGV0IHVzZXJJc1N5c29wID0gZmFsc2U7XG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnVXNlckdyb3VwcycpKSB7XG5cdFx0XHRmb3IgKGxldCBnID0gMDsgZyA8IG13LmNvbmZpZy5nZXQoJ3dnVXNlckdyb3VwcycpLmxlbmd0aDsgKytnKSB7XG5cdFx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJHcm91cHMnKVtnXSA9PT0gJ3N5c29wJykge1xuXHRcdFx0XHRcdHVzZXJJc1N5c29wID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dVc2VyR3JvdXBzJylbZ10gPT09ICdzdGV3YXJkJykge1xuXHRcdFx0XHRcdHVzZXJJc1N5c29wID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBCYXNpYyBvcHRpb25zXG5cdFx0bmV3T3B0aW9uKCdwb3B1cERlbGF5JywgMC41KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwSGlkZURlbGF5JywgMC41KTtcblx0XHRuZXdPcHRpb24oJ3NpbXBsZVBvcHVwcycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU3RydWN0dXJlJywgJ3Nob3J0bWVudXMnKTsgLy8gc2VlIGxhdGVyIC0gZGVmYXVsdCBmb3IgcG9wdXBTdHJ1Y3R1cmUgaXMgJ29yaWdpbmFsJyBpZiBzaW1wbGVQb3B1cHMgaXMgdHJ1ZVxuXHRcdG5ld09wdGlvbigncG9wdXBBY3Rpb25zTWVudScsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBTZXR1cE1lbnUnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwQWRtaW5MaW5rcycsIHVzZXJJc1N5c29wKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU2hvcnRjdXRLZXlzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBIaXN0b3JpY2FsTGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwT25seUFydGljbGVMaW5rcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncmVtb3ZlVGl0bGVzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1heFdpZHRoJywgMzUwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU2ltcGxpZnlNYWluTGluaycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBcHBlbmRSZWRpck5hdkxpbmtzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFRvY0xpbmtzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBTdWJwb3B1cHMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRHJhZ0hhbmRsZScsIGZhbHNlIC8qICdwb3B1cFRvcExpbmtzJyAqLyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cExhenlQcmV2aWV3cycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXp5RG93bmxvYWRzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEFsbERhYnNTdHVicycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGVidWdnaW5nJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBY3RpdmVOYXZsaW5rcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBNb2RpZmllcicsIGZhbHNlKTsgLy8gY3RybCwgc2hpZnQsIGFsdCBvciBtZXRhXG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1vZGlmaWVyQWN0aW9uJywgJ2VuYWJsZScpOyAvLyBvciAnZGlzYWJsZSdcblx0XHRuZXdPcHRpb24oJ3BvcHVwRHJhZ2dhYmxlJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmlldycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTG9jYWxlJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEYXRlVGltZUZvcm1hdHRlck9wdGlvbnMnLCB7XG5cdFx0XHR5ZWFyOiAnbnVtZXJpYycsXG5cdFx0XHRtb250aDogJ2xvbmcnLFxuXHRcdFx0ZGF5OiAnbnVtZXJpYycsXG5cdFx0XHRob3VyMTI6IGZhbHNlLFxuXHRcdFx0aG91cjogJzItZGlnaXQnLFxuXHRcdFx0bWludXRlOiAnMi1kaWdpdCcsXG5cdFx0XHRzZWNvbmQ6ICcyLWRpZ2l0Jyxcblx0XHR9KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGF0ZUZvcm1hdHRlck9wdGlvbnMnLCB7XG5cdFx0XHR5ZWFyOiAnbnVtZXJpYycsXG5cdFx0XHRtb250aDogJ2xvbmcnLFxuXHRcdFx0ZGF5OiAnbnVtZXJpYycsXG5cdFx0fSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFRpbWVGb3JtYXR0ZXJPcHRpb25zJywge1xuXHRcdFx0aG91cjEyOiBmYWxzZSxcblx0XHRcdGhvdXI6ICcyLWRpZ2l0Jyxcblx0XHRcdG1pbnV0ZTogJzItZGlnaXQnLFxuXHRcdFx0c2Vjb25kOiAnMi1kaWdpdCcsXG5cdFx0fSk7XG5cdFx0Ly8gaW1hZ2VzXG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbignaW1hZ2VQb3B1cHNGb3JJbWFnZXMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTmV2ZXJHZXRUaHVtYnMnLCBmYWxzZSk7XG5cdFx0Ly8gbmV3T3B0aW9uKCdwb3B1cEltYWdlc1RvZ2dsZVNpemUnLCAgICAgICB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwVGh1bWJBY3Rpb24nLCAnaW1hZ2VwYWdlJyk7IC8vICdzaXpldG9nZ2xlJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlU2l6ZScsIDYwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwSW1hZ2VTaXplTGFyZ2UnLCAyMDApO1xuXHRcdC8vIHJlZGlycywgZGFicywgcmV2ZXJzaW9uXG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeFJlZGlycycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUmVkaXJBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeERhYnMnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cERhYnNBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmVydFN1bW1hcnlQcm9tcHQnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1pbm9yUmV2ZXJ0cycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUmVkbGlua1JlbW92YWwnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJlZGxpbmtBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFdhdGNoRGlzYW1iaWdnZWRQYWdlcycsIG51bGwpO1xuXHRcdG5ld09wdGlvbigncG9wdXBXYXRjaFJlZGlycmVkUGFnZXMnLCBudWxsKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGFiV2lrdGlvbmFyeScsICdsYXN0Jyk7XG5cdFx0Ly8gbmF2bGlua3Ncblx0XHRuZXdPcHRpb24oJ3BvcHVwTmF2TGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTmF2TGlua1NlcGFyYXRvcicsICcgJnNkb3Q7ICcpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXN0RWRpdExpbmsnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRWRpdENvdW50ZXJUb29sJywgJ3N1cGVyY291bnQnKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRWRpdENvdW50ZXJVcmwnLCAnJyk7XG5cdFx0Ly8gcHJldmlld3MgZXRjXG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFN1bW1hcnlEYXRhJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1heFByZXZpZXdTZW50ZW5jZXMnLCA1KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTWF4UHJldmlld0NoYXJhY3RlcnMnLCA2MDApO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXN0TW9kaWZpZWQnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUHJldmlld0tpbGxUZW1wbGF0ZXMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUHJldmlld1Jhd1RlbXBsYXRlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3Rmlyc3RQYXJPbmx5JywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdDdXRIZWFkaW5ncycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3QnV0dG9uJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3QnV0dG9uRXZlbnQnLCAnY2xpY2snKTtcblx0XHQvLyBkaWZmc1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3RGlmZnMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGlmZk1heExpbmVzJywgMTAwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGlmZkNvbnRleHRMaW5lcycsIDIpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEaWZmQ29udGV4dENoYXJhY3RlcnMnLCA0MCk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cERpZmZEYXRlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEaWZmRGF0ZVByaW50ZXInLCAndG9Mb2NhbGVTdHJpbmcnKTsgLy8gbm8gbG9uZ2VyIGluIHVzZVxuXG5cdFx0Ly8gZWRpdCBzdW1tYXJpZXMuIEdvZCwgdGhlc2UgYXJlIHVnbHkuXG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmlld2VkU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSZXZpZXdlZFN1bW1hcnknKSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeERhYnNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cEZpeERhYnNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnknLCBwb3B1cFN0cmluZygnZGVmYXVsdHBvcHVwRXh0ZW5kZWRSZXZlcnRTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZXZlcnRTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFJldmVydFN1bW1hcnknKSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBRdWVyaWVkUmV2ZXJ0U3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBRdWVyaWVkUmV2ZXJ0U3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUXVlcmllZFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRml4UmVkaXJzU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBGaXhSZWRpcnNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZWRsaW5rU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSZWRsaW5rU3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUm1EYWJMaW5rU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSbURhYkxpbmtTdW1tYXJ5JykpO1xuXHRcdC8vIG1pc2Ncblx0XHRuZXdPcHRpb24oJ3BvcHVwSGlzdG9yeUxpbWl0JywgNTApO1xuXHRcdG5ld09wdGlvbigncG9wdXBGaWx0ZXJzJywgW1xuXHRcdFx0cG9wdXBGaWx0ZXJTdHViRGV0ZWN0LFxuXHRcdFx0cG9wdXBGaWx0ZXJEaXNhbWJpZ0RldGVjdCxcblx0XHRcdHBvcHVwRmlsdGVyUGFnZVNpemUsXG5cdFx0XHRwb3B1cEZpbHRlckNvdW50TGlua3MsXG5cdFx0XHRwb3B1cEZpbHRlckNvdW50SW1hZ2VzLFxuXHRcdFx0cG9wdXBGaWx0ZXJDb3VudENhdGVnb3JpZXMsXG5cdFx0XHRwb3B1cEZpbHRlckxhc3RNb2RpZmllZCxcblx0XHRdKTtcblx0XHRuZXdPcHRpb24oJ2V4dHJhUG9wdXBGaWx0ZXJzJywgW10pO1xuXHRcdG5ld09wdGlvbigncG9wdXBPbkVkaXRTZWxlY3Rpb24nLCAnY3Vyc29yJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdIaXN0b3J5JywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlTGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwQ2F0ZWdvcnlNZW1iZXJzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFVzZXJJbmZvJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEhpc3RvcnlQcmV2aWV3TGltaXQnLCAyNSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cENvbnRyaWJzUHJldmlld0xpbWl0JywgMjUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZXZEZWxVcmwnLCAnLy9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2lraXBlZGlhOlJldmlzaW9uX2RlbGV0aW9uJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFNob3dHZW5kZXInLCB0cnVlKTtcblx0XHQvLyBuZXcgd2luZG93c1xuXHRcdG5ld09wdGlvbigncG9wdXBOZXdXaW5kb3dzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMaW5rc05ld1dpbmRvdycsIHtsYXN0Q29udHJpYjogdHJ1ZSwgc2luY2VNZTogdHJ1ZX0pO1xuXHRcdC8vIHJlZ2V4cHNcblx0XHRuZXdPcHRpb24oXG5cdFx0XHQncG9wdXBEYWJSZWdleHAnLFxuXHRcdFx0J1xcXFx7XFxcXHtcXFxccyooZChhYnxpc2FtYihpZyh1YXRpb24pPyk/KXwoKChnZW98aG58cm9hZD98c2Nob29sfG51bWJlcilkaXMpfFsyMzRdW2xjXVthY3ddfChyb2FkfHNoaXApaW5kZXgpKVxcXFxzKihcXFxcfFtefV0qKT9cXFxcfVxcXFx9fGlzIGEgLipkaXNhbWJpZ3VhdGlvbi4qcGFnZSdcblx0XHQpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBbmNob3JSZWdleHAnLCAnYW5jaG9ycz8nKTsgLy8gaG93IHRvIGlkZW50aWZ5IGFuIGFuY2hvcnMgdGVtcGxhdGVcblx0XHRuZXdPcHRpb24oJ3BvcHVwU3R1YlJlZ2V4cCcsICcoc2VjdCk/c3R1Ylt9XVt9XXxUaGlzIC4qLXJlbGF0ZWQgYXJ0aWNsZSBpcyBhIC4qc3R1YicpO1xuXHRcdG5ld09wdGlvbigncG9wdXBJbWFnZVZhcnNSZWdleHAnLCAnaW1hZ2V8aW1hZ2VfKD86ZmlsZXxza3lsaW5lfG5hbWV8ZmxhZ3xzZWFsKXxjb3ZlcnxiYWRnZXxsb2dvJyk7XG5cdH07XG5cdC8vIEVOREZJTEU6IG9wdGlvbnMuanNcblx0Ly8gU1RBUlRGSUxFOiBzdHJpbmdzLmpzXG5cdC8vIFRyYW5zbGF0YWJsZSBzdHJpbmdzXG5cdC8vXG5cdC8vIFNlZSBpbnN0cnVjdGlvbnMgYXRcblx0Ly8ge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwcy9UcmFuc2xhdGlvbn1cblx0cGcuc3RyaW5nID0ge1xuXHRcdC8vIHN1bW1hcnkgZGF0YSwgc2VhcmNoaW5nIGV0Yy5cblx0XHRhcnRpY2xlOiAnYXJ0aWNsZScsXG5cdFx0Y2F0ZWdvcnk6ICdjYXRlZ29yeScsXG5cdFx0Y2F0ZWdvcmllczogJ2NhdGVnb3JpZXMnLFxuXHRcdGltYWdlOiAnaW1hZ2UnLFxuXHRcdGltYWdlczogJ2ltYWdlcycsXG5cdFx0c3R1YjogJ3N0dWInLFxuXHRcdCdzZWN0aW9uIHN0dWInOiAnc2VjdGlvbiBzdHViJyxcblx0XHQnRW1wdHkgcGFnZSc6ICdFbXB0eSBwYWdlJyxcblx0XHRrQjogJ2tCJyxcblx0XHRieXRlczogJ2J5dGVzJyxcblx0XHRkYXk6ICdkYXknLFxuXHRcdGRheXM6ICdkYXlzJyxcblx0XHRob3VyOiAnaG91cicsXG5cdFx0aG91cnM6ICdob3VycycsXG5cdFx0bWludXRlOiAnbWludXRlJyxcblx0XHRtaW51dGVzOiAnbWludXRlcycsXG5cdFx0c2Vjb25kOiAnc2Vjb25kJyxcblx0XHRzZWNvbmRzOiAnc2Vjb25kcycsXG5cdFx0d2VlazogJ3dlZWsnLFxuXHRcdHdlZWtzOiAnd2Vla3MnLFxuXHRcdHNlYXJjaDogJ3NlYXJjaCcsXG5cdFx0U2VhcmNoSGludDogJ0ZpbmQgRW5nbGlzaCBXaWtpcGVkaWEgYXJ0aWNsZXMgY29udGFpbmluZyAlcycsXG5cdFx0d2ViOiAnd2ViJyxcblx0XHRnbG9iYWw6ICdnbG9iYWwnLFxuXHRcdC8vIGFydGljbGUtcmVsYXRlZCBhY3Rpb25zIGFuZCBpbmZvXG5cdFx0Ly8gKHNvbWUgYWN0aW9ucyBhbHNvIGFwcGx5IHRvIHVzZXIgcGFnZXMpXG5cdFx0YWN0aW9uczogJ2FjdGlvbnMnLFxuXHRcdHBvcHVwc01lbnU6ICdwb3B1cHMnLFxuXHRcdHRvZ2dsZVByZXZpZXdzSGludDogJ1RvZ2dsZSBwcmV2aWV3IGdlbmVyYXRpb24gaW4gcG9wdXBzIG9uIHRoaXMgcGFnZScsXG5cdFx0J2VuYWJsZSBwcmV2aWV3cyc6ICdlbmFibGUgcHJldmlld3MnLFxuXHRcdCdkaXNhYmxlIHByZXZpZXdzJzogJ2Rpc2FibGUgcHJldmlld3MnLFxuXHRcdCd0b2dnbGUgcHJldmlld3MnOiAndG9nZ2xlIHByZXZpZXdzJyxcblx0XHQnc2hvdyBwcmV2aWV3JzogJ3Nob3cgcHJldmlldycsXG5cdFx0cmVzZXQ6ICdyZXNldCcsXG5cdFx0J21vcmUuLi4nOiAnbW9yZS4uLicsXG5cdFx0ZGlzYWJsZTogJ2Rpc2FibGUgcG9wdXBzJyxcblx0XHRkaXNhYmxlUG9wdXBzSGludDogJ0Rpc2FibGUgcG9wdXBzIG9uIHRoaXMgcGFnZS4gUmVsb2FkIHBhZ2UgdG8gcmUtZW5hYmxlLicsXG5cdFx0aGlzdG9yeWZlZWRIaW50OiAnUlNTIGZlZWQgb2YgcmVjZW50IGNoYW5nZXMgdG8gdGhpcyBwYWdlJyxcblx0XHRwdXJnZVBvcHVwc0hpbnQ6ICdSZXNldCBwb3B1cHMsIGNsZWFyaW5nIGFsbCBjYWNoZWQgcG9wdXAgZGF0YS4nLFxuXHRcdFBvcHVwc0hpbnQ6ICdSZXNldCBwb3B1cHMsIGNsZWFyaW5nIGFsbCBjYWNoZWQgcG9wdXAgZGF0YS4nLFxuXHRcdHNwYWNlYmFyOiAnc3BhY2UnLFxuXHRcdHZpZXc6ICd2aWV3Jyxcblx0XHQndmlldyBhcnRpY2xlJzogJ3ZpZXcgYXJ0aWNsZScsXG5cdFx0dmlld0hpbnQ6ICdHbyB0byAlcycsXG5cdFx0dGFsazogJ3RhbGsnLFxuXHRcdCd0YWxrIHBhZ2UnOiAndGFsayBwYWdlJyxcblx0XHQndGhpcyZuYnNwO3JldmlzaW9uJzogJ3RoaXMmbmJzcDtyZXZpc2lvbicsXG5cdFx0J3JldmlzaW9uICVzIG9mICVzJzogJ3JldmlzaW9uICVzIG9mICVzJyxcblx0XHQnUmV2aXNpb24gJXMgb2YgJXMnOiAnUmV2aXNpb24gJXMgb2YgJXMnLFxuXHRcdCd0aGUgcmV2aXNpb24gcHJpb3IgdG8gcmV2aXNpb24gJXMgb2YgJXMnOiAndGhlIHJldmlzaW9uIHByaW9yIHRvIHJldmlzaW9uICVzIG9mICVzJyxcblx0XHQnVG9nZ2xlIGltYWdlIHNpemUnOiAnQ2xpY2sgdG8gdG9nZ2xlIGltYWdlIHNpemUnLFxuXHRcdGRlbDogJ2RlbCcsXG5cdFx0ZGVsZXRlOiAnZGVsZXRlJyxcblx0XHRkZWxldGVIaW50OiAnRGVsZXRlICVzJyxcblx0XHR1bmRlbGV0ZVNob3J0OiAndW4nLFxuXHRcdFVuZGVsZXRlSGludDogJ1Nob3cgdGhlIGRlbGV0aW9uIGhpc3RvcnkgZm9yICVzJyxcblx0XHRwcm90ZWN0OiAncHJvdGVjdCcsXG5cdFx0cHJvdGVjdEhpbnQ6ICdSZXN0cmljdCBlZGl0aW5nIHJpZ2h0cyB0byAlcycsXG5cdFx0dW5wcm90ZWN0U2hvcnQ6ICd1bicsXG5cdFx0dW5wcm90ZWN0SGludDogJ0FsbG93ICVzIHRvIGJlIGVkaXRlZCBieSBhbnlvbmUgYWdhaW4nLFxuXHRcdCdzZW5kIHRoYW5rcyc6ICdzZW5kIHRoYW5rcycsXG5cdFx0VGhhbmtzSGludDogJ1NlbmQgYSB0aGFuayB5b3Ugbm90aWZpY2F0aW9uIHRvIHRoaXMgdXNlcicsXG5cdFx0bW92ZTogJ21vdmUnLFxuXHRcdCdtb3ZlIHBhZ2UnOiAnbW92ZSBwYWdlJyxcblx0XHRNb3ZlcGFnZUhpbnQ6ICdDaGFuZ2UgdGhlIHRpdGxlIG9mICVzJyxcblx0XHRlZGl0OiAnZWRpdCcsXG5cdFx0J2VkaXQgYXJ0aWNsZSc6ICdlZGl0IGFydGljbGUnLFxuXHRcdGVkaXRIaW50OiAnQ2hhbmdlIHRoZSBjb250ZW50IG9mICVzJyxcblx0XHQnZWRpdCB0YWxrJzogJ2VkaXQgdGFsaycsXG5cdFx0bmV3OiAnbmV3Jyxcblx0XHQnbmV3IHRvcGljJzogJ25ldyB0b3BpYycsXG5cdFx0bmV3U2VjdGlvbkhpbnQ6ICdTdGFydCBhIG5ldyBzZWN0aW9uIG9uICVzJyxcblx0XHQnbnVsbCBlZGl0JzogJ251bGwgZWRpdCcsXG5cdFx0bnVsbEVkaXRIaW50OiAnU3VibWl0IGFuIGVkaXQgdG8gJXMsIG1ha2luZyBubyBjaGFuZ2VzICcsXG5cdFx0aGlzdDogJ2hpc3QnLFxuXHRcdGhpc3Rvcnk6ICdoaXN0b3J5Jyxcblx0XHRoaXN0b3J5SGludDogJ0xpc3QgdGhlIGNoYW5nZXMgbWFkZSB0byAlcycsXG5cdFx0bGFzdDogJ3ByZXYnLFxuXHRcdGxhc3RFZGl0OiAnbGFzdEVkaXQnLFxuXHRcdCdtYXJrIHBhdHJvbGxlZCc6ICdtYXJrIHBhdHJvbGxlZCcsXG5cdFx0bWFya3BhdHJvbGxlZEhpbnQ6ICdNYXJrIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnLFxuXHRcdCdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnOiAnQ291bGQgbm90IG1hcmtlZCB0aGlzIGVkaXQgYXMgcGF0cm9sbGVkJyxcblx0XHQnc2hvdyBsYXN0IGVkaXQnOiAnbW9zdCByZWNlbnQgZWRpdCcsXG5cdFx0J1Nob3cgdGhlIGxhc3QgZWRpdCc6ICdTaG93IHRoZSBlZmZlY3RzIG9mIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2UnLFxuXHRcdGxhc3RDb250cmliOiAnbGFzdENvbnRyaWInLFxuXHRcdCdsYXN0IHNldCBvZiBlZGl0cyc6ICdsYXRlc3QgZWRpdHMnLFxuXHRcdGxhc3RDb250cmliSGludDogJ1Nob3cgdGhlIG5ldCBlZmZlY3Qgb2YgY2hhbmdlcyBtYWRlIGJ5IHRoZSBsYXN0IGVkaXRvcicsXG5cdFx0Y3VyOiAnY3VyJyxcblx0XHRkaWZmQ3VyOiAnZGlmZkN1cicsXG5cdFx0J1Nob3cgY2hhbmdlcyBzaW5jZSByZXZpc2lvbiAlcyc6ICdTaG93IGNoYW5nZXMgc2luY2UgcmV2aXNpb24gJXMnLFxuXHRcdCclcyBvbGQnOiAnJXMgb2xkJyxcblx0XHRvbGRFZGl0OiAnb2xkRWRpdCcsXG5cdFx0cHVyZ2U6ICdwdXJnZScsXG5cdFx0cHVyZ2VIaW50OiAnRGVtYW5kIGEgZnJlc2ggY29weSBvZiAlcycsXG5cdFx0cmF3OiAnc291cmNlJyxcblx0XHRyYXdIaW50OiAnRG93bmxvYWQgdGhlIHNvdXJjZSBvZiAlcycsXG5cdFx0cmVuZGVyOiAnc2ltcGxlJyxcblx0XHRyZW5kZXJIaW50OiAnU2hvdyBhIHBsYWluIEhUTUwgdmVyc2lvbiBvZiAlcycsXG5cdFx0J1Nob3cgdGhlIGVkaXQgbWFkZSB0byBnZXQgcmV2aXNpb24nOiAnU2hvdyB0aGUgZWRpdCBtYWRlIHRvIGdldCByZXZpc2lvbicsXG5cdFx0c2luY2VNZTogJ3NpbmNlTWUnLFxuXHRcdCdjaGFuZ2VzIHNpbmNlIG1pbmUnOiAnZGlmZiBteSBlZGl0Jyxcblx0XHRzaW5jZU1lSGludDogJ1Nob3cgY2hhbmdlcyBzaW5jZSBteSBsYXN0IGVkaXQnLFxuXHRcdFwiQ291bGRuJ3QgZmluZCBhbiBlZGl0IGJ5ICVzXFxuaW4gdGhlIGxhc3QgJXMgZWRpdHMgdG9cXG4lc1wiOlxuXHRcdFx0XCJDb3VsZG4ndCBmaW5kIGFuIGVkaXQgYnkgJXNcXG5pbiB0aGUgbGFzdCAlcyBlZGl0cyB0b1xcbiVzXCIsXG5cdFx0ZWRzOiAnZWRzJyxcblx0XHRlZGl0b3JzOiAnZWRpdG9ycycsXG5cdFx0ZWRpdG9yTGlzdEhpbnQ6ICdMaXN0IHRoZSB1c2VycyB3aG8gaGF2ZSBlZGl0ZWQgJXMnLFxuXHRcdHJlbGF0ZWQ6ICdyZWxhdGVkJyxcblx0XHRyZWxhdGVkQ2hhbmdlczogJ3JlbGF0ZWRDaGFuZ2VzJyxcblx0XHQncmVsYXRlZCBjaGFuZ2VzJzogJ3JlbGF0ZWQgY2hhbmdlcycsXG5cdFx0UmVjZW50Y2hhbmdlc2xpbmtlZEhpbnQ6ICdTaG93IGNoYW5nZXMgaW4gYXJ0aWNsZXMgcmVsYXRlZCB0byAlcycsXG5cdFx0ZWRpdE9sZDogJ2VkaXRPbGQnLFxuXHRcdHJ2OiAncnYnLFxuXHRcdHJldmVydDogJ3JldmVydCcsXG5cdFx0cmV2ZXJ0SGludDogJ1JldmVydCB0byAlcycsXG5cdFx0ZGVmYXVsdHBvcHVwUmV2aWV3ZWRTdW1tYXJ5OlxuXHRcdFx0J0FjY2VwdGVkIGJ5IHJldmlld2luZyB0aGUgW1tTcGVjaWFsOmRpZmYvJXMvJXN8ZGlmZmVyZW5jZV1dIGJldHdlZW4gdGhpcyB2ZXJzaW9uIGFuZCBwcmV2aW91c2x5IGFjY2VwdGVkIHZlcnNpb24gdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwUmVkbGlua1N1bW1hcnk6XG5cdFx0XHQnUmVtb3ZpbmcgbGluayB0byBlbXB0eSBwYWdlIFtbJXNdXSB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBGaXhEYWJzU3VtbWFyeTpcblx0XHRcdCdEaXNhbWJpZ3VhdGUgW1slc11dIHRvIFtbJXNdXSB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBGaXhSZWRpcnNTdW1tYXJ5OlxuXHRcdFx0J1JlZGlyZWN0IGJ5cGFzcyBmcm9tIFtbJXNdXSB0byBbWyVzXV0gdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwRXh0ZW5kZWRSZXZlcnRTdW1tYXJ5OlxuXHRcdFx0J1JldmVydCB0byByZXZpc2lvbiBkYXRlZCAlcyBieSAlcywgb2xkaWQgJXMgdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnk6XG5cdFx0XHQnUmV2ZXJ0IHRvIHRoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBSZXZlcnRTdW1tYXJ5OiAnUmV2ZXJ0IHRvIHJldmlzaW9uICVzIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeTpcblx0XHRcdCdSZXZlcnQgdG8gdGhlIHJldmlzaW9uIHByaW9yIHRvIHJldmlzaW9uICQxIGRhdGVkICQyIGJ5ICQzIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRTdW1tYXJ5OlxuXHRcdFx0J1JldmVydCB0byByZXZpc2lvbiAkMSBkYXRlZCAkMiBieSAkMyB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBSbURhYkxpbmtTdW1tYXJ5OlxuXHRcdFx0J1JlbW92ZSBsaW5rIHRvIGRhYiBwYWdlIFtbJXNdXSB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRSZWRpcmVjdHM6ICdSZWRpcmVjdHMnLFxuXHRcdCcgdG8gJzogJyB0byAnLFxuXHRcdCdCeXBhc3MgcmVkaXJlY3QnOiAnQnlwYXNzIHJlZGlyZWN0Jyxcblx0XHQnRml4IHRoaXMgcmVkaXJlY3QnOiAnRml4IHRoaXMgcmVkaXJlY3QnLFxuXHRcdGRpc2FtYmlnOiAnZGlzYW1iaWcnLFxuXHRcdGRpc2FtYmlnSGludDogJ0Rpc2FtYmlndWF0ZSB0aGlzIGxpbmsgdG8gW1slc11dJyxcblx0XHQnQ2xpY2sgdG8gZGlzYW1iaWd1YXRlIHRoaXMgbGluayB0bzonOiAnQ2xpY2sgdG8gZGlzYW1iaWd1YXRlIHRoaXMgbGluayB0bzonLFxuXHRcdCdyZW1vdmUgdGhpcyBsaW5rJzogJ3JlbW92ZSB0aGlzIGxpbmsnLFxuXHRcdCdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZSc6ICdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZScsXG5cdFx0J3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBkaXNhbWJpZyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJzpcblx0XHRcdCdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgZGlzYW1iaWcgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZScsXG5cdFx0bWFpbmxpbms6ICdtYWlubGluaycsXG5cdFx0d2lraUxpbms6ICd3aWtpTGluaycsXG5cdFx0d2lraUxpbmtzOiAnd2lraUxpbmtzJyxcblx0XHQnbGlua3MgaGVyZSc6ICdsaW5rcyBoZXJlJyxcblx0XHR3aGF0TGlua3NIZXJlOiAnd2hhdExpbmtzSGVyZScsXG5cdFx0J3doYXQgbGlua3MgaGVyZSc6ICd3aGF0IGxpbmtzIGhlcmUnLFxuXHRcdFdoYXRsaW5rc2hlcmVIaW50OiAnTGlzdCB0aGUgcGFnZXMgdGhhdCBhcmUgaHlwZXJsaW5rZWQgdG8gJXMnLFxuXHRcdHVud2F0Y2hTaG9ydDogJ3VuJyxcblx0XHR3YXRjaFRoaW5neTogJ3dhdGNoJyxcblx0XHR3YXRjaEhpbnQ6ICdBZGQgJXMgdG8gbXkgd2F0Y2hsaXN0Jyxcblx0XHR1bndhdGNoSGludDogJ1JlbW92ZSAlcyBmcm9tIG15IHdhdGNobGlzdCcsXG5cdFx0J09ubHkgZm91bmQgb25lIGVkaXRvcjogJXMgbWFkZSAlcyBlZGl0cyc6ICdPbmx5IGZvdW5kIG9uZSBlZGl0b3I6ICVzIG1hZGUgJXMgZWRpdHMnLFxuXHRcdCclcyBzZWVtcyB0byBiZSB0aGUgbGFzdCBlZGl0b3IgdG8gdGhlIHBhZ2UgJXMnOiAnJXMgc2VlbXMgdG8gYmUgdGhlIGxhc3QgZWRpdG9yIHRvIHRoZSBwYWdlICVzJyxcblx0XHRyc3M6ICdyc3MnLFxuXHRcdC8vIGRpZmYgcHJldmlld3Ncblx0XHQnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnOiAnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnLFxuXHRcdCdPbGQgcmV2aXNpb24nOiAnT2xkIHJldmlzaW9uJyxcblx0XHQnTmV3IHJldmlzaW9uJzogJ05ldyByZXZpc2lvbicsXG5cdFx0J1NvbWV0aGluZyB3ZW50IHdyb25nIDotKCc6ICdTb21ldGhpbmcgd2VudCB3cm9uZyA6LSgnLFxuXHRcdCdFbXB0eSByZXZpc2lvbiwgbWF5YmUgbm9uLWV4aXN0ZW50JzogJ0VtcHR5IHJldmlzaW9uLCBtYXliZSBub24tZXhpc3RlbnQnLFxuXHRcdCdVbmtub3duIGRhdGUnOiAnVW5rbm93biBkYXRlJyxcblx0XHQvLyBvdGhlciBzcGVjaWFsIHByZXZpZXdzXG5cdFx0J0VtcHR5IGNhdGVnb3J5JzogJ0VtcHR5IGNhdGVnb3J5Jyxcblx0XHQnQ2F0ZWdvcnkgbWVtYmVycyAoJXMgc2hvd24pJzogJ0NhdGVnb3J5IG1lbWJlcnMgKCVzIHNob3duKScsXG5cdFx0J05vIGltYWdlIGxpbmtzIGZvdW5kJzogJ05vIGltYWdlIGxpbmtzIGZvdW5kJyxcblx0XHQnRmlsZSBsaW5rcyc6ICdGaWxlIGxpbmtzJyxcblx0XHQnTm8gaW1hZ2UgZm91bmQnOiAnTm8gaW1hZ2UgZm91bmQnLFxuXHRcdCdJbWFnZSBmcm9tIENvbW1vbnMnOiAnSW1hZ2UgZnJvbSBDb21tb25zJyxcblx0XHQnRGVzY3JpcHRpb24gcGFnZSc6ICdEZXNjcmlwdGlvbiBwYWdlJyxcblx0XHQnQWx0IHRleHQ6JzogJ0FsdCB0ZXh0OicsXG5cdFx0cmV2ZGVsOiAnSGlkZGVuIHJldmlzaW9uJyxcblx0XHQvLyB1c2VyLXJlbGF0ZWQgYWN0aW9ucyBhbmQgaW5mb1xuXHRcdHVzZXI6ICd1c2VyJyxcblx0XHQndXNlciZuYnNwO3BhZ2UnOiAndXNlciZuYnNwO3BhZ2UnLFxuXHRcdCd1c2VyIHRhbGsnOiAndXNlciB0YWxrJyxcblx0XHQnZWRpdCB1c2VyIHRhbGsnOiAnZWRpdCB1c2VyIHRhbGsnLFxuXHRcdCdsZWF2ZSBjb21tZW50JzogJ2xlYXZlIGNvbW1lbnQnLFxuXHRcdGVtYWlsOiAnZW1haWwnLFxuXHRcdCdlbWFpbCB1c2VyJzogJ2VtYWlsIHVzZXInLFxuXHRcdEVtYWlsdXNlckhpbnQ6ICdTZW5kIGFuIGVtYWlsIHRvICVzJyxcblx0XHRzcGFjZTogJ3NwYWNlJyxcblx0XHRQcmVmaXhJbmRleEhpbnQ6ICdTaG93IHBhZ2VzIGluIHRoZSB1c2Vyc3BhY2Ugb2YgJXMnLFxuXHRcdGNvdW50OiAnY291bnQnLFxuXHRcdCdlZGl0IGNvdW50ZXInOiAnZWRpdCBjb3VudGVyJyxcblx0XHRlZGl0Q291bnRlckxpbmtIaW50OiAnQ291bnQgdGhlIGNvbnRyaWJ1dGlvbnMgbWFkZSBieSAlcycsXG5cdFx0Y29udHJpYnM6ICdjb250cmlicycsXG5cdFx0Y29udHJpYnV0aW9uczogJ2NvbnRyaWJ1dGlvbnMnLFxuXHRcdGRlbGV0ZWRDb250cmliczogJ2RlbGV0ZWQgY29udHJpYnV0aW9ucycsXG5cdFx0RGVsZXRlZGNvbnRyaWJ1dGlvbnNIaW50OiAnTGlzdCBkZWxldGVkIGVkaXRzIG1hZGUgYnkgJXMnLFxuXHRcdENvbnRyaWJ1dGlvbnNIaW50OiAnTGlzdCB0aGUgY29udHJpYnV0aW9ucyBtYWRlIGJ5ICVzJyxcblx0XHRsb2c6ICdsb2cnLFxuXHRcdCd1c2VyIGxvZyc6ICd1c2VyIGxvZycsXG5cdFx0dXNlckxvZ0hpbnQ6IFwiU2hvdyAlcydzIHVzZXIgbG9nXCIsXG5cdFx0YXJpbjogJ0FSSU4gbG9va3VwJyxcblx0XHQnTG9vayB1cCAlcyBpbiBBUklOIHdob2lzIGRhdGFiYXNlJzogJ0xvb2sgdXAgJXMgaW4gdGhlIEFSSU4gd2hvaXMgZGF0YWJhc2UnLFxuXHRcdHVuYmxvY2tTaG9ydDogJ3VuJyxcblx0XHRibG9jazogJ2Jsb2NrJyxcblx0XHQnYmxvY2sgdXNlcic6ICdibG9jayB1c2VyJyxcblx0XHRJcGJsb2NrbGlzdEhpbnQ6ICdVbmJsb2NrICVzJyxcblx0XHRCbG9ja2lwSGludDogJ1ByZXZlbnQgJXMgZnJvbSBlZGl0aW5nJyxcblx0XHQnYmxvY2sgbG9nJzogJ2Jsb2NrIGxvZycsXG5cdFx0YmxvY2tMb2dIaW50OiAnU2hvdyB0aGUgYmxvY2sgbG9nIGZvciAlcycsXG5cdFx0cHJvdGVjdExvZ0hpbnQ6ICdTaG93IHRoZSBwcm90ZWN0aW9uIGxvZyBmb3IgJXMnLFxuXHRcdHBhZ2VMb2dIaW50OiAnU2hvdyB0aGUgcGFnZSBsb2cgZm9yICVzJyxcblx0XHRkZWxldGVMb2dIaW50OiAnU2hvdyB0aGUgZGVsZXRpb24gbG9nIGZvciAlcycsXG5cdFx0J0ludmFsaWQgJXMgJXMnOiAnVGhlIG9wdGlvbiAlcyBpcyBpbnZhbGlkOiAlcycsXG5cdFx0J05vIGJhY2tsaW5rcyBmb3VuZCc6ICdObyBiYWNrbGlua3MgZm91bmQnLFxuXHRcdCcgYW5kIG1vcmUnOiAnIGFuZCBtb3JlJyxcblx0XHR1bmRvOiAndW5kbycsXG5cdFx0dW5kb0hpbnQ6ICd1bmRvIHRoaXMgZWRpdCcsXG5cdFx0J0Rvd25sb2FkIHByZXZpZXcgZGF0YSc6ICdEb3dubG9hZCBwcmV2aWV3IGRhdGEnLFxuXHRcdCdJbnZhbGlkIG9yIElQIHVzZXInOiAnSW52YWxpZCBvciBJUCB1c2VyJyxcblx0XHQnTm90IGEgcmVnaXN0ZXJlZCB1c2VybmFtZSc6ICdOb3QgYSByZWdpc3RlcmVkIHVzZXJuYW1lJyxcblx0XHRCTE9DS0VEOiAnQkxPQ0tFRCcsXG5cdFx0J0hhcyBibG9ja3MnOiAnSGFzIGJsb2NrcycsXG5cdFx0JyBlZGl0cyBzaW5jZTogJzogJyBlZGl0cyBzaW5jZTogJyxcblx0XHQnbGFzdCBlZGl0IG9uICc6ICdsYXN0IGVkaXQgb24gJyxcblx0XHQnaGUvaGltJzogJ2hlL2hpbScsXG5cdFx0J3NoZS9oZXInOiAnc2hlL2hlcicsXG5cdFx0Ly8gQXV0b2VkaXRpbmdcblx0XHQnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCc6XG5cdFx0XHQnRW50ZXIgYSBub24tZW1wdHkgZWRpdCBzdW1tYXJ5IG9yIHByZXNzIGNhbmNlbCB0byBhYm9ydCcsXG5cdFx0J0ZhaWxlZCB0byBnZXQgcmV2aXNpb24gaW5mb3JtYXRpb24sIHBsZWFzZSBlZGl0IG1hbnVhbGx5Llxcblxcbic6XG5cdFx0XHQnRmFpbGVkIHRvIGdldCByZXZpc2lvbiBpbmZvcm1hdGlvbiwgcGxlYXNlIGVkaXQgbWFudWFsbHkuXFxuXFxuJyxcblx0XHQnVGhlICVzIGJ1dHRvbiBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGNsaWNrZWQuIFBsZWFzZSB3YWl0IGZvciB0aGUgbmV4dCBwYWdlIHRvIGxvYWQuJzpcblx0XHRcdCdUaGUgJXMgYnV0dG9uIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xpY2tlZC4gUGxlYXNlIHdhaXQgZm9yIHRoZSBuZXh0IHBhZ2UgdG8gbG9hZC4nLFxuXHRcdCdDb3VsZCBub3QgZmluZCBidXR0b24gJXMuIFBsZWFzZSBjaGVjayB0aGUgc2V0dGluZ3MgaW4geW91ciBqYXZhc2NyaXB0IGZpbGUuJzpcblx0XHRcdCdDb3VsZCBub3QgZmluZCBidXR0b24gJXMuIFBsZWFzZSBjaGVjayB0aGUgc2V0dGluZ3MgaW4geW91ciBqYXZhc2NyaXB0IGZpbGUuJyxcblx0XHQvLyBQb3B1cHMgc2V0dXBcblx0XHQnT3BlbiBmdWxsLXNpemUgaW1hZ2UnOiAnT3BlbiBmdWxsLXNpemUgaW1hZ2UnLFxuXHRcdGF1dG9lZGl0X3ZlcnNpb246ICducDIwMTQwNDE2Jyxcblx0fTtcblx0Y29uc3QgcG9wdXBTdHJpbmcgPSAoc3RyKSA9PiB7XG5cdFx0aWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlICYmIG1lc3NhZ2Vbc3RyXSkge1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2Vbc3RyXTtcblx0XHR9XG5cdFx0aWYgKHBnLnN0cmluZ1tzdHJdKSB7XG5cdFx0XHRyZXR1cm4gcGcuc3RyaW5nW3N0cl07XG5cdFx0fVxuXHRcdHJldHVybiBzdHI7XG5cdH07XG5cdGNvbnN0IHRwcmludGYgPSAoc3RyLCBzdWJzKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBzdWJzICE9PSB0eXBlb2YgW10pIHtcblx0XHRcdHN1YnMgPSBbc3Vic107XG5cdFx0fVxuXHRcdHJldHVybiBzaW1wbGVQcmludGYocG9wdXBTdHJpbmcoc3RyKSwgc3Vicyk7XG5cdH07XG5cdC8vIEVOREZJTEU6IHN0cmluZ3MuanNcblx0Ly8gU1RBUlRGSUxFOiBydW4uanNcblx0Ly8gUnVuIHRoaW5nc1xuXHQvLyBGb3Igc29tZSByZWFzb24gcG9wdXBzIHJlcXVpcmVzIGEgZnVsbHkgbG9hZGVkIHBhZ2UgalF1ZXJ5LnJlYWR5KC4uLikgY2F1c2VzIHByb2JsZW1zIGZvciBzb21lLlxuXHQvLyBUaGUgb2xkIGFkZE9ubG9hZEhvb2sgZGlkIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBiZWxvd1xuXHRpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuXHRcdGF1dG9FZGl0KCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gd2lsbCBzZXR1cCBwb3B1cHNcblx0XHQkKHdpbmRvdykub24oJ2xvYWQnLCBhdXRvRWRpdCk7XG5cdH1cblx0Ly8gU3VwcG9ydCBmb3IgTWVkaWFXaWtpJ3MgbGl2ZSBwcmV2aWV3LCBWaXN1YWxFZGl0b3IncyBzYXZlcyBhbmQgRWNobydzIGZseW91dC5cblx0KCgpID0+IHtcblx0XHRsZXQgb25jZSA9IHRydWU7XG5cdFx0Y29uc3QgZHluYW1pY0NvbnRlbnRIYW5kbGVyID0gKCRjb250ZW50KSA9PiB7XG5cdFx0XHQvLyBUcnkgdG8gZGV0ZWN0IHRoZSBob29rIGZpcmVkIG9uIGluaXRpYWwgcGFnZSBsb2FkIGFuZCBkaXNyZWdhcmRcblx0XHRcdC8vIGl0LCB3ZSBhbHJlYWR5IGhvb2sgdG8gb25sb2FkIChwb3NzaWJseSB0byBkaWZmZXJlbnQgcGFydHMgb2Zcblx0XHRcdC8vIHBhZ2UgLSBpdCdzIGNvbmZpZ3VyYWJsZSkgYW5kIHJ1bm5pbmcgdHdpY2UgbWlnaHQgYmUgYmFkLiBVZ2x5Li4uXG5cdFx0XHRpZiAoJGNvbnRlbnQuYXR0cignaWQnKSA9PT0gJ213LWNvbnRlbnQtdGV4dCcgJiYgb25jZSkge1xuXHRcdFx0XHRvbmNlID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlZ2lzdGVySG9va3NGb3JWaXNpYmxlTmF2cG9wcyA9ICgpID0+IHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IHBnLmN1cnJlbnQubGlua3MgJiYgaSA8IHBnLmN1cnJlbnQubGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCBuYXZwb3AgPSBwZy5jdXJyZW50LmxpbmtzW2ldLm5hdnBvcHVwO1xuXHRcdFx0XHRcdGlmICghbmF2cG9wIHx8ICFuYXZwb3AuaXNWaXNpYmxlKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHROYXZwb3B1cC50cmFja2VyLmFkZEhvb2socG9zQ2hlY2tlckhvb2sobmF2cG9wKSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBkb0l0ID0gKCkgPT4ge1xuXHRcdFx0XHRyZWdpc3Rlckhvb2tzRm9yVmlzaWJsZU5hdnBvcHMoKTtcblx0XHRcdFx0JGNvbnRlbnQuZWFjaCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0ZWxlbWVudC5yYW5TZXR1cFRvb2x0aXBzQWxyZWFkeSA9IGZhbHNlO1xuXHRcdFx0XHRcdHNldHVwVG9vbHRpcHMoZWxlbWVudCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHRcdHNldHVwUG9wdXBzKGRvSXQpO1xuXHRcdH07XG5cdFx0Ly8gVGhpcyBob29rIGlzIGFsc28gZmlyZWQgYWZ0ZXIgcGFnZSBsb2FkLlxuXHRcdG13Lmhvb2soJ3dpa2lwYWdlLmNvbnRlbnQnKS5hZGQoZHluYW1pY0NvbnRlbnRIYW5kbGVyKTtcblx0XHRtdy5ob29rKCdleHQuZWNoby5vdmVybGF5LmJlZm9yZVNob3dpbmdPdmVybGF5JykuYWRkKCgkb3ZlcmxheSkgPT4ge1xuXHRcdFx0ZHluYW1pY0NvbnRlbnRIYW5kbGVyKCRvdmVybGF5LmZpbmQoJy5tdy1lY2hvLXN0YXRlJykpO1xuXHRcdH0pO1xuXHR9KSgpO1xuXHQvLyBFTkRGSUxFOiBydW4uanNcbn07XG5cbmV4cG9ydCB7cG9wdXBzfTtcbiIsICJpbXBvcnQgJy4vTmF2aWdhdGlvbl9wb3B1cHMubGVzcyc7XG5pbXBvcnQge3BvcHVwc30gZnJvbSAnLi9tb2R1bGVzL2NvcmUnO1xuXG4kKHBvcHVwcyk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsd0ZBQUFBLFNBQUE7QUFBQTtBQUNBLFFBQUksUUFBUSxTQUFVLElBQUk7QUFDeEIsYUFBTyxNQUFNLEdBQUcsU0FBUyxRQUFRO0FBQUEsSUFDbkM7QUFHQSxJQUFBQSxRQUFPO0FBQUEsSUFFTCxNQUFNLE9BQU8sY0FBYyxZQUFZLFVBQVUsS0FDakQsTUFBTSxPQUFPLFVBQVUsWUFBWSxNQUFNO0FBQUEsSUFFekMsTUFBTSxPQUFPLFFBQVEsWUFBWSxJQUFJLEtBQ3JDLE1BQU0sT0FBTyxVQUFVLFlBQVksTUFBTSxLQUN6QyxNQUFNLE9BQU8sV0FBUSxZQUFZLE9BQUk7QUFBQSxJQUVwQywyQkFBWTtBQUFFLGFBQU87QUFBQSxJQUFNLEVBQUcsS0FBSyxTQUFTLGFBQWEsRUFBRTtBQUFBO0FBQUE7OztBQ2Y5RDtBQUFBLHVGQUFBQyxTQUFBO0FBQUE7QUFDQSxJQUFBQSxRQUFPLFVBQVUsU0FBVSxNQUFNO0FBQy9CLFVBQUk7QUFDRixlQUFPLENBQUMsQ0FBQyxLQUFLO0FBQUEsTUFDaEIsU0FBUyxPQUFPO0FBQ2QsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJ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TixRQUFJK2dDLE9BQU87QUFDWCxVQUFNQyx3QkFBeUJDLGNBQWE7QUFJM0MsVUFBSUEsU0FBUzMzQixLQUFLLElBQUksTUFBTSxxQkFBcUJ5M0IsTUFBTTtBQUN0REEsZUFBTztBQUNQO01BQ0Q7QUFDQSxZQUFNRyxpQ0FBaUNBLE1BQU07QUFDNUMsaUJBQVMxcEMsSUFBSSxHQUFHbE8sR0FBR2EsUUFBUWdILFNBQVNxRyxJQUFJbE8sR0FBR2EsUUFBUWdILE1BQU1oRixRQUFRcUwsS0FBSztBQUNyRSxnQkFBTXBILFNBQVM5RyxHQUFHYSxRQUFRZ0gsTUFBTXFHLENBQUMsRUFBRTNHO0FBQ25DLGNBQUksQ0FBQ1QsVUFBVSxDQUFDQSxPQUFPVSxVQUFVLEdBQUc7QUFDbkM7VUFDRDtBQUNBK0IsbUJBQVNvb0IsUUFBUTlzQixRQUFRK3NCLGVBQWU5cUIsTUFBTSxDQUFDO1FBQ2hEO01BQ0Q7QUFDQSxZQUFNK3dDLE9BQU9BLE1BQU07QUFDbEJELHVDQUErQjtBQUMvQkQsaUJBQVNHLEtBQUssQ0FBQ0MsUUFBUWhqQyxZQUFZO0FBQ2xDQSxrQkFBUWpULDBCQUEwQjtBQUNsQ2Isd0JBQWM4VCxPQUFPO1FBQ3RCLENBQUM7TUFDRjtBQUNBNkIsa0JBQVlpaEMsSUFBSTtJQUNqQjtBQUVBdmhDLE9BQUcwd0IsS0FBSyxrQkFBa0IsRUFBRWdSLElBQUlOLHFCQUFxQjtBQUNyRHBoQyxPQUFHMHdCLEtBQUssdUNBQXVDLEVBQUVnUixJQUFLQyxjQUFhO0FBQ2xFUCw0QkFBc0JPLFNBQVM5dEIsS0FBSyxnQkFBZ0IsQ0FBQztJQUN0RCxDQUFDO0VBQ0YsR0FBRztBQUVKOztBQ24rUEFELEVBQUVucUIsTUFBTTsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJnbG9iYWxUaGlzIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIlN5bWJvbCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiZG9jdW1lbnQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiVHlwZUVycm9yIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIiQiLCAibW9kdWxlIiwgIiQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiUmVnRXhwIiwgImtleSIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJyZXF1aXJlIiwgImFwaSIsICJpbml0TXdBcGkiLCAibWVzc2FnZSIsICJhcnRpY2xlIiwgIndpbmRvdyIsICJ3Z1VMUyIsICJjYXRlZ29yeSIsICJjYXRlZ29yaWVzIiwgImltYWdlIiwgImltYWdlcyIsICJzdHViIiwgImtCIiwgImJ5dGVzIiwgImRheSIsICJkYXlzIiwgImhvdXIiLCAiaG91cnMiLCAibWludXRlIiwgIm1pbnV0ZXMiLCAic2Vjb25kIiwgInNlY29uZHMiLCAid2VlayIsICJ3ZWVrcyIsICJtb250aCIsICJtb250aHMiLCAieWVhciIsICJ5ZWFycyIsICJzZWFyY2giLCAiU2VhcmNoSGludCIsICJ3ZWIiLCAiZ2xvYmFsIiwgImFjdGlvbnMiLCAicG9wdXBzTWVudSIsICJ0b2dnbGVQcmV2aWV3c0hpbnQiLCAicmVzZXQiLCAiZGlzYWJsZSIsICJkaXNhYmxlUG9wdXBzSGludCIsICJwdXJnZVBvcHVwc0hpbnQiLCAiUG9wdXBzSGludCIsICJzcGFjZWJhciIsICJ2aWV3IiwgInZpZXdIaW50IiwgInRhbGsiLCAiZGVsIiwgImRlbGV0ZSIsICJkZWxldGVIaW50IiwgInVuZGVsZXRlU2hvcnQiLCAiVW5kZWxldGVIaW50IiwgInByb3RlY3QiLCAicHJvdGVjdEhpbnQiLCAidW5wcm90ZWN0U2hvcnQiLCAidW5wcm90ZWN0SGludCIsICJtb3ZlIiwgIk1vdmVwYWdlSGludCIsICJlZGl0IiwgImVkaXRIaW50IiwgIm5ldyIsICJuZXdTZWN0aW9uSGludCIsICJudWxsRWRpdEhpbnQiLCAiaGlzdCIsICJoaXN0b3J5IiwgImhpc3RvcnlIaW50IiwgImxhc3QiLCAibGFzdEVkaXQiLCAibGFzdENvbnRyaWIiLCAibGFzdENvbnRyaWJIaW50IiwgImN1ciIsICJkaWZmQ3VyIiwgIm9sZEVkaXQiLCAicHVyZ2UiLCAicHVyZ2VIaW50IiwgInJhdyIsICJyYXdIaW50IiwgInJlbmRlciIsICJyZW5kZXJIaW50IiwgInNpbmNlTWUiLCAic2luY2VNZUhpbnQiLCAiZWRzIiwgImVkaXRvcnMiLCAiZWRpdG9yTGlzdEhpbnQiLCAicmVsYXRlZCIsICJyZWxhdGVkQ2hhbmdlcyIsICJSZWNlbnRjaGFuZ2VzbGlua2VkSGludCIsICJlZGl0T2xkIiwgInJ2IiwgInJldmVydCIsICJyZXZlcnRIaW50IiwgInVuZG8iLCAidW5kb0hpbnQiLCAiZGVmYXVsdHBvcHVwUmVkbGlua1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwRml4RGFic1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwRml4UmVkaXJzU3VtbWFyeSIsICJkZWZhdWx0cG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUmV2ZXJ0U3VtbWFyeSIsICJkZWZhdWx0cG9wdXBRdWVyaWVkUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUXVlcmllZFJldmVydFN1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUm1EYWJMaW5rU3VtbWFyeSIsICJSZWRpcmVjdHMiLCAiZGlzYW1iaWciLCAiZGlzYW1iaWdIaW50IiwgIm1haW5saW5rIiwgIndpa2lMaW5rIiwgIndpa2lMaW5rcyIsICJ3aGF0TGlua3NIZXJlIiwgIldoYXRsaW5rc2hlcmVIaW50IiwgInVud2F0Y2hTaG9ydCIsICJ3YXRjaFRoaW5neSIsICJ3YXRjaEhpbnQiLCAidW53YXRjaEhpbnQiLCAicnNzIiwgInVzZXIiLCAiZW1haWwiLCAiRW1haWx1c2VySGludCIsICJzcGFjZSIsICJQcmVmaXhpbmRleEhpbnQiLCAiY291bnQiLCAia2F0ZWxpbmtIaW50IiwgImNvbnRyaWJzIiwgImNvbnRyaWJ1dGlvbnMiLCAiZGVsZXRlZENvbnRyaWJzIiwgIkNvbnRyaWJ1dGlvbnNIaW50IiwgInRyZWUiLCAiY29udHJpYnNUcmVlSGludCIsICJsb2ciLCAidXNlckxvZ0hpbnQiLCAidW5ibG9ja1Nob3J0IiwgImJsb2NrIiwgIklwYmxvY2tsaXN0SGludCIsICJCbG9ja2lwSGludCIsICJibG9ja0xvZ0hpbnQiLCAicHJvdGVjdExvZ0hpbnQiLCAicGFnZUxvZ0hpbnQiLCAiZGVsZXRlTG9nSGludCIsICJtIiwgImJpbmdTZWFyY2hIaW50IiwgImhpc3RvcnlmZWVkSGludCIsICJUaGFua3NIaW50IiwgIm1hcmtwYXRyb2xsZWRIaW50IiwgImRlZmF1bHRwb3B1cFJldmlld2VkU3VtbWFyeSIsICJyZXZkZWwiLCAiRGVsZXRlZGNvbnRyaWJ1dGlvbnNIaW50IiwgIkJMT0NLRUQiLCAiRW1haWxVc2VySGludCIsICJSQU5HRUJMT0NLRUQiLCAiSElEREVOIiwgIkxPQ0tFRCIsICJkaWZmIiwgImF1dG9lZGl0X3ZlcnNpb24iLCAiUHJlZml4SW5kZXhIaW50IiwgIm51bGxFZGl0U3VtbWFyeSIsICJzZXBhcmF0b3IiLCAiY29tbWEiLCAicG9wdXBzIiwgInBnIiwgInJlIiwgIm5zIiwgInN0cmluZyIsICJ3aWtpIiwgIm1pc2MiLCAib3B0aW9uIiwgIm9wdGlvbkRlZmF1bHQiLCAiZmxhZyIsICJjYWNoZSIsICJzdHJ1Y3R1cmVzIiwgInRpbWVyIiwgImNvdW50ZXIiLCAiY3VycmVudCIsICJmbiIsICJlbmRvZmxpc3QiLCAiSFRNTEVsZW1lbnQiLCAic2V0dXBUb29sdGlwcyIsICJjb250YWluZXIiLCAicmVtb3ZlIiwgImZvcmNlIiwgInBvcERhdGEiLCAiY29uY2F0IiwgImdldFZhbHVlT2YiLCAiZG9jdW1lbnQiLCAiZWRpdGZvcm0iLCAid3BUZXh0Ym94MSIsICJvbm1vdXNldXAiLCAiZG9TZWxlY3Rpb25Qb3B1cCIsICJkZWZhdWx0UG9wdXBzQ29udGFpbmVyIiwgInJhblNldHVwVG9vbHRpcHNBbHJlYWR5IiwgImFuY2hvcnMiLCAicXVlcnlTZWxlY3RvckFsbCIsICJzZXR1cFRvb2x0aXBzTG9vcCIsICJxdWVyeVNlbGVjdG9yIiwgInNldHVwVG9vbHRpcHNMb29wMiIsICJiZWdpbiIsICJob3dtYW55IiwgInNsZWVwIiwgImFyZ3MiLCAic2ltcGxlUHJpbnRmIiwgImZpbmlzaCIsICJsb29wZW5kIiwgIk1hdGgiLCAibWluIiwgImxlbmd0aCIsICJqIiwgImRvVG9vbHRpcCIsICJyZW1vdmVUb29sdGlwIiwgImFkZFRvb2x0aXAiLCAiYSIsICJocmVmIiwgInNldFRpbWVvdXQiLCAicm1Ub2NUb29sdGlwcyIsICJmaW5pc2hlZExvYWRpbmciLCAidG9jIiwgInRvY0xpbmtzIiwgInRvY0xlbiIsICJpc1BvcHVwTGluayIsICJvbm1vdXNlb3ZlciIsICJtb3VzZU92ZXJXaWtpTGluayIsICJvbm1vdXNlb3V0IiwgIm1vdXNlT3V0V2lraUxpbmsiLCAib25tb3VzZWRvd24iLCAia2lsbFBvcHVwIiwgImhhc1BvcHVwIiwgIm9yaWdpbmFsVGl0bGUiLCAidGl0bGUiLCAicmVtb3ZlVGl0bGUiLCAicmVzdG9yZVRpdGxlIiwgInJlZ2lzdGVySG9va3MiLCAibnAiLCAicG9wdXBNYXhXaWR0aCIsICJzZXRNYXhXaWR0aCIsICJtYWluRGl2IiwgInN0eWxlIiwgIm1heFdpZHRoIiwgImFkZEhvb2siLCAiYWRkUG9wdXBTaG9ydGN1dHMiLCAicm1Qb3B1cFNob3J0Y3V0cyIsICJyZW1vdmVNb2RpZmllcktleUxpc3RlbmVyIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCAibW9kaWZpZXJLZXlMaXN0ZW5lciIsICJtb3VzZU92ZXJXaWtpTGluazMiLCAiZXZ0IiwgImV2ZW50IiwgImFjdGlvbiIsICJrZXkiLCAic2VsZiIsICJldnQyIiwgIm1vdXNlT3Zlcldpa2lMaW5rMiIsICJhZGRFdmVudExpc3RlbmVyIiwgImZvb3Rub3RlVGFyZ2V0IiwgImFUaXRsZSIsICJUaXRsZSIsICJmcm9tQW5jaG9yIiwgImFuY2giLCAiYW5jaG9yIiwgInRlc3QiLCAibFRpdGxlIiwgImZyb21VUkwiLCAibG9jYXRpb24iLCAidG9TdHJpbmciLCAiZWwiLCAibm9kZU5hbWUiLCAibnQiLCAidG9Mb3dlckNhc2UiLCAicGFyZW50Tm9kZSIsICJmb290bm90ZVByZXZpZXciLCAieCIsICJuYXZwb3AiLCAic2V0UG9wdXBIVE1MIiwgImlubmVySFRNTCIsICJpZE51bWJlciIsICJtb2RpZmllclByZXNzZWQiLCAibW9kIiwgImlzQ29ycmVjdE1vZGlmaWVyIiwgIl9hIiwgImxpbmsiLCAibmF2cG9wdXAiLCAiaXNWaXNpYmxlIiwgInBvcHVwU3RydWN0dXJlIiwgInNldERlZmF1bHQiLCAibmV3TmF2cG9wdXAiLCAibGlua3NIYXNoIiwgImxpbmtzIiwgInB1c2giLCAicGVuZGluZyIsICJzaW1wbGVQb3B1cENvbnRlbnQiLCAic2hvd1Nvb25JZlN0YWJsZSIsICJkZWxheSIsICJjbGVhckludGVydmFsIiwgImNoZWNrUG9wdXBQb3NpdGlvbiIsICJzZXRJbnRlcnZhbCIsICJzaW1wbGVOb01vcmUiLCAiZCIsICJjcmVhdGVFbGVtZW50IiwgImNsYXNzTmFtZSIsICJzIiwgImFwcGVuZCIsICJkaXNwbGF5IiwgIm5vbnNpbXBsZVBvcHVwQ29udGVudCIsICJwb3B1cFN0cmluZyIsICJoYXNQb3B1cE1lbnUiLCAic2V0SW5uZXJIVE1MIiwgInBvcHVwSFRNTCIsICJmaWxsRW1wdHlTcGFucyIsICJkcmFnSGFuZGxlIiwgIm1ha2VEcmFnZ2FibGUiLCAicG9wdXBSZWRsaW5rSFRNTCIsICJkZWJ1Z0RhdGEiLCAiTmF2cG9wdXAiLCAiZnV6eiIsICJwYXJlbnRBbmNob3IiLCAicGFyZW50UG9wdXAiLCAib3duZXIiLCAic2hvdWxkU2hvd05vblNpbXBsZSIsICJzaG91bGRTaG93IiwgImRpZmYyIiwgInBhcmFtcyIsICJwYXJzZVBhcmFtcyIsICJvbGRpZCIsICJyZWZlcmVuY2VFbGVtZW50IiwgImxvYWREaWZmIiwgImxvYWRBUElQcmV2aWV3IiwgImJhY2tsaW5rcyIsICJuYW1lc3BhY2VJZCIsICJuc0ltYWdlSWQiLCAiYW5jaG9yQ29udGFpbnNJbWFnZSIsICJsb2FkSW1hZ2UiLCAibnNDYXRlZ29yeUlkIiwgIm5zVXNlcklkIiwgIm5zVXNlcnRhbGtJZCIsICJzdGFydEFydGljbGVQcmV2aWV3IiwgInBlbmRpbmdOYXZwb3BUYXNrIiwgImNvbXBsZXRlZE5hdnBvcFRhc2siLCAicmVkaXIiLCAibG9hZFByZXZpZXciLCAib3JpZ2luYWxBcnRpY2xlIiwgImxvYWRQcmV2aWV3RnJvbVJlZGlyIiwgInJlZGlyTWF0Y2giLCAidGFyZ2V0IiwgImZyb21XaWtpVGV4dCIsICJyZWRpclRhcmdldCIsICJ3YXJuUmVkaXIiLCAicmVkaXJMaW5rIiwgImluc2VydFByZXZpZXciLCAiZG93bmxvYWQiLCAicmVkaXJlY3QiLCAiZXhlYyIsICJkYXRhIiwgInZpc2libGUiLCAiaW5zZXJ0UHJldmlld05vdyIsICJpZCIsICJ3aWtpVGV4dCIsICJhcnQiLCAibWFrZUZpeERhYnMiLCAiZ2V0UGFnZUluZm8iLCAic2V0UG9wdXBUcmFpbGVyIiwgImltYWdlUGFnZSIsICJnZXRWYWxpZEltYWdlRnJvbVdpa2lUZXh0IiwgImluc2VydEFydGljbGVQcmV2aWV3IiwgIm5zVGVtcGxhdGVJZCIsICJoIiwgImVudGlmeSIsICJzcGxpdCIsICJqb2luIiwgInAiLCAicHJlcFByZXZpZXdtYWtlciIsICJzaG93UHJldmlldyIsICJhbmNob3JpemUiLCAiYW5jaG9yU3RyaW5nIiwgInVybEJhc2UiLCAiam9pblBhdGgiLCAiYXJ0aWNsZWJhc2UiLCAidXJsU3RyaW5nIiwgIlByZXZpZXdtYWtlciIsICJhbmNoUmUiLCAiUmVnRXhwIiwgImxpdGVyYWxpemVSZWdleCIsICJyZXBsYWNlIiwgIm1hdGNoIiwgInNsaWNlIiwgIm1heCIsICJpbmRleE9mIiwgImxpbmVzIiwgImkiLCAia2lsbFBvcHVwMiIsICJiYW5pc2giLCAiYWJvcnRBbGxEb3dubG9hZHMiLCAiRHJhZyIsICJjb25zdHJ1Y3RvciIsICJzdGFydENvbmRpdGlvbiIsICJlbmRIb29rIiwgImZpeEUiLCAiZSIsICJsYXllclgiLCAib2Zmc2V0WCIsICJsYXllclkiLCAib2Zmc2V0WSIsICJpbml0IiwgIm8iLCAib1Jvb3QiLCAib2JqIiwgInN0YXJ0IiwgImRyYWdnaW5nIiwgInBvcHVwc19kcmFnZ2FibGUiLCAiaG1vZGUiLCAidm1vZGUiLCAicm9vdCIsICJOdW1iZXIiLCAiaXNOYU4iLCAicGFyc2VJbnQiLCAibGVmdCIsICJ0b3AiLCAib250aGlzU3RhcnQiLCAib250aGlzRW5kIiwgIm9udGhpcyIsICJ5IiwgImJvdHRvbSIsICJyaWdodCIsICJsYXN0TW91c2VYIiwgImNsaWVudFgiLCAibGFzdE1vdXNlWSIsICJjbGllbnRZIiwgIm9ubW91c2Vtb3ZlRGVmYXVsdCIsICJvbm1vdXNlbW92ZSIsICJlMiIsICJkcmFnIiwgImVuZCIsICJleSIsICJleCIsICJueCIsICJueSIsICJvcmlnaW5hbCIsICJwb3B1cExheW91dCIsICJwb3B1cFJlZGlyU3BhbnMiLCAicG9wdXBUaXRsZSIsICJuYXZsaW5rU3RyaW5nVG9IVE1MIiwgInBvcHVwVG9wTGlua3MiLCAibmF2TGlua3NIVE1MIiwgImhpbnQiLCAicG9wdXBJbWFnZSIsICJpbWFnZUhUTUwiLCAicG9wdXBSZWRpclRpdGxlIiwgInBvcHVwUmVkaXJUb3BMaW5rcyIsICJjb3B5U3RydWN0dXJlIiwgIm9sZFN0cnVjdHVyZSIsICJuZXdTdHJ1Y3R1cmUiLCAicHJvcCIsICJPYmplY3QiLCAiaGFzT3duIiwgIm5vc3RhbGdpYSIsICJzdHIiLCAiZWRpdHN0ciIsICJlZGl0T2xkaWRTdHIiLCAiaGlzdG9yeXN0ciIsICJ3YXRjaHN0ciIsICJmYW5jeSIsICJ3YXRjaCIsICJwb3B1cE90aGVyTGlua3MiLCAiYWRtaW4iLCAibm9ybWFsIiwgInBvcHVwUmVkaXJPdGhlckxpbmtzIiwgImZhbmN5MiIsICJtZW51cyIsICJzaG9ydGVyIiwgImRyb3BkaXYiLCAiZW5kZGl2IiwgImxhc3RlZGl0IiwgInRoYW5rIiwgImpzSGlzdG9yeSIsICJsaW5rc2hlcmUiLCAibnVsbFB1cmdlIiwgInZpZXdPcHRpb25zIiwgImVkaXRSb3ciLCAibWFya1BhdHJvbGxlZCIsICJuZXdUb3BpYyIsICJwcm90ZWN0RGVsZXRlIiwgIm1lbnVUaXRsZSIsICJzaG9ydG1lbnVzIiwgImxpdGUiLCAic3Vic3RpdHV0ZSIsICJjbWRCb2R5IiwgImZyb21SZSIsICJmcm9tIiwgImZsYWdzIiwgInRvIiwgImV4ZWNDbWRzIiwgImNtZExpc3QiLCAiX2l0ZXJhdG9yIiwgIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwgIl9zdGVwIiwgIm4iLCAiZG9uZSIsICJlbGVtZW50IiwgInZhbHVlIiwgImVyciIsICJmIiwgInBhcnNlQ21kIiwgInBhcnNlQ21kMiIsICJjaGFyQXQiLCAicGFyc2VTdWJzdGl0dXRlIiwgInJlbWFpbmRlciIsICJ1bkVzY2FwZSIsICJzZXAiLCAidG1wIiwgInNraXBPdmVyIiwgInNlZ21lbnQiLCAic2tpcFRvRW5kIiwgImVuZFNlZ21lbnQiLCAiZmluZE5leHQiLCAiX3NlcCIsICJjaCIsICJzZXRDaGVja2JveCIsICJwYXJhbSIsICJib3giLCAidmFsIiwgIm13IiwgInV0aWwiLCAiZ2V0UGFyYW1WYWx1ZSIsICJjaGVja2VkIiwgImF1dG9FZGl0IiwgImF1dG9FZGl0NCIsICJzZXR1cFBvcHVwcyIsICJhdXRvQ2xpY2tUb2tlbiIsICJtb2RpZnlXYXRjaGxpc3QiLCAiYWxyZWFkeVJhbiIsICJjbWRTdHJpbmciLCAiZWRpdGJveCIsICJpbnB1dCIsICJvdXRwdXQiLCAid3BNaW5vcmVkaXQiLCAid3BXYXRjaHRoaXMiLCAicnZpZCIsICJ1cmwiLCAiYXBpd2lraWJhc2UiLCAic3RhcnREb3dubG9hZCIsICJhdXRvRWRpdDIiLCAic3VtbWFyeSIsICJzdW1tYXJ5cHJvbXB0IiwgInN1bW1hcnlub3RpY2UiLCAiZ2V0UnZTdW1tYXJ5IiwgInR4dCIsICJyZXNwb25zZSIsICJwcm9tcHQiLCAid3BTdW1tYXJ5IiwgImF1dG9FZGl0MyIsICJzZXNzaW9uSWQiLCAiYnRuIiwgImJ1dHRvbiIsICJtc2ciLCAidHByaW50ZiIsICJiYW5uZXJNZXNzYWdlIiwgImNsaWNrIiwgIm5vdGlmeSIsICJ0YWciLCAidHlwZSIsICJoZWFkaW5ncyIsICJkaXYiLCAiZXNjYXBlUXVvdGVzSFRNTCIsICJpbnNlcnRCZWZvcmUiLCAidGVtcGxhdGUiLCAianNvbiIsICJnZXRKc09iaiIsICJhbnlDaGlsZCIsICJxdWVyeSIsICJwYWdlcyIsICJyZXZpc2lvbnMiLCAidGltZXN0YW1wIiwgInJldmlkIiwgInVzZXJoaWRkZW4iLCAiRG93bmxvYWRlciIsICJYTUxIdHRwUmVxdWVzdCIsICJodHRwIiwgImxhc3RNb2RpZmllZCIsICJjYWxsYmFja0Z1bmN0aW9uIiwgIm9uRmFpbHVyZSIsICJhYm9ydGVkIiwgIm1ldGhvZCIsICJhc3luYyIsICJzZW5kIiwgImFib3J0IiwgImdldERhdGEiLCAicmVzcG9uc2VUZXh0IiwgInNldFRhcmdldCIsICJvcGVuIiwgInNldFJlcXVlc3RIZWFkZXIiLCAidXNlckFnZW50IiwgImdldFJlYWR5U3RhdGUiLCAicmVhZHlTdGF0ZSIsICJkb3dubG9hZHNJblByb2dyZXNzIiwgImdldExhc3RNb2RpZmllZERhdGUiLCAibGFzdG1vZCIsICJnZXRSZXNwb25zZUhlYWRlciIsICJEYXRlIiwgInNldENhbGxiYWNrIiwgIm9ucmVhZHlzdGF0ZWNoYW5nZSIsICJnZXRTdGF0dXMiLCAic3RhdHVzIiwgIm5ld0Rvd25sb2FkIiwgIm5ld0Rvd25sb2FkMiIsICJjYWxsYmFjayIsICJvbmZhaWx1cmUiLCAiZmFrZURvd25sb2FkIiwgIkluc3RhIiwgInNldHVwTGl2ZVByZXZpZXciLCAiX2IiLCAiY29uZiIsICJiYXNlVXJsIiwgImxhbmciLCAiaW50ZXJ3aWtpIiwgImRlZmF1bHRfdGh1bWJfd2lkdGgiLCAicGF0aHMiLCAiYXJ0aWNsZXMiLCAiYXJ0aWNsZVBhdGgiLCAibWF0aCIsICJpbWFnZXNfZmFsbGJhY2siLCAibG9jYWxlIiwgImNvbmZpZyIsICJnZXQiLCAibmFtZSIsICJzaWduYXR1cmUiLCAiQkxPQ0tfSU1BR0UiLCAiZHVtcCIsICJjb252ZXJ0IiwgImxsIiwgInIiLCAicmVtYWluIiwgInNoIiwgInNoaWZ0IiwgInBzIiwgImYyIiwgImYzIiwgIm8yIiwgImMiLCAicDIiLCAiaHRtbF9lbnRpdGllcyIsICJodG1sZXNjYXBlX3RleHQiLCAiaHRtbGVzY2FwZV9hdHRyIiwgInN0cl9pbWF0Y2giLCAiYiIsICJsIiwgImNvbXBhcmVMaW5lU3RyaW5nT3JSZWciLCAiY29tcGFyZUxpbmVTdHJpbmciLCAiY2hhckF0UG9pbnQiLCAiZW5kbCIsICJwYXJzZV9saXN0IiwgInByZXYiLCAibF9tYXRjaCIsICJpcG9zIiwgInByZXZQb3MiLCAicGkiLCAibWF0Y2hQb3MiLCAibGkiLCAiYXQiLCAicGFyc2VfaW5saW5lX25vd2lraSIsICJkdF9tYXRjaCIsICJ1bnNoaWZ0IiwgInBhcnNlX3RhYmxlIiwgInBhcnNlX3RhYmxlX2RhdGEiLCAidGRfbGluZSIsICJtYXRjaF9pIiwgInRkX21hdGNoIiwgInBvcCIsICJ0YyIsICJ0ZCIsICJwYXJzZV9wcmUiLCAicGFyc2VfYmxvY2tfaW1hZ2UiLCAicGFyc2VfaW1hZ2UiLCAic3Vic3RyaW5nIiwgIndpZHRoIiwgImF0dHIiLCAiZmlsZW5hbWUiLCAiY2FwdGlvbiIsICJ0aHVtYiIsICJmcmFtZSIsICJjZW50ZXIiLCAiYWxpZ24iLCAibmVzdGluZyIsICJsYXN0X2F0dHIiLCAid19tYXRjaCIsICJsYXN0ZW5kIiwgInN1YnN0YXJ0IiwgIm5lc3RsZXYiLCAiY2xvc2UiLCAic3VibG9vcCIsICJodG1sIiwgInBhcnNlX2lubGluZV93aWtpIiwgInBhcnNlX2lubGluZV9pbWFnZXMiLCAibG9vcCIsICJ3aWtpMiIsICJwYXJzZV9pbmxpbmVfZm9ybWF0dGluZyIsICJlbSIsICJzdCIsICJkYXRlIiwgImdldFVUQ01pbnV0ZXMiLCAiZ2V0VVRDSG91cnMiLCAiZ2V0VVRDRGF0ZSIsICJnZXRVVENNb250aCIsICJnZXRVVENGdWxsWWVhciIsICJfJDAiLCAiJDEiLCAiJDIiLCAiJDMiLCAiJDQiLCAid2lraTJodG1sIiwgImJhc2V1cmwiLCAicG9wdXBGaWx0ZXJQYWdlU2l6ZSIsICJmb3JtYXRCeXRlcyIsICJwb3B1cEZpbHRlckNvdW50TGlua3MiLCAibnVtIiwgImNvdW50TGlua3MiLCAiU3RyaW5nIiwgInBvcHVwRmlsdGVyQ291bnRJbWFnZXMiLCAiY291bnRJbWFnZXMiLCAicG9wdXBGaWx0ZXJDb3VudENhdGVnb3JpZXMiLCAiY291bnRDYXRlZ29yaWVzIiwgInBvcHVwRmlsdGVyTGFzdE1vZGlmaWVkIiwgIl9kYXRhIiwgIm5vdyIsICJhZ2UiLCAiZm9ybWF0QWdlIiwgImFhIiwgInNlY2xlbiIsICJtaW5sZW4iLCAiaG91cmxlbiIsICJkYXlsZW4iLCAid2Vla2xlbiIsICJudW13ZWVrcyIsICJzd2Vla3MiLCAiYWRkdW5pdCIsICJudW1kYXlzIiwgInNkYXlzIiwgIm51bWhvdXJzIiwgInNob3VycyIsICJudW1taW5zIiwgInNtaW5zIiwgIm51bXNlY3MiLCAic3NlY3MiLCAicnVuUG9wdXBGaWx0ZXJzIiwgImxpc3QiLCAicmV0IiwgIl9pdGVyYXRvcjIiLCAiX3N0ZXAyIiwgInBvcHVwRmlsdGVycyIsICJleHRyYVBvcHVwRmlsdGVycyIsICJwYWdlSW5mb0FycmF5IiwgInBhZ2VJbmZvIiwgInVwY2FzZUZpcnN0IiwgImltYWdlQnJhY2tldENvdW50IiwgImNhdGVnb3J5QnJhY2tldENvdW50IiwgInBvcHVwRmlsdGVyU3R1YkRldGVjdCIsICJfZG93bmxvYWQiLCAiY291bnRzIiwgInN0dWJDb3VudCIsICJyZWFsIiwgInNlY3QiLCAicG9wdXBGaWx0ZXJEaXNhbWJpZ0RldGVjdCIsICJuYW1lc3BhY2UiLCAiaXNEaXNhbWJpZyIsICJyb3VuZCIsICJTdHJpbmd3cmFwcGVyIiwgIlN0cmluZ3dyYXBwZXIyIiwgInNldFV0ZiIsICJvbWl0QW5jaG9yIiwgImxlbiIsICJkZWNvZGVVUklDb21wb25lbnQiLCAidXJsQW5jaG9yIiwgImFuY2hvckZyb21VdGYiLCAiZW5jb2RlVVJJQ29tcG9uZW50IiwgInNwbGl0dGVkIiwgInUiLCAiZGVjb2RlTmFzdGllcyIsICJzdHJpcE5hbWVzcGFjZSIsICJzcGVjaWFsZGlmZiIsICJuc1NwZWNpYWxJZCIsICJtYWluIiwgImZyb21Cb3RJbnRlcmZhY2UiLCAiZXh0cmFjdGVkIiwgImlzU2FmYXJpIiwgInVuZXNjYXBlIiwgImRlY29kZVVSSSIsICJkZWNvZGVFc2NhcGVzIiwgIm15RGVjb2RlVVJJIiwgImhpbnRWYWx1ZSIsICJzYWZlRGVjb2RlVVJJIiwgInRvVXNlck5hbWUiLCAid2l0aE5zIiwgInVzZXJOYW1lIiwgInQiLCAidG9UYWxrUGFnZSIsICJsb2NhbGl6ZWROYW1lc3BhY2UiLCAidGFsa1BhZ2UiLCAiaXNUYWxrUGFnZSIsICJ0b0FydGljbGVGcm9tVGFsa1BhZ2UiLCAiYXJ0aWNsZUZyb21UYWxrUGFnZSIsICJhcnRpY2xlRnJvbVRhbGtPckFydGljbGUiLCAiaXNJcFVzZXIiLCAiaXBVc2VyIiwgIm5zTWFpbnNwYWNlSWQiLCAic2V0VXJsIiwgInVybGZyYWciLCAidiIsICJrZWVwU3BhY2VzIiwgImVuY29kZVVSSSIsICJyZW1vdmVBbmNob3IiLCAidG9VcmwiLCAidGl0bGViYXNlIiwgInNwZWNpYWxEaWZmIiwgImluY2x1ZGVzIiwgIl9pdGVyYXRvcjMiLCAiX3N0ZXAzIiwgInoiLCAiaGVscGVyIiwgImRlY29kZUV4dHJhcyIsICJzZWN0U3R1YiIsICJyZWFsU3R1YiIsICJpc1ZhbGlkSW1hZ2VOYW1lIiwgImlzSW5TdHJpcHBhYmxlTmFtZXNwYWNlIiwgImlzSW5NYWluTmFtZXNwYWNlIiwgImtpZHMiLCAiY2hpbGROb2RlcyIsICJfaXRlcmF0b3I0IiwgIl9zdGVwNCIsICJraWQiLCAibWFya05vcG9wdXBTcGFuTGlua3MiLCAiaW5Ob3BvcHVwU3BhbiIsICJnZXRBdHRyaWJ1dGUiLCAiYmFzZW5hbWVzIiwgInVybE5vUG9wdXAiLCAibWFya05vcG9wdXBTcGFuTGlua3MyIiwgImZpeFZlY3Rvck1lbnVQb3B1cHMiLCAiJGJvZHkiLCAiJCIsICJmaW5kIiwgInRvQXJyYXkiLCAiX2l0ZXJhdG9yNSIsICJfc3RlcDUiLCAiYXMiLCAiX2l0ZXJhdG9yNiIsICJfc3RlcDYiLCAiZ2V0UGFnZVdpdGhDYWNoaW5nIiwgIm9uQ29tcGxldGUiLCAiZmluZEluUGFnZUNhY2hlIiwgImdldFBhZ2UiLCAiYWRkRG93bmxvYWQiLCAiYWRkUGFnZVRvQ2FjaGUiLCAicGFnZSIsICJqc29uX3JldCIsICJKU09OIiwgInBhcnNlIiwgIndhcm5pbmdzIiwgInciLCAiZXJyb3IiLCAiZXJybG9nIiwgImNvZGUiLCAiaW5mbyIsICJ0b1VwcGVyQ2FzZSIsICJmaW5kSW5BcnJheSIsICJhcnIiLCAiZm9vIiwgIm5leHRPbmUiLCAiYXJyYXkiLCAiZXNjYXBlUmVnRXhwIiwgInByb3RvdHlwZSIsICJyZW1vdmVOdWxscyIsICJmaWx0ZXIiLCAic3VicyIsICJjbWQiLCAiaXNTdHJpbmciLCAiaXNOdW1iZXIiLCAiaXNSZWdFeHAiLCAiaXNBcnJheSIsICJBcnJheSIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgIkZ1bmN0aW9uIiwgInJlcGVhdFN0cmluZyIsICJtdWx0IiwgInplcm9GaWxsIiwgIm1hcCIsICJtYXBfYXJyYXkiLCAibWFwX29iamVjdCIsICJfaXRlcmF0b3I3IiwgIl9zdGVwNyIsICJ0ZXh0IiwgInVuZXNjYXBlUXVvdGVzSFRNTCIsICJyZXRhcmdldERhYiIsICJuZXdUYXJnZXQiLCAib2xkVGFyZ2V0IiwgImZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lIiwgInRpdGxlVG9FZGl0IiwgImNoYW5nZUxpbmtUYXJnZXRMaW5rIiwgImNsaWNrQnV0dG9uIiwgIm1pbm9yIiwgImxpc3RMaW5rcyIsICJ3aWtpdGV4dCIsICJyZWciLCAib21pdFJlZ2V4IiwgIndpa1BvcyIsICJybUR1cGVzRnJvbVNvcnRlZExpc3QiLCAic29ydCIsICJ3aWtUYXJnZXQiLCAibWV0aCIsICJfaXRlcmF0b3I4IiwgIl9zdGVwOCIsICJtYWtlRml4RGFiIiwgInNldFBvcHVwSFRNTDIiLCAiZWxlbWVudElkIiwgInBvcHVwSWQiLCAib25TdWNjZXNzIiwgInBvcHVwRWxlbWVudCIsICJyY2lkIiwgInN0cnVjdHVyZSIsICJzcGFucyIsICJmbGF0dGVuIiwgImxheW91dCIsICJudW1zcGFucyIsICJyZWRpcnMiLCAicmVkaXJTcGFucyIsICJmb3VuZCIsICJzdHJ1Y3R1cmVmbiIsICJzZXRmbiIsICJzZXRQb3B1cFRpcHNBbmRIVE1MIiwgImZsYXR0ZW4yIiwgInBvcHVwSFRNTDIiLCAibWFrZUVtcHR5U3BhbnMiLCAibWFrZUVtcHR5U3BhbnMyIiwgIl9pdGVyYXRvcjkiLCAiX3N0ZXA5IiwgImVtcHR5U3BhbkhUTUwiLCAibm9kZVR5cGUiLCAiZW1wdHlTcGFuSFRNTDIiLCAiY2xhc3NuYW1lIiwgImNsYXNzQWxpYXNlcyIsICJwb3B1cFNlY29uZFByZXZpZXciLCAiX2FydGljbGUiLCAicG9wVGlwc1Nvb25GbiIsICJ3aGVuIiwgInBvcFRpcHMiLCAiZGl2bmFtZSIsICJpZG51bWJlciIsICJmdXp6eUN1cnNvck9mZk1lbnVzIiwgIl94IiwgIl95IiwgIl9mdXp6IiwgInBhcmVudCIsICJ1bHMiLCAiX2l0ZXJhdG9yMTAiLCAiX3N0ZXAxMCIsICJ1bCIsICJvZmZzZXRXaWR0aCIsICJsaW1pdEhvcml6b250YWxQb3NpdGlvbiIsICJtb3VzZU91dFdpa2lMaW5rMiIsICJ0cmFja2VyIiwgInBvc0NoZWNrZXJIb29rIiwgImRpcnR5IiwgIm1vdXNlT3Zlck5hdnBvcCIsICJpc1dpdGhpbiIsICJtb3VzZUxlYXZpbmdUaW1lIiwgInJ1blN0b3BQb3B1cFRpbWVyIiwgInN0b3BQb3B1cFRpbWVyIiwgIm9yaWdpbmFsRGF0YSIsICJtYXhDaGFyYWN0ZXJzIiwgIm1heFNlbnRlbmNlcyIsICJzZXREYXRhIiwgIm1heFNpemUiLCAia2lsbENvbW1lbnRzIiwgImtpbGxEaXZzIiwgImtpbGxHYWxsZXJpZXMiLCAia2lsbCIsICJvcGVuaW5nIiwgImNsb3NpbmciLCAic3Vib3BlbmluZyIsICJzdWJjbG9zaW5nIiwgInJlcGwiLCAib2xkayIsICJrIiwgImtpbGxTdHVmZiIsICJvcCIsICJtYWtlUmVnZXhwIiwgImNsIiwgInNiIiwgInNjIiwgIm9wUmVzdWx0IiwgImluZGV4IiwgImRlcHRoIiwgInJlbW92YWwiLCAicHJlZml4IiwgInN1ZmZpeCIsICJyZVN0ciIsICJzcCIsICJraWxsQm94VGVtcGxhdGVzIiwgImtpbGxUZW1wbGF0ZXMiLCAia2lsbFRhYmxlcyIsICJraWxsSW1hZ2VzIiwgImZvcmJpZGRlbk5hbWVzcGFjZUFsaWFzZXMiLCAiX2kiLCAiX09iamVjdCRlbnRyaWVzIiwgImVudHJpZXMiLCAibG9jYWxpemVkTmFtZXNwYWNlTGMiLCAia2lsbEhUTUwiLCAia2lsbENodW5rcyIsICJpdGFsaWNDaHVua1JlZ2V4IiwgIm1vcHVwIiwgImZpcnN0Qml0IiwgInN0dWZmIiwgIm5vdFNlbnRlbmNlRW5kcyIsICJmaXhTZW50ZW5jZUVuZHMiLCAiZnVsbExlbmd0aCIsICJkZCIsICJmaXJzdFNlbnRlbmNlcyIsICJzdHJzIiwgImtpbGxCYWRXaGl0ZXNwYWNlIiwgIm1ha2VQcmV2aWV3IiwgImtpbGxNdWx0aWxpbmVUZW1wbGF0ZXMiLCAiZml4SFRNTCIsICJzdHJpcExvbmdUZW1wbGF0ZXMiLCAiZXNXaWtpMkh0bWxQYXJ0IiwgInJlTGlua3MiLCAibGFzdEluZGV4IiwgInJlc3VsdCIsICJwb3N0Zml4SW5kZXgiLCAiX21hdGNoJCIsICJlZGl0U3VtbWFyeVByZXZpZXciLCAicmVBZXMiLCAic2VjdGlvbiIsICJwb3N0Zml4IiwgInNlY3Rpb25MaW5rIiwgIm1vcmUiLCAibW9yZUxpbmsiLCAib25jbGljayIsICJxdWVyeVR5cGUiLCAiaHRtbEdlbmVyYXRvciIsICJ1c2VybmFtZWFydCIsICJBUEloaXN0b3J5UHJldmlld0hUTUwiLCAiQVBJY2F0ZWdvcnlQcmV2aWV3SFRNTCIsICJ1c2VybmFtZSIsICJBUEl1c2VySW5mb1ByZXZpZXdIVE1MIiwgIkFQSWNvbnRyaWJzUHJldmlld0hUTUwiLCAidHJhaWwiLCAiQVBJaW1hZ2VwYWdlUHJldmlld0hUTUwiLCAiQVBJYmFja2xpbmtzUHJldmlld0hUTUwiLCAiQVBJcmV2aXNpb25QcmV2aWV3SFRNTCIsICJmZXRjaFVzZXJHcm91cE5hbWVzIiwgInRoZW4iLCAic2hvd0FQSVByZXZpZXciLCAiZ28iLCAibGlua0xpc3QiLCAiYnVmIiwgIl9pdGVyYXRvcjExIiwgIl9zdGVwMTEiLCAiZ2V0VGltZU9mZnNldCIsICJ0eiIsICJvcHRpb25zIiwgImdldFRpbWVab25lIiwgInRpbWVab25lIiwgInR6Q29tcG9uZW50cyIsICJ1c2VUaW1lT2Zmc2V0IiwgIkludGwiLCAiRGF0ZVRpbWVGb3JtYXQiLCAiZm9ybWF0VG9QYXJ0cyIsICJnZXRMb2NhbGVzIiwgImxvY2FsZXMiLCAidXNlckxhbmd1YWdlIiwgImdldE1XRGF0ZUZvcm1hdCIsICJzdXBwb3J0ZWRMb2NhbGVzT2YiLCAibmF2aWdhdG9yIiwgImxhbmd1YWdlIiwgImVkaXRQcmV2aWV3VGFibGUiLCAicmVhbGx5Q29udHJpYnMiLCAiY3VyYXJ0IiwgIm1ha2VGaXJzdENvbHVtbkxpbmtzIiwgImN1cnJlbnRSZXZpc2lvbiIsICJmaXJzdFJldmlkIiwgIl9pdGVyYXRvcjEyIiwgIl9zdGVwMTIiLCAiZWRpdERhdGUiLCAidGhpc0RheSIsICJmb3JtYXR0ZWREYXRlIiwgInRoaXNUaW1lIiwgImZvcm1hdHRlZFRpbWUiLCAiY29sM3VybCIsICJjb2wzdHh0IiwgImNvbW1lbnQiLCAiY29udGVudCIsICJjb21tZW50aGlkZGVuIiwgImFkanVzdERhdGUiLCAib2Zmc2V0IiwgImNvbnZlcnRUaW1lWm9uZSIsICJ0b0xvY2FsZVN0cmluZyIsICJmb3JtYXR0ZWREYXRlVGltZSIsICJkMiIsICJnZXRGdWxsWWVhciIsICJnZXRNb250aCIsICJnZXREYXRlIiwgImdldEhvdXJzIiwgImdldE1pbnV0ZXMiLCAiZ2V0U2Vjb25kcyIsICJ0b0xvY2FsZURhdGVTdHJpbmciLCAiZ2V0VVRDU2Vjb25kcyIsICJ0b0xvY2FsZVRpbWVTdHJpbmciLCAidXNlcmluZm9SZXNwb25zZSIsICJxdWVyeU9iaiIsICJ1c2VycyIsICJtZXNzYWdlcyIsICJncm91cHMiLCAiX2l0ZXJhdG9yMTMiLCAiX3N0ZXAxMyIsICJncm91cE5hbWUiLCAiZ2xvYmFsdXNlcmluZm8iLCAiX2l0ZXJhdG9yMTQiLCAiX3N0ZXAxNCIsICJnZXRNd0FwaSIsICJsb2FkTWVzc2FnZXNJZk1pc3NpbmciLCAianNPYmoiLCAibWlzc2luZyIsICJjb250ZW50bW9kZWwiLCAiX2l0ZXJhdG9yMTUiLCAiX3N0ZXAxNSIsICJjb250aW51ZSIsICJibGNvbnRpbnVlIiwgIkFQSXNoYXJlZEltYWdlUGFnZVByZXZpZXdIVE1MIiwgInBvcHVwaWQiLCAicmVxdWVzdGlkIiwgImFsdCIsICJpbWFnZXJlcG9zaXRvcnkiLCAiZW5jYXJ0IiwgInNoYXJlZF91cmwiLCAiYXBpY29tbW9uc2Jhc2UiLCAiY29tbW9uc2Jhc2UiLCAibG9hZGVyIiwgImxvYWQiLCAiQVBJaW1hZ2VsaW5rc1ByZXZpZXdIVE1MIiwgImpzb2JqIiwgImltYWdldXNhZ2UiLCAiX2l0ZXJhdG9yMTYiLCAiX3N0ZXAxNiIsICJjYXRlZ29yeW1lbWJlcnMiLCAiX2l0ZXJhdG9yMTciLCAiX3N0ZXAxNyIsICJjbWNvbnRpbnVlIiwgInF1ZXJ5b2JqIiwgImludmFsaWQiLCAiYmxvY2tlZGJ5IiwgImJsb2NrcGFydGlhbCIsICJsb2NrZWRTdWxBY2NvdW50SXNBdHRhY2hlZFRvVGhpcyIsICJ1bmF0dGFjaGVkIiwgImdlbmRlciIsICJfaXRlcmF0b3IxOCIsICJfc3RlcDE4IiwgIl9pdGVyYXRvcjE5IiwgIl9zdGVwMTkiLCAicmVnaXN0cmF0aW9uIiwgIl91c2VyJGVkaXRjb3VudCIsICJlZGl0Y291bnQiLCAidXNlcmNvbnRyaWJzIiwgImJsb2NrcyIsICJyYnN0ciIsICJyYW5nZXN0YXJ0IiwgInJhbmdlZW5kIiwgInJlc3RyaWN0aW9ucyIsICJzcGxpY2UiLCAiX25hdnBvcCIsICJlZGl0cyIsICJzZXR1cERlYnVnZ2luZyIsICJwb3B1cERlYnVnIiwgImNvbnNvbGUiLCAicG9wdXBzSW5zZXJ0SW1hZ2UiLCAiaW1hZ2VpbmZvIiwgImltYWdlcGFnZSIsICJ0aHVtYnVybCIsICJzcmMiLCAibWltZSIsICJkZXNjcmlwdGlvbnVybCIsICJ0b2dnbGVTaXplIiwgInRvZ2dsZVNpemUyIiwgImltZyIsICJmaXJzdENoaWxkIiwgIm1hdGNoZWQiLCAicmVtb3ZlTWF0Y2hlc1VubGVzcyIsICJyZTEiLCAicGFyZW5jb3VudCIsICJyZTIiLCAic2V0TmFtZXNwYWNlcyIsICJzZXRSZWRpcnMiLCAiUiIsICJyZWRpckxpc3RzIiwgImFyIiwgImJlIiwgImJnIiwgImJzIiwgImJuIiwgImNzIiwgImN5IiwgImRlIiwgImVvIiwgImVzIiwgImV0IiwgImdhIiwgImdsIiwgImhlIiwgImh1IiwgImlzIiwgIml0IiwgImphIiwgIm1rIiwgIm5kcyIsICJubCIsICJubiIsICJwbCIsICJwdCIsICJydSIsICJzayIsICJzciIsICJ0dCIsICJ1ayIsICJ2aSIsICJ5aSIsICJ6aCIsICJyZWRpckxpc3QiLCAic2V0SW50ZXJ3aWtpIiwgIndpa2ltZWRpYSIsICJuc1JlIiwgImltYWdlTmFtZXNwYWNlVmFyaWFudHMiLCAiX2kyIiwgIl9PYmplY3QkZW50cmllczIiLCAiX2xvY2FsaXplZE5hbWVzcGFjZUxjIiwgIl9uYW1lc3BhY2VJZCIsICJuc1JlSW1hZ2UiLCAiZ2V0RWRpdGJveFNlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiY3JlYXRlUmFuZ2UiLCAic2VsU3RhcnQiLCAic2VsZWN0aW9uU3RhcnQiLCAic2VsRW5kIiwgInNlbGVjdGlvbkVuZCIsICJzZWwiLCAicGlwZSIsICJkb1NlcGFyYXRlU2VsZWN0aW9uUG9wdXAiLCAiTW91c2V0cmFja2VyIiwgImxvb3BEZWxheSIsICJhY3RpdmUiLCAiaG9va3MiLCAicnVuSG9va3MiLCAicmVtb3ZlT2JqIiwgInJlbW92ZUhvb2tzIiwgIm5ld0hvb2tzIiwgInRyYWNrIiwgInBhZ2VYIiwgInBhZ2VZIiwgImRvY0VsdCIsICJkb2N1bWVudEVsZW1lbnQiLCAic2Nyb2xsTGVmdCIsICJzY3JvbGxUb3AiLCAic2V0UG9zaXRpb24iLCAibGFzdEhvb2tfeCIsICJsYXN0SG9va195IiwgImVuYWJsZSIsICJzYXZlZExpc3RlbmVyIiwgInVpZCIsICJub3Nob3ciLCAiY3JlYXRlIiwgInVuaGlkZSIsICJoaWRlIiwgImhvb2tJZHMiLCAiZG93bmxvYWRzIiwgImNvbnN0cmFpbmVkIiwgImhlaWdodCIsICJjcmVhdGVNYWluRGl2IiwgInJlcG9zaXRpb24iLCAibm9MaW1pdEhvciIsICJ0b29XaWRlIiwgInVwZGF0ZURpbWVuc2lvbnMiLCAiY1dpZHRoIiwgImNsaWVudFdpZHRoIiwgIm5hdHVyYWxXaWR0aCIsICJuZXdMZWZ0IiwgInJhaXNlIiwgInpJbmRleCIsICJoaWdoZXN0IiwgInNob3ciLCAidGltZSIsICJzdGFibGVfeCIsICJzdGFibGVfeSIsICJzdGFibGVTaG93IiwgIm5ld194IiwgIm5ld195IiwgImR4IiwgImR5IiwgImZ1enoyIiwgInNob3dTb29uU3RhYmxlVGltZXIiLCAia2V5SG9va3MiLCAiUmVmbGVjdCIsICJhcHBseSIsICJob29rIiwgImhvb2tJZCIsICJfdGhpcyRjbGFzc05hbWUiLCAib25jbGlja0xpc3RlbmVyIiwgInBvc2l0aW9uIiwgIm1pbldpZHRoIiwgImhhbmRsZU5hbWUiLCAic2hpZnRLZXkiLCAiYWJvcnREb3dubG9hZHMiLCAib2Zmc2V0SGVpZ2h0IiwgIl9pdGVyYXRvcjIwIiwgIl9zdGVwMjAiLCAiZGVsRm10IiwgImluc0ZtdCIsICJjb3VudENyb3NzaW5ncyIsICJlamVjdCIsICJyb3ciLCAiX2l0ZXJhdG9yMjEiLCAiX3N0ZXAyMSIsICJzaG9ydGVuRGlmZlN0cmluZyIsICJzaG9ydGVuRGlmZlN0cmluZzIiLCAiY29udGV4dCIsICJkaWZmU3RyaW5nIiwgIm9TcGxpdHRlZCIsICJuU3BsaXR0ZWQiLCAib3V0IiwgImFjYyIsICJtYXhPdXRwdXRQYWlyIiwgInBhaXJlZCIsICJqc1Jlc2VydmVkUHJvcGVydGllcyIsICJkaWZmQnVnQWxlcnQiLCAiZGlmZkJ1Z0FsZXJ0MiIsICJ3b3JkIiwgIm1ha2VEaWZmSGFzaHRhYmxlIiwgIm9zIiwgInNldFNpdGVJbmZvIiwgInBvcHVwTG9jYWxEZWJ1ZyIsICJob3N0bmFtZSIsICJ3aWtpYSIsICJpc0xvY2FsIiwgInN0YXJ0c1dpdGgiLCAiY29tbW9ucyIsICJwb3J0IiwgInNpdGViYXNlIiwgInNldFVzZXJJbmZvIiwgInVzdXNlcnMiLCAidXNwcm9wIiwgImNhblJldmlldyIsICJyaWdodHMiLCAiZmV0Y2hTcGVjaWFsUGFnZU5hbWVzIiwgImZvcm1hdCIsICJmb3JtYXR2ZXJzaW9uIiwgIm1heGFnZSIsICJtZXRhIiwgInNpcHJvcCIsICJ1c2VsYW5nIiwgInNwZWNpYWxwYWdlYWxpYXNlcyIsICJzZXRUaXRsZUJhc2UiLCAicHJvdG9jb2wiLCAiYm90SW50ZXJmYWNlUGF0aCIsICJBUElQYXRoIiwgInRpdGxldGFpbCIsICJ3aWtpYmFzZSIsICJzZXRNYWluUmVnZXgiLCAicmVTdGFydCIsICJwcmVUaXRsZXMiLCAicmVFbmQiLCAiYnVpbGRTcGVjaWFsUGFnZUdyb3VwIiwgInNwZWNpYWxQYWdlT2JqIiwgInZhcmlhbnRzIiwgInJlYWxuYW1lIiwgIl9pdGVyYXRvcjIyIiwgImFsaWFzZXMiLCAiX3N0ZXAyMiIsICJhbGlhcyIsICJzZXRSZWdleHBzIiwgIl9pdGVyYXRvcjIzIiwgIl9zdGVwMjMiLCAic3BlY2lhbHBhZ2UiLCAiaW0iLCAic2V0dXBDYWNoZSIsICJzZXRNaXNjIiwgImNsaWVudCIsICJzZXR1cFBvcHVwczIiLCAiY29tcGxldGVkIiwgInNldE9wdGlvbnMiLCAiZGVmYXVsdE5hdmxpbmtTcGVjIiwgIl9oaW50IiwgImV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyIsICJleHBhbmRDb25kaXRpb25hbE5hdmxpbmtTdHJpbmcyIiwgInJlY3Vyc2lvbkNvdW50IiwgImNvbmRpdGlvbmFsU3BsaXRSZWdleCIsICJudW1QYXJlbnMiLCAidGVzdFN0cmluZyIsICJ0cnVlU3RyaW5nIiwgImZhbHNlU3RyaW5nIiwgInRlc3RSZXN1bHQiLCAibmF2bGlua1N0cmluZ1RvQXJyYXkiLCAiX2l0ZXJhdG9yMjQiLCAiX3N0ZXAyNCIsICJuYXZsaW5rVGFnIiwgInNzIiwgInNzcyIsICJuYXZsaW5rU3Vic3RpdHV0ZUhUTUwiLCAibmF2bGlua0RlcHRoIiwgIm1hZ2ljIiwgIm1lbnVkZXB0aCIsICJtZW51cm93ZGVwdGgiLCAiX2l0ZXJhdG9yMjUiLCAiX3N0ZXAyNSIsICJnZXROZXdXaW4iLCAiZ2V0UHJpbnRGdW5jdGlvbiIsICJ0YWdUeXBlIiwgInByaW50IiwgInNob3J0Y3V0IiwgImFkZFBvcHVwU2hvcnRjdXQiLCAicG9wdXBMaW5rc05ld1dpbmRvdyIsICJuZXdXaW4iLCAibm9Qb3B1cCIsICJzcGVjaWFsTGluayIsICJtYWdpY1dhdGNoTGluayIsICJ0aXRsZWRXaWtpTGluayIsICJfcGckY3VycmVudCRsaW5rJG9yaWciLCAiYXJpbkxpbmsiLCAiZWRpdENvdW50ZXJMaW5rIiwgImVkaXRvckxpc3RMaW5rIiwgInRpdGxlZERpZmZMaW5rIiwgIm1hZ2ljSGlzdG9yeUxpbmsiLCAic2ltcGxlUG9wdXBzIiwgInBvcHVwTWVudUxpbmsiLCAicG9wdXBIYW5kbGVLZXlwcmVzcyIsICJwb3B1cEhhbmRsZUtleXByZXNzMiIsICJfZXZ0JGtleUNvZGUiLCAia2V5Q29kZSIsICJ3aGljaCIsICJsZXR0ZXIiLCAiZnJvbUNvZGVQb2ludCIsICJzdGFydExpbmsiLCAibGFzdFBvcHVwTGlua1NlbGVjdGVkIiwgInByZXZlbnREZWZhdWx0IiwgImZvY3VzIiwgIm9sZFBvcHVwT25rZXlwcmVzcyIsICJvbmtleXByZXNzIiwgImFkZExpbmtQcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJkaWZmRGF0YSIsICJvbGRSZXYiLCAibmV3UmV2IiwgImFwaTIiLCAiZnJvbXRpdGxlIiwgInRvcmVsYXRpdmUiLCAiZnJvbXJldiIsICJ0b3JldiIsICJjb21wYXJlIiwgImZyb21yZXZpZCIsICJ0b3JldmlkIiwgImFkZFJldmlld0xpbmsiLCAiZG9uZURpZmYiLCAicmV2aWRzIiwgInN0YWJsZV9yZXZpZCIsICJmbGFnZ2VkIiwgInBhcmFtczIiLCAicG9zdFdpdGhUb2tlbiIsICJmYWlsIiwgIl9pdGVyYXRvcjI2IiwgIl9zdGVwMjYiLCAiX2kzIiwgIl9yZXZpc2lvbnMiLCAicmV2aXNpb24iLCAiaW5zZXJ0RGlmZiIsICJybUJvcmluZ0xpbmVzIiwgImFhYSIsICJiYiIsICJiYmIiLCAic3RyaXBPdXRlckNvbW1vbkxpbmVzIiwgIm9sZGxpbmVzIiwgIm5ld2xpbmVzIiwgImlubmVyIiwgInRydW5jYXRlZCIsICJwb3B1cERpZmZNYXhMaW5lcyIsICJwb3B1cERpZmZDb250ZXh0TGluZXMiLCAibGluZURpZmYiLCAibGluZXMyIiwgIm9sZGxpbmVzMiIsICJuZXdsaW5lczIiLCAiZGlmZkRhdGVzVGFibGUiLCAiZGlmZkRhdGVzVGFibGVSb3ciLCAibGFiZWwiLCAibGFzdE1vZGlmaWVkRGF0ZSIsICJyZXZsaW5rIiwgImdlbmVyYWxMaW5rIiwgImFjdGlvbk5hbWUiLCAic2F2ZWRPbGRpZCIsICJvbGRpZERhdGEiLCAicmV2aXNpb25TdHJpbmciLCAicmV2ZXJ0U3VtbWFyeSIsICJiYXNlIiwgImNzc0NsYXNzIiwgImRlZmF1bHROYXZsaW5rQ2xhc3NuYW1lIiwgImdlbmVyYWxOYXZMaW5rIiwgImdldExhc3RDb250cmliIiwgIndpa2lwYWdlIiwgImdldEhpc3RvcnlJbmZvIiwgInByb2Nlc3NMYXN0Q29udHJpYkluZm8iLCAiZmlyc3ROZXdFZGl0b3IiLCAiZWRpdG9yIiwgIm5ld1VybCIsICJkaXNwbGF5VXJsIiwgImdldERpZmZTaW5jZU15RWRpdCIsICJwcm9jZXNzRGlmZlNpbmNlTXlFZGl0IiwgImZyaWVuZGx5TmFtZSIsICJteUxhc3RFZGl0IiwgInB1cmdlUG9wdXBzIiwgInByb2Nlc3NBbGxQb3B1cHMiLCAibnVsbGlmeSIsICJkaXNhYmxlUG9wdXBzIiwgInRvZ2dsZVByZXZpZXdzIiwgIm1hZ2ljV2F0Y2hMaW5rMiIsICJfcmVmIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgInJlcURhdGEiLCAidGl0bGVzIiwgInVud2F0Y2giLCAibXdUaXRsZSIsICJuZXdGcm9tVGV4dCIsICJtZXNzYWdlTmFtZSIsICJnZXROYW1lc3BhY2VJZCIsICJwYXJzZURvbSIsICJfeDIiLCAiX3gzIiwgImFyZ3VtZW50cyIsICJqc1VybCIsICJvbkNsaWNrIiwgImFwcGVuZFBhcmFtc1RvTGluayIsICJsaW5rc3RyIiwgImNBIiwgImNocyIsICJjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0IiwgImxrIiwgImFsc29DaGFuZ2VMYWJlbCIsICJzYW5lTGlua0NoZWNrIiwgInVOIiwgInRvb2xEYk5hbWUiLCAiY29va2llU3R5bGUiLCAidG9vbCIsICJkZWZhdWx0VG9vbFVybCIsICJ0aGVXaWtpIiwgIndoYXROZXh0IiwgImdldEhpc3RvcnkiLCAicHJvY2Vzc0hpc3RvcnkiLCAiX2l0ZXJhdG9yMjciLCAiX3N0ZXAyNyIsICJmaW5pc2hQcm9jZXNzSGlzdG9yeSIsICJoaXN0SW5mbyIsICJwcmV2aWQiLCAiZGVmYXVsdGl6ZSIsICJuZXdPcHRpb24iLCAiZGVmIiwgInZhck5hbWUiLCAidXNlcklzU3lzb3AiLCAiZyIsICJob3VyMTIiLCAiZWRpdENvdW50ZXJMaW5rSGludCIsICJhcmluIiwgIm9uIiwgIm9uY2UiLCAiZHluYW1pY0NvbnRlbnRIYW5kbGVyIiwgIiRjb250ZW50IiwgInJlZ2lzdGVySG9va3NGb3JWaXNpYmxlTmF2cG9wcyIsICJkb0l0IiwgImVhY2giLCAiX2luZGV4IiwgImFkZCIsICIkb3ZlcmxheSJdCn0K