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}
 * @source {@link https://github.com/TopRealm/YsArchives-Gadgets/tree/master/src/Navigation_popups}
 * @license CC-BY-SA-4.0 {@link https://youshou.wiki/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.1/node_modules/core-js/internals/global.js
var require_global = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/fails.js
var require_fails = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/descriptors.js
var require_descriptors = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/function-bind-native.js
var require_function_bind_native = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/function-call.js
var require_function_call = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/object-property-is-enumerable.js
var require_object_property_is_enumerable = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/create-property-descriptor.js
var require_create_property_descriptor = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/function-uncurry-this.js
var require_function_uncurry_this = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/classof-raw.js
var require_classof_raw = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/indexed-object.js
var require_indexed_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/is-null-or-undefined.js
var require_is_null_or_undefined = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/require-object-coercible.js
var require_require_object_coercible = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/to-indexed-object.js
var require_to_indexed_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/is-callable.js
var require_is_callable = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/is-object.js
var require_is_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/get-built-in.js
var require_get_built_in = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/object-is-prototype-of.js
var require_object_is_prototype_of = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/engine-user-agent.js
var require_engine_user_agent = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/engine-v8-version.js
var require_engine_v8_version = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/symbol-constructor-detection.js
var require_symbol_constructor_detection = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/use-symbol-as-uid.js
var require_use_symbol_as_uid = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/is-symbol.js
var require_is_symbol = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/try-to-string.js
var require_try_to_string = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/a-callable.js
var require_a_callable = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/get-method.js
var require_get_method = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/ordinary-to-primitive.js
var require_ordinary_to_primitive = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/is-pure.js
var require_is_pure = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/node_modules/core-js/internals/is-pure.js"(exports, module2) {
    "use strict";
    module2.exports = false;
  }
});

// node_modules/.pnpm/core-js@3.37.1/node_modules/core-js/internals/define-global-property.js
var require_define_global_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/shared-store.js
var require_shared_store = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1",
      mode: IS_PURE ? "pure" : "global",
      copyright: "© 2014-2024 Denis Pushkarev (zloirock.ru)",
      license: "https://github.com/zloirock/core-js/blob/v3.37.1/LICENSE",
      source: "https://github.com/zloirock/core-js"
    });
  }
});

// node_modules/.pnpm/core-js@3.37.1/node_modules/core-js/internals/shared.js
var require_shared = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/to-object.js
var require_to_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/has-own-property.js
var require_has_own_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/uid.js
var require_uid = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/well-known-symbol.js
var require_well_known_symbol = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/to-primitive.js
var require_to_primitive = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/to-property-key.js
var require_to_property_key = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/document-create-element.js
var require_document_create_element = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/ie8-dom-define.js
var require_ie8_dom_define = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/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.1/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.1/node_modules/core-js/internals/v8-prototype-define-bug.js
var require_v8_prototype_define_bug = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/an-object.js
var require_an_object = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/object-define-property.js
var require_object_define_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/create-non-enumerable-property.js
var require_create_non_enumerable_property = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/function-name.js
var require_function_name = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/inspect-source.js
var require_inspect_source = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/weak-map-basic-detection.js
var require_weak_map_basic_detection = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/shared-key.js
var require_shared_key = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/hidden-keys.js
var require_hidden_keys = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/node_modules/core-js/internals/hidden-keys.js"(exports, module2) {
    "use strict";
    module2.exports = {};
  }
});

// node_modules/.pnpm/core-js@3.37.1/node_modules/core-js/internals/internal-state.js
var require_internal_state = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/make-built-in.js
var require_make_built_in = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/define-built-in.js
var require_define_built_in = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/math-trunc.js
var require_math_trunc = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/to-integer-or-infinity.js
var require_to_integer_or_infinity = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/to-absolute-index.js
var require_to_absolute_index = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/to-length.js
var require_to_length = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/length-of-array-like.js
var require_length_of_array_like = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/array-includes.js
var require_array_includes = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/object-keys-internal.js
var require_object_keys_internal = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/enum-bug-keys.js
var require_enum_bug_keys = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/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.1/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.1/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.1/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.1/node_modules/core-js/internals/own-keys.js
var require_own_keys = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/copy-constructor-properties.js
var require_copy_constructor_properties = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/is-forced.js
var require_is_forced = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/export.js
var require_export = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/is-array.js
var require_is_array = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/array-set-length.js
var require_array_set_length = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/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.1/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.1/node_modules/core-js/modules/es.array.push.js
var require_es_array_push = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/delete-property-or-throw.js
var require_delete_property_or_throw = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/modules/es.array.unshift.js
var require_es_array_unshift = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/define-built-in-accessor.js
var require_define_built_in_accessor = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/internals/regexp-flags.js
var require_regexp_flags = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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.1/node_modules/core-js/modules/es.regexp.flags.js
var require_es_regexp_flags = __commonJS({
  "node_modules/.pnpm/core-js@3.37.1/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();
var _templateObject;
var _templateObject2;
var _templateObject3;
var _templateObject4;
var _templateObject5;
var _templateObject6;
var _templateObject7;
var _templateObject8;
var _templateObject9;
var _templateObject10;
var _templateObject11;
var _templateObject12;
var _templateObject13;
function asyncGeneratorStep(n, t, e, r, o, a, c) {
  try {
    var i = n[a](c), u = i.value;
  } catch (n2) {
    return void e(n2);
  }
  i.done ? t(u) : Promise.resolve(u).then(r, o);
}
function _asyncToGenerator(n) {
  return function() {
    var t = this, e = arguments;
    return new Promise(function(r, o) {
      var a = n.apply(t, e);
      function _next(n2) {
        asyncGeneratorStep(a, r, o, _next, _throw, "next", n2);
      }
      function _throw(n2) {
        asyncGeneratorStep(a, r, o, _next, _throw, "throw", n2);
      }
      _next(void 0);
    });
  };
}
function _createForOfIteratorHelper(r, e) {
  var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
  if (!t) {
    if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
      t && (r = t);
      var n = 0, F = function() {
      };
      return { s: F, n: function() {
        return n >= r.length ? { done: true } : { done: false, value: r[n++] };
      }, e: function(r2) {
        throw r2;
      }, 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 o, a = true, u = false;
  return { s: function() {
    t = t.call(r);
  }, n: function() {
    var r2 = t.next();
    return a = r2.done, r2;
  }, e: function(r2) {
    u = true, o = r2;
  }, f: function() {
    try {
      a || null == t.return || t.return();
    } finally {
      if (u) throw o;
    }
  } };
}
function _unsupportedIterableToArray(r, a) {
  if (r) {
    if ("string" == typeof r) return _arrayLikeToArray(r, a);
    var t = {}.toString.call(r).slice(8, -1);
    return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
  }
}
function _arrayLikeToArray(r, a) {
  (null == a || a > r.length) && (a = r.length);
  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
  return n;
}
function _taggedTemplateLiteral(e, t) {
  return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } }));
}
//! src/Navigation_popups/modules/core.js
var import_ext_gadget = require("ext.gadget.Util");
//! src/Navigation_popups/modules/string.ts
var popupStrings = {
  // 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(String.raw(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n"], ["\\n"])))).join(String.raw(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["<br>\n"], ["<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(String.raw(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n"], ["\\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 {
        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://youshou.wiki/images/",
        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 = "Youshou Archives 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) {
        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 = () => {
      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") {
      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) {
      mw.notify("self is null :/", {
        tag: "popups",
        type: "error"
      });
      return;
    }
    const img = self2.firstChild;
    if (!img) {
      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;
      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, ": *([^|\\]]*[^|\\] ])").concat(String.raw(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["([^0-9]]*([0-9]+) *px)?|(?:\n *[|]?|[|]) *"], ["([^0-9\\]]*([0-9]+) *px)?|(?:\\n *[|]?|[|]) *"]))), "(").concat(getValueOf("popupImageVarsRegexp"), ") *= *(?:\\[\\[ *)?(?:").concat(im, ":)?").concat(String.raw(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["([^|]*?)(?:]])? *[|]? *\n"], ["([^|]*?)(?:\\]\\])? *[|]? *\\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 (".concat(mw.config.get("wgWikiID"), ")");
      pg.api.client = (0, import_ext_gadget.initMwApi)(pg.api.userAgent);
    }
    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 api = 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;
    }
    api.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(() => {
            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) {
      mw.notify("Popups: an odd thing happened. Please retry.", {
        tag: "popups",
        type: "error"
      });
      return;
    }
    if (!info.firstNewEditor) {
      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) {
      mw.notify("Popups: something fishy happened. Please try again.", {
        tag: "popups",
        type: "error"
      });
      return;
    }
    const friendlyName = stuff.page.split("_").join(" ");
    if (!info.myLastEdit) {
      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) {
      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(String.raw(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["'"], ["\\'"])))), 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]);
      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(String.raw(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["'"], ["\\'"])))), l.newWin]);
        title = popupString("lastContribHint");
        break;
      case "sinceMe":
        onClick = simplePrintf("pg.fn.getDiffSinceMyEdit('%s',%s)", [l.article.toString(true).split("\\").join("\\\\").split("'").join(String.raw(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["'"], ["\\'"])))), 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(String.raw(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["("], ["\\("])))).join(String.raw(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["(?:%28|()"], ["(?:%28|\\()"])))).split(String.raw(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral([")"], ["\\)"])))).join(String.raw(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["(?:%29|))"], ["(?:%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", String.raw(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["{{s*(d(ab|isamb(ig(uation)?)?)|(((geo|hn|road?|school|number)dis)|[234][lc][acw]|(road|ship)index))s*(|[^}]*)?}}|is a .*disambiguation.*page"], ["\\{\\{\\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 (popupStrings !== void 0 && popupStrings && popupStrings[str]) {
      return popupStrings[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.js
$(popups);

})();

/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXRydW5jLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2hpZnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmZsYWdzLmpzIiwgInNyYy9OYXZpZ2F0aW9uX3BvcHVwcy9tb2R1bGVzL2NvcmUuanMiLCAic3JjL05hdmlnYXRpb25fcG9wdXBzL21vZHVsZXMvc3RyaW5nLnRzIiwgInNyYy9OYXZpZ2F0aW9uX3BvcHVwcy9OYXZpZ2F0aW9uX3BvcHVwcy5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAmJiBpdC5NYXRoID09PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgY2hlY2sodHlwZW9mIHRoaXMgPT0gJ29iamVjdCcgJiYgdGhpcykgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPT0gNztcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IGNhbGwuYmluZChjYWxsKSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoY2FsbCwgYXJndW1lbnRzKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xudmFyIHVuY3VycnlUaGlzV2l0aEJpbmQgPSBOQVRJVkVfQklORCAmJiBGdW5jdGlvblByb3RvdHlwZS5iaW5kLmJpbmQoY2FsbCwgY2FsbCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyB1bmN1cnJ5VGhpc1dpdGhCaW5kIDogZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGwuYXBwbHkoZm4sIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoe30udG9TdHJpbmcpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgc3BsaXQgPSB1bmN1cnJ5VGhpcygnJy5zcGxpdCk7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICEkT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gd2UgY2FuJ3QgdXNlIGp1c3QgYGl0ID09IG51bGxgIHNpbmNlIG9mIGBkb2N1bWVudC5hbGxgIHNwZWNpYWwgY2FzZVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1Jc0hUTUxEREEtaW50ZXJuYWwtc2xvdC1hZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gbnVsbCB8fCBpdCA9PT0gdW5kZWZpbmVkO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG4vLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3RcbnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7XG5cbi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdHlwZW9mLXVuZGVmaW5lZCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgZG9jdW1lbnRBbGwgPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnRBbGwgIT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbicgfHwgYXJndW1lbnQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbic7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IGlzQ2FsbGFibGUoaXQpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNDYWxsYWJsZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSkgOiBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgbmF2aWdhdG9yICE9ICd1bmRlZmluZWQnICYmIFN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCAnJztcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERlbm8gPSBnbG9iYWwuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICAvLyBpbiBvbGQgQ2hyb21lLCB2ZXJzaW9ucyBvZiBWOCBpc24ndCBWOCA9IENocm9tZSAvIDEwXG4gIC8vIGJ1dCB0aGVpciBjb3JyZWN0IHZlcnNpb25zIGFyZSBub3QgaW50ZXJlc3RpbmcgZm9yIHVzXG4gIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5cbi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYFxuLy8gc28gY2hlY2sgYHVzZXJBZ2VudGAgZXZlbiBpZiBgLnY4YCBleGlzdHMsIGJ1dCAwXG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gK21hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbjtcbiIsICIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciAkU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBTeW1ib2woJ3N5bWJvbCBkZXRlY3Rpb24nKTtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gYGdldC1vd24tcHJvcGVydHktc3ltYm9sc2AgcG9seWZpbGwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gb2JqZWN0IGFyZSBub3QgU3ltYm9sIGluc3RhbmNlc1xuICAvLyBuYjogRG8gbm90IGNhbGwgYFN0cmluZ2AgZGlyZWN0bHkgdG8gYXZvaWQgdGhpcyBiZWluZyBvcHRpbWl6ZWQgb3V0IHRvIGBzeW1ib2wrJydgIHdoaWNoIHdpbGwsXG4gIC8vIG9mIGNvdXJzZSwgZmFpbC5cbiAgcmV0dXJuICEkU3RyaW5nKHN5bWJvbCkgfHwgIShPYmplY3Qoc3ltYm9sKSBpbnN0YW5jZW9mIFN5bWJvbCkgfHxcbiAgICAvLyBDaHJvbWUgMzgtNDAgc3ltYm9scyBhcmUgbm90IGluaGVyaXRlZCBmcm9tIERPTSBjb2xsZWN0aW9ucyBwcm90b3R5cGVzIHRvIGluc3RhbmNlc1xuICAgICFTeW1ib2wuc2hhbSAmJiBWOF9WRVJTSU9OICYmIFY4X1ZFUlNJT04gPCA0MTtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0xcbiAgJiYgIVN5bWJvbC5zaGFtXG4gICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVTRV9TWU1CT0xfQVNfVUlEID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciAkU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG4gIHJldHVybiBpc0NhbGxhYmxlKCRTeW1ib2wpICYmIGlzUHJvdG90eXBlT2YoJFN5bWJvbC5wcm90b3R5cGUsICRPYmplY3QoaXQpKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYE9yZGluYXJ5VG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKHByZWYgPT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChpc0NhbGxhYmxlKGZuID0gaW5wdXQudmFsdWVPZikgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChwcmVmICE9PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbCwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZGVmaW5lR2xvYmFsUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eScpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbFRoaXNbU0hBUkVEXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShTSEFSRUQsIHt9KTtcblxuKHN0b3JlLnZlcnNpb25zIHx8IChzdG9yZS52ZXJzaW9ucyA9IFtdKSkucHVzaCh7XG4gIHZlcnNpb246ICczLjM3LjEnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTQtMjAyNCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScsXG4gIGxpY2Vuc2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjM3LjEvTElDRU5TRScsXG4gIHNvdXJjZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzJ1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgfHwge30pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gJE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gdW5jdXJyeVRoaXMoe30uaGFzT3duUHJvcGVydHkpO1xuXG4vLyBgSGFzT3duUHJvcGVydHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1oYXNvd25wcm9wZXJ0eVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1oYXNvd24gLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaGFzT3duIHx8IGZ1bmN0aW9uIGhhc093bihpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eSh0b09iamVjdChpdCksIGtleSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKDEuMC50b1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArIHRvU3RyaW5nKCsraWQgKyBwb3N0Zml4LCAzNik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2xbJ2ZvciddIHx8IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgaGFzT3duKFN5bWJvbCwgbmFtZSlcbiAgICAgID8gU3ltYm9sW25hbWVdXG4gICAgICA6IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTtcbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbiAgfVxuICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ251bWJlcic7XG4gIHJldHVybiBvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBwcmVmKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmtzIHRvIElFOCBmb3IgaXRzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9PSA3O1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhc093bihPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLCBPLCBQKSwgT1tQXSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFY4IH4gQ2hyb21lIDM2LVxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNFxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7XG4gICAgdmFsdWU6IDQyLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KS5wcm90b3R5cGUgIT09IDQyO1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKCRTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBFTlVNRVJBQkxFID0gJ2VudW1lcmFibGUnO1xudmFyIENPTkZJR1VSQUJMRSA9ICdjb25maWd1cmFibGUnO1xudmFyIFdSSVRBQkxFID0gJ3dyaXRhYmxlJztcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA/IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKHR5cGVvZiBPID09PSAnZnVuY3Rpb24nICYmIFAgPT09ICdwcm90b3R5cGUnICYmICd2YWx1ZScgaW4gQXR0cmlidXRlcyAmJiBXUklUQUJMRSBpbiBBdHRyaWJ1dGVzICYmICFBdHRyaWJ1dGVzW1dSSVRBQkxFXSkge1xuICAgIHZhciBjdXJyZW50ID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50W1dSSVRBQkxFXSkge1xuICAgICAgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gICAgICBBdHRyaWJ1dGVzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IENPTkZJR1VSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tDT05GSUdVUkFCTEVdIDogY3VycmVudFtDT05GSUdVUkFCTEVdLFxuICAgICAgICBlbnVtZXJhYmxlOiBFTlVNRVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0VOVU1FUkFCTEVdIDogY3VycmVudFtFTlVNRVJBQkxFXSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfSByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xufSA6ICRkZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHVuY3VycnlUaGlzKEZ1bmN0aW9uLnRvU3RyaW5nKTtcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGBjb3JlLWpzQDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlclxuaWYgKCFpc0NhbGxhYmxlKHN0b3JlLmluc3BlY3RTb3VyY2UpKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZyhpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0NhbGxhYmxlKFdlYWtNYXApICYmIC9uYXRpdmUgY29kZS8udGVzdChTdHJpbmcoV2Vha01hcCkpO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQIHx8IHNoYXJlZC5zdGF0ZSkge1xuICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpO1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1zZWxmLWFzc2lnbiAtLSBwcm90b3R5cGUgbWV0aG9kcyBwcm90ZWN0aW9uICovXG4gIHN0b3JlLmdldCA9IHN0b3JlLmdldDtcbiAgc3RvcmUuaGFzID0gc3RvcmUuaGFzO1xuICBzdG9yZS5zZXQgPSBzdG9yZS5zZXQ7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHN0b3JlLmhhcyhpdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHN0b3JlLnNldChpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldChpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5oYXMoaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUnKS5DT05GSUdVUkFCTEU7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcblxudmFyIENPTkZJR1VSQUJMRV9MRU5HVEggPSBERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAnbGVuZ3RoJywgeyB2YWx1ZTogOCB9KS5sZW5ndGggIT09IDg7XG59KTtcblxudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG52YXIgbWFrZUJ1aWx0SW4gPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSwgb3B0aW9ucykge1xuICBpZiAoc3RyaW5nU2xpY2UoJFN0cmluZyhuYW1lKSwgMCwgNykgPT09ICdTeW1ib2woJykge1xuICAgIG5hbWUgPSAnWycgKyByZXBsYWNlKCRTdHJpbmcobmFtZSksIC9eU3ltYm9sXFwoKFteKV0qKVxcKS4qJC8sICckMScpICsgJ10nO1xuICB9XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZ2V0dGVyKSBuYW1lID0gJ2dldCAnICsgbmFtZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXR0ZXIpIG5hbWUgPSAnc2V0ICcgKyBuYW1lO1xuICBpZiAoIWhhc093bih2YWx1ZSwgJ25hbWUnKSB8fCAoQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgJiYgdmFsdWUubmFtZSAhPT0gbmFtZSkpIHtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICBlbHNlIHZhbHVlLm5hbWUgPSBuYW1lO1xuICB9XG4gIGlmIChDT05GSUdVUkFCTEVfTEVOR1RIICYmIG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsICdhcml0eScpICYmIHZhbHVlLmxlbmd0aCAhPT0gb3B0aW9ucy5hcml0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KHZhbHVlLCAnbGVuZ3RoJywgeyB2YWx1ZTogb3B0aW9ucy5hcml0eSB9KTtcbiAgfVxuICB0cnkge1xuICAgIGlmIChvcHRpb25zICYmIGhhc093bihvcHRpb25zLCAnY29uc3RydWN0b3InKSAmJiBvcHRpb25zLmNvbnN0cnVjdG9yKSB7XG4gICAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KHZhbHVlLCAncHJvdG90eXBlJywgeyB3cml0YWJsZTogZmFsc2UgfSk7XG4gICAgLy8gaW4gVjggfiBDaHJvbWUgNTMsIHByb3RvdHlwZXMgb2Ygc29tZSBtZXRob2RzLCBsaWtlIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCwgYXJlIG5vbi13cml0YWJsZVxuICAgIH0gZWxzZSBpZiAodmFsdWUucHJvdG90eXBlKSB2YWx1ZS5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpO1xuICBpZiAoIWhhc093bihzdGF0ZSwgJ3NvdXJjZScpKSB7XG4gICAgc3RhdGUuc291cmNlID0gam9pbihURU1QTEFURSwgdHlwZW9mIG5hbWUgPT0gJ3N0cmluZycgPyBuYW1lIDogJycpO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG5cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dGVuZC1uYXRpdmUgLS0gcmVxdWlyZWRcbkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IG1ha2VCdWlsdEluKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gaXNDYWxsYWJsZSh0aGlzKSAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpO1xufSwgJ3RvU3RyaW5nJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgbWFrZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbicpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMuZW51bWVyYWJsZTtcbiAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgaWYgKGlzQ2FsbGFibGUodmFsdWUpKSBtYWtlQnVpbHRJbih2YWx1ZSwgbmFtZSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lR2xvYmFsUHJvcGVydHkoa2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3B0aW9ucy51bnNhZmUpIGRlbGV0ZSBPW2tleV07XG4gICAgICBlbHNlIGlmIChPW2tleV0pIHNpbXBsZSA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiAhb3B0aW9ucy5ub25Db25maWd1cmFibGUsXG4gICAgICB3cml0YWJsZTogIW9wdGlvbnMubm9uV3JpdGFibGVcbiAgICB9KTtcbiAgfSByZXR1cm4gTztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgTWF0aC50cnVuY2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hdGgudHJ1bmNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXRoLXRydW5jIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiB0cnVuYyh4KSB7XG4gIHZhciBuID0gK3g7XG4gIHJldHVybiAobiA+IDAgPyBmbG9vciA6IGNlaWwpKG4pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdHJ1bmMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWF0aC10cnVuYycpO1xuXG4vLyBgVG9JbnRlZ2VyT3JJbmZpbml0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvaW50ZWdlcm9yaW5maW5pdHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBudW1iZXIgPSArYXJndW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gIHJldHVybiBudW1iZXIgIT09IG51bWJlciB8fCBudW1iZXIgPT09IDAgPyAwIDogdHJ1bmMobnVtYmVyKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGxlbiA9IHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpO1xuICByZXR1cm4gbGVuID4gMCA/IG1pbihsZW4sIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBMZW5ndGhPZkFycmF5TGlrZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWxlbmd0aG9mYXJyYXlsaWtlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRvTGVuZ3RoKG9iai5sZW5ndGgpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT09IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzT3duKGhpZGRlbktleXMsIGtleSkgJiYgaGFzT3duKE8sIGtleSkgJiYgcHVzaChyZXN1bHQsIGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXNPd24oTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcHVzaChyZXN1bHQsIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQoa2V5cywgZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlLCBleGNlcHRpb25zKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzT3duKHRhcmdldCwga2V5KSAmJiAhKGV4Y2VwdGlvbnMgJiYgaGFzT3duKGV4Y2VwdGlvbnMsIGtleSkpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgfVxuICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIHJlcGxhY2VtZW50ID0gLyN8XFwucHJvdG90eXBlXFwuLztcblxudmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikge1xuICB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07XG4gIHJldHVybiB2YWx1ZSA9PT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IGlzQ2FsbGFibGUoZGV0ZWN0aW9uKSA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgICAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLmRvbnRDYWxsR2V0U2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuICBvcHRpb25zLm5hbWUgICAgICAgICAgIC0gdGhlIC5uYW1lIG9mIHRoZSBmdW5jdGlvbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUga2V5XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IGRlZmluZUdsb2JhbFByb3BlcnR5KFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdICYmIGdsb2JhbFtUQVJHRVRdLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIGRlZmluZUJ1aWx0SW4odGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ0FycmF5Jztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBTYWZhcmkgPCAxMyBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpbiB0aGlzIGNhc2VcbnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhZnVuY3Rpb24gKCkge1xuICAvLyBtYWtlcyBubyBzZW5zZSB3aXRob3V0IHByb3BlciBzdHJpY3QgbW9kZSBzdXBwb3J0XG4gIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwgJ2xlbmd0aCcsIHsgd3JpdGFibGU6IGZhbHNlIH0pLmxlbmd0aCA9IDE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID8gZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICBpZiAoaXNBcnJheShPKSAmJiAhZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sICdsZW5ndGgnKS53cml0YWJsZSkge1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3Qgc2V0IHJlYWQgb25seSAubGVuZ3RoJyk7XG4gIH0gcmV0dXJuIE8ubGVuZ3RoID0gbGVuZ3RoO1xufSA6IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgcmV0dXJuIE8ubGVuZ3RoID0gbGVuZ3RoO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyAkVHlwZUVycm9yKCdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGgnKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBJTkNPUlJFQ1RfVE9fTEVOR1RIID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW10ucHVzaC5jYWxsKHsgbGVuZ3RoOiAweDEwMDAwMDAwMCB9LCAxKSAhPT0gNDI5NDk2NzI5Nztcbn0pO1xuXG4vLyBWOCA8PSAxMjEgYW5kIFNhZmFyaSA8PSAxNS40OyBGRiA8IDIzIHRocm93cyBJbnRlcm5hbEVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjY4MVxudmFyIHByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5wdXNoKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59O1xuXG52YXIgRk9SQ0VEID0gSU5DT1JSRUNUX1RPX0xFTkdUSCB8fCAhcHJvcGVyRXJyb3JPbk5vbldyaXRhYmxlTGVuZ3RoKCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUucHVzaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5wdXNoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgcHVzaDogZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgYXJnQ291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykge1xuICAgICAgT1tsZW5dID0gYXJndW1lbnRzW2ldO1xuICAgICAgbGVuKys7XG4gICAgfVxuICAgIHNldEFycmF5TGVuZ3RoKE8sIGxlbik7XG4gICAgcmV0dXJuIGxlbjtcbiAgfVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIFApIHtcbiAgaWYgKCFkZWxldGUgT1tQXSkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBkZWxldGUgcHJvcGVydHkgJyArIHRyeVRvU3RyaW5nKFApICsgJyBvZiAnICsgdHJ5VG9TdHJpbmcoTykpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGgnKTtcbnZhciBkZWxldGVQcm9wZXJ0eU9yVGhyb3cgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93Jyk7XG52YXIgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXInKTtcblxuLy8gSUU4LVxudmFyIElOQ09SUkVDVF9SRVNVTFQgPSBbXS51bnNoaWZ0KDApICE9PSAxO1xuXG4vLyBWOCB+IENocm9tZSA8IDcxIGFuZCBTYWZhcmkgPD0gMTUuNCwgRkYgPCAyMyB0aHJvd3MgSW50ZXJuYWxFcnJvclxudmFyIHByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS51bnNoaWZ0KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59O1xuXG52YXIgRk9SQ0VEID0gSU5DT1JSRUNUX1JFU1VMVCB8fCAhcHJvcGVyRXJyb3JPbk5vbldyaXRhYmxlTGVuZ3RoKCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUudW5zaGlmdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS51bnNoaWZ0XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdW5zaGlmdDogZnVuY3Rpb24gdW5zaGlmdChpdGVtKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAoYXJnQ291bnQpIHtcbiAgICAgIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlcihsZW4gKyBhcmdDb3VudCk7XG4gICAgICB2YXIgayA9IGxlbjtcbiAgICAgIHdoaWxlIChrLS0pIHtcbiAgICAgICAgdmFyIHRvID0gayArIGFyZ0NvdW50O1xuICAgICAgICBpZiAoayBpbiBPKSBPW3RvXSA9IE9ba107XG4gICAgICAgIGVsc2UgZGVsZXRlUHJvcGVydHlPclRocm93KE8sIHRvKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXJnQ291bnQ7IGorKykge1xuICAgICAgICBPW2pdID0gYXJndW1lbnRzW2pdO1xuICAgICAgfVxuICAgIH0gcmV0dXJuIHNldEFycmF5TGVuZ3RoKE8sIGxlbiArIGFyZ0NvdW50KTtcbiAgfVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIG1ha2VCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcikge1xuICBpZiAoZGVzY3JpcHRvci5nZXQpIG1ha2VCdWlsdEluKGRlc2NyaXB0b3IuZ2V0LCBuYW1lLCB7IGdldHRlcjogdHJ1ZSB9KTtcbiAgaWYgKGRlc2NyaXB0b3Iuc2V0KSBtYWtlQnVpbHRJbihkZXNjcmlwdG9yLnNldCwgbmFtZSwgeyBzZXR0ZXI6IHRydWUgfSk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eS5mKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NgIGdldHRlciBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtcmVnZXhwLnByb3RvdHlwZS5mbGFnc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKHRoYXQuaGFzSW5kaWNlcykgcmVzdWx0ICs9ICdkJztcbiAgaWYgKHRoYXQuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZiAodGhhdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmICh0aGF0LmRvdEFsbCkgcmVzdWx0ICs9ICdzJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQudW5pY29kZVNldHMpIHJlc3VsdCArPSAndic7XG4gIGlmICh0aGF0LnN0aWNreSkgcmVzdWx0ICs9ICd5JztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3InKTtcbnZhciByZWdFeHBGbGFncyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBiYWJlbC1taW5pZnkgYW5kIENsb3N1cmUgQ29tcGlsZXIgdHJhbnNwaWxlcyBSZWdFeHAoJy4nLCAnZCcpIC0+IC8uL2QgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyIFJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcblxudmFyIEZPUkNFRCA9IERFU0NSSVBUT1JTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIElORElDRVNfU1VQUE9SVCA9IHRydWU7XG4gIHRyeSB7XG4gICAgUmVnRXhwKCcuJywgJ2QnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBJTkRJQ0VTX1NVUFBPUlQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBPID0ge307XG4gIC8vIG1vZGVybiBWOCBidWdcbiAgdmFyIGNhbGxzID0gJyc7XG4gIHZhciBleHBlY3RlZCA9IElORElDRVNfU1VQUE9SVCA/ICdkZ2ltc3knIDogJ2dpbXN5JztcblxuICB2YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24gKGtleSwgY2hyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxzICs9IGNocjtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gfSk7XG4gIH07XG5cbiAgdmFyIHBhaXJzID0ge1xuICAgIGRvdEFsbDogJ3MnLFxuICAgIGdsb2JhbDogJ2cnLFxuICAgIGlnbm9yZUNhc2U6ICdpJyxcbiAgICBtdWx0aWxpbmU6ICdtJyxcbiAgICBzdGlja3k6ICd5J1xuICB9O1xuXG4gIGlmIChJTkRJQ0VTX1NVUFBPUlQpIHBhaXJzLmhhc0luZGljZXMgPSAnZCc7XG5cbiAgZm9yICh2YXIga2V5IGluIHBhaXJzKSBhZGRHZXR0ZXIoa2V5LCBwYWlyc1trZXldKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG4gIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFJlZ0V4cFByb3RvdHlwZSwgJ2ZsYWdzJykuZ2V0LmNhbGwoTyk7XG5cbiAgcmV0dXJuIHJlc3VsdCAhPT0gZXhwZWN0ZWQgfHwgY2FsbHMgIT09IGV4cGVjdGVkO1xufSk7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3NcbmlmIChGT1JDRUQpIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihSZWdFeHBQcm90b3R5cGUsICdmbGFncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IHJlZ0V4cEZsYWdzXG59KTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IHtpbml0TXdBcGl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5pbXBvcnQge3BvcHVwU3RyaW5nc30gZnJvbSAnLi9zdHJpbmcnO1xuXG5leHBvcnQgY29uc3QgcG9wdXBzID0gKCkgPT4ge1xuXHQvLyBTVEFSVEZJTEU6IG1haW4uanNcblx0Ly8gRml4IGxhdGVyXG5cdC8vIEdsb2JhbHNcblx0Ly9cblx0Ly8gVHJ5aW5nIHRvIHNob3ZlIGFzIG1hbnkgb2YgdGhlc2UgYXMgcG9zc2libGUgaW50byB0aGUgcGcgKHBvcHVwIGdsb2JhbHMpIG9iamVjdFxuXHRjb25zdCBwZyA9IHtcblx0XHRhcGk6IHt9LFxuXHRcdHJlOiB7fSxcblx0XHRuczoge30sXG5cdFx0c3RyaW5nOiB7fSxcblx0XHR3aWtpOiB7fSxcblx0XHR1c2VyOiB7fSxcblx0XHRtaXNjOiB7fSxcblx0XHRvcHRpb246IHt9LFxuXHRcdG9wdGlvbkRlZmF1bHQ6IHt9LFxuXHRcdGZsYWc6IHt9LFxuXHRcdGNhY2hlOiB7fSxcblx0XHRzdHJ1Y3R1cmVzOiB7fSxcblx0XHR0aW1lcjoge30sXG5cdFx0Y291bnRlcjoge30sXG5cdFx0Y3VycmVudDoge30sXG5cdFx0Zm46IHt9LFxuXHRcdGVuZG9mbGlzdDogbnVsbCxcblx0fTtcblx0LyogQmFpbCBpZiB0aGUgZ2FkZ2V0L3NjcmlwdCBpcyBiZWluZyBsb2FkZWQgdHdpY2UgKi9cblx0LyogQW4gZWxlbWVudCB3aXRoIGlkIFwicGdcIiB3b3VsZCBhZGQgYSB3aW5kb3cucGcgcHJvcGVydHksIGlnbm9yZSBzdWNoIHByb3BlcnR5ICovXG5cdGlmICh3aW5kb3cucGcgJiYgISh3aW5kb3cucGcgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0LyogRXhwb3J0IHRvIGdsb2JhbCBjb250ZXh0ICovXG5cdHdpbmRvdy5wZyA9IHBnO1xuXHQvLyBFTkRGSUxFOiBtYWluLmpzXG5cdC8vIFNUQVJURklMRTogYWN0aW9ucy5qc1xuXHRjb25zdCBzZXR1cFRvb2x0aXBzID0gKGNvbnRhaW5lciwgcmVtb3ZlLCBmb3JjZSwgcG9wRGF0YSkgPT4ge1xuXHRcdGxvZyhgc2V0dXBUb29sdGlwcywgY29udGFpbmVyPSR7Y29udGFpbmVyfSwgcmVtb3ZlPSR7cmVtb3ZlfWApO1xuXHRcdGlmICghY29udGFpbmVyKSB7XG5cdFx0XHQvLyB0aGUgbWFpbiBpbml0aWFsIGNhbGxcblx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cE9uRWRpdFNlbGVjdGlvbicpICYmIGRvY3VtZW50ICYmIGRvY3VtZW50LmVkaXRmb3JtICYmIGRvY3VtZW50LmVkaXRmb3JtLndwVGV4dGJveDEpIHtcblx0XHRcdFx0ZG9jdW1lbnQuZWRpdGZvcm0ud3BUZXh0Ym94MS5vbm1vdXNldXAgPSBkb1NlbGVjdGlvblBvcHVwO1xuXHRcdFx0fVxuXHRcdFx0Ly8gYXJ0aWNsZS9jb250ZW50IGlzIGEgc3RydWN0dXJlLWRlcGVuZGVudCB0aGluZ1xuXHRcdFx0Y29udGFpbmVyID0gZGVmYXVsdFBvcHVwc0NvbnRhaW5lcigpO1xuXHRcdH1cblx0XHRpZiAoIXJlbW92ZSAmJiAhZm9yY2UgJiYgY29udGFpbmVyLnJhblNldHVwVG9vbHRpcHNBbHJlYWR5KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnRhaW5lci5yYW5TZXR1cFRvb2x0aXBzQWxyZWFkeSA9ICFyZW1vdmU7XG5cdFx0Y29uc3QgYW5jaG9ycyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdhJyk7XG5cdFx0c2V0dXBUb29sdGlwc0xvb3AoYW5jaG9ycywgMCwgMjUwLCAxMDAsIHJlbW92ZSwgcG9wRGF0YSk7XG5cdH07XG5cdGNvbnN0IGRlZmF1bHRQb3B1cHNDb250YWluZXIgPSAoKSA9PiB7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwT25seUFydGljbGVMaW5rcycpKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2tpbi12ZWN0b3ItMjAyMiAudmVjdG9yLWJvZHknKSB8fFxuXHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdfY29udGVudCcpIHx8XG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50JykgfHxcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FydGljbGUnKSB8fFxuXHRcdFx0XHRkb2N1bWVudFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9O1xuXHRjb25zdCBzZXR1cFRvb2x0aXBzTG9vcCA9IGZ1bmN0aW9uIHNldHVwVG9vbHRpcHNMb29wKGFuY2hvcnMsIGJlZ2luLCBob3dtYW55LCBzbGVlcCwgcmVtb3ZlLCBwb3BEYXRhLCAuLi5hcmdzKSB7XG5cdFx0bG9nKFxuXHRcdFx0c2ltcGxlUHJpbnRmKCdzZXR1cFRvb2x0aXBzTG9vcCglcywlcywlcywlcywlcyknLCBbXG5cdFx0XHRcdGFuY2hvcnMsXG5cdFx0XHRcdGJlZ2luLFxuXHRcdFx0XHRob3dtYW55LFxuXHRcdFx0XHRzbGVlcCxcblx0XHRcdFx0cmVtb3ZlLFxuXHRcdFx0XHRwb3BEYXRhLFxuXHRcdFx0XHQuLi5hcmdzLFxuXHRcdFx0XSlcblx0XHQpO1xuXHRcdGNvbnN0IGZpbmlzaCA9IGJlZ2luICsgaG93bWFueTtcblx0XHRjb25zdCBsb29wZW5kID0gTWF0aC5taW4oZmluaXNoLCBhbmNob3JzLmxlbmd0aCk7XG5cdFx0bGV0IGogPSBsb29wZW5kIC0gYmVnaW47XG5cdFx0bG9nKFxuXHRcdFx0YHNldHVwVG9vbHRpcHM6IGFuY2hvcnMubGVuZ3RoPSR7YW5jaG9ycy5sZW5ndGh9LCBiZWdpbj0ke2JlZ2lufSwgaG93bWFueT0ke2hvd21hbnl9LCBsb29wZW5kPSR7bG9vcGVuZH0sIHJlbW92ZT0ke3JlbW92ZX1gXG5cdFx0KTtcblx0XHRjb25zdCBkb1Rvb2x0aXAgPSByZW1vdmUgPyByZW1vdmVUb29sdGlwIDogYWRkVG9vbHRpcDtcblx0XHQvLyB0cnkgYSBmYXN0ZXIgKD8pIGxvb3AgY29uc3RydWN0XG5cdFx0aWYgKGogPiAwKSB7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdGNvbnN0IGEgPSBhbmNob3JzW2xvb3BlbmQgLSBqXTtcblx0XHRcdFx0aWYgKGEgPT09IHVuZGVmaW5lZCB8fCAhYSB8fCAhYS5ocmVmKSB7XG5cdFx0XHRcdFx0bG9nKGBnb3QgbnVsbCBhbmNob3IgYXQgaW5kZXggJHtsb29wZW5kfWAgLSBqKTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkb1Rvb2x0aXAoYSwgcG9wRGF0YSk7XG5cdFx0XHR9IHdoaWxlICgtLWopO1xuXHRcdH1cblx0XHRpZiAoZmluaXNoIDwgYW5jaG9ycy5sZW5ndGgpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRzZXR1cFRvb2x0aXBzTG9vcChhbmNob3JzLCBmaW5pc2gsIGhvd21hbnksIHNsZWVwLCByZW1vdmUsIHBvcERhdGEpO1xuXHRcdFx0fSwgc2xlZXApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIXJlbW92ZSAmJiAhZ2V0VmFsdWVPZigncG9wdXBUb2NMaW5rcycpKSB7XG5cdFx0XHRcdHJtVG9jVG9vbHRpcHMoKTtcblx0XHRcdH1cblx0XHRcdHBnLmZsYWcuZmluaXNoZWRMb2FkaW5nID0gdHJ1ZTtcblx0XHR9XG5cdH07XG5cdC8vIGVsaW1pbmF0ZSBwb3B1cHMgZnJvbSB0aGUgVE9DXG5cdC8vIFRoaXMgYWxzbyBraWxscyBhbnkgb25jbGljayBzdHVmZiB0aGF0IHVzZWQgdG8gYmUgZ29pbmcgb24gaW4gdGhlIHRvY1xuXHRjb25zdCBybVRvY1Rvb2x0aXBzID0gKCkgPT4ge1xuXHRcdGNvbnN0IHRvYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b2MnKTtcblx0XHRpZiAodG9jKSB7XG5cdFx0XHRjb25zdCB0b2NMaW5rcyA9IHRvYy5xdWVyeVNlbGVjdG9yQWxsKCdhJyk7XG5cdFx0XHRjb25zdCB0b2NMZW4gPSB0b2NMaW5rcy5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IHRvY0xlbjsgKytqKSB7XG5cdFx0XHRcdHJlbW92ZVRvb2x0aXAodG9jTGlua3Nbal0sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgYWRkVG9vbHRpcCA9IChhLCBwb3BEYXRhKSA9PiB7XG5cdFx0aWYgKCFpc1BvcHVwTGluayhhKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRhLm9ubW91c2VvdmVyID0gbW91c2VPdmVyV2lraUxpbms7XG5cdFx0YS5vbm1vdXNlb3V0ID0gbW91c2VPdXRXaWtpTGluaztcblx0XHRhLm9ubW91c2Vkb3duID0ga2lsbFBvcHVwO1xuXHRcdGEuaGFzUG9wdXAgPSB0cnVlO1xuXHRcdGEucG9wRGF0YSA9IHBvcERhdGE7XG5cdH07XG5cdGNvbnN0IHJlbW92ZVRvb2x0aXAgPSAoYSkgPT4ge1xuXHRcdGlmICghYS5oYXNQb3B1cCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRhLm9ubW91c2VvdmVyID0gbnVsbDtcblx0XHRhLm9ubW91c2VvdXQgPSBudWxsO1xuXHRcdGlmIChhLm9yaWdpbmFsVGl0bGUpIHtcblx0XHRcdGEudGl0bGUgPSBhLm9yaWdpbmFsVGl0bGU7XG5cdFx0fVxuXHRcdGEuaGFzUG9wdXAgPSBmYWxzZTtcblx0fTtcblx0Y29uc3QgcmVtb3ZlVGl0bGUgPSAoYSkgPT4ge1xuXHRcdGlmICghYS5vcmlnaW5hbFRpdGxlKSB7XG5cdFx0XHRhLm9yaWdpbmFsVGl0bGUgPSBhLnRpdGxlO1xuXHRcdH1cblx0XHRhLnRpdGxlID0gJyc7XG5cdH07XG5cdGNvbnN0IHJlc3RvcmVUaXRsZSA9IChhKSA9PiB7XG5cdFx0aWYgKGEudGl0bGUgfHwgIWEub3JpZ2luYWxUaXRsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRhLnRpdGxlID0gYS5vcmlnaW5hbFRpdGxlO1xuXHR9O1xuXHRjb25zdCByZWdpc3Rlckhvb2tzID0gKG5wKSA9PiB7XG5cdFx0Y29uc3QgcG9wdXBNYXhXaWR0aCA9IGdldFZhbHVlT2YoJ3BvcHVwTWF4V2lkdGgnKTtcblx0XHRpZiAodHlwZW9mIHBvcHVwTWF4V2lkdGggPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb25zdCBzZXRNYXhXaWR0aCA9ICgpID0+IHtcblx0XHRcdFx0bnAubWFpbkRpdi5zdHlsZS5tYXhXaWR0aCA9IGAke3BvcHVwTWF4V2lkdGh9cHhgO1xuXHRcdFx0XHRucC5tYXhXaWR0aCA9IHBvcHVwTWF4V2lkdGg7XG5cdFx0XHR9O1xuXHRcdFx0bnAuYWRkSG9vayhzZXRNYXhXaWR0aCwgJ3VuaGlkZScsICdiZWZvcmUnKTtcblx0XHR9XG5cdFx0bnAuYWRkSG9vayhhZGRQb3B1cFNob3J0Y3V0cywgJ3VuaGlkZScsICdhZnRlcicpO1xuXHRcdG5wLmFkZEhvb2socm1Qb3B1cFNob3J0Y3V0cywgJ2hpZGUnLCAnYmVmb3JlJyk7XG5cdH07XG5cdGNvbnN0IHJlbW92ZU1vZGlmaWVyS2V5TGlzdGVuZXIgPSAoYSkgPT4ge1xuXHRcdC8vIHJlbW92ZSBsaXN0ZW5lcnMgZm9yIG1vZGlmaWVyIGtleSBpZiBhbnkgdGhhdCB3ZXJlIGFkZGVkIGluIG1vdXNlT3Zlcldpa2lMaW5rXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGEubW9kaWZpZXJLZXlMaXN0ZW5lciwgZmFsc2UpO1xuXHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgYS5tb2RpZmllcktleUxpc3RlbmVyLCBmYWxzZSk7XG5cdH07XG5cdGNvbnN0IG1vdXNlT3Zlcldpa2lMaW5rID0gZnVuY3Rpb24gbW91c2VPdmVyV2lraUxpbmsoZXZ0KSB7XG5cdFx0aWYgKCFldnQgJiYgd2luZG93LmV2ZW50KSB7XG5cdFx0XHRldnQgPSB3aW5kb3cuZXZlbnQ7XG5cdFx0fVxuXHRcdC8vIGlmIHRoZSBtb2RpZmllciBpcyBuZWVkZWQsIGxpc3RlbiBmb3IgaXQsXG5cdFx0Ly8gd2Ugd2lsbCByZW1vdmUgdGhlIGxpc3RlbmVyIHdoZW4gd2UgbW91c2VvdXQgb2YgdGhpcyBsaW5rIG9yIGtpbGwgcG9wdXAuXG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwTW9kaWZpZXInKSkge1xuXHRcdFx0Ly8gaWYgcG9wdXBNb2RpZmllckFjdGlvbiA9IGVuYWJsZSwgd2Ugc2hvdWxkIHBvcHVwIHdoZW4gdGhlIG1vZGlmaWVyIGlzIHByZXNzZWRcblx0XHRcdC8vIGlmIHBvcHVwTW9kaWZpZXJBY3Rpb24gPSBkaXNhYmxlLCB3ZSBzaG91bGQgcG9wdXAgdW5sZXNzIHRoZSBtb2RpZmllciBpcyBwcmVzc2VkXG5cdFx0XHRjb25zdCBhY3Rpb24gPSBnZXRWYWx1ZU9mKCdwb3B1cE1vZGlmaWVyQWN0aW9uJyk7XG5cdFx0XHRjb25zdCBrZXkgPSBhY3Rpb24gPT09ICdkaXNhYmxlJyA/ICdrZXl1cCcgOiAna2V5ZG93bic7XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdHNlbGYubW9kaWZpZXJLZXlMaXN0ZW5lciA9IChldnQpID0+IHtcblx0XHRcdFx0bW91c2VPdmVyV2lraUxpbmsyKHNlbGYsIGV2dCk7XG5cdFx0XHR9O1xuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihrZXksIHNlbGYubW9kaWZpZXJLZXlMaXN0ZW5lciwgZmFsc2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gbW91c2VPdmVyV2lraUxpbmsyKHRoaXMsIGV2dCk7XG5cdH07XG5cdC8qKlxuXHQgKiBHZXRzIHRoZSByZWZlcmVuY2VzIGxpc3QgaXRlbSB0aGF0IHRoZSBwcm92aWRlZCBmb290bm90ZSBsaW5rIHRhcmdldHMuIFRoaXNcblx0ICogaXMgdHlwaWNhbGx5IGEgbGkgZWxlbWVudCB3aXRoaW4gdGhlIG9sLnJlZmVyZW5jZXMgZWxlbWVudCBpbnNpZGUgdGhlIHJlZmxpc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gYSAtIEEgZm9vdG5vdGUgbGluay5cblx0ICogQHJldHVybiB7RWxlbWVudHxib29sZWFufSBUaGUgdGFyZ2V0ZWQgZWxlbWVudCwgb3IgZmFsc2UgaWYgb25lIGNhbid0IGJlIGZvdW5kLlxuXHQgKi9cblx0Y29uc3QgZm9vdG5vdGVUYXJnZXQgPSAoYSkgPT4ge1xuXHRcdGNvbnN0IGFUaXRsZSA9IFRpdGxlLmZyb21BbmNob3IoYSk7XG5cdFx0Ly8gV2Ugd2FudCBcIi4zQVwiIHJhdGhlciB0aGFuIFwiJTNBXCIgb3IgXCI/XCIgaGVyZSwgc28gdXNlIHRoZSBhbmNob3IgcHJvcGVydHkgZGlyZWN0bHlcblx0XHRjb25zdCBhbmNoID0gYVRpdGxlLmFuY2hvcjtcblx0XHRpZiAoIS9eKGNpdGVfbm90ZS18X25vdGUtfGVuZG5vdGUpLy50ZXN0KGFuY2gpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IGxUaXRsZSA9IFRpdGxlLmZyb21VUkwobG9jYXRpb24uaHJlZik7XG5cdFx0aWYgKGxUaXRsZS50b1N0cmluZyh0cnVlKSAhPT0gYVRpdGxlLnRvU3RyaW5nKHRydWUpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGxldCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2FuY2h9YCk7XG5cdFx0d2hpbGUgKGVsICYmIHR5cGVvZiBlbC5ub2RlTmFtZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGNvbnN0IG50ID0gZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdGlmIChudCA9PT0gJ2xpJykge1xuXHRcdFx0XHRyZXR1cm4gZWw7XG5cdFx0XHR9IGVsc2UgaWYgKG50ID09PSAnYm9keScpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmIChlbC5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdGVsID0gZWwucGFyZW50Tm9kZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRjb25zdCBmb290bm90ZVByZXZpZXcgPSAoeCwgbmF2cG9wKSA9PiB7XG5cdFx0c2V0UG9wdXBIVE1MKGA8aHI+JHt4LmlubmVySFRNTH1gLCAncG9wdXBQcmV2aWV3JywgbmF2cG9wLmlkTnVtYmVyKTtcblx0fTtcblx0Y29uc3QgbW9kaWZpZXJQcmVzc2VkID0gKGV2dCkgPT4ge1xuXHRcdGNvbnN0IG1vZCA9IGdldFZhbHVlT2YoJ3BvcHVwTW9kaWZpZXInKTtcblx0XHRpZiAoIW1vZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIWV2dCAmJiB3aW5kb3cuZXZlbnQpIHtcblx0XHRcdGV2dCA9IHdpbmRvdy5ldmVudDtcblx0XHR9XG5cdFx0cmV0dXJuIGV2dCAmJiBtb2QgJiYgZXZ0W2Ake21vZC50b0xvd2VyQ2FzZSgpfUtleWBdO1xuXHR9O1xuXHQvLyBDaGVja3MgaWYgdGhlIGNvcnJlY3QgbW9kaWZpZXIgcHJlc3NlZC91bnByZXNzZWQgaWYgbmVlZGVkXG5cdGNvbnN0IGlzQ29ycmVjdE1vZGlmaWVyID0gKF9hLCBldnQpID0+IHtcblx0XHRpZiAoIWdldFZhbHVlT2YoJ3BvcHVwTW9kaWZpZXInKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdC8vIGlmIHBvcHVwTW9kaWZpZXJBY3Rpb24gPSBlbmFibGUsIHdlIHNob3VsZCBwb3B1cCB3aGVuIHRoZSBtb2RpZmllciBpcyBwcmVzc2VkXG5cdFx0Ly8gaWYgcG9wdXBNb2RpZmllckFjdGlvbiA9IGRpc2FibGUsIHdlIHNob3VsZCBwb3B1cCB1bmxlc3MgdGhlIG1vZGlmaWVyIGlzIHByZXNzZWRcblx0XHRjb25zdCBhY3Rpb24gPSBnZXRWYWx1ZU9mKCdwb3B1cE1vZGlmaWVyQWN0aW9uJyk7XG5cdFx0cmV0dXJuIChhY3Rpb24gPT09ICdlbmFibGUnICYmIG1vZGlmaWVyUHJlc3NlZChldnQpKSB8fCAoYWN0aW9uID09PSAnZGlzYWJsZScgJiYgIW1vZGlmaWVyUHJlc3NlZChldnQpKTtcblx0fTtcblx0Y29uc3QgbW91c2VPdmVyV2lraUxpbmsyID0gKGEsIGV2dCkgPT4ge1xuXHRcdGlmICghaXNDb3JyZWN0TW9kaWZpZXIoYSwgZXZ0KSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZ2V0VmFsdWVPZigncmVtb3ZlVGl0bGVzJykpIHtcblx0XHRcdHJlbW92ZVRpdGxlKGEpO1xuXHRcdH1cblx0XHRpZiAoYSA9PT0gcGcuY3VycmVudC5saW5rICYmIGEubmF2cG9wdXAgJiYgYS5uYXZwb3B1cC5pc1Zpc2libGUoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwZy5jdXJyZW50LmxpbmsgPSBhO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdzaW1wbGVQb3B1cHMnKSAmJiAhcGcub3B0aW9uLnBvcHVwU3RydWN0dXJlKSB7XG5cdFx0XHQvLyByZXNldCAqZGVmYXVsdCB2YWx1ZSogb2YgcG9wdXBTdHJ1Y3R1cmVcblx0XHRcdHNldERlZmF1bHQoJ3BvcHVwU3RydWN0dXJlJywgJ29yaWdpbmFsJyk7XG5cdFx0fVxuXHRcdGNvbnN0IGFydGljbGUgPSBuZXcgVGl0bGUoKS5mcm9tQW5jaG9yKGEpO1xuXHRcdC8vIHNldCBnbG9iYWwgdmFyaWFibGUgKHVnaCkgdG8gaG9sZCBhcnRpY2xlICh3aWtpcGFnZSlcblx0XHRwZy5jdXJyZW50LmFydGljbGUgPSBhcnRpY2xlO1xuXHRcdGlmICghYS5uYXZwb3B1cCkge1xuXHRcdFx0YS5uYXZwb3B1cCA9IG5ld05hdnBvcHVwKGEsIGFydGljbGUpO1xuXHRcdFx0cGcuY3VycmVudC5saW5rc0hhc2hbYS5ocmVmXSA9IGEubmF2cG9wdXA7XG5cdFx0XHRwZy5jdXJyZW50LmxpbmtzLnB1c2goYSk7XG5cdFx0fVxuXHRcdGlmIChhLm5hdnBvcHVwLnBlbmRpbmcgPT09IG51bGwgfHwgYS5uYXZwb3B1cC5wZW5kaW5nICE9PSAwKSB7XG5cdFx0XHQvLyBlaXRoZXIgZnJlc2ggcG9wdXBzIG9yIHRob3NlIHdpdGggdW5maW5zaGVkIGJ1c2luZXNzIGFyZSByZWRvbmUgZnJvbSBzY3JhdGNoXG5cdFx0XHRzaW1wbGVQb3B1cENvbnRlbnQoYSwgYXJ0aWNsZSk7XG5cdFx0fVxuXHRcdGEubmF2cG9wdXAuc2hvd1Nvb25JZlN0YWJsZShhLm5hdnBvcHVwLmRlbGF5KTtcblx0XHRjbGVhckludGVydmFsKHBnLnRpbWVyLmNoZWNrUG9wdXBQb3NpdGlvbik7XG5cdFx0cGcudGltZXIuY2hlY2tQb3B1cFBvc2l0aW9uID0gc2V0SW50ZXJ2YWwoY2hlY2tQb3B1cFBvc2l0aW9uLCA2MDApO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdzaW1wbGVQb3B1cHMnKSAmJiBnZXRWYWx1ZU9mKCdwb3B1cFByZXZpZXdCdXR0b24nKSAmJiAhYS5zaW1wbGVOb01vcmUpIHtcblx0XHRcdGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGQuY2xhc3NOYW1lID0gJ3BvcHVwUHJldmlld0J1dHRvbkRpdic7XG5cdFx0XHRjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0ZC5hcHBlbmQocyk7XG5cdFx0XHRzLmNsYXNzTmFtZSA9ICdwb3B1cFByZXZpZXdCdXR0b24nO1xuXHRcdFx0c1tgb24ke2dldFZhbHVlT2YoJ3BvcHVwUHJldmlld0J1dHRvbkV2ZW50Jyl9YF0gPSAoKSA9PiB7XG5cdFx0XHRcdGEuc2ltcGxlTm9Nb3JlID0gdHJ1ZTtcblx0XHRcdFx0ZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHRub25zaW1wbGVQb3B1cENvbnRlbnQoYSwgYXJ0aWNsZSk7XG5cdFx0XHR9O1xuXHRcdFx0cy5pbm5lckhUTUwgPSBwb3B1cFN0cmluZygnc2hvdyBwcmV2aWV3Jyk7XG5cdFx0XHRzZXRQb3B1cEhUTUwoZCwgJ3BvcHVwUHJldmlldycsIGEubmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdH1cblx0XHRpZiAoYS5uYXZwb3B1cC5wZW5kaW5nICE9PSAwKSB7XG5cdFx0XHRub25zaW1wbGVQb3B1cENvbnRlbnQoYSwgYXJ0aWNsZSk7XG5cdFx0fVxuXHR9O1xuXHQvLyBzaW1wbGVQb3B1cENvbnRlbnQ6IHRoZSBjb250ZW50IHRoYXQgZG8gbm90IHJlcXVpcmUgYWRkaXRpb25hbCBkb3dubG9hZFxuXHQvLyAoaXQgaXMgc2hvd24gZXZlbiB3aGVuIHNpbXBsZVBvcHVwcyBpcyB0cnVlKVxuXHRjb25zdCBzaW1wbGVQb3B1cENvbnRlbnQgPSAoYSwgYXJ0aWNsZSkgPT4ge1xuXHRcdC8qIEZJWE1FIGhhY2sgKi9cblx0XHRhLm5hdnBvcHVwLmhhc1BvcHVwTWVudSA9IGZhbHNlO1xuXHRcdGEubmF2cG9wdXAuc2V0SW5uZXJIVE1MKHBvcHVwSFRNTChhKSk7XG5cdFx0ZmlsbEVtcHR5U3BhbnMoe1xuXHRcdFx0bmF2cG9wdXA6IGEubmF2cG9wdXAsXG5cdFx0fSk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwRHJhZ2dhYmxlJykpIHtcblx0XHRcdGxldCBkcmFnSGFuZGxlID0gZ2V0VmFsdWVPZigncG9wdXBEcmFnSGFuZGxlJykgfHwgbnVsbDtcblx0XHRcdGlmIChkcmFnSGFuZGxlICYmIGRyYWdIYW5kbGUgIT09ICdhbGwnKSB7XG5cdFx0XHRcdGRyYWdIYW5kbGUgKz0gYS5uYXZwb3B1cC5pZE51bWJlcjtcblx0XHRcdH1cblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRhLm5hdnBvcHVwLm1ha2VEcmFnZ2FibGUoZHJhZ0hhbmRsZSk7XG5cdFx0XHR9LCAxNTApO1xuXHRcdH1cblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBSZWRsaW5rUmVtb3ZhbCcpICYmIGEuY2xhc3NOYW1lID09PSAnbmV3Jykge1xuXHRcdFx0c2V0UG9wdXBIVE1MKGA8YnI+JHtwb3B1cFJlZGxpbmtIVE1MKGFydGljbGUpfWAsICdwb3B1cFJlZGxpbmsnLCBhLm5hdnBvcHVwLmlkTnVtYmVyKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGRlYnVnRGF0YSA9IChuYXZwb3B1cCkgPT4ge1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cERlYnVnZ2luZycpICYmIG5hdnBvcHVwLmlkTnVtYmVyKSB7XG5cdFx0XHRzZXRQb3B1cEhUTUwoYGlkTnVtYmVyPSR7bmF2cG9wdXAuaWROdW1iZXJ9LCBwZW5kaW5nPSR7bmF2cG9wdXAucGVuZGluZ31gLCAncG9wdXBFcnJvcicsIG5hdnBvcHVwLmlkTnVtYmVyKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IG5ld05hdnBvcHVwID0gKGEsIGFydGljbGUpID0+IHtcblx0XHRjb25zdCBuYXZwb3B1cCA9IG5ldyBOYXZwb3B1cCgpO1xuXHRcdG5hdnBvcHVwLmZ1enogPSA1O1xuXHRcdG5hdnBvcHVwLmRlbGF5ID0gZ2V0VmFsdWVPZigncG9wdXBEZWxheScpICogMTAwMDtcblx0XHQvLyBpbmNyZW1lbnQgZ2xvYmFsIGNvdW50ZXIgbm93XG5cdFx0bmF2cG9wdXAuaWROdW1iZXIgPSArK3BnLmlkTnVtYmVyO1xuXHRcdG5hdnBvcHVwLnBhcmVudEFuY2hvciA9IGE7XG5cdFx0bmF2cG9wdXAucGFyZW50UG9wdXAgPSBhLnBvcERhdGEgJiYgYS5wb3BEYXRhLm93bmVyO1xuXHRcdG5hdnBvcHVwLmFydGljbGUgPSBhcnRpY2xlO1xuXHRcdHJlZ2lzdGVySG9va3MobmF2cG9wdXApO1xuXHRcdHJldHVybiBuYXZwb3B1cDtcblx0fTtcblx0Ly8gU2hvdWxkIHdlIHNob3cgbm9uc2ltcGxlIGNvbnRleHQ/XG5cdC8vIElmIHNpbXBsZVBvcHVwcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB3ZSBkbyBub3Qgc2hvdyBub25zaW1wbGUgY29udGV4dCxcblx0Ly8gYnV0IGlmIGEgYm90dG9tIFwic2hvdyBwcmV2aWV3XCIgd2FzIGNsaWNrZWQgd2UgZG8gc2hvdyBub25zaW1wbGUgY29udGV4dFxuXHRjb25zdCBzaG91bGRTaG93Tm9uU2ltcGxlID0gKGEpID0+IHtcblx0XHRyZXR1cm4gIWdldFZhbHVlT2YoJ3NpbXBsZVBvcHVwcycpIHx8IGEuc2ltcGxlTm9Nb3JlO1xuXHR9O1xuXHQvLyBTaG91bGQgd2Ugc2hvdyBub25zaW1wbGUgY29udGV4dCBnb3Zlcm4gYnkgdGhlIG9wdGlvbiAoZS5nLiBwb3B1cFVzZXJJbmZvKT9cblx0Ly8gSWYgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3Igbm9uc2ltcGxlIGNvbnRleHQgYnkgc2V0dGluZyB0aGUgb3B0aW9uIHRvIHRydWUsXG5cdC8vIHRoZW4gd2Ugc2hvdyBpdCBldmVuIGluIG5vbnNpbXBsZSBtb2RlLlxuXHRjb25zdCBzaG91bGRTaG93ID0gKGEsIG9wdGlvbikgPT4ge1xuXHRcdGlmIChzaG91bGRTaG93Tm9uU2ltcGxlKGEpKSB7XG5cdFx0XHRyZXR1cm4gZ2V0VmFsdWVPZihvcHRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gd2luZG93W29wdGlvbl0gIT09IHVuZGVmaW5lZCAmJiB3aW5kb3dbb3B0aW9uXTtcblx0fTtcblx0Y29uc3Qgbm9uc2ltcGxlUG9wdXBDb250ZW50ID0gKGEsIGFydGljbGUpID0+IHtcblx0XHRsZXQgZGlmZjtcblx0XHRsZXQgaGlzdG9yeTtcblx0XHRjb25zdCBwYXJhbXMgPSBwYXJzZVBhcmFtcyhhLmhyZWYpO1xuXHRcdGNvbnN0IG9sZGlkID0gcGFyYW1zLm9sZGlkID09PSB1bmRlZmluZWQgPyBudWxsIDogcGFyYW1zLm9sZGlkO1xuXHRcdGlmIChzaG91bGRTaG93KGEsICdwb3B1cFByZXZpZXdEaWZmcycpKSB7XG5cdFx0XHQoe2RpZmZ9ID0gcGFyYW1zKTtcblx0XHR9XG5cdFx0aWYgKHNob3VsZFNob3coYSwgJ3BvcHVwUHJldmlld0hpc3RvcnknKSkge1xuXHRcdFx0aGlzdG9yeSA9IHBhcmFtcy5hY3Rpb24gPT09ICdoaXN0b3J5Jztcblx0XHR9XG5cdFx0YS5uYXZwb3B1cC5wZW5kaW5nID0gMDtcblx0XHRjb25zdCByZWZlcmVuY2VFbGVtZW50ID0gZm9vdG5vdGVUYXJnZXQoYSk7XG5cdFx0aWYgKHJlZmVyZW5jZUVsZW1lbnQpIHtcblx0XHRcdGZvb3Rub3RlUHJldmlldyhyZWZlcmVuY2VFbGVtZW50LCBhLm5hdnBvcHVwKTtcblx0XHR9IGVsc2UgaWYgKGRpZmYgfHwgZGlmZiA9PT0gMCkge1xuXHRcdFx0bG9hZERpZmYoYXJ0aWNsZSwgb2xkaWQsIGRpZmYsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoaGlzdG9yeSkge1xuXHRcdFx0bG9hZEFQSVByZXZpZXcoJ2hpc3RvcnknLCBhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHR9IGVsc2UgaWYgKHNob3VsZFNob3dOb25TaW1wbGUoYSkgJiYgcGcucmUuY29udHJpYnMudGVzdChhLmhyZWYpKSB7XG5cdFx0XHRsb2FkQVBJUHJldmlldygnY29udHJpYnMnLCBhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHR9IGVsc2UgaWYgKHNob3VsZFNob3dOb25TaW1wbGUoYSkgJiYgcGcucmUuYmFja2xpbmtzLnRlc3QoYS5ocmVmKSkge1xuXHRcdFx0bG9hZEFQSVByZXZpZXcoJ2JhY2tsaW5rcycsIGFydGljbGUsIGEubmF2cG9wdXApO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQvLyBGSVhNRSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYWxsIHByZXZpZXcgY29tYmluYXRpb25zIHdpdGggb3B0aW9uc1xuXHRcdFx0YXJ0aWNsZS5uYW1lc3BhY2VJZCgpID09PSBwZy5uc0ltYWdlSWQgJiZcblx0XHRcdChzaG91bGRTaG93KGEsICdpbWFnZVBvcHVwc0ZvckltYWdlcycpIHx8ICFhbmNob3JDb250YWluc0ltYWdlKGEpKVxuXHRcdCkge1xuXHRcdFx0bG9hZEFQSVByZXZpZXcoJ2ltYWdlcGFnZXByZXZpZXcnLCBhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHRcdGxvYWRJbWFnZShhcnRpY2xlLCBhLm5hdnBvcHVwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGFydGljbGUubmFtZXNwYWNlSWQoKSA9PT0gcGcubnNDYXRlZ29yeUlkICYmIHNob3VsZFNob3coYSwgJ3BvcHVwQ2F0ZWdvcnlNZW1iZXJzJykpIHtcblx0XHRcdFx0bG9hZEFQSVByZXZpZXcoJ2NhdGVnb3J5JywgYXJ0aWNsZSwgYS5uYXZwb3B1cCk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQoYXJ0aWNsZS5uYW1lc3BhY2VJZCgpID09PSBwZy5uc1VzZXJJZCB8fCBhcnRpY2xlLm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zVXNlcnRhbGtJZCkgJiZcblx0XHRcdFx0c2hvdWxkU2hvdyhhLCAncG9wdXBVc2VySW5mbycpXG5cdFx0XHQpIHtcblx0XHRcdFx0bG9hZEFQSVByZXZpZXcoJ3VzZXJpbmZvJywgYXJ0aWNsZSwgYS5uYXZwb3B1cCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2hvdWxkU2hvd05vblNpbXBsZShhKSkge1xuXHRcdFx0XHRzdGFydEFydGljbGVQcmV2aWV3KGFydGljbGUsIG9sZGlkLCBhLm5hdnBvcHVwKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNvbnN0IHBlbmRpbmdOYXZwb3BUYXNrID0gKG5hdnBvcCkgPT4ge1xuXHRcdGlmIChuYXZwb3AgJiYgbmF2cG9wLnBlbmRpbmcgPT09IG51bGwpIHtcblx0XHRcdG5hdnBvcC5wZW5kaW5nID0gMDtcblx0XHR9XG5cdFx0KytuYXZwb3AucGVuZGluZztcblx0XHRkZWJ1Z0RhdGEobmF2cG9wKTtcblx0fTtcblx0Y29uc3QgY29tcGxldGVkTmF2cG9wVGFzayA9IChuYXZwb3ApID0+IHtcblx0XHRpZiAobmF2cG9wICYmIG5hdnBvcC5wZW5kaW5nKSB7XG5cdFx0XHQtLW5hdnBvcC5wZW5kaW5nO1xuXHRcdH1cblx0XHRkZWJ1Z0RhdGEobmF2cG9wKTtcblx0fTtcblx0Y29uc3Qgc3RhcnRBcnRpY2xlUHJldmlldyA9IChhcnRpY2xlLCBvbGRpZCwgbmF2cG9wKSA9PiB7XG5cdFx0bmF2cG9wLnJlZGlyID0gMDtcblx0XHRsb2FkUHJldmlldyhhcnRpY2xlLCBvbGRpZCwgbmF2cG9wKTtcblx0fTtcblx0Y29uc3QgbG9hZFByZXZpZXcgPSAoYXJ0aWNsZSwgb2xkaWQsIG5hdnBvcCkgPT4ge1xuXHRcdGlmICghbmF2cG9wLnJlZGlyKSB7XG5cdFx0XHRuYXZwb3Aub3JpZ2luYWxBcnRpY2xlID0gYXJ0aWNsZTtcblx0XHR9XG5cdFx0YXJ0aWNsZS5vbGRpZCA9IG9sZGlkO1xuXHRcdGxvYWRBUElQcmV2aWV3KCdyZXZpc2lvbicsIGFydGljbGUsIG5hdnBvcCk7XG5cdH07XG5cdGNvbnN0IGxvYWRQcmV2aWV3RnJvbVJlZGlyID0gKHJlZGlyTWF0Y2gsIG5hdnBvcCkgPT4ge1xuXHRcdC8vIHJlZGlyTWF0Y2ggaXMgYSByZWdleCBtYXRjaFxuXHRcdGNvbnN0IHRhcmdldCA9IG5ldyBUaXRsZSgpLmZyb21XaWtpVGV4dChyZWRpck1hdGNoWzJdKTtcblx0XHQvLyBvdmVyd3JpdGUgKG9yIGFkZCkgYW5jaG9yIGZyb20gb3JpZ2luYWwgdGFyZ2V0XG5cdFx0Ly8gbWVkaWF3aWtpIGRvZXMgb3ZlcndyaXRlXG5cdFx0aWYgKG5hdnBvcC5hcnRpY2xlLmFuY2hvcikge1xuXHRcdFx0dGFyZ2V0LmFuY2hvciA9IG5hdnBvcC5hcnRpY2xlLmFuY2hvcjtcblx0XHR9XG5cdFx0bmF2cG9wLnJlZGlyKys7XG5cdFx0bmF2cG9wLnJlZGlyVGFyZ2V0ID0gdGFyZ2V0O1xuXHRcdGNvbnN0IHdhcm5SZWRpciA9IHJlZGlyTGluayh0YXJnZXQsIG5hdnBvcC5hcnRpY2xlKTtcblx0XHRzZXRQb3B1cEhUTUwod2FyblJlZGlyLCAncG9wdXBXYXJuUmVkaXInLCBuYXZwb3AuaWROdW1iZXIpO1xuXHRcdG5hdnBvcC5hcnRpY2xlID0gdGFyZ2V0O1xuXHRcdGZpbGxFbXB0eVNwYW5zKHtcblx0XHRcdHJlZGlyOiB0cnVlLFxuXHRcdFx0cmVkaXJUYXJnZXQ6IHRhcmdldCxcblx0XHRcdG5hdnBvcHVwOiBuYXZwb3AsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGxvYWRQcmV2aWV3KHRhcmdldCwgbnVsbCwgbmF2cG9wKTtcblx0fTtcblx0Y29uc3QgaW5zZXJ0UHJldmlldyA9IChkb3dubG9hZCkgPT4ge1xuXHRcdGlmICghZG93bmxvYWQub3duZXIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcmVkaXJNYXRjaCA9IHBnLnJlLnJlZGlyZWN0LmV4ZWMoZG93bmxvYWQuZGF0YSk7XG5cdFx0aWYgKGRvd25sb2FkLm93bmVyLnJlZGlyID09PSAwICYmIHJlZGlyTWF0Y2gpIHtcblx0XHRcdGxvYWRQcmV2aWV3RnJvbVJlZGlyKHJlZGlyTWF0Y2gsIGRvd25sb2FkLm93bmVyKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGRvd25sb2FkLm93bmVyLnZpc2libGUgfHwgIWdldFZhbHVlT2YoJ3BvcHVwTGF6eVByZXZpZXdzJykpIHtcblx0XHRcdGluc2VydFByZXZpZXdOb3coZG93bmxvYWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpZCA9IGRvd25sb2FkLm93bmVyLnJlZGlyID8gJ1BSRVZJRVdfUkVESVJfSE9PSycgOiAnUFJFVklFV19IT09LJztcblx0XHRcdGRvd25sb2FkLm93bmVyLmFkZEhvb2soXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRpbnNlcnRQcmV2aWV3Tm93KGRvd25sb2FkKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3VuaGlkZScsXG5cdFx0XHRcdCdhZnRlcicsXG5cdFx0XHRcdGlkXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgaW5zZXJ0UHJldmlld05vdyA9IChkb3dubG9hZCkgPT4ge1xuXHRcdGlmICghZG93bmxvYWQub3duZXIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgd2lraVRleHQgPSBkb3dubG9hZC5kYXRhO1xuXHRcdGNvbnN0IG5hdnBvcCA9IGRvd25sb2FkLm93bmVyO1xuXHRcdGNvbnN0IGFydCA9IG5hdnBvcC5yZWRpclRhcmdldCB8fCBuYXZwb3Aub3JpZ2luYWxBcnRpY2xlO1xuXHRcdG1ha2VGaXhEYWJzKHdpa2lUZXh0LCBuYXZwb3ApO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFN1bW1hcnlEYXRhJykpIHtcblx0XHRcdGdldFBhZ2VJbmZvKHdpa2lUZXh0LCBkb3dubG9hZCk7XG5cdFx0XHRzZXRQb3B1cFRyYWlsZXIoZ2V0UGFnZUluZm8od2lraVRleHQsIGRvd25sb2FkKSwgbmF2cG9wLmlkTnVtYmVyKTtcblx0XHR9XG5cdFx0bGV0IGltYWdlUGFnZSA9ICcnO1xuXHRcdGltYWdlUGFnZSA9IGFydC5uYW1lc3BhY2VJZCgpID09PSBwZy5uc0ltYWdlSWQgPyBhcnQudG9TdHJpbmcoKSA6IGdldFZhbGlkSW1hZ2VGcm9tV2lraVRleHQod2lraVRleHQpO1xuXHRcdGlmIChpbWFnZVBhZ2UpIHtcblx0XHRcdGxvYWRJbWFnZShUaXRsZS5mcm9tV2lraVRleHQoaW1hZ2VQYWdlKSwgbmF2cG9wKTtcblx0XHR9XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld3MnKSkge1xuXHRcdFx0aW5zZXJ0QXJ0aWNsZVByZXZpZXcoZG93bmxvYWQsIGFydCwgbmF2cG9wKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGluc2VydEFydGljbGVQcmV2aWV3ID0gKGRvd25sb2FkLCBhcnQsIG5hdnBvcCkgPT4ge1xuXHRcdGlmIChkb3dubG9hZCAmJiB0eXBlb2YgZG93bmxvYWQuZGF0YSA9PT0gdHlwZW9mICcnKSB7XG5cdFx0XHRpZiAoYXJ0Lm5hbWVzcGFjZUlkKCkgPT09IHBnLm5zVGVtcGxhdGVJZCAmJiBnZXRWYWx1ZU9mKCdwb3B1cFByZXZpZXdSYXdUZW1wbGF0ZXMnKSkge1xuXHRcdFx0XHQvLyBGSVhNRSBjb21wYXJlL2NvbnNvbGlkYXRlIHdpdGggZGlmZiBlc2NhcGluZyBjb2RlIGZvciB3aWtpdGV4dFxuXHRcdFx0XHRjb25zdCBoID0gYDxocj48c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+JHtkb3dubG9hZC5kYXRhXG5cdFx0XHRcdFx0LmVudGlmeSgpXG5cdFx0XHRcdFx0LnNwbGl0KFN0cmluZy5yYXdgXFxuYClcblx0XHRcdFx0XHQuam9pbihTdHJpbmcucmF3YDxicj5cXG5gKX08L3NwYW4+YDtcblx0XHRcdFx0c2V0UG9wdXBIVE1MKGgsICdwb3B1cFByZXZpZXcnLCBuYXZwb3AuaWROdW1iZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcCA9IHByZXBQcmV2aWV3bWFrZXIoZG93bmxvYWQuZGF0YSwgYXJ0LCBuYXZwb3ApO1xuXHRcdFx0XHRwLnNob3dQcmV2aWV3KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBwcmVwUHJldmlld21ha2VyID0gKGRhdGEsIGFydGljbGUsIG5hdnBvcCkgPT4ge1xuXHRcdC8vIGRlYWwgd2l0aCB0cmlja3N5IGFuY2hvcnNcblx0XHRjb25zdCBkID0gYW5jaG9yaXplKGRhdGEsIGFydGljbGUuYW5jaG9yU3RyaW5nKCkpO1xuXHRcdGNvbnN0IHVybEJhc2UgPSBqb2luUGF0aChbcGcud2lraS5hcnRpY2xlYmFzZSwgYXJ0aWNsZS51cmxTdHJpbmcoKV0pO1xuXHRcdGNvbnN0IHAgPSBuZXcgUHJldmlld21ha2VyKGQsIHVybEJhc2UsIG5hdnBvcCk7XG5cdFx0cmV0dXJuIHA7XG5cdH07XG5cdC8vIFRyeSB0byBpbWl0YXRlIHRoZSB3YXkgbWVkaWF3aWtpIGdlbmVyYXRlcyBIVE1MIGFuY2hvcnMgZnJvbSBzZWN0aW9uIHRpdGxlc1xuXHRjb25zdCBhbmNob3JpemUgPSAoZCwgYW5jaCkgPT4ge1xuXHRcdGlmICghYW5jaCkge1xuXHRcdFx0cmV0dXJuIGQ7XG5cdFx0fVxuXHRcdGNvbnN0IGFuY2hSZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRgKD86PStcXFxccyoke2xpdGVyYWxpemVSZWdleChhbmNoKS5yZXBsYWNlKC9bIF9dL2csICdbXyBdJyl9XFxcXHMqPSt8XFxcXHtcXFxce1xcXFxzKiR7Z2V0VmFsdWVPZihcblx0XHRcdFx0J3BvcHVwQW5jaG9yUmVnZXhwJ1xuXHRcdFx0KX1cXFxccyooPzpcXFxcfFtefH1dKikqP1xcXFxzKiR7bGl0ZXJhbGl6ZVJlZ2V4KGFuY2gpfVxcXFxzKig/OlxcXFx8W159XSopP319KWBcblx0XHQpO1xuXHRcdGNvbnN0IG1hdGNoID0gZC5tYXRjaChhbmNoUmUpO1xuXHRcdGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAwICYmIG1hdGNoWzBdKSB7XG5cdFx0XHRyZXR1cm4gZC5zbGljZShNYXRoLm1heCgwLCBkLmluZGV4T2YobWF0Y2hbMF0pKSk7XG5cdFx0fVxuXHRcdC8vIG5vdyB0cnkgdG8gZGVhbCB3aXRoID09PSBmb28gW1tiYXJ8YmF6XV0gYm9vbSA9PT0gLT4gI2Zvb19iYXpfYm9vbVxuXHRcdGNvbnN0IGxpbmVzID0gZC5zcGxpdCgnXFxuJyk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0bGluZXNbaV0gPSBsaW5lc1tpXVxuXHRcdFx0XHQucmVwbGFjZSgvXFxbezJ9KFteXFxdfF0qP1xcfCk/KC4qPyldezJ9L2csICckMicpXG5cdFx0XHRcdC5yZXBsYWNlKC8nJycoW14nXSkvZywgJyQxJylcblx0XHRcdFx0LnJlcGxhY2UoLycnKFteJ10pL2csICckMScpO1xuXHRcdFx0aWYgKGFuY2hSZS50ZXN0KGxpbmVzW2ldKSkge1xuXHRcdFx0XHRyZXR1cm4gZFxuXHRcdFx0XHRcdC5zcGxpdCgnXFxuJylcblx0XHRcdFx0XHQuc2xpY2UoaSlcblx0XHRcdFx0XHQuam9pbignXFxuJylcblx0XHRcdFx0XHQucmVwbGFjZSgvXltePV0qLywgJycpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZDtcblx0fTtcblx0Y29uc3Qga2lsbFBvcHVwID0gZnVuY3Rpb24ga2lsbFBvcHVwKCkge1xuXHRcdHJlbW92ZU1vZGlmaWVyS2V5TGlzdGVuZXIodGhpcyk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwU2hvcnRjdXRLZXlzJykpIHtcblx0XHRcdHJtUG9wdXBTaG9ydGN1dHMoKTtcblx0XHR9XG5cdFx0aWYgKCFwZykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAocGcuY3VycmVudC5saW5rICYmIHBnLmN1cnJlbnQubGluay5uYXZwb3B1cCkge1xuXHRcdFx0cGcuY3VycmVudC5saW5rLm5hdnBvcHVwLmJhbmlzaCgpO1xuXHRcdH1cblx0XHRwZy5jdXJyZW50LmxpbmsgPSBudWxsO1xuXHRcdGFib3J0QWxsRG93bmxvYWRzKCk7XG5cdFx0aWYgKHBnLnRpbWVyLmNoZWNrUG9wdXBQb3NpdGlvbikge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChwZy50aW1lci5jaGVja1BvcHVwUG9zaXRpb24pO1xuXHRcdFx0cGcudGltZXIuY2hlY2tQb3B1cFBvc2l0aW9uID0gbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7IC8vIHByZXNlcnZlIGRlZmF1bHQgYWN0aW9uXG5cdH07XG5cdC8vIEVOREZJTEU6IGFjdGlvbnMuanNcblx0Ly8gU1RBUlRGSUxFOiBkb21kcmFnLmpzXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIFRoZSB7QHNvdXJjZSBEcmFnfSBvYmplY3QsIHdoaWNoIGVuYWJsZXMgb2JqZWN0cyB0byBiZSBkcmFnZ2VkIGFyb3VuZC5cblx0ICogPHByZT5cblx0ICpcblx0ICogZG9tLWRyYWcuanNcblx0ICogMDkuMjUuMjAwMVxuXHQgKiB3d3cueW91bmdwdXAubmV0XG5cdCAqXG5cdCAqIDEwLjI4LjIwMDEgLSBmaXhlZCBtaW5vciBidWcgd2hlcmUgZXZlbnRzXG5cdCAqXG5cdCAqIHNvbWV0aW1lcyBmaXJlZCBvZmYgdGhlIGhhbmRsZSwgbm90IHRoZSByb290LlxuXHQgKiBQYXJlZCBkb3duLCBzb21lIGhvb2tzIGFkZGVkIGJ5IEx1cGluXG5cdCAqIENvcHlyaWdodCBBYXJvbiBCb29kbWFuLlxuXHQgKiBTYXlpbmcgc3R1cGlkIHRoaW5ncyBkYWlseSBzaW5jZSBNYXJjaCAyMDAxLlxuXHQgKiA8L3ByZT5cblx0ICovXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IERyYWcgb2JqZWN0LiBUaGlzIGlzIHVzZWQgdG8gbWFrZSB2YXJpb3VzIERPTSBlbGVtZW50cyBkcmFnZ2FibGUuXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0Y2xhc3MgRHJhZyB7XG5cdFx0Y29uc3RydWN0b3IoKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIENvbmRpdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdG8gZHJhZy4gVGhpcyBmdW5jdGlvbiBzaG91bGQgdGFrZSBvbmUgcGFyYW1ldGVyLFxuXHRcdFx0ICogYW4gRXZlbnQuICBUbyBkaXNhYmxlIHRoaXMsIHNldCBpdCB0byA8Y29kZT5udWxsPC9jb2RlPi5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBGdW5jdGlvblxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnN0YXJ0Q29uZGl0aW9uID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogSG9vayB0byBiZSBydW4gd2hlbiB0aGUgZHJhZyBmaW5pc2hlcy4gVGhpcyBpcyBwYXNzZWQgdGhlIGZpbmFsIGNvb3JkaW5hdGVzIG9mIHRoZVxuXHRcdFx0ICogZHJhZ2dlZCBvYmplY3QgKHR3byBpbnRlZ2VycywgeCBhbmQgeSkuIFRvIGRpc2FibGVzIHRoaXMsIHNldCBpdCB0byA8Y29kZT5udWxsPC9jb2RlPi5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBGdW5jdGlvblxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmVuZEhvb2sgPSBudWxsO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBHZXRzIGFuIGV2ZW50IGluIGEgY3Jvc3MtYnJvd3NlciBtYW5uZXIuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMgZml4RShlKSB7XG5cdFx0XHRpZiAoZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGUgPSB3aW5kb3cuZXZlbnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZS5sYXllclggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRlLmxheWVyWCA9IGUub2Zmc2V0WDtcblx0XHRcdH1cblx0XHRcdGlmIChlLmxheWVyWSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGUubGF5ZXJZID0gZS5vZmZzZXRZO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGU7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEluaXRpYWxpc2VzIHRoZSBEcmFnIGluc3RhbmNlIGJ5IHRlbGxpbmcgaXQgd2hpY2ggb2JqZWN0IHlvdSB3YW50IHRvIGJlIGRyYWdnYWJsZSwgYW5kIHdoYXRcblx0XHQgKiB5b3Ugd2FudCB0byBkcmFnIGl0IGJ5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtET01FbGVtZW50fSBvIFRoZSBcImhhbmRsZVwiIGJ5IHdoaWNoIDxjb2RlPm9Sb290PC9jb2RlPiBpcyBkcmFnZ2VkLlxuXHRcdCAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb1Jvb3QgVGhlIG9iamVjdCB3aGljaCBtb3ZlcyB3aGVuIDxjb2RlPm88L2NvZGU+IGlzIGRyYWdnZWQsIG9yIDxjb2RlPm88L2NvZGU+IGlmIG9taXR0ZWQuXG5cdFx0ICovXG5cdFx0aW5pdChvLCBvUm9vdCkge1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHR0aGlzLm9iaiA9IG87XG5cdFx0XHRvLm9ubW91c2Vkb3duID0gKGUpID0+IHtcblx0XHRcdFx0c2VsZi5zdGFydChlKTtcblx0XHRcdH07XG5cdFx0XHRvLmRyYWdnaW5nID0gZmFsc2U7XG5cdFx0XHRvLnBvcHVwc19kcmFnZ2FibGUgPSB0cnVlO1xuXHRcdFx0by5obW9kZSA9IHRydWU7XG5cdFx0XHRvLnZtb2RlID0gdHJ1ZTtcblx0XHRcdG8ucm9vdCA9IG9Sb290IHx8IG87XG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludChvLnJvb3Quc3R5bGUubGVmdCwgMTApKSkge1xuXHRcdFx0XHRvLnJvb3Quc3R5bGUubGVmdCA9ICcwcHgnO1xuXHRcdFx0fVxuXHRcdFx0aWYgKE51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoby5yb290LnN0eWxlLnRvcCwgMTApKSkge1xuXHRcdFx0XHRvLnJvb3Quc3R5bGUudG9wID0gJzBweCc7XG5cdFx0XHR9XG5cdFx0XHRvLnJvb3Qub250aGlzU3RhcnQgPSAoKSA9PiB7fTtcblx0XHRcdG8ucm9vdC5vbnRoaXNFbmQgPSAoKSA9PiB7fTtcblx0XHRcdG8ucm9vdC5vbnRoaXMgPSAoKSA9PiB7fTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU3RhcnRzIHRoZSBkcmFnLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlXG5cdFx0ICovXG5cdFx0c3RhcnQoZSkge1xuXHRcdFx0Y29uc3QgbyA9IHRoaXMub2JqOyAvLyA9IHRoaXM7XG5cdFx0XHRlID0gRHJhZy5maXhFKGUpO1xuXHRcdFx0aWYgKHRoaXMuc3RhcnRDb25kaXRpb24gJiYgIXRoaXMuc3RhcnRDb25kaXRpb24oZSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgeSA9IE51bWJlci5wYXJzZUludChvLnZtb2RlID8gby5yb290LnN0eWxlLnRvcCA6IG8ucm9vdC5zdHlsZS5ib3R0b20sIDEwKTtcblx0XHRcdGNvbnN0IHggPSBOdW1iZXIucGFyc2VJbnQoby5obW9kZSA/IG8ucm9vdC5zdHlsZS5sZWZ0IDogby5yb290LnN0eWxlLnJpZ2h0LCAxMCk7XG5cdFx0XHRvLnJvb3Qub250aGlzU3RhcnQoeCwgeSk7XG5cdFx0XHRvLmxhc3RNb3VzZVggPSBlLmNsaWVudFg7XG5cdFx0XHRvLmxhc3RNb3VzZVkgPSBlLmNsaWVudFk7XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdG8ub25tb3VzZW1vdmVEZWZhdWx0ID0gZG9jdW1lbnQub25tb3VzZW1vdmU7XG5cdFx0XHRvLmRyYWdnaW5nID0gdHJ1ZTtcblx0XHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gKGUpID0+IHtcblx0XHRcdFx0c2VsZi5kcmFnKGUpO1xuXHRcdFx0fTtcblx0XHRcdGRvY3VtZW50Lm9ubW91c2V1cCA9IChlKSA9PiB7XG5cdFx0XHRcdHNlbGYuZW5kKGUpO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogRG9lcyB0aGUgZHJhZy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGRyYWcoZSkge1xuXHRcdFx0ZSA9IERyYWcuZml4RShlKTtcblx0XHRcdGNvbnN0IG8gPSB0aGlzLm9iajtcblx0XHRcdGNvbnN0IGV5ID0gZS5jbGllbnRZO1xuXHRcdFx0Y29uc3QgZXggPSBlLmNsaWVudFg7XG5cdFx0XHRjb25zdCB5ID0gTnVtYmVyLnBhcnNlSW50KG8udm1vZGUgPyBvLnJvb3Quc3R5bGUudG9wIDogby5yb290LnN0eWxlLmJvdHRvbSwgMTApO1xuXHRcdFx0Y29uc3QgeCA9IE51bWJlci5wYXJzZUludChvLmhtb2RlID8gby5yb290LnN0eWxlLmxlZnQgOiBvLnJvb3Quc3R5bGUucmlnaHQsIDEwKTtcblx0XHRcdGNvbnN0IG54ID0geCArIChleCAtIG8ubGFzdE1vdXNlWCkgKiAoby5obW9kZSA/IDEgOiAtMSk7XG5cdFx0XHRjb25zdCBueSA9IHkgKyAoZXkgLSBvLmxhc3RNb3VzZVkpICogKG8udm1vZGUgPyAxIDogLTEpO1xuXHRcdFx0dGhpcy5vYmoucm9vdC5zdHlsZVtvLmhtb2RlID8gJ2xlZnQnIDogJ3JpZ2h0J10gPSBgJHtueH1weGA7XG5cdFx0XHR0aGlzLm9iai5yb290LnN0eWxlW28udm1vZGUgPyAndG9wJyA6ICdib3R0b20nXSA9IGAke255fXB4YDtcblx0XHRcdHRoaXMub2JqLmxhc3RNb3VzZVggPSBleDtcblx0XHRcdHRoaXMub2JqLmxhc3RNb3VzZVkgPSBleTtcblx0XHRcdHRoaXMub2JqLnJvb3Qub250aGlzKG54LCBueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEVuZHMgdGhlIGRyYWcuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGVuZCgpIHtcblx0XHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gdGhpcy5vYmoub25tb3VzZW1vdmVEZWZhdWx0O1xuXHRcdFx0ZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDtcblx0XHRcdHRoaXMub2JqLmRyYWdnaW5nID0gZmFsc2U7XG5cdFx0XHRpZiAodGhpcy5lbmRIb29rKSB7XG5cdFx0XHRcdHRoaXMuZW5kSG9vayhcblx0XHRcdFx0XHROdW1iZXIucGFyc2VJbnQodGhpcy5vYmoucm9vdC5zdHlsZVt0aGlzLm9iai5obW9kZSA/ICdsZWZ0JyA6ICdyaWdodCddLCAxMCksXG5cdFx0XHRcdFx0TnVtYmVyLnBhcnNlSW50KHRoaXMub2JqLnJvb3Quc3R5bGVbdGhpcy5vYmoudm1vZGUgPyAndG9wJyA6ICdib3R0b20nXSwgMTApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEVOREZJTEU6IGRvbWRyYWcuanNcblx0Ly8gU1RBUlRGSUxFOiBzdHJ1Y3R1cmVzLmpzXG5cdHBnLnN0cnVjdHVyZXMub3JpZ2luYWwgPSB7fTtcblx0cGcuc3RydWN0dXJlcy5vcmlnaW5hbC5wb3B1cExheW91dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0J3BvcHVwRXJyb3InLFxuXHRcdFx0J3BvcHVwSW1hZ2UnLFxuXHRcdFx0J3BvcHVwVG9wTGlua3MnLFxuXHRcdFx0J3BvcHVwVGl0bGUnLFxuXHRcdFx0J3BvcHVwVXNlckRhdGEnLFxuXHRcdFx0J3BvcHVwRGF0YScsXG5cdFx0XHQncG9wdXBPdGhlckxpbmtzJyxcblx0XHRcdCdwb3B1cFJlZGlyJyxcblx0XHRcdFsncG9wdXBXYXJuUmVkaXInLCAncG9wdXBSZWRpclRvcExpbmtzJywgJ3BvcHVwUmVkaXJUaXRsZScsICdwb3B1cFJlZGlyRGF0YScsICdwb3B1cFJlZGlyT3RoZXJMaW5rcyddLFxuXHRcdFx0J3BvcHVwTWlzY1Rvb2xzJyxcblx0XHRcdFsncG9wdXBSZWRsaW5rJ10sXG5cdFx0XHQncG9wdXBQcmVQcmV2aWV3U2VwJyxcblx0XHRcdCdwb3B1cFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwU2Vjb25kUHJldmlldycsXG5cdFx0XHQncG9wdXBQcmV2aWV3TW9yZScsXG5cdFx0XHQncG9wdXBQb3N0UHJldmlldycsXG5cdFx0XHQncG9wdXBGaXhEYWInLFxuXHRcdF07XG5cdH07XG5cdHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBSZWRpclNwYW5zID0gKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHQncG9wdXBSZWRpcicsXG5cdFx0XHQncG9wdXBXYXJuUmVkaXInLFxuXHRcdFx0J3BvcHVwUmVkaXJUb3BMaW5rcycsXG5cdFx0XHQncG9wdXBSZWRpclRpdGxlJyxcblx0XHRcdCdwb3B1cFJlZGlyRGF0YScsXG5cdFx0XHQncG9wdXBSZWRpck90aGVyTGlua3MnLFxuXHRcdF07XG5cdH07XG5cdHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBUaXRsZSA9ICh4KSA9PiB7XG5cdFx0bG9nKCdkZWZhdWx0c3RydWN0dXJlLnBvcHVwVGl0bGUnKTtcblx0XHRpZiAoIWdldFZhbHVlT2YoJ3BvcHVwTmF2TGlua3MnKSkge1xuXHRcdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoJzxiPjw8bWFpbmxpbms+PjwvYj4nLCB4LmFydGljbGUsIHgucGFyYW1zKTtcblx0XHR9XG5cdFx0cmV0dXJuICcnO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwVG9wTGlua3MgPSAoeCkgPT4ge1xuXHRcdGxvZygnZGVmYXVsdHN0cnVjdHVyZS5wb3B1cFRvcExpbmtzJyk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwTmF2TGlua3MnKSkge1xuXHRcdFx0cmV0dXJuIG5hdkxpbmtzSFRNTCh4LmFydGljbGUsIHguaGludCwgeC5wYXJhbXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gJyc7XG5cdH07XG5cdHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBJbWFnZSA9ICh4KSA9PiB7XG5cdFx0bG9nKGBvcmlnaW5hbC5wb3B1cEltYWdlLCB4LmFydGljbGU9JHt4LmFydGljbGV9LCB4Lm5hdnBvcC5pZE51bWJlcj0ke3gubmF2cG9wLmlkTnVtYmVyfWApO1xuXHRcdHJldHVybiBpbWFnZUhUTUwoeC5hcnRpY2xlLCB4Lm5hdnBvcC5pZE51bWJlcik7XG5cdH07XG5cdHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBSZWRpclRpdGxlID0gcGcuc3RydWN0dXJlcy5vcmlnaW5hbC5wb3B1cFRpdGxlO1xuXHRwZy5zdHJ1Y3R1cmVzLm9yaWdpbmFsLnBvcHVwUmVkaXJUb3BMaW5rcyA9IHBnLnN0cnVjdHVyZXMub3JpZ2luYWwucG9wdXBUb3BMaW5rcztcblx0Y29uc3QgY29weVN0cnVjdHVyZSA9IChvbGRTdHJ1Y3R1cmUsIG5ld1N0cnVjdHVyZSkgPT4ge1xuXHRcdHBnLnN0cnVjdHVyZXNbbmV3U3RydWN0dXJlXSA9IHt9O1xuXHRcdGZvciAoY29uc3QgcHJvcCBpbiBwZy5zdHJ1Y3R1cmVzW29sZFN0cnVjdHVyZV0pIHtcblx0XHRcdGlmICghT2JqZWN0Lmhhc093bihwZy5zdHJ1Y3R1cmVzW29sZFN0cnVjdHVyZV0sIHByb3ApKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0cGcuc3RydWN0dXJlc1tuZXdTdHJ1Y3R1cmVdW3Byb3BdID0gcGcuc3RydWN0dXJlc1tvbGRTdHJ1Y3R1cmVdW3Byb3BdO1xuXHRcdH1cblx0fTtcblx0Y29weVN0cnVjdHVyZSgnb3JpZ2luYWwnLCAnbm9zdGFsZ2lhJyk7XG5cdHBnLnN0cnVjdHVyZXMubm9zdGFsZ2lhLnBvcHVwVG9wTGlua3MgPSAoeCkgPT4ge1xuXHRcdGxldCBzdHIgPSAnJztcblx0XHRzdHIgKz0gJzxiPjw8bWFpbmxpbmt8c2hvcnRjdXQ9ID4+PC9iPic7XG5cdFx0Ly8gdXNlciBsaW5rc1xuXHRcdC8vIGNvbnRyaWJzIC0gbG9nIC0gY291bnQgLSBlbWFpbCAtIGJsb2NrXG5cdFx0Ly8gY291bnQgb25seSBpZiBhcHBsaWNhYmxlOyBibG9jayBvbmx5IGlmIHBvcHVwQWRtaW5MaW5rc1xuXHRcdHN0ciArPSAnaWYodXNlcil7PGJyPjw8Y29udHJpYnN8c2hvcnRjdXQ9Yz4+Jztcblx0XHRzdHIgKz0gJ2lmKHdpa2ltZWRpYSl7Kjw8Y291bnR8c2hvcnRjdXQ9Iz4+fSc7XG5cdFx0c3RyICs9ICdpZihpcHVzZXIpe31lbHNleyo8PGVtYWlsfHNob3J0Y3V0PUU+Pn1pZihhZG1pbil7Kjw8YmxvY2t8c2hvcnRjdXQ9Yj4+fX0nO1xuXHRcdC8vIGVkaXRpbmcgbGlua3Ncblx0XHQvLyB0YWxrcGFnZSAgIC0+IGVkaXR8bmV3IC0gaGlzdG9yeSAtIHVufHdhdGNoIC0gYXJ0aWNsZXxlZGl0XG5cdFx0Ly8gb3RoZXIgcGFnZSAtPiBlZGl0IC0gaGlzdG9yeSAtIHVufHdhdGNoIC0gdGFsa3xlZGl0fG5ld1xuXHRcdGNvbnN0IGVkaXRzdHIgPSAnPDxlZGl0fHNob3J0Y3V0PWU+Pic7XG5cdFx0Y29uc3QgZWRpdE9sZGlkU3RyID0gYGlmKG9sZGlkKXs8PGVkaXRPbGR8c2hvcnRjdXQ9ZT4+fDw8cmV2ZXJ0fHNob3J0Y3V0PXZ8cnY+Pnw8PGVkaXR8Y3VyPj59ZWxzZXske2VkaXRzdHJ9fWA7XG5cdFx0Y29uc3QgaGlzdG9yeXN0ciA9ICc8PGhpc3Rvcnl8c2hvcnRjdXQ9aD4+Jztcblx0XHRjb25zdCB3YXRjaHN0ciA9ICc8PHVud2F0Y2h8dW53YXRjaFNob3J0Pj58PDx3YXRjaHxzaG9ydGN1dD13fHdhdGNoVGhpbmd5Pj4nO1xuXHRcdHN0ciArPVxuXHRcdFx0YDxicj5pZih0YWxrKXske2VkaXRPbGRpZFN0cn18PDxuZXd8c2hvcnRjdXQ9Kz4+YCArXG5cdFx0XHRgKiR7aGlzdG9yeXN0cn0qJHt3YXRjaHN0cn0qYCArXG5cdFx0XHQnPGI+PDxhcnRpY2xlfHNob3J0Y3V0PWE+PjwvYj58PDxlZGl0QXJ0aWNsZXxlZGl0Pj4nICtcblx0XHRcdGB9ZWxzZXske1xuXHRcdFx0XHQvLyBub3QgYSB0YWxrIHBhZ2Vcblx0XHRcdFx0ZWRpdE9sZGlkU3RyXG5cdFx0XHR9KiR7aGlzdG9yeXN0cn0qJHt3YXRjaHN0cn0qYCArXG5cdFx0XHQnPGI+PDx0YWxrfHNob3J0Y3V0PXQ+PjwvYj58PDxlZGl0VGFsa3xlZGl0Pj58PDxuZXdUYWxrfHNob3J0Y3V0PSt8bmV3Pj59Jztcblx0XHQvLyBtaXNjIGxpbmtzXG5cdFx0c3RyICs9ICc8YnI+PDx3aGF0TGlua3NIZXJlfHNob3J0Y3V0PWw+Pio8PHJlbGF0ZWRDaGFuZ2VzfHNob3J0Y3V0PXI+Pic7XG5cdFx0c3RyICs9ICdpZihhZG1pbil7PGJyPn1lbHNleyp9PDxtb3ZlfHNob3J0Y3V0PW0+Pic7XG5cdFx0Ly8gYWRtaW4gbGlua3Ncblx0XHRzdHIgKz1cblx0XHRcdCdpZihhZG1pbil7Kjw8dW5wcm90ZWN0fHVucHJvdGVjdFNob3J0Pj58PDxwcm90ZWN0fHNob3J0Y3V0PXA+PionICtcblx0XHRcdCc8PHVuZGVsZXRlfHVuZGVsZXRlU2hvcnQ+Pnw8PGRlbGV0ZXxzaG9ydGN1dD1kPj59Jztcblx0XHRyZXR1cm4gbmF2bGlua1N0cmluZ1RvSFRNTChzdHIsIHguYXJ0aWNsZSwgeC5wYXJhbXMpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm5vc3RhbGdpYS5wb3B1cFJlZGlyVG9wTGlua3MgPSBwZy5zdHJ1Y3R1cmVzLm5vc3RhbGdpYS5wb3B1cFRvcExpbmtzO1xuXHQvKiogLS0gZmFuY3kgLS0gKi9cblx0Y29weVN0cnVjdHVyZSgnb3JpZ2luYWwnLCAnZmFuY3knKTtcblx0cGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cFRpdGxlID0gKHgpID0+IHtcblx0XHRyZXR1cm4gbmF2bGlua1N0cmluZ1RvSFRNTCgnPGZvbnQgc2l6ZT0rMD48PG1haW5saW5rPj48L2ZvbnQ+JywgeC5hcnRpY2xlLCB4LnBhcmFtcyk7XG5cdH07XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBUb3BMaW5rcyA9ICh4KSA9PiB7XG5cdFx0Y29uc3QgaGlzdCA9ICc8PGhpc3Rvcnl8c2hvcnRjdXQ9aHxoaXN0Pj58PDxsYXN0RWRpdHxzaG9ydGN1dD0vfGxhc3Q+Pnw8PGVkaXRvcnN8c2hvcnRjdXQ9RXxlZHM+Pic7XG5cdFx0Y29uc3Qgd2F0Y2ggPSAnPDx1bndhdGNofHVud2F0Y2hTaG9ydD4+fDw8d2F0Y2h8c2hvcnRjdXQ9d3x3YXRjaFRoaW5neT4+Jztcblx0XHRjb25zdCBtb3ZlID0gJzw8bW92ZXxzaG9ydGN1dD1tfG1vdmU+Pic7XG5cdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoXG5cdFx0XHQnaWYodGFsayl7JyArXG5cdFx0XHRcdGA8PGVkaXR8c2hvcnRjdXQ9ZT4+fDw8bmV3fHNob3J0Y3V0PSt8Kz4+KiR7aGlzdH0qYCArXG5cdFx0XHRcdCc8PGFydGljbGV8c2hvcnRjdXQ9YT4+fDw8ZWRpdEFydGljbGV8ZWRpdD4+JyArXG5cdFx0XHRcdGAqJHt3YXRjaH0qJHttb3ZlfX1lbHNlezw8ZWRpdHxzaG9ydGN1dD1lPj4qJHtoaXN0fSo8PHRhbGt8c2hvcnRjdXQ9dHw+Pnw8PGVkaXRUYWxrfGVkaXQ+Pnw8PG5ld1RhbGt8c2hvcnRjdXQ9K3xuZXc+PmAgK1xuXHRcdFx0XHRgKiR7d2F0Y2h9KiR7bW92ZX19PGJyPmAsXG5cdFx0XHR4LmFydGljbGUsXG5cdFx0XHR4LnBhcmFtc1xuXHRcdCk7XG5cdH07XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBPdGhlckxpbmtzID0gKHgpID0+IHtcblx0XHRjb25zdCBhZG1pbiA9XG5cdFx0XHQnPDx1bnByb3RlY3R8dW5wcm90ZWN0U2hvcnQ+Pnw8PHByb3RlY3R8c2hvcnRjdXQ9cD4+Kjw8dW5kZWxldGV8dW5kZWxldGVTaG9ydD4+fDw8ZGVsZXRlfHNob3J0Y3V0PWR8ZGVsPj4nO1xuXHRcdGxldCB1c2VyID0gJzw8Y29udHJpYnN8c2hvcnRjdXQ9Yz4+aWYod2lraW1lZGlhKXt8PDxjb3VudHxzaG9ydGN1dD0jfCM+Pn0nO1xuXHRcdHVzZXIgKz0gYGlmKGlwdXNlcil7fDw8YXJpbj4+fWVsc2V7Kjw8ZW1haWx8c2hvcnRjdXQ9RXwke3BvcHVwU3RyaW5nKFxuXHRcdFx0J2VtYWlsJ1xuXHRcdCl9Pj59aWYoYWRtaW4peyo8PGJsb2NrfHNob3J0Y3V0PWI+Pn1gO1xuXHRcdGNvbnN0IG5vcm1hbCA9ICc8PHdoYXRMaW5rc0hlcmV8c2hvcnRjdXQ9bHxsaW5rcyBoZXJlPj4qPDxyZWxhdGVkQ2hhbmdlc3xzaG9ydGN1dD1yfHJlbGF0ZWQ+Pic7XG5cdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoXG5cdFx0XHRgPGJyPmlmKHVzZXIpeyR7dXNlcn0qfWlmKGFkbWluKXske2FkbWlufWlmKHVzZXIpezxicj59ZWxzZXsqfX0ke25vcm1hbH1gLFxuXHRcdFx0eC5hcnRpY2xlLFxuXHRcdFx0eC5wYXJhbXNcblx0XHQpO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwUmVkaXJUaXRsZSA9IHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBUaXRsZTtcblx0cGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cFJlZGlyVG9wTGlua3MgPSBwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwVG9wTGlua3M7XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kucG9wdXBSZWRpck90aGVyTGlua3MgPSBwZy5zdHJ1Y3R1cmVzLmZhbmN5LnBvcHVwT3RoZXJMaW5rcztcblx0LyoqIC0tIGZhbmN5MiAtLSAqL1xuXHQvLyBoYWNrIGZvciBNYWNHeXZlck1hZ2ljXG5cdGNvcHlTdHJ1Y3R1cmUoJ2ZhbmN5JywgJ2ZhbmN5MicpO1xuXHRwZy5zdHJ1Y3R1cmVzLmZhbmN5Mi5wb3B1cFRvcExpbmtzID0gLy8gaGFjayBvdXQgdGhlIDxicj4gYXQgdGhlIGVuZCBhbmQgcHV0IG9uZSBhdCB0aGUgYmVnaW5uaW5nXG5cdFx0KHgpID0+IHtcblx0XHRcdHJldHVybiBgPGJyPiR7cGcuc3RydWN0dXJlcy5mYW5jeS5wb3B1cFRvcExpbmtzKHgpLnJlcGxhY2UoLzxicj4kL2ksICcnKX1gO1xuXHRcdH07XG5cdHBnLnN0cnVjdHVyZXMuZmFuY3kyLnBvcHVwTGF5b3V0ID0gKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHQncG9wdXBFcnJvcicsXG5cdFx0XHQncG9wdXBJbWFnZScsXG5cdFx0XHQncG9wdXBUaXRsZScsXG5cdFx0XHQncG9wdXBVc2VyRGF0YScsXG5cdFx0XHQncG9wdXBEYXRhJyxcblx0XHRcdCdwb3B1cFRvcExpbmtzJyxcblx0XHRcdCdwb3B1cE90aGVyTGlua3MnLFxuXHRcdFx0J3BvcHVwUmVkaXInLFxuXHRcdFx0Wydwb3B1cFdhcm5SZWRpcicsICdwb3B1cFJlZGlyVG9wTGlua3MnLCAncG9wdXBSZWRpclRpdGxlJywgJ3BvcHVwUmVkaXJEYXRhJywgJ3BvcHVwUmVkaXJPdGhlckxpbmtzJ10sXG5cdFx0XHQncG9wdXBNaXNjVG9vbHMnLFxuXHRcdFx0Wydwb3B1cFJlZGxpbmsnXSxcblx0XHRcdCdwb3B1cFByZVByZXZpZXdTZXAnLFxuXHRcdFx0J3BvcHVwUHJldmlldycsXG5cdFx0XHQncG9wdXBTZWNvbmRQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cFByZXZpZXdNb3JlJyxcblx0XHRcdCdwb3B1cFBvc3RQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cEZpeERhYicsXG5cdFx0XTtcblx0fTtcblx0LyoqIC0tIG1lbnVzIC0tICovXG5cdGNvcHlTdHJ1Y3R1cmUoJ29yaWdpbmFsJywgJ21lbnVzJyk7XG5cdHBnLnN0cnVjdHVyZXMubWVudXMucG9wdXBMYXlvdXQgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdCdwb3B1cEVycm9yJyxcblx0XHRcdCdwb3B1cEltYWdlJyxcblx0XHRcdCdwb3B1cFRvcExpbmtzJyxcblx0XHRcdCdwb3B1cFRpdGxlJyxcblx0XHRcdCdwb3B1cE90aGVyTGlua3MnLFxuXHRcdFx0J3BvcHVwUmVkaXInLFxuXHRcdFx0Wydwb3B1cFdhcm5SZWRpcicsICdwb3B1cFJlZGlyVG9wTGlua3MnLCAncG9wdXBSZWRpclRpdGxlJywgJ3BvcHVwUmVkaXJEYXRhJywgJ3BvcHVwUmVkaXJPdGhlckxpbmtzJ10sXG5cdFx0XHQncG9wdXBVc2VyRGF0YScsXG5cdFx0XHQncG9wdXBEYXRhJyxcblx0XHRcdCdwb3B1cE1pc2NUb29scycsXG5cdFx0XHRbJ3BvcHVwUmVkbGluayddLFxuXHRcdFx0J3BvcHVwUHJlUHJldmlld1NlcCcsXG5cdFx0XHQncG9wdXBQcmV2aWV3Jyxcblx0XHRcdCdwb3B1cFNlY29uZFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwUHJldmlld01vcmUnLFxuXHRcdFx0J3BvcHVwUG9zdFByZXZpZXcnLFxuXHRcdFx0J3BvcHVwRml4RGFiJyxcblx0XHRdO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwVG9wTGlua3MgPSAoeCwgc2hvcnRlcikgPT4ge1xuXHRcdC8vIEZJWE1FIG1heWJlIHRoaXMgc3R1ZmYgc2hvdWxkIGJlIGNhY2hlZFxuXHRcdGNvbnN0IHMgPSBbXTtcblx0XHRjb25zdCBkcm9wZGl2ID0gJzxkaXYgY2xhc3M9XCJwb3B1cF9kcm9wXCI+Jztcblx0XHRjb25zdCBlbmRkaXYgPSAnPC9kaXY+Jztcblx0XHRsZXQgaGlzdCA9ICc8PGhpc3Rvcnl8c2hvcnRjdXQ9aD4+Jztcblx0XHRpZiAoIXNob3J0ZXIpIHtcblx0XHRcdGhpc3QgPSBgPG1lbnVyb3c+JHtoaXN0fXw8PGhpc3RvcnlmZWVkfHJzcz4+fDw8ZWRpdG9yc3xzaG9ydGN1dD1FPj48L21lbnVyb3c+YDtcblx0XHR9XG5cdFx0Y29uc3QgbGFzdGVkaXQgPSAnPDxsYXN0RWRpdHxzaG9ydGN1dD0vfHNob3cgbGFzdCBlZGl0Pj4nO1xuXHRcdGNvbnN0IHRoYW5rID0gJ2lmKGRpZmYpezw8dGhhbmt8c2VuZCB0aGFua3M+Pn0nO1xuXHRcdGNvbnN0IGpzSGlzdG9yeSA9ICc8PGxhc3RDb250cmlifGxhc3Qgc2V0IG9mIGVkaXRzPj48PHNpbmNlTWV8Y2hhbmdlcyBzaW5jZSBtaW5lPj4nO1xuXHRcdGNvbnN0IGxpbmtzaGVyZSA9ICc8PHdoYXRMaW5rc0hlcmV8c2hvcnRjdXQ9bHx3aGF0IGxpbmtzIGhlcmU+Pic7XG5cdFx0Y29uc3QgcmVsYXRlZCA9ICc8PHJlbGF0ZWRDaGFuZ2VzfHNob3J0Y3V0PXJ8cmVsYXRlZCBjaGFuZ2VzPj4nO1xuXHRcdGNvbnN0IHNlYXJjaCA9ICc8bWVudXJvdz48PHNlYXJjaHxzaG9ydGN1dD1zPj48L21lbnVyb3c+Jztcblx0XHRjb25zdCB3YXRjaCA9ICc8bWVudXJvdz48PHVud2F0Y2h8dW53YXRjaFNob3J0Pj58PDx3YXRjaHxzaG9ydGN1dD13fHdhdGNoVGhpbmd5Pj48L21lbnVyb3c+Jztcblx0XHRjb25zdCBwcm90ZWN0ID0gJzxtZW51cm93Pjw8dW5wcm90ZWN0fHVucHJvdGVjdFNob3J0Pj58PDxwcm90ZWN0fHNob3J0Y3V0PXA+Pnw8PHByb3RlY3Rsb2d8bG9nPj48L21lbnVyb3c+Jztcblx0XHRjb25zdCBkZWwgPSAnPG1lbnVyb3c+PDx1bmRlbGV0ZXx1bmRlbGV0ZVNob3J0Pj58PDxkZWxldGV8c2hvcnRjdXQ9ZD4+fDw8ZGVsZXRlbG9nfGxvZz4+PC9tZW51cm93Pic7XG5cdFx0Y29uc3QgbW92ZSA9ICc8PG1vdmV8c2hvcnRjdXQ9bXxtb3ZlIHBhZ2U+Pic7XG5cdFx0Y29uc3QgbnVsbFB1cmdlID0gJzxtZW51cm93Pjw8bnVsbEVkaXR8c2hvcnRjdXQ9bnxudWxsIGVkaXQ+Pnw8PHB1cmdlfHNob3J0Y3V0PVA+PjwvbWVudXJvdz4nO1xuXHRcdGNvbnN0IHZpZXdPcHRpb25zID0gJzxtZW51cm93Pjw8dmlld3xzaG9ydGN1dD12Pj58PDxyZW5kZXJ8c2hvcnRjdXQ9Uz4+fDw8cmF3Pj48L21lbnVyb3c+Jztcblx0XHRjb25zdCBlZGl0Um93ID1cblx0XHRcdCdpZihvbGRpZCl7JyArXG5cdFx0XHQnPG1lbnVyb3c+PDxlZGl0fHNob3J0Y3V0PWU+Pnw8PGVkaXRPbGR8c2hvcnRjdXQ9ZXx0aGlzJm5ic3A7cmV2aXNpb24+PjwvbWVudXJvdz4nICtcblx0XHRcdCc8bWVudXJvdz48PHJldmVydHxzaG9ydGN1dD12Pj58PDx1bmRvPj48L21lbnVyb3c+JyArXG5cdFx0XHQnfWVsc2V7PDxlZGl0fHNob3J0Y3V0PWU+Pn0nO1xuXHRcdGNvbnN0IG1hcmtQYXRyb2xsZWQgPSAnaWYocmNpZCl7PDxtYXJrcGF0cm9sbGVkfG1hcmsgcGF0cm9sbGVkPj59Jztcblx0XHRjb25zdCBuZXdUb3BpYyA9ICdpZih0YWxrKXs8PG5ld3xzaG9ydGN1dD0rfG5ldyB0b3BpYz4+fSc7XG5cdFx0Y29uc3QgcHJvdGVjdERlbGV0ZSA9IGBpZihhZG1pbil7JHtwcm90ZWN0fSR7ZGVsfX1gO1xuXHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cEFjdGlvbnNNZW51JykpIHtcblx0XHRcdHMucHVzaChgPDxtYWlubGluaz4+KiR7ZHJvcGRpdn0ke21lbnVUaXRsZSgnYWN0aW9ucycpfWApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzLnB1c2goYCR7ZHJvcGRpdn08PG1haW5saW5rPj5gKTtcblx0XHR9XG5cdFx0cy5wdXNoKCc8bWVudT4nLCBlZGl0Um93ICsgbWFya1BhdHJvbGxlZCArIG5ld1RvcGljICsgaGlzdCArIGxhc3RlZGl0ICsgdGhhbmspO1xuXHRcdGlmICghc2hvcnRlcikge1xuXHRcdFx0cy5wdXNoKGpzSGlzdG9yeSk7XG5cdFx0fVxuXHRcdHMucHVzaChtb3ZlICsgbGlua3NoZXJlICsgcmVsYXRlZCk7XG5cdFx0aWYgKCFzaG9ydGVyKSB7XG5cdFx0XHRzLnB1c2gobnVsbFB1cmdlICsgc2VhcmNoKTtcblx0XHR9XG5cdFx0aWYgKCFzaG9ydGVyKSB7XG5cdFx0XHRzLnB1c2godmlld09wdGlvbnMpO1xuXHRcdH1cblx0XHRzLnB1c2goXG5cdFx0XHRgPGhyPiR7d2F0Y2h9JHtwcm90ZWN0RGVsZXRlfWAsXG5cdFx0XHQnPGhyPicgK1xuXHRcdFx0XHQnaWYodGFsayl7PDxhcnRpY2xlfHNob3J0Y3V0PWF8dmlldyBhcnRpY2xlPj48PGVkaXRBcnRpY2xlfGVkaXQgYXJ0aWNsZT4+fScgK1xuXHRcdFx0XHQnZWxzZXs8PHRhbGt8c2hvcnRjdXQ9dHx0YWxrIHBhZ2U+Pjw8ZWRpdFRhbGt8ZWRpdCB0YWxrPj4nICtcblx0XHRcdFx0YDw8bmV3VGFsa3xzaG9ydGN1dD0rfG5ldyB0b3BpYz4+fTwvbWVudT4ke2VuZGRpdn1gXG5cdFx0KTtcblx0XHQvLyB1c2VyIG1lbnUgc3RhcnRzIGhlcmVcblx0XHRjb25zdCBlbWFpbCA9ICc8PGVtYWlsfHNob3J0Y3V0PUV8ZW1haWwgdXNlcj4+Jztcblx0XHRjb25zdCBjb250cmlicyA9XG5cdFx0XHQnaWYod2lraW1lZGlhKXs8bWVudXJvdz59PDxjb250cmlic3xzaG9ydGN1dD1jfGNvbnRyaWJ1dGlvbnM+PmlmKHdpa2ltZWRpYSl7PC9tZW51cm93Pn0nICtcblx0XHRcdCdpZihhZG1pbil7PG1lbnVyb3c+PDxkZWxldGVkQ29udHJpYnM+PjwvbWVudXJvdz59Jztcblx0XHRzLnB1c2goXG5cdFx0XHRgaWYodXNlcil7KiR7ZHJvcGRpdn0ke21lbnVUaXRsZSgndXNlcicpfWAsXG5cdFx0XHQnPG1lbnU+Jyxcblx0XHRcdCc8bWVudXJvdz48PHVzZXJQYWdlfHNob3J0Y3V0PXV8dXNlciZuYnNwO3BhZ2U+Pnw8PHVzZXJTcGFjZXxzcGFjZT4+PC9tZW51cm93PicsXG5cdFx0XHQnPDx1c2VyVGFsa3xzaG9ydGN1dD10fHVzZXIgdGFsaz4+PDxlZGl0VXNlclRhbGt8ZWRpdCB1c2VyIHRhbGs+PicgK1xuXHRcdFx0XHQnPDxuZXdVc2VyVGFsa3xzaG9ydGN1dD0rfGxlYXZlIGNvbW1lbnQ+Pidcblx0XHQpO1xuXHRcdGlmIChzaG9ydGVyKSB7XG5cdFx0XHRzLnB1c2goYGlmKGlwdXNlcil7fWVsc2V7JHtlbWFpbH19YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHMucHVzaChgaWYoaXB1c2VyKXs8PGFyaW4+Pn1lbHNleyR7ZW1haWx9fWApO1xuXHRcdH1cblx0XHRzLnB1c2goXG5cdFx0XHRgPGhyPiR7Y29udHJpYnN9PDx1c2VybG9nfHNob3J0Y3V0PUx8dXNlciBsb2c+PmAsXG5cdFx0XHQnaWYod2lraW1lZGlhKXs8PGNvdW50fHNob3J0Y3V0PSN8ZWRpdCBjb3VudGVyPj59Jyxcblx0XHRcdCdpZihhZG1pbil7PG1lbnVyb3c+PDx1bmJsb2NrfHVuYmxvY2tTaG9ydD4+fDw8YmxvY2t8c2hvcnRjdXQ9YnxibG9jayB1c2VyPj48L21lbnVyb3c+fScsXG5cdFx0XHQnPDxibG9ja2xvZ3xzaG9ydGN1dD1CfGJsb2NrIGxvZz4+Jyxcblx0XHRcdGA8L21lbnU+JHtlbmRkaXZ9fWBcblx0XHQpO1xuXHRcdC8vIHBvcHVwcyBtZW51IHN0YXJ0cyBoZXJlXG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwU2V0dXBNZW51JykgJiYgIXgubmF2cG9wLmhhc1BvcHVwTWVudSAvKiBGSVhNRTogaGFjayAqLykge1xuXHRcdFx0eC5uYXZwb3AuaGFzUG9wdXBNZW51ID0gdHJ1ZTtcblx0XHRcdHMucHVzaChcblx0XHRcdFx0YCoke2Ryb3BkaXZ9JHttZW51VGl0bGUoJ3BvcHVwc01lbnUnKX08bWVudT5gLFxuXHRcdFx0XHQnPDx0b2dnbGVQcmV2aWV3c3x0b2dnbGUgcHJldmlld3M+PicsXG5cdFx0XHRcdCc8PHB1cmdlUG9wdXBzfHJlc2V0Pj4nLFxuXHRcdFx0XHQnPDxkaXNhYmxlUG9wdXBzfGRpc2FibGU+PicsXG5cdFx0XHRcdGA8L21lbnU+JHtlbmRkaXZ9YFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwocy5qb2luKCcnKSwgeC5hcnRpY2xlLCB4LnBhcmFtcyk7XG5cdH07XG5cdGNvbnN0IG1lbnVUaXRsZSA9IChzKSA9PiB7XG5cdFx0cmV0dXJuIGA8YSBocmVmPVwiI1wiIG5vUG9wdXA9MT4ke3BvcHVwU3RyaW5nKHMpfTwvYT5gO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwUmVkaXJUaXRsZSA9IHBnLnN0cnVjdHVyZXMubWVudXMucG9wdXBUaXRsZTtcblx0cGcuc3RydWN0dXJlcy5tZW51cy5wb3B1cFJlZGlyVG9wTGlua3MgPSBwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwVG9wTGlua3M7XG5cdGNvcHlTdHJ1Y3R1cmUoJ21lbnVzJywgJ3Nob3J0bWVudXMnKTtcblx0cGcuc3RydWN0dXJlcy5zaG9ydG1lbnVzLnBvcHVwVG9wTGlua3MgPSAoeCkgPT4ge1xuXHRcdHJldHVybiBwZy5zdHJ1Y3R1cmVzLm1lbnVzLnBvcHVwVG9wTGlua3MoeCwgdHJ1ZSk7XG5cdH07XG5cdHBnLnN0cnVjdHVyZXMuc2hvcnRtZW51cy5wb3B1cFJlZGlyVG9wTGlua3MgPSBwZy5zdHJ1Y3R1cmVzLnNob3J0bWVudXMucG9wdXBUb3BMaW5rcztcblx0cGcuc3RydWN0dXJlcy5saXRlID0ge307XG5cdHBnLnN0cnVjdHVyZXMubGl0ZS5wb3B1cExheW91dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gWydwb3B1cFRpdGxlJywgJ3BvcHVwUHJldmlldyddO1xuXHR9O1xuXHRwZy5zdHJ1Y3R1cmVzLmxpdGUucG9wdXBUaXRsZSA9ICh4KSA9PiB7XG5cdFx0bG9nKGAke3guYXJ0aWNsZX06IHN0cnVjdHVyZXMubGl0ZS5wb3B1cFRpdGxlYCk7XG5cdFx0Ly8gcmV0dXJuIG5hdmxpbmtTdHJpbmdUb0hUTUwoJzxiPjw8bWFpbmxpbms+PjwvYj4nLHguYXJ0aWNsZSx4LnBhcmFtcyk7XG5cdFx0cmV0dXJuIGA8ZGl2PjxzcGFuIGNsYXNzPVwicG9wdXBfbWFpbmxpbmtcIj48Yj4ke3guYXJ0aWNsZS50b1N0cmluZygpfTwvYj48L3NwYW4+PC9kaXY+YDtcblx0fTtcblx0Ly8gRU5ERklMRTogc3RydWN0dXJlcy5qc1xuXHQvLyBTVEFSVEZJTEU6IGF1dG9lZGl0LmpzXG5cdGNvbnN0IHN1YnN0aXR1dGUgPSAoZGF0YSwgY21kQm9keSkgPT4ge1xuXHRcdC8vIG13Lm5vdGlmeShgc3ViXFxuZnJvbTogJHtjbWRCb2R5LmZyb219XFxudG86ICR7Y21kQm9keS50b31cXG5mbGFnczogJHtjbWRCb2R5LmZsYWdzfWAsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnd2Fybid9KTtcblx0XHRjb25zdCBmcm9tUmUgPSBuZXcgUmVnRXhwKGNtZEJvZHkuZnJvbSwgY21kQm9keS5mbGFncyk7XG5cdFx0cmV0dXJuIGRhdGEucmVwbGFjZShmcm9tUmUsIGNtZEJvZHkudG8pO1xuXHR9O1xuXHRjb25zdCBleGVjQ21kcyA9IChkYXRhLCBjbWRMaXN0KSA9PiB7XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGNtZExpc3QpIHtcblx0XHRcdGRhdGEgPSBlbGVtZW50LmFjdGlvbihkYXRhLCBlbGVtZW50KTtcblx0XHR9XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH07XG5cdGNvbnN0IHBhcnNlQ21kID0gZnVuY3Rpb24gcGFyc2VDbWQoc3RyKSB7XG5cdFx0Ly8gcmV0dXJucyBhIGxpc3Qgb2YgY29tbWFuZHNcblx0XHRpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHRsZXQgcCA9IGZhbHNlO1xuXHRcdHN3aXRjaCAoc3RyLmNoYXJBdCgwKSkge1xuXHRcdFx0Y2FzZSAncyc6XG5cdFx0XHRcdHAgPSBwYXJzZVN1YnN0aXR1dGUoc3RyKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChwKSB7XG5cdFx0XHRyZXR1cm4gW3AsIHBhcnNlQ21kKHAucmVtYWluZGVyKV07XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0Ly8gRklYTUU6IE9ubHkgdXNlZCBvbmNlIGhlcmUsIGNvbmZ1c2luZyB3aXRoIG5hdGl2ZSAoYW5kIG1vcmUgd2lkZWx5LXVzZWQpIHVuZXNjYXBlLCBzaG91bGQgcHJvYmFibHkgYmUgcmVwbGFjZWRcblx0Ly8gVGhlbiBhZ2FpbiwgdW5lc2NhcGUgaXMgc2VtaS1zb2Z0LWRlcHJlY2F0ZWQsIHNvIHdlIHNob3VsZCBsb29rIGludG8gcmVwbGFjaW5nIHRoYXQgdG9vXG5cdGNvbnN0IHVuRXNjYXBlID0gKHN0ciwgc2VwKSA9PiB7XG5cdFx0cmV0dXJuIHN0clxuXHRcdFx0LnNwbGl0KCdcXFxcXFxcXCcpXG5cdFx0XHQuam9pbignXFxcXCcpXG5cdFx0XHQuc3BsaXQoYFxcXFwke3NlcH1gKVxuXHRcdFx0LmpvaW4oc2VwKVxuXHRcdFx0LnNwbGl0KFN0cmluZy5yYXdgXFxuYClcblx0XHRcdC5qb2luKCdcXG4nKTtcblx0fTtcblx0Y29uc3QgcGFyc2VTdWJzdGl0dXRlID0gKHN0cikgPT4ge1xuXHRcdC8vIHRha2VzIGEgc3RyaW5nIGxpa2Ugcy9hL2IvZmxhZ3M7b3RoZXJjbWRzIGFuZCBwYXJzZXMgaXRcblx0XHRsZXQgZnJvbTtcblx0XHRsZXQgdG87XG5cdFx0bGV0IGZsYWdzO1xuXHRcdGxldCB0bXA7XG5cdFx0aWYgKHN0ci5sZW5ndGggPCA0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IHNlcCA9IHN0ci5jaGFyQXQoMSk7XG5cdFx0c3RyID0gc3RyLnNsaWNlKDIpO1xuXHRcdHRtcCA9IHNraXBPdmVyKHN0ciwgc2VwKTtcblx0XHRpZiAodG1wKSB7XG5cdFx0XHRmcm9tID0gdG1wLnNlZ21lbnQ7XG5cdFx0XHRzdHIgPSB0bXAucmVtYWluZGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHRtcCA9IHNraXBPdmVyKHN0ciwgc2VwKTtcblx0XHRpZiAodG1wKSB7XG5cdFx0XHR0byA9IHRtcC5zZWdtZW50O1xuXHRcdFx0c3RyID0gdG1wLnJlbWFpbmRlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRmbGFncyA9ICcnO1xuXHRcdGlmIChzdHIubGVuZ3RoID4gMCkge1xuXHRcdFx0dG1wID0gc2tpcE92ZXIoc3RyLCAnOycpIHx8IHNraXBUb0VuZChzdHIsICc7Jyk7XG5cdFx0XHRpZiAodG1wKSB7XG5cdFx0XHRcdGZsYWdzID0gdG1wLnNlZ21lbnQ7XG5cdFx0XHRcdHN0ciA9IHRtcC5yZW1haW5kZXI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRhY3Rpb246IHN1YnN0aXR1dGUsXG5cdFx0XHRmcm9tLFxuXHRcdFx0dG8sXG5cdFx0XHRmbGFncyxcblx0XHRcdHJlbWFpbmRlcjogc3RyLFxuXHRcdH07XG5cdH07XG5cdGNvbnN0IHNraXBPdmVyID0gKHN0ciwgc2VwKSA9PiB7XG5cdFx0Y29uc3QgZW5kU2VnbWVudCA9IGZpbmROZXh0KHN0ciwgc2VwKTtcblx0XHRpZiAoZW5kU2VnbWVudCA8IDApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3Qgc2VnbWVudCA9IHVuRXNjYXBlKHN0ci5zbGljZSgwLCBNYXRoLm1heCgwLCBlbmRTZWdtZW50KSksIHNlcCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlZ21lbnQsXG5cdFx0XHRyZW1haW5kZXI6IHN0ci5zbGljZShNYXRoLm1heCgwLCBlbmRTZWdtZW50ICsgMSkpLFxuXHRcdH07XG5cdH07XG5cdGNvbnN0IHNraXBUb0VuZCA9IChzdHIsIF9zZXApID0+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VnbWVudDogc3RyLFxuXHRcdFx0cmVtYWluZGVyOiAnJyxcblx0XHR9O1xuXHR9O1xuXHRjb25zdCBmaW5kTmV4dCA9IChzdHIsIGNoKSA9PiB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChzdHIuY2hhckF0KGkpID09PSAnXFxcXCcpIHtcblx0XHRcdFx0aSArPSAyO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0ci5jaGFyQXQoaSkgPT09IGNoKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH07XG5cdGNvbnN0IHNldENoZWNrYm94ID0gKHBhcmFtLCBib3gpID0+IHtcblx0XHRjb25zdCB2YWwgPSBtdy51dGlsLmdldFBhcmFtVmFsdWUocGFyYW0pO1xuXHRcdGlmICh2YWwpIHtcblx0XHRcdHN3aXRjaCAodmFsKSB7XG5cdFx0XHRcdGNhc2UgJzEnOlxuXHRcdFx0XHRjYXNlICd5ZXMnOlxuXHRcdFx0XHRjYXNlICd0cnVlJzpcblx0XHRcdFx0XHRib3guY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJzAnOlxuXHRcdFx0XHRjYXNlICdubyc6XG5cdFx0XHRcdGNhc2UgJ2ZhbHNlJzpcblx0XHRcdFx0XHRib3guY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3QgYXV0b0VkaXQgPSBmdW5jdGlvbiBhdXRvRWRpdCgpIHtcblx0XHRzZXR1cFBvcHVwcygoKSA9PiB7XG5cdFx0XHRpZiAobXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvaW1wbCcpICE9PSBwb3B1cFN0cmluZygnYXV0b2VkaXRfdmVyc2lvbicpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2F1dG93YXRjaGxpc3QnKSAmJiBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2FjdG9rZW4nKSA9PT0gYXV0b0NsaWNrVG9rZW4oKSkge1xuXHRcdFx0XHRwZy5mbi5tb2RpZnlXYXRjaGxpc3QobXcudXRpbC5nZXRQYXJhbVZhbHVlKCd0aXRsZScpLCBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2FjdGlvbicpKTtcblx0XHRcdH1cblx0XHRcdGlmICghZG9jdW1lbnQuZWRpdGZvcm0pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGF1dG9FZGl0LmFscmVhZHlSYW4pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0YXV0b0VkaXQuYWxyZWFkeVJhbiA9IHRydWU7XG5cdFx0XHRjb25zdCBjbWRTdHJpbmcgPSBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2F1dG9lZGl0Jyk7XG5cdFx0XHRpZiAoY21kU3RyaW5nKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgZWRpdGJveCA9IGRvY3VtZW50LmVkaXRmb3JtLndwVGV4dGJveDE7XG5cdFx0XHRcdFx0Y29uc3QgY21kTGlzdCA9IHBhcnNlQ21kKGNtZFN0cmluZyk7XG5cdFx0XHRcdFx0Y29uc3QgaW5wdXQgPSBlZGl0Ym94LnZhbHVlO1xuXHRcdFx0XHRcdGNvbnN0IG91dHB1dCA9IGV4ZWNDbWRzKGlucHV0LCBjbWRMaXN0KTtcblx0XHRcdFx0XHRlZGl0Ym94LnZhbHVlID0gb3V0cHV0O1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHNldENoZWNrYm94KCdhdXRvbWlub3InLCBkb2N1bWVudC5lZGl0Zm9ybS53cE1pbm9yZWRpdCk7XG5cdFx0XHRzZXRDaGVja2JveCgnYXV0b3dhdGNoJywgZG9jdW1lbnQuZWRpdGZvcm0ud3BXYXRjaHRoaXMpO1xuXHRcdFx0Y29uc3QgcnZpZCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3J2Jyk7XG5cdFx0XHRpZiAocnZpZCkge1xuXHRcdFx0XHRjb25zdCB1cmwgPSBgJHtwZy53aWtpLmFwaXdpa2liYXNlfT9hY3Rpb249cXVlcnkmZm9ybWF0PWpzb24mZm9ybWF0dmVyc2lvbj0yJnByb3A9cmV2aXNpb25zJnJldmlkcz0ke3J2aWR9YDtcblx0XHRcdFx0c3RhcnREb3dubG9hZCh1cmwsIG51bGwsIGF1dG9FZGl0Mik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhdXRvRWRpdDIoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblx0Y29uc3QgYXV0b0VkaXQyID0gKGQpID0+IHtcblx0XHRsZXQgc3VtbWFyeSA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3N1bW1hcnknKTtcblx0XHRsZXQgc3VtbWFyeXByb21wdCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3N1bW1hcnlwcm9tcHQnKTtcblx0XHRsZXQgc3VtbWFyeW5vdGljZSA9ICcnO1xuXHRcdGlmIChkICYmIGQuZGF0YSAmJiBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ2F1dG9ydicpKSB7XG5cdFx0XHRjb25zdCBzID0gZ2V0UnZTdW1tYXJ5KHN1bW1hcnksIGQuZGF0YSk7XG5cdFx0XHRpZiAocyA9PT0gZmFsc2UpIHtcblx0XHRcdFx0c3VtbWFyeXByb21wdCA9IHRydWU7XG5cdFx0XHRcdHN1bW1hcnlub3RpY2UgPSBwb3B1cFN0cmluZygnRmFpbGVkIHRvIGdldCByZXZpc2lvbiBpbmZvcm1hdGlvbiwgcGxlYXNlIGVkaXQgbWFudWFsbHkuXFxuXFxuJyk7XG5cdFx0XHRcdHN1bW1hcnkgPSBzaW1wbGVQcmludGYoc3VtbWFyeSwgW213LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnYXV0b3J2JyksICcodW5rbm93biknLCAnKHVua25vd24pJ10pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3VtbWFyeSA9IHM7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzdW1tYXJ5cHJvbXB0KSB7XG5cdFx0XHRjb25zdCB0eHQgPSBzdW1tYXJ5bm90aWNlICsgcG9wdXBTdHJpbmcoJ0VudGVyIGEgbm9uLWVtcHR5IGVkaXQgc3VtbWFyeSBvciBwcmVzcyBjYW5jZWwgdG8gYWJvcnQnKTtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gcHJvbXB0KHR4dCwgc3VtbWFyeSk7XG5cdFx0XHRpZiAocmVzcG9uc2UpIHtcblx0XHRcdFx0c3VtbWFyeSA9IHJlc3BvbnNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoc3VtbWFyeSkge1xuXHRcdFx0ZG9jdW1lbnQuZWRpdGZvcm0ud3BTdW1tYXJ5LnZhbHVlID0gc3VtbWFyeTtcblx0XHR9XG5cdFx0Ly8gQXR0ZW1wdCB0byBhdm9pZCBwb3NzaWJsZSBwcmVtYXR1cmUgY2xpY2tpbmcgb2YgdGhlIHNhdmUgYnV0dG9uXG5cdFx0Ly8gKG1heWJlIGRlbGF5cyBpbiB1cGRhdGVzIHRvIHRoZSBET00gYXJlIHRvIGJsYW1lPz8gb3IgYSByZWQgaGVycmluZylcblx0XHRzZXRUaW1lb3V0KGF1dG9FZGl0MywgMTAwKTtcblx0fTtcblx0Y29uc3QgYXV0b0NsaWNrVG9rZW4gPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG13LnVzZXIuc2Vzc2lvbklkKCk7XG5cdH07XG5cdGNvbnN0IGF1dG9FZGl0MyA9ICgpID0+IHtcblx0XHRpZiAobXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhY3Rva2VuJykgIT09IGF1dG9DbGlja1Rva2VuKCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgYnRuID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdhdXRvY2xpY2snKTtcblx0XHRpZiAoYnRuKSB7XG5cdFx0XHRpZiAoZG9jdW1lbnQuZWRpdGZvcm0gJiYgZG9jdW1lbnQuZWRpdGZvcm1bYnRuXSkge1xuXHRcdFx0XHRjb25zdCBidXR0b24gPSBkb2N1bWVudC5lZGl0Zm9ybVtidG5dO1xuXHRcdFx0XHRjb25zdCBtc2cgPSB0cHJpbnRmKFxuXHRcdFx0XHRcdCdUaGUgJXMgYnV0dG9uIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xpY2tlZC4gUGxlYXNlIHdhaXQgZm9yIHRoZSBuZXh0IHBhZ2UgdG8gbG9hZC4nLFxuXHRcdFx0XHRcdFtidXR0b24udmFsdWVdXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGJhbm5lck1lc3NhZ2UobXNnKTtcblx0XHRcdFx0ZG9jdW1lbnQudGl0bGUgPSBgKCR7ZG9jdW1lbnQudGl0bGV9KWA7XG5cdFx0XHRcdGJ1dHRvbi5jbGljaygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bXcubm90aWZ5KFxuXHRcdFx0XHRcdHRwcmludGYoJ0NvdWxkIG5vdCBmaW5kIGJ1dHRvbiAlcy4gUGxlYXNlIGNoZWNrIHRoZSBzZXR0aW5ncyBpbiB5b3VyIGphdmFzY3JpcHQgZmlsZS4nLCBbYnRuXSksXG5cdFx0XHRcdFx0e3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBiYW5uZXJNZXNzYWdlID0gKHMpID0+IHtcblx0XHRjb25zdCBoZWFkaW5ncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gxJyk7XG5cdFx0aWYgKGhlYWRpbmdzKSB7XG5cdFx0XHRjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBgPGZvbnQgc2l6ZT0rMT48Yj4ke3BnLmVzY2FwZVF1b3Rlc0hUTUwocyl9PC9iPjwvZm9udD5gO1xuXHRcdFx0aGVhZGluZ3NbMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBoZWFkaW5nc1swXSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBnZXRSdlN1bW1hcnkgPSAodGVtcGxhdGUsIGpzb24pID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbyA9IGdldEpzT2JqKGpzb24pO1xuXHRcdFx0Y29uc3QgW2VkaXRdID0gYW55Q2hpbGQoby5xdWVyeS5wYWdlcykucmV2aXNpb25zO1xuXHRcdFx0Y29uc3QgdGltZXN0YW1wID0gZWRpdC50aW1lc3RhbXBcblx0XHRcdFx0LnNwbGl0KC9bQS1aXS9nKVxuXHRcdFx0XHQuam9pbignICcpXG5cdFx0XHRcdC5yZXBsYWNlKC9eICp8ICokL2csICcnKTtcblx0XHRcdHJldHVybiBzaW1wbGVQcmludGYodGVtcGxhdGUsIFtlZGl0LnJldmlkLCB0aW1lc3RhbXAsIGVkaXQudXNlcmhpZGRlbiA/ICcoaGlkZGVuKScgOiBlZGl0LnVzZXJdKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH07XG5cdC8vIEVOREZJTEU6IGF1dG9lZGl0LmpzXG5cdC8vIFNUQVJURklMRTogZG93bmxvYWRlci5qc1xuXHQvKipcblx0ICogQGZpbGVvdmVydmlld1xuXHQgKiB7QHNvdXJjZSBEb3dubG9hZGVyfSwgYSB4bWxodHRwcmVxdWVzdCB3cmFwcGVyLCBhbmQgaGVscGVyIGZ1bmN0aW9ucy5cblx0ICovXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IERvd25sb2FkZXJcblx0ICpcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBjbGFzcyBUaGUgRG93bmxvYWRlciBjbGFzcy4gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8gZG93bmxvYWQgc3R1ZmYuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybCB0byBkb3dubG9hZC4gVGhpcyBjYW4gYmUgb21pdHRlZCBhbmQgc3VwcGxpZWQgbGF0ZXIuXG5cdCAqL1xuXHRjbGFzcyBEb3dubG9hZGVyIHtcblx0XHRjb25zdHJ1Y3Rvcih1cmwpIHtcblx0XHRcdGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXHRcdFx0fVxuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgdXJsIHRvIGRvd25sb2FkXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBBIHVuaXZlcnNhbGx5IHVuaXF1ZSBJRCBudW1iZXJcblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBpbnRlZ2VyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaWQgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBNb2RpZmljYXRpb24gZGF0ZSwgdG8gYmUgY3VsbGVkIGZyb20gdGhlIGluY29taW5nIGhlYWRlcnNcblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBEYXRlXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmxhc3RNb2RpZmllZCA9IG51bGw7XG5cdFx0XHQvKipcblx0XHRcdCAqIFdoYXQgdG8gZG8gd2hlbiB0aGUgZG93bmxvYWQgY29tcGxldGVzIHN1Y2Nlc3NmdWxseVxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIEZ1bmN0aW9uXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmNhbGxiYWNrRnVuY3Rpb24gPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBXaGF0IHRvIGRvIG9uIGZhaWx1cmVcblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBGdW5jdGlvblxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5vbkZhaWx1cmUgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBGbGFnIHNldCBvbiA8Y29kZT5hYm9ydDwvY29kZT5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBIVFRQIG1ldGhvZC4gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzkuaHRtbCBmb3Jcblx0XHRcdCAqIHBvc3NpYmlsaXRpZXMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubWV0aG9kID0gJ0dFVCc7XG5cdFx0XHQvKipcblx0XHRcdCAqIEFzeW5jIGZsYWcuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmFzeW5jID0gdHJ1ZTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU3VibWl0cyB0aGUgaHR0cCByZXF1ZXN0LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHsqfSB4XG5cdFx0ICovXG5cdFx0c2VuZCh4KSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmh0dHAuc2VuZCh4KTtcblx0XHR9XG5cdFx0LyogQWJvcnRzIHRoZSBkb3dubG9hZCwgc2V0dGluZyB0aGUgPGNvZGU+YWJvcnRlZDwvY29kZT4gZmllbGQgdG8gdHJ1ZS4gKi9cblx0XHRhYm9ydCgpIHtcblx0XHRcdGlmICghdGhpcy5odHRwKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5hYm9ydGVkID0gdHJ1ZTtcblx0XHRcdHJldHVybiB0aGlzLmh0dHAuYWJvcnQoKTtcblx0XHR9XG5cdFx0LyoqIFJldHVybnMgdGhlIGRvd25sb2FkZWQgZGF0YS4gKi9cblx0XHRnZXREYXRhKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLnJlc3BvbnNlVGV4dDtcblx0XHR9XG5cdFx0LyoqIFByZXBhcmVzIHRoZSBkb3dubG9hZC4gKi9cblx0XHRzZXRUYXJnZXQoKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHRoaXMuaHR0cC5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdGhpcy5hc3luYyk7XG5cdFx0XHR0aGlzLmh0dHAuc2V0UmVxdWVzdEhlYWRlcignQXBpLVVzZXItQWdlbnQnLCBwZy5hcGkudXNlckFnZW50KTtcblx0XHR9XG5cdFx0LyoqIEdldHMgdGhlIHN0YXRlIG9mIHRoZSBkb3dubG9hZC4gKi9cblx0XHRnZXRSZWFkeVN0YXRlKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0dHApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5odHRwLnJlYWR5U3RhdGU7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFN0YXJ0cyB0aGUgZG93bmxvYWQuXG5cdFx0ICogTm90ZSB0aGF0IHNldFRhcmdldCB7QHNvdXJjZSBEb3dubG9hZGVyI3NldFRhcmdldH0gbXVzdCBiZSBydW4gZmlyc3Rcblx0XHQgKi9cblx0XHRzdGFydCgpIHtcblx0XHRcdGlmICghdGhpcy5odHRwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0cGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzW3RoaXMuaWRdID0gc2VsZjtcblx0XHRcdHRoaXMuaHR0cC5zZW5kKG51bGwpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBHZXRzIHRoZSAnTGFzdC1Nb2RpZmllZCcgZGF0ZSBmcm9tIHRoZSBkb3dubG9hZCBoZWFkZXJzLlxuXHRcdCAqIFNob3VsZCBiZSBydW4gYWZ0ZXIgdGhlIGRvd25sb2FkIGNvbXBsZXRlcy5cblx0XHQgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IG9uIGZhaWx1cmUuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtEYXRlfVxuXHRcdCAqL1xuXHRcdGdldExhc3RNb2RpZmllZERhdGUoKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdGxldCBsYXN0bW9kO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bGFzdG1vZCA9IHRoaXMuaHR0cC5nZXRSZXNwb25zZUhlYWRlcignTGFzdC1Nb2RpZmllZCcpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGVtcHR5ICovXG5cdFx0XHR9XG5cdFx0XHRpZiAobGFzdG1vZCkge1xuXHRcdFx0XHRyZXR1cm4gbmV3IERhdGUobGFzdG1vZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU2V0cyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIGNhbGxiYWNrIGZ1bmN0aW9uLCBjYWxsZWQgYXMgPGNvZGU+Zih0aGlzKTwvY29kZT4gb24gc3VjY2Vzc1xuXHRcdCAqL1xuXHRcdHNldENhbGxiYWNrKGYpIHtcblx0XHRcdGlmICghdGhpcy5odHRwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuaHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmO1xuXHRcdH1cblx0XHRnZXRTdGF0dXMoKSB7XG5cdFx0XHRpZiAoIXRoaXMuaHR0cCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmh0dHAuc3RhdHVzO1xuXHRcdH1cblx0fVxuXHRuZXcgRG93bmxvYWRlcigpO1xuXHRwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3MgPSB7fTtcblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyB7QHNvdXJjZSBEb3dubG9hZGVyfSBhbmQgcHJlcGFyZXMgaXQgZm9yIGFjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgdXJsIHRvIGRvd25sb2FkXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gaWQgVGhlIElEIG9mIHRoZSB7QHNvdXJjZSBEb3dubG9hZGVyfSBvYmplY3Rcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgb24gc3VjY2Vzc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gb25mYWlsdXJlXG5cdCAqIEByZXR1cm4ge1N0cmluZy9Eb3dubG9hZGVyfSB0aGUge0Bzb3VyY2UgRG93bmxvYWRlcn0gb2JqZWN0IGNyZWF0ZWQsIG9yICdvaGRlYXInIGlmIGFuIHVuc3VwcG9ydGVkIGJyb3dzZXJcblx0ICovXG5cdGNvbnN0IG5ld0Rvd25sb2FkID0gZnVuY3Rpb24gbmV3RG93bmxvYWQodXJsLCBpZCwgY2FsbGJhY2ssIG9uZmFpbHVyZSkge1xuXHRcdGNvbnN0IGQgPSBuZXcgRG93bmxvYWRlcih1cmwpO1xuXHRcdGlmICghZC5odHRwKSB7XG5cdFx0XHRyZXR1cm4gJ29oZGVhcic7XG5cdFx0fVxuXHRcdGQuaWQgPSBpZDtcblx0XHRkLnNldFRhcmdldCgpO1xuXHRcdGlmICghb25mYWlsdXJlKSB7XG5cdFx0XHRvbmZhaWx1cmUgPSAyO1xuXHRcdH1cblx0XHRjb25zdCBmID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKGQuZ2V0UmVhZHlTdGF0ZSgpID09PSA0KSB7XG5cdFx0XHRcdGRlbGV0ZSBwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3NbdGhpcy5pZF07XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aWYgKGQuZ2V0U3RhdHVzKCkgPT09IDIwMCkge1xuXHRcdFx0XHRcdFx0ZC5kYXRhID0gZC5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRkLmxhc3RNb2RpZmllZCA9IGQuZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2soZCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygb25mYWlsdXJlID09PSB0eXBlb2YgMSkge1xuXHRcdFx0XHRcdFx0aWYgKG9uZmFpbHVyZSA+IDApIHtcblx0XHRcdFx0XHRcdFx0Ly8gcmV0cnlcblx0XHRcdFx0XHRcdFx0bmV3RG93bmxvYWQodXJsLCBpZCwgY2FsbGJhY2ssIG9uZmFpbHVyZSAtIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIG9uZmFpbHVyZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdFx0b25mYWlsdXJlKGQsIHVybCwgaWQsIGNhbGxiYWNrKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8qIGlnbm9yZSBpdCAqL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRkLnNldENhbGxiYWNrKGYpO1xuXHRcdHJldHVybiBkO1xuXHR9O1xuXHQvKipcblx0ICogU2ltdWxhdGVzIGEgZG93bmxvYWQgZnJvbSBjYWNoZWQgZGF0YS5cblx0ICogVGhlIHN1cHBsaWVkIGRhdGEgaXMgcHV0IGludG8gYSB7QHNvdXJjZSBEb3dubG9hZGVyfSBhcyBpZiBpdCBoYWQgZG93bmxvYWRlZCBpdC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgdXJsLlxuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGlkIFRoZSBJRC5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrLCB3aGljaCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFzIDxjb2RlPmNhbGxiYWNrKGQpPC9jb2RlPixcblx0ICogd2hlcmUgPGNvZGU+ZDwvY29kZT4gaXMgdGhlIG5ldyB7QHNvdXJjZSBEb3dubG9hZGVyfS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgVGhlIChjYWNoZWQpIGRhdGEuXG5cdCAqIEBwYXJhbSB7RGF0ZX0gbGFzdE1vZGlmaWVkIFRoZSAoY2FjaGVkKSBsYXN0IG1vZGlmaWVkIGRhdGUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvd25lclxuXHQgKi9cblx0Y29uc3QgZmFrZURvd25sb2FkID0gKHVybCwgaWQsIGNhbGxiYWNrLCBkYXRhLCBsYXN0TW9kaWZpZWQsIG93bmVyKSA9PiB7XG5cdFx0Y29uc3QgZCA9IG5ld0Rvd25sb2FkKHVybCwgY2FsbGJhY2spO1xuXHRcdGQub3duZXIgPSBvd25lcjtcblx0XHRkLmlkID0gaWQ7XG5cdFx0ZC5kYXRhID0gZGF0YTtcblx0XHRkLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDtcblx0XHRyZXR1cm4gY2FsbGJhY2soZCk7XG5cdH07XG5cdC8qKlxuXHQgKiBTdGFydHMgYSBkb3dubG9hZC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgdXJsIHRvIGRvd25sb2FkXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gaWQgVGhlIElEIG9mIHRoZSB7QHNvdXJjZSBEb3dubG9hZGVyfSBvYmplY3Rcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgb24gc3VjY2Vzc1xuXHQgKiBAcmV0dXJuIHtTdHJpbmcvRG93bmxvYWRlcn0gdGhlIHtAc291cmNlIERvd25sb2FkZXJ9IG9iamVjdCBjcmVhdGVkLCBvciAnb2hkZWFyJyBpZiBhbiB1bnN1cHBvcnRlZCBicm93c2VyXG5cdCAqL1xuXHRjb25zdCBzdGFydERvd25sb2FkID0gKHVybCwgaWQsIGNhbGxiYWNrKSA9PiB7XG5cdFx0Y29uc3QgZCA9IG5ld0Rvd25sb2FkKHVybCwgaWQsIGNhbGxiYWNrKTtcblx0XHRpZiAodHlwZW9mIGQgPT09IHR5cGVvZiAnJykge1xuXHRcdFx0cmV0dXJuIGQ7XG5cdFx0fVxuXHRcdGQuc3RhcnQoKTtcblx0XHRyZXR1cm4gZDtcblx0fTtcblx0LyoqXG5cdCAqIEFib3J0cyBhbGwgZG93bmxvYWRzIHdoaWNoIGhhdmUgYmVlbiBzdGFydGVkLlxuXHQgKi9cblx0Y29uc3QgYWJvcnRBbGxEb3dubG9hZHMgPSAoKSA9PiB7XG5cdFx0Zm9yIChjb25zdCB4IGluIHBnLm1pc2MuZG93bmxvYWRzSW5Qcm9ncmVzcykge1xuXHRcdFx0aWYgKCFPYmplY3QuaGFzT3duKHBnLm1pc2MuZG93bmxvYWRzSW5Qcm9ncmVzcywgeCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRwZy5taXNjLmRvd25sb2Fkc0luUHJvZ3Jlc3NbeF0uYWJvcnRlZCA9IHRydWU7XG5cdFx0XHRcdHBnLm1pc2MuZG93bmxvYWRzSW5Qcm9ncmVzc1t4XS5hYm9ydCgpO1xuXHRcdFx0XHRkZWxldGUgcGcubWlzYy5kb3dubG9hZHNJblByb2dyZXNzW3hdO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGVtcHR5ICovXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyBFTkRGSUxFOiBkb3dubG9hZGVyLmpzXG5cdC8vIFNUQVJURklMRTogbGl2ZXByZXZpZXcuanNcblx0Ly8gVE9ETzogbG9jYXRpb24gaXMgb2Z0ZW4gbm90IGNvcnJlY3QgKGVnIHJlbGF0aXZlIGxpbmtzIGluIHByZXZpZXdzKVxuXHQvLyBOT1RFOiByZW1vdmVkIG1kNSBhbmQgaW1hZ2UgYW5kIG1hdGggcGFyc2luZy4gd2FzIGJyb2tlbiwgbG90cyBvZiBieXRlcy5cblx0LyoqXG5cdCAqIEluc3RhVmlldyAtIGEgTWVkaWF3aWtpIHRvIEhUTUwgY29udmVydGVyIGluIEphdmFTY3JpcHRcblx0ICogVmVyc2lvbiAwLjYuMVxuXHQgKiBDb3B5cmlnaHQgKEMpIFBlZHJvIEZheW9sbGUgMjAwNS0yMDA2XG5cdCAqIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vc2VyOlBpbGFmfVxuXHQgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2Vcblx0ICpcblx0ICogQ2hhbmdlbG9nOlxuXHQgKlxuXHQgKiAwLjYuMVxuXHQgKiAtIEZpeGVkIHByb2JsZW0gY2F1c2VkIGJ5IFxcciBjaGFyYWN0ZXJzXG5cdCAqIC0gSW1wcm92ZWQgaW5saW5lIGZvcm1hdHRpbmcgcGFyc2VyXG5cdCAqXG5cdCAqIDAuNlxuXHQgKiAtIENoYW5nZWQgbmFtZSB0byBJbnN0YVZpZXdcblx0ICogLSBTb21lIG1ham9yIGNvZGUgcmVvcmdhbml6YXRpb25zIGFuZCBmYWN0b3JlZCBvdXQgc29tZSBjb21tb24gZnVuY3Rpb25zXG5cdCAqIC0gSGFuZGxlZCBjb252ZXJzaW9uIG9mIHJlbGF0aXZlIGxpbmtzIChpLmUuIFtbL2Zvb11dKVxuXHQgKiAtIEZpeGVkIG1pc3JlbmRlcmluZyBvZiBhZGphY2VudCBkZWZpbml0aW9uIGxpc3QgaXRlbXNcblx0ICogLSBGaXhlZCBidWcgaW4gdGFibGUgaGVhZGluZ3MgaGFuZGxpbmdcblx0ICogLSBDaGFuZ2VkIGRhdGUgZm9ybWF0IGluIHNpZ25hdHVyZXMgdG8gcmVmbGVjdCBNZWRpYXdpa2knc1xuXHQgKiAtIEZpeGVkIGhhbmRsaW5nIG9mIFtbOkltYWdlOi4uLl1dXG5cdCAqIC0gVXBkYXRlZCBNRDUgZnVuY3Rpb24gKGhvcGVmdWxseSBpdCB3aWxsIHdvcmsgd2l0aCBVVEYtOClcblx0ICogLSBGaXhlZCBidWcgaW4gaGFuZGxpbmcgb2YgbGlua3MgaW5zaWRlIGltYWdlc1xuXHQgKlxuXHQgKiBUbyBkbzpcblx0ICogLSBCZXR0ZXIgc3VwcG9ydCBmb3IgbWF0aCB0YWdzXG5cdCAqIC0gRnVsbCBzdXBwb3J0IGZvciBub3dpa2kgdGFnXG5cdCAqIC0gUGFyc2VyLWJhc2VkIChhcyBvcHBvc2VkIHRvIFJlZ0V4cC1iYXNlZCkgaW5saW5lIHdpa2ljb2RlIGhhbmRsaW5nIChtYWtlIGl0IG9uZS1wYXNzIGFuZFxuXHQgKiAgIGJ1bGxldC1wcm9vZilcblx0ICogLSBTdXBwb3J0IGZvciB0ZW1wbGF0ZXMgKHRocm91Z2ggQUpBWClcblx0ICogLSBTdXBwb3J0IGZvciBjb2xvdXJlZCBsaW5rcyAoQUpBWClcblx0ICovXG5cdGNvbnN0IEluc3RhID0ge307XG5cdGNvbnN0IHNldHVwTGl2ZVByZXZpZXcgPSAoKSA9PiB7XG5cdFx0bGV0IF9iO1xuXHRcdC8vIG9wdGlvbnNcblx0XHRJbnN0YS5jb25mID0ge1xuXHRcdFx0YmFzZVVybDogJycsXG5cdFx0XHR1c2VyOiB7fSxcblx0XHRcdHdpa2k6IHtcblx0XHRcdFx0bGFuZzogcGcud2lraS5sYW5nLFxuXHRcdFx0XHRpbnRlcndpa2k6IHBnLndpa2kuaW50ZXJ3aWtpLFxuXHRcdFx0XHRkZWZhdWx0X3RodW1iX3dpZHRoOiAxODAsXG5cdFx0XHR9LFxuXHRcdFx0cGF0aHM6IHtcblx0XHRcdFx0YXJ0aWNsZXM6IGAke3BnLndpa2kuYXJ0aWNsZVBhdGh9L2AsXG5cdFx0XHRcdC8vIE9ubHkgdXNlZCBmb3IgSW5zdGEgcHJldmlld3Mgd2l0aCBpbWFnZXMuIChub3QgaW4gcG9wdXBzKVxuXHRcdFx0XHRtYXRoOiAnL21hdGgvJyxcblx0XHRcdFx0aW1hZ2VzOiAnaHR0cHM6Ly95b3VzaG91Lndpa2kvaW1hZ2VzLycsXG5cdFx0XHRcdGltYWdlc19mYWxsYmFjazogJy8vd20uemhvbmd3ZW4ud2lraS9jb21tb25zLycsXG5cdFx0XHR9LFxuXHRcdFx0bG9jYWxlOiB7XG5cdFx0XHRcdHVzZXI6IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zVXNlcklkXSxcblx0XHRcdFx0aW1hZ2U6IG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zSW1hZ2VJZF0sXG5cdFx0XHRcdGNhdGVnb3J5OiBtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc0NhdGVnb3J5SWRdLFxuXHRcdFx0XHQvLyBzaG91bGRuJ3QgYmUgdXNlZCBpbiBwb3B1cCBwcmV2aWV3cywgaSB0aGlua1xuXHRcdFx0XHRtb250aHM6IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSxcblx0XHRcdH0sXG5cdFx0fTtcblx0XHQvLyBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXMgb3IgYmFja3JlZmVyZW5jZXNcblx0XHQoX2IgPSBJbnN0YS5jb25mLnVzZXIpLm5hbWUgfHwgKF9iLm5hbWUgPSAnWW91c2hvdSBBcmNoaXZlcyBjb250cmlidXRvcnMnKTtcblx0XHRJbnN0YS5jb25mLnVzZXIuc2lnbmF0dXJlID0gYFtbJHtJbnN0YS5jb25mLmxvY2FsZS51c2VyfToke0luc3RhLmNvbmYudXNlci5uYW1lfXwke0luc3RhLmNvbmYudXNlci5uYW1lfV1dYDtcblx0XHQvLyBkZWZpbmUgY29uc3RhbnRzXG5cdFx0SW5zdGEuQkxPQ0tfSU1BR0UgPSBuZXcgUmVnRXhwKFxuXHRcdFx0YF5cXFxcW1xcXFxbKD86RmlsZXxJbWFnZXwke0luc3RhLmNvbmYubG9jYWxlLmltYWdlfSk6Lio/XFxcXHwuKj8oPzpmcmFtZXx0aHVtYm5haWx8dGh1bWJ8bm9uZXxyaWdodHxsZWZ0fGNlbnRlcilgLFxuXHRcdFx0J2knXG5cdFx0KTtcblx0fTtcblx0SW5zdGEuZHVtcCA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuXHRcdGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGZyb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtmcm9tfWApO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHRvID09PSAnc3RyaW5nJykge1xuXHRcdFx0dG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0b31gKTtcblx0XHR9XG5cdFx0dG8uaW5uZXJIVE1MID0gdGhpcy5jb252ZXJ0KGZyb20udmFsdWUpO1xuXHR9O1xuXHRJbnN0YS5jb252ZXJ0ID0gKHdpa2kpID0+IHtcblx0XHRjb25zdCBsbCA9IHR5cGVvZiB3aWtpID09PSAnc3RyaW5nJyA/IHdpa2kucmVwbGFjZSgvXFxyL2csICcnKS5zcGxpdCgvXFxuLykgOiB3aWtpOyAvLyBsaW5lcyBvZiB3aWtpY29kZVxuXHRcdGxldCBvID0gJyc7IC8vIHJlc3VsdCBvZiBwYXNzaW5nIGEgcmVnZXhwIHRvIGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoKVxuXHRcdGxldCBwID0gMDtcblx0XHRsZXQgcjtcblx0XHQvLyBzb21lIHNob3J0aGFuZHNcblx0XHRjb25zdCByZW1haW4gPSAoKSA9PiB7XG5cdFx0XHRyZXR1cm4gbGwubGVuZ3RoO1xuXHRcdH07XG5cdFx0Y29uc3Qgc2ggPSAoKSA9PiB7XG5cdFx0XHRyZXR1cm4gbGwuc2hpZnQoKTtcblx0XHR9OyAvLyBzaGlmdFxuXHRcdGNvbnN0IHBzID0gKHMpID0+IHtcblx0XHRcdG8gKz0gcztcblx0XHR9OyAvLyBwdXNoXG5cblx0XHQvLyBzaW1pbGFyIHRvIEMncyBwcmludGYsIHVzZXMgPyBhcyBwbGFjZWhvbGRlcnMsID8/IHRvIGVzY2FwZSBxdWVzdGlvbiBtYXJrc1xuXHRcdGNvbnN0IGYgPSBmdW5jdGlvbiBmKC4uLmFyZ3MpIHtcblx0XHRcdGxldCBpID0gMTtcblx0XHRcdGNvbnN0IGEgPSBhcmdzO1xuXHRcdFx0bGV0IFtmXSA9IGE7XG5cdFx0XHRsZXQgbyA9ICcnO1xuXHRcdFx0bGV0IGM7XG5cdFx0XHRsZXQgcDtcblx0XHRcdGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAoKHAgPSBmLmluZGV4T2YoJz8nKSkgKyAxKSB7XG5cdFx0XHRcdFx0Ly8gYWxsb3cgY2hhcmFjdGVyIGVzY2FwaW5nXG5cdFx0XHRcdFx0YyA9IGYuY2hhckF0KHAgKyAxKSA9PT0gJz8nID8gMSA6IDA7XG5cdFx0XHRcdFx0aSAtPSBjO1xuXHRcdFx0XHRcdG8gKz0gZi5zbGljZSgwLCBNYXRoLm1heCgwLCBwKSkgKyAoYyA/ICc/JyA6IGFbaV0pO1xuXHRcdFx0XHRcdGYgPSBmLnNsaWNlKHAgKyAxICsgYyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvICsgZjtcblx0XHR9O1xuXHRcdGNvbnN0IGh0bWxfZW50aXRpZXMgPSAocykgPT4ge1xuXHRcdFx0cmV0dXJuIHMucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXHRcdH07XG5cdFx0Ly8gV2lraSB0ZXh0IHBhcnNpbmcgdG8gaHRtbCBpcyBhIG5pZ2h0bWFyZS5cblx0XHQvLyBUaGUgYmVsb3cgZnVuY3Rpb25zIGRlbGliZXJhdGVseSBkb24ndCBlc2NhcGUgdGhlIGFtcGVyc2FuZCBzaW5jZSB0aGlzIHdvdWxkIG1ha2UgaXQgbW9yZVxuXHRcdC8vIGRpZmZpY3VsdCwgYW5kIHdlIGRvbid0IGFic29sdXRlbHkgbmVlZCB0byBmb3IgaG93IHdlIG5lZWQgaXQuIFRoaXMgbWVhbnMgdGhhdCBhbnlcblx0XHQvLyB1bmVzY2FwZWQgYW1wZXJzYW5kcyBpbiB3aWtpdGV4dCB3aWxsIHJlbWFpbiB1bmVzY2FwZWQgYW5kIGNhbiBjYXVzZSBpbnZhbGlkIEhUTUwuXG5cdFx0Ly8gQnJvd3NlcnMgc2hvdWxkIGFsbCBiZSBhYmxlIHRvIGhhbmRsZSBpdCB0aG91Z2guIFdlIGFsc28gZXNjYXBlIHNpZ25pZmljYW50IHdpa2ltYXJrdXBcblx0XHQvLyBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgZnVydGhlciBtYXRjaGluZyBvbiB0aGUgcHJvY2Vzc2VkIHRleHQuXG5cdFx0Y29uc3QgaHRtbGVzY2FwZV90ZXh0ID0gKHMpID0+IHtcblx0XHRcdHJldHVybiBzXG5cdFx0XHRcdC5yZXBsYWNlKC88L2csICcmbHQ7Jylcblx0XHRcdFx0LnJlcGxhY2UoLz4vZywgJyZndDsnKVxuXHRcdFx0XHQucmVwbGFjZSgvOi9nLCAnJiM1ODsnKVxuXHRcdFx0XHQucmVwbGFjZSgvXFxbL2csICcmIzkxOycpXG5cdFx0XHRcdC5yZXBsYWNlKC9dL2csICcmIzkzOycpO1xuXHRcdH07XG5cdFx0Y29uc3QgaHRtbGVzY2FwZV9hdHRyID0gKHMpID0+IHtcblx0XHRcdHJldHVybiBodG1sZXNjYXBlX3RleHQocykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5cdFx0fTtcblx0XHQvLyByZXR1cm4gdGhlIGZpcnN0IG5vbiBtYXRjaGluZyBjaGFyYWN0ZXIgcG9zaXRpb24gYmV0d2VlbiB0d28gc3RyaW5nc1xuXHRcdGNvbnN0IHN0cl9pbWF0Y2ggPSAoYSwgYikgPT4ge1xuXHRcdFx0bGV0IGk7XG5cdFx0XHRsZXQgbDtcblx0XHRcdGZvciAoaSA9IDAsIGwgPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdGlmIChhLmNoYXJBdChpKSAhPT0gYi5jaGFyQXQoaSkpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGk7XG5cdFx0fTtcblx0XHQvLyBjb21wYXJlIGN1cnJlbnQgbGluZSBhZ2FpbnN0IGEgc3RyaW5nIG9yIHJlZ2V4cFxuXHRcdC8vIGlmIHBhc3NlZCBhIHN0cmluZyBpdCB3aWxsIGNvbXBhcmUgb25seSB0aGUgZmlyc3Qgc3RyaW5nLmxlbmd0aCBjaGFyYWN0ZXJzXG5cdFx0Ly8gaWYgcGFzc2VkIGEgcmVnZXhwIHRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHJcblx0XHRjb25zdCBjb21wYXJlTGluZVN0cmluZ09yUmVnID0gKGMpID0+IHtcblx0XHRcdHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBsbFswXSAmJiBsbFswXS5zbGljZSgwLCBjLmxlbmd0aCkgPT09IGMgOiAociA9IGxsWzBdICYmIGxsWzBdLm1hdGNoKGMpKTtcblx0XHR9O1xuXHRcdGNvbnN0IGNvbXBhcmVMaW5lU3RyaW5nID0gKGMpID0+IHtcblx0XHRcdHJldHVybiBsbFswXSA9PT0gYztcblx0XHR9OyAvLyBjb21wYXJlIGN1cnJlbnQgbGluZSBhZ2FpbnN0IGEgc3RyaW5nXG5cdFx0Y29uc3QgY2hhckF0UG9pbnQgPSAocCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxsWzBdLmNoYXJBdChwKTtcblx0XHR9OyAvLyByZXR1cm4gY2hhciBhdCBwb3MgcFxuXHRcdGNvbnN0IGVuZGwgPSAocykgPT4ge1xuXHRcdFx0cHMocyk7XG5cdFx0XHRzaCgpO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfbGlzdCA9ICgpID0+IHtcblx0XHRcdGxldCBwcmV2ID0gJyc7XG5cdFx0XHR3aGlsZSAocmVtYWluKCkgJiYgY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXihbIyo6O10rKSguKikkLykpIHtcblx0XHRcdFx0Y29uc3QgbF9tYXRjaCA9IHI7XG5cdFx0XHRcdHNoKCk7XG5cdFx0XHRcdGNvbnN0IGlwb3MgPSBzdHJfaW1hdGNoKHByZXYsIGxfbWF0Y2hbMV0pO1xuXHRcdFx0XHQvLyBjbG9zZSB1bmNvbnRpbnVlZCBsaXN0c1xuXHRcdFx0XHRmb3IgKGxldCBwcmV2UG9zID0gcHJldi5sZW5ndGggLSAxOyBwcmV2UG9zID49IGlwb3M7IHByZXZQb3MtLSkge1xuXHRcdFx0XHRcdGNvbnN0IHBpID0gcHJldi5jaGFyQXQocHJldlBvcyk7XG5cdFx0XHRcdFx0aWYgKHBpID09PSAnKicpIHtcblx0XHRcdFx0XHRcdHBzKCc8L3VsPicpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGkgPT09ICcjJykge1xuXHRcdFx0XHRcdFx0cHMoJzwvb2w+Jyk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChbJycsICcqJywgJyMnXS5pbmRleE9mKGxfbWF0Y2hbMV0uY2hhckF0KHByZXZQb3MpKSkge1xuXHRcdFx0XHRcdFx0Ly8gY2xvc2UgYSBkbCBvbmx5IGlmIHRoZSBuZXcgaXRlbSBpcyBub3QgYSBkbCBpdGVtICg6LCA7IG9yIGVtcHR5KVxuXHRcdFx0XHRcdFx0cHMoJzwvZGw+Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIG9wZW4gbmV3IGxpc3RzXG5cdFx0XHRcdGZvciAobGV0IG1hdGNoUG9zID0gaXBvczsgbWF0Y2hQb3MgPCBsX21hdGNoWzFdLmxlbmd0aDsgbWF0Y2hQb3MrKykge1xuXHRcdFx0XHRcdGNvbnN0IGxpID0gbF9tYXRjaFsxXS5jaGFyQXQobWF0Y2hQb3MpO1xuXHRcdFx0XHRcdGlmIChsaSA9PT0gJyonKSB7XG5cdFx0XHRcdFx0XHRwcygnPHVsPicpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobGkgPT09ICcjJykge1xuXHRcdFx0XHRcdFx0cHMoJzxvbD4nKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFsnJywgJyonLCAnIyddLmluZGV4T2YocHJldi5jaGFyQXQobWF0Y2hQb3MpKSkge1xuXHRcdFx0XHRcdFx0Ly8gb3BlbiBhIG5ldyBkbCBvbmx5IGlmIHRoZSBwcmV2IGl0ZW0gaXMgbm90IGEgZGwgaXRlbSAoOiwgOyBvciBlbXB0eSlcblx0XHRcdFx0XHRcdHBzKCc8ZGw+Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN3aXRjaCAobF9tYXRjaFsxXS5hdCgtMSkpIHtcblx0XHRcdFx0XHRjYXNlICcqJzpcblx0XHRcdFx0XHRjYXNlICcjJzpcblx0XHRcdFx0XHRcdHBzKGA8bGk+JHtwYXJzZV9pbmxpbmVfbm93aWtpKGxfbWF0Y2hbMl0pfWApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnOyc6IHtcblx0XHRcdFx0XHRcdHBzKCc8ZHQ+Jyk7XG5cdFx0XHRcdFx0XHRjb25zdCBkdF9tYXRjaCA9IGxfbWF0Y2hbMl0ubWF0Y2goLyguKj8pKDouKj8pJC8pO1xuXHRcdFx0XHRcdFx0Ly8gaGFuZGxlIDtkdCA6ZGQgZm9ybWF0XG5cdFx0XHRcdFx0XHRpZiAoZHRfbWF0Y2gpIHtcblx0XHRcdFx0XHRcdFx0cHMocGFyc2VfaW5saW5lX25vd2lraShkdF9tYXRjaFsxXSkpO1xuXHRcdFx0XHRcdFx0XHRsbC51bnNoaWZ0KGR0X21hdGNoWzJdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBzKHBhcnNlX2lubGluZV9ub3dpa2kobF9tYXRjaFsyXSkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNhc2UgJzonOlxuXHRcdFx0XHRcdFx0cHMoYDxkZD4ke3BhcnNlX2lubGluZV9ub3dpa2kobF9tYXRjaFsyXSl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0WywgcHJldl0gPSBsX21hdGNoO1xuXHRcdFx0fVxuXHRcdFx0Ly8gY2xvc2UgcmVtYWluaW5nIGxpc3RzXG5cdFx0XHRmb3IgKGxldCBpID0gcHJldi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHRwcyhmKCc8Lz8+JywgcHJldi5jaGFyQXQoaSkgPT09ICcqJyA/ICd1bCcgOiBwcmV2LmNoYXJBdChpKSA9PT0gJyMnID8gJ29sJyA6ICdkbCcpKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IHBhcnNlX3RhYmxlID0gKCkgPT4ge1xuXHRcdFx0ZW5kbChmKCc8dGFibGU+JywgY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXntcXHwoIC4qKSQvKSA/IHJbMV0gOiAnJykpO1xuXHRcdFx0Zm9yICg7IHJlbWFpbigpOyApIHtcblx0XHRcdFx0aWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJ3wnKSkge1xuXHRcdFx0XHRcdHN3aXRjaCAoY2hhckF0UG9pbnQoMSkpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ30nOlxuXHRcdFx0XHRcdFx0XHRlbmRsKCc8L3RhYmxlPicpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRjYXNlICctJzpcblx0XHRcdFx0XHRcdFx0ZW5kbChmKCc8dHI+JywgY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXFx8LSooLiopLylbMV0pKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRwYXJzZV90YWJsZV9kYXRhKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoJyEnKSkge1xuXHRcdFx0XHRcdHBhcnNlX3RhYmxlX2RhdGEoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBwYXJzZV90YWJsZV9kYXRhID0gKCkgPT4ge1xuXHRcdFx0bGV0IHRkX2xpbmU7XG5cdFx0XHRsZXQgbWF0Y2hfaTtcblx0XHRcdC8vIDE6IFwifCtcIiwgJ3wnIG9yICcrJ1xuXHRcdFx0Ly8gMjogPz9cblx0XHRcdC8vIDM6IGF0dHJpYnV0ZXMgPz9cblx0XHRcdC8vIFRPRE86IGZpbmlzaCBjb21tZW50aW5nIHRoaXMgcmVnZXhwXG5cdFx0XHRjb25zdCB0ZF9tYXRjaCA9IHNoKCkubWF0Y2goL14oXFx8XFwrfFxcfHwhKSgoPzooW15bfF0qPylcXHwoPyFcXHwpKT8oLiopKSQvKTtcblx0XHRcdGlmICh0ZF9tYXRjaFsxXSA9PT0gJ3wrJykge1xuXHRcdFx0XHRwcygnPGNhcHRpb24nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBzKGA8dCR7dGRfbWF0Y2hbMV0gPT09ICd8JyA/ICdkJyA6ICdoJ31gKTtcblx0XHRcdH1cblx0XHRcdGlmICh0ZF9tYXRjaFszXSkge1xuXHRcdFx0XHQvLyBwcygnICcgKyB0ZF9tYXRjaFszXSlcblx0XHRcdFx0bWF0Y2hfaSA9IDQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaF9pID0gMjtcblx0XHRcdH1cblx0XHRcdHBzKCc+Jyk7XG5cdFx0XHRpZiAodGRfbWF0Y2hbMV0gPT09ICd8KycpIHtcblx0XHRcdFx0cHMocGFyc2VfaW5saW5lX25vd2lraSh0ZF9tYXRjaFttYXRjaF9pXSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gdXNlIHx8IG9yICEhIGFzIGEgY2VsbCBzZXBhcmF0b3IgZGVwZW5kaW5nIG9uIGNvbnRleHRcblx0XHRcdFx0Ly8gTk9URTogd2hlbiBzcGxpdCgpIGlzIHBhc3NlZCBhIHJlZ2V4cCBtYWtlIHN1cmUgdG8gdXNlIG5vbi1jYXB0dXJpbmcgYnJhY2tldHNcblx0XHRcdFx0dGRfbGluZSA9IHRkX21hdGNoW21hdGNoX2ldLnNwbGl0KHRkX21hdGNoWzFdID09PSAnfCcgPyAnfHwnIDogL1xcfFxcfHwhIS8pO1xuXHRcdFx0XHRwcyhwYXJzZV9pbmxpbmVfbm93aWtpKHRkX2xpbmUuc2hpZnQoKSkpO1xuXHRcdFx0XHR3aGlsZSAodGRfbGluZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0bGwudW5zaGlmdCh0ZF9tYXRjaFsxXSArIHRkX2xpbmUucG9wKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsZXQgdGMgPSAwO1xuXHRcdFx0Y29uc3QgdGQgPSBbXTtcblx0XHRcdHdoaWxlIChyZW1haW4oKSkge1xuXHRcdFx0XHR0ZC5wdXNoKHNoKCkpO1xuXHRcdFx0XHRpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygnfCcpKSB7XG5cdFx0XHRcdFx0aWYgKCF0Yykge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjaGFyQXRQb2ludCgxKSA9PT0gJ30nKSB7XG5cdFx0XHRcdFx0XHQvLyB3ZSdyZSBhdCB0aGUgb3V0ZXItbW9zdCBsZXZlbCAobm8gbmVzdGVkIHRhYmxlcyksIHNraXAgdG8gdGQgcGFyc2Vcblx0XHRcdFx0XHRcdHRjLS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCF0YyAmJiBjb21wYXJlTGluZVN0cmluZ09yUmVnKCchJykpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fSBlbHNlIGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKCd7fCcpKSB7XG5cdFx0XHRcdFx0dGMrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRkLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cHMoSW5zdGEuY29udmVydCh0ZCkpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfcHJlID0gKCkgPT4ge1xuXHRcdFx0cHMoJzxwcmU+Jyk7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdGVuZGwoYCR7cGFyc2VfaW5saW5lX25vd2lraShsbFswXS5zbGljZSgxKSl9XFxuYCk7XG5cdFx0XHR9IHdoaWxlIChyZW1haW4oKSAmJiBjb21wYXJlTGluZVN0cmluZ09yUmVnKCcgJykpO1xuXHRcdFx0cHMoJzwvcHJlPicpO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfYmxvY2tfaW1hZ2UgPSAoKSA9PiB7XG5cdFx0XHRwcyhwYXJzZV9pbWFnZShzaCgpKSk7XG5cdFx0fTtcblx0XHRjb25zdCBwYXJzZV9pbWFnZSA9IChzdHIpID0+IHtcblx0XHRcdC8vIGdldCB3aGF0J3MgaW4gYmV0d2VlbiBcIltbSW1hZ2U6XCIgYW5kIFwiXV1cIlxuXHRcdFx0bGV0IHRhZyA9IHN0ci5zdWJzdHJpbmcoc3RyLmluZGV4T2YoJzonKSArIDEsIHN0ci5sZW5ndGggLSAyKTtcblx0XHRcdGxldCB3aWR0aDtcblx0XHRcdGxldCBhdHRyID0gW107XG5cdFx0XHRsZXQgZmlsZW5hbWU7XG5cdFx0XHRsZXQgY2FwdGlvbiA9ICcnO1xuXHRcdFx0bGV0IHRodW1iID0gMDtcblx0XHRcdGxldCBmcmFtZSA9IDA7XG5cdFx0XHRsZXQgY2VudGVyID0gMDtcblx0XHRcdGxldCBhbGlnbiA9ICcnO1xuXHRcdFx0aWYgKC9cXHwvLnRlc3QodGFnKSkge1xuXHRcdFx0XHQvLyBtYW5hZ2UgbmVzdGVkIGxpbmtzXG5cdFx0XHRcdGxldCBuZXN0aW5nID0gMDtcblx0XHRcdFx0bGV0IGxhc3RfYXR0cjtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IHRhZy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG5cdFx0XHRcdFx0aWYgKHRhZy5jaGFyQXQoaSkgPT09ICd8JyAmJiAhbmVzdGluZykge1xuXHRcdFx0XHRcdFx0bGFzdF9hdHRyID0gdGFnLnNsaWNlKGkgKyAxKTtcblx0XHRcdFx0XHRcdHRhZyA9IHRhZy5zbGljZSgwLCBNYXRoLm1heCgwLCBpKSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3dpdGNoICh0YWcuc2xpY2UoaSAtIDEsIGkgLSAxICsgMikpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSAnXV0nOlxuXHRcdFx0XHRcdFx0XHRcdG5lc3RpbmcrKztcblx0XHRcdFx0XHRcdFx0XHRpLS07XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ1tbJzpcblx0XHRcdFx0XHRcdFx0XHRuZXN0aW5nLS07XG5cdFx0XHRcdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRhdHRyID0gdGFnLnNwbGl0KC9cXHMqXFx8XFxzKi8pO1xuXHRcdFx0XHRhdHRyLnB1c2gobGFzdF9hdHRyKTtcblx0XHRcdFx0ZmlsZW5hbWUgPSBhdHRyLnNoaWZ0KCk7XG5cdFx0XHRcdGxldCB3X21hdGNoO1xuXHRcdFx0XHRmb3IgKDsgYXR0ci5sZW5ndGggPiAwOyBhdHRyLnNoaWZ0KCkpIHtcblx0XHRcdFx0XHR3X21hdGNoID0gYXR0clswXS5tYXRjaCgvXihcXGQqKSg/OltweF0qXFxkKik/cHgkLyk7XG5cdFx0XHRcdFx0aWYgKHdfbWF0Y2gpIHtcblx0XHRcdFx0XHRcdFssIHdpZHRoXSA9IHdfbWF0Y2g7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAoYXR0clswXSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlICd0aHVtYic6XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3RodW1ibmFpbCc6XG5cdFx0XHRcdFx0XHRcdFx0dGh1bWIgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdGZyYW1lID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnZnJhbWUnOlxuXHRcdFx0XHRcdFx0XHRcdGZyYW1lID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnbm9uZSc6XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3JpZ2h0Jzpcblx0XHRcdFx0XHRcdFx0Y2FzZSAnbGVmdCc6XG5cdFx0XHRcdFx0XHRcdFx0Y2VudGVyID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0W2FsaWduXSA9IGF0dHI7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2NlbnRlcic6XG5cdFx0XHRcdFx0XHRcdFx0Y2VudGVyID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRhbGlnbiA9ICdub25lJztcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ci5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFtjYXB0aW9uXSA9IGF0dHI7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZmlsZW5hbWUgPSB0YWc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fTtcblx0XHRjb25zdCBwYXJzZV9pbmxpbmVfbm93aWtpID0gKHN0cikgPT4ge1xuXHRcdFx0bGV0IHN0YXJ0O1xuXHRcdFx0bGV0IGxhc3RlbmQgPSAwO1xuXHRcdFx0bGV0IHN1YnN0YXJ0ID0gMDtcblx0XHRcdGxldCBuZXN0bGV2ID0gMDtcblx0XHRcdGxldCBvcGVuO1xuXHRcdFx0bGV0IGNsb3NlO1xuXHRcdFx0bGV0IHN1Ymxvb3A7XG5cdFx0XHRsZXQgaHRtbCA9ICcnO1xuXHRcdFx0d2hpbGUgKChzdGFydCA9IHN0ci5pbmRleE9mKCc8bm8nLmNvbmNhdCgnd2lraScsICc+JyksIHN1YnN0YXJ0KSkgIT09IC0xKSB7XG5cdFx0XHRcdGh0bWwgKz0gcGFyc2VfaW5saW5lX3dpa2koc3RyLnN1YnN0cmluZyhsYXN0ZW5kLCBzdGFydCkpO1xuXHRcdFx0XHRzdGFydCArPSA4O1xuXHRcdFx0XHRzdWJzdGFydCA9IHN0YXJ0O1xuXHRcdFx0XHRzdWJsb29wID0gdHJ1ZTtcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdG9wZW4gPSBzdHIuaW5kZXhPZignPG5vJy5jb25jYXQoJ3dpa2knLCAnPicpLCBzdWJzdGFydCk7XG5cdFx0XHRcdFx0Y2xvc2UgPSBzdHIuaW5kZXhPZignPC9ubycuY29uY2F0KCd3aWtpJywgJz4nKSwgc3Vic3RhcnQpO1xuXHRcdFx0XHRcdGlmIChjbG9zZSA8PSBvcGVuIHx8IG9wZW4gPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2xvc2UgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBodG1sICsgaHRtbF9lbnRpdGllcyhzdHIuc2xpY2Uoc3RhcnQpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHN1YnN0YXJ0ID0gY2xvc2UgKyA5O1xuXHRcdFx0XHRcdFx0aWYgKG5lc3RsZXYpIHtcblx0XHRcdFx0XHRcdFx0bmVzdGxldi0tO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bGFzdGVuZCA9IHN1YnN0YXJ0O1xuXHRcdFx0XHRcdFx0XHRodG1sICs9IGh0bWxfZW50aXRpZXMoc3RyLnN1YnN0cmluZyhzdGFydCwgbGFzdGVuZCAtIDkpKTtcblx0XHRcdFx0XHRcdFx0c3VibG9vcCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdWJzdGFydCA9IG9wZW4gKyA4O1xuXHRcdFx0XHRcdFx0bmVzdGxldisrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoc3VibG9vcCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaHRtbCArIHBhcnNlX2lubGluZV93aWtpKHN0ci5zbGljZShsYXN0ZW5kKSk7XG5cdFx0fTtcblx0XHRjb25zdCBwYXJzZV9pbmxpbmVfaW1hZ2VzID0gKHN0cikgPT4ge1xuXHRcdFx0bGV0IHN0YXJ0O1xuXHRcdFx0bGV0IHN1YnN0YXJ0ID0gMDtcblx0XHRcdGxldCBuZXN0bGV2ID0gMDtcblx0XHRcdGxldCBsb29wO1xuXHRcdFx0bGV0IGNsb3NlO1xuXHRcdFx0bGV0IG9wZW47XG5cdFx0XHRsZXQgd2lraTtcblx0XHRcdGxldCBodG1sO1xuXHRcdFx0d2hpbGUgKChzdGFydCA9IHN0ci5pbmRleE9mKCdbWycsIHN1YnN0YXJ0KSkgIT09IC0xKSB7XG5cdFx0XHRcdGlmIChuZXcgUmVnRXhwKGBeKEltYWdlfEZpbGV8JHtJbnN0YS5jb25mLmxvY2FsZS5pbWFnZX0pOmAsICdpJykudGVzdChzdHIuc2xpY2Uoc3RhcnQgKyAyKSkpIHtcblx0XHRcdFx0XHRsb29wID0gdHJ1ZTtcblx0XHRcdFx0XHRzdWJzdGFydCA9IHN0YXJ0O1xuXHRcdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRcdHN1YnN0YXJ0ICs9IDI7XG5cdFx0XHRcdFx0XHRjbG9zZSA9IHN0ci5pbmRleE9mKCddXScsIHN1YnN0YXJ0KTtcblx0XHRcdFx0XHRcdG9wZW4gPSBzdHIuaW5kZXhPZignW1snLCBzdWJzdGFydCk7XG5cdFx0XHRcdFx0XHRpZiAoY2xvc2UgPD0gb3BlbiB8fCBvcGVuID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoY2xvc2UgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHN0cjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRzdWJzdGFydCA9IGNsb3NlO1xuXHRcdFx0XHRcdFx0XHRpZiAobmVzdGxldikge1xuXHRcdFx0XHRcdFx0XHRcdG5lc3RsZXYtLTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR3aWtpID0gc3RyLnN1YnN0cmluZyhzdGFydCwgY2xvc2UgKyAyKTtcblx0XHRcdFx0XHRcdFx0XHRodG1sID0gcGFyc2VfaW1hZ2Uod2lraSk7XG5cdFx0XHRcdFx0XHRcdFx0c3RyID0gc3RyLnJlcGxhY2Uod2lraSwgaHRtbCk7XG5cdFx0XHRcdFx0XHRcdFx0c3Vic3RhcnQgPSBzdGFydCArIGh0bWwubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdGxvb3AgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3Vic3RhcnQgPSBvcGVuO1xuXHRcdFx0XHRcdFx0XHRuZXN0bGV2Kys7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSB3aGlsZSAobG9vcCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzdHI7XG5cdFx0fTtcblx0XHQvLyB0aGUgb3V0cHV0IG9mIHRoaXMgZnVuY3Rpb24gZG9lc24ndCByZXNwZWN0IHRoZSBGSUxPIHN0cnVjdHVyZSBvZiBIVE1MXG5cdFx0Ly8gYnV0IHNpbmNlIG1vc3QgYnJvd3NlcnMgY2FuIGhhbmRsZSBpdCBJJ2xsIHNhdmUgbXlzZWxmIHRoZSBoYXNzbGVcblx0XHRjb25zdCBwYXJzZV9pbmxpbmVfZm9ybWF0dGluZyA9IChzdHIpID0+IHtcblx0XHRcdGxldCBlbTtcblx0XHRcdGxldCBzdDtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IGxpO1xuXHRcdFx0bGV0IG8gPSAnJztcblx0XHRcdHdoaWxlICgoaSA9IHN0ci5pbmRleE9mKFwiJydcIiwgbGkpKSArIDEpIHtcblx0XHRcdFx0byArPSBzdHIuc3Vic3RyaW5nKGxpLCBpKTtcblx0XHRcdFx0bGkgPSBpICsgMjtcblx0XHRcdFx0aWYgKHN0ci5jaGFyQXQoaSArIDIpID09PSBcIidcIikge1xuXHRcdFx0XHRcdGxpKys7XG5cdFx0XHRcdFx0c3QgPSAhc3Q7XG5cdFx0XHRcdFx0byArPSBzdCA/ICc8c3Ryb25nPicgOiAnPC9zdHJvbmc+Jztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbSA9ICFlbTtcblx0XHRcdFx0XHRvICs9IGVtID8gJzxlbT4nIDogJzwvZW0+Jztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG8gKyBzdHIuc2xpY2UobGkpO1xuXHRcdH07XG5cdFx0Y29uc3QgcGFyc2VfaW5saW5lX3dpa2kgPSAoc3RyKSA9PiB7XG5cdFx0XHRzdHIgPSBwYXJzZV9pbmxpbmVfaW1hZ2VzKHN0cik7XG5cdFx0XHRzdHIgPSBwYXJzZV9pbmxpbmVfZm9ybWF0dGluZyhzdHIpO1xuXHRcdFx0Ly8gbWF0aFxuXHRcdFx0c3RyID0gc3RyLnJlcGxhY2UoLzxtYXRoPiguKj8pPFxcL21hdGg+L2dpLCAnJyk7XG5cdFx0XHQvLyBCdWlsZCBhIE1lZGlhd2lraS1mb3JtYXR0ZWQgZGF0ZSBzdHJpbmdcblx0XHRcdGxldCBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdGxldCBtaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG5cdFx0XHRpZiAobWludXRlcyA8IDEwKSB7XG5cdFx0XHRcdG1pbnV0ZXMgPSBgMCR7bWludXRlc31gO1xuXHRcdFx0fVxuXHRcdFx0ZGF0ZSA9IGYoXG5cdFx0XHRcdCc/Oj8sID8gPyA/IChVVEMpJyxcblx0XHRcdFx0ZGF0ZS5nZXRVVENIb3VycygpLFxuXHRcdFx0XHRtaW51dGVzLFxuXHRcdFx0XHRkYXRlLmdldFVUQ0RhdGUoKSxcblx0XHRcdFx0SW5zdGEuY29uZi5sb2NhbGUubW9udGhzW2RhdGUuZ2V0VVRDTW9udGgoKV0sXG5cdFx0XHRcdGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxuXHRcdFx0KTtcblx0XHRcdC8vIHRleHQgZm9ybWF0dGluZ1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0c3RyXG5cdFx0XHRcdFx0Ly8gc2lnbmF0dXJlc1xuXHRcdFx0XHRcdC5yZXBsYWNlKC9+ezV9KD8hfikvZywgZGF0ZSlcblx0XHRcdFx0XHQucmVwbGFjZSgvfns0fSg/IX4pL2csIGAke0luc3RhLmNvbmYudXNlci5uYW1lfSAke2RhdGV9YClcblx0XHRcdFx0XHQucmVwbGFjZSgvfnszfSg/IX4pL2csIEluc3RhLmNvbmYudXNlci5uYW1lKVxuXHRcdFx0XHRcdC8vIFtbOkNhdGVnb3J5Oi4uLl1dLCBbWzpJbWFnZTouLi5dXSwgZXRjLi4uXG5cdFx0XHRcdFx0LnJlcGxhY2UoXG5cdFx0XHRcdFx0XHRuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdFx0XHRgXFxcXFtcXFxcWzooKD86JHtJbnN0YS5jb25mLmxvY2FsZS5jYXRlZ29yeX18SW1hZ2V8RmlsZXwke0luc3RhLmNvbmYubG9jYWxlLmltYWdlfXwke0luc3RhLmNvbmYud2lraS5pbnRlcndpa2l9KTpbXnxdKj8pXFxcXF1cXFxcXShcXFxcdyopYCxcblx0XHRcdFx0XHRcdFx0J2dpJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdChfJDAsICQxLCAkMikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XHRcIjxhIGhyZWY9Jz8nPj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdFx0SW5zdGEuY29uZi5wYXRocy5hcnRpY2xlcyArIGh0bWxlc2NhcGVfYXR0cigkMSksXG5cdFx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQxKSArIGh0bWxlc2NhcGVfdGV4dCgkMilcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHN0cmFpZ2h0IGNhdGVnb3J5IGFuZCBpbnRlcndpa2kgdGFnc1xuXHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0YFxcXFxbXFxcXFsoPzoke0luc3RhLmNvbmYubG9jYWxlLmNhdGVnb3J5fXwke0luc3RhLmNvbmYud2lraS5pbnRlcndpa2l9KTouKj9cXFxcXVxcXFxdYCxcblx0XHRcdFx0XHRcdFx0J2dpJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdCcnXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC8vIFtbOkNhdGVnb3J5Oi4uLnxMaW5rc11dLCBbWzpJbWFnZTouLi58TGlua3NdXSwgZXRjLi4uXG5cdFx0XHRcdFx0LnJlcGxhY2UoXG5cdFx0XHRcdFx0XHRuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdFx0XHRgXFxcXFtcXFxcWzooKD86JHtJbnN0YS5jb25mLmxvY2FsZS5jYXRlZ29yeX18SW1hZ2V8RmlsZXwke0luc3RhLmNvbmYubG9jYWxlLmltYWdlfXwke0luc3RhLmNvbmYud2lraS5pbnRlcndpa2l9KTouKj8pXFxcXHwoW15cXFxcXV0rPylcXFxcXVxcXFxdKFxcXFx3KilgLFxuXHRcdFx0XHRcdFx0XHQnZ2knXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0KF8kMCwgJDEsICQyLCAkMykgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XHRcIjxhIGhyZWY9Jz8nPj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdFx0SW5zdGEuY29uZi5wYXRocy5hcnRpY2xlcyArIGh0bWxlc2NhcGVfYXR0cigkMSksXG5cdFx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQyKSArIGh0bWxlc2NhcGVfdGV4dCgkMylcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0Ly8gW1svUmVsYXRpdmUgbGlua3NdXVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFtcXFsoXFwvW158XSo/KV1dL2csIChfJDAsICQxKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcIjxhIGhyZWY9Jz8nPj88L2E+XCIsIEluc3RhLmNvbmYuYmFzZVVybCArIGh0bWxlc2NhcGVfYXR0cigkMSksIGh0bWxlc2NhcGVfdGV4dCgkMSkpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Ly8gW1svUmVwbGFjZWR8UmVsYXRpdmUgbGlua3NdXVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFtcXFsoXFwvLio/KVxcfCguKz8pXV0vZywgKF8kMCwgJDEsICQyKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcIjxhIGhyZWY9Jz8nPj88L2E+XCIsIEluc3RhLmNvbmYuYmFzZVVybCArIGh0bWxlc2NhcGVfYXR0cigkMSksIGh0bWxlc2NhcGVfdGV4dCgkMikpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Ly8gW1tDb21tb24gbGlua3NdXVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFtcXFsoW15bfF0qPyldXShcXHcqKS9nLCAoXyQwLCAkMSwgJDIpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmKFxuXHRcdFx0XHRcdFx0XHRcIjxhIGhyZWY9Jz8nPj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdEluc3RhLmNvbmYucGF0aHMuYXJ0aWNsZXMgKyBodG1sZXNjYXBlX2F0dHIoJDEpLFxuXHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX3RleHQoJDEpICsgaHRtbGVzY2FwZV90ZXh0KCQyKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC8vIFtbUmVwbGFjZWR8TGlua3NdXVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFtcXFsoW15bXSo/KVxcfChbXlxcXV0rPyldXShcXHcqKS9nLCAoXyQwLCAkMSwgJDIsICQzKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSc/Jz4/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzICsgaHRtbGVzY2FwZV9hdHRyKCQxKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQyKSArIGh0bWxlc2NhcGVfdGV4dCgkMylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQvLyBbW1N0cmlwcGVkOk5hbWVzcGFjZXxOYW1lc3BhY2VdXVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFtcXFsoW15cXF1dKj86KT8oLio/KSggKlxcKC4qP1xcKSk/XFx8XV0vZywgKF8kMCwgJDEsICQyLCAkMykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGYoXG5cdFx0XHRcdFx0XHRcdFwiPGEgaHJlZj0nPyc+PzwvYT5cIixcblx0XHRcdFx0XHRcdFx0SW5zdGEuY29uZi5wYXRocy5hcnRpY2xlcyArIGh0bWxlc2NhcGVfYXR0cigkMSkgKyBodG1sZXNjYXBlX2F0dHIoJDIpICsgaHRtbGVzY2FwZV9hdHRyKCQzKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQyKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC8vIEV4dGVybmFsIGxpbmtzXG5cdFx0XHRcdFx0LnJlcGxhY2UoL1xcWyhodHRwcz98bmV3c3xmdHB8bWFpbHRvfGdvcGhlcnxpcmMpOihcXC8qKShbXlxcXV0qPykgKC4qPyldL2csIChfJDAsICQxLCAkMiwgJDMsICQ0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XCI8YSBjbGFzcz0nZXh0ZXJuYWwnIGhyZWY9Jz86Pyc+PzwvYT5cIixcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQxKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV9hdHRyKCQyKSArIGh0bWxlc2NhcGVfYXR0cigkMyksXG5cdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkNClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQucmVwbGFjZSgvXFxbaHR0cDpcXC9cXC8oLio/KV0vZywgKF8kMCwgJDEpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmKFwiPGEgY2xhc3M9J2V4dGVybmFsJyBocmVmPSdodHRwOi8vPyc+WyNdPC9hPlwiLCBodG1sZXNjYXBlX2F0dHIoJDEpKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXFsobmV3c3xmdHB8bWFpbHRvfGdvcGhlcnxpcmMpOihcXC8qKSguKj8pXS9nLCAoXyQwLCAkMSwgJDIsICQzKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZihcblx0XHRcdFx0XHRcdFx0XCI8YSBjbGFzcz0nZXh0ZXJuYWwnIGhyZWY9Jz86Pyc+Pzo/PC9hPlwiLFxuXHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX2F0dHIoJDEpLFxuXHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX2F0dHIoJDIpICsgaHRtbGVzY2FwZV9hdHRyKCQzKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQxKSxcblx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQyKSArIGh0bWxlc2NhcGVfdGV4dCgkMylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQucmVwbGFjZShcblx0XHRcdFx0XHRcdC8oXnwgKShodHRwcz98bmV3c3xmdHB8bWFpbHRvfGdvcGhlcnxpcmMpOihcXC8qKShbXiAkXSpbXiAhJCwuOjs/XSkvZyxcblx0XHRcdFx0XHRcdChfJDAsICQxLCAkMiwgJDMsICQ0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmKFxuXHRcdFx0XHRcdFx0XHRcdFwiPzxhIGNsYXNzPSdleHRlcm5hbCcgaHJlZj0nPzo/Jz4/Oj88L2E+XCIsXG5cdFx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQxKSxcblx0XHRcdFx0XHRcdFx0XHRodG1sZXNjYXBlX2F0dHIoJDIpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfYXR0cigkMykgKyBodG1sZXNjYXBlX2F0dHIoJDQpLFxuXHRcdFx0XHRcdFx0XHRcdGh0bWxlc2NhcGVfdGV4dCgkMiksXG5cdFx0XHRcdFx0XHRcdFx0aHRtbGVzY2FwZV90ZXh0KCQzKSArIGh0bWxlc2NhcGVfdGV4dCgkNClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnJlcGxhY2UoJ19fTk9UT0NfXycsICcnKVxuXHRcdFx0XHRcdC5yZXBsYWNlKCdfX05PSU5ERVhfXycsICcnKVxuXHRcdFx0XHRcdC5yZXBsYWNlKCdfX0lOREVYX18nLCAnJylcblx0XHRcdFx0XHQucmVwbGFjZSgnX19OT0VESVRTRUNUSU9OX18nLCAnJylcblx0XHRcdCk7XG5cdFx0fTtcblx0XHQvLyBiZWdpbiBwYXJzaW5nXG5cdFx0Zm9yICg7IHJlbWFpbigpOyApIHtcblx0XHRcdGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKC9eKD17MSw2fSkoLiopXFwxKC4qKSQvKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0ZW5kbChmKCc8aD8+PzwvaD8+PycsIHJbMV0ubGVuZ3RoLCBwYXJzZV9pbmxpbmVfbm93aWtpKHJbMl0pLCByWzFdLmxlbmd0aCwgclszXSkpO1xuXHRcdFx0fSBlbHNlIGlmIChjb21wYXJlTGluZVN0cmluZ09yUmVnKC9eWyMqOjtdLykpIHtcblx0XHRcdFx0cCA9IDA7XG5cdFx0XHRcdHBhcnNlX2xpc3QoKTtcblx0XHRcdH0gZWxzZSBpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygnICcpKSB7XG5cdFx0XHRcdHAgPSAwO1xuXHRcdFx0XHRwYXJzZV9wcmUoKTtcblx0XHRcdH0gZWxzZSBpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygne3wnKSkge1xuXHRcdFx0XHRwID0gMDtcblx0XHRcdFx0cGFyc2VfdGFibGUoKTtcblx0XHRcdH0gZWxzZSBpZiAoY29tcGFyZUxpbmVTdHJpbmdPclJlZygvXi0tLS0rJC8pKSB7XG5cdFx0XHRcdHAgPSAwO1xuXHRcdFx0XHRlbmRsKCc8aHI+Jyk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbXBhcmVMaW5lU3RyaW5nT3JSZWcoSW5zdGEuQkxPQ0tfSU1BR0UpKSB7XG5cdFx0XHRcdHAgPSAwO1xuXHRcdFx0XHRwYXJzZV9ibG9ja19pbWFnZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gaGFuZGxlIHBhcmFncmFwaHNcblx0XHRcdFx0aWYgKGNvbXBhcmVMaW5lU3RyaW5nKCcnKSkge1xuXHRcdFx0XHRcdHAgPSByZW1haW4oKSA+IDEgJiYgbGxbMV0gPT09ICcnO1xuXHRcdFx0XHRcdGlmIChwKSB7XG5cdFx0XHRcdFx0XHRlbmRsKCc8cD48YnI+Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICghcCkge1xuXHRcdFx0XHRcdFx0cHMoJzxwPicpO1xuXHRcdFx0XHRcdFx0cCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBzKGAke3BhcnNlX2lubGluZV9ub3dpa2kobGxbMF0pfSBgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzaCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbztcblx0fTtcblx0Y29uc3Qgd2lraTJodG1sID0gKHR4dCwgYmFzZXVybCkgPT4ge1xuXHRcdEluc3RhLmNvbmYuYmFzZVVybCA9IGJhc2V1cmw7XG5cdFx0cmV0dXJuIEluc3RhLmNvbnZlcnQodHh0KTtcblx0fTtcblx0Ly8gRU5ERklMRTogbGl2ZXByZXZpZXcuanNcblx0Ly8gU1RBUlRGSUxFOiBwYWdlaW5mby5qc1xuXHRjb25zdCBwb3B1cEZpbHRlclBhZ2VTaXplID0gKGRhdGEpID0+IHtcblx0XHRyZXR1cm4gZm9ybWF0Qnl0ZXMoZGF0YS5sZW5ndGgpO1xuXHR9O1xuXHRjb25zdCBwb3B1cEZpbHRlckNvdW50TGlua3MgPSAoZGF0YSkgPT4ge1xuXHRcdGNvbnN0IG51bSA9IGNvdW50TGlua3MoZGF0YSk7XG5cdFx0cmV0dXJuIGAke1N0cmluZyhudW0pfSZuYnNwOyR7bnVtID09PSAxID8gcG9wdXBTdHJpbmcoJ3dpa2lMaW5rJykgOiBwb3B1cFN0cmluZygnd2lraUxpbmtzJyl9YDtcblx0fTtcblx0Y29uc3QgcG9wdXBGaWx0ZXJDb3VudEltYWdlcyA9IChkYXRhKSA9PiB7XG5cdFx0Y29uc3QgbnVtID0gY291bnRJbWFnZXMoZGF0YSk7XG5cdFx0cmV0dXJuIGAke1N0cmluZyhudW0pfSZuYnNwOyR7bnVtID09PSAxID8gcG9wdXBTdHJpbmcoJ2ltYWdlJykgOiBwb3B1cFN0cmluZygnaW1hZ2VzJyl9YDtcblx0fTtcblx0Y29uc3QgcG9wdXBGaWx0ZXJDb3VudENhdGVnb3JpZXMgPSAoZGF0YSkgPT4ge1xuXHRcdGNvbnN0IG51bSA9IGNvdW50Q2F0ZWdvcmllcyhkYXRhKTtcblx0XHRyZXR1cm4gYCR7U3RyaW5nKG51bSl9Jm5ic3A7JHtudW0gPT09IDEgPyBwb3B1cFN0cmluZygnY2F0ZWdvcnknKSA6IHBvcHVwU3RyaW5nKCdjYXRlZ29yaWVzJyl9YDtcblx0fTtcblx0Y29uc3QgcG9wdXBGaWx0ZXJMYXN0TW9kaWZpZWQgPSAoX2RhdGEsIGRvd25sb2FkKSA9PiB7XG5cdFx0Y29uc3QgbGFzdG1vZCA9IGRvd25sb2FkLmxhc3RNb2RpZmllZDtcblx0XHRjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXHRcdGNvbnN0IGFnZSA9IG5vdyAtIGxhc3Rtb2Q7XG5cdFx0aWYgKGxhc3Rtb2QgJiYgZ2V0VmFsdWVPZigncG9wdXBMYXN0TW9kaWZpZWQnKSkge1xuXHRcdFx0cmV0dXJuIHRwcmludGYoJyVzIG9sZCcsIFtmb3JtYXRBZ2UoYWdlKV0pLnJlcGxhY2UoLyAvZywgJyZuYnNwOycpO1xuXHRcdH1cblx0XHRyZXR1cm4gJyc7XG5cdH07XG5cdGNvbnN0IGZvcm1hdEFnZSA9IChhZ2UpID0+IHtcblx0XHQvLyBjb2VyY2UgaW50byBhIG51bWJlclxuXHRcdGxldCBhID0gMCArIGFnZTtcblx0XHRjb25zdCBhYSA9IGE7XG5cdFx0Y29uc3Qgc2VjbGVuID0gMTAwMDtcblx0XHRjb25zdCBtaW5sZW4gPSA2MCAqIHNlY2xlbjtcblx0XHRjb25zdCBob3VybGVuID0gNjAgKiBtaW5sZW47XG5cdFx0Y29uc3QgZGF5bGVuID0gMjQgKiBob3VybGVuO1xuXHRcdGNvbnN0IHdlZWtsZW4gPSA3ICogZGF5bGVuO1xuXHRcdGNvbnN0IG51bXdlZWtzID0gKGEgLSAoYSAlIHdlZWtsZW4pKSAvIHdlZWtsZW47XG5cdFx0YSAtPSBudW13ZWVrcyAqIHdlZWtsZW47XG5cdFx0Y29uc3Qgc3dlZWtzID0gYWRkdW5pdChudW13ZWVrcywgJ3dlZWsnKTtcblx0XHRjb25zdCBudW1kYXlzID0gKGEgLSAoYSAlIGRheWxlbikpIC8gZGF5bGVuO1xuXHRcdGEgLT0gbnVtZGF5cyAqIGRheWxlbjtcblx0XHRjb25zdCBzZGF5cyA9IGFkZHVuaXQobnVtZGF5cywgJ2RheScpO1xuXHRcdGNvbnN0IG51bWhvdXJzID0gKGEgLSAoYSAlIGhvdXJsZW4pKSAvIGhvdXJsZW47XG5cdFx0YSAtPSBudW1ob3VycyAqIGhvdXJsZW47XG5cdFx0Y29uc3Qgc2hvdXJzID0gYWRkdW5pdChudW1ob3VycywgJ2hvdXInKTtcblx0XHRjb25zdCBudW1taW5zID0gKGEgLSAoYSAlIG1pbmxlbikpIC8gbWlubGVuO1xuXHRcdGEgLT0gbnVtbWlucyAqIG1pbmxlbjtcblx0XHRjb25zdCBzbWlucyA9IGFkZHVuaXQobnVtbWlucywgJ21pbnV0ZScpO1xuXHRcdGNvbnN0IG51bXNlY3MgPSAoYSAtIChhICUgc2VjbGVuKSkgLyBzZWNsZW47XG5cdFx0YSAtPSBudW1zZWNzICogc2VjbGVuO1xuXHRcdGNvbnN0IHNzZWNzID0gYWRkdW5pdChudW1zZWNzLCAnc2Vjb25kJyk7XG5cdFx0aWYgKGFhID4gNCAqIHdlZWtsZW4pIHtcblx0XHRcdHJldHVybiBzd2Vla3M7XG5cdFx0fVxuXHRcdGlmIChhYSA+IHdlZWtsZW4pIHtcblx0XHRcdHJldHVybiBgJHtzd2Vla3N9ICR7c2RheXN9YDtcblx0XHR9XG5cdFx0aWYgKGFhID4gZGF5bGVuKSB7XG5cdFx0XHRyZXR1cm4gYCR7c2RheXN9ICR7c2hvdXJzfWA7XG5cdFx0fVxuXHRcdGlmIChhYSA+IDYgKiBob3VybGVuKSB7XG5cdFx0XHRyZXR1cm4gc2hvdXJzO1xuXHRcdH1cblx0XHRpZiAoYWEgPiBob3VybGVuKSB7XG5cdFx0XHRyZXR1cm4gYCR7c2hvdXJzfSAke3NtaW5zfWA7XG5cdFx0fVxuXHRcdGlmIChhYSA+IDEwICogbWlubGVuKSB7XG5cdFx0XHRyZXR1cm4gc21pbnM7XG5cdFx0fVxuXHRcdGlmIChhYSA+IG1pbmxlbikge1xuXHRcdFx0cmV0dXJuIGAke3NtaW5zfSAke3NzZWNzfWA7XG5cdFx0fVxuXHRcdHJldHVybiBzc2Vjcztcblx0fTtcblx0Y29uc3QgYWRkdW5pdCA9IChudW0sIHN0cikgPT4ge1xuXHRcdHJldHVybiBgJHtudW19ICR7bnVtID09PSAxID8gcG9wdXBTdHJpbmcoc3RyKSA6IHBvcHVwU3RyaW5nKGAke3N0cn1zYCl9YDtcblx0fTtcblx0Y29uc3QgcnVuUG9wdXBGaWx0ZXJzID0gKGxpc3QsIGRhdGEsIGRvd25sb2FkKSA9PiB7XG5cdFx0Y29uc3QgcmV0ID0gW107XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdGlmIChlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNvbnN0IHMgPSBlbGVtZW50KGRhdGEsIGRvd25sb2FkLCBkb3dubG9hZC5vd25lci5hcnRpY2xlKTtcblx0XHRcdFx0aWYgKHMpIHtcblx0XHRcdFx0XHRyZXQucHVzaChzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBnZXRQYWdlSW5mbyA9IChkYXRhLCBkb3dubG9hZCkgPT4ge1xuXHRcdGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHBvcHVwU3RyaW5nKCdFbXB0eSBwYWdlJyk7XG5cdFx0fVxuXHRcdGNvbnN0IHBvcHVwRmlsdGVycyA9IGdldFZhbHVlT2YoJ3BvcHVwRmlsdGVycycpIHx8IFtdO1xuXHRcdGNvbnN0IGV4dHJhUG9wdXBGaWx0ZXJzID0gZ2V0VmFsdWVPZignZXh0cmFQb3B1cEZpbHRlcnMnKSB8fCBbXTtcblx0XHRjb25zdCBwYWdlSW5mb0FycmF5ID0gcnVuUG9wdXBGaWx0ZXJzKFsuLi5wb3B1cEZpbHRlcnMsIC4uLmV4dHJhUG9wdXBGaWx0ZXJzXSwgZGF0YSwgZG93bmxvYWQpO1xuXHRcdGxldCBwYWdlSW5mbyA9IHBhZ2VJbmZvQXJyYXkuam9pbignLCAnKTtcblx0XHRpZiAocGFnZUluZm8gIT09ICcnKSB7XG5cdFx0XHRwYWdlSW5mbyA9IHVwY2FzZUZpcnN0KHBhZ2VJbmZvKTtcblx0XHR9XG5cdFx0cmV0dXJuIHBhZ2VJbmZvO1xuXHR9O1xuXHQvLyB0aGlzIGNvdWxkIGJlIGltcHJvdmVkIVxuXHRjb25zdCBjb3VudExpbmtzID0gKHdpa2lUZXh0KSA9PiB7XG5cdFx0cmV0dXJuIHdpa2lUZXh0LnNwbGl0KCdbWycpLmxlbmd0aCAtIDE7XG5cdH07XG5cdC8vIGlmIE4gPSAjIG1hdGNoZXMsIG4gPSAjIGJyYWNrZXRzLCB0aGVuXG5cdC8vIFN0cmluZy5zcGxpdChyZWdleCkgaW50ZXJzcGVyc2VzIHRoZSBOKzEgc3BsaXQgZWxlbWVudHNcblx0Ly8gd2l0aCBObiBvdGhlciBlbGVtZW50cy4gU28gdG90YWwgbGVuZ3RoIGlzXG5cdC8vIEw9IE4rMSArIE5uID0gTihuKzEpKzEuIFNvIE49KEwtMSkvKG4rMSkuXG5cdGNvbnN0IGNvdW50SW1hZ2VzID0gKHdpa2lUZXh0KSA9PiB7XG5cdFx0cmV0dXJuICh3aWtpVGV4dC5zcGxpdChwZy5yZS5pbWFnZSkubGVuZ3RoIC0gMSkgLyAocGcucmUuaW1hZ2VCcmFja2V0Q291bnQgKyAxKTtcblx0fTtcblx0Y29uc3QgY291bnRDYXRlZ29yaWVzID0gKHdpa2lUZXh0KSA9PiB7XG5cdFx0cmV0dXJuICh3aWtpVGV4dC5zcGxpdChwZy5yZS5jYXRlZ29yeSkubGVuZ3RoIC0gMSkgLyAocGcucmUuY2F0ZWdvcnlCcmFja2V0Q291bnQgKyAxKTtcblx0fTtcblx0Y29uc3QgcG9wdXBGaWx0ZXJTdHViRGV0ZWN0ID0gKGRhdGEsIF9kb3dubG9hZCwgYXJ0aWNsZSkgPT4ge1xuXHRcdGNvbnN0IGNvdW50cyA9IHN0dWJDb3VudChkYXRhLCBhcnRpY2xlKTtcblx0XHRpZiAoY291bnRzLnJlYWwpIHtcblx0XHRcdHJldHVybiBwb3B1cFN0cmluZygnc3R1YicpO1xuXHRcdH1cblx0XHRpZiAoY291bnRzLnNlY3QpIHtcblx0XHRcdHJldHVybiBwb3B1cFN0cmluZygnc2VjdGlvbiBzdHViJyk7XG5cdFx0fVxuXHRcdHJldHVybiAnJztcblx0fTtcblx0Y29uc3QgcG9wdXBGaWx0ZXJEaXNhbWJpZ0RldGVjdCA9IChkYXRhLCBfZG93bmxvYWQsIGFydGljbGUpID0+IHtcblx0XHRpZiAoIWdldFZhbHVlT2YoJ3BvcHVwQWxsRGFic1N0dWJzJykgJiYgYXJ0aWNsZS5uYW1lc3BhY2UoKSkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNEaXNhbWJpZyhkYXRhLCBhcnRpY2xlKSA/IHBvcHVwU3RyaW5nKCdkaXNhbWJpZycpIDogJyc7XG5cdH07XG5cdGNvbnN0IGZvcm1hdEJ5dGVzID0gKG51bSkgPT4ge1xuXHRcdHJldHVybiBudW0gPiA5NDkgPyBNYXRoLnJvdW5kKG51bSAvIDEwMCkgLyAxMCArIHBvcHVwU3RyaW5nKCdrQicpIDogYCR7bnVtfSZuYnNwOyR7cG9wdXBTdHJpbmcoJ2J5dGVzJyl9YDtcblx0fTtcblx0Ly8gRU5ERklMRTogcGFnZWluZm8uanNcblx0Ly8gU1RBUlRGSUxFOiB0aXRsZXMuanNcblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXcgRGVmaW5lcyB0aGUge0Bzb3VyY2UgVGl0bGV9IGNsYXNzLCBhbmQgYXNzb2NpYXRlZCBjcnVmdHkgZnVuY3Rpb25zLlxuXHQgKlxuXHQgKiA8Y29kZT5UaXRsZTwvY29kZT4gZGVhbHMgd2l0aCBhcnRpY2xlIHRpdGxlcyBhbmQgdGhlaXIgdmFyaW91c1xuXHQgKiBmb3Jtcy4gIHtAc291cmNlIFN0cmluZ3dyYXBwZXJ9IGlzIHRoZSBwYXJlbnQgY2xhc3Mgb2Zcblx0ICogPGNvZGU+VGl0bGU8L2NvZGU+LCB3aGljaCBleGlzdHMgc2ltcGx5IHRvIG1ha2UgdGhpbmdzIGEgbGl0dGxlXG5cdCAqIG5lYXRlci5cblx0ICovXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFN0cmluZ3dyYXBwZXIuXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAY2xhc3MgdGhlIFN0cmluZ3dyYXBwZXIgY2xhc3MuIFRoaXMgYmFzZSBjbGFzcyBpcyBub3QgcmVhbGx5XG5cdCAqIHVzZWZ1bCBvbiBpdHMgb3duOyBpdCBqdXN0IHdyYXBzIHZhcmlvdXMgY29tbW9uIHN0cmluZyBvcGVyYXRpb25zLlxuXHQgKi9cblx0Y29uc3QgU3RyaW5nd3JhcHBlciA9IGZ1bmN0aW9uIFN0cmluZ3dyYXBwZXIoKSB7XG5cdFx0LyoqXG5cdFx0ICogV3JhcHBlciBmb3IgdGhpcy50b1N0cmluZygpLmluZGV4T2YoKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHhcblx0XHQgKiBAdHlwZSBpbnRlZ2VyXG5cdFx0ICovXG5cdFx0dGhpcy5pbmRleE9mID0gZnVuY3Rpb24gKHgpIHtcblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkuaW5kZXhPZih4KTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgdGhpcy52YWx1ZS5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIFdyYXBwZXIgZm9yIHtAc291cmNlIFN0cmluZyNwYXJlblNwbGl0fSBhcHBsaWVkIHRvIHRoaXMudG9TdHJpbmcoKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtSZWdFeHB9IHhcblx0XHQgKiBAdHlwZSBBcnJheVxuXHRcdCAqL1xuXHRcdHRoaXMuc3BsaXQgPSBmdW5jdGlvbiAoeCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudG9TdHJpbmcoKS5zcGxpdCh4KTtcblx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIFdyYXBwZXIgZm9yIHRoaXMudG9TdHJpbmcoKS5zdWJzdHJpbmcoKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHhcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30geSAob3B0aW9uYWwpXG5cdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0ICovXG5cdFx0dGhpcy5zdWJzdHJpbmcgPSBmdW5jdGlvbiAoeCwgeSkge1xuXHRcdFx0aWYgKHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLnNsaWNlKE1hdGgubWF4KDAsIHgpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkuc3Vic3RyaW5nKHgsIHkpO1xuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogV3JhcHBlciBmb3IgdGhpcy50b1N0cmluZygpLnNwbGl0KClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB4XG5cdFx0ICogQHR5cGUgQXJyYXlcblx0XHQgKi9cblx0XHR0aGlzLnNwbGl0ID0gZnVuY3Rpb24gKHgpIHtcblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkuc3BsaXQoeCk7XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBXcmFwcGVyIGZvciB0aGlzLnRvU3RyaW5nKCkucmVwbGFjZSgpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30geFxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB5XG5cdFx0ICogQHR5cGUgU3RyaW5nXG5cdFx0ICovXG5cdFx0dGhpcy5yZXBsYWNlID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkucmVwbGFjZSh4LCB5KTtcblx0XHR9O1xuXHR9O1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaXRsZTwvY29kZT4uXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAY2xhc3MgVGhlIFRpdGxlIGNsYXNzLiBIb2xkcyBhcnRpY2xlIHRpdGxlcyBhbmQgY29udmVydHMgdGhlbSBpbnRvXG5cdCAqIHZhcmlvdXMgZm9ybXMuIEFsc28gZGVhbHMgd2l0aCBhbmNob3JzLCBieSB3aGljaCB3ZSBtZWFuIHRoZSBiaXRzXG5cdCAqIG9mIHRoZSBhcnRpY2xlIFVSTCBhZnRlciBhICMgY2hhcmFjdGVyLCByZXByZXNlbnRpbmcgbG9jYXRpb25zXG5cdCAqIHdpdGhpbiBhbiBhcnRpY2xlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgdG8gYXNzaWduIHRvIHRoZVxuXHQgKiBhcnRpY2xlLiBUaGlzIG11c3QgYmUgdGhlIGNhbm9uaWNhbCB0aXRsZSAoc2VlIHtAbGlua1xuXHQgKiBUaXRsZSN2YWx1ZX0uIE9taXQgdGhpcyBpbiB0aGUgY29uc3RydWN0b3IgYW5kIHVzZSBhbm90aGVyIGZ1bmN0aW9uXG5cdCAqIHRvIHNldCB0aGUgdGl0bGUgaWYgdGhpcyBpcyB1bmF2YWlsYWJsZS5cblx0ICovXG5cdGNsYXNzIFRpdGxlIGV4dGVuZHMgU3RyaW5nd3JhcHBlciB7XG5cdFx0Y29uc3RydWN0b3IodmFsKSB7XG5cdFx0XHRzdXBlcigpO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgY2Fub25pY2FsIGFydGljbGUgdGl0bGUuIFRoaXMgbXVzdCBiZSBpbiBVVEYtOCB3aXRoIG5vXG5cdFx0XHQgKiBlbnRpdGllcywgZXNjYXBpbmcgb3IgbmFzdGllcy4gQWxzbywgdW5kZXJzY29yZXMgc2hvdWxkIGJlXG5cdFx0XHQgKiByZXBsYWNlZCB3aXRoIHNwYWNlcy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudmFsdWUgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgY2Fub25pY2FsIGZvcm0gb2YgdGhlIGFuY2hvci4gVGhpcyBzaG91bGQgYmUgZXhhY3RseSBhc1xuXHRcdFx0ICogaXQgYXBwZWFycyBpbiB0aGUgVVJMLCBpLmUuIHdpdGggdGhlIC5DMy4wQSBiaXRzIGluLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmFuY2hvciA9ICcnO1xuXHRcdFx0dGhpcy5zZXRVdGYodmFsKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcnRpY2xlIHRpdGxlLCBvcHRpb25hbGx5IHdpdGhvdXQgYW5jaG9yLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBvbWl0QW5jaG9yXG5cdFx0ICogQGZpeG1lIERlY2lkZSBzcGVjcyBmb3IgYW5jaG9yXG5cdFx0ICogQHJldHVybiBTdHJpbmcgVGhlIGFydGljbGUgdGl0bGUgYW5kIHRoZSBhbmNob3IuXG5cdFx0ICovXG5cdFx0dG9TdHJpbmcob21pdEFuY2hvcikge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWUgKyAoIW9taXRBbmNob3IgJiYgdGhpcy5hbmNob3IgPyBgIyR7dGhpcy5hbmNob3JTdHJpbmcoKX1gIDogJycpO1xuXHRcdH1cblx0XHRhbmNob3JTdHJpbmcoKSB7XG5cdFx0XHRpZiAoIXRoaXMuYW5jaG9yKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNwbGl0ID0gdGhpcy5hbmNob3Iuc3BsaXQoLygoPzpcXC5bXFxkQS1GXXsyfSkrKS8pO1xuXHRcdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXHRcdFx0bGV0IHZhbHVlO1xuXHRcdFx0Zm9yIChsZXQgaiA9IDE7IGogPCBsZW47IGogKz0gMikge1xuXHRcdFx0XHQvLyBGSVhNRSBzL2RlY29kZVVSSS9kZWNvZGVVUklDb21wb25lbnQvZyA/XG5cdFx0XHRcdHZhbHVlID0gc3BsaXRbal0uc3BsaXQoJy4nKS5qb2luKCclJyk7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvLyBjYW5ub3QgZGVjb2RlXG5cdFx0XHRcdH1cblx0XHRcdFx0c3BsaXRbal0gPSB2YWx1ZS5zcGxpdCgnXycpLmpvaW4oJyAnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzcGxpdC5qb2luKCcnKTtcblx0XHR9XG5cdFx0dXJsQW5jaG9yKCkge1xuXHRcdFx0Y29uc3Qgc3BsaXQgPSB0aGlzLmFuY2hvci5zcGxpdCgnLygoPzpbJV1bMC05QS1GXXsyfSkrKS8nKTtcblx0XHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblx0XHRcdGZvciAobGV0IGogPSAxOyBqIDwgbGVuOyBqICs9IDIpIHtcblx0XHRcdFx0c3BsaXRbal0gPSBzcGxpdFtqXS5zcGxpdCgnJScpLmpvaW4oJy4nKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzcGxpdC5qb2luKCcnKTtcblx0XHR9XG5cdFx0YW5jaG9yRnJvbVV0ZihzdHIpIHtcblx0XHRcdHRoaXMuYW5jaG9yID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0ci5zcGxpdCgnICcpLmpvaW4oJ18nKSlcblx0XHRcdFx0LnNwbGl0KCclM0EnKVxuXHRcdFx0XHQuam9pbignOicpXG5cdFx0XHRcdC5zcGxpdChcIidcIilcblx0XHRcdFx0LmpvaW4oJyUyNycpXG5cdFx0XHRcdC5zcGxpdCgnJScpXG5cdFx0XHRcdC5qb2luKCcuJyk7XG5cdFx0fVxuXHRcdGZyb21VUkwoaCkge1xuXHRcdFx0aWYgKHR5cGVvZiBoICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHQvLyBOT1RFIDogcGxheWluZyB3aXRoIGRlY29kZVVSSSwgZW5jb2RlVVJJLCBlc2NhcGUsIHVuZXNjYXBlLFxuXHRcdFx0Ly8gd2Ugc2VlbSB0byBiZSBhYmxlIHRvIHJlcGxpY2F0ZSB0aGUgSUUgYm9ya2VkIGVuY29kaW5nXG5cdFx0XHQvLyBJRSBkb2Vzbid0IGRvIHRoaXMgbmV3LWZhbmdsZWQgdXRmLTggdGhpbmcuXG5cdFx0XHQvLyBhbmQgaXQncyB3b3JzZSB0aGFuIHRoYXQuXG5cdFx0XHQvLyBJRSBzZWVtcyB0byB0cmVhdCB0aGUgcXVlcnkgc3RyaW5nIGRpZmZlcmVudGx5IHRvIHRoZSByZXN0IG9mIHRoZSB1cmxcblx0XHRcdC8vIHRoZSBxdWVyeSBpcyB0cmVhdGVkIGFzIGJvbmEtZmlkZSB1dGY4LCBidXQgdGhlIGZpcnN0IGJpdCBvZiB0aGUgdXJsIGlzIHBpc3NlZCBhcm91bmQgd2l0aFxuXHRcdFx0Ly8gd2UgZml4IHVwICYgZm9yIGFsbCBicm93c2VycywganVzdCBpbiBjYXNlLlxuXHRcdFx0Y29uc3Qgc3BsaXR0ZWQgPSBoLnNwbGl0KCc/Jyk7XG5cdFx0XHRzcGxpdHRlZFswXSA9IHNwbGl0dGVkWzBdLnNwbGl0KCcmJykuam9pbignJTI2Jyk7XG5cdFx0XHRoID0gc3BsaXR0ZWQuam9pbignPycpO1xuXHRcdFx0Y29uc3QgY29udHJpYnMgPSBwZy5yZS5jb250cmlicy5leGVjKGgpO1xuXHRcdFx0aWYgKGNvbnRyaWJzKSB7XG5cdFx0XHRcdGlmIChjb250cmlic1sxXSA9PT0gJ3RpdGxlPScpIHtcblx0XHRcdFx0XHRjb250cmlic1szXSA9IGNvbnRyaWJzWzNdLnNwbGl0KCcrJykuam9pbignICcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHUgPSBuZXcgVGl0bGUoY29udHJpYnNbM10pO1xuXHRcdFx0XHR0aGlzLnNldFV0Zihcblx0XHRcdFx0XHRUaXRsZS5kZWNvZGVOYXN0aWVzKGAke213LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zVXNlcklkXX06JHt1LnN0cmlwTmFtZXNwYWNlKCl9YClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBlbWFpbCA9IHBnLnJlLmVtYWlsLmV4ZWMoaCk7XG5cdFx0XHRpZiAoZW1haWwpIHtcblx0XHRcdFx0dGhpcy5zZXRVdGYoXG5cdFx0XHRcdFx0VGl0bGUuZGVjb2RlTmFzdGllcyhcblx0XHRcdFx0XHRcdGAke213LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zVXNlcklkXX06JHtuZXcgVGl0bGUoZW1haWxbM10pLnN0cmlwTmFtZXNwYWNlKCl9YFxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBiYWNrbGlua3MgPSBwZy5yZS5iYWNrbGlua3MuZXhlYyhoKTtcblx0XHRcdGlmIChiYWNrbGlua3MpIHtcblx0XHRcdFx0dGhpcy5zZXRVdGYoVGl0bGUuZGVjb2RlTmFzdGllcyhuZXcgVGl0bGUoYmFja2xpbmtzWzNdKSkpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHRcdC8vIEEgZHVtbXkgdGl0bGUgb2JqZWN0IGZvciBhIFNwZWNpYWw6RGlmZiBsaW5rLlxuXHRcdFx0Y29uc3Qgc3BlY2lhbGRpZmYgPSBwZy5yZS5zcGVjaWFsZGlmZi5leGVjKGgpO1xuXHRcdFx0aWYgKHNwZWNpYWxkaWZmKSB7XG5cdFx0XHRcdHRoaXMuc2V0VXRmKFxuXHRcdFx0XHRcdFRpdGxlLmRlY29kZU5hc3RpZXMobmV3IFRpdGxlKGAke213LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zU3BlY2lhbElkXX06RGlmZmApKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHRcdC8vIG5vIG1vcmUgc3BlY2lhbCBjYXNlcyB0byBjaGVjayAtLVxuXHRcdFx0Ly8gaG9wZWZ1bGx5IGl0J3Mgbm90IGEgZGlzZ3Vpc2VkIHVzZXItcmVsYXRlZCBvciBzcGVjaWFsbHkgdHJlYXRlZCBzcGVjaWFsIHBhZ2Vcblx0XHRcdC8vIEluY2x1ZGVzIHJlZmVyZW5jZXNcblx0XHRcdGNvbnN0IG0gPSBwZy5yZS5tYWluLmV4ZWMoaCk7XG5cdFx0XHRpZiAobSA9PT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZyb21Cb3RJbnRlcmZhY2UgPSAvXFw/KC4rJik/dGl0bGU9Ly50ZXN0KGgpO1xuXHRcdFx0XHRpZiAoZnJvbUJvdEludGVyZmFjZSkge1xuXHRcdFx0XHRcdG1bMl0gPSBtWzJdLnNwbGl0KCcrJykuam9pbignXycpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGV4dHJhY3RlZCA9IG1bMl0gKyAobVszXSA/IGAjJHttWzNdfWAgOiAnJyk7XG5cdFx0XHRcdGlmIChwZy5mbGFnLmlzU2FmYXJpICYmIC8lMjVbXFxkQS1GYS1mXXsyfS8udGVzdChleHRyYWN0ZWQpKSB7XG5cdFx0XHRcdFx0Ly8gRml4IFNhZmFyaSBpc3N1ZVxuXHRcdFx0XHRcdC8vIFNhZmFyaSBzb21ldGltZXMgZW5jb2RlcyAlIGFzICUyNSBpbiBVVEYtOCBlbmNvZGVkIHN0cmluZ3MgbGlrZSAlRTUlQTMgLT4gJTI1RTUlMjVBMy5cblx0XHRcdFx0XHR0aGlzLnNldFV0ZihkZWNvZGVVUklDb21wb25lbnQodW5lc2NhcGUoZXh0cmFjdGVkKSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuc2V0VXRmKFRpdGxlLmRlY29kZU5hc3RpZXMoZXh0cmFjdGVkKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRzdGF0aWMgZGVjb2RlTmFzdGllcyh0eHQpIHtcblx0XHRcdC8vIG15RGVjb2RlVVJJIHVzZXMgZGVjb2RlRXh0cmFzLCB3aGljaCByZW1vdmVzIF8sXG5cdFx0XHQvLyB0aHVzIHJ1aW5pbmcgY2l0YXRpb25zIHByZXZpZXdzLCB3aGljaCBhcmUgZm9ybWF0ZWQgYXMgXCJjaXRlX25vdGUtMVwiXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRsZXQgcmV0ID0gZGVjb2RlVVJJKFRpdGxlLmRlY29kZUVzY2FwZXModHh0KSk7XG5cdFx0XHRcdHJldCA9IHJldC5yZXBsYWNlKC9bIF9dKiQvLCAnJyk7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0cmV0dXJuIHR4dDsgLy8gY2Fubm90IGRlY29kZVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBEZWNvZGUgdmFsaWQgJS1lbmNvZGluZ3MsIG90aGVyd2lzZSBlc2NhcGUgdGhlbVxuXHRcdHN0YXRpYyBkZWNvZGVFc2NhcGVzKHR4dCkge1xuXHRcdFx0Y29uc3Qgc3BsaXQgPSB0eHQuc3BsaXQoLygoPzolW1xcZEEtRmEtZl17Mn0pKykvKTtcblx0XHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblx0XHRcdC8vIE5vICUtZW5jb2RlZCBpdGVtcyBmb3VuZCwgc28gcmVwbGFjZSB0aGUgbGl0ZXJhbCAlXG5cdFx0XHRpZiAobGVuID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBzcGxpdFswXS5yZXBsYWNlKC8lKD8hW1xcZEEtRmEtZl17Mn0pL2csICclMjUnKTtcblx0XHRcdH1cblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgbGVuOyBpICs9IDIpIHtcblx0XHRcdFx0c3BsaXRbaV0gPSBkZWNvZGVVUklDb21wb25lbnQoc3BsaXRbaV0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNwbGl0LmpvaW4oJycpO1xuXHRcdH1cblx0XHRmcm9tQW5jaG9yKGEpIHtcblx0XHRcdGlmICghYSkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5mcm9tVVJMKGEuaHJlZik7XG5cdFx0fVxuXHRcdGZyb21XaWtpVGV4dCh0eHQpIHtcblx0XHRcdC8vIEZJWE1FIC0gdGVzdGluZyBuZWVkZWRcblx0XHRcdHR4dCA9IG15RGVjb2RlVVJJKHR4dCk7XG5cdFx0XHR0aGlzLnNldFV0Zih0eHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGhpbnRWYWx1ZSgpIHtcblx0XHRcdGlmICghdGhpcy52YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2FmZURlY29kZVVSSSh0aGlzLnZhbHVlKTtcblx0XHR9XG5cdFx0dG9Vc2VyTmFtZSh3aXRoTnMpIHtcblx0XHRcdGlmICh0aGlzLm5hbWVzcGFjZUlkKCkgIT09IHBnLm5zVXNlcklkICYmIHRoaXMubmFtZXNwYWNlSWQoKSAhPT0gcGcubnNVc2VydGFsa0lkKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSBudWxsO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnZhbHVlID1cblx0XHRcdFx0KHdpdGhOcyA/IGAke213LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zVXNlcklkXX06YCA6ICcnKSArXG5cdFx0XHRcdHRoaXMuc3RyaXBOYW1lc3BhY2UoKS5zcGxpdCgnLycpWzBdO1xuXHRcdH1cblx0XHR1c2VyTmFtZSh3aXRoTnMpIHtcblx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUodGhpcy52YWx1ZSk7XG5cdFx0XHR0LnRvVXNlck5hbWUod2l0aE5zKTtcblx0XHRcdGlmICh0LnZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdHRvVGFsa1BhZ2UoKSB7XG5cdFx0XHQvLyBjb252ZXJ0IGFydGljbGUgdG8gYSB0YWxrIHBhZ2UsIG9yIGlmIHdlIGNhbid0LCByZXR1cm4gbnVsbFxuXHRcdFx0Ly8gSW4gb3RoZXIgd29yZHM6IHJldHVybiBudWxsIGlmIHRoaXMgQUxSRUFEWSBJUyBhIHRhbGsgcGFnZVxuXHRcdFx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB0YWxrIHBhZ2Ugb3RoZXJ3aXNlXG5cdFx0XHQvL1xuXHRcdFx0Ly8gUGVyIHtAbGluayBodHRwczovL3d3dy5tZWRpYXdpa2kub3JnL3dpa2kvTWFudWFsOk5hbWVzcGFjZSNTdWJqZWN0X2FuZF90YWxrX25hbWVzcGFjZXN9XG5cdFx0XHQvLyAqIEFsbCBkaXNjdXNzaW9uIG5hbWVzcGFjZXMgaGF2ZSBvZGQtaW50ZWdlciBpbmRpY2VzXG5cdFx0XHQvLyAqIFRoZSBkaXNjdXNzaW9uIG5hbWVzcGFjZSBpbmRleCBmb3IgYSBzcGVjaWZpYyBuYW1lc3BhY2Ugd2l0aCBpbmRleCBuIGlzIG4gKyAxXG5cdFx0XHRpZiAodGhpcy52YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hbWVzcGFjZUlkID0gdGhpcy5uYW1lc3BhY2VJZCgpO1xuXHRcdFx0aWYgKG5hbWVzcGFjZUlkID49IDAgJiYgbmFtZXNwYWNlSWQgJSAyID09PSAwKSB7XG5cdFx0XHRcdC8vIG5vbi1zcGVjaWFsIGFuZCBzdWJqZWN0IG5hbWVzcGFjZVxuXHRcdFx0XHRjb25zdCBsb2NhbGl6ZWROYW1lc3BhY2UgPSBtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtuYW1lc3BhY2VJZCArIDFdO1xuXHRcdFx0XHRpZiAobG9jYWxpemVkTmFtZXNwYWNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aGlzLnZhbHVlID1cblx0XHRcdFx0XHRcdGxvY2FsaXplZE5hbWVzcGFjZSA9PT0gJydcblx0XHRcdFx0XHRcdFx0PyB0aGlzLnN0cmlwTmFtZXNwYWNlKClcblx0XHRcdFx0XHRcdFx0OiBgJHtsb2NhbGl6ZWROYW1lc3BhY2Uuc3BsaXQoJyAnKS5qb2luKCdfJyl9OiR7dGhpcy5zdHJpcE5hbWVzcGFjZSgpfWA7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMudmFsdWUgPSBudWxsO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8vIFJldHVybiBjYW5vbmljYWwsIGxvY2FsaXplZCBuYW1lc3BhY2Vcblx0XHRuYW1lc3BhY2UoKSB7XG5cdFx0XHRyZXR1cm4gbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbdGhpcy5uYW1lc3BhY2VJZCgpXTtcblx0XHR9XG5cdFx0bmFtZXNwYWNlSWQoKSB7XG5cdFx0XHRjb25zdCBuID0gdGhpcy52YWx1ZS5pbmRleE9mKCc6Jyk7XG5cdFx0XHRpZiAobiA8IDApIHtcblx0XHRcdFx0cmV0dXJuIDA7IC8vIG1haW5zcGFjZVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbmFtZXNwYWNlSWQgPVxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpW3RoaXMudmFsdWUuc2xpY2UoMCwgTWF0aC5tYXgoMCwgbikpLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCldO1xuXHRcdFx0aWYgKG5hbWVzcGFjZUlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIDA7IC8vIG1haW5zcGFjZVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5hbWVzcGFjZUlkO1xuXHRcdH1cblx0XHR0YWxrUGFnZSgpIHtcblx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUodGhpcy52YWx1ZSk7XG5cdFx0XHR0LnRvVGFsa1BhZ2UoKTtcblx0XHRcdGlmICh0LnZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGlzVGFsa1BhZ2UoKSB7XG5cdFx0XHRpZiAodGhpcy50YWxrUGFnZSgpID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR0b0FydGljbGVGcm9tVGFsa1BhZ2UoKSB7XG5cdFx0XHQvLyBsYXJnZWx5IGNvcHkvcGFzdGUgZnJvbSB0b1RhbGtQYWdlIGFib3ZlLlxuXHRcdFx0aWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuYW1lc3BhY2VJZCA9IHRoaXMubmFtZXNwYWNlSWQoKTtcblx0XHRcdGlmIChuYW1lc3BhY2VJZCA+PSAwICYmIG5hbWVzcGFjZUlkICUgMiA9PT0gMSkge1xuXHRcdFx0XHQvLyBub24tc3BlY2lhbCBhbmQgdGFsayBuYW1lc3BhY2Vcblx0XHRcdFx0Y29uc3QgbG9jYWxpemVkTmFtZXNwYWNlID0gbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbbmFtZXNwYWNlSWQgLSAxXTtcblx0XHRcdFx0aWYgKGxvY2FsaXplZE5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy52YWx1ZSA9XG5cdFx0XHRcdFx0XHRsb2NhbGl6ZWROYW1lc3BhY2UgPT09ICcnXG5cdFx0XHRcdFx0XHRcdD8gdGhpcy5zdHJpcE5hbWVzcGFjZSgpXG5cdFx0XHRcdFx0XHRcdDogYCR7bG9jYWxpemVkTmFtZXNwYWNlLnNwbGl0KCcgJykuam9pbignXycpfToke3RoaXMuc3RyaXBOYW1lc3BhY2UoKX1gO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRhcnRpY2xlRnJvbVRhbGtQYWdlKCkge1xuXHRcdFx0Y29uc3QgdCA9IG5ldyBUaXRsZSh0aGlzLnZhbHVlKTtcblx0XHRcdHQudG9BcnRpY2xlRnJvbVRhbGtQYWdlKCk7XG5cdFx0XHRpZiAodC52YWx1ZSkge1xuXHRcdFx0XHRyZXR1cm4gdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRhcnRpY2xlRnJvbVRhbGtPckFydGljbGUoKSB7XG5cdFx0XHRjb25zdCB0ID0gbmV3IFRpdGxlKHRoaXMudmFsdWUpO1xuXHRcdFx0aWYgKHQudG9BcnRpY2xlRnJvbVRhbGtQYWdlKCkpIHtcblx0XHRcdFx0cmV0dXJuIHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aXNJcFVzZXIoKSB7XG5cdFx0XHRyZXR1cm4gcGcucmUuaXBVc2VyLnRlc3QodGhpcy51c2VyTmFtZSgpKTtcblx0XHR9XG5cdFx0c3RyaXBOYW1lc3BhY2UoKSB7XG5cdFx0XHQvLyByZXR1cm5zIGEgc3RyaW5nLCBub3QgYSBUaXRsZVxuXHRcdFx0Y29uc3QgbiA9IHRoaXMudmFsdWUuaW5kZXhPZignOicpO1xuXHRcdFx0aWYgKG4gPCAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbmFtZXNwYWNlSWQgPSB0aGlzLm5hbWVzcGFjZUlkKCk7XG5cdFx0XHRpZiAobmFtZXNwYWNlSWQgPT09IHBnLm5zTWFpbnNwYWNlSWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZS5zbGljZShNYXRoLm1heCgwLCBuICsgMSkpO1xuXHRcdH1cblx0XHRzZXRVdGYodmFsdWUpIHtcblx0XHRcdGlmICghdmFsdWUpIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9ICcnO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhbmNoID0gdmFsdWUuaW5kZXhPZignIycpO1xuXHRcdFx0aWYgKGFuY2ggPCAwKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWx1ZS5zcGxpdCgnXycpLmpvaW4oJyAnKTtcblx0XHRcdFx0dGhpcy5hbmNob3IgPSAnJztcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIE1hdGgubWF4KDAsIGFuY2gpKS5zcGxpdCgnXycpLmpvaW4oJyAnKTtcblx0XHRcdHRoaXMuYW5jaG9yID0gdmFsdWUuc2xpY2UoTWF0aC5tYXgoMCwgYW5jaCArIDEpKTtcblx0XHRcdHRoaXMubnMgPSBudWxsOyAvLyB3YWl0IHVudGlsIG5hbWVzcGFjZSgpIGlzIGNhbGxlZFxuXHRcdH1cblx0XHRzZXRVcmwodXJsZnJhZykge1xuXHRcdFx0Y29uc3QgYW5jaCA9IHVybGZyYWcuaW5kZXhPZignIycpO1xuXHRcdFx0dGhpcy52YWx1ZSA9IHNhZmVEZWNvZGVVUkkodXJsZnJhZy5zbGljZSgwLCBNYXRoLm1heCgwLCBhbmNoKSkpO1xuXHRcdFx0dGhpcy5hbmNob3IgPSB0aGlzLnZhbHVlLnNsaWNlKE1hdGgubWF4KDAsIGFuY2ggKyAxKSk7XG5cdFx0fVxuXHRcdGFwcGVuZCh4KSB7XG5cdFx0XHR0aGlzLnNldFV0Zih0aGlzLnZhbHVlICsgeCk7XG5cdFx0fVxuXHRcdHVybFN0cmluZyh4KSB7XG5cdFx0XHRpZiAoIXgpIHtcblx0XHRcdFx0eCA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0bGV0IHYgPSB0aGlzLnRvU3RyaW5nKHRydWUpO1xuXHRcdFx0aWYgKCF4Lm9taXRBbmNob3IgJiYgdGhpcy5hbmNob3IpIHtcblx0XHRcdFx0diArPSBgIyR7dGhpcy51cmxBbmNob3IoKX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF4LmtlZXBTcGFjZXMpIHtcblx0XHRcdFx0diA9IHYuc3BsaXQoJyAnKS5qb2luKCdfJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZW5jb2RlVVJJKHYpLnNwbGl0KCcmJykuam9pbignJTI2Jykuc3BsaXQoJz8nKS5qb2luKCclM0YnKS5zcGxpdCgnKycpLmpvaW4oJyUyQicpO1xuXHRcdH1cblx0XHRyZW1vdmVBbmNob3IoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFRpdGxlKHRoaXMudG9TdHJpbmcodHJ1ZSkpO1xuXHRcdH1cblx0XHR0b1VybCgpIHtcblx0XHRcdHJldHVybiBwZy53aWtpLnRpdGxlYmFzZSArIHRoaXMudXJsU3RyaW5nKCk7XG5cdFx0fVxuXHR9XG5cdFRpdGxlLmZyb21VUkwgPSAoaCkgPT4ge1xuXHRcdHJldHVybiBuZXcgVGl0bGUoKS5mcm9tVVJMKGgpO1xuXHR9O1xuXHRUaXRsZS5mcm9tQW5jaG9yID0gKGEpID0+IHtcblx0XHRyZXR1cm4gbmV3IFRpdGxlKCkuZnJvbUFuY2hvcihhKTtcblx0fTtcblx0VGl0bGUuZnJvbVdpa2lUZXh0ID0gKHR4dCkgPT4ge1xuXHRcdHJldHVybiBuZXcgVGl0bGUoKS5mcm9tV2lraVRleHQodHh0KTtcblx0fTtcblx0Y29uc3QgcGFyc2VQYXJhbXMgPSAodXJsKSA9PiB7XG5cdFx0Y29uc3Qgc3BlY2lhbERpZmYgPSBwZy5yZS5zcGVjaWFsZGlmZi5leGVjKHVybCk7XG5cdFx0aWYgKHNwZWNpYWxEaWZmKSB7XG5cdFx0XHRjb25zdCBzcGxpdCA9IHNwZWNpYWxEaWZmWzFdLnNwbGl0KCcvJyk7XG5cdFx0XHRpZiAoc3BsaXQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkaWQ6IHNwbGl0WzBdLFxuXHRcdFx0XHRcdGRpZmY6ICdwcmV2Jyxcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZiAoc3BsaXQubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkaWQ6IHNwbGl0WzBdLFxuXHRcdFx0XHRcdGRpZmY6IHNwbGl0WzFdLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCByZXQgPSB7fTtcblx0XHRpZiAoIXVybC5pbmNsdWRlcygnPycpKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRbdXJsXSA9IHVybC5zcGxpdCgnIycpO1xuXHRcdGNvbnN0IHMgPSB1cmwuc3BsaXQoJz8nKS5zbGljZSgxKS5qb2luKCcsJyk7XG5cdFx0Y29uc3QgdCA9IHMuc3BsaXQoJyYnKTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdCkge1xuXHRcdFx0Y29uc3QgeiA9IGVsZW1lbnQuc3BsaXQoJz0nKTtcblx0XHRcdHoucHVzaChudWxsKTtcblx0XHRcdFssIHJldFt6WzBdXV0gPSB6O1xuXHRcdH1cblx0XHQvLyBEaWZmIHJldmlzaW9uIHdpdGggbm8gb2xkaWQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBkaWZmIHRvIHRoZSBwcmV2aW91cyByZXZpc2lvbiBieSBNZWRpYVdpa2lcblx0XHRpZiAocmV0LmRpZmYgJiYgcmV0Lm9sZGlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldC5vbGRpZCA9ICdwcmV2Jztcblx0XHR9XG5cdFx0Ly8gRG9jdW1lbnRhdGlvbiBzZWVtcyB0byBzYXkgc29tZXRoaW5nIGRpZmZlcmVudCwgYnV0IG9sZGlkIGNhbiBhbHNvIGFjY2VwdCBwcmV2L25leHQsIGFuZFxuXHRcdC8vIEVjaG8gaXMgZW1pdHRpbmcgc3VjaCBVUkxzLiBTaW1wbGUgZml4dXAgZHVyaW5nIHBhcmFtZXRlciBkZWNvZGluZzpcblx0XHRpZiAocmV0Lm9sZGlkICYmIChyZXQub2xkaWQgPT09ICdwcmV2JyB8fCByZXQub2xkaWQgPT09ICduZXh0JyB8fCByZXQub2xkaWQgPT09ICdjdXInKSkge1xuXHRcdFx0Y29uc3QgaGVscGVyID0gcmV0LmRpZmY7XG5cdFx0XHRyZXQuZGlmZiA9IHJldC5vbGRpZDtcblx0XHRcdHJldC5vbGRpZCA9IGhlbHBlcjtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Ly8gKGEpIG15RGVjb2RlVVJJIChmaXJzdCBzdGFuZGFyZCBkZWNvZGVVUkksIHRoZW4gcGcucmUudXJsTm9Qb3B1cClcblx0Ly8gKGIpIGNoYW5nZSBzcGFjZXMgdG8gdW5kZXJzY29yZXNcblx0Ly8gKGMpIGVuY29kZVVSSSAoanVzdCB0aGUgc3RyYWlnaHQgb25lLCBubyBwZy5yZS51cmxOb1BvcHVwKVxuXHRjb25zdCBteURlY29kZVVSSSA9IChzdHIpID0+IHtcblx0XHRsZXQgcmV0O1xuXHRcdC8vIEZJWE1FIGRlY29kZVVSSUNvbXBvbmVudD8/XG5cdFx0dHJ5IHtcblx0XHRcdHJldCA9IGRlY29kZVVSSShzdHIudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gc3RyO1xuXHRcdH1cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBnLm1pc2MuZGVjb2RlRXh0cmFzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRjb25zdCB7ZnJvbX0gPSBwZy5taXNjLmRlY29kZUV4dHJhc1tpXTtcblx0XHRcdGNvbnN0IHt0b30gPSBwZy5taXNjLmRlY29kZUV4dHJhc1tpXTtcblx0XHRcdHJldCA9IHJldC5zcGxpdChmcm9tKS5qb2luKHRvKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3Qgc2FmZURlY29kZVVSSSA9IChzdHIpID0+IHtcblx0XHRjb25zdCByZXQgPSBteURlY29kZVVSSShzdHIpO1xuXHRcdHJldHVybiByZXQgfHwgc3RyO1xuXHR9O1xuXHQvLyBURVNUUyAvL1xuXHRjb25zdCBpc0Rpc2FtYmlnID0gKGRhdGEsIGFydGljbGUpID0+IHtcblx0XHRpZiAoIWdldFZhbHVlT2YoJ3BvcHVwQWxsRGFic1N0dWJzJykgJiYgYXJ0aWNsZS5uYW1lc3BhY2UoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWFydGljbGUuaXNUYWxrUGFnZSgpICYmIHBnLnJlLmRpc2FtYmlnLnRlc3QoZGF0YSk7XG5cdH07XG5cdGNvbnN0IHN0dWJDb3VudCA9IChkYXRhLCBhcnRpY2xlKSA9PiB7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cEFsbERhYnNTdHVicycpICYmIGFydGljbGUubmFtZXNwYWNlKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0bGV0IHNlY3RTdHViID0gMDtcblx0XHRsZXQgcmVhbFN0dWIgPSAwO1xuXHRcdGlmIChwZy5yZS5zdHViLnRlc3QoZGF0YSkpIHtcblx0XHRcdGNvbnN0IHMgPSBkYXRhLnNwbGl0KHBnLnJlLnN0dWIpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBzLmxlbmd0aDsgaSArPSAyKSB7XG5cdFx0XHRcdGlmIChzW2ldKSB7XG5cdFx0XHRcdFx0KytzZWN0U3R1Yjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQrK3JlYWxTdHViO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRyZWFsOiByZWFsU3R1Yixcblx0XHRcdHNlY3Q6IHNlY3RTdHViLFxuXHRcdH07XG5cdH07XG5cdGNvbnN0IGlzVmFsaWRJbWFnZU5hbWUgPSAoc3RyKSA9PiB7XG5cdFx0cmV0dXJuICFzdHIuaW5jbHVkZXMoJ3snKTtcblx0fTtcblx0Y29uc3QgaXNJblN0cmlwcGFibGVOYW1lc3BhY2UgPSAoYXJ0aWNsZSkgPT4ge1xuXHRcdHJldHVybiBhcnRpY2xlLm5hbWVzcGFjZUlkKCkgIT09IDA7XG5cdH07XG5cdGNvbnN0IGlzSW5NYWluTmFtZXNwYWNlID0gKGFydGljbGUpID0+IHtcblx0XHRyZXR1cm4gYXJ0aWNsZS5uYW1lc3BhY2VJZCgpID09PSAwO1xuXHR9O1xuXHRjb25zdCBhbmNob3JDb250YWluc0ltYWdlID0gKGEpID0+IHtcblx0XHQvLyBpdGVyYXRlIG92ZXIgY2hpbGRyZW4gb2YgYW5jaG9yIGFcblx0XHQvLyBzZWUgaWYgYW55IGFyZSBpbWFnZXNcblx0XHRpZiAoYSA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBraWRzID0gYS5jaGlsZE5vZGVzO1xuXHRcdGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHtcblx0XHRcdGlmIChraWQubm9kZU5hbWUgPT09ICdJTUcnKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdGNvbnN0IGlzUG9wdXBMaW5rID0gKGEpID0+IHtcblx0XHQvLyBOQiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgVE9DIGxpbmtzIGdlbmVyYWxseSByZXR1cm4gdHJ1ZVxuXHRcdC8vIHRoZXkgc2hvdWxkIGJlIHN0cmlwcGVkIG91dCBsYXRlclxuXHRcdGlmICghbWFya05vcG9wdXBTcGFuTGlua3MuZG9uZSkge1xuXHRcdFx0bWFya05vcG9wdXBTcGFuTGlua3MoKTtcblx0XHR9XG5cdFx0aWYgKGEuaW5Ob3BvcHVwU3Bhbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBGSVhNRSBpcyB0aGlzIGZhc3RlciBpbmxpbmU/XG5cdFx0aWYgKGEub25tb3VzZWRvd24gfHwgYS5nZXRBdHRyaWJ1dGUoJ25vcG9wdXAnKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBoID0gYS5ocmVmO1xuXHRcdGlmIChoID09PSBgJHtkb2N1bWVudC5sb2NhdGlvbi5ocmVmfSNgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghcGcucmUuYmFzZW5hbWVzLnRlc3QoaCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFwZy5yZS51cmxOb1BvcHVwLnRlc3QoaCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gKFxuXHRcdFx0KHBnLnJlLmVtYWlsLnRlc3QoaCkgfHwgcGcucmUuY29udHJpYnMudGVzdChoKSB8fCBwZy5yZS5iYWNrbGlua3MudGVzdChoKSB8fCBwZy5yZS5zcGVjaWFsZGlmZi50ZXN0KGgpKSAmJlxuXHRcdFx0IWguaW5jbHVkZXMoJyZsaW1pdD0nKVxuXHRcdCk7XG5cdH07XG5cdGNvbnN0IG1hcmtOb3BvcHVwU3BhbkxpbmtzID0gZnVuY3Rpb24gbWFya05vcG9wdXBTcGFuTGlua3MoKSB7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cE9ubHlBcnRpY2xlTGlua3MnKSkge1xuXHRcdFx0Zml4VmVjdG9yTWVudVBvcHVwcygpO1xuXHRcdH1cblx0XHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0XHRjb25zdCBzID0gJGJvZHkuZmluZCgnLm5vcG9wdXBzJykudG9BcnJheSgpO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBzKSB7XG5cdFx0XHRjb25zdCBhcyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuXHRcdFx0Zm9yIChjb25zdCBhIG9mIGFzKSB7XG5cdFx0XHRcdGEuaW5Ob3BvcHVwU3BhbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1hcmtOb3BvcHVwU3BhbkxpbmtzLmRvbmUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCBmaXhWZWN0b3JNZW51UG9wdXBzID0gKCkgPT4ge1xuXHRcdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHRcdCRib2R5LmZpbmQoJ25hdi52ZWN0b3ItbWVudSBoMzpmaXJzdCBhOmZpcnN0JykucHJvcCgnaW5Ob3BvcHVwU3BhbicsIHRydWUpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiB0aXRsZXMuanNcblx0Ly8gU1RBUlRGSUxFOiBnZXRwYWdlLmpzXG5cdC8vIFdpa2ktc3BlY2lmaWMgZG93bmxvYWRpbmdcblx0Ly9cblx0Ly8gU2NoZW1hdGljIGZvciBhIGdldFdpa2kgY2FsbFxuXHQvL1xuXHQvLyAgICAgICAgICAgICBnZXRQYWdlV2l0aENhY2hpbmdcblx0Ly9cdFx0XHRcdFx0fFxuXHQvL1x0ICAgZmFsc2VcdFx0fFx0XHQgIHRydWVcblx0Ly8gZ2V0UGFnZTwtW2ZpbmRQaWN0dXJlSW5DYWNoZV0tPi1vbkNvbXBsZXRlKGEgZmFrZSBkb3dubG9hZClcblx0Ly8gICBcXC5cblx0Ly9cdCAoYXN5bmMpLT5hZGRQYWdlVG9DYWNoZShkb3dubG9hZCktPi1vbkNvbXBsZXRlKGRvd25sb2FkKVxuXHQvLyBjaGVjayBjYWNoZSB0byBzZWUgaWYgcGFnZSBleGlzdHNcblx0Y29uc3QgZ2V0UGFnZVdpdGhDYWNoaW5nID0gKHVybCwgb25Db21wbGV0ZSwgb3duZXIpID0+IHtcblx0XHRsb2coYGdldFBhZ2VXaXRoQ2FjaGluZywgdXJsPSR7dXJsfWApO1xuXHRcdGNvbnN0IGkgPSBmaW5kSW5QYWdlQ2FjaGUodXJsKTtcblx0XHRsZXQgZDtcblx0XHRpZiAoaSA+IC0xKSB7XG5cdFx0XHRkID0gZmFrZURvd25sb2FkKFxuXHRcdFx0XHR1cmwsXG5cdFx0XHRcdG93bmVyLmlkTnVtYmVyLFxuXHRcdFx0XHRvbkNvbXBsZXRlLFxuXHRcdFx0XHRwZy5jYWNoZS5wYWdlc1tpXS5kYXRhLFxuXHRcdFx0XHRwZy5jYWNoZS5wYWdlc1tpXS5sYXN0TW9kaWZpZWQsXG5cdFx0XHRcdG93bmVyXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkID0gZ2V0UGFnZSh1cmwsIG9uQ29tcGxldGUsIG93bmVyKTtcblx0XHRcdGlmIChkICYmIG93bmVyICYmIG93bmVyLmFkZERvd25sb2FkKSB7XG5cdFx0XHRcdG93bmVyLmFkZERvd25sb2FkKGQpO1xuXHRcdFx0XHRkLm93bmVyID0gb3duZXI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBnZXRQYWdlID0gKHVybCwgb25Db21wbGV0ZSwgb3duZXIpID0+IHtcblx0XHRsb2coJ2dldFBhZ2UnKTtcblx0XHRjb25zdCBjYWxsYmFjayA9IChkKSA9PiB7XG5cdFx0XHRpZiAoIWQuYWJvcnRlZCkge1xuXHRcdFx0XHRhZGRQYWdlVG9DYWNoZShkKTtcblx0XHRcdFx0b25Db21wbGV0ZShkKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHJldHVybiBzdGFydERvd25sb2FkKHVybCwgb3duZXIuaWROdW1iZXIsIGNhbGxiYWNrKTtcblx0fTtcblx0Y29uc3QgZmluZEluUGFnZUNhY2hlID0gKHVybCkgPT4ge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGcuY2FjaGUucGFnZXMubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICh1cmwgPT09IHBnLmNhY2hlLnBhZ2VzW2ldLnVybCkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9O1xuXHRjb25zdCBhZGRQYWdlVG9DYWNoZSA9IChkb3dubG9hZCkgPT4ge1xuXHRcdGxvZyhgYWRkUGFnZVRvQ2FjaGUgJHtkb3dubG9hZC51cmx9YCk7XG5cdFx0Y29uc3QgcGFnZSA9IHtcblx0XHRcdHVybDogZG93bmxvYWQudXJsLFxuXHRcdFx0ZGF0YTogZG93bmxvYWQuZGF0YSxcblx0XHRcdGxhc3RNb2RpZmllZDogZG93bmxvYWQubGFzdE1vZGlmaWVkLFxuXHRcdH07XG5cdFx0cmV0dXJuIHBnLmNhY2hlLnBhZ2VzLnB1c2gocGFnZSk7XG5cdH07XG5cdC8vIEVOREZJTEU6IGdldHBhZ2UuanNcblx0Ly8gU1RBUlRGSUxFOiB0b29scy5qc1xuXHQvLyBJRSBtYWRuZXNzIHdpdGggZW5jb2Rpbmdcblx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09XG5cdC8vXG5cdC8vIHN1cHBvc2UgdGhyb3VnaG91dCB0aGF0IHRoZSBwYWdlIGlzIGluIHV0ZjgsIGxpa2Ugd2lraXBlZGlhXG5cdC8vXG5cdC8vIGlmIGEgaXMgYW4gYW5jaG9yIERPTSBlbGVtZW50IGFuZCBhLmhyZWYgc2hvdWxkIGNvbnNpc3Qgb2Zcblx0Ly9cblx0Ly8gaHR0cDovL2hvc3QubmFtZS5oZXJlL3dpa2kvZm9vP2Jhcj1iYXpcblx0Ly9cblx0Ly8gdGhlbiBJRSBnaXZlcyBmb28gYXMgXCJsYXRpbjEtZW5jb2RlZFwiIHV0Zjg7IHdlIGhhdmUgZm9vID0gZGVjb2RlX3V0ZjgoZGVjb2RlVVJJKGZvb19pZSkpXG5cdC8vIGJ1dCBJRSBnaXZlcyBiYXI9YmF6IGNvcnJlY3RseSBhcyBwbGFpbiB1dGY4XG5cdC8vXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvL1xuXHQvLyBJRSdzIHhtbGh0dHAgZG9lc24ndCB1bmRlcnN0YW5kIHV0ZjggdXJscy4gSGF2ZSB0byB1c2UgZW5jb2RlVVJJIGhlcmUuXG5cdC8vXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvL1xuXHQvLyBzdW1tYXQgZWxzZVxuXHQvLyBTb3VyY2U6IGh0dHA6Ly9ha3R1ZWxsLmRlLnNlbGZodG1sLm9yZy9hcnRpa2VsL2phdmFzY3JpcHQvdXRmOGI2NC91dGY4Lmh0bVxuXHRjb25zdCBnZXRKc09iaiA9IChqc29uKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzb25fcmV0ID0gSlNPTi5wYXJzZShqc29uKTtcblx0XHRcdGlmIChqc29uX3JldC53YXJuaW5ncykge1xuXHRcdFx0XHRmb3IgKGxldCB3ID0gMDsgdyA8IGpzb25fcmV0Lndhcm5pbmdzLmxlbmd0aDsgdysrKSB7XG5cdFx0XHRcdFx0aWYgKGpzb25fcmV0Lndhcm5pbmdzW3ddWycqJ10pIHtcblx0XHRcdFx0XHRcdGxvZyhqc29uX3JldC53YXJuaW5nc1t3XVsnKiddKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bG9nKGpzb25fcmV0Lndhcm5pbmdzW3ddLndhcm5pbmdzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoanNvbl9yZXQuZXJyb3IpIHtcblx0XHRcdFx0ZXJybG9nKGAke2pzb25fcmV0LmVycm9yLmNvZGV9OiAke2pzb25fcmV0LmVycm9yLmluZm99YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ganNvbl9yZXQ7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRlcnJsb2coYFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggZ2V0SnNPYmosIGpzb249JHtqc29ufWApO1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhbnlDaGlsZCA9IChvYmopID0+IHtcblx0XHRmb3IgKGNvbnN0IHAgaW4gb2JqKSB7XG5cdFx0XHRpZiAoIU9iamVjdC5oYXNPd24ob2JqLCBwKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmpbcF07XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9O1xuXHRjb25zdCB1cGNhc2VGaXJzdCA9IChzdHIpID0+IHtcblx0XHRpZiAodHlwZW9mIHN0ciAhPT0gdHlwZW9mICcnIHx8IHN0ciA9PT0gJycpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblx0fTtcblx0Y29uc3QgZmluZEluQXJyYXkgPSAoYXJyLCBmb28pID0+IHtcblx0XHRpZiAoIWFyciB8fCBhcnIubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gLTE7XG5cdFx0fVxuXHRcdGNvbnN0IGxlbiA9IGFyci5sZW5ndGg7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0aWYgKGFycltpXSA9PT0gZm9vKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH07XG5cdGNvbnN0IG5leHRPbmUgPSAoYXJyYXksIHZhbHVlKSA9PiB7XG5cdFx0Ly8gTkIgaWYgdGhlIGFycmF5IGhhcyB0d28gY29uc2VjdXRpdmUgZW50cmllcyBlcXVhbFxuXHRcdC8vXHR0aGVuIHRoaXMgd2lsbCBsb29wIG9uIHN1Y2Nlc3NpdmUgY2FsbHNcblx0XHRjb25zdCBpID0gZmluZEluQXJyYXkoYXJyYXksIHZhbHVlKTtcblx0XHRpZiAoaSA8IDApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gYXJyYXlbaSArIDFdO1xuXHR9O1xuXHRjb25zdCBsaXRlcmFsaXplUmVnZXggPSAoc3RyKSA9PiB7XG5cdFx0cmV0dXJuIG13LnV0aWwuZXNjYXBlUmVnRXhwKHN0cik7XG5cdH07XG5cdFN0cmluZy5wcm90b3R5cGUuZW50aWZ5ID0gZnVuY3Rpb24gKCkge1xuXHRcdC8vIGxldCBzaHkgPSAnJnNoeTsnO1xuXHRcdHJldHVybiB0aGlzLnNwbGl0KCcmJylcblx0XHRcdC5qb2luKCcmYW1wOycpXG5cdFx0XHQuc3BsaXQoJzwnKVxuXHRcdFx0LmpvaW4oJyZsdDsnKVxuXHRcdFx0LnNwbGl0KCc+Jylcblx0XHRcdC5qb2luKCcmZ3Q7JyAvKiArc2h5ICovKVxuXHRcdFx0LnNwbGl0KCdcIicpXG5cdFx0XHQuam9pbignJnF1b3Q7Jyk7XG5cdH07XG5cdC8vIEFycmF5IGZpbHRlciBmdW5jdGlvblxuXHRjb25zdCByZW1vdmVOdWxscyA9ICh2YWwpID0+IHtcblx0XHRyZXR1cm4gdmFsICE9PSBudWxsO1xuXHR9O1xuXHRjb25zdCBqb2luUGF0aCA9IChsaXN0KSA9PiB7XG5cdFx0cmV0dXJuIGxpc3QuZmlsdGVyKHJlbW92ZU51bGxzKS5qb2luKCcvJyk7XG5cdH07XG5cdGNvbnN0IHNpbXBsZVByaW50ZiA9IChzdHIsIHN1YnMpID0+IHtcblx0XHRpZiAoIXN0ciB8fCAhc3Vicykge1xuXHRcdFx0cmV0dXJuIHN0cjtcblx0XHR9XG5cdFx0Y29uc3QgcmV0ID0gW107XG5cdFx0Y29uc3QgcyA9IHN0ci5zcGxpdCgvKCVzfFxcJFxcZCspLyk7XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGRvIHtcblx0XHRcdHJldC5wdXNoKHMuc2hpZnQoKSk7XG5cdFx0XHRpZiAocy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjbWQgPSBzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoY21kID09PSAnJXMnKSB7XG5cdFx0XHRcdGlmIChpIDwgc3Vicy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXQucHVzaChzdWJzW2ldKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXQucHVzaChjbWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCsraTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGogPSBOdW1iZXIucGFyc2VJbnQoY21kLnJlcGxhY2UoJyQnLCAnJyksIDEwKSAtIDE7XG5cdFx0XHRcdGlmIChqID4gLTEgJiYgaiA8IHN1YnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goc3Vic1tqXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goY21kKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gd2hpbGUgKHMubGVuZ3RoID4gMCk7XG5cdFx0cmV0dXJuIHJldC5qb2luKCcnKTtcblx0fTtcblx0Y29uc3QgaXNTdHJpbmcgPSAoeCkgPT4ge1xuXHRcdHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZycgfHwgeCBpbnN0YW5jZW9mIFN0cmluZztcblx0fTtcblx0Y29uc3QgaXNOdW1iZXIgPSAoeCkgPT4ge1xuXHRcdHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgfHwgeCBpbnN0YW5jZW9mIE51bWJlcjtcblx0fTtcblx0Y29uc3QgaXNSZWdFeHAgPSAoeCkgPT4ge1xuXHRcdHJldHVybiB4IGluc3RhbmNlb2YgUmVnRXhwO1xuXHR9O1xuXHRjb25zdCBpc0FycmF5ID0gKHgpID0+IHtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheSh4KTtcblx0fTtcblx0Y29uc3QgaXNPYmplY3QgPSAoeCkgPT4ge1xuXHRcdHJldHVybiB4IGluc3RhbmNlb2YgT2JqZWN0O1xuXHR9O1xuXHRjb25zdCBpc0Z1bmN0aW9uID0gKHgpID0+IHtcblx0XHRyZXR1cm4gIWlzUmVnRXhwKHgpICYmICh0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCB4IGluc3RhbmNlb2YgRnVuY3Rpb24pO1xuXHR9O1xuXHRjb25zdCByZXBlYXRTdHJpbmcgPSAocywgbXVsdCkgPT4ge1xuXHRcdGxldCByZXQgPSAnJztcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG11bHQ7ICsraSkge1xuXHRcdFx0cmV0ICs9IHM7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IHplcm9GaWxsID0gKHMsIG1pbikgPT4ge1xuXHRcdG1pbiB8fD0gMjtcblx0XHRjb25zdCB0ID0gcy50b1N0cmluZygpO1xuXHRcdHJldHVybiByZXBlYXRTdHJpbmcoJzAnLCBtaW4gLSB0Lmxlbmd0aCkgKyB0O1xuXHR9O1xuXHRjb25zdCBtYXAgPSAoZiwgbykgPT4ge1xuXHRcdGlmIChpc0FycmF5KG8pKSB7XG5cdFx0XHRyZXR1cm4gbWFwX2FycmF5KGYsIG8pO1xuXHRcdH1cblx0XHRyZXR1cm4gbWFwX29iamVjdChmLCBvKTtcblx0fTtcblx0Y29uc3QgbWFwX2FycmF5ID0gKGYsIG8pID0+IHtcblx0XHRjb25zdCByZXQgPSBbXTtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbykge1xuXHRcdFx0cmV0LnB1c2goZihlbGVtZW50KSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IG1hcF9vYmplY3QgPSAoZiwgbykgPT4ge1xuXHRcdGNvbnN0IHJldCA9IHt9O1xuXHRcdGZvciAoY29uc3QgaSBpbiBvKSB7XG5cdFx0XHRpZiAoIU9iamVjdC5oYXNPd24obywgaSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRyZXRbb10gPSBmKG9baV0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRwZy5lc2NhcGVRdW90ZXNIVE1MID0gKHRleHQpID0+IHtcblx0XHRyZXR1cm4gdGV4dC5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXHR9O1xuXHRwZy51bmVzY2FwZVF1b3Rlc0hUTUwgPSAoaHRtbCkgPT4ge1xuXHRcdC8vIEZyb20ge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS83Mzk0Nzg3fVxuXHRcdC8vIFRoaXMgc2VlbXMgdG8gYmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5IG9uIGFsbCBtYWpvciBicm93c2VycyBub3csIHNvIHdlXG5cdFx0Ly8gZG9uJ3QgaGF2ZSB0byBtYWtlIG91ciBvd24gZnVuY3Rpb24uXG5cdFx0Y29uc3QgdHh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcblx0XHR0eHQuaW5uZXJIVE1MID0gaHRtbDtcblx0XHRyZXR1cm4gdHh0LnZhbHVlO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiB0b29scy5qc1xuXHQvLyBTVEFSVEZJTEU6IGRhYi5qc1xuXHQvLyBEYWItZml4aW5nIGNvZGVcblx0Ly9cblx0Y29uc3QgcmV0YXJnZXREYWIgPSAobmV3VGFyZ2V0LCBvbGRUYXJnZXQsIGZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lLCB0aXRsZVRvRWRpdCkgPT4ge1xuXHRcdGxvZyhgcmV0YXJnZXREYWI6IG5ld1RhcmdldD0ke25ld1RhcmdldH0gb2xkVGFyZ2V0PSR7b2xkVGFyZ2V0fWApO1xuXHRcdHJldHVybiBjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRuZXdUYXJnZXQsXG5cdFx0XHR0ZXh0OiBuZXdUYXJnZXQuc3BsaXQoJyAnKS5qb2luKCcmbmJzcDsnKSxcblx0XHRcdGhpbnQ6IHRwcmludGYoJ2Rpc2FtYmlnSGludCcsIFtuZXdUYXJnZXRdKSxcblx0XHRcdHN1bW1hcnk6IHNpbXBsZVByaW50ZihnZXRWYWx1ZU9mKCdwb3B1cEZpeERhYnNTdW1tYXJ5JyksIFtmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSwgbmV3VGFyZ2V0XSksXG5cdFx0XHRjbGlja0J1dHRvbjogZ2V0VmFsdWVPZigncG9wdXBEYWJzQXV0b0NsaWNrJyksXG5cdFx0XHRtaW5vcjogdHJ1ZSxcblx0XHRcdG9sZFRhcmdldCxcblx0XHRcdHdhdGNoOiBnZXRWYWx1ZU9mKCdwb3B1cFdhdGNoRGlzYW1iaWdnZWRQYWdlcycpLFxuXHRcdFx0dGl0bGU6IHRpdGxlVG9FZGl0LFxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBsaXN0TGlua3MgPSAod2lraXRleHQsIG9sZFRhcmdldCwgdGl0bGVUb0VkaXQpID0+IHtcblx0XHQvLyBtZWRpYXdpa2kgc3RyaXBzIHRyYWlsaW5nIHNwYWNlcywgc28gd2UgZG8gdGhlIHNhbWVcblx0XHQvLyB0ZXN0Y2FzZToge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93L2luZGV4LnBocD90aXRsZT1SYWRpYWwmb2xkaWQ9OTczNjU2MzN9XG5cdFx0Y29uc3QgcmVnID0gL1xcW1xcWyhbXnxdKj8pICooXFx8fF1dKS9naTtcblx0XHRsZXQgcmV0ID0gW107XG5cdFx0Y29uc3Qgc3BsaXR0ZWQgPSB3aWtpdGV4dC5zcGxpdChyZWcpO1xuXHRcdC8vIF5bYS16XSsgc2hvdWxkIG1hdGNoIGludGVyd2lraSBsaW5rcywgaG9wZWZ1bGx5IChjYXNlLWluc2Vuc2l0aXZlKVxuXHRcdC8vIGFuZCBeW2Etel0qIHNob3VsZCBtYXRjaCB0aG9zZSBhbmQgW1s6Q2F0ZWdvcnkuLi5dXSBzdHlsZSBsaW5rcyB0b29cblx0XHRjb25zdCBvbWl0UmVnZXggPSAvXlthLXpdKjp8XltTc11wZWNpYWw6fF5bSWldbWFnZXxeW0NjXWF0ZWdvcnkvO1xuXHRcdGNvbnN0IGZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lID0gb2xkVGFyZ2V0LnRvU3RyaW5nKCk7XG5cdFx0Y29uc3Qgd2lrUG9zID0gZ2V0VmFsdWVPZigncG9wdXBEYWJXaWt0aW9uYXJ5Jyk7XG5cdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdHRlZC5sZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0aWYgKHR5cGVvZiBzcGxpdHRlZFtpXSA9PT0gdHlwZW9mICdzdHJpbmcnICYmIHNwbGl0dGVkW2ldLmxlbmd0aCA+IDAgJiYgIW9taXRSZWdleC50ZXN0KHNwbGl0dGVkW2ldKSkge1xuXHRcdFx0XHRyZXQucHVzaChyZXRhcmdldERhYihzcGxpdHRlZFtpXSwgb2xkVGFyZ2V0LCBmcmllbmRseUN1cnJlbnRBcnRpY2xlTmFtZSwgdGl0bGVUb0VkaXQpKTtcblx0XHRcdH0gLyogaWYgKi9cblx0XHR9IC8qIGZvciBsb29wICovXG5cdFx0cmV0ID0gcm1EdXBlc0Zyb21Tb3J0ZWRMaXN0KHJldC5zb3J0KCkpO1xuXHRcdGlmICh3aWtQb3MpIHtcblx0XHRcdGNvbnN0IHdpa1RhcmdldCA9IGB3aWt0aW9uYXJ5OiR7ZnJpZW5kbHlDdXJyZW50QXJ0aWNsZU5hbWUucmVwbGFjZSgvXiguKylcXHMrXFwoW14pXStcXClcXHMqJC8sICckMScpfWA7XG5cdFx0XHRjb25zdCBtZXRoID0gd2lrUG9zLnRvTG93ZXJDYXNlKCkgPT09ICdmaXJzdCcgPyAndW5zaGlmdCcgOiAncHVzaCc7XG5cdFx0XHRyZXRbbWV0aF0ocmV0YXJnZXREYWIod2lrVGFyZ2V0LCBvbGRUYXJnZXQsIGZyaWVuZGx5Q3VycmVudEFydGljbGVOYW1lLCB0aXRsZVRvRWRpdCkpO1xuXHRcdH1cblx0XHRyZXQucHVzaChcblx0XHRcdGNoYW5nZUxpbmtUYXJnZXRMaW5rKHtcblx0XHRcdFx0bmV3VGFyZ2V0OiBudWxsLFxuXHRcdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygncmVtb3ZlIHRoaXMgbGluaycpLnNwbGl0KCcgJykuam9pbignJm5ic3A7JyksXG5cdFx0XHRcdGhpbnQ6IHBvcHVwU3RyaW5nKCdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgZGlzYW1iaWcgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZScpLFxuXHRcdFx0XHRjbGlja0J1dHRvbjogZ2V0VmFsdWVPZigncG9wdXBEYWJzQXV0b0NsaWNrJyksXG5cdFx0XHRcdG9sZFRhcmdldCxcblx0XHRcdFx0c3VtbWFyeTogc2ltcGxlUHJpbnRmKGdldFZhbHVlT2YoJ3BvcHVwUm1EYWJMaW5rU3VtbWFyeScpLCBbZnJpZW5kbHlDdXJyZW50QXJ0aWNsZU5hbWVdKSxcblx0XHRcdFx0d2F0Y2g6IGdldFZhbHVlT2YoJ3BvcHVwV2F0Y2hEaXNhbWJpZ2dlZFBhZ2VzJyksXG5cdFx0XHRcdHRpdGxlOiB0aXRsZVRvRWRpdCxcblx0XHRcdH0pXG5cdFx0KTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBybUR1cGVzRnJvbVNvcnRlZExpc3QgPSAobGlzdCkgPT4ge1xuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBsaXN0KSB7XG5cdFx0XHRpZiAocmV0Lmxlbmd0aCA9PT0gMCB8fCBlbGVtZW50ICE9PSByZXQuYXQoLTEpKSB7XG5cdFx0XHRcdHJldC5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBtYWtlRml4RGFiID0gKGRhdGEsIG5hdnBvcCkgPT4ge1xuXHRcdC8vIGdyYWIgdGl0bGUgZnJvbSBwYXJlbnQgcG9wdXAgaWYgdGhlcmUgaXMgb25lOyBkZWZhdWx0IGV4aXN0cyBpbiBjaGFuZ2VMaW5rVGFyZ2V0TGlua1xuXHRcdGNvbnN0IHRpdGxlVG9FZGl0ID0gbmF2cG9wLnBhcmVudFBvcHVwICYmIG5hdnBvcC5wYXJlbnRQb3B1cC5hcnRpY2xlLnRvU3RyaW5nKCk7XG5cdFx0Y29uc3QgbGlzdCA9IGxpc3RMaW5rcyhkYXRhLCBuYXZwb3Aub3JpZ2luYWxBcnRpY2xlLCB0aXRsZVRvRWRpdCk7XG5cdFx0aWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRsb2coJ2xpc3RMaW5rcyByZXR1cm5lZCBlbXB0eSBsaXN0Jyk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0bGV0IGh0bWwgPSBgPGhyPiR7cG9wdXBTdHJpbmcoJ0NsaWNrIHRvIGRpc2FtYmlndWF0ZSB0aGlzIGxpbmsgdG86Jyl9PGJyPmA7XG5cdFx0aHRtbCArPSBsaXN0LmpvaW4oJywgJyk7XG5cdFx0cmV0dXJuIGh0bWw7XG5cdH07XG5cdGNvbnN0IG1ha2VGaXhEYWJzID0gKHdpa2lUZXh0LCBuYXZwb3ApID0+IHtcblx0XHRpZiAoXG5cdFx0XHRnZXRWYWx1ZU9mKCdwb3B1cEZpeERhYnMnKSAmJlxuXHRcdFx0aXNEaXNhbWJpZyh3aWtpVGV4dCwgbmF2cG9wLmFydGljbGUpICYmXG5cdFx0XHRUaXRsZS5mcm9tVVJMKGxvY2F0aW9uLmhyZWYpLm5hbWVzcGFjZUlkKCkgIT09IHBnLm5zU3BlY2lhbElkICYmXG5cdFx0XHRuYXZwb3AuYXJ0aWNsZS50YWxrUGFnZSgpXG5cdFx0KSB7XG5cdFx0XHRzZXRQb3B1cEhUTUwobWFrZUZpeERhYih3aWtpVGV4dCwgbmF2cG9wKSwgJ3BvcHVwRml4RGFiJywgbmF2cG9wLmlkTnVtYmVyKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHBvcHVwUmVkbGlua0hUTUwgPSAoYXJ0aWNsZSkgPT4ge1xuXHRcdHJldHVybiBjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRuZXdUYXJnZXQ6IG51bGwsXG5cdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygncmVtb3ZlIHRoaXMgbGluaycpLnNwbGl0KCcgJykuam9pbignJm5ic3A7JyksXG5cdFx0XHRoaW50OiBwb3B1cFN0cmluZygncmVtb3ZlIGFsbCBsaW5rcyB0byB0aGlzIHBhZ2UgZnJvbSB0aGlzIGFydGljbGUnKSxcblx0XHRcdGNsaWNrQnV0dG9uOiBnZXRWYWx1ZU9mKCdwb3B1cFJlZGxpbmtBdXRvQ2xpY2snKSxcblx0XHRcdG9sZFRhcmdldDogYXJ0aWNsZS50b1N0cmluZygpLFxuXHRcdFx0c3VtbWFyeTogc2ltcGxlUHJpbnRmKGdldFZhbHVlT2YoJ3BvcHVwUmVkbGlua1N1bW1hcnknKSwgW2FydGljbGUudG9TdHJpbmcoKV0pLFxuXHRcdH0pO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBkYWIuanNcblx0Ly8gU1RBUlRGSUxFOiBodG1sb3V0cHV0LmpzXG5cdC8vIHRoaXMgaGFzIHRvIHVzZSBhIHRpbWVyIGxvb3AgYXMgd2UgZG9uJ3Qga25vdyBpZiB0aGUgRE9NIGVsZW1lbnQgZXhpc3RzIHdoZW4gd2Ugd2FudCB0byBzZXQgdGhlIHRleHRcblx0Y29uc3Qgc2V0UG9wdXBIVE1MID0gZnVuY3Rpb24gc2V0UG9wdXBIVE1MKHN0ciwgZWxlbWVudElkLCBwb3B1cElkLCBvblN1Y2Nlc3MsIGFwcGVuZCkge1xuXHRcdGlmIChwb3B1cElkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIGNvbnNvbGUuZXJyb3IoJ1tQb3B1cHNdIHBvcHVwSWQgaXMgbm90IGRlZmluZWQgaW4gc2V0UG9wdXBIVE1MLCBodG1sPScrc3RyLnN1YnN0cmluZygwLDEwMCkpO1xuXHRcdFx0cG9wdXBJZCA9IHBnLmlkTnVtYmVyO1xuXHRcdH1cblx0XHRjb25zdCBwb3B1cEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtlbGVtZW50SWR9JHtwb3B1cElkfWApO1xuXHRcdGlmIChwb3B1cEVsZW1lbnQpIHtcblx0XHRcdGlmICghYXBwZW5kKSB7XG5cdFx0XHRcdHBvcHVwRWxlbWVudC5pbm5lckhUTUwgPSAnJztcblx0XHRcdH1cblx0XHRcdGlmIChpc1N0cmluZyhzdHIpKSB7XG5cdFx0XHRcdHBvcHVwRWxlbWVudC5pbm5lckhUTUwgKz0gc3RyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cG9wdXBFbGVtZW50LmFwcGVuZChzdHIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9uU3VjY2Vzcykge1xuXHRcdFx0XHRvblN1Y2Nlc3MoKTtcblx0XHRcdH1cblx0XHRcdHNldFRpbWVvdXQoY2hlY2tQb3B1cFBvc2l0aW9uLCAxMDApO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdC8vIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiBpbiBhIGxpdHRsZSB3aGlsZS4uLlxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0c2V0UG9wdXBIVE1MKHN0ciwgZWxlbWVudElkLCBwb3B1cElkLCBvblN1Y2Nlc3MpO1xuXHRcdH0sIDYwMCk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG5cdGNvbnN0IHNldFBvcHVwVHJhaWxlciA9IChzdHIsIGlkKSA9PiB7XG5cdFx0cmV0dXJuIHNldFBvcHVwSFRNTChzdHIsICdwb3B1cERhdGEnLCBpZCk7XG5cdH07XG5cdC8vIGFyZ3MubmF2cG9wdXAgaXMgbWFuZGF0b3J5XG5cdC8vIG9wdGlvbmFsOiBhcmdzLnJlZGlyLCBhcmdzLnJlZGlyVGFyZ2V0XG5cdC8vIEZJWE1FOiB5ZSBnb2RzLCB0aGlzIGlzIHVnbHkgc3R1ZmZcblx0Y29uc3QgZmlsbEVtcHR5U3BhbnMgPSAoYXJncykgPT4ge1xuXHRcdC8vIGlmIHJlZGlyIGlzIHByZXNlbnQgYW5kIHRydWUgdGhlbiByZWRpclRhcmdldCBpcyBtYW5kYXRvcnlcblx0XHRsZXQgcmVkaXIgPSB0cnVlO1xuXHRcdGxldCByY2lkO1xuXHRcdGlmICh0eXBlb2YgYXJncyAhPT0gJ29iamVjdCcgfHwgYXJncy5yZWRpciA9PT0gdW5kZWZpbmVkIHx8ICFhcmdzLnJlZGlyKSB7XG5cdFx0XHRyZWRpciA9IGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBhID0gYXJncy5uYXZwb3B1cC5wYXJlbnRBbmNob3I7XG5cdFx0bGV0IGFydGljbGU7XG5cdFx0bGV0IGhpbnQ7XG5cdFx0bGV0IG9sZGlkO1xuXHRcdGxldCBwYXJhbXMgPSB7fTtcblx0XHRpZiAocmVkaXIgJiYgdHlwZW9mIGFyZ3MucmVkaXJUYXJnZXQgPT09IHR5cGVvZiB7fSkge1xuXHRcdFx0YXJ0aWNsZSA9IGFyZ3MucmVkaXJUYXJnZXQ7XG5cdFx0XHQvLyBoaW50PWFydGljbGUuaGludFZhbHVlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFydGljbGUgPSBuZXcgVGl0bGUoKS5mcm9tQW5jaG9yKGEpO1xuXHRcdFx0aGludCA9IGEub3JpZ2luYWxUaXRsZSB8fCBhcnRpY2xlLmhpbnRWYWx1ZSgpO1xuXHRcdFx0cGFyYW1zID0gcGFyc2VQYXJhbXMoYS5ocmVmKTtcblx0XHRcdG9sZGlkID0gZ2V0VmFsdWVPZigncG9wdXBIaXN0b3JpY2FsTGlua3MnKSA/IHBhcmFtcy5vbGRpZCA6IG51bGw7XG5cdFx0XHQoe3JjaWR9ID0gcGFyYW1zKTtcblx0XHR9XG5cdFx0Y29uc3QgeCA9IHtcblx0XHRcdGFydGljbGUsXG5cdFx0XHRoaW50LFxuXHRcdFx0b2xkaWQsXG5cdFx0XHRyY2lkLFxuXHRcdFx0bmF2cG9wOiBhcmdzLm5hdnBvcHVwLFxuXHRcdFx0cGFyYW1zLFxuXHRcdH07XG5cdFx0Y29uc3Qgc3RydWN0dXJlID0gcGcuc3RydWN0dXJlc1tnZXRWYWx1ZU9mKCdwb3B1cFN0cnVjdHVyZScpXTtcblx0XHRpZiAodHlwZW9mIHN0cnVjdHVyZSAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHNldFBvcHVwSFRNTChcblx0XHRcdFx0J3BvcHVwRXJyb3InLFxuXHRcdFx0XHRgVW5rbm93biBzdHJ1Y3R1cmUgKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbik6ICR7cGcub3B0aW9uLnBvcHVwU3RydWN0dXJlfWAsXG5cdFx0XHRcdGFyZ3MubmF2cG9wdXAuaWROdW1iZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHNwYW5zID0gZmxhdHRlbihwZy5taXNjLmxheW91dCk7XG5cdFx0Y29uc3QgbnVtc3BhbnMgPSBzcGFucy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVkaXJzID0gcGcubWlzYy5yZWRpclNwYW5zO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbnVtc3BhbnM7ICsraSkge1xuXHRcdFx0Y29uc3QgZm91bmQgPSByZWRpcnMgJiYgcmVkaXJzLmluY2x1ZGVzKHNwYW5zW2ldKTtcblx0XHRcdC8vIGxvZygncmVkaXI9JyArIHJlZGlyICsgJywgZm91bmQ9JyArIGZvdW5kICsgJywgc3BhbnNbaV09JyArIHNwYW5zW2ldKTtcblx0XHRcdGlmICgoZm91bmQgJiYgIXJlZGlyKSB8fCAoIWZvdW5kICYmIHJlZGlyKSkge1xuXHRcdFx0XHQvLyBsb2coJ3NraXBwaW5nIHRoaXMgc2V0IG9mIHRoZSBsb29wJyk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc3RydWN0dXJlZm4gPSBzdHJ1Y3R1cmVbc3BhbnNbaV1dO1xuXHRcdFx0aWYgKHN0cnVjdHVyZWZuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gbm90aGluZyB0byBkbyBmb3IgdGhpcyBzdHJ1Y3R1cmUgcGFydFxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGxldCBzZXRmbiA9IHNldFBvcHVwSFRNTDtcblx0XHRcdGlmIChcblx0XHRcdFx0Z2V0VmFsdWVPZigncG9wdXBBY3RpdmVOYXZsaW5rcycpICYmXG5cdFx0XHRcdChzcGFuc1tpXS5pbmRleE9mKCdwb3B1cFRvcExpbmtzJykgPT09IDAgfHwgc3BhbnNbaV0uaW5kZXhPZigncG9wdXBSZWRpclRvcExpbmtzJykgPT09IDApXG5cdFx0XHQpIHtcblx0XHRcdFx0c2V0Zm4gPSBzZXRQb3B1cFRpcHNBbmRIVE1MO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoICh0eXBlb2Ygc3RydWN0dXJlZm4pIHtcblx0XHRcdFx0Y2FzZSAnZnVuY3Rpb24nOlxuXHRcdFx0XHRcdGxvZyhgcnVubmluZyAke3NwYW5zW2ldfSh7XG5cdFx0XHRcdFx0XHRhcnRpY2xlOiR7eC5hcnRpY2xlfSwgaGludDoke3guaGludH0sIG9sZGlkOiAke3gub2xkaWR9fSlgKTtcblx0XHRcdFx0XHRzZXRmbihzdHJ1Y3R1cmVmbih4KSwgc3BhbnNbaV0sIGFyZ3MubmF2cG9wdXAuaWROdW1iZXIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdFx0XHRcdHNldGZuKHN0cnVjdHVyZWZuLCBzcGFuc1tpXSwgYXJncy5uYXZwb3B1cC5pZE51bWJlcik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0ZXJybG9nKGB1bmtub3duIHRoaW5nIHdpdGggbGFiZWwgJHtzcGFuc1tpXX0gKHNwYW4gaW5kZXggd2FzICR7aX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyBmbGF0dGVuIGFuIGFycmF5XG5cdGNvbnN0IGZsYXR0ZW4gPSBmdW5jdGlvbiBmbGF0dGVuKGxpc3QsIHN0YXJ0KSB7XG5cdFx0Y29uc3QgcmV0ID0gW107XG5cdFx0aWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHN0YXJ0ID0gMDtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKHR5cGVvZiBsaXN0W2ldID09PSB0eXBlb2YgW10pIHtcblx0XHRcdFx0cmV0dXJuIFsuLi5yZXQsIC4uLmZsYXR0ZW4obGlzdFtpXSksIC4uLmZsYXR0ZW4obGlzdCwgaSArIDEpXTtcblx0XHRcdH1cblx0XHRcdHJldC5wdXNoKGxpc3RbaV0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHQvLyBHZW5lcmF0ZSBodG1sIGZvciB3aG9sZSBwb3B1cFxuXHRjb25zdCBwb3B1cEhUTUwgPSBmdW5jdGlvbiBwb3B1cEhUTUwoYSkge1xuXHRcdGdldFZhbHVlT2YoJ3BvcHVwU3RydWN0dXJlJyk7XG5cdFx0Y29uc3Qgc3RydWN0dXJlID0gcGcuc3RydWN0dXJlc1twZy5vcHRpb24ucG9wdXBTdHJ1Y3R1cmVdO1xuXHRcdGlmICh0eXBlb2Ygc3RydWN0dXJlICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0Ly8gcmV0dXJuICdVbmtub3duIHN0cnVjdHVyZTogJytwZy5vcHRpb24ucG9wdXBTdHJ1Y3R1cmU7XG5cdFx0XHQvLyBvdmVycmlkZSB1c2VyIGNob2ljZVxuXHRcdFx0cGcub3B0aW9uLnBvcHVwU3RydWN0dXJlID0gcGcub3B0aW9uRGVmYXVsdC5wb3B1cFN0cnVjdHVyZTtcblx0XHRcdHJldHVybiBwb3B1cEhUTUwoYSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2Ygc3RydWN0dXJlLnBvcHVwTGF5b3V0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRyZXR1cm4gJ0JhZCBsYXlvdXQnO1xuXHRcdH1cblx0XHRwZy5taXNjLmxheW91dCA9IHN0cnVjdHVyZS5wb3B1cExheW91dCgpO1xuXHRcdHBnLm1pc2MucmVkaXJTcGFucyA9IHR5cGVvZiBzdHJ1Y3R1cmUucG9wdXBSZWRpclNwYW5zID09PSAnZnVuY3Rpb24nID8gc3RydWN0dXJlLnBvcHVwUmVkaXJTcGFucygpIDogW107XG5cdFx0cmV0dXJuIG1ha2VFbXB0eVNwYW5zKHBnLm1pc2MubGF5b3V0LCBhLm5hdnBvcHVwKTtcblx0fTtcblx0Y29uc3QgbWFrZUVtcHR5U3BhbnMgPSBmdW5jdGlvbiBtYWtlRW1wdHlTcGFucyhsaXN0LCBuYXZwb3ApIHtcblx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdGlmICh0eXBlb2YgZWxlbWVudCA9PT0gdHlwZW9mICcnKSB7XG5cdFx0XHRcdHJldCArPSBlbXB0eVNwYW5IVE1MKGVsZW1lbnQsIG5hdnBvcC5pZE51bWJlciwgJ2RpdicpO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gdHlwZW9mIFtdICYmIGVsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXQgPSByZXQuc3BsaXQoLyg8XFwvW14+XSo/PiQpLykuam9pbihtYWtlRW1wdHlTcGFucyhlbGVtZW50LCBuYXZwb3ApKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09IHR5cGVvZiB7fSAmJiBlbGVtZW50Lm5vZGVUeXBlKSB7XG5cdFx0XHRcdHJldCArPSBlbXB0eVNwYW5IVE1MKGVsZW1lbnQubmFtZSwgbmF2cG9wLmlkTnVtYmVyLCBlbGVtZW50Lm5vZGVUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgZW1wdHlTcGFuSFRNTCA9IGZ1bmN0aW9uIGVtcHR5U3BhbkhUTUwobmFtZSwgaWQsIHRhZywgY2xhc3NuYW1lKSB7XG5cdFx0dGFnIHx8PSAnc3Bhbic7XG5cdFx0aWYgKCFjbGFzc25hbWUpIHtcblx0XHRcdGNsYXNzbmFtZSA9IGVtcHR5U3BhbkhUTUwuY2xhc3NBbGlhc2VzW25hbWVdO1xuXHRcdH1cblx0XHRjbGFzc25hbWUgfHw9IG5hbWU7XG5cdFx0aWYgKG5hbWUgPT09IGdldFZhbHVlT2YoJ3BvcHVwRHJhZ0hhbmRsZScpKSB7XG5cdFx0XHRjbGFzc25hbWUgKz0gJyBwb3B1cERyYWdIYW5kbGUnO1xuXHRcdH1cblx0XHRyZXR1cm4gc2ltcGxlUHJpbnRmKCc8JXMgaWQ9XCIlc1wiIGNsYXNzPVwiJXNcIj48LyVzPicsIFt0YWcsIG5hbWUgKyBpZCwgY2xhc3NuYW1lLCB0YWddKTtcblx0fTtcblx0ZW1wdHlTcGFuSFRNTC5jbGFzc0FsaWFzZXMgPSB7XG5cdFx0cG9wdXBTZWNvbmRQcmV2aWV3OiAncG9wdXBQcmV2aWV3Jyxcblx0fTtcblx0Ly8gZ2VuZXJhdGUgaHRtbCBmb3IgcG9wdXAgaW1hZ2Vcblx0Ly8gPGEgaWQ9XCJwb3B1cEltYWdlTGlua25cIj48aW1nIGlkPVwicG9wdXBJbWFnZW5cIj5cblx0Ly8gd2hlcmUgbj1pZE51bWJlclxuXHRjb25zdCBpbWFnZUhUTUwgPSAoX2FydGljbGUsIGlkTnVtYmVyKSA9PiB7XG5cdFx0cmV0dXJuIHNpbXBsZVByaW50Zihcblx0XHRcdCc8YSBpZD1cInBvcHVwSW1hZ2VMaW5rJDFcIj4nICtcblx0XHRcdFx0JzxpbWcgYWxpZ249XCJyaWdodFwiIHZhbGlnbj1cInRvcFwiIGlkPVwicG9wdXBJbWckMVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PC9pbWc+JyArXG5cdFx0XHRcdCc8L2E+Jyxcblx0XHRcdFtpZE51bWJlcl1cblx0XHQpO1xuXHR9O1xuXHRjb25zdCBwb3BUaXBzU29vbkZuID0gKGlkLCB3aGVuLCBwb3BEYXRhKSA9PiB7XG5cdFx0aWYgKCF3aGVuKSB7XG5cdFx0XHR3aGVuID0gMjUwO1xuXHRcdH1cblx0XHRjb25zdCBwb3BUaXBzID0gKCkgPT4ge1xuXHRcdFx0c2V0dXBUb29sdGlwcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKSwgZmFsc2UsIHRydWUsIHBvcERhdGEpO1xuXHRcdH07XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHNldFRpbWVvdXQocG9wVGlwcywgd2hlbiwgcG9wRGF0YSk7XG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc2V0UG9wdXBUaXBzQW5kSFRNTCA9IChodG1sLCBkaXZuYW1lLCBpZG51bWJlciwgcG9wRGF0YSkgPT4ge1xuXHRcdHNldFBvcHVwSFRNTChcblx0XHRcdGh0bWwsXG5cdFx0XHRkaXZuYW1lLFxuXHRcdFx0aWRudW1iZXIsXG5cdFx0XHRnZXRWYWx1ZU9mKCdwb3B1cFN1YnBvcHVwcycpID8gcG9wVGlwc1Nvb25GbihkaXZuYW1lICsgaWRudW1iZXIsIG51bGwsIHBvcERhdGEpIDogbnVsbFxuXHRcdCk7XG5cdH07XG5cdC8vIEVOREZJTEU6IGh0bWxvdXRwdXQuanNcblx0Ly8gU1RBUlRGSUxFOiBtb3VzZW91dC5qc1xuXHQvLyBmdXp6eSBjaGVja3Ncblx0Y29uc3QgZnV6enlDdXJzb3JPZmZNZW51cyA9IChfeCwgX3ksIF9mdXp6LCBwYXJlbnQpID0+IHtcblx0XHRpZiAoIXBhcmVudCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IHVscyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCd1bCcpO1xuXHRcdGZvciAoY29uc3QgdWwgb2YgdWxzKSB7XG5cdFx0XHRpZiAodWwuY2xhc3NOYW1lID09PSAncG9wdXBfbWVudScgJiYgdWwub2Zmc2V0V2lkdGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0gLy8gZWxzZSB7IGRvY3VtZW50LnRpdGxlKz0nLic7IH1cblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IGNoZWNrUG9wdXBQb3NpdGlvbiA9ICgpID0+IHtcblx0XHQvLyBzdG9wIHRoZSBwb3B1cCBydW5uaW5nIG9mZiB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlblxuXHRcdC8vIEZJWE1FIGF2b2lkIHBnLmN1cnJlbnQubGlua1xuXHRcdGlmIChwZy5jdXJyZW50LmxpbmsgJiYgcGcuY3VycmVudC5saW5rLm5hdnBvcHVwKSB7XG5cdFx0XHRwZy5jdXJyZW50LmxpbmsubmF2cG9wdXAubGltaXRIb3Jpem9udGFsUG9zaXRpb24oKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IG1vdXNlT3V0V2lraUxpbmsgPSBmdW5jdGlvbiBtb3VzZU91dFdpa2lMaW5rKCkge1xuXHRcdC8vIGNvbnNvbGUgKCdtb3VzZU91dFdpa2lMaW5rJyk7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0cmVtb3ZlTW9kaWZpZXJLZXlMaXN0ZW5lcihzZWxmKTtcblx0XHRpZiAoc2VsZi5uYXZwb3B1cCA9PT0gbnVsbCB8fCBzZWxmLm5hdnBvcHVwID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKCFzZWxmLm5hdnBvcHVwLmlzVmlzaWJsZSgpKSB7XG5cdFx0XHRzZWxmLm5hdnBvcHVwLmJhbmlzaCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyZXN0b3JlVGl0bGUoc2VsZik7XG5cdFx0TmF2cG9wdXAudHJhY2tlci5hZGRIb29rKHBvc0NoZWNrZXJIb29rKHNlbGYubmF2cG9wdXApKTtcblx0fTtcblx0Y29uc3QgcG9zQ2hlY2tlckhvb2sgPSAobmF2cG9wKSA9PiB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGlmICghbmF2cG9wLmlzVmlzaWJsZSgpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlOyAvKiByZW1vdmUgdGhpcyBob29rICovXG5cdFx0XHR9XG5cdFx0XHRpZiAoTmF2cG9wdXAudHJhY2tlci5kaXJ0eSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB7eH0gPSBOYXZwb3B1cC50cmFja2VyO1xuXHRcdFx0Y29uc3Qge3l9ID0gTmF2cG9wdXAudHJhY2tlcjtcblx0XHRcdGNvbnN0IG1vdXNlT3Zlck5hdnBvcCA9XG5cdFx0XHRcdG5hdnBvcC5pc1dpdGhpbih4LCB5LCBuYXZwb3AuZnV6eiwgbmF2cG9wLm1haW5EaXYpIHx8XG5cdFx0XHRcdCFmdXp6eUN1cnNvck9mZk1lbnVzKHgsIHksIG5hdnBvcC5mdXp6LCBuYXZwb3AubWFpbkRpdik7XG5cdFx0XHQvLyBGSVhNRSBpdCdkIGJlIHByZXR0aWVyIHRvIGRvIHRoaXMgaW50ZXJuYWwgdG8gdGhlIE5hdnBvcHVwIG9iamVjdHNcblx0XHRcdGxldCB0ID0gZ2V0VmFsdWVPZigncG9wdXBIaWRlRGVsYXknKTtcblx0XHRcdGlmICh0KSB7XG5cdFx0XHRcdHQgKj0gMTAwMDtcblx0XHRcdH1cblx0XHRcdGlmICghdCkge1xuXHRcdFx0XHRpZiAoIW1vdXNlT3Zlck5hdnBvcCkge1xuXHRcdFx0XHRcdGlmIChuYXZwb3AucGFyZW50QW5jaG9yKSB7XG5cdFx0XHRcdFx0XHRyZXN0b3JlVGl0bGUobmF2cG9wLnBhcmVudEFuY2hvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5hdnBvcC5iYW5pc2goKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLyogcmVtb3ZlIHRoaXMgaG9vayAqL1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdC8vIHdlIGhhdmUgYSBoaWRlIGRlbGF5IHNldFxuXHRcdFx0Y29uc3QgZCA9IERhdGUubm93KCk7XG5cdFx0XHRpZiAoIW5hdnBvcC5tb3VzZUxlYXZpbmdUaW1lKSB7XG5cdFx0XHRcdG5hdnBvcC5tb3VzZUxlYXZpbmdUaW1lID0gZDtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1vdXNlT3Zlck5hdnBvcCkge1xuXHRcdFx0XHRuYXZwb3AubW91c2VMZWF2aW5nVGltZSA9IG51bGw7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChkIC0gbmF2cG9wLm1vdXNlTGVhdmluZ1RpbWUgPiB0KSB7XG5cdFx0XHRcdG5hdnBvcC5tb3VzZUxlYXZpbmdUaW1lID0gbnVsbDtcblx0XHRcdFx0bmF2cG9wLmJhbmlzaCgpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLyogcmVtb3ZlIHRoaXMgaG9vayAqL1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IHJ1blN0b3BQb3B1cFRpbWVyID0gKG5hdnBvcCkgPT4ge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBoYXZlIGxlZnQgdGhlIGxpbmsgYnV0IHJlbWFpbiB3aXRoaW4gdGhlIHBvcHVwXG5cdFx0Ly8gc28gd2UgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluIHVudGlsIHdlIGxlYXZlIHRoZSBwb3B1cC5cblx0XHRpZiAoIW5hdnBvcC5zdG9wUG9wdXBUaW1lcikge1xuXHRcdFx0bmF2cG9wLnN0b3BQb3B1cFRpbWVyID0gc2V0SW50ZXJ2YWwocG9zQ2hlY2tlckhvb2sobmF2cG9wKSwgNTAwKTtcblx0XHRcdG5hdnBvcC5hZGRIb29rKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbChuYXZwb3Auc3RvcFBvcHVwVGltZXIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaGlkZScsXG5cdFx0XHRcdCdiZWZvcmUnXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0Ly8gRU5ERklMRTogbW91c2VvdXQuanNcblx0Ly8gU1RBUlRGSUxFOiBwcmV2aWV3bWFrZXIuanNcblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogRGVmaW5lcyB0aGUge0Bzb3VyY2UgUHJldmlld21ha2VyfSBvYmplY3QsIHdoaWNoIGdlbmVyYXRlcyBzaG9ydCBwcmV2aWV3cyBmcm9tIHdpa2kgbWFya3VwLlxuXHQgKi9cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgUHJldmlld21ha2VyXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAY2xhc3MgVGhlIFByZXZpZXdtYWtlciBjbGFzcy4gVXNlIGFuIGluc3RhbmNlIG9mIHRoaXMgdG8gZ2VuZXJhdGUgc2hvcnQgcHJldmlld3MgZnJvbSBXaWtpdGV4dC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHdpa2lUZXh0IFRoZSBXaWtpdGV4dCBzb3VyY2Ugb2YgdGhlIHBhZ2Ugd2Ugd2lzaCB0byBwcmV2aWV3LlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVybCBUaGUgdXJsIHdlIHNob3VsZCBwcmVwZW5kIHdoZW4gY3JlYXRpbmcgcmVsYXRpdmUgdXJscy5cblx0ICogQHBhcmFtIHtOYXZwb3B1cH0gb3duZXIgVGhlIG5hdnBvcCBhc3NvY2lhdGVkIHRvIHRoaXMgcHJldmlldyBnZW5lcmF0b3Jcblx0ICovXG5cdGNsYXNzIFByZXZpZXdtYWtlciB7XG5cdFx0Y29uc3RydWN0b3Iod2lraVRleHQsIGJhc2VVcmwsIG93bmVyKSB7XG5cdFx0XHQvKiogVGhlIHdpa2l0ZXh0IHdoaWNoIGlzIG1hbmlwdWxhdGVkIHRvIGdlbmVyYXRlIHRoZSBwcmV2aWV3LiAqL1xuXHRcdFx0dGhpcy5vcmlnaW5hbERhdGEgPSB3aWtpVGV4dDtcblx0XHRcdHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdFx0XHR0aGlzLm93bmVyID0gb3duZXI7XG5cdFx0XHR0aGlzLm1heENoYXJhY3RlcnMgPSBnZXRWYWx1ZU9mKCdwb3B1cE1heFByZXZpZXdDaGFyYWN0ZXJzJyk7XG5cdFx0XHR0aGlzLm1heFNlbnRlbmNlcyA9IGdldFZhbHVlT2YoJ3BvcHVwTWF4UHJldmlld1NlbnRlbmNlcycpO1xuXHRcdFx0dGhpcy5zZXREYXRhKCk7XG5cdFx0fVxuXHRcdHNldERhdGEoKSB7XG5cdFx0XHRjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoMWU0LCAyICogdGhpcy5tYXhDaGFyYWN0ZXJzKTtcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLnNsaWNlKDAsIE1hdGgubWF4KDAsIG1heFNpemUpKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUmVtb3ZlIEhUTUwgY29tbWVudHNcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbENvbW1lbnRzKCkge1xuXHRcdFx0Ly8gdGhpcyBhbHNvIGtpbGxzIG9uZSB0cmFpbGluZyBuZXdsaW5lLCBlZyBbW2RpYW15b11dXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXjwhLS1bXiRdKj8tLT5cXG58XFxuPCEtLVteJF0qPy0tPig/PVxcbil8PCEtLVteJF0qPy0tPi9nLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbERpdnMoKSB7XG5cdFx0XHQvLyBzYXkgZ29vZGJ5ZSwgZGl2cyAoY2FuIGJlIG5lc3RlZCwgc28gdXNlICogbm90ICo/KVxuXHRcdFx0dGhpcy5kYXRhID0gdGhpcy5kYXRhLnJlcGxhY2UoLzwgKmRpdltePl0qICo+W1xcU1xcc10qPzwgKlxcLyAqZGl2ICo+L2dpLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEdhbGxlcmllcygpIHtcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC88ICpnYWxsZXJ5W14+XSogKj5bXFxTXFxzXSo/PCAqXFwvICpnYWxsZXJ5ICo+L2dpLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcGVuaW5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGNsb3Npbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3Vib3BlbmluZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdWJjbG9zaW5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHJlcGxcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGwob3BlbmluZywgY2xvc2luZywgc3Vib3BlbmluZywgc3ViY2xvc2luZywgcmVwbCkge1xuXHRcdFx0bGV0IG9sZGsgPSB0aGlzLmRhdGE7XG5cdFx0XHRsZXQgayA9IFByZXZpZXdtYWtlci5raWxsU3R1ZmYodGhpcy5kYXRhLCBvcGVuaW5nLCBjbG9zaW5nLCBzdWJvcGVuaW5nLCBzdWJjbG9zaW5nLCByZXBsKTtcblx0XHRcdHdoaWxlIChrLmxlbmd0aCA8IG9sZGsubGVuZ3RoKSB7XG5cdFx0XHRcdG9sZGsgPSBrO1xuXHRcdFx0XHRrID0gUHJldmlld21ha2VyLmtpbGxTdHVmZihrLCBvcGVuaW5nLCBjbG9zaW5nLCBzdWJvcGVuaW5nLCBzdWJjbG9zaW5nLCByZXBsKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZGF0YSA9IGs7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSB0eHRcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3BlbmluZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBjbG9zaW5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN1Ym9wZW5pbmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3ViY2xvc2luZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSByZXBsXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMga2lsbFN0dWZmKHR4dCwgb3BlbmluZywgY2xvc2luZywgc3Vib3BlbmluZywgc3ViY2xvc2luZywgcmVwbCkge1xuXHRcdFx0Y29uc3Qgb3AgPSBQcmV2aWV3bWFrZXIubWFrZVJlZ2V4cChvcGVuaW5nKTtcblx0XHRcdGNvbnN0IGNsID0gUHJldmlld21ha2VyLm1ha2VSZWdleHAoY2xvc2luZywgJ14nKTtcblx0XHRcdGNvbnN0IHNiID0gc3Vib3BlbmluZyA/IFByZXZpZXdtYWtlci5tYWtlUmVnZXhwKHN1Ym9wZW5pbmcsICdeJykgOiBudWxsO1xuXHRcdFx0Y29uc3Qgc2MgPSBzdWJjbG9zaW5nID8gUHJldmlld21ha2VyLm1ha2VSZWdleHAoc3ViY2xvc2luZywgJ14nKSA6IGNsO1xuXHRcdFx0aWYgKCFvcCB8fCAhY2wpIHtcblx0XHRcdFx0bXcubm90aWZ5KCdOYXZpZ2F0aW9uIFBvcHVwcyBlcnJvcjogb3Agb3IgY2wgaXMgbnVsbCEgc29tZXRoaW5nIGlzIHdyb25nLicsIHtcblx0XHRcdFx0XHR0YWc6ICdwb3B1cHMnLFxuXHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9wLnRlc3QodHh0KSkge1xuXHRcdFx0XHRyZXR1cm4gdHh0O1xuXHRcdFx0fVxuXHRcdFx0bGV0IHJldCA9ICcnO1xuXHRcdFx0Y29uc3Qgb3BSZXN1bHQgPSBvcC5leGVjKHR4dCk7XG5cdFx0XHRyZXQgPSB0eHQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgb3BSZXN1bHQuaW5kZXgpKTtcblx0XHRcdHR4dCA9IHR4dC5zbGljZShNYXRoLm1heCgwLCBvcFJlc3VsdC5pbmRleCArIG9wUmVzdWx0WzBdLmxlbmd0aCkpO1xuXHRcdFx0bGV0IGRlcHRoID0gMTtcblx0XHRcdHdoaWxlICh0eHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsZXQgcmVtb3ZhbCA9IDA7XG5cdFx0XHRcdGlmIChkZXB0aCA9PT0gMSAmJiBjbC50ZXN0KHR4dCkpIHtcblx0XHRcdFx0XHRkZXB0aC0tO1xuXHRcdFx0XHRcdHJlbW92YWwgPSBjbC5leGVjKHR4dClbMF0ubGVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGRlcHRoID4gMSAmJiBzYy50ZXN0KHR4dCkpIHtcblx0XHRcdFx0XHRkZXB0aC0tO1xuXHRcdFx0XHRcdHJlbW92YWwgPSBzYy5leGVjKHR4dClbMF0ubGVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNiICYmIHNiLnRlc3QodHh0KSkge1xuXHRcdFx0XHRcdGRlcHRoKys7XG5cdFx0XHRcdFx0cmVtb3ZhbCA9IHNiLmV4ZWModHh0KVswXS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFyZW1vdmFsKSB7XG5cdFx0XHRcdFx0cmVtb3ZhbCA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0dHh0ID0gdHh0LnNsaWNlKE1hdGgubWF4KDAsIHJlbW92YWwpKTtcblx0XHRcdFx0aWYgKGRlcHRoID09PSAwKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQgKyAocmVwbCB8fCAnJykgKyB0eHQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0geFxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gcHJlZml4XG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8UmVnRXhwfSBzdWZmaXhcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHN0YXRpYyBtYWtlUmVnZXhwKHgsIHByZWZpeCwgc3VmZml4KSB7XG5cdFx0XHRwcmVmaXggfHw9ICcnO1xuXHRcdFx0c3VmZml4IHx8PSAnJztcblx0XHRcdGxldCByZVN0ciA9ICcnO1xuXHRcdFx0bGV0IGZsYWdzID0gJyc7XG5cdFx0XHRpZiAoaXNTdHJpbmcoeCkpIHtcblx0XHRcdFx0cmVTdHIgPSBwcmVmaXggKyBsaXRlcmFsaXplUmVnZXgoeCkgKyBzdWZmaXg7XG5cdFx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKHgpKSB7XG5cdFx0XHRcdGxldCBzID0geC50b1N0cmluZygpLnNsaWNlKDEpO1xuXHRcdFx0XHRjb25zdCBzcCA9IHMuc3BsaXQoJy8nKTtcblx0XHRcdFx0ZmxhZ3MgPSBzcC5hdCgtMSk7XG5cdFx0XHRcdHNwW3NwLmxlbmd0aCAtIDFdID0gJyc7XG5cdFx0XHRcdHMgPSBzcC5qb2luKCcvJyk7XG5cdFx0XHRcdHMgPSBzLnNsaWNlKDAsIE1hdGgubWF4KDAsIHMubGVuZ3RoIC0gMSkpO1xuXHRcdFx0XHRyZVN0ciA9IHByZWZpeCArIHMgKyBzdWZmaXg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsb2coJ21ha2VSZWdleHAgZmFpbGVkJyk7XG5cdFx0XHR9XG5cdFx0XHRsb2coYG1ha2VSZWdleHA6IGdvdCByZVN0cj0ke3JlU3RyfSwgZmxhZ3M9JHtmbGFnc31gKTtcblx0XHRcdHJldHVybiBuZXcgUmVnRXhwKHJlU3RyLCBmbGFncyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEJveFRlbXBsYXRlcygpIHtcblx0XHRcdC8vIHRheG9ib3ggcmVtb3ZhbC4uLiBpbiBmYWN0LCB0aGVyZSdzIGEgc2F1ZGlwcmluY2Vib3hfYmVnaW4sIHNvIGxldCdzIGJlIG1vcmUgZ2VuZXJhbFxuXHRcdFx0Ly8gYWxzbywgaGF2ZSBmbG9hdF9iZWdpbiwgLi4uIGZsb2F0X2VuZFxuXHRcdFx0dGhpcy5raWxsKC97e1teXFxze3x9XSo/KGZsb2F0fGJveClbIF9dKGJlZ2lufHN0YXJ0KS9pLCAvfX1cXHMqLywgJ3t7Jyk7XG5cdFx0XHQvLyBpbmZvYm94ZXMgZXRjXG5cdFx0XHQvLyBmcm9tIFp5eHc6IGtpbGwgZnJhbWVzIHRvb1xuXHRcdFx0dGhpcy5raWxsKC97e1teXFxze3x9XSo/KGluZm9ib3h8ZWxlbWVudGJveHxmcmFtZSlbIF9dL2ksIC99fVxccyovLCAne3snKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRraWxsVGVtcGxhdGVzKCkge1xuXHRcdFx0dGhpcy5raWxsKCd7eycsICd9fScsICd7JywgJ30nLCAnICcpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxUYWJsZXMoKSB7XG5cdFx0XHQvLyB0YWJsZXMgYXJlIGJhZCwgdG9vXG5cdFx0XHQvLyB0aGlzIGNhbiBiZSBzbG93LCBidXQgaXQncyBhbiBpbnByb3ZlbWVudCBvdmVyIGEgYnJvd3NlciBoYW5nXG5cdFx0XHQvLyB0b3J0dXJlIHRlc3Q6IFtbQ29tcGFyaXNvbl9vZl9JbnRlbF9DZW50cmFsX1Byb2Nlc3NpbmdfVW5pdHNdXVxuXHRcdFx0dGhpcy5raWxsKCd7fCcsIC9cXHx9XFxzKi8sICd7fCcpO1xuXHRcdFx0dGhpcy5raWxsKC88dGFibGUuKj8+L2ksIC88XFwvdGFibGUuKj8+L2ksIC88dGFibGUuKj8+L2kpO1xuXHRcdFx0Ly8gcmVtb3ZlIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBwaXBlIGZvciB0aGUgaGVsbCBvZiBpdCAoPylcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eXFx8LiokL2dtLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEltYWdlcygpIHtcblx0XHRcdGNvbnN0IGZvcmJpZGRlbk5hbWVzcGFjZUFsaWFzZXMgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgW2xvY2FsaXplZE5hbWVzcGFjZUxjLCBuYW1lc3BhY2VJZF0gb2YgT2JqZWN0LmVudHJpZXMobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKSkpIHtcblx0XHRcdFx0aWYgKG5hbWVzcGFjZUlkICE9PSBwZy5uc0ltYWdlSWQgJiYgbmFtZXNwYWNlSWQgIT09IHBnLm5zQ2F0ZWdvcnlJZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JiaWRkZW5OYW1lc3BhY2VBbGlhc2VzLnB1c2gobG9jYWxpemVkTmFtZXNwYWNlTGMuc3BsaXQoJyAnKS5qb2luKCdbIF9dJykpOyAvLyB0b2RvOiBlc2NhcGUgcmVnZXhwIGZyYWdtZW50cyFcblx0XHRcdH1cblx0XHRcdC8vIGltYWdlcyBhbmQgY2F0ZWdvcmllcyBhcmUgYSBub25vXG5cdFx0XHR0aGlzLmtpbGwobmV3IFJlZ0V4cChgW1tdW1tdXFxcXHMqKCR7Zm9yYmlkZGVuTmFtZXNwYWNlQWxpYXNlcy5qb2luKCd8Jyl9KVxcXFxzKjpgLCAnaScpLCAvXV1cXHMqLywgJ1snLCAnXScpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxIVE1MKCkge1xuXHRcdFx0Ly8ga2lsbCA8cmVmIC4uLj4uLi48L3JlZj5cblx0XHRcdHRoaXMua2lsbCgvPHJlZlxcYlteLz5dKj8+L2ksIC88XFwvcmVmPi9pKTtcblx0XHRcdC8vIGxldCdzIGFsc28gZGVsZXRlIGVudGlyZSBsaW5lcyBzdGFydGluZyB3aXRoIDwuIGl0J3Mgd29ydGggYSB0cnkuXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKF58XFxuKSAqPC4qL2csICdcXG4nKTtcblx0XHRcdC8vIGFuZCB0aG9zZSBwZXNreSBodG1sIHRhZ3MsIGJ1dCBub3Qgbm93aWtpIG9yIGJsb2NrcXVvdGUgdGFnc1xuXHRcdFx0Y29uc3Qgc3BsaXR0ZWQgPSB0aGlzLmRhdGEuc3BsaXQoLyg8W1xcV1xcd10qPyg/Oj58JHwoPz08KSkpLyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdHRlZC5sZW5ndGg7XG5cdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSArPSAyKSB7XG5cdFx0XHRcdHN3aXRjaCAoc3BsaXR0ZWRbaV0pIHtcblx0XHRcdFx0XHRjYXNlICc8bm8nLmNvbmNhdCgnd2lraScsICc+Jyk6XG5cdFx0XHRcdFx0Y2FzZSAnPC9ubycuY29uY2F0KCd3aWtpJywgJz4nKTpcblx0XHRcdFx0XHRjYXNlICc8YmxvY2snLmNvbmNhdCgncXVvdGUnLCAnPicpOlxuXHRcdFx0XHRcdGNhc2UgJzwvYmxvY2snLmNvbmNhdCgncXVvdGUnLCAnPicpOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHNwbGl0dGVkW2ldID0gJyc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuZGF0YSA9IHNwbGl0dGVkLmpvaW4oJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxDaHVua3MoKSB7XG5cdFx0XHQvLyBoZXVyaXN0aWNzIGFsZXJ0XG5cdFx0XHQvLyBjaHVua3Mgb2YgaXRhbGljIHRleHQ/IHlvdSBjcmF6eSwgbWFuP1xuXHRcdFx0Y29uc3QgaXRhbGljQ2h1bmtSZWdleCA9IC8oKF58XFxuKVxccyo6KlxccyonJ1teJ10oW14nXXwnJyd8J1teJ10pezIwfSgufFxcblteXFxuXSkqJydbXFxzIS4/XSpcXG4pKy9nO1xuXHRcdFx0Ly8ga2VlcCBzdHVmZiBzZXBhcmF0ZWQsIHRob3VnaCwgc28gc3RpY2sgaW4gXFxuIChmaXhlcyBbW1VuaW9uIEphY2tdXT9cblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKGl0YWxpY0NodW5rUmVnZXgsICdcXG4nKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRtb3B1cCgpIHtcblx0XHRcdC8vIHdlIHNpbXBseSAqY2FuJ3QqIGJlIGRvaW5nIHdpdGggaG9yaXpvbnRhbCBydWxlcyByaWdodCBub3dcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eLXs0LH0vZ20sICcnKTtcblx0XHRcdC8vIG5vIGluZGVudGVkIGxpbmVzXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKF58XFxuKSAqOlteXFxuXSovZywgJycpO1xuXHRcdFx0Ly8gcmVwbGFjZSBfX1RPQ19fLCBfX05PVE9DX18gYW5kIHdoYXRldmVyIGVsc2UgdGhlcmUgaXNcblx0XHRcdC8vIHRoaXMnbGwgcHJvYmFibHkgZG9cblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5yZXBsYWNlKC9eX19bX2Etel0qX18gKiQvZ2ltLCAnJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Zmlyc3RCaXQoKSB7XG5cdFx0XHQvLyBkb250J3QgYmUgZ2l2aW4nIG1lIG5vIHN1YnNlcXVlbnQgcGFyYWdyYXBocywgeW91IGhlYXIgbWU/XG5cdFx0XHQvLyAvIGZpcnN0IHdlIFwibm9ybWFsaXplXCIgc2VjdGlvbiBoZWFkaW5ncywgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhZnRlciwgYWRkaW5nIGJlZm9yZVxuXHRcdFx0bGV0IGQgPSB0aGlzLmRhdGE7XG5cdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3Q3V0SGVhZGluZ3MnKSkge1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXFxzKig9PStbXj1dKj09KylcXHMqL2csICdcXG5cXG4kMSAnKTtcblx0XHRcdFx0Ly8gLyB0aGVuIHdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBwYXJhZ3JhcGggYnJlYWtzIHdob3NlIHRleHQgZW5kcyBiYWRseVxuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvKFs6O10pICpcXG57Mix9L2csICckMVxcbicpO1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXlxccyovLCAnJyk7XG5cdFx0XHRcdGNvbnN0IHN0dWZmID0gL14oW15cXG5dfFxcblxcUykqLy5leGVjKHRoaXMuZGF0YSk7XG5cdFx0XHRcdGlmIChzdHVmZikge1xuXHRcdFx0XHRcdFtkXSA9IHN0dWZmO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBQcmV2aWV3Rmlyc3RQYXJPbmx5JykpIHtcblx0XHRcdFx0XHRkID0gdGhpcy5kYXRhO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIC8gbm93IHB1dCBcXG5cXG4gYWZ0ZXIgc2VjdGlvbnMgc28gdGhhdCBidWxsZXRzIGFuZCBudW1iZXJlZCBsaXN0cyB3b3JrXG5cdFx0XHRcdGQgPSBkLnJlcGxhY2UoLyg9PStbXj1dKj09KylcXHMqL2csICckMVxcblxcbicpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3BsaXQgc2VudGVuY2VzLiBTdXBlcmZsdW91cyBzZW50ZW5jZXMgYXJlIFJJR0hUIE9VVC5cblx0XHRcdC8vIG5vdGU6IGV4YWN0bHkgMSBzZXQgb2YgcGFyZW5zIGhlcmUgbmVlZGVkIHRvIG1ha2UgdGhlIHNsaWNlIHdvcmtcblx0XHRcdGQgPSBkLnNwbGl0KC8oWyEuP10rW1wiJ10qXFxzKS9nKTtcblx0XHRcdC8vIGxlYWRpbmcgc3BhY2UgaXMgYmFkLCBtbWtheT9cblx0XHRcdGRbMF0gPSBkWzBdLnJlcGxhY2UoL15cXHMqLywgJycpO1xuXHRcdFx0Y29uc3Qgbm90U2VudGVuY2VFbmRzID0gLyhbXi5dW2Etel1cXC4gKlthLXpdfGV0Y3xzaWN8ZHJ8bXJ8bXJzfG1zfHN0fG5vfG9wfGNpdHxcXFtbXlxcXV0qfFxcc1thLXpdKSQvaTtcblx0XHRcdGQgPSB0aGlzLmZpeFNlbnRlbmNlRW5kcyhkLCBub3RTZW50ZW5jZUVuZHMpO1xuXHRcdFx0dGhpcy5mdWxsTGVuZ3RoID0gZC5qb2luKCcnKS5sZW5ndGg7XG5cdFx0XHRsZXQgbiA9IHRoaXMubWF4U2VudGVuY2VzO1xuXHRcdFx0bGV0IGRkID0gUHJldmlld21ha2VyLmZpcnN0U2VudGVuY2VzKGQsIG4pO1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHRkZCA9IFByZXZpZXdtYWtlci5maXJzdFNlbnRlbmNlcyhkLCBuKTtcblx0XHRcdFx0LS1uO1xuXHRcdFx0fSB3aGlsZSAoZGQubGVuZ3RoID4gdGhpcy5tYXhDaGFyYWN0ZXJzICYmIG4gIT09IDApO1xuXHRcdFx0dGhpcy5kYXRhID0gZGQ7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJzXG5cdFx0ICogQHBhcmFtIHtSZWdFeHB9IHJlZ1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Zml4U2VudGVuY2VFbmRzKHN0cnMsIHJlZykge1xuXHRcdFx0Ly8gdGFrZSBhbiBhcnJheSBvZiBzdHJpbmdzLCBzdHJzXG5cdFx0XHQvLyBqb2luIHN0cnNbaV0gdG8gc3Ryc1tpKzFdICYgc3Ryc1tpKzJdIGlmIHN0cnNbaV0gbWF0Y2hlcyByZWdleCByZWdcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGggLSAyOyArK2kpIHtcblx0XHRcdFx0aWYgKHJlZy50ZXN0KHN0cnNbaV0pKSB7XG5cdFx0XHRcdFx0Y29uc3QgYSA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgc3Rycy5sZW5ndGg7ICsraikge1xuXHRcdFx0XHRcdFx0aWYgKGogPCBpKSB7XG5cdFx0XHRcdFx0XHRcdGFbal0gPSBzdHJzW2pdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGogPT09IGkpIHtcblx0XHRcdFx0XHRcdFx0YVtpXSA9IHN0cnNbaV0gKyBzdHJzW2kgKyAxXSArIHN0cnNbaSArIDJdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGogPiBpICsgMikge1xuXHRcdFx0XHRcdFx0XHRhW2ogLSAyXSA9IHN0cnNbal07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmZpeFNlbnRlbmNlRW5kcyhhLCByZWcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc3Rycztcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmdbXX0gc3Ryc1xuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBob3dtYW55XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMgZmlyc3RTZW50ZW5jZXMoc3RycywgaG93bWFueSkge1xuXHRcdFx0Y29uc3QgdCA9IHN0cnMuc2xpY2UoMCwgMiAqIGhvd21hbnkpO1xuXHRcdFx0cmV0dXJuIHQuam9pbignJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0a2lsbEJhZFdoaXRlc3BhY2UoKSB7XG5cdFx0XHQvLyBhbHNvIGNsZWFucyB1cCBpc29sYXRlZCAnJycnXG5cdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEucmVwbGFjZSgvXiAqJysgKiQvZ20sICcnKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUnVucyB0aGUgdmFyaW91cyBtZXRob2RzIHRvIGdlbmVyYXRlIHRoZSBwcmV2aWV3LlxuXHRcdCAqIFRoZSBwcmV2aWV3IGlzIHN0b3JlZCBpbiB0aGUgPGNvZGU+aHRtbDwvaHRtbD4gZmllbGQuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG1ha2VQcmV2aWV3KCkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLm93bmVyLmFydGljbGUubmFtZXNwYWNlSWQoKSAhPT0gcGcubnNUZW1wbGF0ZUlkICYmXG5cdFx0XHRcdHRoaXMub3duZXIuYXJ0aWNsZS5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc0ltYWdlSWRcblx0XHRcdCkge1xuXHRcdFx0XHR0aGlzLmtpbGxDb21tZW50cygpO1xuXHRcdFx0XHR0aGlzLmtpbGxEaXZzKCk7XG5cdFx0XHRcdHRoaXMua2lsbEdhbGxlcmllcygpO1xuXHRcdFx0XHR0aGlzLmtpbGxCb3hUZW1wbGF0ZXMoKTtcblx0XHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUHJldmlld0tpbGxUZW1wbGF0ZXMnKSkge1xuXHRcdFx0XHRcdHRoaXMua2lsbFRlbXBsYXRlcygpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMua2lsbE11bHRpbGluZVRlbXBsYXRlcygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMua2lsbFRhYmxlcygpO1xuXHRcdFx0XHR0aGlzLmtpbGxJbWFnZXMoKTtcblx0XHRcdFx0dGhpcy5raWxsSFRNTCgpO1xuXHRcdFx0XHR0aGlzLmtpbGxDaHVua3MoKTtcblx0XHRcdFx0dGhpcy5tb3B1cCgpO1xuXHRcdFx0XHR0aGlzLmZpcnN0Qml0KCk7XG5cdFx0XHRcdHRoaXMua2lsbEJhZFdoaXRlc3BhY2UoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMua2lsbEhUTUwoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaHRtbCA9IHdpa2kyaHRtbCh0aGlzLmRhdGEsIHRoaXMuYmFzZVVybCk7IC8vIG5lZWRzIGxpdmVwcmV2aWV3XG5cdFx0XHR0aGlzLmZpeEhUTUwoKTtcblx0XHRcdHRoaXMuc3RyaXBMb25nVGVtcGxhdGVzKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdGF0aWMgZXNXaWtpMkh0bWxQYXJ0KGRhdGEpIHtcblx0XHRcdGNvbnN0IHJlTGlua3MgPSAvKD86XFxbXFxbKFteXFxdfF0qKSg/OlxcfChbXlxcXXxdKikpKl1dKFthLXpdKikpL2dpOyAvLyBtYXRjaCBhIHdpa2lsaW5rXG5cdFx0XHRyZUxpbmtzLmxhc3RJbmRleCA9IDA7IC8vIHJlc2V0IHJlZ2V4XG5cdFx0XHRsZXQgbWF0Y2g7XG5cdFx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cdFx0XHRsZXQgcG9zdGZpeEluZGV4ID0gMDtcblx0XHRcdHdoaWxlICgobWF0Y2ggPSByZUxpbmtzLmV4ZWMoZGF0YSkpICE9PSBudWxsKSB7XG5cdFx0XHRcdC8vIG1hdGNoIGFsbCB3aWtpbGlua3Ncblx0XHRcdFx0Ly8gRklYTUU6IHRoZSB3YXkgdGhhdCBsaW5rIGlzIGJ1aWx0IGhlcmUgaXNuJ3QgcGVyZmVjdC4gSXQgaXMgY2xpY2thYmxlLCBidXQgcG9wdXBzIHByZXZpZXcgd29uJ3QgcmVjb2duaXplIGl0IGluIHNvbWUgY2FzZXMuXG5cdFx0XHRcdHJlc3VsdCArPSBgJHtwZy5lc2NhcGVRdW90ZXNIVE1MKGRhdGEuc3Vic3RyaW5nKHBvc3RmaXhJbmRleCwgbWF0Y2guaW5kZXgpKX08YSBocmVmPVwiJHtcblx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzXG5cdFx0XHRcdH0ke3BnLmVzY2FwZVF1b3Rlc0hUTUwobWF0Y2hbMV0pfVwiPiR7cGcuZXNjYXBlUXVvdGVzSFRNTCgobWF0Y2hbMl0gPz8gbWF0Y2hbMV0pICsgbWF0Y2hbM10pfTwvYT5gO1xuXHRcdFx0XHRwb3N0Zml4SW5kZXggPSByZUxpbmtzLmxhc3RJbmRleDtcblx0XHRcdH1cblx0XHRcdC8vIGFwcGVuZCB0aGUgcmVzdFxuXHRcdFx0cmVzdWx0ICs9IHBnLmVzY2FwZVF1b3Rlc0hUTUwoZGF0YS5zbGljZShNYXRoLm1heCgwLCBwb3N0Zml4SW5kZXgpKSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHRlZGl0U3VtbWFyeVByZXZpZXcoKSB7XG5cdFx0XHRjb25zdCByZUFlcyA9IC9cXC9cXCogKiguKj8pICpcXCpcXC8vZzsgLy8gbWF0Y2ggdGhlIGZpcnN0IHNlY3Rpb24gbWFya2VyXG5cdFx0XHRyZUFlcy5sYXN0SW5kZXggPSAwOyAvLyByZXNldCByZWdleFxuXHRcdFx0Y29uc3QgbWF0Y2ggPSByZUFlcy5leGVjKHRoaXMuZGF0YSk7XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0Ly8gd2UgaGF2ZSBhIHNlY3Rpb24gbGluay4gU3BsaXQgaXQsIHByb2Nlc3MgaXQsIGNvbWJpbmUgaXQuXG5cdFx0XHRcdGNvbnN0IHByZWZpeCA9IHRoaXMuZGF0YS5zbGljZSgwLCBNYXRoLm1heCgwLCBtYXRjaC5pbmRleCAtIDEpKTtcblx0XHRcdFx0Y29uc3QgWywgc2VjdGlvbl0gPSBtYXRjaDtcblx0XHRcdFx0Y29uc3QgcG9zdGZpeCA9IHRoaXMuZGF0YS5zbGljZShNYXRoLm1heCgwLCByZUFlcy5sYXN0SW5kZXgpKTtcblx0XHRcdFx0bGV0IHN0YXJ0ID0gXCI8c3BhbiBjbGFzcz0nYXV0b2NvbW1lbnQnPlwiO1xuXHRcdFx0XHRsZXQgZW5kID0gJzwvc3Bhbj4nO1xuXHRcdFx0XHRpZiAocHJlZml4Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRzdGFydCA9IGAke1ByZXZpZXdtYWtlci5lc1dpa2kySHRtbFBhcnQocHJlZml4KX0gJHtzdGFydH0tIGA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBvc3RmaXgubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGVuZCA9IGA6ICR7ZW5kfSR7UHJldmlld21ha2VyLmVzV2lraTJIdG1sUGFydChwb3N0Zml4KX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUoKS5mcm9tVVJMKHRoaXMuYmFzZVVybCk7XG5cdFx0XHRcdHQuYW5jaG9yRnJvbVV0ZihzZWN0aW9uKTtcblx0XHRcdFx0Y29uc3Qgc2VjdGlvbkxpbmsgPSBgJHtcblx0XHRcdFx0XHRJbnN0YS5jb25mLnBhdGhzLmFydGljbGVzICsgcGcuZXNjYXBlUXVvdGVzSFRNTCh0LnRvU3RyaW5nKHRydWUpKVxuXHRcdFx0XHR9IyR7cGcuZXNjYXBlUXVvdGVzSFRNTCh0LmFuY2hvcil9YDtcblx0XHRcdFx0cmV0dXJuIGAke3N0YXJ0fTxhIGhyZWY9XCIke3NlY3Rpb25MaW5rfVwiPiZyYXJyOzwvYT4gJHtwZy5lc2NhcGVRdW90ZXNIVE1MKHNlY3Rpb24pfSR7ZW5kfWA7XG5cdFx0XHR9XG5cdFx0XHQvLyBlbHNlIHRoZXJlJ3Mgbm8gc2VjdGlvbiBsaW5rLCBodG1saWZ5IHRoZSB3aG9sZSB0aGluZy5cblx0XHRcdHJldHVybiBQcmV2aWV3bWFrZXIuZXNXaWtpMkh0bWxQYXJ0KHRoaXMuZGF0YSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFdvcmtzIGFyb3VuZCBsaXZlcHJldmlldyBidWdzLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRmaXhIVE1MKCkge1xuXHRcdFx0aWYgKCF0aGlzLmh0bWwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHJldCA9IHRoaXMuaHRtbDtcblx0XHRcdC8vIGZpeCBxdWVzdGlvbiBtYXJrcyBpbiB3aWtpIGxpbmtzXG5cdFx0XHQvLyBtYXliZSB0aGlzJ2xsIGJyZWFrIHNvbWUgc3R1ZmYgOi0oXG5cdFx0XHRyZXQgPSByZXQucmVwbGFjZShuZXcgUmVnRXhwKGAoPGEgaHJlZj1cIiR7cGcud2lraS5hcnRpY2xlUGF0aH0vW15cIl0qKVs/XSguKj9cIilgLCAnZycpLCAnJDElM0YkMicpO1xuXHRcdFx0cmV0ID0gcmV0LnJlcGxhY2UobmV3IFJlZ0V4cChgKDxhIGhyZWY9JyR7cGcud2lraS5hcnRpY2xlUGF0aH0vW14nXSopWz9dKC4qPycpYCwgJ2cnKSwgJyQxJTNGJDInKTtcblx0XHRcdC8vIEZJWE1FIGZpeCB1cCAlIHRvb1xuXHRcdFx0dGhpcy5odG1sID0gcmV0O1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBHZW5lcmF0ZXMgdGhlIHByZXZpZXcgYW5kIGRpc3BsYXlzIGl0IGluIHRoZSBjdXJyZW50IHBvcHVwLlxuXHRcdCAqIERvZXMgbm90aGluZyBpZiB0aGUgZ2VuZXJhdGVkIHByZXZpZXcgaXMgaW52YWxpZCBvciBjb25zaXN0cyBvZiB3aGl0ZXNwYWNlIG9ubHkuXG5cdFx0ICogQWxzbyBhY3RpdmF0ZXMgd2lraWxpbmtzIGluIHRoZSBwcmV2aWV3IGZvciBzdWJwb3B1cHMgaWYgdGhlIHBvcHVwU3VicG9wdXBzIG9wdGlvbiBpcyB0cnVlLlxuXHRcdCAqL1xuXHRcdHNob3dQcmV2aWV3KCkge1xuXHRcdFx0dGhpcy5tYWtlUHJldmlldygpO1xuXHRcdFx0aWYgKHR5cGVvZiB0aGlzLmh0bWwgIT09IHR5cGVvZiAnJykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoL15cXHMqJC8udGVzdCh0aGlzLmh0bWwpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHNldFBvcHVwSFRNTCgnPGhyPicsICdwb3B1cFByZVByZXZpZXdTZXAnLCB0aGlzLm93bmVyLmlkTnVtYmVyKTtcblx0XHRcdHNldFBvcHVwVGlwc0FuZEhUTUwodGhpcy5odG1sLCAncG9wdXBQcmV2aWV3JywgdGhpcy5vd25lci5pZE51bWJlciwge1xuXHRcdFx0XHRvd25lcjogdGhpcy5vd25lcixcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgbW9yZSA9IHRoaXMuZnVsbExlbmd0aCA+IHRoaXMuZGF0YS5sZW5ndGggPyB0aGlzLm1vcmVMaW5rKCkgOiAnJztcblx0XHRcdHNldFBvcHVwSFRNTChtb3JlLCAncG9wdXBQcmV2aWV3TW9yZScsIHRoaXMub3duZXIuaWROdW1iZXIpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG1vcmVMaW5rKCkge1xuXHRcdFx0Y29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdGEuY2xhc3NOYW1lID0gJ3BvcHVwTW9yZUxpbmsnO1xuXHRcdFx0YS5pbm5lckhUTUwgPSBwb3B1cFN0cmluZygnbW9yZS4uLicpO1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHRhLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHRcdHNlbGYubWF4Q2hhcmFjdGVycyArPSAyMDAwO1xuXHRcdFx0XHRzZWxmLm1heFNlbnRlbmNlcyArPSAyMDtcblx0XHRcdFx0c2VsZi5zZXREYXRhKCk7XG5cdFx0XHRcdHNlbGYuc2hvd1ByZXZpZXcoKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzdHJpcExvbmdUZW1wbGF0ZXMoKSB7XG5cdFx0XHQvLyBvcGVyYXRlcyBvbiB0aGUgSFRNTCFcblx0XHRcdHRoaXMuaHRtbCA9IHRoaXMuaHRtbC5yZXBsYWNlKC9eLnswLDEwMDB9e3tbXn1dKj8oPChwfGJyKSggXFwvKT8+XFxzKil7Mix9KFtee31dKj99fSk/L2dpLCAnJyk7XG5cdFx0XHR0aGlzLmh0bWwgPSB0aGlzLmh0bWwuc3BsaXQoJ1xcbicpLmpvaW4oJyAnKTsgLy8gd29ya2Fyb3VuZCBmb3IgPHByZT4gdGVtcGxhdGVzXG5cdFx0XHR0aGlzLmh0bWwgPSB0aGlzLmh0bWwucmVwbGFjZSgve3tbXn1dKjxwcmU+W159XSp9fS9naSwgJycpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGtpbGxNdWx0aWxpbmVUZW1wbGF0ZXMoKSB7XG5cdFx0XHR0aGlzLmtpbGwoJ3t7eycsICd9fX0nKTtcblx0XHRcdHRoaXMua2lsbCgvXFxzKnt7W157fV0qXFxuLywgJ319JywgJ3t7Jyk7XG5cdFx0fVxuXHR9XG5cdC8vIEVOREZJTEU6IHByZXZpZXdtYWtlci5qc1xuXHQvLyBTVEFSVEZJTEU6IHF1ZXJ5cHJldmlldy5qc1xuXHRjb25zdCBsb2FkQVBJUHJldmlldyA9IChxdWVyeVR5cGUsIGFydGljbGUsIG5hdnBvcCkgPT4ge1xuXHRcdGNvbnN0IGFydCA9IG5ldyBUaXRsZShhcnRpY2xlKS51cmxTdHJpbmcoKTtcblx0XHRsZXQgdXJsID0gYCR7cGcud2lraS5hcGl3aWtpYmFzZX0/Zm9ybWF0PWpzb24mZm9ybWF0dmVyc2lvbj0yJmFjdGlvbj1xdWVyeSZgO1xuXHRcdGxldCBodG1sR2VuZXJhdG9yID0gKCkgPT4gLyogYSwgZCAqLyB7XG5cdFx0XHRtdy5ub3RpZnkoJ2ludmFsaWQgaHRtbCBnZW5lcmF0b3InLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ2Vycm9yJ30pO1xuXHRcdH07XG5cdFx0bGV0IHVzZXJuYW1lYXJ0ID0gJyc7XG5cdFx0c3dpdGNoIChxdWVyeVR5cGUpIHtcblx0XHRcdGNhc2UgJ2hpc3RvcnknOlxuXHRcdFx0XHR1cmwgKz0gYHRpdGxlcz0ke2FydH0mcHJvcD1yZXZpc2lvbnMmcnZsaW1pdD0ke2dldFZhbHVlT2YoJ3BvcHVwSGlzdG9yeVByZXZpZXdMaW1pdCcpfWA7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUEloaXN0b3J5UHJldmlld0hUTUw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY2F0ZWdvcnknOlxuXHRcdFx0XHR1cmwgKz0gYGxpc3Q9Y2F0ZWdvcnltZW1iZXJzJmNtdGl0bGU9JHthcnR9YDtcblx0XHRcdFx0aHRtbEdlbmVyYXRvciA9IEFQSWNhdGVnb3J5UHJldmlld0hUTUw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcmluZm8nOiB7XG5cdFx0XHRcdGNvbnN0IHVzZXJuYW1lID0gbmV3IFRpdGxlKGFydGljbGUpLnVzZXJOYW1lKCk7XG5cdFx0XHRcdHVzZXJuYW1lYXJ0ID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKTtcblx0XHRcdFx0dXJsICs9IHBnLnJlLmlwVXNlci50ZXN0KHVzZXJuYW1lKVxuXHRcdFx0XHRcdD8gYGxpc3Q9YmxvY2tzJmJrcHJvcD1yYW5nZXxyZXN0cmljdGlvbnMmYmtpcD0ke3VzZXJuYW1lYXJ0fWBcblx0XHRcdFx0XHQ6IGBsaXN0PXVzZXJzfHVzZXJjb250cmlicyZ1c3Byb3A9YmxvY2tpbmZvfGdyb3Vwc3xlZGl0Y291bnR8cmVnaXN0cmF0aW9ufGdlbmRlciZ1c3VzZXJzPSR7dXNlcm5hbWVhcnR9Jm1ldGE9Z2xvYmFsdXNlcmluZm8mZ3VpcHJvcD1ncm91cHN8dW5hdHRhY2hlZCZndWl1c2VyPSR7dXNlcm5hbWVhcnR9JnVjbGltaXQ9MSZ1Y3Byb3A9dGltZXN0YW1wJnVjdXNlcj0ke3VzZXJuYW1lYXJ0fWA7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUEl1c2VySW5mb1ByZXZpZXdIVE1MO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgJ2NvbnRyaWJzJzpcblx0XHRcdFx0dXNlcm5hbWVhcnQgPSBlbmNvZGVVUklDb21wb25lbnQobmV3IFRpdGxlKGFydGljbGUpLnVzZXJOYW1lKCkpO1xuXHRcdFx0XHR1cmwgKz0gYGxpc3Q9dXNlcmNvbnRyaWJzJnVjdXNlcj0ke3VzZXJuYW1lYXJ0fSZ1Y2xpbWl0PSR7Z2V0VmFsdWVPZigncG9wdXBDb250cmlic1ByZXZpZXdMaW1pdCcpfWA7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUEljb250cmlic1ByZXZpZXdIVE1MO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2ltYWdlcGFnZXByZXZpZXcnOiB7XG5cdFx0XHRcdGxldCB0cmFpbCA9ICcnO1xuXHRcdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBJbWFnZUxpbmtzJykpIHtcblx0XHRcdFx0XHR0cmFpbCA9IGAmbGlzdD1pbWFnZXVzYWdlJml1dGl0bGU9JHthcnR9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHR1cmwgKz0gYHRpdGxlcz0ke2FydH0mcHJvcD1yZXZpc2lvbnN8aW1hZ2VpbmZvJnJ2cHJvcD1jb250ZW50JHt0cmFpbH1gO1xuXHRcdFx0XHRodG1sR2VuZXJhdG9yID0gQVBJaW1hZ2VwYWdlUHJldmlld0hUTUw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnYmFja2xpbmtzJzpcblx0XHRcdFx0dXJsICs9IGBsaXN0PWJhY2tsaW5rcyZibHRpdGxlPSR7YXJ0fWA7XG5cdFx0XHRcdGh0bWxHZW5lcmF0b3IgPSBBUEliYWNrbGlua3NQcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyZXZpc2lvbic6XG5cdFx0XHRcdHVybCArPSBhcnRpY2xlLm9sZGlkID8gYHJldmlkcz0ke2FydGljbGUub2xkaWR9YCA6IGB0aXRsZXM9JHthcnRpY2xlLnJlbW92ZUFuY2hvcigpLnVybFN0cmluZygpfWA7XG5cdFx0XHRcdHVybCArPVxuXHRcdFx0XHRcdCcmcHJvcD1yZXZpc2lvbnN8cGFnZXByb3BzfGluZm98aW1hZ2VzfGNhdGVnb3JpZXMmcnZwcm9wPWlkc3x0aW1lc3RhbXB8ZmxhZ3N8Y29tbWVudHx1c2VyfGNvbnRlbnQmY2xsaW1pdD1tYXgmaW1saW1pdD1tYXgnO1xuXHRcdFx0XHRodG1sR2VuZXJhdG9yID0gQVBJcmV2aXNpb25QcmV2aWV3SFRNTDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdHBlbmRpbmdOYXZwb3BUYXNrKG5hdnBvcCk7XG5cdFx0Y29uc3QgY2FsbGJhY2sgPSAoZCkgPT4ge1xuXHRcdFx0bG9nKCdjYWxsYmFjayBvZiBBUEkgZnVuY3Rpb25zIHdhcyBoaXQnKTtcblx0XHRcdGlmIChxdWVyeVR5cGUgPT09ICd1c2VyaW5mbycpIHtcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBkbyBhbm90aGVyIEFQSSByZXF1ZXN0XG5cdFx0XHRcdGZldGNoVXNlckdyb3VwTmFtZXMoZC5kYXRhKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRzaG93QVBJUHJldmlldyhxdWVyeVR5cGUsIGh0bWxHZW5lcmF0b3IoYXJ0aWNsZSwgZCwgbmF2cG9wKSwgbmF2cG9wLmlkTnVtYmVyLCBuYXZwb3AsIGQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0c2hvd0FQSVByZXZpZXcocXVlcnlUeXBlLCBodG1sR2VuZXJhdG9yKGFydGljbGUsIGQsIG5hdnBvcCksIG5hdnBvcC5pZE51bWJlciwgbmF2cG9wLCBkKTtcblx0XHR9O1xuXHRcdGNvbnN0IGdvID0gKCkgPT4ge1xuXHRcdFx0Z2V0UGFnZVdpdGhDYWNoaW5nKHVybCwgY2FsbGJhY2ssIG5hdnBvcCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHRcdGlmIChuYXZwb3AudmlzaWJsZSB8fCAhZ2V0VmFsdWVPZigncG9wdXBMYXp5RG93bmxvYWRzJykpIHtcblx0XHRcdGdvKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5hdnBvcC5hZGRIb29rKGdvLCAndW5oaWRlJywgJ2JlZm9yZScsIGBET1dOTE9BRF8ke3F1ZXJ5VHlwZX1fUVVFUllfREFUQWApO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgbGlua0xpc3QgPSAobGlzdCkgPT4ge1xuXHRcdGxpc3Quc29ydCgoeCwgeSkgPT4ge1xuXHRcdFx0cmV0dXJuIHggPT09IHkgPyAwIDogeCA8IHkgPyAtMSA6IDE7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYnVmID0gW107XG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdGJ1Zi5wdXNoKFxuXHRcdFx0XHR3aWtpTGluayh7XG5cdFx0XHRcdFx0YXJ0aWNsZTogbmV3IFRpdGxlKGVsZW1lbnQpLFxuXHRcdFx0XHRcdHRleHQ6IGVsZW1lbnQuc3BsaXQoJyAnKS5qb2luKCcmbmJzcDsnKSxcblx0XHRcdFx0XHRhY3Rpb246ICd2aWV3Jyxcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBidWYuam9pbignLCAnKTtcblx0fTtcblx0Y29uc3QgZ2V0VGltZU9mZnNldCA9ICgpID0+IHtcblx0XHRjb25zdCB0eiA9IG13LnVzZXIub3B0aW9ucy5nZXQoJ3RpbWVjb3JyZWN0aW9uJyk7XG5cdFx0aWYgKHR6ICYmIHR6LmluY2x1ZGVzKCd8JykpIHtcblx0XHRcdC8vIE5ldyBmb3JtYXRcblx0XHRcdHJldHVybiBOdW1iZXIucGFyc2VJbnQodHouc3BsaXQoJ3wnKVsxXSwgMTApO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fTtcblx0Y29uc3QgZ2V0VGltZVpvbmUgPSAoKSA9PiB7XG5cdFx0aWYgKCFwZy51c2VyLnRpbWVab25lKSB7XG5cdFx0XHRjb25zdCB0eiA9IG13LnVzZXIub3B0aW9ucy5nZXQoJ3RpbWVjb3JyZWN0aW9uJyk7XG5cdFx0XHRwZy51c2VyLnRpbWVab25lID0gJ1VUQyc7XG5cdFx0XHRpZiAodHopIHtcblx0XHRcdFx0Y29uc3QgdHpDb21wb25lbnRzID0gdHouc3BsaXQoJ3wnKTtcblx0XHRcdFx0aWYgKHR6Q29tcG9uZW50cy5sZW5ndGggPT09IDMgJiYgdHpDb21wb25lbnRzWzBdID09PSAnWm9uZUluZm8nKSB7XG5cdFx0XHRcdFx0WywgLCBwZy51c2VyLnRpbWVab25lXSA9IHR6Q29tcG9uZW50cztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlcnJsb2coYFVuZXhwZWN0ZWQgdGltZXpvbmUgaW5mb3JtYXRpb246ICR7dHp9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHBnLnVzZXIudGltZVpvbmU7XG5cdH07XG5cdC8qKlxuXHQgKiBTaG91bGQgd2UgdXNlIGFuIG9mZnNldCBvciBjYW4gd2UgdXNlIHByb3BlciB0aW1lem9uZXNcblx0ICovXG5cdGNvbnN0IHVzZVRpbWVPZmZzZXQgPSAoKSA9PiB7XG5cdFx0aWYgKEludGwuRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFRvUGFydHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gSUUgMTFcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRjb25zdCB0eiA9IG13LnVzZXIub3B0aW9ucy5nZXQoJ3RpbWVjb3JyZWN0aW9uJyk7XG5cdFx0aWYgKHR6ICYmICF0ei5pbmNsdWRlcygnWm9uZUluZm98JykpIHtcblx0XHRcdC8vIFN5c3RlbXwgRGVmYXVsdCBzeXN0ZW0gdGltZSwgZGVmYXVsdCBmb3IgdXNlcnMgd2hvIGRpZG4ndCBjb25maWd1cmUgdGltZXpvbmVcblx0XHRcdC8vIE9mZnNldHwgTWFudWFsIGRlZmluZWQgb2Zmc2V0IGJ5IHVzZXJcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdC8qKlxuXHQgKiBBcnJheSBvZiBsb2NhbGVzIGZvciB0aGUgcHVycG9zZSBvZiBqYXZhc2NyaXB0IGxvY2FsZSBiYXNlZCBmb3JtYXR0aW5nXG5cdCAqIEZpbHRlcnMgZG93biB0byB0aG9zZSBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuIEVtcHR5IFtdID09PSBTeXN0ZW0ncyBkZWZhdWx0IGxvY2FsZVxuXHQgKi9cblx0Y29uc3QgZ2V0TG9jYWxlcyA9ICgpID0+IHtcblx0XHRpZiAoIXBnLnVzZXIubG9jYWxlcykge1xuXHRcdFx0bGV0IHVzZXJMYW5ndWFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKS5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTsgLy8gbWFrZSBzdXJlIHdlIGhhdmUgSFRNTCBsb2NhbGVcblx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cExvY2FsZScpKSB7XG5cdFx0XHRcdHVzZXJMYW5ndWFnZSA9IGdldFZhbHVlT2YoJ3BvcHVwTG9jYWxlJyk7XG5cdFx0XHR9IGVsc2UgaWYgKHVzZXJMYW5ndWFnZSA9PT0gJ2VuJykge1xuXHRcdFx0XHQvLyBlbi53cCB0ZW5kcyB0byB0cmVhdCB0aGlzIGFzIGludGVybmF0aW9uYWwgZW5nbGlzaCAvIHVuc3BlY2lmaWVkXG5cdFx0XHRcdC8vIGJ1dCB3ZSBoYXZlIG1vcmUgc3BlY2lmaWMgc2V0dGluZ3MgaW4gdXNlciBvcHRpb25zXG5cdFx0XHRcdHVzZXJMYW5ndWFnZSA9IGdldE1XRGF0ZUZvcm1hdCgpID09PSAnbWR5JyA/ICdlbi1VUycgOiAnZW4tR0InO1xuXHRcdFx0fVxuXHRcdFx0cGcudXNlci5sb2NhbGVzID0gSW50bC5EYXRlVGltZUZvcm1hdC5zdXBwb3J0ZWRMb2NhbGVzT2YoW3VzZXJMYW5ndWFnZSwgbmF2aWdhdG9yLmxhbmd1YWdlXSk7XG5cdFx0fVxuXHRcdHJldHVybiBwZy51c2VyLmxvY2FsZXM7XG5cdH07XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBjb25maWd1cmVkIE1XIGRhdGUgZm9ybWF0IGZvciB0aGlzIHVzZXJcblx0ICogVGhlc2UgY2FuIGJlXG5cdCAqIGRlZmF1bHRcblx0ICogZG15OiB0aW1lLCBkbXlcblx0ICogbWR5OiB0aW1lLCBtZHlcblx0ICogeW1kOiB0aW1lLCB5bWRcblx0ICogZG15dDogZG15LCB0aW1lXG5cdCAqIGRteXRzOiBkbXksIHRpbWUgKyBzZWNvbmRzXG5cdCAqIElTTyA4NjAxOiBZWVlZLU1NLUREVGhoOm1tOnNzIChsb2NhbCB0aW1lKVxuXHQgKlxuXHQgKiBUaGlzIGlzbid0IHRvbyB1c2VmdWwgZm9yIHVzLCBhcyBKUyBkb2Vzbid0IGhhdmUgZm9ybWF0dGVycyB0byBtYXRjaCB0aGVzZSBwcml2YXRlIHNwZWNpZmllcnNcblx0ICovXG5cdGNvbnN0IGdldE1XRGF0ZUZvcm1hdCA9ICgpID0+IHtcblx0XHRyZXR1cm4gbXcudXNlci5vcHRpb25zLmdldCgnZGF0ZScpO1xuXHR9O1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIEhUTUwgdGFibGUgdGhhdCdzIHNob3duIGluIHRoZSBoaXN0b3J5IGFuZCB1c2VyLWNvbnRyaWJzIHBvcHVwcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFydGljbGVcblx0ICogQHBhcmFtIHtPYmplY3RbXX0gaCAtIGEgbGlzdCBvZiByZXZpc2lvbnMsIHJldHVybmVkIGZyb20gdGhlIEFQSVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHJlYWxseUNvbnRyaWJzIC0gdHJ1ZSBvbmx5IGlmIHdlJ3JlIGRpc3BsYXlpbmcgdXNlciBjb250cmlidXRpb25zXG5cdCAqL1xuXHRjb25zdCBlZGl0UHJldmlld1RhYmxlID0gKGFydGljbGUsIGgsIHJlYWxseUNvbnRyaWJzKSA9PiB7XG5cdFx0bGV0IGh0bWwgPSBbJzx0YWJsZT4nXTtcblx0XHRsZXQgZGF5O1xuXHRcdGxldCBjdXJhcnQgPSBhcnRpY2xlO1xuXHRcdGxldCBwYWdlO1xuXHRcdGxldCBtYWtlRmlyc3RDb2x1bW5MaW5rcztcblx0XHRpZiAocmVhbGx5Q29udHJpYnMpIHtcblx0XHRcdC8vIFdlJ3JlIHNob3dpbmcgdXNlciBjb250cmlidXRpb25zLCBzbyBtYWtlIChkaWZmIHwgaGlzdCkgbGlua3Ncblx0XHRcdG1ha2VGaXJzdENvbHVtbkxpbmtzID0gKGN1cnJlbnRSZXZpc2lvbikgPT4ge1xuXHRcdFx0XHRsZXQgcmVzdWx0ID0gJygnO1xuXHRcdFx0XHRyZXN1bHQgKz1cblx0XHRcdFx0XHRgPGEgaHJlZj1cIiR7cGcud2lraS50aXRsZWJhc2V9JHtuZXcgVGl0bGUoY3VycmVudFJldmlzaW9uLnRpdGxlKS51cmxTdHJpbmcoKX0mZGlmZj1wcmV2YCArXG5cdFx0XHRcdFx0YCZvbGRpZD0ke2N1cnJlbnRSZXZpc2lvbi5yZXZpZH1cIj4ke3BvcHVwU3RyaW5nKCdkaWZmJyl9PC9hPmA7XG5cdFx0XHRcdHJlc3VsdCArPSAnJm5ic3A7fCZuYnNwOyc7XG5cdFx0XHRcdHJlc3VsdCArPSBgPGEgaHJlZj1cIiR7cGcud2lraS50aXRsZWJhc2V9JHtuZXcgVGl0bGUoXG5cdFx0XHRcdFx0Y3VycmVudFJldmlzaW9uLnRpdGxlXG5cdFx0XHRcdCkudXJsU3RyaW5nKCl9JmFjdGlvbj1oaXN0b3J5XCI+JHtwb3B1cFN0cmluZygnaGlzdCcpfTwvYT5gO1xuXHRcdFx0XHRyZXN1bHQgKz0gJyknO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSXQncyBhIHJlZ3VsYXIgaGlzdG9yeSBwYWdlLCBzbyBtYWtlIChjdXIgfCBsYXN0KSBsaW5rc1xuXHRcdFx0Y29uc3QgZmlyc3RSZXZpZCA9IGhbMF0ucmV2aWQ7XG5cdFx0XHRtYWtlRmlyc3RDb2x1bW5MaW5rcyA9IChjdXJyZW50UmV2aXNpb24pID0+IHtcblx0XHRcdFx0bGV0IHJlc3VsdCA9ICcoJztcblx0XHRcdFx0cmVzdWx0ICs9IGA8YSBocmVmPVwiJHtwZy53aWtpLnRpdGxlYmFzZX0ke25ldyBUaXRsZShjdXJhcnQpLnVybFN0cmluZygpfSZkaWZmPSR7Zmlyc3RSZXZpZH0mb2xkaWQ9JHtcblx0XHRcdFx0XHRjdXJyZW50UmV2aXNpb24ucmV2aWRcblx0XHRcdFx0fVwiPiR7cG9wdXBTdHJpbmcoJ2N1cicpfTwvYT5gO1xuXHRcdFx0XHRyZXN1bHQgKz0gJyZuYnNwO3wmbmJzcDsnO1xuXHRcdFx0XHRyZXN1bHQgKz0gYDxhIGhyZWY9XCIke3BnLndpa2kudGl0bGViYXNlfSR7bmV3IFRpdGxlKGN1cmFydCkudXJsU3RyaW5nKCl9JmRpZmY9cHJldiZvbGRpZD0ke1xuXHRcdFx0XHRcdGN1cnJlbnRSZXZpc2lvbi5yZXZpZFxuXHRcdFx0XHR9XCI+JHtwb3B1cFN0cmluZygnbGFzdCcpfTwvYT5gO1xuXHRcdFx0XHRyZXN1bHQgKz0gJyknO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBbaSwgZWxlbWVudF0gb2YgaC5lbnRyaWVzKCkpIHtcblx0XHRcdGlmIChyZWFsbHlDb250cmlicykge1xuXHRcdFx0XHRwYWdlID0gZWxlbWVudC50aXRsZTtcblx0XHRcdFx0Y3VyYXJ0ID0gbmV3IFRpdGxlKHBhZ2UpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbWlub3IgPSBlbGVtZW50Lm1pbm9yID8gJzxiPm0gPC9iPicgOiAnJztcblx0XHRcdGNvbnN0IGVkaXREYXRlID0gbmV3IERhdGUoZWxlbWVudC50aW1lc3RhbXApO1xuXHRcdFx0bGV0IHRoaXNEYXkgPSBmb3JtYXR0ZWREYXRlKGVkaXREYXRlKTtcblx0XHRcdGNvbnN0IHRoaXNUaW1lID0gZm9ybWF0dGVkVGltZShlZGl0RGF0ZSk7XG5cdFx0XHRpZiAodGhpc0RheSA9PT0gZGF5KSB7XG5cdFx0XHRcdHRoaXNEYXkgPSAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRheSA9IHRoaXNEYXk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpc0RheSkge1xuXHRcdFx0XHRodG1sLnB1c2goYDx0cj48dGQgY29sc3Bhbj0zPjxzcGFuIGNsYXNzPVwicG9wdXBfaGlzdG9yeV9kYXRlXCI+JHt0aGlzRGF5fTwvc3Bhbj48L3RkPjwvdHI+YCk7XG5cdFx0XHR9XG5cdFx0XHRodG1sLnB1c2goXG5cdFx0XHRcdGA8dHIgY2xhc3M9XCJwb3B1cF9oaXN0b3J5X3Jvd18ke2kgJSAyID8gJ29kZCcgOiAnZXZlbid9XCI+YCxcblx0XHRcdFx0YDx0ZD4ke21ha2VGaXJzdENvbHVtbkxpbmtzKGVsZW1lbnQpfTwvdGQ+YCxcblx0XHRcdFx0Jzx0ZD4nICtcblx0XHRcdFx0XHRgPGEgaHJlZj1cIiR7cGcud2lraS50aXRsZWJhc2V9JHtuZXcgVGl0bGUoY3VyYXJ0KS51cmxTdHJpbmcoKX0mb2xkaWQ9JHtcblx0XHRcdFx0XHRcdGVsZW1lbnQucmV2aWRcblx0XHRcdFx0XHR9XCI+JHt0aGlzVGltZX08L2E+PC90ZD5gXG5cdFx0XHQpO1xuXHRcdFx0bGV0IGNvbDN1cmwgPSAnJztcblx0XHRcdGxldCBjb2wzdHh0ID0gJyc7XG5cdFx0XHRpZiAocmVhbGx5Q29udHJpYnMpIHtcblx0XHRcdFx0Y29sM3VybCA9IHBnLndpa2kudGl0bGViYXNlICsgY3VyYXJ0LnVybFN0cmluZygpO1xuXHRcdFx0XHRjb2wzdHh0ID0gcGcuZXNjYXBlUXVvdGVzSFRNTChwYWdlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHt1c2VyfSA9IGVsZW1lbnQ7XG5cdFx0XHRcdGlmIChlbGVtZW50LnVzZXJoaWRkZW4pIHtcblx0XHRcdFx0XHRjb2wzdXJsID0gZ2V0VmFsdWVPZigncG9wdXBSZXZEZWxVcmwnKTtcblx0XHRcdFx0XHRjb2wzdHh0ID0gcGcuZXNjYXBlUXVvdGVzSFRNTChwb3B1cFN0cmluZygncmV2ZGVsJykpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbDN1cmwgPSBwZy5yZS5pcFVzZXIudGVzdCh1c2VyKVxuXHRcdFx0XHRcdFx0PyBgJHtcblx0XHRcdFx0XHRcdFx0XHRwZy53aWtpLnRpdGxlYmFzZSArIG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zU3BlY2lhbElkXVxuXHRcdFx0XHRcdFx0XHR9OkNvbnRyaWJ1dGlvbnMmdGFyZ2V0PSR7bmV3IFRpdGxlKHVzZXIpLnVybFN0cmluZygpfWBcblx0XHRcdFx0XHRcdDogYCR7cGcud2lraS50aXRsZWJhc2UgKyBtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVtwZy5uc1VzZXJJZF19OiR7bmV3IFRpdGxlKFxuXHRcdFx0XHRcdFx0XHRcdHVzZXJcblx0XHRcdFx0XHRcdFx0KS51cmxTdHJpbmcoKX1gO1xuXHRcdFx0XHRcdGNvbDN0eHQgPSBwZy5lc2NhcGVRdW90ZXNIVE1MKHVzZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRodG1sLnB1c2goYDx0ZD4ke3JlYWxseUNvbnRyaWJzID8gbWlub3IgOiAnJ308YSBocmVmPVwiJHtjb2wzdXJsfVwiPiR7Y29sM3R4dH08L2E+PC90ZD5gKTtcblx0XHRcdGxldCBjb21tZW50ID0gJyc7XG5cdFx0XHRjb25zdCBjID0gZWxlbWVudC5jb21tZW50IHx8IGVsZW1lbnQuY29udGVudDtcblx0XHRcdGlmIChjKSB7XG5cdFx0XHRcdGNvbW1lbnQgPSBuZXcgUHJldmlld21ha2VyKGMsIG5ldyBUaXRsZShjdXJhcnQpLnRvVXJsKCkpLmVkaXRTdW1tYXJ5UHJldmlldygpO1xuXHRcdFx0fSBlbHNlIGlmIChlbGVtZW50LmNvbW1lbnRoaWRkZW4pIHtcblx0XHRcdFx0Y29tbWVudCA9IHBvcHVwU3RyaW5nKCdyZXZkZWwnKTtcblx0XHRcdH1cblx0XHRcdGh0bWwucHVzaChgPHRkPiR7cmVhbGx5Q29udHJpYnMgPyAnJyA6IG1pbm9yfSR7Y29tbWVudH08L3RkPmAsICc8L3RyPicpO1xuXHRcdFx0aHRtbCA9IFtodG1sLmpvaW4oJycpXTtcblx0XHR9XG5cdFx0aHRtbC5wdXNoKCc8L3RhYmxlPicpO1xuXHRcdHJldHVybiBodG1sLmpvaW4oJycpO1xuXHR9O1xuXHRjb25zdCBhZGp1c3REYXRlID0gKGQsIG9mZnNldCkgPT4ge1xuXHRcdC8vIG9mZnNldCBpcyBpbiBtaW51dGVzXG5cdFx0Y29uc3QgbyA9IG9mZnNldCAqIDYwICogMTAwMDtcblx0XHRyZXR1cm4gbmV3IERhdGUoK2QgKyBvKTtcblx0fTtcblx0LyoqXG5cdCAqIFRoaXMgcmVsaWVzIG9uIHRoZSBEYXRlIHBhcnNlciB1bmRlcnN0YW5kaW5nIGVuLVVTIGRhdGVzLFxuXHQgKiB3aGljaCBpcyBwcmV0dHkgc2FmZSBhc3N1bXB0aW9uLCBidXQgbm90IHBlcmZlY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RGF0ZX0gZGF0ZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGltZVpvbmVcblx0ICovXG5cdGNvbnN0IGNvbnZlcnRUaW1lWm9uZSA9IChkYXRlLCB0aW1lWm9uZSkgPT4ge1xuXHRcdHJldHVybiBuZXcgRGF0ZShkYXRlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHt0aW1lWm9uZX0pKTtcblx0fTtcblx0Y29uc3QgZm9ybWF0dGVkRGF0ZVRpbWUgPSAoZGF0ZSkgPT4ge1xuXHRcdC8vIGZhbGxiYWNrIGZvciBJRTExIGFuZCB1bmtub3duIHRpbWV6b25lc1xuXHRcdGlmICh1c2VUaW1lT2Zmc2V0KCkpIHtcblx0XHRcdHJldHVybiBgJHtmb3JtYXR0ZWREYXRlKGRhdGUpfSAke2Zvcm1hdHRlZFRpbWUoZGF0ZSl9YDtcblx0XHR9XG5cdFx0aWYgKGdldE1XRGF0ZUZvcm1hdCgpID09PSAnSVNPIDg2MDEnKSB7XG5cdFx0XHRjb25zdCBkMiA9IGNvbnZlcnRUaW1lWm9uZShkYXRlLCBnZXRUaW1lWm9uZSgpKTtcblx0XHRcdHJldHVybiBgJHttYXAoemVyb0ZpbGwsIFtkMi5nZXRGdWxsWWVhcigpLCBkMi5nZXRNb250aCgpICsgMSwgZDIuZ2V0RGF0ZSgpXSkuam9pbignLScpfVQke21hcCh6ZXJvRmlsbCwgW1xuXHRcdFx0XHRkMi5nZXRIb3VycygpLFxuXHRcdFx0XHRkMi5nZXRNaW51dGVzKCksXG5cdFx0XHRcdGQyLmdldFNlY29uZHMoKSxcblx0XHRcdF0pLmpvaW4oJzonKX1gO1xuXHRcdH1cblx0XHRjb25zdCBvcHRpb25zID0gZ2V0VmFsdWVPZigncG9wdXBEYXRlVGltZUZvcm1hdHRlck9wdGlvbnMnKTtcblx0XHRvcHRpb25zLnRpbWVab25lID0gZ2V0VGltZVpvbmUoKTtcblx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyhnZXRMb2NhbGVzKCksIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBmb3JtYXR0ZWREYXRlID0gKGRhdGUpID0+IHtcblx0XHRsZXQgZDI7XG5cdFx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYW5kIHVua25vd24gdGltZXpvbmVzXG5cdFx0aWYgKHVzZVRpbWVPZmZzZXQoKSkge1xuXHRcdFx0Ly8gd2UgYWRqdXN0IHRoZSBVVEMgdGltZSwgc28gd2UgcHJpbnQgdGhlIGFkanVzdGVkIFVUQywgYnV0IG5vdCByZWFsbHkgVVRDIHZhbHVlc1xuXHRcdFx0ZDIgPSBhZGp1c3REYXRlKGRhdGUsIGdldFRpbWVPZmZzZXQoKSk7XG5cdFx0XHRyZXR1cm4gbWFwKHplcm9GaWxsLCBbZDIuZ2V0VVRDRnVsbFllYXIoKSwgZDIuZ2V0VVRDTW9udGgoKSArIDEsIGQyLmdldFVUQ0RhdGUoKV0pLmpvaW4oJy0nKTtcblx0XHR9XG5cdFx0aWYgKGdldE1XRGF0ZUZvcm1hdCgpID09PSAnSVNPIDg2MDEnKSB7XG5cdFx0XHRkMiA9IGNvbnZlcnRUaW1lWm9uZShkYXRlLCBnZXRUaW1lWm9uZSgpKTtcblx0XHRcdHJldHVybiBtYXAoemVyb0ZpbGwsIFtkMi5nZXRGdWxsWWVhcigpLCBkMi5nZXRNb250aCgpICsgMSwgZDIuZ2V0RGF0ZSgpXSkuam9pbignLScpO1xuXHRcdH1cblx0XHRjb25zdCBvcHRpb25zID0gZ2V0VmFsdWVPZigncG9wdXBEYXRlRm9ybWF0dGVyT3B0aW9ucycpO1xuXHRcdG9wdGlvbnMudGltZVpvbmUgPSBnZXRUaW1lWm9uZSgpO1xuXHRcdHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhnZXRMb2NhbGVzKCksIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBmb3JtYXR0ZWRUaW1lID0gKGRhdGUpID0+IHtcblx0XHRsZXQgZDI7XG5cdFx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYW5kIHVua25vd24gdGltZXpvbmVzXG5cdFx0aWYgKHVzZVRpbWVPZmZzZXQoKSkge1xuXHRcdFx0Ly8gd2UgYWRqdXN0IHRoZSBVVEMgdGltZSwgc28gd2UgcHJpbnQgdGhlIGFkanVzdGVkIFVUQywgYnV0IG5vdCByZWFsbHkgVVRDIHZhbHVlc1xuXHRcdFx0ZDIgPSBhZGp1c3REYXRlKGRhdGUsIGdldFRpbWVPZmZzZXQoKSk7XG5cdFx0XHRyZXR1cm4gbWFwKHplcm9GaWxsLCBbZDIuZ2V0VVRDSG91cnMoKSwgZDIuZ2V0VVRDTWludXRlcygpLCBkMi5nZXRVVENTZWNvbmRzKCldKS5qb2luKCc6Jyk7XG5cdFx0fVxuXHRcdGlmIChnZXRNV0RhdGVGb3JtYXQoKSA9PT0gJ0lTTyA4NjAxJykge1xuXHRcdFx0ZDIgPSBjb252ZXJ0VGltZVpvbmUoZGF0ZSwgZ2V0VGltZVpvbmUoKSk7XG5cdFx0XHRyZXR1cm4gbWFwKHplcm9GaWxsLCBbZDIuZ2V0SG91cnMoKSwgZDIuZ2V0TWludXRlcygpLCBkMi5nZXRTZWNvbmRzKCldKS5qb2luKCc6Jyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXRWYWx1ZU9mKCdwb3B1cFRpbWVGb3JtYXR0ZXJPcHRpb25zJyk7XG5cdFx0b3B0aW9ucy50aW1lWm9uZSA9IGdldFRpbWVab25lKCk7XG5cdFx0cmV0dXJuIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKGdldExvY2FsZXMoKSwgb3B0aW9ucyk7XG5cdH07XG5cdC8vIEdldCB0aGUgcHJvcGVyIGdyb3VwbmFtZXMgZm9yIHRoZSB0ZWNobmljYWxncm91cHNcblx0Y29uc3QgZmV0Y2hVc2VyR3JvdXBOYW1lcyA9ICh1c2VyaW5mb1Jlc3BvbnNlKSA9PiB7XG5cdFx0Y29uc3QgcXVlcnlPYmogPSBnZXRKc09iaih1c2VyaW5mb1Jlc3BvbnNlKS5xdWVyeTtcblx0XHRjb25zdCB1c2VyID0gYW55Q2hpbGQocXVlcnlPYmoudXNlcnMpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzID0gW107XG5cdFx0aWYgKHVzZXIuZ3JvdXBzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiB1c2VyLmdyb3Vwcykge1xuXHRcdFx0XHRpZiAoIVsnKicsICd1c2VyJywgJ2F1dG9jb25maXJtZWQnXS5pbmNsdWRlcyhncm91cE5hbWUpKSB7XG5cdFx0XHRcdFx0bWVzc2FnZXMucHVzaChgZ3JvdXAtJHtncm91cE5hbWV9LW1lbWJlcmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChxdWVyeU9iai5nbG9iYWx1c2VyaW5mbyAmJiBxdWVyeU9iai5nbG9iYWx1c2VyaW5mby5ncm91cHMpIHtcblx0XHRcdGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIHF1ZXJ5T2JqLmdsb2JhbHVzZXJpbmZvLmdyb3Vwcykge1xuXHRcdFx0XHRtZXNzYWdlcy5wdXNoKGBncm91cC0ke2dyb3VwTmFtZX0tbWVtYmVyYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBnZXRNd0FwaSgpLmxvYWRNZXNzYWdlc0lmTWlzc2luZyhtZXNzYWdlcyk7XG5cdH07XG5cdGNvbnN0IHNob3dBUElQcmV2aWV3ID0gKHF1ZXJ5VHlwZSwgaHRtbCwgaWQsIG5hdnBvcCwgZG93bmxvYWQpID0+IHtcblx0XHQvLyBESjogZG9uZVxuXHRcdGxldCB0YXJnZXQgPSAncG9wdXBQcmV2aWV3Jztcblx0XHRjb21wbGV0ZWROYXZwb3BUYXNrKG5hdnBvcCk7XG5cdFx0c3dpdGNoIChxdWVyeVR5cGUpIHtcblx0XHRcdGNhc2UgJ2ltYWdlbGlua3MnOlxuXHRcdFx0Y2FzZSAnY2F0ZWdvcnknOlxuXHRcdFx0XHR0YXJnZXQgPSAncG9wdXBQb3N0UHJldmlldyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcmluZm8nOlxuXHRcdFx0XHR0YXJnZXQgPSAncG9wdXBVc2VyRGF0YSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmV2aXNpb24nOlxuXHRcdFx0XHRpbnNlcnRQcmV2aWV3KGRvd25sb2FkKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRzZXRQb3B1cFRpcHNBbmRIVE1MKGh0bWwsIHRhcmdldCwgaWQpO1xuXHR9O1xuXHRjb25zdCBBUElyZXZpc2lvblByZXZpZXdIVE1MID0gKF9hcnRpY2xlLCBkb3dubG9hZCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBqc09iaiA9IGdldEpzT2JqKGRvd25sb2FkLmRhdGEpO1xuXHRcdFx0Y29uc3QgcGFnZSA9IGFueUNoaWxkKGpzT2JqLnF1ZXJ5LnBhZ2VzKTtcblx0XHRcdGlmIChwYWdlLm1pc3NpbmcpIHtcblx0XHRcdFx0Ly8gVE9ETyB3ZSBuZWVkIHRvIGZpeCB0aGlzIHByb3BlciBsYXRlciBvblxuXHRcdFx0XHRkb3dubG9hZC5vd25lciA9IG51bGw7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGNvbnRlbnQgPVxuXHRcdFx0XHRwYWdlICYmIHBhZ2UucmV2aXNpb25zICYmIHBhZ2UucmV2aXNpb25zWzBdLmNvbnRlbnRtb2RlbCA9PT0gJ3dpa2l0ZXh0J1xuXHRcdFx0XHRcdD8gcGFnZS5yZXZpc2lvbnNbMF0uY29udGVudFxuXHRcdFx0XHRcdDogbnVsbDtcblx0XHRcdGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZG93bmxvYWQuZGF0YSA9IGNvbnRlbnQ7XG5cdFx0XHRcdGRvd25sb2FkLmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKHBhZ2UucmV2aXNpb25zWzBdLnRpbWVzdGFtcCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gJ1JldmlzaW9uIHByZXZpZXcgZmFpbGVkIDooJztcblx0XHR9XG5cdH07XG5cdGNvbnN0IEFQSWJhY2tsaW5rc1ByZXZpZXdIVE1MID0gKF9hcnRpY2xlLCBkb3dubG9hZCAvKiAsIG5hdnBvcCAqLykgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBqc09iaiA9IGdldEpzT2JqKGRvd25sb2FkLmRhdGEpO1xuXHRcdFx0Y29uc3QgbGlzdCA9IGpzT2JqLnF1ZXJ5LmJhY2tsaW5rcztcblx0XHRcdGxldCBodG1sID0gW107XG5cdFx0XHRpZiAoIWxpc3QpIHtcblx0XHRcdFx0cmV0dXJuIHBvcHVwU3RyaW5nKCdObyBiYWNrbGlua3MgZm91bmQnKTtcblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBsaXN0KSB7XG5cdFx0XHRcdGNvbnN0IHQgPSBuZXcgVGl0bGUoZWxlbWVudC50aXRsZSk7XG5cdFx0XHRcdGh0bWwucHVzaChgPGEgaHJlZj1cIiR7cGcud2lraS50aXRsZWJhc2V9JHt0LnVybFN0cmluZygpfVwiPiR7dC50b1N0cmluZygpLmVudGlmeSgpfTwvYT5gKTtcblx0XHRcdH1cblx0XHRcdGh0bWwgPSBodG1sLmpvaW4oJywgJyk7XG5cdFx0XHRpZiAoanNPYmouY29udGludWUgJiYganNPYmouY29udGludWUuYmxjb250aW51ZSkge1xuXHRcdFx0XHRodG1sICs9IHBvcHVwU3RyaW5nKCcgYW5kIG1vcmUnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBodG1sO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdiYWNrbGlua3NQcmV2aWV3SFRNTCB3ZW50IHdvbmt5Jztcblx0XHR9XG5cdH07XG5cdHBnLmZuLkFQSXNoYXJlZEltYWdlUGFnZVByZXZpZXdIVE1MID0gKG9iaikgPT4ge1xuXHRcdGxvZygnQVBJc2hhcmVkSW1hZ2VQYWdlUHJldmlld0hUTUwnKTtcblx0XHRjb25zdCBwb3B1cGlkID0gb2JqLnJlcXVlc3RpZDtcblx0XHRpZiAob2JqLnF1ZXJ5ICYmIG9iai5xdWVyeS5wYWdlcykge1xuXHRcdFx0Y29uc3QgcGFnZSA9IGFueUNoaWxkKG9iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRjb25zdCBjb250ZW50ID1cblx0XHRcdFx0cGFnZSAmJiBwYWdlLnJldmlzaW9ucyAmJiBwYWdlLnJldmlzaW9uc1swXS5jb250ZW50bW9kZWwgPT09ICd3aWtpdGV4dCdcblx0XHRcdFx0XHQ/IHBhZ2UucmV2aXNpb25zWzBdLmNvbnRlbnRcblx0XHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIHBnICYmIHBnLmN1cnJlbnQgJiYgcGcuY3VycmVudC5saW5rICYmIHBnLmN1cnJlbnQubGluay5uYXZwb3B1cCkge1xuXHRcdFx0XHQvKiBOb3QgZW50aXJlbHkgc2FmZSwgYnV0IHRoZSBiZXN0IHdlIGNhbiBkbyAqL1xuXHRcdFx0XHRjb25zdCBwID0gbmV3IFByZXZpZXdtYWtlcihjb250ZW50LCBwZy5jdXJyZW50LmxpbmsubmF2cG9wdXAuYXJ0aWNsZSwgcGcuY3VycmVudC5saW5rLm5hdnBvcHVwKTtcblx0XHRcdFx0cC5tYWtlUHJldmlldygpO1xuXHRcdFx0XHRzZXRQb3B1cEhUTUwocC5odG1sLCAncG9wdXBTZWNvbmRQcmV2aWV3JywgcG9wdXBpZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBBUElpbWFnZXBhZ2VQcmV2aWV3SFRNTCA9IChhcnRpY2xlLCBkb3dubG9hZCwgbmF2cG9wKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzT2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRjb25zdCBwYWdlID0gYW55Q2hpbGQoanNPYmoucXVlcnkucGFnZXMpO1xuXHRcdFx0Y29uc3QgY29udGVudCA9XG5cdFx0XHRcdHBhZ2UgJiYgcGFnZS5yZXZpc2lvbnMgJiYgcGFnZS5yZXZpc2lvbnNbMF0uY29udGVudG1vZGVsID09PSAnd2lraXRleHQnXG5cdFx0XHRcdFx0PyBwYWdlLnJldmlzaW9uc1swXS5jb250ZW50XG5cdFx0XHRcdFx0OiBudWxsO1xuXHRcdFx0bGV0IHJldCA9ICcnO1xuXHRcdFx0bGV0IGFsdCA9ICcnO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0W3thbHR9XSA9IG5hdnBvcC5wYXJlbnRBbmNob3IuY2hpbGROb2Rlcztcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBlbXB0eSAqL1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFsdCkge1xuXHRcdFx0XHRyZXQgPSBgJHtyZXR9PGhyPjxiPiR7cG9wdXBTdHJpbmcoJ0FsdCB0ZXh0OicpfTwvYj4gJHtwZy5lc2NhcGVRdW90ZXNIVE1MKGFsdCl9YDtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Y29uc3QgcCA9IHByZXBQcmV2aWV3bWFrZXIoY29udGVudCwgYXJ0aWNsZSwgbmF2cG9wKTtcblx0XHRcdFx0cC5tYWtlUHJldmlldygpO1xuXHRcdFx0XHRpZiAocC5odG1sKSB7XG5cdFx0XHRcdFx0cmV0ICs9IGA8aHI+JHtwLmh0bWx9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBTdW1tYXJ5RGF0YScpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5mbyA9IGdldFBhZ2VJbmZvKGNvbnRlbnQsIGRvd25sb2FkKTtcblx0XHRcdFx0XHRsb2coaW5mbyk7XG5cdFx0XHRcdFx0c2V0UG9wdXBUcmFpbGVyKGluZm8sIG5hdnBvcC5pZE51bWJlcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChwYWdlICYmIHBhZ2UuaW1hZ2VyZXBvc2l0b3J5ID09PSAnc2hhcmVkJykge1xuXHRcdFx0XHRjb25zdCBhcnQgPSBuZXcgVGl0bGUoYXJ0aWNsZSk7XG5cdFx0XHRcdGNvbnN0IGVuY2FydCA9IGVuY29kZVVSSUNvbXBvbmVudChgRmlsZToke2FydC5zdHJpcE5hbWVzcGFjZSgpfWApO1xuXHRcdFx0XHRjb25zdCBzaGFyZWRfdXJsID1cblx0XHRcdFx0XHRgJHtwZy53aWtpLmFwaWNvbW1vbnNiYXNlfT9mb3JtYXQ9anNvbiZmb3JtYXR2ZXJzaW9uPTJgICtcblx0XHRcdFx0XHQnJmNhbGxiYWNrPXBnLmZuLkFQSXNoYXJlZEltYWdlUGFnZVByZXZpZXdIVE1MJyArXG5cdFx0XHRcdFx0YCZyZXF1ZXN0aWQ9JHtuYXZwb3AuaWROdW1iZXJ9JmFjdGlvbj1xdWVyeSZwcm9wPXJldmlzaW9ucyZydnByb3A9Y29udGVudCZ0aXRsZXM9JHtlbmNhcnR9YDtcblx0XHRcdFx0cmV0ID0gYCR7cmV0fTxocj4ke3BvcHVwU3RyaW5nKCdJbWFnZSBmcm9tIENvbW1vbnMnKX06IDxhIGhyZWY9XCIke1xuXHRcdFx0XHRcdHBnLndpa2kuY29tbW9uc2Jhc2Vcblx0XHRcdFx0fT90aXRsZT0ke2VuY2FydH1cIj4ke3BvcHVwU3RyaW5nKCdEZXNjcmlwdGlvbiBwYWdlJyl9PC9hPmA7XG5cdFx0XHRcdG13LmxvYWRlci5sb2FkKHNoYXJlZF91cmwpO1xuXHRcdFx0fVxuXHRcdFx0c2hvd0FQSVByZXZpZXcoJ2ltYWdlbGlua3MnLCBBUElpbWFnZWxpbmtzUHJldmlld0hUTUwoYXJ0aWNsZSwgZG93bmxvYWQpLCBuYXZwb3AuaWROdW1iZXIsIGRvd25sb2FkKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gJ0FQSSBpbWFnZXBhZ2UgcHJldmlldyBmYWlsZWQgOignO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgQVBJaW1hZ2VsaW5rc1ByZXZpZXdIVE1MID0gKF9hcnRpY2xlLCBkb3dubG9hZCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBqc29iaiA9IGdldEpzT2JqKGRvd25sb2FkLmRhdGEpO1xuXHRcdFx0Y29uc3QgbGlzdCA9IGpzb2JqLnF1ZXJ5LmltYWdldXNhZ2U7XG5cdFx0XHRpZiAobGlzdCkge1xuXHRcdFx0XHRjb25zdCByZXQgPSBbXTtcblx0XHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGxpc3QpIHtcblx0XHRcdFx0XHRyZXQucHVzaChlbGVtZW50LnRpdGxlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmV0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiBwb3B1cFN0cmluZygnTm8gaW1hZ2UgbGlua3MgZm91bmQnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYDxoMj4ke3BvcHVwU3RyaW5nKCdGaWxlIGxpbmtzJyl9PC9oMj4ke2xpbmtMaXN0KHJldCl9YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwb3B1cFN0cmluZygnTm8gaW1hZ2UgbGlua3MgZm91bmQnKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiAnSW1hZ2UgbGlua3MgcHJldmlldyBnZW5lcmF0aW9uIGZhaWxlZCA6KCc7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBBUEljYXRlZ29yeVByZXZpZXdIVE1MID0gKF9hcnRpY2xlLCBkb3dubG9hZCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBqc29iaiA9IGdldEpzT2JqKGRvd25sb2FkLmRhdGEpO1xuXHRcdFx0Y29uc3QgbGlzdCA9IGpzb2JqLnF1ZXJ5LmNhdGVnb3J5bWVtYmVycztcblx0XHRcdGxldCByZXQgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBsaXN0KSB7XG5cdFx0XHRcdHJldC5wdXNoKGVsZW1lbnQudGl0bGUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJldC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIHBvcHVwU3RyaW5nKCdFbXB0eSBjYXRlZ29yeScpO1xuXHRcdFx0fVxuXHRcdFx0cmV0ID0gYDxoMj4ke3RwcmludGYoJ0NhdGVnb3J5IG1lbWJlcnMgKCVzIHNob3duKScsIFtyZXQubGVuZ3RoXSl9PC9oMj4ke2xpbmtMaXN0KHJldCl9YDtcblx0XHRcdGlmIChqc29iai5jb250aW51ZSAmJiBqc29iai5jb250aW51ZS5jbWNvbnRpbnVlKSB7XG5cdFx0XHRcdHJldCArPSBwb3B1cFN0cmluZygnIGFuZCBtb3JlJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuICdDYXRlZ29yeSBwcmV2aWV3IGZhaWxlZCA6KCc7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBBUEl1c2VySW5mb1ByZXZpZXdIVE1MID0gKF9hcnRpY2xlLCBkb3dubG9hZCkgPT4ge1xuXHRcdGxldCByZXQgPSBbXTtcblx0XHRsZXQgcXVlcnlvYmogPSB7fTtcblx0XHR0cnkge1xuXHRcdFx0cXVlcnlvYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKS5xdWVyeTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiAnVXNlcmluZm8gcHJldmlldyBmYWlsZWQgOignO1xuXHRcdH1cblx0XHRjb25zdCB1c2VyID0gYW55Q2hpbGQocXVlcnlvYmoudXNlcnMpO1xuXHRcdGlmICh1c2VyKSB7XG5cdFx0XHRjb25zdCB7Z2xvYmFsdXNlcmluZm99ID0gcXVlcnlvYmo7XG5cdFx0XHRpZiAodXNlci5pbnZhbGlkID09PSAnJykge1xuXHRcdFx0XHRyZXQucHVzaChwb3B1cFN0cmluZygnSW52YWxpZCB1c2VyJykpO1xuXHRcdFx0fSBlbHNlIGlmICh1c2VyLm1pc3NpbmcgPT09ICcnKSB7XG5cdFx0XHRcdHJldC5wdXNoKHBvcHVwU3RyaW5nKCdOb3QgYSByZWdpc3RlcmVkIHVzZXJuYW1lJykpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHVzZXIuYmxvY2tlZGJ5KSB7XG5cdFx0XHRcdGlmICh1c2VyLmJsb2NrcGFydGlhbCkge1xuXHRcdFx0XHRcdHJldC5wdXNoKGA8Yj4ke3BvcHVwU3RyaW5nKCdIYXMgYmxvY2tzJyl9PC9iPmApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldC5wdXNoKGA8Yj4ke3BvcHVwU3RyaW5nKCdCTE9DS0VEJyl9PC9iPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZ2xvYmFsdXNlcmluZm8gJiYgKCdsb2NrZWQnIGluIGdsb2JhbHVzZXJpbmZvIHx8ICdoaWRkZW4nIGluIGdsb2JhbHVzZXJpbmZvKSkge1xuXHRcdFx0XHRsZXQgbG9ja2VkU3VsQWNjb3VudElzQXR0YWNoZWRUb1RoaXMgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgZ2xvYmFsdXNlcmluZm8udW5hdHRhY2hlZCAmJiBpIDwgZ2xvYmFsdXNlcmluZm8udW5hdHRhY2hlZC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGlmIChnbG9iYWx1c2VyaW5mby51bmF0dGFjaGVkW2ldLndpa2kgPT09IG13LmNvbmZpZy5nZXQoJ3dnREJuYW1lJykpIHtcblx0XHRcdFx0XHRcdGxvY2tlZFN1bEFjY291bnRJc0F0dGFjaGVkVG9UaGlzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxvY2tlZFN1bEFjY291bnRJc0F0dGFjaGVkVG9UaGlzKSB7XG5cdFx0XHRcdFx0aWYgKCdsb2NrZWQnIGluIGdsb2JhbHVzZXJpbmZvKSB7XG5cdFx0XHRcdFx0XHRyZXQucHVzaChgPGI+PGk+JHtwb3B1cFN0cmluZygnTE9DS0VEJyl9PC9pPjwvYj5gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCdoaWRkZW4nIGluIGdsb2JhbHVzZXJpbmZvKSB7XG5cdFx0XHRcdFx0XHRyZXQucHVzaChgPGI+PGk+JHtwb3B1cFN0cmluZygnSElEREVOJyl9PC9pPjwvYj5gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cFNob3dHZW5kZXInKSAmJiB1c2VyLmdlbmRlcikge1xuXHRcdFx0XHRzd2l0Y2ggKHVzZXIuZ2VuZGVyKSB7XG5cdFx0XHRcdFx0Y2FzZSAnbWFsZSc6XG5cdFx0XHRcdFx0XHRyZXQucHVzaChgJHtwb3B1cFN0cmluZygnaGUvaGltJyl9IMK3IGApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmVtYWxlJzpcblx0XHRcdFx0XHRcdHJldC5wdXNoKGAke3BvcHVwU3RyaW5nKCdzaGUvaGVyJyl9IMK3IGApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh1c2VyLmdyb3Vwcykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiB1c2VyLmdyb3Vwcykge1xuXHRcdFx0XHRcdGlmICghWycqJywgJ3VzZXInLCAnYXV0b2NvbmZpcm1lZCddLmluY2x1ZGVzKGdyb3VwTmFtZSkpIHtcblx0XHRcdFx0XHRcdC8vIE1lc3NhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaGVyZTpcblx0XHRcdFx0XHRcdC8vICogc2VlIFtbU3BlY2lhbDpQcmVmaXhJbmRleC9NZWRpYVdpa2k6R3JvdXAtXV1cblx0XHRcdFx0XHRcdC8vICogZm9yIG1vcmUgaW5mb3JtYXRpb25cblx0XHRcdFx0XHRcdHJldC5wdXNoKHBnLmVzY2FwZVF1b3Rlc0hUTUwobXcubWVzc2FnZShgZ3JvdXAtJHtncm91cE5hbWV9LW1lbWJlcmAsIHVzZXIuZ2VuZGVyKS50ZXh0KCkpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChnbG9iYWx1c2VyaW5mbyAmJiBnbG9iYWx1c2VyaW5mby5ncm91cHMpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBncm91cE5hbWUgb2YgZ2xvYmFsdXNlcmluZm8uZ3JvdXBzKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goXG5cdFx0XHRcdFx0XHQvLyBNZXNzYWdlcyB0aGF0IGNhbiBiZSB1c2VkIGhlcmU6XG5cdFx0XHRcdFx0XHQvLyAqIHNlZSBbW1NwZWNpYWw6UHJlZml4SW5kZXgvTWVkaWFXaWtpOkdyb3VwLV1dXG5cdFx0XHRcdFx0XHQvLyAqIGZvciBtb3JlIGluZm9ybWF0aW9uXG5cdFx0XHRcdFx0XHRgPGk+JHtwZy5lc2NhcGVRdW90ZXNIVE1MKG13Lm1lc3NhZ2UoYGdyb3VwLSR7Z3JvdXBOYW1lfS1tZW1iZXJgLCB1c2VyLmdlbmRlcikudGV4dCgpKX08L2k+YFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh1c2VyLnJlZ2lzdHJhdGlvbikge1xuXHRcdFx0XHRyZXQucHVzaChcblx0XHRcdFx0XHRwZy5lc2NhcGVRdW90ZXNIVE1MKFxuXHRcdFx0XHRcdFx0KHVzZXIuZWRpdGNvdW50ID8/ICcwJykgK1xuXHRcdFx0XHRcdFx0XHRwb3B1cFN0cmluZygnIGVkaXRzIHNpbmNlOiAnKSArXG5cdFx0XHRcdFx0XHRcdCh1c2VyLnJlZ2lzdHJhdGlvbiA/IGZvcm1hdHRlZERhdGUobmV3IERhdGUodXNlci5yZWdpc3RyYXRpb24pKSA6ICcnKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHF1ZXJ5b2JqLnVzZXJjb250cmlicyAmJiBxdWVyeW9iai51c2VyY29udHJpYnMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0LnB1c2gocG9wdXBTdHJpbmcoJ2xhc3QgZWRpdCBvbiAnKSArIGZvcm1hdHRlZERhdGUobmV3IERhdGUocXVlcnlvYmoudXNlcmNvbnRyaWJzWzBdLnRpbWVzdGFtcCkpKTtcblx0XHR9XG5cdFx0aWYgKHF1ZXJ5b2JqLmJsb2Nrcykge1xuXHRcdFx0cmV0LnB1c2gocG9wdXBTdHJpbmcoJ0lQIHVzZXInKSk7IC8vIHdlIG9ubHkgcmVxdWVzdCBsaXN0PWJsb2NrcyBmb3IgSVBzXG5cdFx0XHRmb3IgKGxldCBsID0gMDsgbCA8IHF1ZXJ5b2JqLmJsb2Nrcy5sZW5ndGg7IGwrKykge1xuXHRcdFx0XHRsZXQgcmJzdHIgPSBxdWVyeW9iai5ibG9ja3NbbF0ucmFuZ2VzdGFydCA9PT0gcXVlcnlvYmouYmxvY2tzW2xdLnJhbmdlZW5kID8gJ0JMT0NLJyA6ICdSQU5HRUJMT0NLJztcblx0XHRcdFx0cmJzdHIgPSBBcnJheS5pc0FycmF5KHF1ZXJ5b2JqLmJsb2Nrc1tsXS5yZXN0cmljdGlvbnMpID8gYCR7cmJzdHJ9RURgIDogYEhhcyAke3Jic3RyLnRvTG93ZXJDYXNlKCl9c2A7XG5cdFx0XHRcdHJldC5wdXNoKGA8Yj4ke3BvcHVwU3RyaW5nKHJic3RyKX08L2I+YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGlmIGFueSBlbGVtZW50IG9mIHJldCBlbmRzIHdpdGggJyDCtyAnLCBtZXJnZSBpdCB3aXRoIHRoZSBuZXh0IGVsZW1lbnQgdG8gYXZvaWRcblx0XHQvLyB0aGUgLmpvaW4oJywgJykgY2FsbCBpbnNlcnRpbmcgYSBjb21tYSBhZnRlciBpdFxuXHRcdGZvciAobGV0IG0gPSAwOyBtIDwgcmV0Lmxlbmd0aCAtIDE7IG0rKykge1xuXHRcdFx0aWYgKHJldFttXS5sZW5ndGggPiAzICYmIHJldFttXS5zbGljZShNYXRoLm1heCgwLCByZXRbbV0ubGVuZ3RoIC0gMykpID09PSAnIMK3ICcpIHtcblx0XHRcdFx0cmV0W21dICs9IHJldFttICsgMV07XG5cdFx0XHRcdHJldC5zcGxpY2UobSArIDEsIDEpOyAvLyBkZWxldGUgZWxlbWVudCBhdCBpbmRleCBtKzFcblx0XHRcdFx0bS0tO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXQgPSBgPGhyPiR7cmV0LmpvaW4oJywgJyl9YDtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBBUEljb250cmlic1ByZXZpZXdIVE1MID0gKGFydGljbGUsIGRvd25sb2FkLCBuYXZwb3ApID0+IHtcblx0XHRyZXR1cm4gQVBJaGlzdG9yeVByZXZpZXdIVE1MKGFydGljbGUsIGRvd25sb2FkLCBuYXZwb3AsIHRydWUpO1xuXHR9O1xuXHRjb25zdCBBUEloaXN0b3J5UHJldmlld0hUTUwgPSAoYXJ0aWNsZSwgZG93bmxvYWQsIF9uYXZwb3AsIHJlYWxseUNvbnRyaWJzKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGpzb2JqID0gZ2V0SnNPYmooZG93bmxvYWQuZGF0YSk7XG5cdFx0XHRsZXQgZWRpdHMgPSBbXTtcblx0XHRcdGVkaXRzID0gcmVhbGx5Q29udHJpYnMgPyBqc29iai5xdWVyeS51c2VyY29udHJpYnMgOiBhbnlDaGlsZChqc29iai5xdWVyeS5wYWdlcykucmV2aXNpb25zO1xuXHRcdFx0Y29uc3QgcmV0ID0gZWRpdFByZXZpZXdUYWJsZShhcnRpY2xlLCBlZGl0cywgcmVhbGx5Q29udHJpYnMpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiAnSGlzdG9yeSBwcmV2aWV3IGZhaWxlZCA6LSgnO1xuXHRcdH1cblx0fTtcblx0Ly8gRU5ERklMRTogcXVlcnlwcmV2aWV3LmpzXG5cdC8vIFNUQVJURklMRTogZGVidWcuanNcblx0Ly8gRGVidWdnaW5nIGZ1bmN0aW9uc1xuXHRjb25zdCBzZXR1cERlYnVnZ2luZyA9ICgpID0+IHtcblx0XHRpZiAod2luZG93LnBvcHVwRGVidWcpIHtcblx0XHRcdC8vIHBvcHVwRGVidWcgaXMgc2V0IGZyb20gLnZlcnNpb25cblx0XHRcdHdpbmRvdy5sb2cgPSAoeCkgPT4ge1xuXHRcdFx0XHQvLyBpZiAoZyBNc2cgIT09ICcnKSB7IGdNc2cgKz0gJ1xcbic7IGdNc2crPXRpbWUoKSArICcgJyArIHg7IH1cblx0XHRcdFx0Y29uc29sZS5sb2coeCk7XG5cdFx0XHR9O1xuXHRcdFx0d2luZG93LmVycmxvZyA9ICh4KSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtQb3B1cHNdICR7eH1gKTtcblx0XHRcdH07XG5cdFx0XHRsb2coJ0luaXRpYWxpemluZyBsb2dnZXInKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2luZG93LmxvZyA9ICgpID0+IHt9O1xuXHRcdFx0d2luZG93LmVycmxvZyA9ICgpID0+IHt9O1xuXHRcdH1cblx0fTtcblx0Ly8gRU5ERklMRTogZGVidWcuanNcblx0Ly8gU1RBUlRGSUxFOiBpbWFnZXMuanNcblx0Ly8gbG9hZCBpbWFnZSBvZiB0eXBlIFRpdGxlLlxuXHRjb25zdCBsb2FkSW1hZ2UgPSAoaW1hZ2UsIG5hdnBvcCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgaW1hZ2Uuc3RyaXBOYW1lc3BhY2UgIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdG13Lm5vdGlmeSgnbG9hZEltYWdlcyBiYWQnLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ2Vycm9yJ30pO1xuXHRcdH1cblx0XHQvLyBBUEkgY2FsbCB0byByZXRyaWV2ZSBpbWFnZSBpbmZvLlxuXHRcdGlmICghZ2V0VmFsdWVPZigncG9wdXBJbWFnZXMnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIWlzVmFsaWRJbWFnZU5hbWUoaW1hZ2UudG9TdHJpbmcoKSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgYXJ0ID0gaW1hZ2UudXJsU3RyaW5nKCk7XG5cdFx0bGV0IHVybCA9IGAke3BnLndpa2kuYXBpd2lraWJhc2V9P2Zvcm1hdD1qc29uJmZvcm1hdHZlcnNpb249MiZhY3Rpb249cXVlcnlgO1xuXHRcdHVybCArPSBgJnByb3A9aW1hZ2VpbmZvJmlpcHJvcD11cmx8bWltZSZpaXVybHdpZHRoPSR7Z2V0VmFsdWVPZigncG9wdXBJbWFnZVNpemVMYXJnZScpfWA7XG5cdFx0dXJsICs9IGAmdGl0bGVzPSR7YXJ0fWA7XG5cdFx0cGVuZGluZ05hdnBvcFRhc2sobmF2cG9wKTtcblx0XHRjb25zdCBjYWxsYmFjayA9IChkKSA9PiB7XG5cdFx0XHRwb3B1cHNJbnNlcnRJbWFnZShuYXZwb3AuaWROdW1iZXIsIG5hdnBvcCwgZCk7XG5cdFx0fTtcblx0XHRjb25zdCBnbyA9ICgpID0+IHtcblx0XHRcdGdldFBhZ2VXaXRoQ2FjaGluZyh1cmwsIGNhbGxiYWNrLCBuYXZwb3ApO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0XHRpZiAobmF2cG9wLnZpc2libGUgfHwgIWdldFZhbHVlT2YoJ3BvcHVwTGF6eURvd25sb2FkcycpKSB7XG5cdFx0XHRnbygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuYXZwb3AuYWRkSG9vayhnbywgJ3VuaGlkZScsICdhZnRlcicsICdET1dOTE9BRF9JTUFHRV9RVUVSWV9EQVRBJyk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBwb3B1cHNJbnNlcnRJbWFnZSA9IChpZCwgX25hdnBvcCwgZG93bmxvYWQpID0+IHtcblx0XHRsb2coJ3BvcHVwc0luc2VydEltYWdlJyk7XG5cdFx0bGV0IGltYWdlaW5mbztcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QganNPYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHRcdGNvbnN0IGltYWdlcGFnZSA9IGFueUNoaWxkKGpzT2JqLnF1ZXJ5LnBhZ2VzKTtcblx0XHRcdGlmIChpbWFnZXBhZ2UuaW1hZ2VpbmZvID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0W2ltYWdlaW5mb10gPSBpbWFnZXBhZ2UuaW1hZ2VpbmZvO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0bG9nKCdwb3B1cHNJbnNlcnRJbWFnZSBmYWlsZWQgOignKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcG9wdXBJbWFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNwb3B1cEltZyR7aWR9YCk7XG5cdFx0aWYgKCFwb3B1cEltYWdlKSB7XG5cdFx0XHRsb2coJ2NvdWxkIG5vdCBmaW5kIGluc2VydGlvbiBwb2ludCBmb3IgaW1hZ2UnKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cG9wdXBJbWFnZS53aWR0aCA9IGdldFZhbHVlT2YoJ3BvcHVwSW1hZ2VTaXplJyk7XG5cdFx0cG9wdXBJbWFnZS5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7XG5cdFx0Ly8gU2V0IHRoZSBzb3VyY2UgZm9yIHRoZSBpbWFnZS5cblx0XHRpZiAoaW1hZ2VpbmZvLnRodW1idXJsKSB7XG5cdFx0XHRwb3B1cEltYWdlLnNyYyA9IGltYWdlaW5mby50aHVtYnVybDtcblx0XHR9IGVsc2UgaWYgKGltYWdlaW5mby5taW1lLmluZGV4T2YoJ2ltYWdlJykgPT09IDApIHtcblx0XHRcdHBvcHVwSW1hZ2Uuc3JjID0gaW1hZ2VpbmZvLnVybDtcblx0XHRcdGxvZygnYSB0aHVtYiBjb3VsZCBub3QgYmUgZm91bmQsIHVzaW5nIG9yaWdpbmFsIGltYWdlJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxvZyhcImZ1bGxzaXplIGltYWdldGh1bWIsIGJ1dCBub3Qgc3VyZSBpZiBpdCdzIGFuIGltYWdlXCIpO1xuXHRcdH1cblx0XHRjb25zdCBhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3BvcHVwSW1hZ2VMaW5rJHtpZH1gKTtcblx0XHRpZiAoYSA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8vIERldGVybWluZSB0aGUgYWN0aW9uIG9mIHRoZSBzdXJyb3VkaW5nIGltYWdlbGluay5cblx0XHRzd2l0Y2ggKGdldFZhbHVlT2YoJ3BvcHVwVGh1bWJBY3Rpb24nKSkge1xuXHRcdFx0Y2FzZSAnaW1hZ2VwYWdlJzpcblx0XHRcdFx0aWYgKHBnLmN1cnJlbnQuYXJ0aWNsZS5uYW1lc3BhY2VJZCgpICE9PSBwZy5uc0ltYWdlSWQpIHtcblx0XHRcdFx0XHRhLmhyZWYgPSBpbWFnZWluZm8uZGVzY3JpcHRpb251cmw7XG5cdFx0XHRcdFx0Ly8gRklYTUU6IHVucmVsaWFibGUgcGcuaWROdW1iZXJcblx0XHRcdFx0XHRwb3BUaXBzU29vbkZuKGBwb3B1cEltYWdlJHtpZH1gKSgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICdzaXpldG9nZ2xlJzpcblx0XHRcdFx0YS5vbmNsaWNrID0gdG9nZ2xlU2l6ZTtcblx0XHRcdFx0YS50aXRsZSA9IHBvcHVwU3RyaW5nKCdUb2dnbGUgaW1hZ2Ugc2l6ZScpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHRjYXNlICdsaW5rZnVsbCc6XG5cdFx0XHRcdGEuaHJlZiA9IGltYWdlaW5mby51cmw7XG5cdFx0XHRcdGEudGl0bGUgPSBwb3B1cFN0cmluZygnT3BlbiBmdWxsLXNpemUgaW1hZ2UnKTtcblx0XHR9XG5cdH07XG5cdC8vIFRvZ2dsZXMgdGhlIGltYWdlIGJldHdlZW4gaW5saW5lIHNtYWxsIGFuZCBuYXZwb3AgZnVsbHdpZHRoLlxuXHQvLyBJdCdzIHRoZSBzYW1lIGltYWdlLCBubyBhY3R1YWwgc2l6ZWNoYW5nZSBvY2N1cnMsIG9ubHkgZGlzcGxheSB3aWR0aC5cblx0Y29uc3QgdG9nZ2xlU2l6ZSA9IGZ1bmN0aW9uIHRvZ2dsZVNpemUoKSB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0aWYgKCFzZWxmKSB7XG5cdFx0XHRtdy5ub3RpZnkoJ3NlbGYgaXMgbnVsbCA6LycsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGltZyA9IHNlbGYuZmlyc3RDaGlsZDtcblx0XHRpZiAoIWltZykge1xuXHRcdFx0bXcubm90aWZ5KCdpbWcgaXMgbnVsbCA6LycsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGltZy5zdHlsZS53aWR0aCA9ICFpbWcuc3R5bGUud2lkdGggfHwgaW1nLnN0eWxlLndpZHRoID09PSAnJyA/ICcxMDAlJyA6ICcnO1xuXHR9O1xuXHQvLyBSZXR1cm5zIG9uZSB0aXRsZSBvZiBhbiBpbWFnZSBmcm9tIHdpa2lUZXh0LlxuXHRjb25zdCBnZXRWYWxpZEltYWdlRnJvbVdpa2lUZXh0ID0gKHdpa2lUZXh0KSA9PiB7XG5cdFx0Ly8gbmIgaW4gcGcucmUuaW1hZ2Ugd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgc2Vjb25kIGJyYWNrZXRlZCBleHByZXNzaW9uXG5cdFx0Ly8gdGhpcyBtYXkgY2hhbmdlIGlmIHRoZSByZWdleCBjaGFuZ2VzIDotKFxuXHRcdC8vIGxldCBtYXRjaD1wZy5yZS5pbWFnZS5leGVjKHdpa2lUZXh0KTtcblx0XHRsZXQgbWF0Y2hlZDtcblx0XHRsZXQgbWF0Y2g7XG5cdFx0Ly8gc3RyaXAgaHRtbCBjb21tZW50cywgdXNlZCBieSBldmlsIGJvdHMgOi0oXG5cdFx0Y29uc3QgdCA9IHJlbW92ZU1hdGNoZXNVbmxlc3Mod2lraVRleHQsIC8oPCEtLVtcXFNcXHNdKj8tLT4pLywgMSwgL148IS0tW15bXSpwb3B1cC9pKTtcblx0XHR3aGlsZSAoKG1hdGNoID0gcGcucmUuaW1hZ2UuZXhlYyh0KSkgIT09IG51bGwpIHtcblx0XHRcdC8vIG5vdyBmaW5kIGEgc2FuZSBpbWFnZSBuYW1lIC0gZXhjbHVkZSB0ZW1wbGF0ZXMgYnkgc2Vla2luZyB7XG5cdFx0XHRjb25zdCBtID0gbWF0Y2hbMl0gfHwgbWF0Y2hbNl07XG5cdFx0XHRpZiAoaXNWYWxpZEltYWdlTmFtZShtKSkge1xuXHRcdFx0XHRtYXRjaGVkID0gbTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHBnLnJlLmltYWdlLmxhc3RJbmRleCA9IDA7XG5cdFx0aWYgKCFtYXRjaGVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIGAke213LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW3BnLm5zSW1hZ2VJZF19OiR7dXBjYXNlRmlyc3QobWF0Y2hlZCl9YDtcblx0fTtcblx0Y29uc3QgcmVtb3ZlTWF0Y2hlc1VubGVzcyA9IChzdHIsIHJlMSwgcGFyZW5jb3VudCwgcmUyKSA9PiB7XG5cdFx0Y29uc3Qgc3BsaXQgPSBzdHIuc3BsaXQocmUxKTtcblx0XHRjb25zdCBjID0gcGFyZW5jb3VudCArIDE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKGkgJSBjID09PSAwIHx8IHJlMi50ZXN0KHNwbGl0W2ldKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdHNwbGl0W2ldID0gJyc7XG5cdFx0fVxuXHRcdHJldHVybiBzcGxpdC5qb2luKCcnKTtcblx0fTtcblx0Ly8gRU5ERklMRTogaW1hZ2VzLmpzXG5cdC8vIFNUQVJURklMRTogbmFtZXNwYWNlcy5qc1xuXHQvLyBTZXQgdXAgbmFtZXNwYWNlcyBhbmQgb3RoZXIgbm9uLXN0cmluZ3MuanMgbG9jYWxpemF0aW9uXG5cdC8vIChjdXJyZW50bHkgdGhhdCBtZWFucyByZWRpcnMgdG9vKVxuXHRjb25zdCBzZXROYW1lc3BhY2VzID0gKCkgPT4ge1xuXHRcdHBnLm5zU3BlY2lhbElkID0gLTE7XG5cdFx0cGcubnNNYWluc3BhY2VJZCA9IDA7XG5cdFx0cGcubnNJbWFnZUlkID0gNjtcblx0XHRwZy5uc1VzZXJJZCA9IDI7XG5cdFx0cGcubnNVc2VydGFsa0lkID0gMztcblx0XHRwZy5uc0NhdGVnb3J5SWQgPSAxNDtcblx0XHRwZy5uc1RlbXBsYXRlSWQgPSAxMDtcblx0fTtcblx0Y29uc3Qgc2V0UmVkaXJzID0gKCkgPT4ge1xuXHRcdGNvbnN0IHIgPSAncmVkaXJlY3QnO1xuXHRcdGNvbnN0IFIgPSAnUkVESVJFQ1QnO1xuXHRcdGNvbnN0IHJlZGlyTGlzdHMgPSB7XG5cdFx0XHRhcjogW1IsICfYqtit2YjZitmEJ10sXG5cdFx0XHRiZTogW3IsICfQv9C10YDQsNC90LDQutGW0YDQsNCy0LDQvdGM0L3QtSddLFxuXHRcdFx0Ymc6IFtyLCAn0L/RgNC10L3QsNGB0L7Rh9Cy0LDQvdC1JywgJ9Cy0LjQtiddLFxuXHRcdFx0YnM6IFtyLCAnUHJldXNtamVyaScsICdwcmV1c21qZXJpJywgJ1BSRVVTTUpFUkknXSxcblx0XHRcdGJuOiBbUiwgJ+CmquCngeCmqOCmsOCnjeCmqOCmv+CmsOCnjeCmpuCnh+CmtiddLFxuXHRcdFx0Y3M6IFtSLCAnUMWYRVNNxJpSVUonXSxcblx0XHRcdGN5OiBbciwgJ2FpbC1jeWZlaXJpbyddLFxuXHRcdFx0ZGU6IFtSLCAnV0VJVEVSTEVJVFVORyddLFxuXHRcdFx0ZWw6IFtSLCAnzpHOnc6RzprOkc6kzpXOpc6YzqXOnc6jzpcnXSxcblx0XHRcdGVvOiBbUiwgJ0FMSURJUkVLVFUnLCAnQUxJRElSRUtUSSddLFxuXHRcdFx0ZXM6IFtSLCAnUkVESVJFQ0NJw5NOJ10sXG5cdFx0XHRldDogW3IsICdzdXVuYSddLFxuXHRcdFx0Z2E6IFtyLCAnYXRoc2hlb2xhZGgnXSxcblx0XHRcdGdsOiBbciwgJ1JFRElSRUNDScOTTicsICdSRURJUkVDSU9OQU1FTlRPJ10sXG5cdFx0XHRoZTogW1IsICfXlNek16DXmdeUJ10sXG5cdFx0XHRodTogW1IsICfDgVRJUsOBTlnDjVTDgVMnXSxcblx0XHRcdGlzOiBbciwgJ3RpbHbDrXN1bicsICdUSUxWw41TVU4nXSxcblx0XHRcdGl0OiBbUiwgJ1JJTlZJQScsICdSaW52aWEnXSxcblx0XHRcdGphOiBbUiwgJ+i7oumAgSddLFxuXHRcdFx0bWs6IFtyLCAn0L/RgNC10L3QsNGB0L7Rh9GD0LLQsNGa0LUnLCAn0LLQuNC00LgnXSxcblx0XHRcdG5kczogW3IsICd3aWVkZXJsZWlkZW4nXSxcblx0XHRcdCduZHMtbmwnOiBbUiwgJ0RFVVJWRVJXSUVaSU5HJywgJ0RVVVJWRVJXSUVaSU5HJ10sXG5cdFx0XHRubDogW1IsICdET09SVkVSV0lKWklORyddLFxuXHRcdFx0bm46IFtyLCAnb21kaXJpZ2VyJ10sXG5cdFx0XHRwbDogW1IsICdQQVRSWicsICdQUlpFS0lFUlVKJywgJ1RBTSddLFxuXHRcdFx0cHQ6IFtSLCAncmVkaXInXSxcblx0XHRcdHJ1OiBbUiwgJ9Cf0JXQoNCV0J3QkNCf0KDQkNCS0JvQldCd0JjQlScsICfQn9CV0KDQldCd0JDQn9CgJ10sXG5cdFx0XHRzazogW3IsICdwcmVzbWVydWonXSxcblx0XHRcdHNyOiBbciwgJ9Cf0YDQtdGD0YHQvNC10YDQuCcsICfQv9GA0LXRg9GB0LzQtdGA0LgnLCAn0J/QoNCV0KPQodCc0JXQoNCYJywgJ1ByZXVzbWVyaScsICdwcmV1c21lcmknLCAnUFJFVVNNRVJJJ10sXG5cdFx0XHR0dDogW1IsICd5w7xuw6RsdMO8JywgJ9C/0LXRgNC10L3QsNC/0YDQsNCy0LvQtdC90LjQtScsICfQv9C10YDQtdC90LDQv9GAJ10sXG5cdFx0XHR1azogW1IsICfQn9CV0KDQldCd0JDQn9Cg0JDQktCb0JXQndCd0K8nLCAn0J/QldCg0JXQndCQ0J/QoCddLFxuXHRcdFx0dmk6IFtyLCAnxJHhu5VpJ10sXG5cdFx0XHR5aTogW1IsICfXldeV15nXmdeY16LXqNek15nXqNefJ10sXG5cdFx0XHR6aDogW1IsICfph43lrprlkJEnXSwgLy8gbm8gY29tbWFcblx0XHR9O1xuXHRcdGNvbnN0IHJlZGlyTGlzdCA9IHJlZGlyTGlzdHNbcGcud2lraS5sYW5nXSB8fCBbciwgUl07XG5cdFx0Ly8gTWVkaWF3aWtpIGlzIHZlcnkgdG9sZXJhbnQgYWJvdXQgd2hhdCBjb21lcyBhZnRlciB0aGUgI3JlZGlyZWN0IGF0IHRoZSBzdGFydFxuXHRcdHBnLnJlLnJlZGlyZWN0ID0gbmV3IFJlZ0V4cChcblx0XHRcdGBeXFxcXHMqWyNdKCR7cmVkaXJMaXN0LmpvaW4oJ3wnKX0pLio/XFxcXFt7Mn0oW15cXFxcfFxcXFxdXSopKHxbXlxcXFxdXSopP1xcXFxdezJ9XFxcXHMqKC4qKWAsXG5cdFx0XHQnaSdcblx0XHQpO1xuXHR9O1xuXHRjb25zdCBzZXRJbnRlcndpa2kgPSAoKSA9PiB7XG5cdFx0aWYgKHBnLndpa2kud2lraW1lZGlhKSB7XG5cdFx0XHQvLyBGcm9tIHtAbGluayBodHRwczovL21ldGEud2lraW1lZGlhLm9yZy93aWtpL0xpc3Rfb2ZfV2lraXBlZGlhc31cblx0XHRcdC8vIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvdy9hcGkucGhwP2FjdGlvbj1zaXRlbWF0cml4JmZvcm1hdD1qc29uJnNtdHlwZT1sYW5ndWFnZSZzbWxhbmdwcm9wPWNvZGUmZm9ybWF0dmVyc2lvbj0yfVxuXHRcdFx0cGcud2lraS5pbnRlcndpa2kgPVxuXHRcdFx0XHQnYWF8YWJ8YWNlfGFmfGFrfGFsc3xhbXxhbnxhbmd8YXJ8YXJjfGFyenxhc3xhc3R8YXZ8YXl8YXp8YmF8YmFyfGJhdC1zbWd8YmNsfGJlfGJlLXgtb2xkfGJnfGJofGJpfGJqbnxibXxibnxib3xicHl8YnJ8YnN8YnVnfGJ4cnxjYXxjYmstemFtfGNkb3xjZXxjZWJ8Y2h8Y2hvfGNocnxjaHl8Y2tifGNvfGNyfGNyaHxjc3xjc2J8Y3V8Y3Z8Y3l8ZGF8ZGV8ZGlxfGRzYnxkdnxkenxlZXxlbHxlbWx8ZW58ZW98ZXN8ZXR8ZXV8ZXh0fGZhfGZmfGZpfGZpdS12cm98Zmp8Zm98ZnJ8ZnJwfGZycnxmdXJ8Znl8Z2F8Z2FnfGdhbnxnZHxnbHxnbGt8Z258Z290fGd1fGd2fGhhfGhha3xoYXd8aGV8aGl8aGlmfGhvfGhyfGhzYnxodHxodXxoeXxoenxpYXxpZHxpZXxpZ3xpaXxpa3xpbG98aW98aXN8aXR8aXV8amF8amJvfGp2fGthfGthYXxrYWJ8a2JkfGtnfGtpfGtqfGtrfGtsfGttfGtufGtvfGtvaXxrcnxrcmN8a3N8a3NofGt1fGt2fGt3fGt5fGxhfGxhZHxsYnxsYmV8bGd8bGl8bGlqfGxtb3xsbnxsb3xsdHxsdGd8bHZ8bWFwLWJtc3xtZGZ8bWd8bWh8bWhyfG1pfG1rfG1sfG1ufG1vfG1yfG1yanxtc3xtdHxtdXN8bXdsfG15fG15dnxtem58bmF8bmFofG5hcHxuZHN8bmRzLW5sfG5lfG5ld3xuZ3xubHxubnxub3xub3Z8bnJtfG52fG55fG9jfG9tfG9yfG9zfHBhfHBhZ3xwYW18cGFwfHBjZHxwZGN8cGZsfHBpfHBpaHxwbHxwbXN8cG5ifHBudHxwc3xwdHxxdXxybXxybXl8cm58cm98cm9hLXJ1cHxyb2EtdGFyYXxydXxydWV8cnd8c2F8c2FofHNjfHNjbnxzY298c2R8c2V8c2d8c2h8c2l8c2ltcGxlfHNrfHNsfHNtfHNufHNvfHNxfHNyfHNybnxzc3xzdHxzdHF8c3V8c3Z8c3d8c3psfHRhfHRlfHRldHx0Z3x0aHx0aXx0a3x0bHx0bnx0b3x0cGl8dHJ8dHN8dHR8dHVtfHR3fHR5fHVkbXx1Z3x1a3x1cnx1enx2ZXx2ZWN8dml8dmxzfHZvfHdhfHdhcnx3b3x3dXV8eGFsfHhofHlpfHlvfHphfHplYXx6aHx6aC1jbGFzc2ljYWx8emgtbWluLW5hbnx6aC15dWV8enUnO1xuXHRcdFx0cGcucmUuaW50ZXJ3aWtpID0gbmV3IFJlZ0V4cChgXiR7cGcud2lraS5pbnRlcndpa2l9OmApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwZy53aWtpLmludGVyd2lraSA9IG51bGw7XG5cdFx0XHRwZy5yZS5pbnRlcndpa2kgPSAvXiQvO1xuXHRcdH1cblx0fTtcblx0Ly8gcmV0dXJuIGEgcmVnZXhwIHBhdHRlcm4gbWF0Y2hpbmcgYWxsIHZhcmlhbnRzIHRvIHdyaXRlIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0Y29uc3QgbnNSZSA9IChuYW1lc3BhY2VJZCkgPT4ge1xuXHRcdGNvbnN0IGltYWdlTmFtZXNwYWNlVmFyaWFudHMgPSBbXTtcblx0XHRmb3IgKGNvbnN0IFtfbG9jYWxpemVkTmFtZXNwYWNlTGMsIF9uYW1lc3BhY2VJZF0gb2YgT2JqZWN0LmVudHJpZXMobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKSkpIHtcblx0XHRcdGlmIChfbmFtZXNwYWNlSWQgIT09IG5hbWVzcGFjZUlkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbG9jYWxpemVkTmFtZXNwYWNlTGMgPSB1cGNhc2VGaXJzdChfbG9jYWxpemVkTmFtZXNwYWNlTGMpO1xuXHRcdFx0aW1hZ2VOYW1lc3BhY2VWYXJpYW50cy5wdXNoKFxuXHRcdFx0XHRtdy51dGlsLmVzY2FwZVJlZ0V4cChsb2NhbGl6ZWROYW1lc3BhY2VMYykuc3BsaXQoJyAnKS5qb2luKCdbIF9dJyksXG5cdFx0XHRcdG13LnV0aWwuZXNjYXBlUmVnRXhwKGVuY29kZVVSSShsb2NhbGl6ZWROYW1lc3BhY2VMYykpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYCg/OiR7aW1hZ2VOYW1lc3BhY2VWYXJpYW50cy5qb2luKCd8Jyl9KWA7XG5cdH07XG5cdGNvbnN0IG5zUmVJbWFnZSA9ICgpID0+IHtcblx0XHRyZXR1cm4gbnNSZShwZy5uc0ltYWdlSWQpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBuYW1lc3BhY2VzLmpzXG5cdC8vIFNUQVJURklMRTogc2VscG9wLmpzXG5cdGNvbnN0IGdldEVkaXRib3hTZWxlY3Rpb24gPSAoKSA9PiB7XG5cdFx0Ly8gc2VlIHtAbGluayBodHRwOi8vd3d3LndlYmd1cnVzZm9ydW0uY29tLzgvMTIvMH1cblx0XHRsZXQgZWRpdGJveDtcblx0XHR0cnkge1xuXHRcdFx0ZWRpdGJveCA9IGRvY3VtZW50LmVkaXRmb3JtLndwVGV4dGJveDE7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIElFLCBPcGVyYVxuXHRcdGlmIChkb2N1bWVudC5zZWxlY3Rpb24pIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0O1xuXHRcdH1cblx0XHQvLyBNb3ppbGxhXG5cdFx0Y29uc3Qgc2VsU3RhcnQgPSBlZGl0Ym94LnNlbGVjdGlvblN0YXJ0O1xuXHRcdGNvbnN0IHNlbEVuZCA9IGVkaXRib3guc2VsZWN0aW9uRW5kO1xuXHRcdHJldHVybiBlZGl0Ym94LnZhbHVlLnN1YnN0cmluZyhzZWxTdGFydCwgc2VsRW5kKTtcblx0fTtcblx0Y29uc3QgZG9TZWxlY3Rpb25Qb3B1cCA9ICgpID0+IHtcblx0XHQvLyBwb3B1cCBpZiB0aGUgc2VsZWN0aW9uIGxvb2tzIGxpa2UgW1tmb298YW55dGhpbmcgYWZ0ZXJ3YXJkcyBhdCBhbGxcblx0XHQvLyBvciBbW2Zvb3xiYXJdXXRleHQgd2l0aG91dCAnXV0nXG5cdFx0Ly8gb3IgW1tmb298YmFyXV1cblx0XHRjb25zdCBzZWwgPSBnZXRFZGl0Ym94U2VsZWN0aW9uKCk7XG5cdFx0Y29uc3Qgb3BlbiA9IHNlbC5pbmRleE9mKCdbWycpO1xuXHRcdGNvbnN0IHBpcGUgPSBzZWwuaW5kZXhPZignfCcpO1xuXHRcdGNvbnN0IGNsb3NlID0gc2VsLmluZGV4T2YoJ11dJyk7XG5cdFx0aWYgKG9wZW4gPT09IC0xIHx8IChwaXBlID09PSAtMSAmJiBjbG9zZSA9PT0gLTEpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICgocGlwZSAhPT0gLTEgJiYgb3BlbiA+IHBpcGUpIHx8IChjbG9zZSAhPT0gLTEgJiYgb3BlbiA+IGNsb3NlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBhcnRpY2xlID0gbmV3IFRpdGxlKHNlbC5zdWJzdHJpbmcob3BlbiArIDIsIHBpcGUgPCAwID8gY2xvc2UgOiBwaXBlKSk7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwT25FZGl0U2VsZWN0aW9uJykgPT09ICdib3hwcmV2aWV3Jykge1xuXHRcdFx0cmV0dXJuIGRvU2VwYXJhdGVTZWxlY3Rpb25Qb3B1cChzZWwsIGFydGljbGUpO1xuXHRcdH1cblx0XHRpZiAoY2xvc2UgPiAwICYmIHNlbC5zbGljZShNYXRoLm1heCgwLCBjbG9zZSArIDIpKS5pbmNsdWRlcygnW1snKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdGEuaHJlZiA9IHBnLndpa2kudGl0bGViYXNlICsgYXJ0aWNsZS51cmxTdHJpbmcoKTtcblx0XHRtb3VzZU92ZXJXaWtpTGluazIoYSk7XG5cdFx0aWYgKGEubmF2cG9wdXApIHtcblx0XHRcdGEubmF2cG9wdXAuYWRkSG9vayhcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJ1blN0b3BQb3B1cFRpbWVyKGEubmF2cG9wdXApO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQndW5oaWRlJyxcblx0XHRcdFx0J2FmdGVyJ1xuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGRvU2VwYXJhdGVTZWxlY3Rpb25Qb3B1cCA9IChzdHIsIGFydGljbGUpID0+IHtcblx0XHRsZXQgZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlbGVjdGlvblByZXZpZXcnKTtcblx0XHRpZiAoIWRpdikge1xuXHRcdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRkaXYuaWQgPSAnc2VsZWN0aW9uUHJldmlldyc7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBib3ggPSBkb2N1bWVudC5lZGl0Zm9ybS53cFRleHRib3gxO1xuXHRcdFx0XHRib3gucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBib3gpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgcCA9IHByZXBQcmV2aWV3bWFrZXIoc3RyLCBhcnRpY2xlLCBuZXdOYXZwb3B1cChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyksIGFydGljbGUpKTtcblx0XHRwLm1ha2VQcmV2aWV3KCk7XG5cdFx0aWYgKHAuaHRtbCkge1xuXHRcdFx0ZGl2LmlubmVySFRNTCA9IHAuaHRtbDtcblx0XHR9XG5cdFx0ZGl2LnJhblNldHVwVG9vbHRpcHNBbHJlYWR5ID0gZmFsc2U7XG5cdFx0cG9wVGlwc1Nvb25Gbignc2VsZWN0aW9uUHJldmlldycpKCk7XG5cdH07XG5cdC8vIEVOREZJTEU6IHNlbHBvcC5qc1xuXHQvLyBTVEFSVEZJTEU6IG5hdnBvcHVwLmpzXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3ICBEZWZpbmVzIHR3byBjbGFzc2VzOiB7QHNvdXJjZSBOYXZwb3B1cH0gYW5kIHtAc291cmNlIE1vdXNldHJhY2tlcn0uXG5cdCAqXG5cdCAqIDxjb2RlPk5hdnBvcHVwPC9jb2RlPiBkZXNjcmliZXMgcG9wdXBzOiB3aGVuIHRoZXkgYXBwZWFyLCB3aGVyZSwgd2hhdFxuXHQgKiB0aGV5IGxvb2sgbGlrZSBhbmQgc28gb24uXG5cdCAqXG5cdCAqIDxjb2RlPk1vdXNldHJhY2tlcjwvY29kZT4gXCJjYXB0dXJlc1wiIHRoZSBtb3VzZSB1c2luZ1xuXHQgKiA8Y29kZT5kb2N1bWVudC5vbm1vdXNlbW92ZTwvY29kZT4uXG5cdCAqL1xuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBNb3VzZXRyYWNrZXIuXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAY2xhc3MgVGhlIE1vdXNldHJhY2tlciBjbGFzcy4gVGhpcyBtb25pdG9ycyBtb3VzZSBtb3ZlbWVudHMgYW5kIG1hbmFnZXMgYXNzb2NpYXRlZCBob29rcy5cblx0ICovXG5cdGNsYXNzIE1vdXNldHJhY2tlciB7XG5cdFx0Y29uc3RydWN0b3IoKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEludGVydmFsIHRvIHJlZ3VsYXJseSBydW4gdGhlIGhvb2tzIGFueXdheSwgaW4gbWlsbGlzZWNvbmRzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIEludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5sb29wRGVsYXkgPSA0MDA7XG5cdFx0XHQvKipcblx0XHRcdCAqIFRpbWVyIGZvciB0aGUgbG9vcC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBUaW1lclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRpbWVyID0gbnVsbDtcblx0XHRcdC8qKlxuXHRcdFx0ICogRmxhZyAtIGFyZSB3ZSBzd2l0Y2hlZCBvbj9cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBCb29sZWFuXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdFx0XHQvKipcblx0XHRcdCAqIEZsYWcgLSBhcmUgd2UgcHJvYmFibHkgaW5hY2N1cmF0ZSwgaS5lLiBub3QgcmVmbGVjdGluZyB0aGUgYWN0dWFsIG1vdXNlIHBvc2l0aW9uP1xuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmRpcnR5ID0gdHJ1ZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogQXJyYXkgb2YgaG9vayBmdW5jdGlvbnMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEB0eXBlIEFycmF5XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaG9va3MgPSBbXTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQWRkcyBhIGhvb2ssIHRvIGJlIGNhbGxlZCB3aGVuIHdlIGdldCBldmVudHMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGFzXG5cdFx0ICogPGNvZGU+Zih4LHkpPC9jb2RlPi4gSXQgc2hvdWxkIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIGl0XG5cdFx0ICogd2FudHMgdG8gYmUgcmVtb3ZlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuXG5cdFx0ICovXG5cdFx0YWRkSG9vayhmKSB7XG5cdFx0XHR0aGlzLmhvb2tzLnB1c2goZik7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJ1bnMgaG9va3MsIHBhc3NpbmcgdGhlbSB0aGUgeFxuXHRcdCAqIGFuZCB5IGNvb3JkcyBvZiB0aGUgbW91c2UuICBIb29rIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB0cnVlIGFyZVxuXHRcdCAqIHBhc3NlZCB0byB7QHNvdXJjZSBNb3VzZXRyYWNrZXIjcmVtb3ZlSG9va3N9IGZvciByZW1vdmFsLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRydW5Ib29rcygpIHtcblx0XHRcdGlmICghdGhpcy5ob29rcyB8fCB0aGlzLmhvb2tzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBsb2coJ01vdXNldHJhY2tlci5ydW5Ib29rczsgd2UgZ290IHNvbWUgaG9va3MgdG8gcnVuJyk7XG5cdFx0XHRsZXQgcmVtb3ZlID0gZmFsc2U7XG5cdFx0XHRjb25zdCByZW1vdmVPYmogPSB7fTtcblx0XHRcdC8vIHRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGEgTE9UIC1cblx0XHRcdC8vIHByZS1jYWNoZSBzb21lIHZhcmlhYmxlc1xuXHRcdFx0Y29uc3Qge3h9ID0gdGhpcztcblx0XHRcdGNvbnN0IHt5fSA9IHRoaXM7XG5cdFx0XHRjb25zdCBsZW4gPSB0aGlzLmhvb2tzLmxlbmd0aDtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdFx0Ly8gfiBydW4gdGhlIGhvb2sgZnVuY3Rpb24sIGFuZCByZW1vdmUgaXQgaWYgaXQgcmV0dXJucyB0cnVlXG5cdFx0XHRcdGlmICh0aGlzLmhvb2tzW2ldKHgsIHkpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0cmVtb3ZlID0gdHJ1ZTtcblx0XHRcdFx0XHRyZW1vdmVPYmpbaV0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVtb3ZlKSB7XG5cdFx0XHRcdHRoaXMucmVtb3ZlSG9va3MocmVtb3ZlT2JqKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUmVtb3ZlcyBob29rcy5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHJlbW92ZU9iaiBBbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgdGhlIGluZGV4XG5cdFx0ICogbnVtYmVycyBvZiBmdW5jdGlvbnMgZm9yIHJlbW92YWwsIHdpdGggdmFsdWVzIHRoYXQgZXZhbHVhdGUgdG8gdHJ1ZVxuXHRcdCAqL1xuXHRcdHJlbW92ZUhvb2tzKHJlbW92ZU9iaikge1xuXHRcdFx0Y29uc3QgbmV3SG9va3MgPSBbXTtcblx0XHRcdGNvbnN0IGxlbiA9IHRoaXMuaG9va3MubGVuZ3RoO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0XHRpZiAoIXJlbW92ZU9ialtpXSkge1xuXHRcdFx0XHRcdG5ld0hvb2tzLnB1c2godGhpcy5ob29rc1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuaG9va3MgPSBuZXdIb29rcztcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogRXZlbnQgbGlzdGVuZXIgZm9yIG1vdXNlIHdpZ2dsZXMuXG5cdFx0ICogV2Ugc2ltcGx5IGdyYWIgdGhlIGV2ZW50LCBzZXQgeCBhbmQgeSBhbmQgcnVuIHRoZSBob29rcy5cblx0XHQgKiBUaGlzIG1ha2VzIHRoZSBjcHUgYWxsIGhvdCBhbmQgYm90aGVyZWQgOi0oXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgTW91c2Vtb3ZlIGV2ZW50XG5cdFx0ICovXG5cdFx0dHJhY2soZSkge1xuXHRcdFx0Ly8gfiBBcHBhcmVudGx5IHRoaXMgaXMgbmVlZGVkIGluIElFLlxuXHRcdFx0ZSB8fD0gd2luZG93LmV2ZW50O1xuXHRcdFx0bGV0IHg7XG5cdFx0XHRsZXQgeTtcblx0XHRcdGlmIChlKSB7XG5cdFx0XHRcdGlmIChlLnBhZ2VYKSB7XG5cdFx0XHRcdFx0eCA9IGUucGFnZVg7XG5cdFx0XHRcdFx0eSA9IGUucGFnZVk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoZS5jbGllbnRYID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IGxlZnQ7XG5cdFx0XHRcdFx0bGV0IHRvcDtcblx0XHRcdFx0XHRjb25zdCBkb2NFbHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHRcdFx0aWYgKGRvY0VsdCkge1xuXHRcdFx0XHRcdFx0bGVmdCA9IGRvY0VsdC5zY3JvbGxMZWZ0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsZWZ0IHx8PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jykuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5zY3JvbGxMZWZ0IHx8IDA7XG5cdFx0XHRcdFx0aWYgKGRvY0VsdCkge1xuXHRcdFx0XHRcdFx0dG9wID0gZG9jRWx0LnNjcm9sbFRvcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dG9wIHx8PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jykuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LnNjcm9sbFRvcCB8fCAwO1xuXHRcdFx0XHRcdHggPSBlLmNsaWVudFggKyBsZWZ0O1xuXHRcdFx0XHRcdHkgPSBlLmNsaWVudFkgKyB0b3A7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU2V0cyB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBzdG9yZWQgYW5kIHRha2VzIGFwcHJvcHJpYXRlIGFjdGlvbixcblx0XHQgKiBydW5uaW5nIGhvb2tzIGFzIGFwcHJvcHJpYXRlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtJbnRlZ2VyfSB4LCB5IFNjcmVlbiBjb29yZGluYXRlcyB0byBzZXRcblx0XHQgKiBAcGFyYW0ge251bWJlcn0geFxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB5XG5cdFx0ICovXG5cdFx0c2V0UG9zaXRpb24oeCwgeSkge1xuXHRcdFx0dGhpcy54ID0geDtcblx0XHRcdHRoaXMueSA9IHk7XG5cdFx0XHRpZiAodGhpcy5kaXJ0eSB8fCB0aGlzLmhvb2tzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHR0aGlzLmRpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgdGhpcy5sYXN0SG9va194ICE9PSAnbnVtYmVyJykge1xuXHRcdFx0XHR0aGlzLmxhc3RIb29rX3ggPSAtMTAwO1xuXHRcdFx0XHR0aGlzLmxhc3RIb29rX3kgPSAtMTAwO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGRpZmYgPSAodGhpcy5sYXN0SG9va194IC0geCkgKiAodGhpcy5sYXN0SG9va195IC0geSk7XG5cdFx0XHRkaWZmID0gZGlmZiA+PSAwID8gZGlmZiA6IC1kaWZmO1xuXHRcdFx0aWYgKGRpZmYgPiAxKSB7XG5cdFx0XHRcdHRoaXMubGFzdEhvb2tfeCA9IHg7XG5cdFx0XHRcdHRoaXMubGFzdEhvb2tfeSA9IHk7XG5cdFx0XHRcdGlmICh0aGlzLmRpcnR5KSB7XG5cdFx0XHRcdFx0dGhpcy5kaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMucnVuSG9va3MoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTZXRzIHRoaW5ncyBpbiBtb3Rpb24sIHVubGVzcyB0aGV5IGFyZSBhbHJlYWR5IHRoYXQgaXMsIHJlZ2lzdGVyaW5nIGFuIGV2ZW50IGxpc3RlbmVyIG9uXG5cdFx0ICogPGNvZGU+ZG9jdW1lbnQub25tb3VzZW1vdmU8L2NvZGU+LiBBIGhhbGYtaGVhcnRlZCBhdHRlbXB0IGlzIG1hZGUgdG8gcHJlc2VydmUgdGhlIG9sZCBldmVudFxuXHRcdCAqIGxpc3RlbmVyIGlmIHRoZXJlIGlzIG9uZS5cblx0XHQgKi9cblx0XHRlbmFibGUoKSB7XG5cdFx0XHRpZiAodGhpcy5hY3RpdmUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5hY3RpdmUgPSB0cnVlO1xuXHRcdFx0Ly8gfiBTYXZlIHRoZSBjdXJyZW50IGxpc3RlbmVyIGZvciBtb3VzZW1vdmUgZXZlbnRzLiBUaGlzIGlzbid0IHRvb1xuXHRcdFx0Ly8gfiByb2J1c3QsIG9mIGNvdXJzZS5cblx0XHRcdHRoaXMuc2F2ZWRMaXN0ZW5lciA9IGRvY3VtZW50Lm9ubW91c2Vtb3ZlO1xuXHRcdFx0Ly8gfiBHb3R0YSBzYXZlIEB0dHt0aGlzfSBhZ2FpbiBmb3IgdGhlIGNsb3N1cmUsIGFuZCB1c2UgYXBwbHkgZm9yXG5cdFx0XHQvLyB+IHRoZSBtZW1iZXIgZnVuY3Rpb24uXG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gKGUpID0+IHtcblx0XHRcdFx0c2VsZi50cmFjayhlKTtcblx0XHRcdH07XG5cdFx0XHRpZiAodGhpcy5sb29wRGVsYXkpIHtcblx0XHRcdFx0dGhpcy50aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdFx0XHQvLyBsb2coJ2xvb3AgZGVsYXkgaW4gbW91c2V0cmFja2VyIGlzIHdvcmtpbmcnKTtcblx0XHRcdFx0XHRzZWxmLnJ1bkhvb2tzKCk7XG5cdFx0XHRcdH0sIHRoaXMubG9vcERlbGF5KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogRGlzYWJsZXMgdGhlIHRyYWNrZXIsIHJlbW92aW5nIHRoZSBldmVudCBsaXN0ZW5lci5cblx0XHQgKi9cblx0XHRkaXNhYmxlKCkge1xuXHRcdFx0aWYgKCF0aGlzLmFjdGl2ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIHRoaXMuc2F2ZWRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRkb2N1bWVudC5vbm1vdXNlbW92ZSA9IHRoaXMuc2F2ZWRMaXN0ZW5lcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBkb2N1bWVudC5vbm1vdXNlbW92ZTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLnRpbWVyKSB7XG5cdFx0XHRcdGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBOYXZwb3B1cC5cblx0ICogR2V0cyBhIFVJRCBmb3IgdGhlIHBvcHVwIGFuZFxuXHQgKlxuXHQgKiBAcGFyYW0gaW5pdCBDb250cnVjdG9yIG9iamVjdC4gSWYgPGNvZGU+aW5pdC5kcmFnZ2FibGU8L2NvZGU+IGlzIHRydWUgb3IgYWJzZW50LCB0aGUgcG9wdXAgYmVjb21lcyBkcmFnZ2FibGUuXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAY2xhc3MgVGhlIE5hdnBvcHVwIGNsYXNzLiBUaGlzIGdlbmVyYXRlcyBwb3B1cCBoaW50cywgYW5kIGRvZXMgc29tZSBtYW5hZ2VtZW50IG9mIHRoZW0uXG5cdCAqL1xuXHRjbGFzcyBOYXZwb3B1cCB7XG5cdFx0Y29uc3RydWN0b3IoKSB7XG5cdFx0XHQvLyBtdy5ub3RpZnkoJ25ldyBOYXZwb3B1cChpbml0KScsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnd2Fybid9KTtcblx0XHRcdC8qKlxuXHRcdFx0ICogVUlEIGZvciBlYWNoIE5hdnBvcHVwIGluc3RhbmNlLlxuXHRcdFx0ICogUmVhZC1vbmx5LlxuXHRcdFx0ICpcblx0XHRcdCAqIEB0eXBlIGludGVnZXJcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy51aWQgPSBOYXZwb3B1cC51aWQrKztcblx0XHRcdC8qKlxuXHRcdFx0ICogUmVhZC1vbmx5IGZsYWcgZm9yIGN1cnJlbnQgdmlzaWJpbGl0eSBvZiB0aGUgcG9wdXAuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHQvKipcblx0XHRcdCAqIEZsYWcgdG8gYmUgc2V0IHdoZW4gd2Ugd2FudCB0byBjYW5jZWwgYSBwcmV2aW91cyByZXF1ZXN0IHRvXG5cdFx0XHQgKiBzaG93IHRoZSBwb3B1cCBpbiBhIGxpdHRsZSB3aGlsZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLm5vc2hvdyA9IGZhbHNlO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYXRlZ29yaXNlZCBsaXN0IG9mIGhvb2tzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBzZWUgI3J1bkhvb2tzXG5cdFx0XHQgKiBAc2VlICNhZGRIb29rXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUgT2JqZWN0XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaG9va3MgPSB7XG5cdFx0XHRcdGNyZWF0ZTogW10sXG5cdFx0XHRcdHVuaGlkZTogW10sXG5cdFx0XHRcdGhpZGU6IFtdLFxuXHRcdFx0fTtcblx0XHRcdC8qKlxuXHRcdFx0ICogbGlzdCBvZiB1bmlxdWUgSURzIG9mIGhvb2sgZnVuY3Rpb25zLCB0byBhdm9pZCBkdXBsaWNhdGVzXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ob29rSWRzID0ge307XG5cdFx0XHQvKipcblx0XHRcdCAqIExpc3Qgb2YgZG93bmxvYWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9wdXAuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEB0eXBlIEFycmF5XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuZG93bmxvYWRzID0gW107XG5cdFx0XHQvKipcblx0XHRcdCAqIE51bWJlciBvZiB1bmNvbXBsZXRlZCBkb3dubG9hZHMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgaW50ZWdlclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnBlbmRpbmcgPSBudWxsO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUb2xlcmFuY2UgaW4gcGl4ZWxzIHdoZW4gZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIG1vdXNlIGhhcyBsZWZ0IHRoZSBwb3B1cC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBpbnRlZ2VyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuZnV6eiA9IDU7XG5cdFx0XHQvKipcblx0XHRcdCAqIEZsYWcgdG8gdG9nZ2xlIHJ1bm5pbmcge0Bzb3VyY2UgI2xpbWl0SG9yaXpvbnRhbFBvc2l0aW9ufSB0byByZWd1bGF0ZSB0aGUgcG9wdXAncyBwb3NpdGlvbi5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuY29uc3RyYWluZWQgPSB0cnVlO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgcG9wdXAgd2lkdGggaW4gcGl4ZWxzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSBpbnRlZ2VyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMud2lkdGggPSAwO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgcG9wdXAgd2lkdGggaW4gcGl4ZWxzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSBpbnRlZ2VyXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaGVpZ2h0ID0gMDtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIG1haW4gY29udGVudCBESVYgZWxlbWVudC5cblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSBIVE1MRGl2RWxlbWVudFxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLm1haW5EaXYgPSBudWxsO1xuXHRcdFx0dGhpcy5jcmVhdGVNYWluRGl2KCk7XG5cdFx0XHQvL1x0aWYgKCFpbml0IHx8IHR5cGVvZiBpbml0LnBvcHVwc19kcmFnZ2FibGU9PSd1bmRlZmluZWQnIHx8IGluaXQucG9wdXBzX2RyYWdnYWJsZSkge1xuXHRcdFx0Ly9cdFx0dGhpcy5tYWtlRHJhZ2dhYmxlKHRydWUpO1xuXHRcdFx0Ly9cdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUmV0cmlldmVzIHRoZSB7QHNvdXJjZSAjdmlzaWJsZX0gYXR0cmlidXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBvcHVwIGlzIGN1cnJlbnRseSB2aXNpYmxlLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdCAqL1xuXHRcdGlzVmlzaWJsZSgpIHtcblx0XHRcdHJldHVybiB0aGlzLnZpc2libGU7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFJlcG9zaXRpb25zIHBvcHVwIHVzaW5nIENTUyBzdHlsZS5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB4IHgtY29vcmRpbmF0ZSAocHgpXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSB5IHktY29vcmRpbmF0ZSAocHgpXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBub0xpbWl0SG9yIERvbid0IGNhbGwge0Bzb3VyY2UgI2xpbWl0SG9yaXpvbnRhbFBvc2l0aW9ufVxuXHRcdCAqL1xuXHRcdHJlcG9zaXRpb24oeCwgeSwgbm9MaW1pdEhvcikge1xuXHRcdFx0bG9nKGByZXBvc2l0aW9uKCR7eH0sJHt5fSwke25vTGltaXRIb3J9KWApO1xuXHRcdFx0aWYgKHggIT09IHVuZGVmaW5lZCAmJiB4ICE9PSBudWxsKSB7XG5cdFx0XHRcdHRoaXMubGVmdCA9IHg7XG5cdFx0XHR9XG5cdFx0XHRpZiAoeSAhPT0gdW5kZWZpbmVkICYmIHkgIT09IG51bGwpIHtcblx0XHRcdFx0dGhpcy50b3AgPSB5O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMudG9wICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5tYWluRGl2LnN0eWxlLmxlZnQgPSBgJHt0aGlzLmxlZnR9cHhgO1xuXHRcdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUudG9wID0gYCR7dGhpcy50b3B9cHhgO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFub0xpbWl0SG9yKSB7XG5cdFx0XHRcdHRoaXMubGltaXRIb3Jpem9udGFsUG9zaXRpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogUHJldmVudHMgcG9wdXBzIGZyb20gYmVpbmcgaW4gc2lsbHkgbG9jYXRpb25zLiBIb3BlZnVsbHkuXG5cdFx0ICogU2hvdWxkIG5vdCBiZSBydW4gaWYge0Bzb3VyY2UgI2NvbnN0cmFpbmVkfSBpcyB0cnVlLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRsaW1pdEhvcml6b250YWxQb3NpdGlvbigpIHtcblx0XHRcdGlmICghdGhpcy5jb25zdHJhaW5lZCB8fCB0aGlzLnRvb1dpZGUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy51cGRhdGVEaW1lbnNpb25zKCk7XG5cdFx0XHRjb25zdCB4ID0gdGhpcy5sZWZ0O1xuXHRcdFx0Y29uc3QgdyA9IHRoaXMud2lkdGg7XG5cdFx0XHRjb25zdCBjV2lkdGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xpZW50V2lkdGg7XG5cdFx0XHQvL1x0bG9nKCdsaW1pdEhvcml6b250YWxQb3NpdGlvbjogeD0nK3grXG5cdFx0XHQvL1x0XHRcdCcsIHRoaXMubGVmdD0nICsgdGhpcy5sZWZ0ICtcblx0XHRcdC8vXHRcdFx0JywgdGhpcy53aWR0aD0nICsgdGhpcy53aWR0aCArXG5cdFx0XHQvL1x0XHRcdCcsIGNXaWR0aD0nICsgY1dpZHRoKTtcblx0XHRcdGlmIChcblx0XHRcdFx0eCArIHcgPj0gY1dpZHRoIHx8XG5cdFx0XHRcdCh4ID4gMCAmJlxuXHRcdFx0XHRcdHRoaXMubWF4V2lkdGggJiZcblx0XHRcdFx0XHR0aGlzLndpZHRoIDwgdGhpcy5tYXhXaWR0aCAmJlxuXHRcdFx0XHRcdHRoaXMuaGVpZ2h0ID4gdGhpcy53aWR0aCAmJlxuXHRcdFx0XHRcdHggPiBjV2lkdGggLSB0aGlzLm1heFdpZHRoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSB2ZXJ5IG5hc3R5IGhhY2suIFRoZXJlIGhhcyB0byBiZSBhIGJldHRlciB3YXkhXG5cdFx0XHRcdC8vIFdlIGZpbmQgdGhlIFwibmF0dXJhbFwiIHdpZHRoIG9mIHRoZSBkaXYgYnkgcG9zaXRpb25pbmcgaXQgYXQgdGhlIGZhciBsZWZ0XG5cdFx0XHRcdC8vIHRoZW4gcmVzZXQgaXQgc28gdGhhdCBpdCBzaG91bGQgYmUgZmx1c2ggcmlnaHQgKHdlbGwsIG5lYXJseSlcblx0XHRcdFx0dGhpcy5tYWluRGl2LnN0eWxlLmxlZnQgPSAnLTEwMDAwcHgnO1xuXHRcdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUud2lkdGggPSBgJHt0aGlzLm1heFdpZHRofXB4YDtcblx0XHRcdFx0Y29uc3QgbmF0dXJhbFdpZHRoID0gTnVtYmVyLnBhcnNlSW50KHRoaXMubWFpbkRpdi5vZmZzZXRXaWR0aCwgMTApO1xuXHRcdFx0XHRsZXQgbmV3TGVmdCA9IGNXaWR0aCAtIG5hdHVyYWxXaWR0aCAtIDE7XG5cdFx0XHRcdGlmIChuZXdMZWZ0IDwgMCkge1xuXHRcdFx0XHRcdG5ld0xlZnQgPSAwO1xuXHRcdFx0XHRcdHRoaXMudG9vV2lkZSA9IHRydWU7XG5cdFx0XHRcdH0gLy8gc3RpbGwgdW5zdGFibGUgZm9yIHJlYWxseSB3aWRlIHBvcHVwcz9cblx0XHRcdFx0bG9nKFxuXHRcdFx0XHRcdGBsaW1pdEhvcml6b250YWxQb3NpdGlvbjogbW92aW5nIHRvICgke25ld0xlZnR9LCR7dGhpcy50b3B9KTtgICtcblx0XHRcdFx0XHRcdGAgbmF0dXJhbFdpZHRoPSR7bmF0dXJhbFdpZHRofSwgY2xpZW50V2lkdGg9JHtjV2lkdGh9YFxuXHRcdFx0XHQpO1xuXHRcdFx0XHR0aGlzLnJlcG9zaXRpb24obmV3TGVmdCwgbnVsbCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEJyaW5ncyBwb3B1cCB0byB0aGUgdG9wIG9mIHRoZSB6LW9yZGVyLlxuXHRcdCAqIFdlIGluY3JlbWVudCB0aGUge0Bzb3VyY2UgI2hpZ2hlc3R9IHByb3BlcnR5IG9mIHRoZSBjb250cnVjdG9yIGhlcmUuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHJhaXNlKCkge1xuXHRcdFx0dGhpcy5tYWluRGl2LnN0eWxlLnpJbmRleCA9IE5hdnBvcHVwLmhpZ2hlc3QgKyAxO1xuXHRcdFx0KytOYXZwb3B1cC5oaWdoZXN0O1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBTaG93cyB0aGUgcG9wdXAgcHJvdmlkZWQge0Bzb3VyY2UgI25vc2hvd30gaXMgbm90IHRydWUuXG5cdFx0ICogVXBkYXRlcyB0aGUgcG9zaXRpb24sIGJyaW5ncyB0aGUgcG9wdXAgdG8gdGhlIHRvcCBvZiB0aGUgei1vcmRlciBhbmQgdW5oaWRlcyBpdC5cblx0XHQgKi9cblx0XHRzaG93KCkge1xuXHRcdFx0Ly8gZG9jdW1lbnQudGl0bGUrPSdzJztcblx0XHRcdGlmICh0aGlzLm5vc2hvdykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBkb2N1bWVudC50aXRsZSs9J3QnO1xuXHRcdFx0dGhpcy5yZXBvc2l0aW9uKCk7XG5cdFx0XHR0aGlzLnJhaXNlKCk7XG5cdFx0XHR0aGlzLnVuaGlkZSgpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBtb3VzZSBwb2ludGVyIGhhc1xuXHRcdCAqIHN0YWJpbGlzZWQgKGNoZWNraW5nIGV2ZXJ5IDxjb2RlPnRpbWU8L2NvZGU+LzIgbWlsbGlzZWNvbmRzKSBhbmQgcnVucyB0aGVcblx0XHQgKiB7QHNvdXJjZSAjc2hvd30gbWV0aG9kIGlmIGl0IGhhcy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZSBUaGUgbWluaW11bSB0aW1lIChtcykgYmVmb3JlIHRoZSBwb3B1cCBtYXkgYmUgc2hvd24uXG5cdFx0ICovXG5cdFx0c2hvd1Nvb25JZlN0YWJsZSh0aW1lKSB7XG5cdFx0XHRsb2coYHNob3dTb29uSWZTdGFibGUsIHRpbWU9JHt0aW1lfWApO1xuXHRcdFx0aWYgKHRoaXMudmlzaWJsZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm5vc2hvdyA9IGZhbHNlO1xuXHRcdFx0Ly8gfiBpbml0aWFsaXplIHRoZXNlIHZhcmlhYmxlcyBzbyB0aGF0IHdlIG5ldmVyIHJ1biBAdHR7c2hvd30gYWZ0ZXJcblx0XHRcdC8vIH4ganVzdCBoYWxmIHRoZSB0aW1lXG5cdFx0XHR0aGlzLnN0YWJsZV94ID0gLTFlNDtcblx0XHRcdHRoaXMuc3RhYmxlX3kgPSAtMWU0O1xuXHRcdFx0Y29uc3Qgc3RhYmxlU2hvdyA9ICgpID0+IHtcblx0XHRcdFx0bG9nKCdzdGFibGVTaG93IGNhbGxlZCcpO1xuXHRcdFx0XHRjb25zdCBuZXdfeCA9IE5hdnBvcHVwLnRyYWNrZXIueDtcblx0XHRcdFx0Y29uc3QgbmV3X3kgPSBOYXZwb3B1cC50cmFja2VyLnk7XG5cdFx0XHRcdGNvbnN0IGR4ID0gc2VsZi5zdGFibGVfeCAtIG5ld194O1xuXHRcdFx0XHRjb25zdCBkeSA9IHNlbGYuc3RhYmxlX3kgLSBuZXdfeTtcblx0XHRcdFx0Y29uc3QgZnV6ejIgPSAwOyAvLyBzYXZlZFRoaXMuZnV6eiAqIHNhdmVkVGhpcy5mdXp6O1xuXHRcdFx0XHQvLyBkb2N1bWVudC50aXRsZSArPSAnWycgKyBbc2F2ZWRUaGlzLnN0YWJsZV94LG5ld194LCBzYXZlZFRoaXMuc3RhYmxlX3ksbmV3X3ksIGR4LCBkeSwgZnV6ejJdLmpvaW4oJywnKSArICddICc7XG5cdFx0XHRcdGlmIChkeCAqIGR4IDw9IGZ1enoyICYmIGR5ICogZHkgPD0gZnV6ejIpIHtcblx0XHRcdFx0XHRsb2coJ21vdXNlIGlzIHN0YWJsZScpO1xuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwoc2VsZi5zaG93U29vblN0YWJsZVRpbWVyKTtcblx0XHRcdFx0XHRzZWxmLnJlcG9zaXRpb24obmV3X3ggKyAyLCBuZXdfeSArIDIpO1xuXHRcdFx0XHRcdHNlbGYuc2hvdygpO1xuXHRcdFx0XHRcdHNlbGYubGltaXRIb3Jpem9udGFsUG9zaXRpb24oKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c2VsZi5zdGFibGVfeCA9IG5ld194O1xuXHRcdFx0XHRzZWxmLnN0YWJsZV95ID0gbmV3X3k7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0XHR0aGlzLnNob3dTb29uU3RhYmxlVGltZXIgPSBzZXRJbnRlcnZhbChzdGFibGVTaG93LCB0aW1lIC8gMik7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNldHMgdGhlIHtAc291cmNlICNub3Nob3d9IGZsYWcgYW5kIGhpZGVzIHRoZSBwb3B1cC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkXG5cdFx0ICogd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBsaW5rIGJlZm9yZVxuXHRcdCAqIChvciBhZnRlcikgaXQncyBhY3R1YWxseSBiZWVuIGRpc3BsYXllZC5cblx0XHQgKi9cblx0XHRiYW5pc2goKSB7XG5cdFx0XHRsb2coJ2JhbmlzaCBjYWxsZWQnKTtcblx0XHRcdC8vIGhpZGUgYW5kIHByZXZlbnQgc2hvd2luZyB3aXRoIHNob3dTb29uIGluIHRoZSBmdXR1cmVcblx0XHRcdHRoaXMubm9zaG93ID0gdHJ1ZTtcblx0XHRcdGlmICh0aGlzLnNob3dTb29uU3RhYmxlVGltZXIpIHtcblx0XHRcdFx0bG9nKCdjbGVhcmluZyBzaG93U29vblN0YWJsZVRpbWVyJyk7XG5cdFx0XHRcdGNsZWFySW50ZXJ2YWwodGhpcy5zaG93U29vblN0YWJsZVRpbWVyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuaGlkZSgpO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBSdW5zIGhvb2tzIGFkZGVkIHdpdGgge0Bzb3VyY2UgI2FkZEhvb2t9LlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSBuYW1lIG9mIHRoZSB7QHNvdXJjZSAjaG9va3N9IGFycmF5IC0gb25lIG9mICdjcmVhdGUnLCAndW5oaWRlJywgJ2hpZGUnXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHdoZW4gQ29udHJvbHMgZXhhY3RseSB3aGVuIHRoZSBob29rIGlzIHJ1bjogZWl0aGVyICdiZWZvcmUnIG9yICdhZnRlcidcblx0XHQgKi9cblx0XHRydW5Ib29rcyhrZXksIHdoZW4pIHtcblx0XHRcdGlmICghdGhpcy5ob29rc1trZXldKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGtleUhvb2tzID0gdGhpcy5ob29rc1trZXldO1xuXHRcdFx0Y29uc3QgbGVuID0ga2V5SG9va3MubGVuZ3RoO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0XHRpZiAoa2V5SG9va3NbaV0gJiYga2V5SG9va3NbaV0ud2hlbiA9PT0gd2hlbiAmJiBSZWZsZWN0LmFwcGx5KGtleUhvb2tzW2ldLmhvb2ssIHRoaXMsIFtdKSkge1xuXHRcdFx0XHRcdC8vIHJlbW92ZSB0aGUgaG9va1xuXHRcdFx0XHRcdGlmIChrZXlIb29rc1tpXS5ob29rSWQpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLmhvb2tJZHNba2V5SG9va3NbaV0uaG9va0lkXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0a2V5SG9va3NbaV0gPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEFkZHMgYSBob29rIHRvIHRoZSBwb3B1cC4gSG9vayBmdW5jdGlvbnMgYXJlIHJ1biB3aXRoIDxjb2RlPnRoaXM8L2NvZGU+IHNldCB0byByZWZlciB0byB0aGVcblx0XHQgKiBOYXZwb3B1cCBpbnN0YW5jZSwgYW5kIG5vIGFyZ3VtZW50cy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGhvb2sgVGhlIGhvb2sgZnVuY3Rpb24uIEZ1bmN0aW9ucyB0aGF0IHJldHVybiB0cnVlIGFyZSBkZWxldGVkLlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IG5hbWUgb2YgdGhlIHtAc291cmNlICNob29rc30gYXJyYXkgLSBvbmUgb2YgJ2NyZWF0ZScsICd1bmhpZGUnLCAnaGlkZSdcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gd2hlbiBDb250cm9scyBleGFjdGx5IHdoZW4gdGhlIGhvb2sgaXMgcnVuOiBlaXRoZXIgJ2JlZm9yZScgb3IgJ2FmdGVyJ1xuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB1aWQgQSB0cnV0aHkgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBob29rIGZ1bmN0aW9uOyBpZiBpdCBtYXRjaGVzIGFub3RoZXIgaG9va1xuXHRcdCAqIGluIHRoaXMgcG9zaXRpb24sIGl0IHdvbid0IGJlIGFkZGVkIGFnYWluLlxuXHRcdCAqL1xuXHRcdGFkZEhvb2soaG9vaywga2V5LCB3aGVuLCB1aWQpIHtcblx0XHRcdHdoZW4gfHw9ICdhZnRlcic7XG5cdFx0XHRpZiAoIXRoaXMuaG9va3Nba2V5XSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBpZiB1aWQgaXMgc3BlY2lmaWVkLCBkb24ndCBhZGQgZHVwbGljYXRlc1xuXHRcdFx0bGV0IGhvb2tJZDtcblx0XHRcdGlmICh1aWQpIHtcblx0XHRcdFx0aG9va0lkID0gW2tleSwgd2hlbiwgdWlkXS5qb2luKCd8Jyk7XG5cdFx0XHRcdGlmICh0aGlzLmhvb2tJZHNbaG9va0lkXSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmhvb2tJZHNbaG9va0lkXSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmhvb2tzW2tleV0ucHVzaCh7XG5cdFx0XHRcdGhvb2ssXG5cdFx0XHRcdHdoZW4sXG5cdFx0XHRcdGhvb2tJZCxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBDcmVhdGVzIHRoZSBtYWluIERJViBlbGVtZW50LCB3aGljaCBjb250YWlucyBhbGwgdGhlIGFjdHVhbCBwb3B1cCBjb250ZW50LlxuXHRcdCAqIFJ1bnMgaG9va3Mgd2l0aCBrZXkgJ2NyZWF0ZScuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGNyZWF0ZU1haW5EaXYoKSB7XG5cdFx0XHRpZiAodGhpcy5tYWluRGl2KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMucnVuSG9va3MoJ2NyZWF0ZScsICdiZWZvcmUnKTtcblx0XHRcdGNvbnN0IG1haW5EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdFx0bWFpbkRpdi5vbmNsaWNrID0gKGUpID0+IHtcblx0XHRcdFx0c2VsZi5vbmNsaWNrTGlzdGVuZXIoZSk7XG5cdFx0XHR9O1xuXHRcdFx0bWFpbkRpdi5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSA/PyAnbmF2cG9wdXBfbWFpbmRpdic7XG5cdFx0XHRtYWluRGl2LmlkID0gbWFpbkRpdi5jbGFzc05hbWUgKyB0aGlzLnVpZDtcblx0XHRcdG1haW5EaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdFx0bWFpbkRpdi5zdHlsZS5taW5XaWR0aCA9ICczNTBweCc7XG5cdFx0XHRtYWluRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRtYWluRGl2LmNsYXNzTmFtZSA9ICduYXZwb3B1cCc7XG5cdFx0XHQvLyBlYXN5IGFjY2VzcyB0byBqYXZhc2NyaXB0IG9iamVjdCB0aHJvdWdoIERPTSBmdW5jdGlvbnNcblx0XHRcdG1haW5EaXYubmF2cG9wdXAgPSB0aGlzO1xuXHRcdFx0dGhpcy5tYWluRGl2ID0gbWFpbkRpdjtcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5hcHBlbmQobWFpbkRpdik7XG5cdFx0XHR0aGlzLnJ1bkhvb2tzKCdjcmVhdGUnLCAnYWZ0ZXInKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQ2FsbHMgdGhlIHtAc291cmNlICNyYWlzZX0gbWV0aG9kLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRvbmNsaWNrTGlzdGVuZXIoKSB7XG5cdFx0XHR0aGlzLnJhaXNlKCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIE1ha2VzIHRoZSBwb3B1cCBkcmFnZ2FibGUsIHVzaW5nIGEge0Bzb3VyY2UgRHJhZ30gb2JqZWN0LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZU5hbWVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdG1ha2VEcmFnZ2FibGUoaGFuZGxlTmFtZSkge1xuXHRcdFx0aWYgKCF0aGlzLm1haW5EaXYpIHtcblx0XHRcdFx0dGhpcy5jcmVhdGVNYWluRGl2KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBkcmFnID0gbmV3IERyYWcoKTtcblx0XHRcdGlmICghaGFuZGxlTmFtZSkge1xuXHRcdFx0XHRkcmFnLnN0YXJ0Q29uZGl0aW9uID0gKGUpID0+IHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0aWYgKCFlLnNoaWZ0S2V5KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRsZXQgZHJhZ0hhbmRsZTtcblx0XHRcdGlmIChoYW5kbGVOYW1lKSB7XG5cdFx0XHRcdGRyYWdIYW5kbGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtoYW5kbGVOYW1lfWApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFkcmFnSGFuZGxlKSB7XG5cdFx0XHRcdGRyYWdIYW5kbGUgPSB0aGlzLm1haW5EaXY7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzZWxmID0gdGhpcztcblx0XHRcdGRyYWcuZW5kSG9vayA9ICh4LCB5KSA9PiB7XG5cdFx0XHRcdE5hdnBvcHVwLnRyYWNrZXIuZGlydHkgPSB0cnVlO1xuXHRcdFx0XHRzZWxmLnJlcG9zaXRpb24oeCwgeSk7XG5cdFx0XHR9O1xuXHRcdFx0ZHJhZy5pbml0KGRyYWdIYW5kbGUsIHRoaXMubWFpbkRpdik7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEhpZGVzIHRoZSBwb3B1cCB1c2luZyBDU1MuIFJ1bnMgaG9va3Mgd2l0aCBrZXkgJ2hpZGUnLlxuXHRcdCAqIFNldHMge0Bzb3VyY2UgI3Zpc2libGV9IGFwcHJvcHJpYXRlbHkuXG5cdFx0ICoge0Bzb3VyY2UgI2JhbmlzaH0gc2hvdWxkIGJlIGNhbGxlZCBleHRlcm5hbGx5IGluc3RlYWQgb2YgdGhpcyBtZXRob2QuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGhpZGUoKSB7XG5cdFx0XHR0aGlzLnJ1bkhvb2tzKCdoaWRlJywgJ2JlZm9yZScpO1xuXHRcdFx0dGhpcy5hYm9ydERvd25sb2FkcygpO1xuXHRcdFx0aWYgKHRoaXMudmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMudmlzaWJsZSkge1xuXHRcdFx0XHR0aGlzLm1haW5EaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0dGhpcy52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnJ1bkhvb2tzKCdoaWRlJywgJ2FmdGVyJyk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFNob3dzIHRoZSBwb3B1cCB1c2luZyBDU1MuIFJ1bnMgaG9va3Mgd2l0aCBrZXkgJ3VuaGlkZScuXG5cdFx0ICogU2V0cyB7QHNvdXJjZSAjdmlzaWJsZX0gYXBwcm9wcmlhdGVseS4gICB7QHNvdXJjZSAjc2hvd30gc2hvdWxkIGJlIGNhbGxlZCBleHRlcm5hbGx5IGluc3RlYWQgb2YgdGhpcyBtZXRob2QuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHVuaGlkZSgpIHtcblx0XHRcdHRoaXMucnVuSG9va3MoJ3VuaGlkZScsICdiZWZvcmUnKTtcblx0XHRcdGlmICh0aGlzLnZpc2libGUgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy52aXNpYmxlKSB7XG5cdFx0XHRcdHRoaXMubWFpbkRpdi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7XG5cdFx0XHRcdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnJ1bkhvb2tzKCd1bmhpZGUnLCAnYWZ0ZXInKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogU2V0cyB0aGUgPGNvZGU+aW5uZXJIVE1MPC9jb2RlPiBhdHRyaWJ1dGUgb2YgdGhlIG1haW4gZGl2IGNvbnRhaW5pbmcgdGhlIHBvcHVwIGNvbnRlbnQuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCBUaGUgSFRNTCB0byBzZXQuXG5cdFx0ICovXG5cdFx0c2V0SW5uZXJIVE1MKGh0bWwpIHtcblx0XHRcdHRoaXMubWFpbkRpdi5pbm5lckhUTUwgPSBodG1sO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBVcGRhdGVzIHRoZSB7QHNvdXJjZSAjd2lkdGh9IGFuZCB7QHNvdXJjZSAjaGVpZ2h0fSBhdHRyaWJ1dGVzIHdpdGggdGhlIENTUyBwcm9wZXJ0aWVzLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR1cGRhdGVEaW1lbnNpb25zKCkge1xuXHRcdFx0dGhpcy53aWR0aCA9IE51bWJlci5wYXJzZUludCh0aGlzLm1haW5EaXYub2Zmc2V0V2lkdGgsIDEwKTtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gTnVtYmVyLnBhcnNlSW50KHRoaXMubWFpbkRpdi5vZmZzZXRIZWlnaHQsIDEwKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQ2hlY2tzIGlmIHRoZSBwb2ludCAoeCx5KSBpcyB3aXRoaW4ge0Bzb3VyY2UgI2Z1enp9IG9mIHRoZVxuXHRcdCAqIHtAc291cmNlICNtYWluRGl2fS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7aW50ZWdlcn0geCB4LWNvb3JkaW5hdGUgKHB4KVxuXHRcdCAqIEBwYXJhbSB7aW50ZWdlcn0geSB5LWNvb3JkaW5hdGUgKHB4KVxuXHRcdCAqIEB0eXBlIGJvb2xlYW5cblx0XHQgKi9cblx0XHRpc1dpdGhpbih4LCB5KSB7XG5cdFx0XHQvLyB+IElmIHdlJ3JlIG5vdCBldmVuIHZpc2libGUsIG5vIHBvaW50IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzXG5cdFx0XHQvLyB+IGJlaW5nIHdpdGhpbiB0aGUgcG9wdXAuXG5cdFx0XHRpZiAoIXRoaXMudmlzaWJsZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnVwZGF0ZURpbWVuc2lvbnMoKTtcblx0XHRcdGNvbnN0IGZ1enogPSB0aGlzLmZ1enogfHwgMDtcblx0XHRcdC8vIH4gVXNlIGEgc2ltcGxlIGJveCBtZXRyaWMgaGVyZS5cblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHggKyBmdXp6ID49IHRoaXMubGVmdCAmJlxuXHRcdFx0XHR4IC0gZnV6eiA8PSB0aGlzLmxlZnQgKyB0aGlzLndpZHRoICYmXG5cdFx0XHRcdHkgKyBmdXp6ID49IHRoaXMudG9wICYmXG5cdFx0XHRcdHkgLSBmdXp6IDw9IHRoaXMudG9wICsgdGhpcy5oZWlnaHRcblx0XHRcdCk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIEFkZHMgYSBkb3dubG9hZCB0byB7QHNvdXJjZSAjZG93bmxvYWRzfS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RG93bmxvYWRlcn0gZG93bmxvYWRcblx0XHQgKi9cblx0XHRhZGREb3dubG9hZChkb3dubG9hZCkge1xuXHRcdFx0aWYgKCFkb3dubG9hZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRvd25sb2Fkcy5wdXNoKGRvd25sb2FkKTtcblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogQWJvcnRzIHRoZSBkb3dubG9hZHMgbGlzdGVkIGluIHtAc291cmNlICNkb3dubG9hZHN9LlxuXHRcdCAqXG5cdFx0ICogQHNlZSBEb3dubG9hZGVyI2Fib3J0XG5cdFx0ICovXG5cdFx0YWJvcnREb3dubG9hZHMoKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGQgb2YgdGhpcy5kb3dubG9hZHMpIHtcblx0XHRcdFx0aWYgKGQgJiYgZC5hYm9ydCkge1xuXHRcdFx0XHRcdGQuYWJvcnQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5kb3dubG9hZHMgPSBbXTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIEEgVUlEIGZvciBlYWNoIE5hdnBvcHVwLiBUaGlzIGNvbnN0cnVjdG9yIHByb3BlcnR5IGlzIGp1c3QgYSBjb3VudGVyLlxuXHQgKlxuXHQgKiBAdHlwZSBpbnRlZ2VyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHROYXZwb3B1cC51aWQgPSAwO1xuXHQvKipcblx0ICogQ291bnRlciBpbmRpY2F0aW5nIHRoZSB6LW9yZGVyIG9mIHRoZSBcImhpZ2hlc3RcIiBwb3B1cC5cblx0ICogV2Ugc3RhcnQgdGhlIHotaW5kZXggYXQgMTAwMCBzbyB0aGF0IHBvcHVwcyBhcmUgYWJvdmUgZXZlcnl0aGluZ1xuXHQgKiBlbHNlIG9uIHRoZSBzY3JlZW4uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB0eXBlIGludGVnZXJcblx0ICovXG5cdE5hdnBvcHVwLmhpZ2hlc3QgPSAxMDAwO1xuXHQvKipcblx0ICogQSB7QHNvdXJjZSBNb3VzZXRyYWNrZXJ9IGluc3RhbmNlIHdoaWNoIGlzIGEgcHJvcGVydHkgb2YgdGhlIGNvbnN0cnVjdG9yIChwc2V1ZG8tZ2xvYmFsKS5cblx0ICovXG5cdE5hdnBvcHVwLnRyYWNrZXIgPSBuZXcgTW91c2V0cmFja2VyKCk7XG5cdC8vIEVOREZJTEU6IG5hdnBvcHVwLmpzXG5cdC8vIFNUQVJURklMRTogZGlmZi5qc1xuXHQvKipcblx0ICogSmF2YXNjcmlwdCBEaWZmIEFsZ29yaXRobSBCeSBKb2huIFJlc2lnIChodHRwOi8vZWpvaG4ub3JnLykgYW5kIEx1cGluXG5cdCAqXG5cdCAqIE1vcmUgSW5mbzogaHR0cDovL2Vqb2huLm9yZy9wcm9qZWN0cy9qYXZhc2NyaXB0LWRpZmYtYWxnb3JpdGhtL1xuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ1tdfSB4XG5cdCAqL1xuXHRjb25zdCBkZWxGbXQgPSAoeCkgPT4ge1xuXHRcdGlmICh4Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblx0XHRyZXR1cm4gYDxkZWwgY2xhc3M9J3BvcHVwRGlmZic+JHt4LmpvaW4oJycpfTwvZGVsPmA7XG5cdH07XG5cdGNvbnN0IGluc0ZtdCA9ICh4KSA9PiB7XG5cdFx0aWYgKHgubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdHJldHVybiBgPGlucyBjbGFzcz0ncG9wdXBEaWZmJz4ke3guam9pbignJyl9PC9pbnM+YDtcblx0fTtcblx0Y29uc3QgY291bnRDcm9zc2luZ3MgPSAoYSwgYiwgaSwgZWplY3QpID0+IHtcblx0XHQvLyBjb3VudCB0aGUgY3Jvc3NpbmdzIG9uIHRoZSBlZGdlIHN0YXJ0aW5nIGF0IGJbaV1cblx0XHRpZiAoIWJbaV0ucm93ICYmIGJbaV0ucm93ICE9PSAwKSB7XG5cdFx0XHRyZXR1cm4gLTE7XG5cdFx0fVxuXHRcdGxldCBjb3VudCA9IDA7XG5cdFx0Zm9yIChjb25zdCBbaiwgZWxlbWVudF0gb2YgYS5lbnRyaWVzKCkpIHtcblx0XHRcdGlmICghZWxlbWVudC5yb3cgJiYgZWxlbWVudC5yb3cgIT09IDApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoKGogLSBiW2ldLnJvdykgKiAoaSAtIGVsZW1lbnQucm93KSA+IDApIHtcblx0XHRcdFx0aWYgKGVqZWN0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y291bnQrKztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNvdW50O1xuXHR9O1xuXHRjb25zdCBzaG9ydGVuRGlmZlN0cmluZyA9IGZ1bmN0aW9uIHNob3J0ZW5EaWZmU3RyaW5nKHN0ciwgY29udGV4dCkge1xuXHRcdGNvbnN0IHJlID0gLyg8ZGVsW1xcU1xcc10qPzxcXC9kZWw+fDxpbnNbXFxTXFxzXSo/PFxcL2lucz4pLztcblx0XHRjb25zdCBzcGxpdHRlZCA9IHN0ci5zcGxpdChyZSk7XG5cdFx0bGV0IHJldCA9IFsnJ107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdHRlZC5sZW5ndGg7IGkgKz0gMikge1xuXHRcdFx0aWYgKHNwbGl0dGVkW2ldLmxlbmd0aCA8IDIgKiBjb250ZXh0KSB7XG5cdFx0XHRcdHJldFtyZXQubGVuZ3RoIC0gMV0gKz0gc3BsaXR0ZWRbaV07XG5cdFx0XHRcdGlmIChpICsgMSA8IHNwbGl0dGVkLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldFtyZXQubGVuZ3RoIC0gMV0gKz0gc3BsaXR0ZWRbaSArIDFdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0cmV0W3JldC5sZW5ndGggLSAxXSArPSBzcGxpdHRlZFtpXS5zbGljZSgwLCBNYXRoLm1heCgwLCBjb250ZXh0KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGkgKyAxIDwgc3BsaXR0ZWQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goc3BsaXR0ZWRbaV0uc2xpY2UoTWF0aC5tYXgoMCwgc3BsaXR0ZWRbaV0ubGVuZ3RoIC0gY29udGV4dCkpICsgc3BsaXR0ZWRbaSArIDFdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAocmV0Lmxlbmd0aCA+IDAgJiYgIXJldFswXSkge1xuXHRcdFx0cmV0ID0gcmV0LnNsaWNlKDEpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBkaWZmU3RyaW5nID0gKG8sIG4pID0+IHtcblx0XHQvLyAgV2UgbmVlZCB0byBzcGxpdCB0aGUgc3RyaW5ncyBvIGFuZCBuIGZpcnN0LCBhbmQgZW50aWZ5KCkgdGhlIHBhcnRzXG5cdFx0Ly8gIGluZGl2aWR1YWxseSwgc28gdGhhdCB0aGUgSFRNTCBlbnRpdGllcyBhcmUgbmV2ZXIgY3V0IGFwYXJ0LiAoQXhlbEJvbGR0KVxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IG9TcGxpdHRlZCA9IG8uc3BsaXQoL1xcYi8pO1xuXHRcdGNvbnN0IG5TcGxpdHRlZCA9IG4uc3BsaXQoL1xcYi8pO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBvU3BsaXR0ZWQubGVuZ3RoOyArK2kpIHtcblx0XHRcdG9TcGxpdHRlZFtpXSA9IG9TcGxpdHRlZFtpXS5lbnRpZnkoKTtcblx0XHR9XG5cdFx0Zm9yIChpID0gMDsgaSA8IG5TcGxpdHRlZC5sZW5ndGg7ICsraSkge1xuXHRcdFx0blNwbGl0dGVkW2ldID0gblNwbGl0dGVkW2ldLmVudGlmeSgpO1xuXHRcdH1cblx0XHRjb25zdCBvdXQgPSBkaWZmKG9TcGxpdHRlZCwgblNwbGl0dGVkKTtcblx0XHRsZXQgc3RyID0gJyc7XG5cdFx0bGV0IGFjYyA9IFtdOyAvLyBhY2N1bXVsYXRvciBmb3IgcHJldHRpZXIgb3V0cHV0XG5cblx0XHQvLyBjcm9zc2luZyBwYWlyaW5ncyAtLSBlZyAnQSBCJyB2cyAnQiBBJyAtLSBjYXVzZSBwcm9ibGVtcywgc28gbGV0J3MgaXJvbiB0aGVtIG91dFxuXHRcdC8vIHRoaXMgZG9lc24ndCBhbHdheXMgZG8gdGhpbmdzIG9wdGltYWxseSBidXQgaXQgc2hvdWxkIGJlIGZhc3QgZW5vdWdoXG5cdFx0bGV0IG1heE91dHB1dFBhaXIgPSAwO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBvdXQubi5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKG91dC5uW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRpZiAobWF4T3V0cHV0UGFpciA+IG91dC5uW2ldLnJvdykge1xuXHRcdFx0XHRcdC8vIHRhbmdsZSAtIGRlbGV0ZSBwYWlyaW5nXG5cdFx0XHRcdFx0b3V0Lm9bb3V0Lm5baV0ucm93XSA9IG91dC5vW291dC5uW2ldLnJvd10udGV4dDtcblx0XHRcdFx0XHRvdXQubltpXSA9IG91dC5uW2ldLnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG1heE91dHB1dFBhaXIgPCBvdXQubltpXS5yb3cpIHtcblx0XHRcdFx0XHRtYXhPdXRwdXRQYWlyID0gb3V0Lm5baV0ucm93O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIG91dHB1dCB0aGUgc3R1ZmYgcHJlY2VkaW5nIHRoZSBmaXJzdCBwYWlyZWQgb2xkIGxpbmVcblx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0Lm8ubGVuZ3RoICYmICFvdXQub1tpXS5wYWlyZWQ7ICsraSkge1xuXHRcdFx0YWNjLnB1c2gob3V0Lm9baV0pO1xuXHRcdH1cblx0XHRzdHIgKz0gZGVsRm10KGFjYyk7XG5cdFx0YWNjID0gW107XG5cdFx0Ly8gbWFpbiBsb29wXG5cdFx0Zm9yIChpID0gMDsgaSA8IG91dC5uLmxlbmd0aDsgKytpKSB7XG5cdFx0XHQvLyBvdXRwdXQgdW5wYWlyZWQgbmV3IFwibGluZXNcIlxuXHRcdFx0d2hpbGUgKGkgPCBvdXQubi5sZW5ndGggJiYgIW91dC5uW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRhY2MucHVzaChvdXQubltpKytdKTtcblx0XHRcdH1cblx0XHRcdHN0ciArPSBpbnNGbXQoYWNjKTtcblx0XHRcdGFjYyA9IFtdO1xuXHRcdFx0aWYgKGkgPCBvdXQubi5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gdGhpcyBuZXcgXCJsaW5lXCIgaXMgcGFpcmVkIHdpdGggdGhlIChvdXQubltpXS5yb3cpdGggb2xkIFwibGluZVwiXG5cdFx0XHRcdHN0ciArPSBvdXQubltpXS50ZXh0O1xuXHRcdFx0XHQvLyBvdXRwdXQgdW5wYWlyZWQgb2xkIHJvd3Mgc3RhcnRpbmcgYWZ0ZXIgdGhpcyBuZXcgbGluZSdzIHBhcnRuZXJcblx0XHRcdFx0bGV0IG0gPSBvdXQubltpXS5yb3cgKyAxO1xuXHRcdFx0XHR3aGlsZSAobSA8IG91dC5vLmxlbmd0aCAmJiAhb3V0Lm9bbV0ucGFpcmVkKSB7XG5cdFx0XHRcdFx0YWNjLnB1c2gob3V0Lm9bbSsrXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RyICs9IGRlbEZtdChhY2MpO1xuXHRcdFx0XHRhY2MgPSBbXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0cjtcblx0fTtcblx0Ly8gc2VlIHtAbGluayBodHRwOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2U6R2xvYmFsX09iamVjdHM6T2JqZWN0fVxuXHQvLyBGSVhNRTogdXNlIG9iai5oYXNPd25Qcm9wZXJ0eSBpbnN0ZWFkIG9mIHRoaXMga2x1ZGdlIVxuXHRjb25zdCBqc1Jlc2VydmVkUHJvcGVydGllcyA9IG5ldyBSZWdFeHAoXG5cdFx0J14oY29uc3RydWN0b3J8cHJvdG90eXBlfF9fKChkZWZpbmV8bG9va3VwKVtHU11ldHRlcilfXycgK1xuXHRcdFx0J3xldmFsfGhhc093blByb3BlcnR5fHByb3BlcnR5SXNFbnVtZXJhYmxlJyArXG5cdFx0XHQnfHRvKFNvdXJjZXxTdHJpbmd8TG9jYWxlU3RyaW5nKXwodW4pP3dhdGNofHZhbHVlT2YpJCdcblx0KTtcblx0Y29uc3QgZGlmZkJ1Z0FsZXJ0ID0gZnVuY3Rpb24gZGlmZkJ1Z0FsZXJ0KHdvcmQpIHtcblx0XHRpZiAoIWRpZmZCdWdBbGVydC5saXN0W3dvcmRdKSB7XG5cdFx0XHRkaWZmQnVnQWxlcnQubGlzdFt3b3JkXSA9IDE7XG5cdFx0XHRtdy5ub3RpZnkoYEJhZCB3b3JkOiAke3dvcmR9XFxuXFxuUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5gLCB7dGFnOiAncG9wdXBzJywgdHlwZTogJ2Vycm9yJ30pO1xuXHRcdH1cblx0fTtcblx0ZGlmZkJ1Z0FsZXJ0Lmxpc3QgPSB7fTtcblx0Y29uc3QgbWFrZURpZmZIYXNodGFibGUgPSAoc3JjKSA9PiB7XG5cdFx0Y29uc3QgcmV0ID0ge307XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChqc1Jlc2VydmVkUHJvcGVydGllcy50ZXN0KHNyY1tpXSkpIHtcblx0XHRcdFx0c3JjW2ldICs9ICc8IS0tIC0tPic7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXJldFtzcmNbaV1dKSB7XG5cdFx0XHRcdHJldFtzcmNbaV1dID0gW107XG5cdFx0XHR9XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXRbc3JjW2ldXS5wdXNoKGkpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdGRpZmZCdWdBbGVydChzcmNbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXHRjb25zdCBkaWZmID0gKG8sIG4pID0+IHtcblx0XHQvLyBwYXNzIDE6IG1ha2UgaGFzaHRhYmxlIG5zIHdpdGggbmV3IHJvd3MgYXMga2V5c1xuXHRcdGNvbnN0IG5zID0gbWFrZURpZmZIYXNodGFibGUobik7XG5cdFx0Ly8gcGFzcyAyOiBtYWtlIGhhc2h0YWJsZSBvcyB3aXRoIG9sZCByb3dzIGFzIGtleXNcblx0XHRjb25zdCBvcyA9IG1ha2VEaWZmSGFzaHRhYmxlKG8pO1xuXHRcdC8vIHBhc3MgMzogcGFpciB1bmlxdWUgbmV3IHJvd3MgYW5kIG1hdGNoaW5nIHVuaXF1ZSBvbGQgcm93c1xuXHRcdGxldCBpO1xuXHRcdGZvciAoaSBpbiBucykge1xuXHRcdFx0aWYgKG5zW2ldLmxlbmd0aCA9PT0gMSAmJiBvc1tpXSAmJiBvc1tpXS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0bltuc1tpXVswXV0gPSB7XG5cdFx0XHRcdFx0dGV4dDogbltuc1tpXVswXV0sXG5cdFx0XHRcdFx0cm93OiBvc1tpXVswXSxcblx0XHRcdFx0XHRwYWlyZWQ6IHRydWUsXG5cdFx0XHRcdH07XG5cdFx0XHRcdG9bb3NbaV1bMF1dID0ge1xuXHRcdFx0XHRcdHRleHQ6IG9bb3NbaV1bMF1dLFxuXHRcdFx0XHRcdHJvdzogbnNbaV1bMF0sXG5cdFx0XHRcdFx0cGFpcmVkOiB0cnVlLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBwYXNzIDQ6IHBhaXIgbWF0Y2hpbmcgcm93cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgcGFpcmVkIHJvd3MgKG5vdCBuZWNlc3NhcmlseSB1bmlxdWUpXG5cdFx0Zm9yIChpID0gMDsgaSA8IG4ubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG5baV0ucGFpcmVkICYmXG5cdFx0XHRcdCFuW2kgKyAxXS5wYWlyZWQgJiZcblx0XHRcdFx0bltpXS5yb3cgKyAxIDwgby5sZW5ndGggJiZcblx0XHRcdFx0IW9bbltpXS5yb3cgKyAxXS5wYWlyZWQgJiZcblx0XHRcdFx0bltpICsgMV0gPT09IG9bbltpXS5yb3cgKyAxXVxuXHRcdFx0KSB7XG5cdFx0XHRcdG5baSArIDFdID0ge1xuXHRcdFx0XHRcdHRleHQ6IG5baSArIDFdLFxuXHRcdFx0XHRcdHJvdzogbltpXS5yb3cgKyAxLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdFx0b1tuW2ldLnJvdyArIDFdID0ge1xuXHRcdFx0XHRcdHRleHQ6IG9bbltpXS5yb3cgKyAxXSxcblx0XHRcdFx0XHRyb3c6IGkgKyAxLFxuXHRcdFx0XHRcdHBhaXJlZDogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGFzcyA1OiBwYWlyIG1hdGNoaW5nIHJvd3MgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHBhaXJlZCByb3dzIChub3QgbmVjZXNzYXJpbHkgdW5pcXVlKVxuXHRcdGZvciAoaSA9IG4ubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRuW2ldLnBhaXJlZCAmJlxuXHRcdFx0XHQhbltpIC0gMV0ucGFpcmVkICYmXG5cdFx0XHRcdG5baV0ucm93ID4gMCAmJlxuXHRcdFx0XHQhb1tuW2ldLnJvdyAtIDFdLnBhaXJlZCAmJlxuXHRcdFx0XHRuW2kgLSAxXSA9PT0gb1tuW2ldLnJvdyAtIDFdXG5cdFx0XHQpIHtcblx0XHRcdFx0bltpIC0gMV0gPSB7XG5cdFx0XHRcdFx0dGV4dDogbltpIC0gMV0sXG5cdFx0XHRcdFx0cm93OiBuW2ldLnJvdyAtIDEsXG5cdFx0XHRcdFx0cGFpcmVkOiB0cnVlLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvW25baV0ucm93IC0gMV0gPSB7XG5cdFx0XHRcdFx0dGV4dDogb1tuW2ldLnJvdyAtIDFdLFxuXHRcdFx0XHRcdHJvdzogaSAtIDEsXG5cdFx0XHRcdFx0cGFpcmVkOiB0cnVlLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0byxcblx0XHRcdG4sXG5cdFx0fTtcblx0fTtcblx0Ly8gRU5ERklMRTogZGlmZi5qc1xuXHQvLyBTVEFSVEZJTEU6IGluaXQuanNcblx0Y29uc3Qgc2V0U2l0ZUluZm8gPSAoKSA9PiB7XG5cdFx0aWYgKHdpbmRvdy5wb3B1cExvY2FsRGVidWcpIHtcblx0XHRcdHBnLndpa2kuaG9zdG5hbWUgPSAnZW4ud2lraXBlZGlhLm9yZyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBnLndpa2kuaG9zdG5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTsgLy8gdXNlIGluIHByZWZlcmVuY2UgdG8gbG9jYXRpb24uaG9zdG5hbWUgZm9yIGZsZXhpYmlsaXR5ICg/KVxuXHRcdH1cblx0XHRwZy53aWtpLndpa2ltZWRpYSA9XG5cdFx0XHQvKHdpa2koW21wXWVkaWF8c291cmNlfGJvb2tzfG5ld3N8cXVvdGV8dmVyc2l0eXxzcGVjaWVzfHZveWFnZXxkYXRhKXxtZXRhd2lraXx3aWt0aW9uYXJ5fG1lZGlhd2lraSlcXC5vcmcvLnRlc3QoXG5cdFx0XHRcdHBnLndpa2kuaG9zdG5hbWVcblx0XHRcdCk7XG5cdFx0cGcud2lraS53aWtpYSA9IC9cXC53aWtpYVxcLmNvbSQvaS50ZXN0KHBnLndpa2kuaG9zdG5hbWUpO1xuXHRcdHBnLndpa2kuaXNMb2NhbCA9IHBnLndpa2kuaG9zdG5hbWUuc3RhcnRzV2l0aCgnbG9jYWxob3N0Jyk7XG5cdFx0cGcud2lraS5jb21tb25zID1cblx0XHRcdHBnLndpa2kud2lraW1lZGlhICYmIHBnLndpa2kuaG9zdG5hbWUgIT09ICdjb21tb25zLndpa2ltZWRpYS5vcmcnID8gJ2NvbW1vbnMud2lraW1lZGlhLm9yZycgOiBudWxsO1xuXHRcdHBnLndpa2kubGFuZyA9IG13LmNvbmZpZy5nZXQoJ3dnQ29udGVudExhbmd1YWdlJyk7XG5cdFx0Y29uc3QgcG9ydCA9IGxvY2F0aW9uLnBvcnQgPyBgOiR7bG9jYXRpb24ucG9ydH1gIDogJyc7XG5cdFx0cGcud2lraS5zaXRlYmFzZSA9IHBnLndpa2kuaG9zdG5hbWUgKyBwb3J0O1xuXHR9O1xuXHRjb25zdCBzZXRVc2VySW5mbyA9ICgpID0+IHtcblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRsaXN0OiAndXNlcnMnLFxuXHRcdFx0dXN1c2VyczogbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpLFxuXHRcdFx0dXNwcm9wOiAncmlnaHRzJyxcblx0XHR9O1xuXHRcdHBnLnVzZXIuY2FuUmV2aWV3ID0gZmFsc2U7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUmV2aWV3JykpIHtcblx0XHRcdGdldE13QXBpKClcblx0XHRcdFx0LmdldChwYXJhbXMpXG5cdFx0XHRcdC5kb25lKChkYXRhKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgW3tyaWdodHN9XSA9IGRhdGEucXVlcnkudXNlcnM7XG5cdFx0XHRcdFx0cGcudXNlci5jYW5SZXZpZXcgPSByaWdodHMuaW5jbHVkZXMoJ3JldmlldycpOyAvLyBUT0RPOiBTaG91bGQgaXQgYmUgYSBnZXRWYWx1ZU9mKCdSZXZpZXdSaWdodCcpID9cblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBmZXRjaFNwZWNpYWxQYWdlTmFtZXMgPSAoKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0Zm9ybWF0OiAnanNvbicsXG5cdFx0XHRmb3JtYXR2ZXJzaW9uOiAnMicsXG5cdFx0XHRtYXhhZ2U6IDM2MDAsXG5cdFx0XHRtZXRhOiAnc2l0ZWluZm8nLFxuXHRcdFx0c2lwcm9wOiAnc3BlY2lhbHBhZ2VhbGlhc2VzJyxcblx0XHRcdC8vIGNhY2hlIGZvciBhbiBob3VyXG5cdFx0XHR1c2VsYW5nOiAnY29udGVudCcsXG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0TXdBcGkoKVxuXHRcdFx0LmdldChwYXJhbXMpXG5cdFx0XHQudGhlbigoZGF0YSkgPT4ge1xuXHRcdFx0XHRwZy53aWtpLnNwZWNpYWxwYWdlYWxpYXNlcyA9IGRhdGEucXVlcnkuc3BlY2lhbHBhZ2VhbGlhc2VzO1xuXHRcdFx0fSk7XG5cdH07XG5cdGNvbnN0IHNldFRpdGxlQmFzZSA9ICgpID0+IHtcblx0XHRjb25zdCBwcm90b2NvbCA9IHdpbmRvdy5wb3B1cExvY2FsRGVidWcgPyAnaHR0cDonIDogbG9jYXRpb24ucHJvdG9jb2w7XG5cdFx0cGcud2lraS5hcnRpY2xlUGF0aCA9IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZVBhdGgnKS5yZXBsYWNlKC9cXC9cXCQxLywgJycpOyAvLyBhcyBpbiBodHRwOi8vc29tZS50aGluZy5jb20vd2lraS9BcnRpY2xlXG5cdFx0cGcud2lraS5ib3RJbnRlcmZhY2VQYXRoID0gbXcuY29uZmlnLmdldCgnd2dTY3JpcHQnKTtcblx0XHRwZy53aWtpLkFQSVBhdGggPSBgJHttdy5jb25maWcuZ2V0KCd3Z1NjcmlwdFBhdGgnKX0vYXBpLnBocGA7XG5cdFx0Ly8gZGVmYXVsdCBtZWRpYXdpa2kgc2V0dGluZyBpcyBwYXRocyBsaWtlIGh0dHA6Ly9zb21lLnRoaW5nLmNvbS9hcnRpY2xlUGF0aC9pbmRleC5waHA/dGl0bGU9Zm9vXG5cdFx0Y29uc3QgdGl0bGV0YWlsID0gYCR7cGcud2lraS5ib3RJbnRlcmZhY2VQYXRofT90aXRsZT1gO1xuXHRcdC8vIGxldCB0aXRsZXRhaWwyID0gam9pblBhdGgoW3BnLndpa2kuYm90SW50ZXJmYWNlUGF0aCwgJ3dpa2kucGh0bWw/dGl0bGU9J10pO1xuXHRcdC8vIG90aGVyIHNpdGVzIG1heSBuZWVkIHRvIGFkZCBjb2RlIGhlcmUgdG8gc2V0IHRpdGxldGFpbCBkZXBlbmRpbmcgb24gaG93IHRoZWlyIHVybHMgd29ya1xuXHRcdHBnLndpa2kudGl0bGViYXNlID0gYCR7cHJvdG9jb2x9Ly8ke3BnLndpa2kuc2l0ZWJhc2V9JHt0aXRsZXRhaWx9YDtcblx0XHQvLyBwZy53aWtpLnRpdGxlYmFzZTIgID0gcHJvdG9jb2wgKyAnLy8nICsgam9pblBhdGgoW3BnLndpa2kuc2l0ZWJhc2UsIHRpdGxldGFpbDJdKTtcblx0XHRwZy53aWtpLndpa2liYXNlID0gYCR7cHJvdG9jb2x9Ly8ke3BnLndpa2kuc2l0ZWJhc2V9JHtwZy53aWtpLmJvdEludGVyZmFjZVBhdGh9YDtcblx0XHRwZy53aWtpLmFwaXdpa2liYXNlID0gYCR7cHJvdG9jb2x9Ly8ke3BnLndpa2kuc2l0ZWJhc2V9JHtwZy53aWtpLkFQSVBhdGh9YDtcblx0XHRwZy53aWtpLmFydGljbGViYXNlID0gYCR7cHJvdG9jb2x9Ly8ke3BnLndpa2kuc2l0ZWJhc2V9JHtwZy53aWtpLmFydGljbGVQYXRofWA7XG5cdFx0cGcud2lraS5jb21tb25zYmFzZSA9IGAke3Byb3RvY29sfS8vJHtwZy53aWtpLmNvbW1vbnN9JHtwZy53aWtpLmJvdEludGVyZmFjZVBhdGh9YDtcblx0XHRwZy53aWtpLmFwaWNvbW1vbnNiYXNlID0gYCR7cHJvdG9jb2x9Ly8ke3BnLndpa2kuY29tbW9uc30ke3BnLndpa2kuQVBJUGF0aH1gO1xuXHRcdHBnLnJlLmJhc2VuYW1lcyA9IG5ldyBSZWdFeHAoYF4oJHttYXAobGl0ZXJhbGl6ZVJlZ2V4LCBbcGcud2lraS50aXRsZWJhc2UsIHBnLndpa2kuYXJ0aWNsZWJhc2VdKS5qb2luKCd8Jyl9KWApO1xuXHR9O1xuXHQvLyBHbG9iYWwgcmVnZXhwc1xuXHRjb25zdCBzZXRNYWluUmVnZXggPSAoKSA9PiB7XG5cdFx0Y29uc3QgcmVTdGFydCA9ICdbXjpdKjovLyc7XG5cdFx0bGV0IHByZVRpdGxlcyA9IGAke2xpdGVyYWxpemVSZWdleChtdy5jb25maWcuZ2V0KCd3Z1NjcmlwdFBhdGgnKSl9Lyg/OmluZGV4Wy5dcGhwfHdpa2lbLl1waHRtbClbP110aXRsZT1gO1xuXHRcdHByZVRpdGxlcyArPSBgfCR7bGl0ZXJhbGl6ZVJlZ2V4KGAke3BnLndpa2kuYXJ0aWNsZVBhdGh9L2ApfWA7XG5cdFx0Y29uc3QgcmVFbmQgPSBgKCR7cHJlVGl0bGVzfSkoW14mPyNdKilbXiNdKig/OiMoLispKT9gO1xuXHRcdHBnLnJlLm1haW4gPSBuZXcgUmVnRXhwKHJlU3RhcnQgKyBsaXRlcmFsaXplUmVnZXgocGcud2lraS5zaXRlYmFzZSkgKyByZUVuZCk7XG5cdH07XG5cdGNvbnN0IGJ1aWxkU3BlY2lhbFBhZ2VHcm91cCA9IChzcGVjaWFsUGFnZU9iaikgPT4ge1xuXHRcdGNvbnN0IHZhcmlhbnRzID0gW107XG5cdFx0dmFyaWFudHMucHVzaChcblx0XHRcdG13LnV0aWwuZXNjYXBlUmVnRXhwKHNwZWNpYWxQYWdlT2JqLnJlYWxuYW1lKSxcblx0XHRcdG13LnV0aWwuZXNjYXBlUmVnRXhwKGVuY29kZVVSSShzcGVjaWFsUGFnZU9iai5yZWFsbmFtZSkpXG5cdFx0KTtcblx0XHRmb3IgKGNvbnN0IGFsaWFzIG9mIHNwZWNpYWxQYWdlT2JqLmFsaWFzZXMpIHtcblx0XHRcdHZhcmlhbnRzLnB1c2gobXcudXRpbC5lc2NhcGVSZWdFeHAoYWxpYXMpLCBtdy51dGlsLmVzY2FwZVJlZ0V4cChlbmNvZGVVUkkoYWxpYXMpKSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YXJpYW50cy5qb2luKCd8Jyk7XG5cdH07XG5cdGNvbnN0IHNldFJlZ2V4cHMgPSAoKSA9PiB7XG5cdFx0c2V0TWFpblJlZ2V4KCk7XG5cdFx0Y29uc3Qgc3AgPSBuc1JlKHBnLm5zU3BlY2lhbElkKTtcblx0XHRwZy5yZS51cmxOb1BvcHVwID0gbmV3IFJlZ0V4cChgKCh0aXRsZT18Lykke3NwfSg/OiUzQXw6KXxzZWN0aW9uPVswLTldfF4jJClgKTtcblx0XHRmb3IgKGNvbnN0IHNwZWNpYWxwYWdlIG9mIHBnLndpa2kuc3BlY2lhbHBhZ2VhbGlhc2VzKSB7XG5cdFx0XHRzd2l0Y2ggKHNwZWNpYWxwYWdlLnJlYWxuYW1lKSB7XG5cdFx0XHRcdGNhc2UgJ0NvbnRyaWJ1dGlvbnMnOlxuXHRcdFx0XHRcdHBnLnJlLmNvbnRyaWJzID0gbmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdGAodGl0bGU9fC8pJHtzcH0oPzolM0F8OikoPzoke2J1aWxkU3BlY2lhbFBhZ2VHcm91cChzcGVjaWFscGFnZSl9KWAgK1xuXHRcdFx0XHRcdFx0XHRgKCZ0YXJnZXQ9fC98LyR7bnNSZShwZy5uc1VzZXJJZCl9OikoLiopYCxcblx0XHRcdFx0XHRcdCdpJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0RpZmYnOlxuXHRcdFx0XHRcdHBnLnJlLnNwZWNpYWxkaWZmID0gbmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdGAvJHtzcH0oPzolM0F8OikoPzoke2J1aWxkU3BlY2lhbFBhZ2VHcm91cChzcGVjaWFscGFnZSl9KS8oW14/I10qKWAsXG5cdFx0XHRcdFx0XHQnaSdcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdFbWFpbHVzZXInOlxuXHRcdFx0XHRcdHBnLnJlLmVtYWlsID0gbmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdGAodGl0bGU9fC8pJHtzcH0oPzolM0F8OikoPzoke2J1aWxkU3BlY2lhbFBhZ2VHcm91cChzcGVjaWFscGFnZSl9KWAgK1xuXHRcdFx0XHRcdFx0XHRgKCZ0YXJnZXQ9fC98Lyg/OiR7bnNSZShwZy5uc1VzZXJJZCl9Oik/KSguKilgLFxuXHRcdFx0XHRcdFx0J2knXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnV2hhdGxpbmtzaGVyZSc6XG5cdFx0XHRcdFx0cGcucmUuYmFja2xpbmtzID0gbmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdGAodGl0bGU9fC8pJHtzcH0oPzolM0F8OikoPzoke2J1aWxkU3BlY2lhbFBhZ2VHcm91cChzcGVjaWFscGFnZSl9KSgmdGFyZ2V0PXwvKShbXiZdKilgLFxuXHRcdFx0XHRcdFx0J2knXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgaW0gPSBuc1JlSW1hZ2UoKTtcblx0XHQvLyBub3RlOiB0cmllcyB0byBnZXQgaW1hZ2VzIGluIGluZm9ib3ggdGVtcGxhdGVzIHRvbywgZS5nLiBtb3ZpZSBwYWdlcywgYWxidW0gcGFnZXMgZXRjXG5cdFx0Ly9cdFx0XHRcdFx0ICAoXnxcXFtcXFspaW1hZ2U6ICooW158XFxdXSpbXnxcXF0gXSkgKlxuXHRcdC8vXHRcdFx0XHRcdCAgKF58XFxbXFxbKWltYWdlOiAqKFtefFxcXV0qW158XFxdIF0pKFteMC05XFxdXSooWzAtOV0rKSAqcHgpP1xuXHRcdC8vXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCQ0ID0gMTIwIGFzIGluIDEyMHB4XG5cdFx0cGcucmUuaW1hZ2UgPSBuZXcgUmVnRXhwKFxuXHRcdFx0YChefFxcXFxbXFxcXFspJHtpbX06ICooW158XFxcXF1dKltefFxcXFxdIF0pJHtTdHJpbmcucmF3YChbXjAtOVxcXV0qKFswLTldKykgKnB4KT98KD86XFxuICpbfF0/fFt8XSkgKmB9KCR7Z2V0VmFsdWVPZigncG9wdXBJbWFnZVZhcnNSZWdleHAnKX0pYCArXG5cdFx0XHRcdGAgKj0gKig/OlxcXFxbXFxcXFsgKik/KD86JHtpbX06KT8ke1N0cmluZy5yYXdgKFtefF0qPykoPzpcXF1cXF0pPyAqW3xdPyAqXFxuYH1gLFxuXHRcdFx0J2ltZydcblx0XHQpO1xuXHRcdHBnLnJlLmltYWdlQnJhY2tldENvdW50ID0gNjtcblx0XHRwZy5yZS5jYXRlZ29yeSA9IG5ldyBSZWdFeHAoYFxcXFxbXFxcXFske25zUmUocGcubnNDYXRlZ29yeUlkKX06ICooW158XFxcXF1dKltefFxcXFxdIF0pICpgLCAnaScpO1xuXHRcdHBnLnJlLmNhdGVnb3J5QnJhY2tldENvdW50ID0gMTtcblx0XHQvLyBJUHY2IHwgSVB2NFxuXHRcdHBnLnJlLmlwVXNlciA9XG5cdFx0XHQvXig/OjooPzo6fCg/OjpbXFxkQS1GYS1mXXsxLDR9KXsxLDd9KXxbXFxkQS1GYS1mXXsxLDR9KD86OltcXGRBLUZhLWZdezEsNH0pezAsNn06OnxbXFxkQS1GYS1mXXsxLDR9KD86OltcXGRBLUZhLWZdezEsNH0pezd9KXwoKCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldXFxkfFxcZClcXC4pezN9KDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV1cXGR8XFxkKSkkLztcblx0XHRwZy5yZS5zdHViID0gbmV3IFJlZ0V4cChnZXRWYWx1ZU9mKCdwb3B1cFN0dWJSZWdleHAnKSwgJ2ltJyk7XG5cdFx0cGcucmUuZGlzYW1iaWcgPSBuZXcgUmVnRXhwKGdldFZhbHVlT2YoJ3BvcHVwRGFiUmVnZXhwJyksICdpbScpO1xuXHRcdC8vIEZJWE1FIHJlcGxhY2Ugd2l0aCBnZW5lcmFsIHBhcmFtZXRlciBwYXJzaW5nIGZ1bmN0aW9uLCB0aGlzIGlzIGRhZnRcblx0XHRwZy5yZS5vbGRpZCA9IC9bJj9db2xkaWQ9KFteJl0qKS87XG5cdFx0cGcucmUuZGlmZiA9IC9bJj9dZGlmZj0oW14mXSopLztcblx0fTtcblx0Ly8gbWlzY2VsbGFueVxuXHRjb25zdCBzZXR1cENhY2hlID0gKCkgPT4ge1xuXHRcdC8vIHBhZ2UgY2FjaGluZ1xuXHRcdHBnLmNhY2hlLnBhZ2VzID0gW107XG5cdH07XG5cdGNvbnN0IHNldE1pc2MgPSAoKSA9PiB7XG5cdFx0cGcuY3VycmVudC5saW5rID0gbnVsbDtcblx0XHRwZy5jdXJyZW50LmxpbmtzID0gW107XG5cdFx0cGcuY3VycmVudC5saW5rc0hhc2ggPSB7fTtcblx0XHRzZXR1cENhY2hlKCk7XG5cdFx0cGcudGltZXIuY2hlY2tQb3B1cFBvc2l0aW9uID0gbnVsbDtcblx0XHRwZy5jb3VudGVyLmxvb3AgPSAwO1xuXHRcdC8vIGlkcyBjaGFuZ2Ugd2l0aCBlYWNoIHBvcHVwOiBwb3B1cEltYWdlMCwgcG9wdXBJbWFnZTEgZXRjXG5cdFx0cGcuaWROdW1iZXIgPSAwO1xuXHRcdC8vIGZvciBteURlY29kZVVSSVxuXHRcdHBnLm1pc2MuZGVjb2RlRXh0cmFzID0gW1xuXHRcdFx0e2Zyb206ICclMkMnLCB0bzogJywnfSxcblx0XHRcdHtmcm9tOiAnXycsIHRvOiAnICd9LFxuXHRcdFx0e2Zyb206ICclMjQnLCB0bzogJyQnfSxcblx0XHRcdHtmcm9tOiAnJTI2JywgdG86ICcmJ30sIC8vIG5vICxcblx0XHRdO1xuXHR9O1xuXHRjb25zdCBnZXRNd0FwaSA9ICgpID0+IHtcblx0XHRpZiAoIXBnLmFwaS5jbGllbnQpIHtcblx0XHRcdHBnLmFwaS51c2VyQWdlbnQgPSBgTmF2aWdhdGlvbiBwb3B1cHMvMS4wICgke213LmNvbmZpZy5nZXQoJ3dnV2lraUlEJyl9KWA7XG5cdFx0XHRwZy5hcGkuY2xpZW50ID0gaW5pdE13QXBpKHBnLmFwaS51c2VyQWdlbnQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcGcuYXBpLmNsaWVudDtcblx0fTtcblx0Ly8gV2UgbmVlZCBhIGNhbGxiYWNrIHNpbmNlIHRoaXMgbWlnaHQgZW5kIHVwIGFzeW5jaHJvbm91cyBiZWNhdXNlIG9mXG5cdC8vIHRoZSBtdy5sb2FkZXIudXNpbmcoKSBjYWxsLlxuXHRjb25zdCBzZXR1cFBvcHVwcyA9IGZ1bmN0aW9uIHNldHVwUG9wdXBzKGNhbGxiYWNrKSB7XG5cdFx0aWYgKHNldHVwUG9wdXBzLmNvbXBsZXRlZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBUaGVzZSBkZXBlbmRlbmNpZXMgc2hvdWxkIGFsc2UgYmUgZW5mb3JjZWQgZnJvbSB0aGUgZ2FkZ2V0LFxuXHRcdC8vIGJ1dCBub3QgZXZlcnlvbmUgbG9hZHMgdGhpcyBhcyBhIGdhZGdldCwgc28gZG91YmxlIGNoZWNrXG5cdFx0ZmV0Y2hTcGVjaWFsUGFnZU5hbWVzKCkudGhlbigoKSA9PiB7XG5cdFx0XHQvLyBOQiB0cmFuc2xhdGFibGUgc3RyaW5ncyBzaG91bGQgYmUgc2V0IHVwIGZpcnN0IChzdHJpbmdzLmpzKVxuXHRcdFx0Ly8gYmFzaWNzXG5cdFx0XHRzZXR1cERlYnVnZ2luZygpO1xuXHRcdFx0c2V0U2l0ZUluZm8oKTtcblx0XHRcdHNldFRpdGxlQmFzZSgpO1xuXHRcdFx0c2V0T3B0aW9ucygpOyAvLyBzZWUgb3B0aW9ucy5qc1xuXHRcdFx0c2V0VXNlckluZm8oKTtcblx0XHRcdC8vIG5hbWVzcGFjZXMgZXRjXG5cdFx0XHRzZXROYW1lc3BhY2VzKCk7XG5cdFx0XHRzZXRJbnRlcndpa2koKTtcblx0XHRcdC8vIHJlZ2V4cHNcblx0XHRcdHNldFJlZ2V4cHMoKTtcblx0XHRcdHNldFJlZGlycygpO1xuXHRcdFx0Ly8gb3RoZXIgc3R1ZmZcblx0XHRcdHNldE1pc2MoKTtcblx0XHRcdHNldHVwTGl2ZVByZXZpZXcoKTtcblx0XHRcdC8vIG1haW4gZGVhbCBoZXJlXG5cdFx0XHRzZXR1cFRvb2x0aXBzKCk7XG5cdFx0XHRsb2coJ0luIHNldHVwUG9wdXBzKCksIGp1c3QgY2FsbGVkIHNldHVwVG9vbHRpcHMoKScpO1xuXHRcdFx0TmF2cG9wdXAudHJhY2tlci5lbmFibGUoKTtcblx0XHRcdHNldHVwUG9wdXBzLmNvbXBsZXRlZCA9IHRydWU7XG5cdFx0XHRpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cdC8vIEVOREZJTEU6IGluaXQuanNcblx0Ly8gU1RBUlRGSUxFOiBuYXZsaW5rcy5qc1xuXHQvLyBuYXZsaW5rcy4uLiBsZXQgdGhlIGZ1biBiZWdpblxuXHQvL1xuXHRjb25zdCBkZWZhdWx0TmF2bGlua1NwZWMgPSAoKSA9PiB7XG5cdFx0bGV0IHN0ciA9ICcnO1xuXHRcdHN0ciArPSAnPGI+PDxtYWlubGlua3xzaG9ydGN1dD0gPj48L2I+Jztcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBMYXN0RWRpdExpbmsnKSkge1xuXHRcdFx0c3RyICs9ICcqPDxsYXN0RWRpdHxzaG9ydGN1dD0vPj58PDxsYXN0Q29udHJpYj4+fDw8c2luY2VNZT4+aWYob2xkaWQpe3w8PG9sZEVkaXQ+Pnw8PGRpZmZDdXI+Pn0nO1xuXHRcdH1cblx0XHQvLyB1c2VyIGxpbmtzXG5cdFx0Ly8gY29udHJpYnMgLSBsb2cgLSBjb3VudCAtIGVtYWlsIC0gYmxvY2tcblx0XHQvLyBjb3VudCBvbmx5IGlmIGFwcGxpY2FibGU7IGJsb2NrIG9ubHkgaWYgcG9wdXBBZG1pbkxpbmtzXG5cdFx0c3RyICs9ICdpZih1c2VyKXs8YnI+PDxjb250cmlic3xzaG9ydGN1dD1jPj4qPDx1c2VybG9nfHNob3J0Y3V0PUx8bG9nPj4nO1xuXHRcdHN0ciArPSAnaWYoaXB1c2VyKXsqPDxhcmluPj59aWYod2lraW1lZGlhKXsqPDxjb3VudHxzaG9ydGN1dD0jPj59Jztcblx0XHRzdHIgKz0gJ2lmKGlwdXNlcil7fWVsc2V7Kjw8ZW1haWx8c2hvcnRjdXQ9RT4+fWlmKGFkbWluKXsqPDxibG9ja3xzaG9ydGN1dD1iPj58PDxibG9ja2xvZ3xsb2c+Pn19Jztcblx0XHQvLyBlZGl0aW5nIGxpbmtzXG5cdFx0Ly8gdGFsa3BhZ2UgICAtPiBlZGl0fG5ldyAtIGhpc3RvcnkgLSB1bnx3YXRjaCAtIGFydGljbGV8ZWRpdFxuXHRcdC8vIG90aGVyIHBhZ2UgLT4gZWRpdCAtIGhpc3RvcnkgLSB1bnx3YXRjaCAtIHRhbGt8ZWRpdHxuZXdcblx0XHRjb25zdCBlZGl0c3RyID0gJzw8ZWRpdHxzaG9ydGN1dD1lPj4nO1xuXHRcdGNvbnN0IGVkaXRPbGRpZFN0ciA9IGBpZihvbGRpZCl7PDxlZGl0T2xkfHNob3J0Y3V0PWU+Pnw8PHJldmVydHxzaG9ydGN1dD12fHJ2Pj58PDxlZGl0fGN1cj4+fWVsc2V7JHtlZGl0c3RyfX1gO1xuXHRcdGNvbnN0IGhpc3RvcnlzdHIgPSAnPDxoaXN0b3J5fHNob3J0Y3V0PWg+Pnw8PGVkaXRvcnN8c2hvcnRjdXQ9RXw+Pic7XG5cdFx0Y29uc3Qgd2F0Y2hzdHIgPSAnPDx1bndhdGNofHVud2F0Y2hTaG9ydD4+fDw8d2F0Y2h8c2hvcnRjdXQ9d3x3YXRjaFRoaW5neT4+Jztcblx0XHRzdHIgKz1cblx0XHRcdGA8YnI+aWYodGFsayl7JHtlZGl0T2xkaWRTdHJ9fDw8bmV3fHNob3J0Y3V0PSs+PmAgK1xuXHRcdFx0YCoke2hpc3RvcnlzdHJ9KiR7d2F0Y2hzdHJ9KmAgK1xuXHRcdFx0JzxiPjw8YXJ0aWNsZXxzaG9ydGN1dD1hPj48L2I+fDw8ZWRpdEFydGljbGV8ZWRpdD4+JyArXG5cdFx0XHRgfWVsc2V7JHtcblx0XHRcdFx0Ly8gbm90IGEgdGFsayBwYWdlXG5cdFx0XHRcdGVkaXRPbGRpZFN0clxuXHRcdFx0fSoke2hpc3RvcnlzdHJ9KiR7d2F0Y2hzdHJ9KmAgK1xuXHRcdFx0JzxiPjw8dGFsa3xzaG9ydGN1dD10Pj48L2I+fDw8ZWRpdFRhbGt8ZWRpdD4+fDw8bmV3VGFsa3xzaG9ydGN1dD0rfG5ldz4+fSc7XG5cdFx0Ly8gbWlzYyBsaW5rc1xuXHRcdHN0ciArPSAnPGJyPjw8d2hhdExpbmtzSGVyZXxzaG9ydGN1dD1sPj4qPDxyZWxhdGVkQ2hhbmdlc3xzaG9ydGN1dD1yPj4qPDxtb3ZlfHNob3J0Y3V0PW0+Pic7XG5cdFx0Ly8gYWRtaW4gbGlua3Ncblx0XHRzdHIgKz1cblx0XHRcdCdpZihhZG1pbil7PGJyPjw8dW5wcm90ZWN0fHVucHJvdGVjdFNob3J0Pj58PDxwcm90ZWN0fHNob3J0Y3V0PXA+Pnw8PHByb3RlY3Rsb2d8bG9nPj4qJyArXG5cdFx0XHQnPDx1bmRlbGV0ZXx1bmRlbGV0ZVNob3J0Pj58PDxkZWxldGV8c2hvcnRjdXQ9ZD4+fDw8ZGVsZXRlbG9nfGxvZz4+fSc7XG5cdFx0cmV0dXJuIHN0cjtcblx0fTtcblx0Y29uc3QgbmF2TGlua3NIVE1MID0gKGFydGljbGUsIF9oaW50LCBwYXJhbXMpID0+IHtcblx0XHQvLyBvbGRpZCwgcmNpZCkge1xuXHRcdGNvbnN0IHN0ciA9IGA8c3BhbiBjbGFzcz1cInBvcHVwTmF2TGlua3NcIj4ke2RlZmF1bHROYXZsaW5rU3BlYygpfTwvc3Bhbj5gO1xuXHRcdC8vIEJBTVxuXHRcdHJldHVybiBuYXZsaW5rU3RyaW5nVG9IVE1MKHN0ciwgYXJ0aWNsZSwgcGFyYW1zKTtcblx0fTtcblx0Y29uc3QgZXhwYW5kQ29uZGl0aW9uYWxOYXZsaW5rU3RyaW5nID0gZnVuY3Rpb24gZXhwYW5kQ29uZGl0aW9uYWxOYXZsaW5rU3RyaW5nKHMsIGFydGljbGUsIHosIHJlY3Vyc2lvbkNvdW50KSB7XG5cdFx0Y29uc3Qge29sZGlkfSA9IHo7XG5cdFx0Y29uc3Qge3JjaWR9ID0gejtcblx0XHRjb25zdCB7ZGlmZn0gPSB6O1xuXHRcdC8vIG5lc3RlZCBjb25kaXRpb25hbHMgKHVwIHRvIDEwIGRlZXApIGFyZSBvaywgaG9wZWZ1bGx5ISAod29yayBmcm9tIHRoZSBpbnNpZGUgb3V0KVxuXHRcdGlmICh0eXBlb2YgcmVjdXJzaW9uQ291bnQgIT09IHR5cGVvZiAwKSB7XG5cdFx0XHRyZWN1cnNpb25Db3VudCA9IDA7XG5cdFx0fVxuXHRcdC8vICgxXHQgaWZcdFxcXFwoXHQoMlx0MilcdFxcXFwpXHQgIHsoM1x0Myl9ICAoNCAgIGVsc2VcdCAgeyg1XHQgNSl9ICA0KTEpXG5cdFx0Y29uc3QgY29uZGl0aW9uYWxTcGxpdFJlZ2V4ID0gLyg7P1xccyppZlxccypcXChcXHMqKFxcdyopXFxzKlxcKVxccyp7KFtee31dKil9KFxccyplbHNlXFxzKnsoW157fV0qPyl9fCkpL2k7XG5cdFx0Y29uc3Qgc3BsaXR0ZWQgPSBzLnNwbGl0KGNvbmRpdGlvbmFsU3BsaXRSZWdleCk7XG5cdFx0Ly8gJDE6IHdob2xlIGNvbmRpdGlvbmFsXG5cdFx0Ly8gJDI6IHRlc3QgY29uZGl0aW9uXG5cdFx0Ly8gJDM6IHRydWUgZXhwYW5zaW9uXG5cdFx0Ly8gJDQ6IGVsc2UgY2xhdXNlIChwb3NzaWJseSBlbXB0eSlcblx0XHQvLyAkNTogZmFsc2UgZXhwYW5zaW9uIChwb3NzaWJseSBudWxsKVxuXHRcdGNvbnN0IG51bVBhcmVucyA9IDU7XG5cdFx0bGV0IFtyZXRdID0gc3BsaXR0ZWQ7XG5cdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdHRlZC5sZW5ndGg7IGkgPSBpICsgbnVtUGFyZW5zICsgMSkge1xuXHRcdFx0Y29uc3QgdGVzdFN0cmluZyA9IHNwbGl0dGVkW2kgKyAyIC0gMV07XG5cdFx0XHRjb25zdCB0cnVlU3RyaW5nID0gc3BsaXR0ZWRbaSArIDMgLSAxXTtcblx0XHRcdGxldCBmYWxzZVN0cmluZyA9IHNwbGl0dGVkW2kgKyA1IC0gMV07XG5cdFx0XHRpZiAoZmFsc2VTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCAhZmFsc2VTdHJpbmcpIHtcblx0XHRcdFx0ZmFsc2VTdHJpbmcgPSAnJztcblx0XHRcdH1cblx0XHRcdGxldCB0ZXN0UmVzdWx0O1xuXHRcdFx0c3dpdGNoICh0ZXN0U3RyaW5nKSB7XG5cdFx0XHRcdGNhc2UgJ3VzZXInOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhIWFydGljbGUudXNlck5hbWUoKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndGFsayc6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICFhcnRpY2xlLnRhbGtQYWdlKCk7IC8vIHRhbGtQYWdlIGNvbnZlcnRzIF9hcnRpY2xlc18gdG8gdGFsa1BhZ2VzXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2FkbWluJzpcblx0XHRcdFx0XHR0ZXN0UmVzdWx0ID0gISFnZXRWYWx1ZU9mKCdwb3B1cEFkbWluTGlua3MnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnb2xkaWQnOlxuXHRcdFx0XHRcdHRlc3RSZXN1bHQgPSAhIShvbGRpZCAhPT0gdW5kZWZpbmVkICYmIG9sZGlkKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncmNpZCc6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhKHJjaWQgIT09IHVuZGVmaW5lZCAmJiByY2lkKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnaXB1c2VyJzpcblx0XHRcdFx0XHR0ZXN0UmVzdWx0ID0gISFhcnRpY2xlLmlzSXBVc2VyKCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ21haW5zcGFjZV9lbic6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9IGlzSW5NYWluTmFtZXNwYWNlKGFydGljbGUpICYmIHBnLndpa2kuaG9zdG5hbWUgPT09ICdlbi53aWtpcGVkaWEub3JnJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnd2lraW1lZGlhJzpcblx0XHRcdFx0XHR0ZXN0UmVzdWx0ID0gISFwZy53aWtpLndpa2ltZWRpYTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZGlmZic6XG5cdFx0XHRcdFx0dGVzdFJlc3VsdCA9ICEhKGRpZmYgIT09IHVuZGVmaW5lZCAmJiBkaWZmKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAodGVzdFJlc3VsdCkge1xuXHRcdFx0XHRjYXNlIG51bGw6XG5cdFx0XHRcdFx0cmV0ICs9IHNwbGl0dGVkW2ldO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIHRydWU6XG5cdFx0XHRcdFx0cmV0ICs9IHRydWVTdHJpbmc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgZmFsc2U6XG5cdFx0XHRcdFx0cmV0ICs9IGZhbHNlU3RyaW5nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Ly8gYXBwZW5kIG5vbi1jb25kaXRpb25hbCBzdHJpbmdcblx0XHRcdHJldCArPSBzcGxpdHRlZFtpICsgbnVtUGFyZW5zXTtcblx0XHR9XG5cdFx0aWYgKGNvbmRpdGlvbmFsU3BsaXRSZWdleC50ZXN0KHJldCkgJiYgcmVjdXJzaW9uQ291bnQgPCAxMCkge1xuXHRcdFx0cmV0dXJuIGV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyhyZXQsIGFydGljbGUsIHosIHJlY3Vyc2lvbkNvdW50ICsgMSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cdGNvbnN0IG5hdmxpbmtTdHJpbmdUb0FycmF5ID0gKHMsIGFydGljbGUsIHBhcmFtcykgPT4ge1xuXHRcdHMgPSBleHBhbmRDb25kaXRpb25hbE5hdmxpbmtTdHJpbmcocywgYXJ0aWNsZSwgcGFyYW1zKTtcblx0XHRjb25zdCBzcGxpdHRlZCA9IHMuc3BsaXQoLzw8KC4qPyk+Pi8pO1xuXHRcdGNvbnN0IHJldCA9IFtdO1xuXHRcdGZvciAoY29uc3QgW2ksIGVsZW1lbnRdIG9mIHNwbGl0dGVkLmVudHJpZXMoKSkge1xuXHRcdFx0aWYgKGkgJSAyKSB7XG5cdFx0XHRcdC8vIGkgb2RkLCBzbyBzIGlzIGEgdGFnXG5cdFx0XHRcdGNvbnN0IHQgPSBuZXcgbmF2bGlua1RhZygpO1xuXHRcdFx0XHRjb25zdCBzcyA9IGVsZW1lbnQuc3BsaXQoJ3wnKTtcblx0XHRcdFx0W3QuaWRdID0gc3M7XG5cdFx0XHRcdGZvciAobGV0IGogPSAxOyBqIDwgc3MubGVuZ3RoOyArK2opIHtcblx0XHRcdFx0XHRjb25zdCBzc3MgPSBzc1tqXS5zcGxpdCgnPScpO1xuXHRcdFx0XHRcdGlmIChzc3MubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0WywgdFtzc3NbMF1dXSA9IHNzcztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gbm8gYXNzaWdubWVudCAobm8gXCI9XCIpLCBzbyB0cmVhdCB0aGlzIGFzIGEgdGl0bGUgKG92ZXJ3cml0aW5nIHRoZSBsYXN0IG9uZSlcblx0XHRcdFx0XHRcdHQudGV4dCA9IHBvcHVwU3RyaW5nKHNzc1swXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHQuYXJ0aWNsZSA9IGFydGljbGU7XG5cdFx0XHRcdGNvbnN0IHtvbGRpZH0gPSBwYXJhbXM7XG5cdFx0XHRcdGNvbnN0IHtyY2lkfSA9IHBhcmFtcztcblx0XHRcdFx0Y29uc3Qge2RpZmZ9ID0gcGFyYW1zO1xuXHRcdFx0XHRpZiAob2xkaWQgIT09IHVuZGVmaW5lZCAmJiBvbGRpZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHQub2xkaWQgPSBvbGRpZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmNpZCAhPT0gdW5kZWZpbmVkICYmIHJjaWQgIT09IG51bGwpIHtcblx0XHRcdFx0XHR0LnJjaWQgPSByY2lkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkaWZmICE9PSB1bmRlZmluZWQgJiYgZGlmZiAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHQuZGlmZiA9IGRpZmY7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCF0LnRleHQgJiYgdC5pZCAhPT0gJ21haW5saW5rJykge1xuXHRcdFx0XHRcdHQudGV4dCA9IHBvcHVwU3RyaW5nKHQuaWQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldC5wdXNoKHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gcGxhaW4gSFRNTFxuXHRcdFx0XHRyZXQucHVzaChlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgbmF2bGlua1N1YnN0aXR1dGVIVE1MID0gKHMpID0+IHtcblx0XHRyZXR1cm4gc1xuXHRcdFx0LnNwbGl0KCcqJylcblx0XHRcdC5qb2luKGdldFZhbHVlT2YoJ3BvcHVwTmF2TGlua1NlcGFyYXRvcicpKVxuXHRcdFx0LnNwbGl0KCc8bWVudXJvdz4nKVxuXHRcdFx0LmpvaW4oJzxsaSBjbGFzcz1cInBvcHVwX21lbnVfcm93XCI+Jylcblx0XHRcdC5zcGxpdCgnPC9tZW51cm93PicpXG5cdFx0XHQuam9pbignPC9saT4nKVxuXHRcdFx0LnNwbGl0KCc8bWVudT4nKVxuXHRcdFx0LmpvaW4oJzx1bCBjbGFzcz1cInBvcHVwX21lbnVcIj4nKVxuXHRcdFx0LnNwbGl0KCc8L21lbnU+Jylcblx0XHRcdC5qb2luKCc8L3VsPicpO1xuXHR9O1xuXHRjb25zdCBuYXZsaW5rRGVwdGggPSAobWFnaWMsIHMpID0+IHtcblx0XHRyZXR1cm4gcy5zcGxpdChgPCR7bWFnaWN9PmApLmxlbmd0aCAtIHMuc3BsaXQoYDwvJHttYWdpY30+YCkubGVuZ3RoO1xuXHR9O1xuXHQvLyBuYXZsaW5rU3RyaW5nOiAqIGJlY29tZXMgdGhlIHNlcGFyYXRvclxuXHQvL1x0XHRcdFx0PDxmb298YmFyPWJhenxmdWJhcj4+IGJlY29tZXMgYSBmb28tbGluayB3aXRoIGF0dHJpYnV0ZSBiYXI9J2Jheidcblx0Ly9cdFx0XHRcdFx0XHRcdFx0XHQgIGFuZCB2aXNpYmxlIHRleHQgJ2Z1YmFyJ1xuXHQvL1x0XHRcdFx0aWYodGVzdCl7Li4ufSBhbmQgaWYodGVzdCl7Li4ufWVsc2V7Li4ufSB3b3JrIHRvbyAobmVzdGVkIG9rKVxuXHRjb25zdCBuYXZsaW5rU3RyaW5nVG9IVE1MID0gKHMsIGFydGljbGUsIHBhcmFtcykgPT4ge1xuXHRcdC8vIGxpbWl0QWxlcnQobmF2bGlua1N0cmluZ1RvSFRNTCwgNSwgJ25hdmxpbmtTdHJpbmdUb0hUTUxcXG4nICsgYXJ0aWNsZSArICdcXG4nICsgKHR5cGVvZiBhcnRpY2xlKSk7XG5cdFx0Y29uc3QgcCA9IG5hdmxpbmtTdHJpbmdUb0FycmF5KHMsIGFydGljbGUsIHBhcmFtcyk7XG5cdFx0bGV0IGh0bWwgPSAnJztcblx0XHRsZXQgbWVudWRlcHRoID0gMDsgLy8gbmVzdGVkIG1lbnVzIG5vdCBjdXJyZW50bHkgYWxsb3dlZCwgYnV0IGRvZXNuJ3QgZG8gYW55IGhhcm0gdG8gY29kZSBmb3IgaXRcblx0XHRsZXQgbWVudXJvd2RlcHRoID0gMDtcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcCkge1xuXHRcdFx0aWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlb2YgJycpIHtcblx0XHRcdFx0aHRtbCArPSBuYXZsaW5rU3Vic3RpdHV0ZUhUTUwoZWxlbWVudCk7XG5cdFx0XHRcdG1lbnVkZXB0aCArPSBuYXZsaW5rRGVwdGgoJ21lbnUnLCBlbGVtZW50KTtcblx0XHRcdFx0bWVudXJvd2RlcHRoICs9IG5hdmxpbmtEZXB0aCgnbWVudXJvdycsIGVsZW1lbnQpO1xuXHRcdFx0XHQvL1x0XHRcdGlmIChtZW51ZGVwdGggPT09IDApIHtcblx0XHRcdFx0Ly9cdFx0XHRcdHRhZ1R5cGU9J3NwYW4nO1xuXHRcdFx0XHQvL1x0XHRcdH0gZWxzZSBpZiAobWVudXJvd2RlcHRoID09PSAwKSB7XG5cdFx0XHRcdC8vXHRcdFx0XHR0YWdUeXBlPSdsaSc7XG5cdFx0XHRcdC8vXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9cdFx0XHRcdHRhZ1R5cGUgPSBudWxsO1xuXHRcdFx0XHQvL1x0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZWxlbWVudC50eXBlICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudC50eXBlID09PSAnbmF2bGlua1RhZycpIHtcblx0XHRcdFx0aHRtbCArPVxuXHRcdFx0XHRcdG1lbnVkZXB0aCA+IDAgJiYgbWVudXJvd2RlcHRoID09PSAwXG5cdFx0XHRcdFx0XHQ/IGA8bGkgY2xhc3M9XCJwb3B1cF9tZW51X2l0ZW1cIj4ke2VsZW1lbnQuaHRtbCgpfTwvbGk+YFxuXHRcdFx0XHRcdFx0OiBlbGVtZW50Lmh0bWwoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGh0bWw7XG5cdH07XG5cdGNsYXNzIG5hdmxpbmtUYWcge1xuXHRcdGNvbnN0cnVjdG9yKCkge1xuXHRcdFx0dGhpcy50eXBlID0gJ25hdmxpbmtUYWcnO1xuXHRcdH1cblx0XHRodG1sKCkge1xuXHRcdFx0dGhpcy5nZXROZXdXaW4oKTtcblx0XHRcdHRoaXMuZ2V0UHJpbnRGdW5jdGlvbigpO1xuXHRcdFx0bGV0IGh0bWwgPSAnJztcblx0XHRcdGxldCBvcGVuaW5nO1xuXHRcdFx0bGV0IGNsb3Npbmc7XG5cdFx0XHRjb25zdCB0YWdUeXBlID0gJ3NwYW4nO1xuXHRcdFx0aWYgKHRhZ1R5cGUpIHtcblx0XHRcdFx0b3BlbmluZyA9IGA8JHt0YWdUeXBlfSBjbGFzcz1cInBvcHVwXyR7dGhpcy5pZH1cIj5gO1xuXHRcdFx0XHRjbG9zaW5nID0gYDwvJHt0YWdUeXBlfT5gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3BlbmluZyA9ICcnO1xuXHRcdFx0XHRjbG9zaW5nID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIHRoaXMucHJpbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0aHRtbCA9IHRoaXMucHJpbnQodGhpcyk7XG5cdFx0XHRcdGlmICh0eXBlb2YgaHRtbCAhPT0gdHlwZW9mICcnKSB7XG5cdFx0XHRcdFx0aHRtbCA9ICcnO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2hvcnRjdXQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGh0bWwgPSBhZGRQb3B1cFNob3J0Y3V0KGh0bWwsIHRoaXMuc2hvcnRjdXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlcnJsb2coYE9oIGRlYXIgLSBpbnZhbGlkIHByaW50IGZ1bmN0aW9uIGZvciBhIG5hdmxpbmtUYWcsIGlkPSR7dGhpcy5pZH1gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvcGVuaW5nICsgaHRtbCArIGNsb3Npbmc7XG5cdFx0fVxuXHRcdGdldE5ld1dpbigpIHtcblx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwTGlua3NOZXdXaW5kb3cnKTtcblx0XHRcdGlmIChwZy5vcHRpb24ucG9wdXBMaW5rc05ld1dpbmRvd1t0aGlzLmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMubmV3V2luID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdHRoaXMubmV3V2luID0gcGcub3B0aW9uLnBvcHVwTGlua3NOZXdXaW5kb3dbdGhpcy5pZF07XG5cdFx0fVxuXHRcdGdldFByaW50RnVuY3Rpb24oKSB7XG5cdFx0XHQvLyB0aGluayBhYm91dCB0aGlzIHNvbWUgbW9yZVxuXHRcdFx0Ly8gdGhpcy5pZCBhbmQgdGhpcy5hcnRpY2xlIHNob3VsZCBhbHJlYWR5IGJlIGRlZmluZWRcblx0XHRcdGlmICh0eXBlb2YgdGhpcy5pZCAhPT0gdHlwZW9mICcnIHx8IHR5cGVvZiB0aGlzLmFydGljbGUgIT09IHR5cGVvZiB7fSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm5vUG9wdXAgPSAxO1xuXHRcdFx0c3dpdGNoICh0aGlzLmlkKSB7XG5cdFx0XHRcdGNhc2UgJ2NvbnRyaWJzJzpcblx0XHRcdFx0Y2FzZSAnaGlzdG9yeSc6XG5cdFx0XHRcdGNhc2UgJ3doYXRMaW5rc0hlcmUnOlxuXHRcdFx0XHRjYXNlICd1c2VyUGFnZSc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAndGFsayc6XG5cdFx0XHRcdGNhc2UgJ2FydGljbGUnOlxuXHRcdFx0XHRjYXNlICdsYXN0RWRpdCc6XG5cdFx0XHRcdFx0dGhpcy5ub1BvcHVwID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAodGhpcy5pZCkge1xuXHRcdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRcdGNhc2UgJ2NvbnRyaWJzJzpcblx0XHRcdFx0Y2FzZSAnYmxvY2snOlxuXHRcdFx0XHRjYXNlICd1bmJsb2NrJzpcblx0XHRcdFx0Y2FzZSAndXNlcmxvZyc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJTcGFjZSc6XG5cdFx0XHRcdGNhc2UgJ2RlbGV0ZWRDb250cmlicyc6XG5cdFx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLnVzZXJOYW1lKCk7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHRoaXMuaWQpIHtcblx0XHRcdFx0Y2FzZSAndXNlclRhbGsnOlxuXHRcdFx0XHRjYXNlICduZXdVc2VyVGFsayc6XG5cdFx0XHRcdGNhc2UgJ2VkaXRVc2VyVGFsayc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJQYWdlJzpcblx0XHRcdFx0Y2FzZSAnYmxvY2tsb2cnOlxuXHRcdFx0XHRcdHRoaXMuYXJ0aWNsZSA9IHRoaXMuYXJ0aWNsZS51c2VyTmFtZSh0cnVlKTtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlICdwYWdlbG9nJzpcblx0XHRcdFx0Y2FzZSAnZGVsZXRlbG9nJzpcblx0XHRcdFx0Y2FzZSAncHJvdGVjdGxvZyc6XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMub2xkaWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5pZCAhPT0gJ21haW5saW5rJykge1xuXHRcdFx0XHQvLyBGSVhNRSBhbmNob3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHkgd2l0aCBUaXRsZSBvYmplY3Rcblx0XHRcdFx0dGhpcy5hcnRpY2xlID0gdGhpcy5hcnRpY2xlLnJlbW92ZUFuY2hvcigpO1xuXHRcdFx0XHQvLyBpZiAodHlwZW9mIHRoaXMudGV4dD09J3VuZGVmaW5lZCcpIHsgdGhpcy50ZXh0PXBvcHVwU3RyaW5nKHRoaXMuaWQpOyB9XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHRoaXMuaWQpIHtcblx0XHRcdFx0Y2FzZSAndW5kZWxldGUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1VuZGVsZXRlJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcvJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnd2hhdExpbmtzSGVyZSc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnV2hhdGxpbmtzaGVyZSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3JlbGF0ZWRDaGFuZ2VzJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdSZWNlbnRjaGFuZ2VzbGlua2VkJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbW92ZSc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnTW92ZXBhZ2UnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdjb250cmlicyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnQ29udHJpYnV0aW9ucyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RlbGV0ZWRDb250cmlicyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnRGVsZXRlZGNvbnRyaWJ1dGlvbnMnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnRW1haWxVc2VyJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcvJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnYmxvY2snOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0Jsb2NraXAnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZpcD0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1bmJsb2NrJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdJcGJsb2NrbGlzdCc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJmFjdGlvbj11bmJsb2NrJmlwPSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3VzZXJsb2cnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0xvZyc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJnVzZXI9Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnYmxvY2tsb2cnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0xvZyc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJnR5cGU9YmxvY2smcGFnZT0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdwYWdlbG9nJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gc3BlY2lhbExpbms7XG5cdFx0XHRcdFx0dGhpcy5zcGVjaWFscGFnZSA9ICdMb2cnO1xuXHRcdFx0XHRcdHRoaXMuc2VwID0gJyZwYWdlPSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3Byb3RlY3Rsb2cnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ0xvZyc7XG5cdFx0XHRcdFx0dGhpcy5zZXAgPSAnJnR5cGU9cHJvdGVjdCZwYWdlPSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RlbGV0ZWxvZyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnTG9nJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcmdHlwZT1kZWxldGUmcGFnZT0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1c2VyU3BhY2UnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBzcGVjaWFsTGluaztcblx0XHRcdFx0XHR0aGlzLnNwZWNpYWxwYWdlID0gJ1ByZWZpeEluZGV4Jztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcmbmFtZXNwYWNlPTImcHJlZml4PSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3NlYXJjaCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnU2VhcmNoJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcmZnVsbHRleHQ9U2VhcmNoJnNlYXJjaD0nO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd0aGFuayc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHNwZWNpYWxMaW5rO1xuXHRcdFx0XHRcdHRoaXMuc3BlY2lhbHBhZ2UgPSAnVGhhbmtzJztcblx0XHRcdFx0XHR0aGlzLnNlcCA9ICcvJztcblx0XHRcdFx0XHR0aGlzLmFydGljbGUudmFsdWUgPSB0aGlzLmRpZmYgPT09ICdwcmV2JyA/IHRoaXMub2xkaWQgOiB0aGlzLmRpZmY7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3Vud2F0Y2gnOlxuXHRcdFx0XHRjYXNlICd3YXRjaCc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IG1hZ2ljV2F0Y2hMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gYCR7dGhpcy5pZH0mYXV0b3dhdGNobGlzdD0xJmF1dG9pbXBsPSR7cG9wdXBTdHJpbmcoXG5cdFx0XHRcdFx0XHQnYXV0b2VkaXRfdmVyc2lvbidcblx0XHRcdFx0XHQpfSZhY3Rva2VuPSR7YXV0b0NsaWNrVG9rZW4oKX1gO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdoaXN0b3J5Jzpcblx0XHRcdFx0Y2FzZSAnaGlzdG9yeWZlZWQnOlxuXHRcdFx0XHRjYXNlICd1bnByb3RlY3QnOlxuXHRcdFx0XHRjYXNlICdwcm90ZWN0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSB0aGlzLmlkO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkZWxldGUnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdkZWxldGUnO1xuXHRcdFx0XHRcdGlmICh0aGlzLmFydGljbGUubmFtZXNwYWNlSWQoKSA9PT0gcGcubnNJbWFnZUlkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbWcgPSB0aGlzLmFydGljbGUuc3RyaXBOYW1lc3BhY2UoKTtcblx0XHRcdFx0XHRcdHRoaXMuYWN0aW9uICs9IGAmaW1hZ2U9JHtpbWd9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ21hcmtwYXRyb2xsZWQnOlxuXHRcdFx0XHRjYXNlICdlZGl0Jzpcblx0XHRcdFx0XHQvLyBlZGl0T2xkIHNob3VsZCBrZWVwIHRoZSBvbGRpZCwgYnV0IGVkaXQgc2hvdWxkIG5vdC5cblx0XHRcdFx0XHRkZWxldGUgdGhpcy5vbGRpZDtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlICd2aWV3Jzpcblx0XHRcdFx0Y2FzZSAncHVyZ2UnOlxuXHRcdFx0XHRjYXNlICdyZW5kZXInOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9IHRoaXMuaWQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3Jhdyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ3Jhdyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ25ldyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHdpa2lMaW5rO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ2VkaXQmc2VjdGlvbj1uZXcnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdtYWlubGluayc6XG5cdFx0XHRcdFx0aWYgKHRoaXMudGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRleHQgPSB0aGlzLmFydGljbGUudG9TdHJpbmcoKS5lbnRpZnkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwU2ltcGxpZnlNYWluTGluaycpICYmIGlzSW5TdHJpcHBhYmxlTmFtZXNwYWNlKHRoaXMuYXJ0aWNsZSkpIHtcblx0XHRcdFx0XHRcdC8vIG9ubHkgc2hvdyB0aGUgL3N1YnBhZ2UgcGFydCBvZiB0aGUgdGl0bGUgdGV4dFxuXHRcdFx0XHRcdFx0Y29uc3QgcyA9IHRoaXMudGV4dC5zcGxpdCgnLycpO1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0ID0gcy5hdCgtMSk7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy50ZXh0ID09PSAnJyAmJiBzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy50ZXh0ID0gcy5hdCgtMik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB0aXRsZWRXaWtpTGluaztcblx0XHRcdFx0XHRpZiAodGhpcy50aXRsZSA9PT0gdW5kZWZpbmVkICYmIHBnLmN1cnJlbnQubGluayAmJiBwZy5jdXJyZW50LmxpbmsuaHJlZiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRpdGxlID0gc2FmZURlY29kZVVSSShwZy5jdXJyZW50Lmxpbmsub3JpZ2luYWxUaXRsZSA/PyB0aGlzLmFydGljbGUpO1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub2xkaWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9sZGlkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMudGl0bGUgPSB0cHJpbnRmKCdSZXZpc2lvbiAlcyBvZiAlcycsIFt0aGlzLm9sZGlkLCB0aGlzLnRpdGxlXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ3ZpZXcnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1c2VyUGFnZSc6XG5cdFx0XHRcdGNhc2UgJ2FydGljbGUnOlxuXHRcdFx0XHRjYXNlICdlZGl0QXJ0aWNsZSc6XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMub2xkaWQ7XG5cdFx0XHRcdFx0Ly8gbXcubm90aWZ5KGAke3RoaXMuaWR9XFxuJHt0aGlzLmFydGljbGV9XFxuJHt0eXBlb2YgdGhpcy5hcnRpY2xlfWAsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnd2Fybid9KTtcblx0XHRcdFx0XHR0aGlzLmFydGljbGUgPSB0aGlzLmFydGljbGUuYXJ0aWNsZUZyb21UYWxrT3JBcnRpY2xlKCk7XG5cdFx0XHRcdFx0Ly8gbXcubm90aWZ5KGAke3RoaXMuaWR9XFxuJHt0aGlzLmFydGljbGV9XFxuJHt0eXBlb2YgdGhpcy5hcnRpY2xlfWAsIHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnd2Fybid9KTtcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSB0aGlzLmlkLmluZGV4T2YoJ2VkaXQnKSA9PT0gMCA/ICdlZGl0JyA6ICd2aWV3Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndXNlclRhbGsnOlxuXHRcdFx0XHRjYXNlICd0YWxrJzpcblx0XHRcdFx0XHR0aGlzLmFydGljbGUgPSB0aGlzLmFydGljbGUudGFsa1BhZ2UoKTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5vbGRpZDtcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAndmlldyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2FyaW4nOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBhcmluTGluaztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnY291bnQnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBlZGl0Q291bnRlckxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2VkaXRvcnMnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSBlZGl0b3JMaXN0TGluaztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbGFzdEVkaXQnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB0aXRsZWREaWZmTGluaztcblx0XHRcdFx0XHR0aGlzLnRpdGxlID0gcG9wdXBTdHJpbmcoJ1Nob3cgdGhlIGxhc3QgZWRpdCcpO1xuXHRcdFx0XHRcdHRoaXMuZnJvbSA9ICdwcmV2Jztcblx0XHRcdFx0XHR0aGlzLnRvID0gJ2N1cic7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ29sZEVkaXQnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB0aXRsZWREaWZmTGluaztcblx0XHRcdFx0XHR0aGlzLnRpdGxlID0gYCR7cG9wdXBTdHJpbmcoJ1Nob3cgdGhlIGVkaXQgbWFkZSB0byBnZXQgcmV2aXNpb24nKX0gJHt0aGlzLm9sZGlkfWA7XG5cdFx0XHRcdFx0dGhpcy5mcm9tID0gJ3ByZXYnO1xuXHRcdFx0XHRcdHRoaXMudG8gPSB0aGlzLm9sZGlkO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdlZGl0T2xkJzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAnZWRpdCc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3VuZG8nOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdlZGl0JnVuZG89Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncmV2ZXJ0Jzpcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0dGhpcy5hY3Rpb24gPSAncmV2ZXJ0Jztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbnVsbEVkaXQnOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdudWxsRWRpdCc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RpZmZDdXInOlxuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB0aXRsZWREaWZmTGluaztcblx0XHRcdFx0XHR0aGlzLnRpdGxlID0gdHByaW50ZignU2hvdyBjaGFuZ2VzIHNpbmNlIHJldmlzaW9uICVzJywgW3RoaXMub2xkaWRdKTtcblx0XHRcdFx0XHR0aGlzLmZyb20gPSB0aGlzLm9sZGlkO1xuXHRcdFx0XHRcdHRoaXMudG8gPSAnY3VyJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZWRpdFVzZXJUYWxrJzpcblx0XHRcdFx0Y2FzZSAnZWRpdFRhbGsnOlxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLm9sZGlkO1xuXHRcdFx0XHRcdHRoaXMuYXJ0aWNsZSA9IHRoaXMuYXJ0aWNsZS50YWxrUGFnZSgpO1xuXHRcdFx0XHRcdHRoaXMuYWN0aW9uID0gJ2VkaXQnO1xuXHRcdFx0XHRcdHRoaXMucHJpbnQgPSB3aWtpTGluaztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbmV3VXNlclRhbGsnOlxuXHRcdFx0XHRjYXNlICduZXdUYWxrJzpcblx0XHRcdFx0XHR0aGlzLmFydGljbGUgPSB0aGlzLmFydGljbGUudGFsa1BhZ2UoKTtcblx0XHRcdFx0XHR0aGlzLmFjdGlvbiA9ICdlZGl0JnNlY3Rpb249bmV3Jztcblx0XHRcdFx0XHR0aGlzLnByaW50ID0gd2lraUxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2xhc3RDb250cmliJzpcblx0XHRcdFx0Y2FzZSAnc2luY2VNZSc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IG1hZ2ljSGlzdG9yeUxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3RvZ2dsZVByZXZpZXdzJzpcblx0XHRcdFx0XHR0aGlzLnRleHQgPSBwb3B1cFN0cmluZyhwZy5vcHRpb24uc2ltcGxlUG9wdXBzID8gJ2VuYWJsZSBwcmV2aWV3cycgOiAnZGlzYWJsZSBwcmV2aWV3cycpO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdGNhc2UgJ2Rpc2FibGVQb3B1cHMnOlxuXHRcdFx0XHRjYXNlICdwdXJnZVBvcHVwcyc6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IHBvcHVwTWVudUxpbms7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0dGhpcy5wcmludCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBgVW5rbm93biBuYXZsaW5rIHR5cGU6ICR7dGhpcy5pZH1gO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vXG5cdC8vICBlbmQgbmF2bGlua3Ncblx0Ly8gRU5ERklMRTogbmF2bGlua3MuanNcblx0Ly8gU1RBUlRGSUxFOiBzaG9ydGN1dGtleXMuanNcblx0Y29uc3QgcG9wdXBIYW5kbGVLZXlwcmVzcyA9IGZ1bmN0aW9uIHBvcHVwSGFuZGxlS2V5cHJlc3MoZXZ0KSB7XG5cdFx0Y29uc3Qga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IHdpbmRvdy5ldmVudC5rZXlDb2RlIDogZXZ0LmtleUNvZGUgPz8gZXZ0LndoaWNoO1xuXHRcdGlmICgha2V5Q29kZSB8fCAhcGcuY3VycmVudC5saW5rIHx8ICFwZy5jdXJyZW50LmxpbmsubmF2cG9wdXApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGtleUNvZGUgPT09IDI3KSB7XG5cdFx0XHQvLyBlc2NhcGVcblx0XHRcdGtpbGxQb3B1cCgpO1xuXHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBzd2FsbG93IGtleXByZXNzXG5cdFx0fVxuXHRcdGNvbnN0IGxldHRlciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KGtleUNvZGUpO1xuXHRcdGNvbnN0IGxpbmtzID0gcGcuY3VycmVudC5saW5rLm5hdnBvcHVwLm1haW5EaXYucXVlcnlTZWxlY3RvckFsbCgnQScpO1xuXHRcdGxldCBzdGFydExpbmsgPSAwO1xuXHRcdGxldCBpO1xuXHRcdGxldCBqO1xuXHRcdGlmIChwb3B1cEhhbmRsZUtleXByZXNzLmxhc3RQb3B1cExpbmtTZWxlY3RlZCkge1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdGlmIChsaW5rc1tpXSA9PT0gcG9wdXBIYW5kbGVLZXlwcmVzcy5sYXN0UG9wdXBMaW5rU2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRzdGFydExpbmsgPSBpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoaiA9IDA7IGogPCBsaW5rcy5sZW5ndGg7ICsraikge1xuXHRcdFx0aSA9IChzdGFydExpbmsgKyBqICsgMSkgJSBsaW5rcy5sZW5ndGg7XG5cdFx0XHRpZiAobGlua3NbaV0uZ2V0QXR0cmlidXRlKCdwb3B1cGtleScpID09PSBsZXR0ZXIpIHtcblx0XHRcdFx0aWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHtcblx0XHRcdFx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaW5rc1tpXS5mb2N1cygpO1xuXHRcdFx0XHRwb3B1cEhhbmRsZUtleXByZXNzLmxhc3RQb3B1cExpbmtTZWxlY3RlZCA9IGxpbmtzW2ldO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7IC8vIHN3YWxsb3cga2V5cHJlc3Ncblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGFzcyBrZXlwcmVzcyBvblxuXHRcdGlmIChkb2N1bWVudC5vbGRQb3B1cE9ua2V5cHJlc3MpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5vbGRQb3B1cE9ua2V5cHJlc3MoZXZ0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IGFkZFBvcHVwU2hvcnRjdXRzID0gKCkgPT4ge1xuXHRcdGlmIChkb2N1bWVudC5vbmtleXByZXNzICE9PSBwb3B1cEhhbmRsZUtleXByZXNzKSB7XG5cdFx0XHRkb2N1bWVudC5vbGRQb3B1cE9ua2V5cHJlc3MgPSBkb2N1bWVudC5vbmtleXByZXNzO1xuXHRcdH1cblx0XHRkb2N1bWVudC5vbmtleXByZXNzID0gcG9wdXBIYW5kbGVLZXlwcmVzcztcblx0fTtcblx0Y29uc3Qgcm1Qb3B1cFNob3J0Y3V0cyA9ICgpID0+IHtcblx0XHRwb3B1cEhhbmRsZUtleXByZXNzLmxhc3RQb3B1cExpbmtTZWxlY3RlZCA9IG51bGw7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChkb2N1bWVudC5vbGRQb3B1cE9ua2V5cHJlc3MgJiYgZG9jdW1lbnQub2xkUG9wdXBPbmtleXByZXNzID09PSBwb3B1cEhhbmRsZUtleXByZXNzKSB7XG5cdFx0XHRcdC8vIHBhbmljXG5cdFx0XHRcdGRvY3VtZW50Lm9ua2V5cHJlc3MgPSBudWxsOyAvLyAoKSA9PiB7fTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZG9jdW1lbnQub25rZXlwcmVzcyA9IGRvY3VtZW50Lm9sZFBvcHVwT25rZXlwcmVzcztcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIElFIGdvZXMgaGVyZSAqL1xuXHRcdH1cblx0fTtcblx0Y29uc3QgYWRkTGlua1Byb3BlcnR5ID0gKGh0bWwsIHByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gdGFrZSBcIjxhIGhyZWY9Li4uPi4uLjwvYT4gYW5kIGFkZCBhIHByb3BlcnR5XG5cdFx0Ly8gbm90IHNvcGhpc3RpY2F0ZWQgYXQgYWxsLCBlYXNpbHkgYnJva2VuXG5cdFx0Y29uc3QgaSA9IGh0bWwuaW5kZXhPZignPicpO1xuXHRcdGlmIChpIDwgMCkge1xuXHRcdFx0cmV0dXJuIGh0bWw7XG5cdFx0fVxuXHRcdHJldHVybiBgJHtodG1sLnNsaWNlKDAsIE1hdGgubWF4KDAsIGkpKX0gJHtwcm9wZXJ0eX0ke2h0bWwuc2xpY2UoTWF0aC5tYXgoMCwgaSkpfWA7XG5cdH07XG5cdGNvbnN0IGFkZFBvcHVwU2hvcnRjdXQgPSAoaHRtbCwga2V5KSA9PiB7XG5cdFx0aWYgKCFnZXRWYWx1ZU9mKCdwb3B1cFNob3J0Y3V0S2V5cycpKSB7XG5cdFx0XHRyZXR1cm4gaHRtbDtcblx0XHR9XG5cdFx0Y29uc3QgcmV0ID0gYWRkTGlua1Byb3BlcnR5KGh0bWwsIGBwb3B1cGtleT1cIiR7a2V5fVwiYCk7XG5cdFx0aWYgKGtleSA9PT0gJyAnKSB7XG5cdFx0XHRrZXkgPSBwb3B1cFN0cmluZygnc3BhY2ViYXInKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldC5yZXBsYWNlKC9eKC4qPykodGl0bGU9XCIpKC4qPykoXCIuKikkL2ksIGAkMSQyJDMgWyR7a2V5fV0kNGApO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBzaG9ydGN1dGtleXMuanNcblx0Ly8gU1RBUlRGSUxFOiBkaWZmcHJldmlldy5qc1xuXHQvLyBsZXRzIGp1bXAgdGhyb3VnaCBob29wcyB0byBmaW5kIHRoZSByZXYgaWRzIHdlIG5lZWQgdG8gcmV0cmlldmVcblx0Y29uc3QgbG9hZERpZmYgPSAoYXJ0aWNsZSwgb2xkaWQsIGRpZmYsIG5hdnBvcCkgPT4ge1xuXHRcdG5hdnBvcC5kaWZmRGF0YSA9IHtcblx0XHRcdG9sZFJldjoge30sXG5cdFx0XHRuZXdSZXY6IHt9LFxuXHRcdH07XG5cdFx0Y29uc3QgYXBpID0gZ2V0TXdBcGkoKTtcblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRhY3Rpb246ICdjb21wYXJlJyxcblx0XHRcdHByb3A6IFsnaWRzJywgJ3RpdGxlJ10sXG5cdFx0fTtcblx0XHRpZiAoYXJ0aWNsZS50aXRsZSkge1xuXHRcdFx0cGFyYW1zLmZyb210aXRsZSA9IGFydGljbGUudGl0bGU7XG5cdFx0fVxuXHRcdHN3aXRjaCAoZGlmZikge1xuXHRcdFx0Y2FzZSAnY3VyJzpcblx0XHRcdFx0c3dpdGNoIChvbGRpZCkge1xuXHRcdFx0XHRcdGNhc2UgbnVsbDpcblx0XHRcdFx0XHRjYXNlICcnOlxuXHRcdFx0XHRcdGNhc2UgJ3ByZXYnOlxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBjYW4gb25seSB3b3JrIGlmIHdlIGhhdmUgdGhlIHRpdGxlXG5cdFx0XHRcdFx0XHQvLyBjdXIgLT4gcHJldlxuXHRcdFx0XHRcdFx0cGFyYW1zLnRvcmVsYXRpdmUgPSAncHJldic7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cGFyYW1zLmZyb21yZXYgPSBvbGRpZDtcblx0XHRcdFx0XHRcdHBhcmFtcy50b3JlbGF0aXZlID0gJ2N1cic7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3ByZXYnOlxuXHRcdFx0XHRpZiAob2xkaWQpIHtcblx0XHRcdFx0XHRwYXJhbXMuZnJvbXJldiA9IG9sZGlkO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHBhcmFtcy5mcm9tdGl0bGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGFyYW1zLnRvcmVsYXRpdmUgPSAncHJldic7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbmV4dCc6XG5cdFx0XHRcdHBhcmFtcy5mcm9tcmV2ID0gb2xkaWQgfHwgMDtcblx0XHRcdFx0cGFyYW1zLnRvcmVsYXRpdmUgPSAnbmV4dCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cGFyYW1zLmZyb21yZXYgPSBvbGRpZCB8fCAwO1xuXHRcdFx0XHRwYXJhbXMudG9yZXYgPSBkaWZmIHx8IDA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRhcGkuZ2V0KHBhcmFtcykudGhlbigoZGF0YSkgPT4ge1xuXHRcdFx0bmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZCA9IGRhdGEuY29tcGFyZS5mcm9tcmV2aWQ7XG5cdFx0XHRuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkID0gZGF0YS5jb21wYXJlLnRvcmV2aWQ7XG5cdFx0XHRhZGRSZXZpZXdMaW5rKG5hdnBvcCwgJ3BvcHVwTWlzY1Rvb2xzJyk7XG5cdFx0XHRjb25zdCBnbyA9ICgpID0+IHtcblx0XHRcdFx0cGVuZGluZ05hdnBvcFRhc2sobmF2cG9wKTtcblx0XHRcdFx0bGV0IHVybCA9IGAke3BnLndpa2kuYXBpd2lraWJhc2V9P2Zvcm1hdD1qc29uJmZvcm1hdHZlcnNpb249MiZhY3Rpb249cXVlcnkmYDtcblx0XHRcdFx0dXJsICs9IGByZXZpZHM9JHtuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlkfXwke25hdnBvcC5kaWZmRGF0YS5uZXdSZXYucmV2aWR9YDtcblx0XHRcdFx0dXJsICs9ICcmcHJvcD1yZXZpc2lvbnMmcnZwcm9wPWlkc3x0aW1lc3RhbXB8Y29udGVudCc7XG5cdFx0XHRcdGdldFBhZ2VXaXRoQ2FjaGluZyh1cmwsIGRvbmVEaWZmLCBuYXZwb3ApO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gcmVtb3ZlIGhvb2sgb25jZSBydW5cblx0XHRcdH07XG5cdFx0XHRpZiAobmF2cG9wLnZpc2libGUgfHwgIWdldFZhbHVlT2YoJ3BvcHVwTGF6eURvd25sb2FkcycpKSB7XG5cdFx0XHRcdGdvKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuYXZwb3AuYWRkSG9vayhnbywgJ3VuaGlkZScsICdiZWZvcmUnLCAnRE9XTkxPQURfRElGRlMnKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblx0Ly8gUHV0IGEgXCJtYXJrIHBhdHJvbGxlZFwiIGxpbmsgdG8gYW4gZWxlbWVudCB0YXJnZXRcblx0Ly8gVE9ETzogQWxsb3cgcGF0cm9sIGEgcmV2aXNpb24sIGFzIHdlbGwgYXMgYSBkaWZmXG5cdGNvbnN0IGFkZFJldmlld0xpbmsgPSAobmF2cG9wLCB0YXJnZXQpID0+IHtcblx0XHRpZiAoIXBnLnVzZXIuY2FuUmV2aWV3KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIElmICduZXdSZXYnIGlzIG9sZGVyIHRoYW4gJ29sZFJldicgdGhhbiBpdCBjb3VsZCBiZSBjb25mdXNpbmcsIHNvIHdlIGRvIG5vdCBzaG93IHRoZSByZXZpZXcgbGluay5cblx0XHRpZiAobmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpZCA8PSBuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdFx0Zm9ybWF0dmVyc2lvbjogJzInLFxuXHRcdFx0cHJvcDogWydpbmZvJywgJ2ZsYWdnZWQnXSxcblx0XHRcdHJldmlkczogbmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZCxcblx0XHR9O1xuXHRcdGdldE13QXBpKClcblx0XHRcdC5nZXQocGFyYW1zKVxuXHRcdFx0LnRoZW4oKGRhdGEpID0+IHtcblx0XHRcdFx0Y29uc3Qgc3RhYmxlX3JldmlkID0gKGRhdGEucXVlcnkucGFnZXNbMF0uZmxhZ2dlZCAmJiBkYXRhLnF1ZXJ5LnBhZ2VzWzBdLmZsYWdnZWQuc3RhYmxlX3JldmlkKSB8fCAwO1xuXHRcdFx0XHQvLyBUaGUgZGlmZiBjYW4gYmUgcmV2aWV3ZWQgaWYgdGhlIG9sZCB2ZXJzaW9uIGlzIHRoZSBsYXN0IHJldmlld2VkIHZlcnNpb25cblx0XHRcdFx0Ly8gVE9ETzogT3RoZXIgcG9zc2libGUgY29uZGl0aW9ucyB0aGF0IHdlIG1heSB3YW50IHRvIGltcGxlbWVudCBpbnN0ZWFkIG9mIHRoaXMgb25lOlxuXHRcdFx0XHQvLyAtIG9sZCB2ZXJzaW9uIGlzIHBhdHJvbGxlZCBhbmQgdGhlIG5ldyB2ZXJzaW9uIGlzIG5vdCBwYXRyb2xsZWRcblx0XHRcdFx0Ly8gLSBvbGQgdmVyc2lvbiBpcyBwYXRyb2xsZWQgYW5kIHRoZSBuZXcgdmVyc2lvbiBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBsYXN0IHJldmlld2VkIHZlcnNpb25cblx0XHRcdFx0aWYgKHN0YWJsZV9yZXZpZCA9PT0gbmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZCkge1xuXHRcdFx0XHRcdGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0XHRcdFx0YS5pbm5lckhUTUwgPSBwb3B1cFN0cmluZygnbWFyayBwYXRyb2xsZWQnKTtcblx0XHRcdFx0XHRhLnRpdGxlID0gcG9wdXBTdHJpbmcoJ21hcmtwYXRyb2xsZWRIaW50Jyk7XG5cdFx0XHRcdFx0YS5vbmNsaWNrID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0XHRhY3Rpb246ICdyZXZpZXcnLFxuXHRcdFx0XHRcdFx0XHRjb21tZW50OiB0cHJpbnRmKCdkZWZhdWx0cG9wdXBSZXZpZXdlZFN1bW1hcnknLCBbXG5cdFx0XHRcdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpZCxcblx0XHRcdFx0XHRcdFx0XHRuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkLFxuXHRcdFx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHRcdFx0cmV2aWQ6IG5hdnBvcC5kaWZmRGF0YS5uZXdSZXYucmV2aWQsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0Z2V0TXdBcGkoKVxuXHRcdFx0XHRcdFx0XHQucG9zdFdpdGhUb2tlbignY3NyZicsIHBhcmFtcylcblx0XHRcdFx0XHRcdFx0LmRvbmUoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBVcGRhdGUgY3VycmVudCBwYWdlIGFuZCBvdGhlciBhbHJlYWR5IGNvbnN0cnVjdGVkIHBvcHVwc1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuZmFpbCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0bXcubm90aWZ5KHBvcHVwU3RyaW5nKCdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnKSwge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFnOiAncG9wdXBzJyxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0c2V0UG9wdXBIVE1MKGEsIHRhcmdldCwgbmF2cG9wLmlkTnVtYmVyLCBudWxsLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH07XG5cdGNvbnN0IGRvbmVEaWZmID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0aWYgKCFkb3dubG9hZC5vd25lciB8fCAhZG93bmxvYWQub3duZXIuZGlmZkRhdGEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgbmF2cG9wID0gZG93bmxvYWQub3duZXI7XG5cdFx0Y29tcGxldGVkTmF2cG9wVGFzayhuYXZwb3ApO1xuXHRcdGxldCBwYWdlcztcblx0XHRsZXQgcmV2aXNpb25zID0gW107XG5cdFx0dHJ5IHtcblx0XHRcdC8vIFByb2Nlc3MgdGhlIGRvd25sb2Fkc1xuXHRcdFx0KHtwYWdlc30gPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKS5xdWVyeSk7XG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcblx0XHRcdFx0cmV2aXNpb25zID0gWy4uLnJldmlzaW9ucywgLi4ucGFnZS5yZXZpc2lvbnNdO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCByZXZpc2lvbiBvZiByZXZpc2lvbnMpIHtcblx0XHRcdFx0aWYgKHJldmlzaW9uLnJldmlkID09PSBuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlkKSB7XG5cdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm9sZFJldi5yZXZpc2lvbiA9IHJldmlzaW9uO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJldmlzaW9uLnJldmlkID09PSBuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlkKSB7XG5cdFx0XHRcdFx0bmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpc2lvbiA9IHJldmlzaW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRlcnJsb2coJ0NvdWxkIG5vdCBnZXQgZGlmZicpO1xuXHRcdH1cblx0XHRpbnNlcnREaWZmKG5hdnBvcCk7XG5cdH07XG5cdGNvbnN0IHJtQm9yaW5nTGluZXMgPSAoYSwgYiwgY29udGV4dCkgPT4ge1xuXHRcdGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnRleHQgPSAyO1xuXHRcdH1cblx0XHQvLyB0aGlzIGlzIGZhaXJseSBzbG93Li4uIGkgdGhpbmsgaXQncyBxdWlja2VyIHRoYW4gZG9pbmcgYSB3b3JkLWJhc2VkIGRpZmYgZnJvbSB0aGUgb2ZmLCB0aG91Z2hcblx0XHRjb25zdCBhYSA9IFtdO1xuXHRcdGNvbnN0IGFhYSA9IFtdO1xuXHRcdGNvbnN0IGJiID0gW107XG5cdFx0Y29uc3QgYmJiID0gW107XG5cdFx0bGV0IGk7XG5cdFx0bGV0IGo7XG5cdFx0Ly8gZmlyc3QsIGdhdGhlciBhbGwgZGlzY29ubmVjdGVkIG5vZGVzIGluIGEgYW5kIGFsbCBjcm9zc2luZyBub2RlcyBpbiBhIGFuZCBiXG5cdFx0Zm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICghYVtpXS5wYWlyZWQpIHtcblx0XHRcdFx0YWFbaV0gPSAxO1xuXHRcdFx0fSBlbHNlIGlmIChjb3VudENyb3NzaW5ncyhiLCBhLCBpLCB0cnVlKSkge1xuXHRcdFx0XHRhYVtpXSA9IDE7XG5cdFx0XHRcdGJiW2FbaV0ucm93XSA9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHBpY2sgdXAgcmVtYWluaW5nIGRpc2Nvbm5lY3RlZCBub2RlcyBpbiBiXG5cdFx0Zm9yIChpID0gMDsgaSA8IGIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA9PT0gMSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICghYltpXS5wYWlyZWQpIHtcblx0XHRcdFx0YmJbaV0gPSAxO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBhbm90aGVyIHBhc3MgdG8gZ2F0aGVyIGNvbnRleHQ6IHdlIHdhbnQgdGhlIG5laWdoYm91cnMgb2YgaW5jbHVkZWQgbm9kZXMgd2hpY2ggYXJlIG5vdFxuXHRcdC8vIHlldCBpbmNsdWRlZCB3ZSBoYXZlIHRvIGFkZCBpbiBwYXJ0bmVycyBvZiB0aGVzZSBub2RlcywgYnV0IHdlIGRvbid0IHdhbnQgdG8gYWRkIGNvbnRleHRcblx0XHQvLyBmb3IgKnRob3NlKiBub2RlcyBpbiB0aGUgbmV4dCBwYXNzXG5cdFx0Zm9yIChpID0gMDsgaSA8IGIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA9PT0gMSkge1xuXHRcdFx0XHRmb3IgKGogPSBNYXRoLm1heCgwLCBpIC0gY29udGV4dCk7IGogPCBNYXRoLm1pbihiLmxlbmd0aCwgaSArIGNvbnRleHQpOyArK2opIHtcblx0XHRcdFx0XHRpZiAoIWJiW2pdKSB7XG5cdFx0XHRcdFx0XHRiYltqXSA9IDE7XG5cdFx0XHRcdFx0XHRhYVtiW2pdLnJvd10gPSAwLjU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRpZiAoYWFbaV0gPT09IDEpIHtcblx0XHRcdFx0Zm9yIChqID0gTWF0aC5tYXgoMCwgaSAtIGNvbnRleHQpOyBqIDwgTWF0aC5taW4oYS5sZW5ndGgsIGkgKyBjb250ZXh0KTsgKytqKSB7XG5cdFx0XHRcdFx0aWYgKCFhYVtqXSkge1xuXHRcdFx0XHRcdFx0YWFbal0gPSAxO1xuXHRcdFx0XHRcdFx0YmJbYVtqXS5yb3ddID0gMC41O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgYmIubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChiYltpXSA+IDApIHtcblx0XHRcdFx0Ly8gaXQncyBhIHJvdyB3ZSBuZWVkXG5cdFx0XHRcdGlmIChiW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRcdGJiYi5wdXNoKGJbaV0udGV4dCk7IC8vIGpvaW5lZDsgcGFydG5lciBzaG91bGQgYmUgaW4gYWFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRiYmIucHVzaChiW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgYWEubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChhYVtpXSA+IDApIHtcblx0XHRcdFx0Ly8gaXQncyBhIHJvdyB3ZSBuZWVkXG5cdFx0XHRcdGlmIChhW2ldLnBhaXJlZCkge1xuXHRcdFx0XHRcdGFhYS5wdXNoKGFbaV0udGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gam9pbmVkOyBwYXJ0bmVyIHNob3VsZCBiZSBpbiBhYVxuXHRcdFx0XHRcdGFhYS5wdXNoKGFbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRhOiBhYWEsXG5cdFx0XHRiOiBiYmIsXG5cdFx0fTtcblx0fTtcblx0Y29uc3Qgc3RyaXBPdXRlckNvbW1vbkxpbmVzID0gKGEsIGIsIGNvbnRleHQpID0+IHtcblx0XHRsZXQgaSA9IDA7XG5cdFx0d2hpbGUgKGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggJiYgYVtpXSA9PT0gYltpXSkge1xuXHRcdFx0KytpO1xuXHRcdH1cblx0XHRsZXQgaiA9IGEubGVuZ3RoIC0gMTtcblx0XHRsZXQgayA9IGIubGVuZ3RoIC0gMTtcblx0XHR3aGlsZSAoaiA+PSAwICYmIGsgPj0gMCAmJiBhW2pdID09PSBiW2tdKSB7XG5cdFx0XHQtLWo7XG5cdFx0XHQtLWs7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRhOiBhLnNsaWNlKE1hdGgubWF4KDAsIGkgLSAxIC0gY29udGV4dCksIE1hdGgubWluKGEubGVuZ3RoICsgMSwgaiArIGNvbnRleHQgKyAxKSksXG5cdFx0XHRiOiBiLnNsaWNlKE1hdGgubWF4KDAsIGkgLSAxIC0gY29udGV4dCksIE1hdGgubWluKGIubGVuZ3RoICsgMSwgayArIGNvbnRleHQgKyAxKSksXG5cdFx0fTtcblx0fTtcblx0Y29uc3QgaW5zZXJ0RGlmZiA9IChuYXZwb3ApID0+IHtcblx0XHQvLyBmb3Igc3BlZWQgcmVhc29ucywgd2UgZmlyc3QgZG8gYSBsaW5lLWJhc2VkIGRpZmYsIGRpc2NhcmQgc3R1ZmYgdGhhdCBzZWVtcyBib3JpbmcsIHRoZW5cblx0XHQvLyBkbyBhIHdvcmQtYmFzZWQgZGlmZlxuXHRcdC8vIEZJWE1FOiBzb21ldGltZXMgdGhpcyBnaXZlcyBtaXNsZWFkaW5nIGRpZmZzIGFzIGRpc3RhbnQgY2h1bmtzIGFyZSBzcXVhc2hlZCB0b2dldGhlclxuXHRcdGxldCBvbGRsaW5lcyA9IG5hdnBvcC5kaWZmRGF0YS5vbGRSZXYucmV2aXNpb24uY29udGVudC5zcGxpdCgnXFxuJyk7XG5cdFx0bGV0IG5ld2xpbmVzID0gbmF2cG9wLmRpZmZEYXRhLm5ld1Jldi5yZXZpc2lvbi5jb250ZW50LnNwbGl0KCdcXG4nKTtcblx0XHRsZXQgaW5uZXIgPSBzdHJpcE91dGVyQ29tbW9uTGluZXMob2xkbGluZXMsIG5ld2xpbmVzLCBnZXRWYWx1ZU9mKCdwb3B1cERpZmZDb250ZXh0TGluZXMnKSk7XG5cdFx0b2xkbGluZXMgPSBpbm5lci5hO1xuXHRcdG5ld2xpbmVzID0gaW5uZXIuYjtcblx0XHRsZXQgdHJ1bmNhdGVkID0gZmFsc2U7XG5cdFx0Z2V0VmFsdWVPZigncG9wdXBEaWZmTWF4TGluZXMnKTtcblx0XHRpZiAob2xkbGluZXMubGVuZ3RoID4gcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzIHx8IG5ld2xpbmVzLmxlbmd0aCA+IHBnLm9wdGlvbi5wb3B1cERpZmZNYXhMaW5lcykge1xuXHRcdFx0Ly8gdHJ1bmNhdGVcblx0XHRcdHRydW5jYXRlZCA9IHRydWU7XG5cdFx0XHRpbm5lciA9IHN0cmlwT3V0ZXJDb21tb25MaW5lcyhcblx0XHRcdFx0b2xkbGluZXMuc2xpY2UoMCwgcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzKSxcblx0XHRcdFx0bmV3bGluZXMuc2xpY2UoMCwgcGcub3B0aW9uLnBvcHVwRGlmZk1heExpbmVzKSxcblx0XHRcdFx0cGcub3B0aW9uLnBvcHVwRGlmZkNvbnRleHRMaW5lc1xuXHRcdFx0KTtcblx0XHRcdG9sZGxpbmVzID0gaW5uZXIuYTtcblx0XHRcdG5ld2xpbmVzID0gaW5uZXIuYjtcblx0XHR9XG5cdFx0Y29uc3QgbGluZURpZmYgPSBkaWZmKG9sZGxpbmVzLCBuZXdsaW5lcyk7XG5cdFx0Y29uc3QgbGluZXMyID0gcm1Cb3JpbmdMaW5lcyhsaW5lRGlmZi5vLCBsaW5lRGlmZi5uKTtcblx0XHRjb25zdCBvbGRsaW5lczIgPSBsaW5lczIuYTtcblx0XHRjb25zdCBuZXdsaW5lczIgPSBsaW5lczIuYjtcblx0XHRsZXQgaHRtbCA9ICc8aHI+Jztcblx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBEaWZmRGF0ZXMnKSkge1xuXHRcdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZShuYXZwb3ApO1xuXHRcdFx0aHRtbCArPSAnPGhyPic7XG5cdFx0fVxuXHRcdGh0bWwgKz0gc2hvcnRlbkRpZmZTdHJpbmcoXG5cdFx0XHRkaWZmU3RyaW5nKG9sZGxpbmVzMi5qb2luKCdcXG4nKSwgbmV3bGluZXMyLmpvaW4oJ1xcbicpKSxcblx0XHRcdGdldFZhbHVlT2YoJ3BvcHVwRGlmZkNvbnRleHRDaGFyYWN0ZXJzJylcblx0XHQpLmpvaW4oJzxocj4nKTtcblx0XHRzZXRQb3B1cFRpcHNBbmRIVE1MKFxuXHRcdFx0aHRtbC5zcGxpdCgnXFxuJykuam9pbignPGJyPicpICtcblx0XHRcdFx0KHRydW5jYXRlZCA/IGA8aHI+PGI+JHtwb3B1cFN0cmluZygnRGlmZiB0cnVuY2F0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMnKX08L2I+YCA6ICcnKSxcblx0XHRcdCdwb3B1cFByZXZpZXcnLFxuXHRcdFx0bmF2cG9wLmlkTnVtYmVyXG5cdFx0KTtcblx0fTtcblx0Y29uc3QgZGlmZkRhdGVzVGFibGUgPSAobmF2cG9wKSA9PiB7XG5cdFx0bGV0IGh0bWwgPSAnPHRhYmxlIGNsYXNzPVwicG9wdXBfZGlmZl9kYXRlc1wiPic7XG5cdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZVJvdyhuYXZwb3AuZGlmZkRhdGEubmV3UmV2LnJldmlzaW9uLCB0cHJpbnRmKCdOZXcgcmV2aXNpb24nKSk7XG5cdFx0aHRtbCArPSBkaWZmRGF0ZXNUYWJsZVJvdyhuYXZwb3AuZGlmZkRhdGEub2xkUmV2LnJldmlzaW9uLCB0cHJpbnRmKCdPbGQgcmV2aXNpb24nKSk7XG5cdFx0aHRtbCArPSAnPC90YWJsZT4nO1xuXHRcdHJldHVybiBodG1sO1xuXHR9O1xuXHRjb25zdCBkaWZmRGF0ZXNUYWJsZVJvdyA9IChyZXZpc2lvbiwgbGFiZWwpID0+IHtcblx0XHRsZXQgdHh0ID0gJyc7XG5cdFx0Y29uc3QgbGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKHJldmlzaW9uLnRpbWVzdGFtcCk7XG5cdFx0dHh0ID0gZm9ybWF0dGVkRGF0ZVRpbWUobGFzdE1vZGlmaWVkRGF0ZSk7XG5cdFx0Y29uc3QgcmV2bGluayA9IGdlbmVyYWxMaW5rKHtcblx0XHRcdHVybDogYCR7bXcuY29uZmlnLmdldCgnd2dTY3JpcHQnKX0/b2xkaWQ9JHtyZXZpc2lvbi5yZXZpZH1gLFxuXHRcdFx0dGV4dDogbGFiZWwsXG5cdFx0XHR0aXRsZTogbGFiZWwsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHNpbXBsZVByaW50ZignPHRyPjx0ZD4lczwvdGQ+PHRkPiVzPC90ZD48L3RyPicsIFtyZXZsaW5rLCB0eHRdKTtcblx0fTtcblx0Ly8gRU5ERklMRTogZGlmZnByZXZpZXcuanNcblx0Ly8gU1RBUlRGSUxFOiBsaW5rcy5qc1xuXHQvLyBMSU5LIEdFTkVSQVRJT04gLy9cblx0Ly8gdGl0bGVkRGlmZkxpbmsgLS0+IHRpdGxlZFdpa2lMaW5rIC0tPiBnZW5lcmFsTGlua1xuXHQvLyB3aWtpTGlua1x0ICAgLS0+IHRpdGxlZFdpa2lMaW5rIC0tPiBnZW5lcmFsTGlua1xuXHQvLyBlZGl0Q291bnRlckxpbmsgLS0+IGdlbmVyYWxMaW5rXG5cdC8vIFRPRE8gTWFrZSB0aGVzZSBmdW5jdGlvbnMgcmV0dXJuIEVsZW1lbnQgb2JqZWN0cywgbm90IGp1c3QgcmF3IEhUTUwgc3RyaW5ncy5cblx0Y29uc3QgdGl0bGVkRGlmZkxpbmsgPSAobCkgPT4ge1xuXHRcdHJldHVybiB0aXRsZWRXaWtpTGluayh7XG5cdFx0XHRhcnRpY2xlOiBsLmFydGljbGUsXG5cdFx0XHRhY3Rpb246IGAke2wudG99Jm9sZGlkPSR7bC5mcm9tfWAsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0bm9Qb3B1cDogbC5ub1BvcHVwLFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0dGl0bGU6IGwudGl0bGUsXG5cdFx0XHQvKiBoYWNrOiBubyBvbGRpZCBoZXJlICovXG5cdFx0XHRhY3Rpb25OYW1lOiAnZGlmZicsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHdpa2lMaW5rID0gKGwpID0+IHtcblx0XHQvLyB7YXJ0aWNsZTphcnRpY2xlLCBhY3Rpb246YWN0aW9uLCB0ZXh0OnRleHQsIG9sZGlkLCBuZXdpZH0pIHtcblx0XHRpZiAoISh0eXBlb2YgbC5hcnRpY2xlID09PSB0eXBlb2Yge30gJiYgdHlwZW9mIGwuYWN0aW9uID09PSB0eXBlb2YgJycgJiYgdHlwZW9mIGwudGV4dCA9PT0gdHlwZW9mICcnKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGlmIChsLm9sZGlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGwub2xkaWQgPSBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBzYXZlZE9sZGlkID0gbC5vbGRpZDtcblx0XHRpZiAoIS9eKGVkaXR8dmlld3xyZXZlcnR8cmVuZGVyKSR8XnJhdy8udGVzdChsLmFjdGlvbikpIHtcblx0XHRcdGwub2xkaWQgPSBudWxsO1xuXHRcdH1cblx0XHRsZXQgaGludCA9IHBvcHVwU3RyaW5nKGAke2wuYWN0aW9ufUhpbnRgKTsgLy8gcmV2ZXJ0SGludCBldGMgZXRjIGV0Y1xuXHRcdGNvbnN0IG9sZGlkRGF0YSA9IFtsLm9sZGlkLCBzYWZlRGVjb2RlVVJJKGwuYXJ0aWNsZSldO1xuXHRcdGxldCByZXZpc2lvblN0cmluZyA9IHRwcmludGYoJ3JldmlzaW9uICVzIG9mICVzJywgb2xkaWREYXRhKTtcblx0XHRsb2coYHJldmlzaW9uU3RyaW5nPSR7cmV2aXNpb25TdHJpbmd9YCk7XG5cdFx0c3dpdGNoIChsLmFjdGlvbikge1xuXHRcdFx0Y2FzZSAnZWRpdCZzZWN0aW9uPW5ldyc6XG5cdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygnbmV3U2VjdGlvbkhpbnQnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlZGl0JnVuZG89Jzpcblx0XHRcdFx0aWYgKGwuZGlmZiAmJiBsLmRpZmYgIT09ICdwcmV2JyAmJiBzYXZlZE9sZGlkKSB7XG5cdFx0XHRcdFx0bC5hY3Rpb24gKz0gYCR7bC5kaWZmfSZ1bmRvYWZ0ZXI9JHtzYXZlZE9sZGlkfWA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc2F2ZWRPbGRpZCkge1xuXHRcdFx0XHRcdGwuYWN0aW9uICs9IHNhdmVkT2xkaWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGludCA9IHBvcHVwU3RyaW5nKCd1bmRvSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JhdyZjdHlwZT10ZXh0L2Nzcyc6XG5cdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygncmF3SGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JldmVydCc6IHtcblx0XHRcdFx0Y29uc3QgcCA9IHBhcnNlUGFyYW1zKHBnLmN1cnJlbnQubGluay5ocmVmKTtcblx0XHRcdFx0bC5hY3Rpb24gPSBgZWRpdCZhdXRvY2xpY2s9d3BTYXZlJmFjdG9rZW49JHthdXRvQ2xpY2tUb2tlbigpfSZhdXRvaW1wbD0ke3BvcHVwU3RyaW5nKFxuXHRcdFx0XHRcdCdhdXRvZWRpdF92ZXJzaW9uJ1xuXHRcdFx0XHQpfSZhdXRvc3VtbWFyeT0ke3JldmVydFN1bW1hcnkobC5vbGRpZCwgcC5kaWZmKX1gO1xuXHRcdFx0XHRpZiAocC5kaWZmID09PSAncHJldicpIHtcblx0XHRcdFx0XHRsLmFjdGlvbiArPSAnJmRpcmVjdGlvbj1wcmV2Jztcblx0XHRcdFx0XHRyZXZpc2lvblN0cmluZyA9IHRwcmludGYoJ3RoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyBvZiAlcycsIG9sZGlkRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwUmV2ZXJ0U3VtbWFyeVByb21wdCcpKSB7XG5cdFx0XHRcdFx0bC5hY3Rpb24gKz0gJyZhdXRvc3VtbWFyeXByb21wdD10cnVlJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZ2V0VmFsdWVPZigncG9wdXBNaW5vclJldmVydHMnKSkge1xuXHRcdFx0XHRcdGwuYWN0aW9uICs9ICcmYXV0b21pbm9yPXRydWUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxvZyhgcmV2aXNpb25TdHJpbmcgaXMgbm93ICR7cmV2aXNpb25TdHJpbmd9YCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnbnVsbEVkaXQnOlxuXHRcdFx0XHRsLmFjdGlvbiA9IGBlZGl0JmF1dG9jbGljaz13cFNhdmUmYWN0b2tlbj0ke2F1dG9DbGlja1Rva2VuKCl9JmF1dG9pbXBsPSR7cG9wdXBTdHJpbmcoXG5cdFx0XHRcdFx0J2F1dG9lZGl0X3ZlcnNpb24nXG5cdFx0XHRcdCl9JmF1dG9zdW1tYXJ5PW51bGxgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2hpc3RvcnlmZWVkJzpcblx0XHRcdFx0bC5hY3Rpb24gPSAnaGlzdG9yeSZmZWVkPXJzcyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWFya3BhdHJvbGxlZCc6XG5cdFx0XHRcdGwuYWN0aW9uID0gYG1hcmtwYXRyb2xsZWQmcmNpZD0ke2wucmNpZH1gO1xuXHRcdH1cblx0XHRpZiAoaGludCkge1xuXHRcdFx0aGludCA9IGwub2xkaWQgPyBzaW1wbGVQcmludGYoaGludCwgW3JldmlzaW9uU3RyaW5nXSkgOiBzaW1wbGVQcmludGYoaGludCwgW3NhZmVEZWNvZGVVUkkobC5hcnRpY2xlKV0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaW50ID0gc2FmZURlY29kZVVSSShgJHtsLmFydGljbGV9JmFjdGlvbj0ke2wuYWN0aW9ufWApICsgbC5vbGRpZCA/IGAmb2xkaWQ9JHtsLm9sZGlkfWAgOiAnJztcblx0XHR9XG5cdFx0cmV0dXJuIHRpdGxlZFdpa2lMaW5rKHtcblx0XHRcdGFydGljbGU6IGwuYXJ0aWNsZSxcblx0XHRcdGFjdGlvbjogbC5hY3Rpb24sXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0dGl0bGU6IGhpbnQsXG5cdFx0XHRvbGRpZDogbC5vbGRpZCxcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHRcdG9uY2xpY2s6IGwub25jbGljayxcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcmV2ZXJ0U3VtbWFyeSA9IChvbGRpZCwgZGlmZikgPT4ge1xuXHRcdGxldCByZXQgPSAnJztcblx0XHRyZXQgPVxuXHRcdFx0ZGlmZiA9PT0gJ3ByZXYnXG5cdFx0XHRcdD8gZ2V0VmFsdWVPZigncG9wdXBRdWVyaWVkUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnknKVxuXHRcdFx0XHQ6IGdldFZhbHVlT2YoJ3BvcHVwUXVlcmllZFJldmVydFN1bW1hcnknKTtcblx0XHRyZXR1cm4gYCR7cmV0fSZhdXRvcnY9JHtvbGRpZH1gO1xuXHR9O1xuXHRjb25zdCB0aXRsZWRXaWtpTGluayA9IChsKSA9PiB7XG5cdFx0Ly8gcG9zc2libGUgcHJvcGVydGllcyBvZiBhcmd1bWVudDpcblx0XHQvLyBhcnRpY2xlLCBhY3Rpb24sIHRleHQsIHRpdGxlLCBvbGRpZCwgYWN0aW9uTmFtZSwgY2xhc3NOYW1lLCBub1BvcHVwXG5cdFx0Ly8gb2xkaWQgPSBudWxsIGlzIGZpbmUgaGVyZVxuXHRcdC8vIGFydGljbGUgYW5kIGFjdGlvbiBhcmUgbWFuZGF0b3J5IGFyZ3Ncblx0XHRpZiAobC5hcnRpY2xlID09PSB1bmRlZmluZWQgfHwgbC5hY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXJybG9nKCdnb3QgdW5kZWZpbmVkIGFydGljbGUgb3IgYWN0aW9uIGluIHRpdGxlZFdpa2lMaW5rJyk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgYmFzZSA9IHBnLndpa2kudGl0bGViYXNlICsgbC5hcnRpY2xlLnVybFN0cmluZygpO1xuXHRcdGxldCB1cmwgPSBiYXNlO1xuXHRcdGlmIChsLmFjdGlvbk5hbWUgPT09IHVuZGVmaW5lZCB8fCAhbC5hY3Rpb25OYW1lKSB7XG5cdFx0XHRsLmFjdGlvbk5hbWUgPSAnYWN0aW9uJztcblx0XHR9XG5cdFx0Ly8gbm8gbmVlZCB0byBhZGQgJmFjdGlvbj12aWV3LCBhbmQgdGhpcyBjb25mdXNlcyBhbmNob3JzXG5cdFx0aWYgKGwuYWN0aW9uICE9PSAndmlldycpIHtcblx0XHRcdHVybCA9IGAke2Jhc2V9JiR7bC5hY3Rpb25OYW1lfT0ke2wuYWN0aW9ufWA7XG5cdFx0fVxuXHRcdGlmIChsLm9sZGlkICE9PSB1bmRlZmluZWQgJiYgbC5vbGRpZCkge1xuXHRcdFx0dXJsICs9IGAmb2xkaWQ9JHtsLm9sZGlkfWA7XG5cdFx0fVxuXHRcdGxldCBjc3NDbGFzcyA9IHBnLm1pc2MuZGVmYXVsdE5hdmxpbmtDbGFzc25hbWU7XG5cdFx0aWYgKGwuY2xhc3NOYW1lICE9PSB1bmRlZmluZWQgJiYgbC5jbGFzc05hbWUpIHtcblx0XHRcdGNzc0NsYXNzID0gbC5jbGFzc05hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmwsXG5cdFx0XHRuZXdXaW46IGwubmV3V2luLFxuXHRcdFx0dGl0bGU6IGwudGl0bGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBsLnRpdGxlLFxuXHRcdFx0dGV4dDogbC50ZXh0ID09PSB1bmRlZmluZWQgPyBudWxsIDogbC50ZXh0LFxuXHRcdFx0Y2xhc3NOYW1lOiBjc3NDbGFzcyxcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHRcdG9uY2xpY2s6IGwub25jbGljayxcblx0XHR9KTtcblx0fTtcblx0cGcuZm4uZ2V0TGFzdENvbnRyaWIgPSAod2lraXBhZ2UsIG5ld1dpbikgPT4ge1xuXHRcdGdldEhpc3RvcnlJbmZvKHdpa2lwYWdlLCAoeCkgPT4ge1xuXHRcdFx0cHJvY2Vzc0xhc3RDb250cmliSW5mbyh4LCB7cGFnZTogd2lraXBhZ2UsIG5ld1dpbn0pO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBwcm9jZXNzTGFzdENvbnRyaWJJbmZvID0gKGluZm8sIHN0dWZmKSA9PiB7XG5cdFx0aWYgKCFpbmZvLmVkaXRzIHx8IGluZm8uZWRpdHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRtdy5ub3RpZnkoJ1BvcHVwczogYW4gb2RkIHRoaW5nIGhhcHBlbmVkLiBQbGVhc2UgcmV0cnkuJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKCFpbmZvLmZpcnN0TmV3RWRpdG9yKSB7XG5cdFx0XHRtdy5ub3RpZnkodHByaW50ZignT25seSBmb3VuZCBvbmUgZWRpdG9yOiAlcyBtYWRlICVzIGVkaXRzJywgW2luZm8uZWRpdHNbMF0uZWRpdG9yLCBpbmZvLmVkaXRzLmxlbmd0aF0pLCB7XG5cdFx0XHRcdHRhZzogJ3BvcHVwcycsXG5cdFx0XHRcdHR5cGU6ICdlcnJvcicsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgbmV3VXJsID0gYCR7cGcud2lraS50aXRsZWJhc2UgKyBuZXcgVGl0bGUoc3R1ZmYucGFnZSkudXJsU3RyaW5nKCl9JmRpZmY9Y3VyJm9sZGlkPSR7XG5cdFx0XHRpbmZvLmZpcnN0TmV3RWRpdG9yLm9sZGlkXG5cdFx0fWA7XG5cdFx0ZGlzcGxheVVybChuZXdVcmwsIHN0dWZmLm5ld1dpbik7XG5cdH07XG5cdHBnLmZuLmdldERpZmZTaW5jZU15RWRpdCA9ICh3aWtpcGFnZSwgbmV3V2luKSA9PiB7XG5cdFx0Z2V0SGlzdG9yeUluZm8od2lraXBhZ2UsICh4KSA9PiB7XG5cdFx0XHRwcm9jZXNzRGlmZlNpbmNlTXlFZGl0KHgsIHtwYWdlOiB3aWtpcGFnZSwgbmV3V2lufSk7XG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHByb2Nlc3NEaWZmU2luY2VNeUVkaXQgPSAoaW5mbywgc3R1ZmYpID0+IHtcblx0XHRpZiAoIWluZm8uZWRpdHMgfHwgaW5mby5lZGl0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdG13Lm5vdGlmeSgnUG9wdXBzOiBzb21ldGhpbmcgZmlzaHkgaGFwcGVuZWQuIFBsZWFzZSB0cnkgYWdhaW4uJywge3RhZzogJ3BvcHVwcycsIHR5cGU6ICdlcnJvcid9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZnJpZW5kbHlOYW1lID0gc3R1ZmYucGFnZS5zcGxpdCgnXycpLmpvaW4oJyAnKTtcblx0XHRpZiAoIWluZm8ubXlMYXN0RWRpdCkge1xuXHRcdFx0bXcubm90aWZ5KFxuXHRcdFx0XHR0cHJpbnRmKFwiQ291bGRuJ3QgZmluZCBhbiBlZGl0IGJ5ICVzXFxuaW4gdGhlIGxhc3QgJXMgZWRpdHMgdG9cXG4lc1wiLCBbXG5cdFx0XHRcdFx0aW5mby51c2VyTmFtZSxcblx0XHRcdFx0XHRnZXRWYWx1ZU9mKCdwb3B1cEhpc3RvcnlMaW1pdCcpLFxuXHRcdFx0XHRcdGZyaWVuZGx5TmFtZSxcblx0XHRcdFx0XSksXG5cdFx0XHRcdHt0YWc6ICdwb3B1cHMnLCB0eXBlOiAnZXJyb3InfVxuXHRcdFx0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKGluZm8ubXlMYXN0RWRpdC5pbmRleCA9PT0gMCkge1xuXHRcdFx0bXcubm90aWZ5KHRwcmludGYoJyVzIHNlZW1zIHRvIGJlIHRoZSBsYXN0IGVkaXRvciB0byB0aGUgcGFnZSAlcycsIFtpbmZvLnVzZXJOYW1lLCBmcmllbmRseU5hbWVdKSwge1xuXHRcdFx0XHR0eXBlOiAnZXJyb3InLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG5ld1VybCA9IGAke3BnLndpa2kudGl0bGViYXNlICsgbmV3IFRpdGxlKHN0dWZmLnBhZ2UpLnVybFN0cmluZygpfSZkaWZmPWN1ciZvbGRpZD0ke1xuXHRcdFx0aW5mby5teUxhc3RFZGl0Lm9sZGlkXG5cdFx0fWA7XG5cdFx0ZGlzcGxheVVybChuZXdVcmwsIHN0dWZmLm5ld1dpbik7XG5cdH07XG5cdGNvbnN0IGRpc3BsYXlVcmwgPSAodXJsLCBuZXdXaW4pID0+IHtcblx0XHRpZiAobmV3V2luKSB7XG5cdFx0XHR3aW5kb3cub3Blbih1cmwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkb2N1bWVudC5sb2NhdGlvbiA9IHVybDtcblx0XHR9XG5cdH07XG5cdHBnLmZuLnB1cmdlUG9wdXBzID0gKCkgPT4ge1xuXHRcdHByb2Nlc3NBbGxQb3B1cHModHJ1ZSk7XG5cdFx0c2V0dXBDYWNoZSgpOyAvLyBkZWxldGVzIGFsbCBjYWNoZWQgaXRlbXMgKG5vdCBicm93c2VyIGNhY2hlZCwgdGhvdWdoLi4uKVxuXHRcdHBnLm9wdGlvbiA9IHt9O1xuXHRcdGFib3J0QWxsRG93bmxvYWRzKCk7XG5cdH07XG5cdGNvbnN0IHByb2Nlc3NBbGxQb3B1cHMgPSAobnVsbGlmeSwgYmFuaXNoKSA9PiB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IHBnLmN1cnJlbnQubGlua3MgJiYgaSA8IHBnLmN1cnJlbnQubGlua3MubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICghcGcuY3VycmVudC5saW5rc1tpXS5uYXZwb3B1cCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChudWxsaWZ5IHx8IGJhbmlzaCkge1xuXHRcdFx0XHRwZy5jdXJyZW50LmxpbmtzW2ldLm5hdnBvcHVwLmJhbmlzaCgpO1xuXHRcdFx0fVxuXHRcdFx0cGcuY3VycmVudC5saW5rc1tpXS5zaW1wbGVOb01vcmUgPSBmYWxzZTtcblx0XHRcdGlmIChudWxsaWZ5KSB7XG5cdFx0XHRcdHBnLmN1cnJlbnQubGlua3NbaV0ubmF2cG9wdXAgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0cGcuZm4uZGlzYWJsZVBvcHVwcyA9ICgpID0+IHtcblx0XHRwcm9jZXNzQWxsUG9wdXBzKGZhbHNlLCB0cnVlKTtcblx0XHRzZXR1cFRvb2x0aXBzKG51bGwsIHRydWUpO1xuXHR9O1xuXHRwZy5mbi50b2dnbGVQcmV2aWV3cyA9ICgpID0+IHtcblx0XHRwcm9jZXNzQWxsUG9wdXBzKHRydWUsIHRydWUpO1xuXHRcdHBnLm9wdGlvbi5zaW1wbGVQb3B1cHMgPSAhcGcub3B0aW9uLnNpbXBsZVBvcHVwcztcblx0XHRhYm9ydEFsbERvd25sb2FkcygpO1xuXHR9O1xuXHRjb25zdCBtYWdpY1dhdGNoTGluayA9IGZ1bmN0aW9uIG1hZ2ljV2F0Y2hMaW5rKGwpIHtcblx0XHQvLyBZdWNrISEgV291bGQgcmVxdWlyZSBhIHRob3JvdWdoIHJlZGVzaWduIHRvIGFkZCB0aGlzIGFzIGEgY2xpY2sgZXZlbnQgdGhvdWdoIC4uLlxuXHRcdGwub25jbGljayA9IHNpbXBsZVByaW50ZihcInBnLmZuLm1vZGlmeVdhdGNobGlzdCgnJXMnLCclcycpO3JldHVybiBmYWxzZTtcIiwgW1xuXHRcdFx0bC5hcnRpY2xlXG5cdFx0XHRcdC50b1N0cmluZyh0cnVlKVxuXHRcdFx0XHQuc3BsaXQoJ1xcXFwnKVxuXHRcdFx0XHQuam9pbignXFxcXFxcXFwnKVxuXHRcdFx0XHQuc3BsaXQoXCInXCIpXG5cdFx0XHRcdC5qb2luKFN0cmluZy5yYXdgXFwnYCksXG5cdFx0XHR0aGlzLmlkLFxuXHRcdF0pO1xuXHRcdHJldHVybiB3aWtpTGluayhsKTtcblx0fTtcblx0cGcuZm4ubW9kaWZ5V2F0Y2hsaXN0ID0gYXN5bmMgKHRpdGxlLCBhY3Rpb24pID0+IHtcblx0XHRjb25zdCByZXFEYXRhID0ge1xuXHRcdFx0YWN0aW9uOiAnd2F0Y2gnLFxuXHRcdFx0Zm9ybWF0dmVyc2lvbjogJzInLFxuXHRcdFx0dGl0bGVzOiB0aXRsZSxcblx0XHRcdHVzZWxhbmc6IG13LmNvbmZpZy5nZXQoJ3dnVXNlckxhbmd1YWdlJyksXG5cdFx0fTtcblx0XHRpZiAoYWN0aW9uID09PSAndW53YXRjaCcpIHtcblx0XHRcdHJlcURhdGEudW53YXRjaCA9IHRydWU7XG5cdFx0fVxuXHRcdC8vIExvYWQgdGhlIEFkZGVkd2F0Y2h0ZXh0IG9yIFJlbW92ZWR3YXRjaHRleHQgbWVzc2FnZSBhbmQgc2hvdyBpdFxuXHRcdGNvbnN0IG13VGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aXRsZSk7XG5cdFx0bGV0IG1lc3NhZ2VOYW1lO1xuXHRcdGlmIChtd1RpdGxlICYmIG13VGl0bGUuZ2V0TmFtZXNwYWNlSWQoKSA+IDAgJiYgbXdUaXRsZS5nZXROYW1lc3BhY2VJZCgpICUgMiA9PT0gMSkge1xuXHRcdFx0bWVzc2FnZU5hbWUgPSBhY3Rpb24gPT09ICd3YXRjaCcgPyAnYWRkZWR3YXRjaHRleHQtdGFsaycgOiAncmVtb3ZlZHdhdGNodGV4dC10YWxrJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVzc2FnZU5hbWUgPSBhY3Rpb24gPT09ICd3YXRjaCcgPyAnYWRkZWR3YXRjaHRleHQnIDogJ3JlbW92ZWR3YXRjaHRleHQnO1xuXHRcdH1cblx0XHRhd2FpdCBnZXRNd0FwaSgpLnBvc3RXaXRoVG9rZW4oJ3dhdGNoJywgcmVxRGF0YSk7XG5cdFx0YXdhaXQgZ2V0TXdBcGkoKS5sb2FkTWVzc2FnZXNJZk1pc3NpbmcoW21lc3NhZ2VOYW1lXSk7XG5cdFx0Ly8gTWVzc2FnZXMgdGhhdCBjYW4gYmUgdXNlZCBoZXJlOlxuXHRcdC8vICogc2VlIHN0cmluZy5qc1xuXHRcdC8vICogZm9yIG1vcmUgaW5mb3JtYXRpb25cblx0XHRtdy5ub3RpZnkobXcubWVzc2FnZShtZXNzYWdlTmFtZSwgdGl0bGUpLnBhcnNlRG9tKCksIHt0YWc6ICdwb3B1cHMnfSk7XG5cdH07XG5cdGNvbnN0IG1hZ2ljSGlzdG9yeUxpbmsgPSAobCkgPT4ge1xuXHRcdC8vIEZJWE1FIHVzZSBvbmNsaWNrIGNoYW5nZSBocmVmIHRyaWNrIHRvIHNvcnQgdGhpcyBvdXQgaW5zdGVhZCBvZiB3aW5kb3cub3BlblxuXHRcdGxldCBqc1VybCA9ICcnO1xuXHRcdGxldCB0aXRsZSA9ICcnO1xuXHRcdGxldCBvbkNsaWNrID0gJyc7XG5cdFx0c3dpdGNoIChsLmlkKSB7XG5cdFx0XHRjYXNlICdsYXN0Q29udHJpYic6XG5cdFx0XHRcdG9uQ2xpY2sgPSBzaW1wbGVQcmludGYoXCJwZy5mbi5nZXRMYXN0Q29udHJpYignJXMnLCVzKVwiLCBbXG5cdFx0XHRcdFx0bC5hcnRpY2xlXG5cdFx0XHRcdFx0XHQudG9TdHJpbmcodHJ1ZSlcblx0XHRcdFx0XHRcdC5zcGxpdCgnXFxcXCcpXG5cdFx0XHRcdFx0XHQuam9pbignXFxcXFxcXFwnKVxuXHRcdFx0XHRcdFx0LnNwbGl0KFwiJ1wiKVxuXHRcdFx0XHRcdFx0LmpvaW4oU3RyaW5nLnJhd2BcXCdgKSxcblx0XHRcdFx0XHRsLm5ld1dpbixcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHRpdGxlID0gcG9wdXBTdHJpbmcoJ2xhc3RDb250cmliSGludCcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NpbmNlTWUnOlxuXHRcdFx0XHRvbkNsaWNrID0gc2ltcGxlUHJpbnRmKFwicGcuZm4uZ2V0RGlmZlNpbmNlTXlFZGl0KCclcycsJXMpXCIsIFtcblx0XHRcdFx0XHRsLmFydGljbGVcblx0XHRcdFx0XHRcdC50b1N0cmluZyh0cnVlKVxuXHRcdFx0XHRcdFx0LnNwbGl0KCdcXFxcJylcblx0XHRcdFx0XHRcdC5qb2luKCdcXFxcXFxcXCcpXG5cdFx0XHRcdFx0XHQuc3BsaXQoXCInXCIpXG5cdFx0XHRcdFx0XHQuam9pbihTdHJpbmcucmF3YFxcJ2ApLFxuXHRcdFx0XHRcdGwubmV3V2luLFxuXHRcdFx0XHRdKTtcblx0XHRcdFx0dGl0bGUgPSBwb3B1cFN0cmluZygnc2luY2VNZUhpbnQnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGpzVXJsID0gYGphdmFzY3JpcHQ6JHtvbkNsaWNrfWA7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdG9uQ2xpY2sgKz0gJztyZXR1cm4gZmFsc2U7Jztcblx0XHRyZXR1cm4gZ2VuZXJhbE5hdkxpbmsoe1xuXHRcdFx0dXJsOiBqc1VybCxcblx0XHRcdG5ld1dpbjogZmFsc2UsXG5cdFx0XHR0aXRsZSxcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5vUG9wdXA6IGwubm9Qb3B1cCxcblx0XHRcdG9uY2xpY2s6IG9uQ2xpY2ssXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHBvcHVwTWVudUxpbmsgPSAobCkgPT4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zY3JpcHQtdXJsXG5cdFx0Y29uc3QganNVcmwgPSBzaW1wbGVQcmludGYoJ2phdmFzY3JpcHQ6cGcuZm4uJXMoKScsIFtsLmlkXSk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdGNvbnN0IHRpdGxlID0gcG9wdXBTdHJpbmcoc2ltcGxlUHJpbnRmKCclc0hpbnQnLCBbbC5pZF0pKTtcblx0XHRjb25zdCBvbkNsaWNrID0gc2ltcGxlUHJpbnRmKCdwZy5mbi4lcygpO3JldHVybiBmYWxzZTsnLCBbbC5pZF0pO1xuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmw6IGpzVXJsLFxuXHRcdFx0bmV3V2luOiBmYWxzZSxcblx0XHRcdHRpdGxlLFxuXHRcdFx0dGV4dDogbC50ZXh0LFxuXHRcdFx0bm9Qb3B1cDogbC5ub1BvcHVwLFxuXHRcdFx0b25jbGljazogb25DbGljayxcblx0XHR9KTtcblx0fTtcblx0Y29uc3Qgc3BlY2lhbExpbmsgPSAobCkgPT4ge1xuXHRcdC8vIHByb3BlcnRpZXM6IGFydGljbGUsIHNwZWNpYWxwYWdlLCB0ZXh0LCBzZXBcblx0XHRpZiAobC5zcGVjaWFscGFnZSA9PT0gdW5kZWZpbmVkIHx8ICFsLnNwZWNpYWxwYWdlKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgYmFzZSA9IGAke3BnLndpa2kudGl0bGViYXNlICsgbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbcGcubnNTcGVjaWFsSWRdfToke2wuc3BlY2lhbHBhZ2V9YDtcblx0XHRpZiAobC5zZXAgPT09IHVuZGVmaW5lZCB8fCBsLnNlcCA9PT0gbnVsbCkge1xuXHRcdFx0bC5zZXAgPSAnJnRhcmdldD0nO1xuXHRcdH1cblx0XHRsZXQgYXJ0aWNsZSA9IGwuYXJ0aWNsZS51cmxTdHJpbmcoe1xuXHRcdFx0a2VlcFNwYWNlczogbC5zcGVjaWFscGFnZSA9PT0gJ1NlYXJjaCcsXG5cdFx0fSk7XG5cdFx0bGV0IGhpbnQgPSBwb3B1cFN0cmluZyhgJHtsLnNwZWNpYWxwYWdlfUhpbnRgKTtcblx0XHRzd2l0Y2ggKGwuc3BlY2lhbHBhZ2UpIHtcblx0XHRcdGNhc2UgJ0xvZyc6XG5cdFx0XHRcdHN3aXRjaCAobC5zZXApIHtcblx0XHRcdFx0XHRjYXNlICcmdXNlcj0nOlxuXHRcdFx0XHRcdFx0aGludCA9IHBvcHVwU3RyaW5nKCd1c2VyTG9nSGludCcpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnJnR5cGU9YmxvY2smcGFnZT0nOlxuXHRcdFx0XHRcdFx0aGludCA9IHBvcHVwU3RyaW5nKCdibG9ja0xvZ0hpbnQnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJyZwYWdlPSc6XG5cdFx0XHRcdFx0XHRoaW50ID0gcG9wdXBTdHJpbmcoJ3BhZ2VMb2dIaW50Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICcmdHlwZT1wcm90ZWN0JnBhZ2U9Jzpcblx0XHRcdFx0XHRcdGhpbnQgPSBwb3B1cFN0cmluZygncHJvdGVjdExvZ0hpbnQnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJyZ0eXBlPWRlbGV0ZSZwYWdlPSc6XG5cdFx0XHRcdFx0XHRoaW50ID0gcG9wdXBTdHJpbmcoJ2RlbGV0ZUxvZ0hpbnQnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRsb2coYFVua25vd24gbG9nIHR5cGUsIHNlcD0ke2wuc2VwfWApO1xuXHRcdFx0XHRcdFx0aGludCA9ICdNaXNzaW5nIGhpbnQgKEZJWE1FKSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQcmVmaXhJbmRleCc6XG5cdFx0XHRcdGFydGljbGUgKz0gJy8nO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aGludCA9IGhpbnQgPyBzaW1wbGVQcmludGYoaGludCwgW3NhZmVEZWNvZGVVUkkobC5hcnRpY2xlKV0pIDogc2FmZURlY29kZVVSSShgJHtsLnNwZWNpYWxwYWdlfToke2wuYXJ0aWNsZX1gKTtcblx0XHRjb25zdCB1cmwgPSBiYXNlICsgbC5zZXAgKyBhcnRpY2xlO1xuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmwsXG5cdFx0XHR0aXRsZTogaGludCxcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5ld1dpbjogbC5uZXdXaW4sXG5cdFx0XHRub1BvcHVwOiBsLm5vUG9wdXAsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IGdlbmVyYWxMaW5rID0gKGwpID0+IHtcblx0XHQvLyBsLnVybCwgbC50ZXh0LCBsLnRpdGxlLCBsLm5ld1dpbiwgbC5jbGFzc05hbWUsIGwubm9Qb3B1cCwgbC5vbmNsaWNrXG5cdFx0aWYgKGwudXJsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHQvLyBvbmx5IHF1b3RhdGlvbiBtYXJrcyBpbiB0aGUgdXJsIGNhbiBzY3JldyB1cyB1cCBub3cuLi4gSSB0aGlua1xuXHRcdGNvbnN0IHVybCA9IGwudXJsLnNwbGl0KCdcIicpLmpvaW4oJyUyMicpO1xuXHRcdGxldCByZXQgPSBgPGEgaHJlZj1cIiR7dXJsfVwiYDtcblx0XHRpZiAobC50aXRsZSAhPT0gdW5kZWZpbmVkICYmIGwudGl0bGUpIHtcblx0XHRcdHJldCArPSBgIHRpdGxlPVwiJHtwZy5lc2NhcGVRdW90ZXNIVE1MKGwudGl0bGUpfVwiYDtcblx0XHR9XG5cdFx0aWYgKGwub25jbGljayAhPT0gdW5kZWZpbmVkICYmIGwub25jbGljaykge1xuXHRcdFx0cmV0ICs9IGAgb25jbGljaz1cIiR7cGcuZXNjYXBlUXVvdGVzSFRNTChsLm9uY2xpY2spfVwiYDtcblx0XHR9XG5cdFx0aWYgKGwubm9Qb3B1cCkge1xuXHRcdFx0cmV0ICs9ICcgbm9Qb3B1cD0xJztcblx0XHR9XG5cdFx0bGV0IG5ld1dpbjtcblx0XHRpZiAobC5uZXdXaW4gPT09IHVuZGVmaW5lZCB8fCBsLm5ld1dpbiA9PT0gbnVsbCkge1xuXHRcdFx0bmV3V2luID0gZ2V0VmFsdWVPZigncG9wdXBOZXdXaW5kb3dzJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCh7bmV3V2lufSA9IGwpO1xuXHRcdH1cblx0XHRpZiAobmV3V2luKSB7XG5cdFx0XHRyZXQgKz0gJyByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiJztcblx0XHR9XG5cdFx0aWYgKGwuY2xhc3NOYW1lICE9PSB1bmRlZmluZWQgJiYgbC5jbGFzc05hbWUpIHtcblx0XHRcdHJldCArPSBgIGNsYXNzPVwiJHtsLmNsYXNzTmFtZX1cImA7XG5cdFx0fVxuXHRcdHJldCArPSAnPic7XG5cdFx0aWYgKHR5cGVvZiBsLnRleHQgPT09IHR5cGVvZiAnJykge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBIVE1MLWVzY2FwZSB0aGlzIHRvIGF2b2lkIFhTUywgYnV0IHdlIGFsc28gd2FudCB0b1xuXHRcdFx0Ly8gZGlzcGxheSBhbnkgZXhpc3RpbmcgSFRNTCBlbnRpdGllcyBjb3JyZWN0bHksIHNvIHVuZXNjYXBlIGl0IGZpcnN0LlxuXHRcdFx0Ly8gRm9yIGV4YW1wbGUsIHRoZSBkaXNwbGF5IHRleHQgb2YgdGhlIHVzZXIgcGFnZSBtZW51IGl0ZW0gaXMgZGVmaW5lZFxuXHRcdFx0Ly8gYXMgXCJ1c2VyJm5ic3A7cGFnZVwiLCBzbyB3ZSBuZWVkIHRvIHVuZXNjYXBlIGZpcnN0IHRvIGF2b2lkIGl0IGJlaW5nXG5cdFx0XHQvLyBlc2NhcGVkIHRvIFwidXNlciZhbXA7bmJzcDtwYWdlXCIuXG5cdFx0XHRyZXQgKz0gcGcuZXNjYXBlUXVvdGVzSFRNTChwZy51bmVzY2FwZVF1b3Rlc0hUTUwobC50ZXh0KSk7XG5cdFx0fVxuXHRcdHJldCArPSAnPC9hPic7XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgYXBwZW5kUGFyYW1zVG9MaW5rID0gKGxpbmtzdHIsIHBhcmFtcykgPT4ge1xuXHRcdGNvbnN0IHNwID0gbGlua3N0ci5zcGxpdCgvKGhyZWY9XCJbXlwiXSs/KVwiL2kpO1xuXHRcdGlmIChzcC5sZW5ndGggPCAyKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0bGV0IHJldCA9IHNwLnNoaWZ0KCkgKyBzcC5zaGlmdCgpO1xuXHRcdHJldCArPSBgJiR7cGFyYW1zfVwiYDtcblx0XHRyZXQgKz0gc3Auam9pbignJyk7XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3QgY2hhbmdlTGlua1RhcmdldExpbmsgPSAoeCkgPT4ge1xuXHRcdC8vIG5ld1RhcmdldCwgdGV4dCwgaGludCwgc3VtbWFyeSwgY2xpY2tCdXR0b24sIG1pbm9yLCB0aXRsZSAob3B0aW9uYWwpLCBhbHNvQ2hhbmdlTGFiZWwge1xuXHRcdGlmICh4Lm5ld1RhcmdldCkge1xuXHRcdFx0bG9nKGBjaGFuZ2VMaW5rVGFyZ2V0TGluazogbmV3VGFyZ2V0PSR7eC5uZXdUYXJnZXR9YCk7XG5cdFx0fVxuXHRcdGlmICh4Lm9sZFRhcmdldCAhPT0gZGVjb2RlVVJJQ29tcG9uZW50KHgub2xkVGFyZ2V0KSkge1xuXHRcdFx0bG9nKGBUaGlzIG1pZ2h0IGJlIGFuIGlucHV0IHByb2JsZW06ICR7eC5vbGRUYXJnZXR9YCk7XG5cdFx0fVxuXHRcdC8vIEZJWE1FOiBmaXJzdCBjaGFyYWN0ZXIgb2YgcGFnZSB0aXRsZSBhcyB3ZWxsIGFzIG5hbWVzcGFjZSBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZVxuXHRcdC8vIGVnIFtbOmNhdGVnb3J5OlgxXV0gYW5kIFtbOkNhdGVnb3J5OlgxXV0gYXJlIGVxdWl2YWxlbnRcblx0XHQvLyB0aGlzJ2xsIGJyZWFrIGlmIGNoYXJBdCgwKSBpcyBuYXN0eVxuXHRcdGNvbnN0IGNBID0gbXcudXRpbC5lc2NhcGVSZWdFeHAoeC5vbGRUYXJnZXQpO1xuXHRcdGxldCBjaHMgPSBjQS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcblx0XHRjaHMgPSBgWyR7Y2hzfSR7Y2hzLnRvTG93ZXJDYXNlKCl9XWA7XG5cdFx0bGV0IGN1cnJlbnRBcnRpY2xlUmVnZXhCaXQgPSBjaHMgKyBjQS5zbGljZSgxKTtcblx0XHRjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0ID0gY3VycmVudEFydGljbGVSZWdleEJpdFxuXHRcdFx0LnNwbGl0KC9bIF9dK3wlMjAvZylcblx0XHRcdC5qb2luKCcoPzpbXyBdK3wlMjApJylcblx0XHRcdC5zcGxpdChTdHJpbmcucmF3YFxcKGApXG5cdFx0XHQuam9pbihTdHJpbmcucmF3YCg/OiUyOHxcXCgpYClcblx0XHRcdC5zcGxpdChTdHJpbmcucmF3YFxcKWApXG5cdFx0XHQuam9pbihTdHJpbmcucmF3YCg/OiUyOXxcXCkpYCk7IC8vIHdoeSBkb2VzIHRoaXMgbmVlZCB0byBtYXRjaCBlbmNvZGVkIHN0cmluZ3MgPyBsaW5rcyBpbiB0aGUgZG9jdW1lbnQgP1xuXG5cdFx0Ly8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2Ugc2hvdWxkIGJlIGlnbm9yZWQsIGFuZCBhbmNob3IgYml0cyBvcHRpb25hbDpcblx0XHRjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0ID0gYFxcXFxzKigke2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9KD86I1teXFxcXFtcXFxcfF0qKT8pXFxcXHMqYDtcblx0XHQvLyBlLmcuIENvbXB1dGVyIChhcmNoYWljKSAtPiBcXHMqKFtDY11vbXB1dGVyW18gXSg/OiUyNTI4fFxcKClhcmNoYWljKD86JTI1Mjh8XFwpKSlcXHMqXG5cdFx0Ly8gYXV0b2VkaXQ9c35cXFtcXFsoW0NjXWFkKVxcXVxcXX5bW0NvbXB1dGVyLWFpZGVkJTIwZGVzaWdufCQxXV1+ZztzflxcW1xcWyhbQ2NdQUQpW3xdfltbQ29tcHV0ZXItYWlkZWQlMjBkZXNpZ258fmdcblx0XHRjb25zdCB0aXRsZSA9IHgudGl0bGUgfHwgbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLnNwbGl0KCdfJykuam9pbignICcpO1xuXHRcdGNvbnN0IGxrID0gdGl0bGVkV2lraUxpbmsoe1xuXHRcdFx0YXJ0aWNsZTogbmV3IFRpdGxlKHRpdGxlKSxcblx0XHRcdG5ld1dpbjogeC5uZXdXaW4sXG5cdFx0XHRhY3Rpb246ICdlZGl0Jyxcblx0XHRcdHRleHQ6IHgudGV4dCxcblx0XHRcdHRpdGxlOiB4LmhpbnQsXG5cdFx0XHRjbGFzc05hbWU6ICdwb3B1cF9jaGFuZ2VfdGl0bGVfbGluaycsXG5cdFx0fSk7XG5cdFx0bGV0IGNtZCA9ICcnO1xuXHRcdGlmICh4Lm5ld1RhcmdldCkge1xuXHRcdFx0Ly8gZXNjYXBlICcmJyBhbmQgb3RoZXIgbmFzdGllc1xuXHRcdFx0Y29uc3QgdCA9IHgubmV3VGFyZ2V0O1xuXHRcdFx0Y29uc3QgcyA9IG13LnV0aWwuZXNjYXBlUmVnRXhwKHgubmV3VGFyZ2V0KTtcblx0XHRcdGlmICh4LmFsc29DaGFuZ2VMYWJlbCkge1xuXHRcdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7Y3VycmVudEFydGljbGVSZWdleEJpdH1cXFxcXVxcXFxdfltbJHt0fV1dfmc7YDtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9W3xdfltbJHt0fXx+ZztgO1xuXHRcdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7c31cXFxcfCR7c31cXFxcXVxcXFxdfltbJHt0fV1dfmdgO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9XFxcXF1cXFxcXX5bWyR7dH18JDFdXX5nO2A7XG5cdFx0XHRcdGNtZCArPSBgc35cXFxcW1xcXFxbJHtjdXJyZW50QXJ0aWNsZVJlZ2V4Qml0fVt8XX5bWyR7dH18fmc7YDtcblx0XHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske3N9XFxcXHwke3N9XFxcXF1cXFxcXX5bWyR7dH1dXX5nYDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y21kICs9IGBzflxcXFxbXFxcXFske2N1cnJlbnRBcnRpY2xlUmVnZXhCaXR9XFxcXF1cXFxcXX4kMX5nO2A7XG5cdFx0XHRjbWQgKz0gYHN+XFxcXFtcXFxcWyR7Y3VycmVudEFydGljbGVSZWdleEJpdH1bfF0oLio/KVxcXFxdXFxcXF1+JDJ+Z2A7XG5cdFx0fVxuXHRcdC8vIEJ1aWxkIHF1ZXJ5XG5cdFx0Y21kID0gYGF1dG9lZGl0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNtZCl9YDtcblx0XHRjbWQgKz0gYCZhdXRvY2xpY2s9JHtlbmNvZGVVUklDb21wb25lbnQoeC5jbGlja0J1dHRvbil9JmFjdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQoYXV0b0NsaWNrVG9rZW4oKSl9YDtcblx0XHRjbWQgKz0geC5taW5vciA9PT0gbnVsbCA/ICcnIDogYCZhdXRvbWlub3I9JHtlbmNvZGVVUklDb21wb25lbnQoeC5taW5vcil9YDtcblx0XHRjbWQgKz0geC53YXRjaCA9PT0gbnVsbCA/ICcnIDogYCZhdXRvd2F0Y2g9JHtlbmNvZGVVUklDb21wb25lbnQoeC53YXRjaCl9YDtcblx0XHRjbWQgKz0gYCZhdXRvc3VtbWFyeT0ke2VuY29kZVVSSUNvbXBvbmVudCh4LnN1bW1hcnkpfWA7XG5cdFx0Y21kICs9IGAmYXV0b2ltcGw9JHtlbmNvZGVVUklDb21wb25lbnQocG9wdXBTdHJpbmcoJ2F1dG9lZGl0X3ZlcnNpb24nKSl9YDtcblx0XHRyZXR1cm4gYXBwZW5kUGFyYW1zVG9MaW5rKGxrLCBjbWQpO1xuXHR9O1xuXHRjb25zdCByZWRpckxpbmsgPSAocmVkaXJNYXRjaCwgYXJ0aWNsZSkgPT4ge1xuXHRcdC8vIE5CIHJlZGlyTWF0Y2ggaXMgaW4gd2lraVRleHRcblx0XHRsZXQgcmV0ID0gJyc7XG5cdFx0aWYgKGdldFZhbHVlT2YoJ3BvcHVwQXBwZW5kUmVkaXJOYXZMaW5rcycpICYmIGdldFZhbHVlT2YoJ3BvcHVwTmF2TGlua3MnKSkge1xuXHRcdFx0cmV0ICs9ICc8aHI+Jztcblx0XHRcdGlmIChnZXRWYWx1ZU9mKCdwb3B1cEZpeFJlZGlycycpICYmIGF1dG9FZGl0ICE9PSB1bmRlZmluZWQgJiYgYXV0b0VkaXQpIHtcblx0XHRcdFx0cmV0ICs9IHBvcHVwU3RyaW5nKCdSZWRpcmVjdHMgdG86IChGaXggJyk7XG5cdFx0XHRcdGxvZyhgcmVkaXJMaW5rOiBuZXdUYXJnZXQ9JHtyZWRpck1hdGNofWApO1xuXHRcdFx0XHRyZXQgKz0gYWRkUG9wdXBTaG9ydGN1dChcblx0XHRcdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdFx0XHRuZXdUYXJnZXQ6IHJlZGlyTWF0Y2gsXG5cdFx0XHRcdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygndGFyZ2V0JyksXG5cdFx0XHRcdFx0XHRoaW50OiBwb3B1cFN0cmluZygnRml4IHRoaXMgcmVkaXJlY3QsIGNoYW5naW5nIGp1c3QgdGhlIGxpbmsgdGFyZ2V0JyksXG5cdFx0XHRcdFx0XHRzdW1tYXJ5OiBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBGaXhSZWRpcnNTdW1tYXJ5JyksIFthcnRpY2xlLnRvU3RyaW5nKCksIHJlZGlyTWF0Y2hdKSxcblx0XHRcdFx0XHRcdG9sZFRhcmdldDogYXJ0aWNsZS50b1N0cmluZygpLFxuXHRcdFx0XHRcdFx0Y2xpY2tCdXR0b246IGdldFZhbHVlT2YoJ3BvcHVwUmVkaXJBdXRvQ2xpY2snKSxcblx0XHRcdFx0XHRcdG1pbm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0d2F0Y2g6IGdldFZhbHVlT2YoJ3BvcHVwV2F0Y2hSZWRpcnJlZFBhZ2VzJyksXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0J1InXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldCArPSBwb3B1cFN0cmluZygnIG9yICcpO1xuXHRcdFx0XHRyZXQgKz0gYWRkUG9wdXBTaG9ydGN1dChcblx0XHRcdFx0XHRjaGFuZ2VMaW5rVGFyZ2V0TGluayh7XG5cdFx0XHRcdFx0XHRuZXdUYXJnZXQ6IHJlZGlyTWF0Y2gsXG5cdFx0XHRcdFx0XHR0ZXh0OiBwb3B1cFN0cmluZygndGFyZ2V0ICYgbGFiZWwnKSxcblx0XHRcdFx0XHRcdGhpbnQ6IHBvcHVwU3RyaW5nKCdGaXggdGhpcyByZWRpcmVjdCwgY2hhbmdpbmcgdGhlIGxpbmsgdGFyZ2V0IGFuZCBsYWJlbCcpLFxuXHRcdFx0XHRcdFx0c3VtbWFyeTogc2ltcGxlUHJpbnRmKGdldFZhbHVlT2YoJ3BvcHVwRml4UmVkaXJzU3VtbWFyeScpLCBbYXJ0aWNsZS50b1N0cmluZygpLCByZWRpck1hdGNoXSksXG5cdFx0XHRcdFx0XHRvbGRUYXJnZXQ6IGFydGljbGUudG9TdHJpbmcoKSxcblx0XHRcdFx0XHRcdGNsaWNrQnV0dG9uOiBnZXRWYWx1ZU9mKCdwb3B1cFJlZGlyQXV0b0NsaWNrJyksXG5cdFx0XHRcdFx0XHRtaW5vcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHdhdGNoOiBnZXRWYWx1ZU9mKCdwb3B1cFdhdGNoUmVkaXJyZWRQYWdlcycpLFxuXHRcdFx0XHRcdFx0YWxzb0NoYW5nZUxhYmVsOiB0cnVlLFxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdCdSJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXQgKz0gcG9wdXBTdHJpbmcoJyknKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldCArPSBwb3B1cFN0cmluZygnUmVkaXJlY3RzJykgKyBwb3B1cFN0cmluZygnIHRvICcpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0cmV0dXJuIGA8YnI+ICR7cG9wdXBTdHJpbmcoJ1JlZGlyZWN0cycpfSR7cG9wdXBTdHJpbmcoJyB0byAnKX0ke3RpdGxlZFdpa2lMaW5rKHtcblx0XHRcdGFydGljbGU6IG5ldyBUaXRsZSgpLmZyb21XaWtpVGV4dChyZWRpck1hdGNoKSxcblx0XHRcdGFjdGlvbjogJ3ZpZXcnIC8qIEZJWE1FOiBuZXdXaW4gKi8sXG5cdFx0XHR0ZXh0OiBzYWZlRGVjb2RlVVJJKHJlZGlyTWF0Y2gpLFxuXHRcdFx0dGl0bGU6IHBvcHVwU3RyaW5nKCdCeXBhc3MgcmVkaXJlY3QnKSxcblx0XHR9KX1gO1xuXHR9O1xuXHRjb25zdCBhcmluTGluayA9IChsKSA9PiB7XG5cdFx0aWYgKCFzYW5lTGlua0NoZWNrKGwpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKCFsLmFydGljbGUuaXNJcFVzZXIoKSB8fCAhcGcud2lraS53aWtpbWVkaWEpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCB1TiA9IGwuYXJ0aWNsZS51c2VyTmFtZSgpO1xuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmw6IGBodHRwOi8vd3MuYXJpbi5uZXQvY2dpLWJpbi93aG9pcy5wbD9xdWVyeWlucHV0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVOKX1gLFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdHRpdGxlOiB0cHJpbnRmKCdMb29rIHVwICVzIGluIEFSSU4gd2hvaXMgZGF0YWJhc2UnLCBbdU5dKSxcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5vUG9wdXA6IDEsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHRvb2xEYk5hbWUgPSAoY29va2llU3R5bGUpID0+IHtcblx0XHRsZXQgcmV0ID0gbXcuY29uZmlnLmdldCgnd2dEQm5hbWUnKTtcblx0XHRpZiAoIWNvb2tpZVN0eWxlKSB7XG5cdFx0XHRyZXQgKz0gJ19wJztcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcblx0Y29uc3Qgc2FuZUxpbmtDaGVjayA9IChsKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBsLmFydGljbGUgIT09IHR5cGVvZiB7fSB8fCB0eXBlb2YgbC50ZXh0ICE9PSB0eXBlb2YgJycpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IGVkaXRDb3VudGVyTGluayA9IChsKSA9PiB7XG5cdFx0aWYgKCFzYW5lTGlua0NoZWNrKGwpKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKCFwZy53aWtpLndpa2ltZWRpYSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IHVOID0gbC5hcnRpY2xlLnVzZXJOYW1lKCk7XG5cdFx0Y29uc3QgdG9vbCA9IGdldFZhbHVlT2YoJ3BvcHVwRWRpdENvdW50ZXJUb29sJyk7XG5cdFx0bGV0IHVybDtcblx0XHRjb25zdCBkZWZhdWx0VG9vbFVybCA9ICcvL3Rvb2xzLndtZmxhYnMub3JnL3N1cGVyY291bnQvaW5kZXgucGhwP3VzZXI9JDEmcHJvamVjdD0kMi4kMyc7XG5cdFx0c3dpdGNoICh0b29sKSB7XG5cdFx0XHRjYXNlICdjdXN0b20nOlxuXHRcdFx0XHR1cmwgPSBzaW1wbGVQcmludGYoZ2V0VmFsdWVPZigncG9wdXBFZGl0Q291bnRlclVybCcpLCBbZW5jb2RlVVJJQ29tcG9uZW50KHVOKSwgdG9vbERiTmFtZSgpXSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRjb25zdCB0aGVXaWtpID0gcGcud2lraS5ob3N0bmFtZS5zcGxpdCgnLicpO1xuXHRcdFx0XHR1cmwgPSBzaW1wbGVQcmludGYoZGVmYXVsdFRvb2xVcmwsIFtlbmNvZGVVUklDb21wb25lbnQodU4pLCB0aGVXaWtpWzBdLCB0aGVXaWtpWzFdXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBnZW5lcmFsTmF2TGluayh7XG5cdFx0XHR1cmwsXG5cdFx0XHR0aXRsZTogdHByaW50ZignZWRpdENvdW50ZXJMaW5rSGludCcsIFt1Tl0pLFxuXHRcdFx0bmV3V2luOiBsLm5ld1dpbixcblx0XHRcdHRleHQ6IGwudGV4dCxcblx0XHRcdG5vUG9wdXA6IDEsXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IGVkaXRvckxpc3RMaW5rID0gKGwpID0+IHtcblx0XHRpZiAoIXNhbmVMaW5rQ2hlY2sobCkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhcnRpY2xlID0gbC5hcnRpY2xlLmFydGljbGVGcm9tVGFsa1BhZ2UoKSB8fCBsLmFydGljbGU7XG5cdFx0Y29uc3QgdXJsID0gYGh0dHBzOi8veHRvb2xzLndtZmxhYnMub3JnL2FydGljbGVpbmZvLyR7ZW5jb2RlVVJJKFxuXHRcdFx0cGcud2lraS5ob3N0bmFtZVxuXHRcdCl9LyR7YXJ0aWNsZS51cmxTdHJpbmcoKX0/dXNlbGFuZz0ke213LmNvbmZpZy5nZXQoJ3dnVXNlckxhbmd1YWdlJyl9YDtcblx0XHRyZXR1cm4gZ2VuZXJhbE5hdkxpbmsoe1xuXHRcdFx0dXJsLFxuXHRcdFx0dGl0bGU6IHRwcmludGYoJ2VkaXRvckxpc3RIaW50JywgW2FydGljbGVdKSxcblx0XHRcdG5ld1dpbjogbC5uZXdXaW4sXG5cdFx0XHR0ZXh0OiBsLnRleHQsXG5cdFx0XHRub1BvcHVwOiAxLFxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBnZW5lcmFsTmF2TGluayA9IChsKSA9PiB7XG5cdFx0bC5jbGFzc05hbWUgPSBsLmNsYXNzTmFtZSA9PT0gbnVsbCA/ICdwb3B1cE5hdkxpbmsnIDogbC5jbGFzc05hbWU7XG5cdFx0cmV0dXJuIGdlbmVyYWxMaW5rKGwpO1xuXHR9O1xuXHQvLyBtYWdpYyBoaXN0b3J5IGxpbmtzXG5cdC8vXG5cdGNvbnN0IGdldEhpc3RvcnlJbmZvID0gKHdpa2lwYWdlLCB3aGF0TmV4dCkgPT4ge1xuXHRcdGxvZygnZ2V0SGlzdG9yeUluZm8nKTtcblx0XHRnZXRIaXN0b3J5KFxuXHRcdFx0d2lraXBhZ2UsXG5cdFx0XHR3aGF0TmV4dFxuXHRcdFx0XHQ/IChkKSA9PiB7XG5cdFx0XHRcdFx0XHR3aGF0TmV4dChwcm9jZXNzSGlzdG9yeShkKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQ6IHByb2Nlc3NIaXN0b3J5XG5cdFx0KTtcblx0fTtcblx0Ly8gRklYTUUgZWxpbWluYXRlIHBnLmlkTnVtYmVyIC4uLiBob3c/IDotKFxuXHRjb25zdCBnZXRIaXN0b3J5ID0gKHdpa2lwYWdlLCBvbkNvbXBsZXRlKSA9PiB7XG5cdFx0bG9nKCdnZXRIaXN0b3J5Jyk7XG5cdFx0Y29uc3QgdXJsID0gYCR7cGcud2lraS5hcGl3aWtpYmFzZX0/Zm9ybWF0PWpzb24mZm9ybWF0dmVyc2lvbj0yJmFjdGlvbj1xdWVyeSZwcm9wPXJldmlzaW9ucyZ0aXRsZXM9JHtuZXcgVGl0bGUoXG5cdFx0XHR3aWtpcGFnZVxuXHRcdCkudXJsU3RyaW5nKCl9JnJ2bGltaXQ9JHtnZXRWYWx1ZU9mKCdwb3B1cEhpc3RvcnlMaW1pdCcpfWA7XG5cdFx0bG9nKGBnZXRIaXN0b3J5OiB1cmw9JHt1cmx9YCk7XG5cdFx0cmV0dXJuIHN0YXJ0RG93bmxvYWQodXJsLCBgJHtwZy5pZE51bWJlcn1oaXN0b3J5YCwgb25Db21wbGV0ZSk7XG5cdH07XG5cdGNvbnN0IHByb2Nlc3NIaXN0b3J5ID0gKGRvd25sb2FkKSA9PiB7XG5cdFx0Y29uc3QganNvYmogPSBnZXRKc09iaihkb3dubG9hZC5kYXRhKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qge3JldmlzaW9uc30gPSBhbnlDaGlsZChqc29iai5xdWVyeS5wYWdlcyk7XG5cdFx0XHRjb25zdCBlZGl0cyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCByZXZpc2lvbiBvZiByZXZpc2lvbnMpIHtcblx0XHRcdFx0ZWRpdHMucHVzaCh7XG5cdFx0XHRcdFx0b2xkaWQ6IHJldmlzaW9uLnJldmlkLFxuXHRcdFx0XHRcdGVkaXRvcjogcmV2aXNpb24udXNlcixcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRsb2coYHByb2Nlc3NlZCAke2VkaXRzLmxlbmd0aH0gZWRpdHNgKTtcblx0XHRcdHJldHVybiBmaW5pc2hQcm9jZXNzSGlzdG9yeShlZGl0cywgbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGxvZygnU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBKU09OIGJ1c2luZXNzJyk7XG5cdFx0XHRyZXR1cm4gZmluaXNoUHJvY2Vzc0hpc3RvcnkoW10pO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmluaXNoUHJvY2Vzc0hpc3RvcnkgPSAoZWRpdHMsIHVzZXJOYW1lKSA9PiB7XG5cdFx0Y29uc3QgaGlzdEluZm8gPSB7fTtcblx0XHRoaXN0SW5mby5lZGl0cyA9IGVkaXRzO1xuXHRcdGhpc3RJbmZvLnVzZXJOYW1lID0gdXNlck5hbWU7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlZGl0cy5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYgKGhpc3RJbmZvLm15TGFzdEVkaXQgPT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZSAmJiBlZGl0c1tpXS5lZGl0b3IgPT09IHVzZXJOYW1lKSB7XG5cdFx0XHRcdGhpc3RJbmZvLm15TGFzdEVkaXQgPSB7XG5cdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0b2xkaWQ6IGVkaXRzW2ldLm9sZGlkLFxuXHRcdFx0XHRcdHByZXZpZDogaSA9PT0gMCA/IG51bGwgOiBlZGl0c1tpIC0gMV0ub2xkaWQsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAoaGlzdEluZm8uZmlyc3ROZXdFZGl0b3IgPT09IHVuZGVmaW5lZCAmJiBlZGl0c1tpXS5lZGl0b3IgIT09IGVkaXRzWzBdLmVkaXRvcikge1xuXHRcdFx0XHRoaXN0SW5mby5maXJzdE5ld0VkaXRvciA9IHtcblx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRvbGRpZDogZWRpdHNbaV0ub2xkaWQsXG5cdFx0XHRcdFx0cHJldmlkOiBpID09PSAwID8gbnVsbCA6IGVkaXRzW2kgLSAxXS5vbGRpZCxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGcubWlzYy5oaXN0b3J5SW5mbz1oaXN0SW5mbztcblx0XHRyZXR1cm4gaGlzdEluZm87XG5cdH07XG5cdC8vIEVOREZJTEU6IGxpbmtzLmpzXG5cdC8vIFNUQVJURklMRTogb3B0aW9ucy5qc1xuXHQvLyBvcHRpb25zXG5cdC8vIGNoZWNrIGZvciBleGlzdGluZyB2YWx1ZSwgZWxzZSB1c2UgZGVmYXVsdFxuXHRjb25zdCBkZWZhdWx0aXplID0gKHgpID0+IHtcblx0XHRpZiAocGcub3B0aW9uW3hdID09PSBudWxsIHx8IHBnLm9wdGlvblt4XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwZy5vcHRpb25beF0gPSB3aW5kb3dbeF0gPT09IHVuZGVmaW5lZCA/IHBnLm9wdGlvbkRlZmF1bHRbeF0gOiB3aW5kb3dbeF07XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBuZXdPcHRpb24gPSAoeCwgZGVmKSA9PiB7XG5cdFx0cGcub3B0aW9uRGVmYXVsdFt4XSA9IGRlZjtcblx0fTtcblx0Y29uc3Qgc2V0RGVmYXVsdCA9ICh4LCBkZWYpID0+IHtcblx0XHRyZXR1cm4gbmV3T3B0aW9uKHgsIGRlZik7XG5cdH07XG5cdGNvbnN0IGdldFZhbHVlT2YgPSAodmFyTmFtZSkgPT4ge1xuXHRcdGRlZmF1bHRpemUodmFyTmFtZSk7XG5cdFx0cmV0dXJuIHBnLm9wdGlvblt2YXJOYW1lXTtcblx0fTtcblx0Y29uc3Qgc2V0T3B0aW9ucyA9ICgpID0+IHtcblx0XHQvLyB1c2VyLXNldHRhYmxlIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHRzXG5cdFx0bGV0IHVzZXJJc1N5c29wID0gZmFsc2U7XG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnVXNlckdyb3VwcycpKSB7XG5cdFx0XHRmb3IgKGxldCBnID0gMDsgZyA8IG13LmNvbmZpZy5nZXQoJ3dnVXNlckdyb3VwcycpLmxlbmd0aDsgKytnKSB7XG5cdFx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJHcm91cHMnKVtnXSA9PT0gJ3N5c29wJykge1xuXHRcdFx0XHRcdHVzZXJJc1N5c29wID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dVc2VyR3JvdXBzJylbZ10gPT09ICdzdGV3YXJkJykge1xuXHRcdFx0XHRcdHVzZXJJc1N5c29wID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBCYXNpYyBvcHRpb25zXG5cdFx0bmV3T3B0aW9uKCdwb3B1cERlbGF5JywgMC41KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwSGlkZURlbGF5JywgMC41KTtcblx0XHRuZXdPcHRpb24oJ3NpbXBsZVBvcHVwcycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU3RydWN0dXJlJywgJ3Nob3J0bWVudXMnKTsgLy8gc2VlIGxhdGVyIC0gZGVmYXVsdCBmb3IgcG9wdXBTdHJ1Y3R1cmUgaXMgJ29yaWdpbmFsJyBpZiBzaW1wbGVQb3B1cHMgaXMgdHJ1ZVxuXHRcdG5ld09wdGlvbigncG9wdXBBY3Rpb25zTWVudScsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBTZXR1cE1lbnUnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwQWRtaW5MaW5rcycsIHVzZXJJc1N5c29wKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU2hvcnRjdXRLZXlzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBIaXN0b3JpY2FsTGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwT25seUFydGljbGVMaW5rcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncmVtb3ZlVGl0bGVzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1heFdpZHRoJywgMzUwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwU2ltcGxpZnlNYWluTGluaycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBcHBlbmRSZWRpck5hdkxpbmtzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFRvY0xpbmtzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBTdWJwb3B1cHMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRHJhZ0hhbmRsZScsIGZhbHNlIC8qICdwb3B1cFRvcExpbmtzJyAqLyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cExhenlQcmV2aWV3cycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXp5RG93bmxvYWRzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEFsbERhYnNTdHVicycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGVidWdnaW5nJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBBY3RpdmVOYXZsaW5rcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBNb2RpZmllcicsIGZhbHNlKTsgLy8gY3RybCwgc2hpZnQsIGFsdCBvciBtZXRhXG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1vZGlmaWVyQWN0aW9uJywgJ2VuYWJsZScpOyAvLyBvciAnZGlzYWJsZSdcblx0XHRuZXdPcHRpb24oJ3BvcHVwRHJhZ2dhYmxlJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmlldycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTG9jYWxlJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEYXRlVGltZUZvcm1hdHRlck9wdGlvbnMnLCB7XG5cdFx0XHR5ZWFyOiAnbnVtZXJpYycsXG5cdFx0XHRtb250aDogJ2xvbmcnLFxuXHRcdFx0ZGF5OiAnbnVtZXJpYycsXG5cdFx0XHRob3VyMTI6IGZhbHNlLFxuXHRcdFx0aG91cjogJzItZGlnaXQnLFxuXHRcdFx0bWludXRlOiAnMi1kaWdpdCcsXG5cdFx0XHRzZWNvbmQ6ICcyLWRpZ2l0Jyxcblx0XHR9KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGF0ZUZvcm1hdHRlck9wdGlvbnMnLCB7XG5cdFx0XHR5ZWFyOiAnbnVtZXJpYycsXG5cdFx0XHRtb250aDogJ2xvbmcnLFxuXHRcdFx0ZGF5OiAnbnVtZXJpYycsXG5cdFx0fSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFRpbWVGb3JtYXR0ZXJPcHRpb25zJywge1xuXHRcdFx0aG91cjEyOiBmYWxzZSxcblx0XHRcdGhvdXI6ICcyLWRpZ2l0Jyxcblx0XHRcdG1pbnV0ZTogJzItZGlnaXQnLFxuXHRcdFx0c2Vjb25kOiAnMi1kaWdpdCcsXG5cdFx0fSk7XG5cdFx0Ly8gaW1hZ2VzXG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbignaW1hZ2VQb3B1cHNGb3JJbWFnZXMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTmV2ZXJHZXRUaHVtYnMnLCBmYWxzZSk7XG5cdFx0Ly8gbmV3T3B0aW9uKCdwb3B1cEltYWdlc1RvZ2dsZVNpemUnLCAgICAgICB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwVGh1bWJBY3Rpb24nLCAnaW1hZ2VwYWdlJyk7IC8vICdzaXpldG9nZ2xlJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlU2l6ZScsIDYwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwSW1hZ2VTaXplTGFyZ2UnLCAyMDApO1xuXHRcdC8vIHJlZGlycywgZGFicywgcmV2ZXJzaW9uXG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeFJlZGlycycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUmVkaXJBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeERhYnMnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cERhYnNBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmVydFN1bW1hcnlQcm9tcHQnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1pbm9yUmV2ZXJ0cycsIGZhbHNlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUmVkbGlua1JlbW92YWwnLCBmYWxzZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJlZGxpbmtBdXRvQ2xpY2snLCAnd3BEaWZmJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFdhdGNoRGlzYW1iaWdnZWRQYWdlcycsIG51bGwpO1xuXHRcdG5ld09wdGlvbigncG9wdXBXYXRjaFJlZGlycmVkUGFnZXMnLCBudWxsKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGFiV2lrdGlvbmFyeScsICdsYXN0Jyk7XG5cdFx0Ly8gbmF2bGlua3Ncblx0XHRuZXdPcHRpb24oJ3BvcHVwTmF2TGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTmF2TGlua1NlcGFyYXRvcicsICcgJnNkb3Q7ICcpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXN0RWRpdExpbmsnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRWRpdENvdW50ZXJUb29sJywgJ3N1cGVyY291bnQnKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRWRpdENvdW50ZXJVcmwnLCAnJyk7XG5cdFx0Ly8gcHJldmlld3MgZXRjXG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFN1bW1hcnlEYXRhJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cE1heFByZXZpZXdTZW50ZW5jZXMnLCA1KTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwTWF4UHJldmlld0NoYXJhY3RlcnMnLCA2MDApO1xuXHRcdG5ld09wdGlvbigncG9wdXBMYXN0TW9kaWZpZWQnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUHJldmlld0tpbGxUZW1wbGF0ZXMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUHJldmlld1Jhd1RlbXBsYXRlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3Rmlyc3RQYXJPbmx5JywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdDdXRIZWFkaW5ncycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3QnV0dG9uJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3QnV0dG9uRXZlbnQnLCAnY2xpY2snKTtcblx0XHQvLyBkaWZmc1xuXHRcdG5ld09wdGlvbigncG9wdXBQcmV2aWV3RGlmZnMnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGlmZk1heExpbmVzJywgMTAwKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRGlmZkNvbnRleHRMaW5lcycsIDIpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEaWZmQ29udGV4dENoYXJhY3RlcnMnLCA0MCk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cERpZmZEYXRlcycsIHRydWUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBEaWZmRGF0ZVByaW50ZXInLCAndG9Mb2NhbGVTdHJpbmcnKTsgLy8gbm8gbG9uZ2VyIGluIHVzZVxuXG5cdFx0Ly8gZWRpdCBzdW1tYXJpZXMuIEdvZCwgdGhlc2UgYXJlIHVnbHkuXG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmlld2VkU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSZXZpZXdlZFN1bW1hcnknKSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEZpeERhYnNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cEZpeERhYnNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnknLCBwb3B1cFN0cmluZygnZGVmYXVsdHBvcHVwRXh0ZW5kZWRSZXZlcnRTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZXZlcnRTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFJldmVydFN1bW1hcnknKSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBRdWVyaWVkUmV2ZXJ0U3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBRdWVyaWVkUmV2ZXJ0U3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUXVlcmllZFJldmVydFRvUHJldmlvdXNTdW1tYXJ5JywgcG9wdXBTdHJpbmcoJ2RlZmF1bHRwb3B1cFF1ZXJpZWRSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwRml4UmVkaXJzU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBGaXhSZWRpcnNTdW1tYXJ5JykpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZWRsaW5rU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSZWRsaW5rU3VtbWFyeScpKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwUm1EYWJMaW5rU3VtbWFyeScsIHBvcHVwU3RyaW5nKCdkZWZhdWx0cG9wdXBSbURhYkxpbmtTdW1tYXJ5JykpO1xuXHRcdC8vIG1pc2Ncblx0XHRuZXdPcHRpb24oJ3BvcHVwSGlzdG9yeUxpbWl0JywgNTApO1xuXHRcdG5ld09wdGlvbigncG9wdXBGaWx0ZXJzJywgW1xuXHRcdFx0cG9wdXBGaWx0ZXJTdHViRGV0ZWN0LFxuXHRcdFx0cG9wdXBGaWx0ZXJEaXNhbWJpZ0RldGVjdCxcblx0XHRcdHBvcHVwRmlsdGVyUGFnZVNpemUsXG5cdFx0XHRwb3B1cEZpbHRlckNvdW50TGlua3MsXG5cdFx0XHRwb3B1cEZpbHRlckNvdW50SW1hZ2VzLFxuXHRcdFx0cG9wdXBGaWx0ZXJDb3VudENhdGVnb3JpZXMsXG5cdFx0XHRwb3B1cEZpbHRlckxhc3RNb2RpZmllZCxcblx0XHRdKTtcblx0XHRuZXdPcHRpb24oJ2V4dHJhUG9wdXBGaWx0ZXJzJywgW10pO1xuXHRcdG5ld09wdGlvbigncG9wdXBPbkVkaXRTZWxlY3Rpb24nLCAnY3Vyc29yJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFByZXZpZXdIaXN0b3J5JywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlTGlua3MnLCB0cnVlKTtcblx0XHRuZXdPcHRpb24oJ3BvcHVwQ2F0ZWdvcnlNZW1iZXJzJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFVzZXJJbmZvJywgdHJ1ZSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEhpc3RvcnlQcmV2aWV3TGltaXQnLCAyNSk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cENvbnRyaWJzUHJldmlld0xpbWl0JywgMjUpO1xuXHRcdG5ld09wdGlvbigncG9wdXBSZXZEZWxVcmwnLCAnLy9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2lraXBlZGlhOlJldmlzaW9uX2RlbGV0aW9uJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cFNob3dHZW5kZXInLCB0cnVlKTtcblx0XHQvLyBuZXcgd2luZG93c1xuXHRcdG5ld09wdGlvbigncG9wdXBOZXdXaW5kb3dzJywgZmFsc2UpO1xuXHRcdG5ld09wdGlvbigncG9wdXBMaW5rc05ld1dpbmRvdycsIHtsYXN0Q29udHJpYjogdHJ1ZSwgc2luY2VNZTogdHJ1ZX0pO1xuXHRcdC8vIHJlZ2V4cHNcblx0XHRuZXdPcHRpb24oXG5cdFx0XHQncG9wdXBEYWJSZWdleHAnLFxuXHRcdFx0U3RyaW5nLnJhd2BcXHtcXHtcXHMqKGQoYWJ8aXNhbWIoaWcodWF0aW9uKT8pPyl8KCgoZ2VvfGhufHJvYWQ/fHNjaG9vbHxudW1iZXIpZGlzKXxbMjM0XVtsY11bYWN3XXwocm9hZHxzaGlwKWluZGV4KSlcXHMqKFxcfFtefV0qKT9cXH1cXH18aXMgYSAuKmRpc2FtYmlndWF0aW9uLipwYWdlYFxuXHRcdCk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEFuY2hvclJlZ2V4cCcsICdhbmNob3JzPycpOyAvLyBob3cgdG8gaWRlbnRpZnkgYW4gYW5jaG9ycyB0ZW1wbGF0ZVxuXHRcdG5ld09wdGlvbigncG9wdXBTdHViUmVnZXhwJywgJyhzZWN0KT9zdHViW31dW31dfFRoaXMgLiotcmVsYXRlZCBhcnRpY2xlIGlzIGEgLipzdHViJyk7XG5cdFx0bmV3T3B0aW9uKCdwb3B1cEltYWdlVmFyc1JlZ2V4cCcsICdpbWFnZXxpbWFnZV8oPzpmaWxlfHNreWxpbmV8bmFtZXxmbGFnfHNlYWwpfGNvdmVyfGJhZGdlfGxvZ28nKTtcblx0fTtcblx0Ly8gRU5ERklMRTogb3B0aW9ucy5qc1xuXHQvLyBTVEFSVEZJTEU6IHN0cmluZ3MuanNcblx0Ly8gVHJhbnNsYXRhYmxlIHN0cmluZ3Ncblx0Ly9cblx0Ly8gU2VlIGluc3RydWN0aW9ucyBhdFxuXHQvLyB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzL1RyYW5zbGF0aW9ufVxuXHRwZy5zdHJpbmcgPSB7XG5cdFx0Ly8gc3VtbWFyeSBkYXRhLCBzZWFyY2hpbmcgZXRjLlxuXHRcdGFydGljbGU6ICdhcnRpY2xlJyxcblx0XHRjYXRlZ29yeTogJ2NhdGVnb3J5Jyxcblx0XHRjYXRlZ29yaWVzOiAnY2F0ZWdvcmllcycsXG5cdFx0aW1hZ2U6ICdpbWFnZScsXG5cdFx0aW1hZ2VzOiAnaW1hZ2VzJyxcblx0XHRzdHViOiAnc3R1YicsXG5cdFx0J3NlY3Rpb24gc3R1Yic6ICdzZWN0aW9uIHN0dWInLFxuXHRcdCdFbXB0eSBwYWdlJzogJ0VtcHR5IHBhZ2UnLFxuXHRcdGtCOiAna0InLFxuXHRcdGJ5dGVzOiAnYnl0ZXMnLFxuXHRcdGRheTogJ2RheScsXG5cdFx0ZGF5czogJ2RheXMnLFxuXHRcdGhvdXI6ICdob3VyJyxcblx0XHRob3VyczogJ2hvdXJzJyxcblx0XHRtaW51dGU6ICdtaW51dGUnLFxuXHRcdG1pbnV0ZXM6ICdtaW51dGVzJyxcblx0XHRzZWNvbmQ6ICdzZWNvbmQnLFxuXHRcdHNlY29uZHM6ICdzZWNvbmRzJyxcblx0XHR3ZWVrOiAnd2VlaycsXG5cdFx0d2Vla3M6ICd3ZWVrcycsXG5cdFx0c2VhcmNoOiAnc2VhcmNoJyxcblx0XHRTZWFyY2hIaW50OiAnRmluZCBFbmdsaXNoIFdpa2lwZWRpYSBhcnRpY2xlcyBjb250YWluaW5nICVzJyxcblx0XHR3ZWI6ICd3ZWInLFxuXHRcdGdsb2JhbDogJ2dsb2JhbCcsXG5cdFx0Ly8gYXJ0aWNsZS1yZWxhdGVkIGFjdGlvbnMgYW5kIGluZm9cblx0XHQvLyAoc29tZSBhY3Rpb25zIGFsc28gYXBwbHkgdG8gdXNlciBwYWdlcylcblx0XHRhY3Rpb25zOiAnYWN0aW9ucycsXG5cdFx0cG9wdXBzTWVudTogJ3BvcHVwcycsXG5cdFx0dG9nZ2xlUHJldmlld3NIaW50OiAnVG9nZ2xlIHByZXZpZXcgZ2VuZXJhdGlvbiBpbiBwb3B1cHMgb24gdGhpcyBwYWdlJyxcblx0XHQnZW5hYmxlIHByZXZpZXdzJzogJ2VuYWJsZSBwcmV2aWV3cycsXG5cdFx0J2Rpc2FibGUgcHJldmlld3MnOiAnZGlzYWJsZSBwcmV2aWV3cycsXG5cdFx0J3RvZ2dsZSBwcmV2aWV3cyc6ICd0b2dnbGUgcHJldmlld3MnLFxuXHRcdCdzaG93IHByZXZpZXcnOiAnc2hvdyBwcmV2aWV3Jyxcblx0XHRyZXNldDogJ3Jlc2V0Jyxcblx0XHQnbW9yZS4uLic6ICdtb3JlLi4uJyxcblx0XHRkaXNhYmxlOiAnZGlzYWJsZSBwb3B1cHMnLFxuXHRcdGRpc2FibGVQb3B1cHNIaW50OiAnRGlzYWJsZSBwb3B1cHMgb24gdGhpcyBwYWdlLiBSZWxvYWQgcGFnZSB0byByZS1lbmFibGUuJyxcblx0XHRoaXN0b3J5ZmVlZEhpbnQ6ICdSU1MgZmVlZCBvZiByZWNlbnQgY2hhbmdlcyB0byB0aGlzIHBhZ2UnLFxuXHRcdHB1cmdlUG9wdXBzSGludDogJ1Jlc2V0IHBvcHVwcywgY2xlYXJpbmcgYWxsIGNhY2hlZCBwb3B1cCBkYXRhLicsXG5cdFx0UG9wdXBzSGludDogJ1Jlc2V0IHBvcHVwcywgY2xlYXJpbmcgYWxsIGNhY2hlZCBwb3B1cCBkYXRhLicsXG5cdFx0c3BhY2ViYXI6ICdzcGFjZScsXG5cdFx0dmlldzogJ3ZpZXcnLFxuXHRcdCd2aWV3IGFydGljbGUnOiAndmlldyBhcnRpY2xlJyxcblx0XHR2aWV3SGludDogJ0dvIHRvICVzJyxcblx0XHR0YWxrOiAndGFsaycsXG5cdFx0J3RhbGsgcGFnZSc6ICd0YWxrIHBhZ2UnLFxuXHRcdCd0aGlzJm5ic3A7cmV2aXNpb24nOiAndGhpcyZuYnNwO3JldmlzaW9uJyxcblx0XHQncmV2aXNpb24gJXMgb2YgJXMnOiAncmV2aXNpb24gJXMgb2YgJXMnLFxuXHRcdCdSZXZpc2lvbiAlcyBvZiAlcyc6ICdSZXZpc2lvbiAlcyBvZiAlcycsXG5cdFx0J3RoZSByZXZpc2lvbiBwcmlvciB0byByZXZpc2lvbiAlcyBvZiAlcyc6ICd0aGUgcmV2aXNpb24gcHJpb3IgdG8gcmV2aXNpb24gJXMgb2YgJXMnLFxuXHRcdCdUb2dnbGUgaW1hZ2Ugc2l6ZSc6ICdDbGljayB0byB0b2dnbGUgaW1hZ2Ugc2l6ZScsXG5cdFx0ZGVsOiAnZGVsJyxcblx0XHRkZWxldGU6ICdkZWxldGUnLFxuXHRcdGRlbGV0ZUhpbnQ6ICdEZWxldGUgJXMnLFxuXHRcdHVuZGVsZXRlU2hvcnQ6ICd1bicsXG5cdFx0VW5kZWxldGVIaW50OiAnU2hvdyB0aGUgZGVsZXRpb24gaGlzdG9yeSBmb3IgJXMnLFxuXHRcdHByb3RlY3Q6ICdwcm90ZWN0Jyxcblx0XHRwcm90ZWN0SGludDogJ1Jlc3RyaWN0IGVkaXRpbmcgcmlnaHRzIHRvICVzJyxcblx0XHR1bnByb3RlY3RTaG9ydDogJ3VuJyxcblx0XHR1bnByb3RlY3RIaW50OiAnQWxsb3cgJXMgdG8gYmUgZWRpdGVkIGJ5IGFueW9uZSBhZ2FpbicsXG5cdFx0J3NlbmQgdGhhbmtzJzogJ3NlbmQgdGhhbmtzJyxcblx0XHRUaGFua3NIaW50OiAnU2VuZCBhIHRoYW5rIHlvdSBub3RpZmljYXRpb24gdG8gdGhpcyB1c2VyJyxcblx0XHRtb3ZlOiAnbW92ZScsXG5cdFx0J21vdmUgcGFnZSc6ICdtb3ZlIHBhZ2UnLFxuXHRcdE1vdmVwYWdlSGludDogJ0NoYW5nZSB0aGUgdGl0bGUgb2YgJXMnLFxuXHRcdGVkaXQ6ICdlZGl0Jyxcblx0XHQnZWRpdCBhcnRpY2xlJzogJ2VkaXQgYXJ0aWNsZScsXG5cdFx0ZWRpdEhpbnQ6ICdDaGFuZ2UgdGhlIGNvbnRlbnQgb2YgJXMnLFxuXHRcdCdlZGl0IHRhbGsnOiAnZWRpdCB0YWxrJyxcblx0XHRuZXc6ICduZXcnLFxuXHRcdCduZXcgdG9waWMnOiAnbmV3IHRvcGljJyxcblx0XHRuZXdTZWN0aW9uSGludDogJ1N0YXJ0IGEgbmV3IHNlY3Rpb24gb24gJXMnLFxuXHRcdCdudWxsIGVkaXQnOiAnbnVsbCBlZGl0Jyxcblx0XHRudWxsRWRpdEhpbnQ6ICdTdWJtaXQgYW4gZWRpdCB0byAlcywgbWFraW5nIG5vIGNoYW5nZXMgJyxcblx0XHRoaXN0OiAnaGlzdCcsXG5cdFx0aGlzdG9yeTogJ2hpc3RvcnknLFxuXHRcdGhpc3RvcnlIaW50OiAnTGlzdCB0aGUgY2hhbmdlcyBtYWRlIHRvICVzJyxcblx0XHRsYXN0OiAncHJldicsXG5cdFx0bGFzdEVkaXQ6ICdsYXN0RWRpdCcsXG5cdFx0J21hcmsgcGF0cm9sbGVkJzogJ21hcmsgcGF0cm9sbGVkJyxcblx0XHRtYXJrcGF0cm9sbGVkSGludDogJ01hcmsgdGhpcyBlZGl0IGFzIHBhdHJvbGxlZCcsXG5cdFx0J0NvdWxkIG5vdCBtYXJrZWQgdGhpcyBlZGl0IGFzIHBhdHJvbGxlZCc6ICdDb3VsZCBub3QgbWFya2VkIHRoaXMgZWRpdCBhcyBwYXRyb2xsZWQnLFxuXHRcdCdzaG93IGxhc3QgZWRpdCc6ICdtb3N0IHJlY2VudCBlZGl0Jyxcblx0XHQnU2hvdyB0aGUgbGFzdCBlZGl0JzogJ1Nob3cgdGhlIGVmZmVjdHMgb2YgdGhlIG1vc3QgcmVjZW50IGNoYW5nZScsXG5cdFx0bGFzdENvbnRyaWI6ICdsYXN0Q29udHJpYicsXG5cdFx0J2xhc3Qgc2V0IG9mIGVkaXRzJzogJ2xhdGVzdCBlZGl0cycsXG5cdFx0bGFzdENvbnRyaWJIaW50OiAnU2hvdyB0aGUgbmV0IGVmZmVjdCBvZiBjaGFuZ2VzIG1hZGUgYnkgdGhlIGxhc3QgZWRpdG9yJyxcblx0XHRjdXI6ICdjdXInLFxuXHRcdGRpZmZDdXI6ICdkaWZmQ3VyJyxcblx0XHQnU2hvdyBjaGFuZ2VzIHNpbmNlIHJldmlzaW9uICVzJzogJ1Nob3cgY2hhbmdlcyBzaW5jZSByZXZpc2lvbiAlcycsXG5cdFx0JyVzIG9sZCc6ICclcyBvbGQnLFxuXHRcdG9sZEVkaXQ6ICdvbGRFZGl0Jyxcblx0XHRwdXJnZTogJ3B1cmdlJyxcblx0XHRwdXJnZUhpbnQ6ICdEZW1hbmQgYSBmcmVzaCBjb3B5IG9mICVzJyxcblx0XHRyYXc6ICdzb3VyY2UnLFxuXHRcdHJhd0hpbnQ6ICdEb3dubG9hZCB0aGUgc291cmNlIG9mICVzJyxcblx0XHRyZW5kZXI6ICdzaW1wbGUnLFxuXHRcdHJlbmRlckhpbnQ6ICdTaG93IGEgcGxhaW4gSFRNTCB2ZXJzaW9uIG9mICVzJyxcblx0XHQnU2hvdyB0aGUgZWRpdCBtYWRlIHRvIGdldCByZXZpc2lvbic6ICdTaG93IHRoZSBlZGl0IG1hZGUgdG8gZ2V0IHJldmlzaW9uJyxcblx0XHRzaW5jZU1lOiAnc2luY2VNZScsXG5cdFx0J2NoYW5nZXMgc2luY2UgbWluZSc6ICdkaWZmIG15IGVkaXQnLFxuXHRcdHNpbmNlTWVIaW50OiAnU2hvdyBjaGFuZ2VzIHNpbmNlIG15IGxhc3QgZWRpdCcsXG5cdFx0XCJDb3VsZG4ndCBmaW5kIGFuIGVkaXQgYnkgJXNcXG5pbiB0aGUgbGFzdCAlcyBlZGl0cyB0b1xcbiVzXCI6XG5cdFx0XHRcIkNvdWxkbid0IGZpbmQgYW4gZWRpdCBieSAlc1xcbmluIHRoZSBsYXN0ICVzIGVkaXRzIHRvXFxuJXNcIixcblx0XHRlZHM6ICdlZHMnLFxuXHRcdGVkaXRvcnM6ICdlZGl0b3JzJyxcblx0XHRlZGl0b3JMaXN0SGludDogJ0xpc3QgdGhlIHVzZXJzIHdobyBoYXZlIGVkaXRlZCAlcycsXG5cdFx0cmVsYXRlZDogJ3JlbGF0ZWQnLFxuXHRcdHJlbGF0ZWRDaGFuZ2VzOiAncmVsYXRlZENoYW5nZXMnLFxuXHRcdCdyZWxhdGVkIGNoYW5nZXMnOiAncmVsYXRlZCBjaGFuZ2VzJyxcblx0XHRSZWNlbnRjaGFuZ2VzbGlua2VkSGludDogJ1Nob3cgY2hhbmdlcyBpbiBhcnRpY2xlcyByZWxhdGVkIHRvICVzJyxcblx0XHRlZGl0T2xkOiAnZWRpdE9sZCcsXG5cdFx0cnY6ICdydicsXG5cdFx0cmV2ZXJ0OiAncmV2ZXJ0Jyxcblx0XHRyZXZlcnRIaW50OiAnUmV2ZXJ0IHRvICVzJyxcblx0XHRkZWZhdWx0cG9wdXBSZXZpZXdlZFN1bW1hcnk6XG5cdFx0XHQnQWNjZXB0ZWQgYnkgcmV2aWV3aW5nIHRoZSBbW1NwZWNpYWw6ZGlmZi8lcy8lc3xkaWZmZXJlbmNlXV0gYmV0d2VlbiB0aGlzIHZlcnNpb24gYW5kIHByZXZpb3VzbHkgYWNjZXB0ZWQgdmVyc2lvbiB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBSZWRsaW5rU3VtbWFyeTpcblx0XHRcdCdSZW1vdmluZyBsaW5rIHRvIGVtcHR5IHBhZ2UgW1slc11dIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cEZpeERhYnNTdW1tYXJ5OlxuXHRcdFx0J0Rpc2FtYmlndWF0ZSBbWyVzXV0gdG8gW1slc11dIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cEZpeFJlZGlyc1N1bW1hcnk6XG5cdFx0XHQnUmVkaXJlY3QgYnlwYXNzIGZyb20gW1slc11dIHRvIFtbJXNdXSB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnk6XG5cdFx0XHQnUmV2ZXJ0IHRvIHJldmlzaW9uIGRhdGVkICVzIGJ5ICVzLCBvbGRpZCAlcyB1c2luZyBbWzplbndpa2k6V2lraXBlZGlhOlRvb2xzL05hdmlnYXRpb25fcG9wdXBzfHBvcHVwc11dJyxcblx0XHRkZWZhdWx0cG9wdXBSZXZlcnRUb1ByZXZpb3VzU3VtbWFyeTpcblx0XHRcdCdSZXZlcnQgdG8gdGhlIHJldmlzaW9uIHByaW9yIHRvIHJldmlzaW9uICVzIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cFJldmVydFN1bW1hcnk6ICdSZXZlcnQgdG8gcmV2aXNpb24gJXMgdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwUXVlcmllZFJldmVydFRvUHJldmlvdXNTdW1tYXJ5OlxuXHRcdFx0J1JldmVydCB0byB0aGUgcmV2aXNpb24gcHJpb3IgdG8gcmV2aXNpb24gJDEgZGF0ZWQgJDIgYnkgJDMgdXNpbmcgW1s6ZW53aWtpOldpa2lwZWRpYTpUb29scy9OYXZpZ2F0aW9uX3BvcHVwc3xwb3B1cHNdXScsXG5cdFx0ZGVmYXVsdHBvcHVwUXVlcmllZFJldmVydFN1bW1hcnk6XG5cdFx0XHQnUmV2ZXJ0IHRvIHJldmlzaW9uICQxIGRhdGVkICQyIGJ5ICQzIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdGRlZmF1bHRwb3B1cFJtRGFiTGlua1N1bW1hcnk6XG5cdFx0XHQnUmVtb3ZlIGxpbmsgdG8gZGFiIHBhZ2UgW1slc11dIHVzaW5nIFtbOmVud2lraTpXaWtpcGVkaWE6VG9vbHMvTmF2aWdhdGlvbl9wb3B1cHN8cG9wdXBzXV0nLFxuXHRcdFJlZGlyZWN0czogJ1JlZGlyZWN0cycsXG5cdFx0JyB0byAnOiAnIHRvICcsXG5cdFx0J0J5cGFzcyByZWRpcmVjdCc6ICdCeXBhc3MgcmVkaXJlY3QnLFxuXHRcdCdGaXggdGhpcyByZWRpcmVjdCc6ICdGaXggdGhpcyByZWRpcmVjdCcsXG5cdFx0ZGlzYW1iaWc6ICdkaXNhbWJpZycsXG5cdFx0ZGlzYW1iaWdIaW50OiAnRGlzYW1iaWd1YXRlIHRoaXMgbGluayB0byBbWyVzXV0nLFxuXHRcdCdDbGljayB0byBkaXNhbWJpZ3VhdGUgdGhpcyBsaW5rIHRvOic6ICdDbGljayB0byBkaXNhbWJpZ3VhdGUgdGhpcyBsaW5rIHRvOicsXG5cdFx0J3JlbW92ZSB0aGlzIGxpbmsnOiAncmVtb3ZlIHRoaXMgbGluaycsXG5cdFx0J3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJzogJ3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJyxcblx0XHQncmVtb3ZlIGFsbCBsaW5rcyB0byB0aGlzIGRpc2FtYmlnIHBhZ2UgZnJvbSB0aGlzIGFydGljbGUnOlxuXHRcdFx0J3JlbW92ZSBhbGwgbGlua3MgdG8gdGhpcyBkaXNhbWJpZyBwYWdlIGZyb20gdGhpcyBhcnRpY2xlJyxcblx0XHRtYWlubGluazogJ21haW5saW5rJyxcblx0XHR3aWtpTGluazogJ3dpa2lMaW5rJyxcblx0XHR3aWtpTGlua3M6ICd3aWtpTGlua3MnLFxuXHRcdCdsaW5rcyBoZXJlJzogJ2xpbmtzIGhlcmUnLFxuXHRcdHdoYXRMaW5rc0hlcmU6ICd3aGF0TGlua3NIZXJlJyxcblx0XHQnd2hhdCBsaW5rcyBoZXJlJzogJ3doYXQgbGlua3MgaGVyZScsXG5cdFx0V2hhdGxpbmtzaGVyZUhpbnQ6ICdMaXN0IHRoZSBwYWdlcyB0aGF0IGFyZSBoeXBlcmxpbmtlZCB0byAlcycsXG5cdFx0dW53YXRjaFNob3J0OiAndW4nLFxuXHRcdHdhdGNoVGhpbmd5OiAnd2F0Y2gnLFxuXHRcdHdhdGNoSGludDogJ0FkZCAlcyB0byBteSB3YXRjaGxpc3QnLFxuXHRcdHVud2F0Y2hIaW50OiAnUmVtb3ZlICVzIGZyb20gbXkgd2F0Y2hsaXN0Jyxcblx0XHQnT25seSBmb3VuZCBvbmUgZWRpdG9yOiAlcyBtYWRlICVzIGVkaXRzJzogJ09ubHkgZm91bmQgb25lIGVkaXRvcjogJXMgbWFkZSAlcyBlZGl0cycsXG5cdFx0JyVzIHNlZW1zIHRvIGJlIHRoZSBsYXN0IGVkaXRvciB0byB0aGUgcGFnZSAlcyc6ICclcyBzZWVtcyB0byBiZSB0aGUgbGFzdCBlZGl0b3IgdG8gdGhlIHBhZ2UgJXMnLFxuXHRcdHJzczogJ3JzcycsXG5cdFx0Ly8gZGlmZiBwcmV2aWV3c1xuXHRcdCdEaWZmIHRydW5jYXRlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyc6ICdEaWZmIHRydW5jYXRlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucycsXG5cdFx0J09sZCByZXZpc2lvbic6ICdPbGQgcmV2aXNpb24nLFxuXHRcdCdOZXcgcmV2aXNpb24nOiAnTmV3IHJldmlzaW9uJyxcblx0XHQnU29tZXRoaW5nIHdlbnQgd3JvbmcgOi0oJzogJ1NvbWV0aGluZyB3ZW50IHdyb25nIDotKCcsXG5cdFx0J0VtcHR5IHJldmlzaW9uLCBtYXliZSBub24tZXhpc3RlbnQnOiAnRW1wdHkgcmV2aXNpb24sIG1heWJlIG5vbi1leGlzdGVudCcsXG5cdFx0J1Vua25vd24gZGF0ZSc6ICdVbmtub3duIGRhdGUnLFxuXHRcdC8vIG90aGVyIHNwZWNpYWwgcHJldmlld3Ncblx0XHQnRW1wdHkgY2F0ZWdvcnknOiAnRW1wdHkgY2F0ZWdvcnknLFxuXHRcdCdDYXRlZ29yeSBtZW1iZXJzICglcyBzaG93biknOiAnQ2F0ZWdvcnkgbWVtYmVycyAoJXMgc2hvd24pJyxcblx0XHQnTm8gaW1hZ2UgbGlua3MgZm91bmQnOiAnTm8gaW1hZ2UgbGlua3MgZm91bmQnLFxuXHRcdCdGaWxlIGxpbmtzJzogJ0ZpbGUgbGlua3MnLFxuXHRcdCdObyBpbWFnZSBmb3VuZCc6ICdObyBpbWFnZSBmb3VuZCcsXG5cdFx0J0ltYWdlIGZyb20gQ29tbW9ucyc6ICdJbWFnZSBmcm9tIENvbW1vbnMnLFxuXHRcdCdEZXNjcmlwdGlvbiBwYWdlJzogJ0Rlc2NyaXB0aW9uIHBhZ2UnLFxuXHRcdCdBbHQgdGV4dDonOiAnQWx0IHRleHQ6Jyxcblx0XHRyZXZkZWw6ICdIaWRkZW4gcmV2aXNpb24nLFxuXHRcdC8vIHVzZXItcmVsYXRlZCBhY3Rpb25zIGFuZCBpbmZvXG5cdFx0dXNlcjogJ3VzZXInLFxuXHRcdCd1c2VyJm5ic3A7cGFnZSc6ICd1c2VyJm5ic3A7cGFnZScsXG5cdFx0J3VzZXIgdGFsayc6ICd1c2VyIHRhbGsnLFxuXHRcdCdlZGl0IHVzZXIgdGFsayc6ICdlZGl0IHVzZXIgdGFsaycsXG5cdFx0J2xlYXZlIGNvbW1lbnQnOiAnbGVhdmUgY29tbWVudCcsXG5cdFx0ZW1haWw6ICdlbWFpbCcsXG5cdFx0J2VtYWlsIHVzZXInOiAnZW1haWwgdXNlcicsXG5cdFx0RW1haWx1c2VySGludDogJ1NlbmQgYW4gZW1haWwgdG8gJXMnLFxuXHRcdHNwYWNlOiAnc3BhY2UnLFxuXHRcdFByZWZpeEluZGV4SGludDogJ1Nob3cgcGFnZXMgaW4gdGhlIHVzZXJzcGFjZSBvZiAlcycsXG5cdFx0Y291bnQ6ICdjb3VudCcsXG5cdFx0J2VkaXQgY291bnRlcic6ICdlZGl0IGNvdW50ZXInLFxuXHRcdGVkaXRDb3VudGVyTGlua0hpbnQ6ICdDb3VudCB0aGUgY29udHJpYnV0aW9ucyBtYWRlIGJ5ICVzJyxcblx0XHRjb250cmliczogJ2NvbnRyaWJzJyxcblx0XHRjb250cmlidXRpb25zOiAnY29udHJpYnV0aW9ucycsXG5cdFx0ZGVsZXRlZENvbnRyaWJzOiAnZGVsZXRlZCBjb250cmlidXRpb25zJyxcblx0XHREZWxldGVkY29udHJpYnV0aW9uc0hpbnQ6ICdMaXN0IGRlbGV0ZWQgZWRpdHMgbWFkZSBieSAlcycsXG5cdFx0Q29udHJpYnV0aW9uc0hpbnQ6ICdMaXN0IHRoZSBjb250cmlidXRpb25zIG1hZGUgYnkgJXMnLFxuXHRcdGxvZzogJ2xvZycsXG5cdFx0J3VzZXIgbG9nJzogJ3VzZXIgbG9nJyxcblx0XHR1c2VyTG9nSGludDogXCJTaG93ICVzJ3MgdXNlciBsb2dcIixcblx0XHRhcmluOiAnQVJJTiBsb29rdXAnLFxuXHRcdCdMb29rIHVwICVzIGluIEFSSU4gd2hvaXMgZGF0YWJhc2UnOiAnTG9vayB1cCAlcyBpbiB0aGUgQVJJTiB3aG9pcyBkYXRhYmFzZScsXG5cdFx0dW5ibG9ja1Nob3J0OiAndW4nLFxuXHRcdGJsb2NrOiAnYmxvY2snLFxuXHRcdCdibG9jayB1c2VyJzogJ2Jsb2NrIHVzZXInLFxuXHRcdElwYmxvY2tsaXN0SGludDogJ1VuYmxvY2sgJXMnLFxuXHRcdEJsb2NraXBIaW50OiAnUHJldmVudCAlcyBmcm9tIGVkaXRpbmcnLFxuXHRcdCdibG9jayBsb2cnOiAnYmxvY2sgbG9nJyxcblx0XHRibG9ja0xvZ0hpbnQ6ICdTaG93IHRoZSBibG9jayBsb2cgZm9yICVzJyxcblx0XHRwcm90ZWN0TG9nSGludDogJ1Nob3cgdGhlIHByb3RlY3Rpb24gbG9nIGZvciAlcycsXG5cdFx0cGFnZUxvZ0hpbnQ6ICdTaG93IHRoZSBwYWdlIGxvZyBmb3IgJXMnLFxuXHRcdGRlbGV0ZUxvZ0hpbnQ6ICdTaG93IHRoZSBkZWxldGlvbiBsb2cgZm9yICVzJyxcblx0XHQnSW52YWxpZCAlcyAlcyc6ICdUaGUgb3B0aW9uICVzIGlzIGludmFsaWQ6ICVzJyxcblx0XHQnTm8gYmFja2xpbmtzIGZvdW5kJzogJ05vIGJhY2tsaW5rcyBmb3VuZCcsXG5cdFx0JyBhbmQgbW9yZSc6ICcgYW5kIG1vcmUnLFxuXHRcdHVuZG86ICd1bmRvJyxcblx0XHR1bmRvSGludDogJ3VuZG8gdGhpcyBlZGl0Jyxcblx0XHQnRG93bmxvYWQgcHJldmlldyBkYXRhJzogJ0Rvd25sb2FkIHByZXZpZXcgZGF0YScsXG5cdFx0J0ludmFsaWQgb3IgSVAgdXNlcic6ICdJbnZhbGlkIG9yIElQIHVzZXInLFxuXHRcdCdOb3QgYSByZWdpc3RlcmVkIHVzZXJuYW1lJzogJ05vdCBhIHJlZ2lzdGVyZWQgdXNlcm5hbWUnLFxuXHRcdEJMT0NLRUQ6ICdCTE9DS0VEJyxcblx0XHQnSGFzIGJsb2Nrcyc6ICdIYXMgYmxvY2tzJyxcblx0XHQnIGVkaXRzIHNpbmNlOiAnOiAnIGVkaXRzIHNpbmNlOiAnLFxuXHRcdCdsYXN0IGVkaXQgb24gJzogJ2xhc3QgZWRpdCBvbiAnLFxuXHRcdCdoZS9oaW0nOiAnaGUvaGltJyxcblx0XHQnc2hlL2hlcic6ICdzaGUvaGVyJyxcblx0XHQvLyBBdXRvZWRpdGluZ1xuXHRcdCdFbnRlciBhIG5vbi1lbXB0eSBlZGl0IHN1bW1hcnkgb3IgcHJlc3MgY2FuY2VsIHRvIGFib3J0Jzpcblx0XHRcdCdFbnRlciBhIG5vbi1lbXB0eSBlZGl0IHN1bW1hcnkgb3IgcHJlc3MgY2FuY2VsIHRvIGFib3J0Jyxcblx0XHQnRmFpbGVkIHRvIGdldCByZXZpc2lvbiBpbmZvcm1hdGlvbiwgcGxlYXNlIGVkaXQgbWFudWFsbHkuXFxuXFxuJzpcblx0XHRcdCdGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIGluZm9ybWF0aW9uLCBwbGVhc2UgZWRpdCBtYW51YWxseS5cXG5cXG4nLFxuXHRcdCdUaGUgJXMgYnV0dG9uIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xpY2tlZC4gUGxlYXNlIHdhaXQgZm9yIHRoZSBuZXh0IHBhZ2UgdG8gbG9hZC4nOlxuXHRcdFx0J1RoZSAlcyBidXR0b24gaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbGlja2VkLiBQbGVhc2Ugd2FpdCBmb3IgdGhlIG5leHQgcGFnZSB0byBsb2FkLicsXG5cdFx0J0NvdWxkIG5vdCBmaW5kIGJ1dHRvbiAlcy4gUGxlYXNlIGNoZWNrIHRoZSBzZXR0aW5ncyBpbiB5b3VyIGphdmFzY3JpcHQgZmlsZS4nOlxuXHRcdFx0J0NvdWxkIG5vdCBmaW5kIGJ1dHRvbiAlcy4gUGxlYXNlIGNoZWNrIHRoZSBzZXR0aW5ncyBpbiB5b3VyIGphdmFzY3JpcHQgZmlsZS4nLFxuXHRcdC8vIFBvcHVwcyBzZXR1cFxuXHRcdCdPcGVuIGZ1bGwtc2l6ZSBpbWFnZSc6ICdPcGVuIGZ1bGwtc2l6ZSBpbWFnZScsXG5cdFx0YXV0b2VkaXRfdmVyc2lvbjogJ25wMjAxNDA0MTYnLFxuXHR9O1xuXHRjb25zdCBwb3B1cFN0cmluZyA9IChzdHIpID0+IHtcblx0XHRpZiAocG9wdXBTdHJpbmdzICE9PSB1bmRlZmluZWQgJiYgcG9wdXBTdHJpbmdzICYmIHBvcHVwU3RyaW5nc1tzdHJdKSB7XG5cdFx0XHRyZXR1cm4gcG9wdXBTdHJpbmdzW3N0cl07XG5cdFx0fVxuXHRcdGlmIChwZy5zdHJpbmdbc3RyXSkge1xuXHRcdFx0cmV0dXJuIHBnLnN0cmluZ1tzdHJdO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9O1xuXHRjb25zdCB0cHJpbnRmID0gKHN0ciwgc3VicykgPT4ge1xuXHRcdGlmICh0eXBlb2Ygc3VicyAhPT0gdHlwZW9mIFtdKSB7XG5cdFx0XHRzdWJzID0gW3N1YnNdO1xuXHRcdH1cblx0XHRyZXR1cm4gc2ltcGxlUHJpbnRmKHBvcHVwU3RyaW5nKHN0ciksIHN1YnMpO1xuXHR9O1xuXHQvLyBFTkRGSUxFOiBzdHJpbmdzLmpzXG5cdC8vIFNUQVJURklMRTogcnVuLmpzXG5cdC8vIFJ1biB0aGluZ3Ncblx0Ly8gRm9yIHNvbWUgcmVhc29uIHBvcHVwcyByZXF1aXJlcyBhIGZ1bGx5IGxvYWRlZCBwYWdlIGpRdWVyeS5yZWFkeSguLi4pIGNhdXNlcyBwcm9ibGVtcyBmb3Igc29tZS5cblx0Ly8gVGhlIG9sZCBhZGRPbmxvYWRIb29rIGRpZCBzb21ldGhpbmcgc2ltaWxhciB0byB0aGUgYmVsb3dcblx0aWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcblx0XHRhdXRvRWRpdCgpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIHdpbGwgc2V0dXAgcG9wdXBzXG5cdFx0JCh3aW5kb3cpLm9uKCdsb2FkJywgYXV0b0VkaXQpO1xuXHR9XG5cdC8vIFN1cHBvcnQgZm9yIE1lZGlhV2lraSdzIGxpdmUgcHJldmlldywgVmlzdWFsRWRpdG9yJ3Mgc2F2ZXMgYW5kIEVjaG8ncyBmbHlvdXQuXG5cdCgoKSA9PiB7XG5cdFx0bGV0IG9uY2UgPSB0cnVlO1xuXHRcdGNvbnN0IGR5bmFtaWNDb250ZW50SGFuZGxlciA9ICgkY29udGVudCkgPT4ge1xuXHRcdFx0Ly8gVHJ5IHRvIGRldGVjdCB0aGUgaG9vayBmaXJlZCBvbiBpbml0aWFsIHBhZ2UgbG9hZCBhbmQgZGlzcmVnYXJkXG5cdFx0XHQvLyBpdCwgd2UgYWxyZWFkeSBob29rIHRvIG9ubG9hZCAocG9zc2libHkgdG8gZGlmZmVyZW50IHBhcnRzIG9mXG5cdFx0XHQvLyBwYWdlIC0gaXQncyBjb25maWd1cmFibGUpIGFuZCBydW5uaW5nIHR3aWNlIG1pZ2h0IGJlIGJhZC4gVWdseS4uLlxuXHRcdFx0aWYgKCRjb250ZW50LmF0dHIoJ2lkJykgPT09ICdtdy1jb250ZW50LXRleHQnICYmIG9uY2UpIHtcblx0XHRcdFx0b25jZSA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWdpc3Rlckhvb2tzRm9yVmlzaWJsZU5hdnBvcHMgPSAoKSA9PiB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBwZy5jdXJyZW50LmxpbmtzICYmIGkgPCBwZy5jdXJyZW50LmxpbmtzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmF2cG9wID0gcGcuY3VycmVudC5saW5rc1tpXS5uYXZwb3B1cDtcblx0XHRcdFx0XHRpZiAoIW5hdnBvcCB8fCAhbmF2cG9wLmlzVmlzaWJsZSgpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TmF2cG9wdXAudHJhY2tlci5hZGRIb29rKHBvc0NoZWNrZXJIb29rKG5hdnBvcCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZG9JdCA9ICgpID0+IHtcblx0XHRcdFx0cmVnaXN0ZXJIb29rc0ZvclZpc2libGVOYXZwb3BzKCk7XG5cdFx0XHRcdCRjb250ZW50LmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdGVsZW1lbnQucmFuU2V0dXBUb29sdGlwc0FscmVhZHkgPSBmYWxzZTtcblx0XHRcdFx0XHRzZXR1cFRvb2x0aXBzKGVsZW1lbnQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRzZXR1cFBvcHVwcyhkb0l0KTtcblx0XHR9O1xuXHRcdC8vIFRoaXMgaG9vayBpcyBhbHNvIGZpcmVkIGFmdGVyIHBhZ2UgbG9hZC5cblx0XHRtdy5ob29rKCd3aWtpcGFnZS5jb250ZW50JykuYWRkKGR5bmFtaWNDb250ZW50SGFuZGxlcik7XG5cdFx0bXcuaG9vaygnZXh0LmVjaG8ub3ZlcmxheS5iZWZvcmVTaG93aW5nT3ZlcmxheScpLmFkZCgoJG92ZXJsYXkpID0+IHtcblx0XHRcdGR5bmFtaWNDb250ZW50SGFuZGxlcigkb3ZlcmxheS5maW5kKCcubXctZWNoby1zdGF0ZScpKTtcblx0XHR9KTtcblx0fSkoKTtcblx0Ly8gRU5ERklMRTogcnVuLmpzXG59O1xuIiwgIi8vIFRyYW5zbGF0YWJsZSBzdHJpbmdzXG5jb25zdCBwb3B1cFN0cmluZ3M6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge1xuXHQvLyBzdW1tYXJ5IGRhdGEsIHNlYXJjaGluZyBldGMuXG5cdGFydGljbGU6IHdpbmRvdy53Z1VMUygn5p2h55uuJywgJ+aineebricpLFxuXHRjYXRlZ29yeTogd2luZG93LndnVUxTKCfkuKrliIbnsbsnLCAn5YCL5YiG6aGeJyksXG5cdGNhdGVnb3JpZXM6IHdpbmRvdy53Z1VMUygn5Liq5YiG57G7JywgJ+WAi+WIhumhnicpLFxuXHRpbWFnZTogd2luZG93LndnVUxTKCfkuKrmlofku7YnLCAn5YCL5qqU5qGIJyksXG5cdGltYWdlczogd2luZG93LndnVUxTKCfkuKrmlofku7YnLCAn5YCL5qqU5qGIJyksXG5cdHN0dWI6ICflsI/kvZzlk4EnLFxuXHQnc2VjdGlvbiBzdHViJzogd2luZG93LndnVUxTKCflsI/nq6DoioInLCAn5bCP56ug56+AJyksXG5cdCdFbXB0eSBwYWdlJzogd2luZG93LndnVUxTKCfnqbrpobXpnaInLCAn56m66aCB6Z2iJyksXG5cdGtCOiB3aW5kb3cud2dVTFMoJ+WNg+Wtl+iKgjxzdWI+77yI5LulMTAwMOS4uuS4gOi/m++8iTwvc3ViPicsICfljYPkvY3lhYPntYQ8c3ViPu+8iOS7pTEwMDDngrrkuIDpgLLvvIk8L3N1Yj4nKSxcblx0Ynl0ZXM6IHdpbmRvdy53Z1VMUygn5a2X6IqCJywgJ+S9jeWFg+e1hCcpLFxuXHRkYXk6ICflpKknLFxuXHRkYXlzOiAn5aSpJyxcblx0aG91cjogd2luZG93LndnVUxTKCflsI/ml7YnLCAn5bCP5pmCJyksXG5cdGhvdXJzOiB3aW5kb3cud2dVTFMoJ+Wwj+aXticsICflsI/mmYInKSxcblx0bWludXRlOiAn5YiGJyxcblx0bWludXRlczogJ+WIhicsXG5cdHNlY29uZDogJ+enkicsXG5cdHNlY29uZHM6ICfnp5InLFxuXHR3ZWVrOiAn5ZGoJyxcblx0d2Vla3M6ICflkagnLFxuXHRtb250aDogJ+aciCcsXG5cdG1vbnRoczogJ+aciCcsXG5cdHllYXI6ICflubQnLFxuXHR5ZWFyczogJ+W5tCcsXG5cdHNlYXJjaDogd2luZG93LndnVUxTKCfmkJzntKInLCAn5pCc5bCLJyksXG5cdFNlYXJjaEhpbnQ6IHdpbmRvdy53Z1VMUygn5pCc57Si5YyF5ZCrICVzIOeahOmhtemdoicsICfmkJzlsIvljIXlkKsgJXMg55qE6aCB6Z2iJyksXG5cdHdlYjogJ0JpbmcnLFxuXHRnbG9iYWw6ICflhajln58nLFxuXHQnbW9yZS4uLic6ICfmm7TlpJrigKbigKYnLFxuXHQvLyBhcnRpY2xlLXJlbGF0ZWQgYWN0aW9ucyBhbmQgaW5mb1xuXHQvLyAoc29tZSBhY3Rpb25zIGFsc28gYXBwbHkgdG8gdXNlciBwYWdlcylcblx0YWN0aW9uczogd2luZG93LndnVUxTKCfmk43kvZwnLCAn5YuV5L2cJyksXG5cdC8vIC8vLyB2aWV3IGFydGljbGVzIGFuZCB2aWV3IHRhbGtcblx0cG9wdXBzTWVudTogJ1BvcHVwcycsXG5cdCdkaXNhYmxlIHByZXZpZXdzJzogd2luZG93LndnVUxTKCfnpoHnlKjpooTop4gnLCAn56aB55So6aCQ6Ka9JyksXG5cdHRvZ2dsZVByZXZpZXdzSGludDogd2luZG93LndnVUxTKCfliIfmjaLmnKzpobUgUG9wdXBzIOeahOmihOiniOW8gOWFsycsICfliIfmj5vmnKzpoIEgUG9wdXBzIOeahOmgkOimvemWi+mXnCcpLFxuXHQndG9nZ2xlIHByZXZpZXdzJzogd2luZG93LndnVUxTKCfliIfmjaLpooTop4jlvIDlhbMnLCAn5YiH5o+b6aCQ6Ka96ZaL6ZecJyksXG5cdHJlc2V0OiB3aW5kb3cud2dVTFMoJ+WkjeS9jScsICfopIfkvY0nKSxcblx0ZGlzYWJsZTogJ+emgeeUqCBQb3B1cHMnLFxuXHRkaXNhYmxlUG9wdXBzSGludDogd2luZG93LndnVUxTKFxuXHRcdCflnKjmnKzpobXnpoHnlKggUG9wdXBz77yM5Yi35paw6aG16Z2i5Lul6YeN5paw5ZCv55So44CCJyxcblx0XHQn5Zyo5pys6aCB56aB55SoIFBvcHVwc++8jOmHjeaWsOaVtOeQhumggemdouS7pemHjeaWsOWVn+eUqOOAgidcblx0KSxcblx0cHVyZ2VQb3B1cHNIaW50OiB3aW5kb3cud2dVTFMoJ+WkjeS9jSBQb3B1cHPvvIzmuIXpmaTmiYDmnInnvJPlrZjmlbDmja7jgIInLCAn6KSH5L2NIFBvcHVwc++8jOa4hemZpOaJgOacieW/q+WPluizh+aWmeOAgicpLFxuXHRQb3B1cHNIaW50OiB3aW5kb3cud2dVTFMoJ+WkjeS9jSBQb3B1cHPvvIzmuIXpmaTmiYDmnInnvJPlrZjmlbDmja7jgIInLCAn6KSH5L2NIFBvcHVwc++8jOa4hemZpOaJgOacieW/q+WPluizh+aWmeOAgicpLFxuXHRzcGFjZWJhcjogJ+epuuagvCcsXG5cdHZpZXc6IHdpbmRvdy53Z1VMUygn5p+l55yLJywgJ+aqouimlicpLFxuXHQndmlldyBhcnRpY2xlJzogd2luZG93LndnVUxTKCfmn6XnnIvmnaHnm64nLCAn5qqi6KaW5qKd55uuJyksXG5cdHZpZXdIaW50OiB3aW5kb3cud2dVTFMoJ+WJjeW+gCAlcycsICfliY3lvoAgJXMnKSxcblx0dGFsazogd2luZG93LndnVUxTKCforqjorronLCAn6KiO6KuWJyksXG5cdCd0YWxrIHBhZ2UnOiB3aW5kb3cud2dVTFMoJ+iuqOiuuumhtScsICfoqI7oq5bpoIEnKSxcblx0J3RoaXMmbmJzcDtyZXZpc2lvbic6IHdpbmRvdy53Z1VMUygn5q2k5L+u6K6i54mI5pysJywgJ+atpOS/ruiogueJiOacrCcpLFxuXHQncmV2aXNpb24gJXMgb2YgJXMnOiB3aW5kb3cud2dVTFMoJ+mhtemdoiAkMiDnmoTkv67orqLniYjmnKwgJDEnLCAn6aCB6Z2iICQyIOeahOS/ruiogueJiOacrCAkMScpLFxuXHQnUmV2aXNpb24gJXMgb2YgJXMnOiB3aW5kb3cud2dVTFMoJ+mhtemdoiAkMiDnmoTkv67orqLniYjmnKwgJDEnLCAn6aCB6Z2iICQyIOeahOS/ruiogueJiOacrCAkMScpLFxuXHQndGhlIHJldmlzaW9uIHByaW9yIHRvIHJldmlzaW9uICVzIG9mICVzJzogd2luZG93LndnVUxTKFxuXHRcdCfpobXpnaIgJDIg55qE5L+u6K6i54mI5pysICQxIOS5i+WJjeeahOS/ruiuoueJiOacrCcsXG5cdFx0J+mggemdoiAkMiDnmoTkv67oqILniYjmnKwgJDEg5LmL5YmN55qE5L+u6KiC54mI5pysJ1xuXHQpLFxuXHQnVG9nZ2xlIGltYWdlIHNpemUnOiB3aW5kb3cud2dVTFMoJ+eCueWHu+WIh+aNouWbvueJh+Wkp+WwjycsICfpu57mk4rliIfmj5vlnJbniYflpKflsI8nKSxcblx0ZGVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpCcsICfliKDpmaQnKSxcblx0Ly8gLy8vIGRlbGV0ZSwgcHJvdGVjdCwgbW92ZVxuXHRkZWxldGU6IHdpbmRvdy53Z1VMUygn5Yig6ZmkJywgJ+WIoOmZpCcpLFxuXHRkZWxldGVIaW50OiB3aW5kb3cud2dVTFMoJ+WIoOmZpCAlcycsICfliKDpmaQgJXMnKSxcblx0dW5kZWxldGVTaG9ydDogd2luZG93LndnVUxTKCfmgaLlpI0nLCAn5oGi5b6pJyksXG5cdFVuZGVsZXRlSGludDogd2luZG93LndnVUxTKCfmgaLlpI0gJXMnLCAn5oGi5b6pICVzJyksXG5cdHByb3RlY3Q6IHdpbmRvdy53Z1VMUygn5L+d5oqkJywgJ+S/neittycpLFxuXHRwcm90ZWN0SGludDogd2luZG93LndnVUxTKCfkv53miqQgJXMnLCAn5L+d6K23ICVzJyksXG5cdHVucHJvdGVjdFNob3J0OiB3aW5kb3cud2dVTFMoJ+ino+mZpCcsICfop6PpmaQnKSxcblx0dW5wcm90ZWN0SGludDogd2luZG93LndnVUxTKCfop6PpmaTlr7kgJXMg55qE5L+d5oqkJywgJ+ino+mZpOWwjSAlcyDnmoTkv53orbcnKSxcblx0bW92ZTogd2luZG93LndnVUxTKCfnp7vliqgnLCAn56e75YuVJyksXG5cdCdtb3ZlIHBhZ2UnOiB3aW5kb3cud2dVTFMoJ+enu+WKqOmhtemdoicsICfnp7vli5XpoIHpnaInKSxcblx0TW92ZXBhZ2VIaW50OiB3aW5kb3cud2dVTFMoJ+S/ruaUuSAlcyDnmoTmoIfpopgnLCAn5L+u5pS5ICVzIOeahOaomemhjCcpLFxuXHRlZGl0OiB3aW5kb3cud2dVTFMoJ+e8lui+kScsICfnt6jovK8nKSxcblx0Ly8gLy8vIGVkaXQgYXJ0aWNsZXMgYW5kIHRhbGtcblx0J2VkaXQgYXJ0aWNsZSc6IHdpbmRvdy53Z1VMUygn57yW6L6R5p2h55uuJywgJ+e3qOi8r+aineebricpLFxuXHRlZGl0SGludDogd2luZG93LndnVUxTKCfkv67mlLkgJXMg55qE5YaF5a65JywgJ+S/ruaUuSAlcyDnmoTlhaflrrknKSxcblx0J2VkaXQgdGFsayc6IHdpbmRvdy53Z1VMUygn57yW6L6R6K6o6K666aG1JywgJ+e3qOi8r+WwjeipsemggScpLFxuXHRuZXc6IHdpbmRvdy53Z1VMUygn5pawJywgJ+aWsCcpLFxuXHQnbmV3IHRvcGljJzogd2luZG93LndnVUxTKCfmlrDor53popgnLCAn5paw6Kmx6aGMJyksXG5cdG5ld1NlY3Rpb25IaW50OiB3aW5kb3cud2dVTFMoJ+WcqCAlcyDlop7liqDmlrDnmoTorqjorrror53popgnLCAn5ZyoICVzIOWinuWKoOaWsOeahOiojuirluipsemhjCcpLFxuXHQnbnVsbCBlZGl0Jzogd2luZG93LndnVUxTKCfnqbrnvJbovpEnLCAn56m657eo6LyvJyksXG5cdG51bGxFZGl0SGludDogd2luZG93LndnVUxTKCfov5vooYzkuIDmrKHlr7kgJXMg55qE56m657yW6L6RJywgJ+ijvemAoOS4gOasoeWwjSAlcyDnmoTnqbrnt6jovK8nKSxcblx0aGlzdDogd2luZG93LndnVUxTKCfljoblj7InLCAn5q235Y+yJyksXG5cdC8vIC8vLyBoaXN0b3J5LCBkaWZmcywgZWRpdG9ycywgcmVsYXRlZFxuXHRoaXN0b3J5OiB3aW5kb3cud2dVTFMoJ+WOhuWPsicsICfmrbflj7InKSxcblx0aGlzdG9yeUhpbnQ6IHdpbmRvdy53Z1VMUygnJXMg55qE5L+u6K6i5Y6G5Y+yJywgJyVzIOeahOS/ruioguatt+WPsicpLFxuXHRsYXN0OiB3aW5kb3cud2dVTFMoJ+S5i+WJjScsICfkuYvliY0nKSxcblx0Ly8gW1tNZWRpYVdpa2k6TGFzdF1dXG5cdGxhc3RFZGl0OiB3aW5kb3cud2dVTFMoJ+acgOi/keabtOaUuScsICfmnIDov5Hmm7TmlLknKSxcblx0J3Nob3cgbGFzdCBlZGl0Jzogd2luZG93LndnVUxTKCfmnIDov5HkuIDmrKHmm7TmlLknLCAn5pyA5paw5LiA5qyh5L+u6KiCJyksXG5cdCdTaG93IHRoZSBsYXN0IGVkaXQnOiB3aW5kb3cud2dVTFMoJ+aYvuekuuacgOi/keS4gOasoeabtOaUueeahOW3ruW8gicsICfpoa/npLrmnIDmlrDkuIDmrKHkv67oqILnmoTlt67nlbAnKSxcblx0bGFzdENvbnRyaWI6IHdpbmRvdy53Z1VMUygn5pyA6L+R57yW6L6RJywgJ+acgOi/kee3qOi8rycpLFxuXHQnbGFzdCBzZXQgb2YgZWRpdHMnOiB3aW5kb3cud2dVTFMoJ+acgOi/kee8lui+kScsICfmnIDov5Hnt6jovK8nKSxcblx0bGFzdENvbnRyaWJIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuueUseacgOWQjuS4gOS9jee8lui+keiAhemAoOaIkOeahOW3ruW8gicsICfpoa/npLrnlLHmnIDlvozkuIDkvY3nt6jovK/ogIXoo73pgKDnmoTlt67nlbAnKSxcblx0Y3VyOiB3aW5kb3cud2dVTFMoJ+W9k+WJjScsICfnlbbliY0nKSxcblx0ZGlmZkN1cjogd2luZG93LndnVUxTKCfkuI7lvZPliY3niYjmnKznmoTlt67lvIInLCAn6IiH55uu5YmN54mI5pys55qE5beu55WwJyksXG5cdCdTaG93IGNoYW5nZXMgc2luY2UgcmV2aXNpb24gJXMnOiB3aW5kb3cud2dVTFMoJ+aYvuekuuiHquS/ruiuoueJiOacrCAlcyDnmoTlt67lvIInLCAn6aGv56S66Ieq5L+u6KiC54mI5pysICVzIOeahOW3rueVsCcpLFxuXHQnJXMgb2xkJzogd2luZG93LndnVUxTKCclcyDliY3nmoTmnIDlkI7niYjmnKwnLCAnJXMg5YmN55qE5pyA5ZCO54mI5pysJyksXG5cdC8vIGFzIGluIDQgd2Vla3Mgb2xkXG5cdG9sZEVkaXQ6IHdpbmRvdy53Z1VMUygn5pen57yW6L6RJywgJ+iIiue3qOi8rycpLFxuXHRwdXJnZTogd2luZG93LndnVUxTKCfmuIXpmaTnvJPlrZgnLCAn5riF6Zmk5b+r5Y+WJyksXG5cdHB1cmdlSGludDogd2luZG93LndnVUxTKCfmuIXpmaTmnI3liqHlmajkuK0gJXMg55qE57yT5a2YJywgJ+a4hemZpOS8uuacjeWZqOS4rSAlcyDnmoTlv6vlj5YnKSxcblx0cmF3OiB3aW5kb3cud2dVTFMoJ+a6kOS7o+eggScsICfljp/lp4vnorwnKSxcblx0cmF3SGludDogd2luZG93LndnVUxTKCfmn6XnnIsgJXMg55qE5rqQ5Luj56CBJywgJ+aqouimliAlcyDnmoTljp/lp4vnorwnKSxcblx0cmVuZGVyOiB3aW5kb3cud2dVTFMoJ+S7heato+aWhycsICflg4XmraPmlocnKSxcblx0cmVuZGVySGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE57qvSFRNTOino+aekO+8iOS7heato+aWh+WGheWuue+8iScsICfpoa/npLogJXMg55qE57SUSFRNTOino+aekO+8iOWDheato+aWh+WFp+Wuue+8iScpLFxuXHQnU2hvdyB0aGUgZWRpdCBtYWRlIHRvIGdldCByZXZpc2lvbic6IHdpbmRvdy53Z1VMUygn5pi+56S657yW6L6R5Lul5b6X5Yiw5L+u6K6i54mI5pysJywgJ+mhr+ekuue3qOi8r+S7peW+l+WIsOS/ruiogueJiOacrCcpLFxuXHRzaW5jZU1lOiB3aW5kb3cud2dVTFMoJ+iHquaIkScsICfoh6rmiJEnKSxcblx0J2NoYW5nZXMgc2luY2UgbWluZSc6IHdpbmRvdy53Z1VMUygn6Ieq5oiR5L+u6K6i55qE5beu5byCJywgJ+iHquaIkeS/ruiogueahOW3rueVsCcpLFxuXHRzaW5jZU1lSGludDogd2luZG93LndnVUxTKCfmmL7npLroh6rmiJHkuIrmrKHkv67mlLnku6XmnaXnmoTlt67lvIInLCAn6aGv56S66Ieq5oiR5LiK5qyh5L+u5pS55Lul5L6G55qE5beu55WwJyksXG5cdFwiQ291bGRuJ3QgZmluZCBhbiBlZGl0IGJ5ICVzXFxuaW4gdGhlIGxhc3QgJXMgZWRpdHMgdG9cXG4lc1wiOiB3aW5kb3cud2dVTFMoXG5cdFx0J+WcqCAkMyDmnIDov5EgJDIg5qyh57yW6L6R5Lit5om+5LiN5YiwICQxIOWBmuWHuueahOS/ruaUuScsXG5cdFx0J+WcqCAkMyDmnIDov5EgJDIg5qyh57eo6Lyv5Lit5om+5LiN5YiwICQxIOWBmuWHuueahOS/ruaUuSdcblx0KSxcblx0ZWRzOiB3aW5kb3cud2dVTFMoJ+e8lui+kScsICfnt6jovK8nKSxcblx0ZWRpdG9yczogd2luZG93LndnVUxTKCfnvJbovpHogIUnLCAn57eo6Lyv6ICFJyksXG5cdGVkaXRvckxpc3RIaW50OiB3aW5kb3cud2dVTFMoJ+WIl+WHuue8lui+kei/hyAlcyDnmoTnlKjmiLcnLCAn5YiX5Ye657eo6Lyv6YGOICVzIOeahOS9v+eUqOiAhScpLFxuXHRyZWxhdGVkOiB3aW5kb3cud2dVTFMoJ+ebuOWFsycsICfnm7jpl5wnKSxcblx0cmVsYXRlZENoYW5nZXM6IHdpbmRvdy53Z1VMUygn55u45YWz5pu05pS5JywgJ+ebuOmXnOabtOaUuScpLFxuXHQncmVsYXRlZCBjaGFuZ2VzJzogd2luZG93LndnVUxTKCfnm7jlhbPmm7TmlLknLCAn55u46Zec5pu05pS5JyksXG5cdFJlY2VudGNoYW5nZXNsaW5rZWRIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuuebuOWFsyAlcyDnmoTkv67mlLknLCAn6aGv56S655u46ZecICVzIOeahOS/ruaUuScpLFxuXHRlZGl0T2xkOiB3aW5kb3cud2dVTFMoJ+e8lui+keaXp+eJiCcsICfnt6jovK/oiIrniYgnKSxcblx0Ly8gLy8vIGVkaXQgb2xkIHZlcnNpb24sIG9yIHJldmVydFxuXHRydjogd2luZG93LndnVUxTKCflm57pgIAnLCAn5oGi5b6pJyksXG5cdHJldmVydDogd2luZG93LndnVUxTKCflm57pgIAnLCAn5oGi5b6pJyksXG5cdHJldmVydEhpbnQ6IHdpbmRvdy53Z1VMUygn5Zue6YCA5YiwICVzJywgJ+aBouW+qeWIsCAlcycpLFxuXHR1bmRvOiB3aW5kb3cud2dVTFMoJ+aSpOmUgCcsICfmkqTpircnKSxcblx0dW5kb0hpbnQ6IHdpbmRvdy53Z1VMUygn5pKk6ZSA6L+Z5qyh57yW6L6RJywgJ+aSpOmKt+mAmeasoee3qOi8rycpLFxuXHRkZWZhdWx0cG9wdXBSZWRsaW5rU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCfnp7vpmaTliLDnqbrpobXpnaJbWyVzXV3nmoTpk77mjqXvvIhQb3B1cHPvvIknLFxuXHRcdCfnp7vpmaTliLDnqbrpoIHpnaJbWyVzXV3nmoTpgKPntZDvvIhQb3B1cHPvvIknXG5cdCksXG5cdGRlZmF1bHRwb3B1cEZpeERhYnNTdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+a2iOatp+S5iVtbJXNdXeWIsFtbJXNdXe+8iFBvcHVwc++8iScsICfmtojmrafnvqlbWyVzXV3liLBbWyVzXV3vvIhQb3B1cHPvvIknKSxcblx0ZGVmYXVsdHBvcHVwRml4UmVkaXJzU3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCflv73nlaXku45bWyVzXV3liLBbWyVzXV3nmoTph43lrprlkJHvvIhQb3B1cHPvvIknLFxuXHRcdCflv73nlaXlvp5bWyVzXV3liLBbWyVzXV3nmoTph43mlrDlsI7lkJHvvIhQb3B1cHPvvIknXG5cdCksXG5cdGRlZmF1bHRwb3B1cEV4dGVuZGVkUmV2ZXJ0U3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdCflm57pgIDliLAkMuWcqCQx5pe257yW6L6R55qE5L+u6K6i54mI5pysJDPvvIhQb3B1cHPvvIknLFxuXHRcdCfpgoTljp/liLAkMuWcqCQx5pmC6KO95L2c55qE5L+u6KiC54mI5pysJDPvvIhQb3B1cHPvvIknXG5cdCksXG5cdGRlZmF1bHRwb3B1cFJldmVydFRvUHJldmlvdXNTdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0J+WbnumAgOWIsOS/ruiuoueJiOacrCVz55qE5LiK5LiA5Liq54mI5pys77yIUG9wdXBz77yJJyxcblx0XHQn6YKE5Y6f5Yiw5L+u6KiC54mI5pysJXPnmoTkuIrkuIDlgIvniYjmnKzvvIhQb3B1cHPvvIknXG5cdCksXG5cdGRlZmF1bHRwb3B1cFJldmVydFN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5Zue6YCA5Yiw5L+u6K6i54mI5pysJXPvvIhQb3B1cHPvvIknLCAn6YKE5Y6f5Yiw5L+u6KiC54mI5pysJXPvvIhQb3B1cHPvvIknKSxcblx0ZGVmYXVsdHBvcHVwUXVlcmllZFJldmVydFRvUHJldmlvdXNTdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0J+WbnumAgOWIsOS/ruiuoueJiOacrCQx55qE5LiK5LiA5Liq54mI5pys77yM55SxJDPlnKgkMuaXtue8lui+ke+8iFBvcHVwc++8iScsXG5cdFx0J+mChOWOn+WIsOS/ruiogueJiOacrCQx55qE5LiK5LiA5YCL54mI5pys77yM55SxJDPlnKgkMuaZguijveS9nO+8iFBvcHVwc++8iSdcblx0KSxcblx0ZGVmYXVsdHBvcHVwUXVlcmllZFJldmVydFN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHQn5Zue6YCA5YiwJDPlnKgkMuaXtue8lui+keeahOS/ruiuoueJiOacrCQx77yIUG9wdXBz77yJJyxcblx0XHQn6YKE5Y6f5YiwJDPlnKgkMuaZguijveS9nOeahOS/ruiogueJiOacrCQx77yIUG9wdXBz77yJJ1xuXHQpLFxuXHRkZWZhdWx0cG9wdXBSbURhYkxpbmtTdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0J+enu+mZpOWIsOa2iOatp+S5iemhtVtbJXNdXeeahOmTvuaOpe+8iFBvcHVwc++8iScsXG5cdFx0J+enu+mZpOWIsOa2iOatp+e+qemggVtbJXNdXeeahOmAo+e1kO+8iFBvcHVwc++8iSdcblx0KSxcblx0UmVkaXJlY3RzOiB3aW5kb3cud2dVTFMoJ+mHjeWumuWQkScsICfph43lrprlkJEnKSxcblx0Ly8gYXMgaW4gUmVkaXJlY3RzIHRvIC4uLlxuXHQvLyBcIiB0byBcIjogd2luZG93LndnVUxTKCBcIuWIsFwiLFwi5YiwXCIgKSxcblx0Ly8gYXMgaW4gUmVkaXJlY3RzIHRvIC4uLlxuXHQnQnlwYXNzIHJlZGlyZWN0Jzogd2luZG93LndnVUxTKCflv73nlaXph43lrprlkJEnLCAn5b+955Wl6YeN5paw5bCO5ZCRJyksXG5cdCdGaXggdGhpcyByZWRpcmVjdCc6IHdpbmRvdy53Z1VMUygn5L+u5aSN6YeN5a6a5ZCRJywgJ+S/ruW+qemHjeaWsOWwjuWQkScpLFxuXHRkaXNhbWJpZzogd2luZG93LndnVUxTKCfmtojmrafkuYknLCAn5raI5q2n576pJyksXG5cdC8vIC8vLyBhZGQgb3IgcmVtb3ZlIGRhYiBldGMuXG5cdGRpc2FtYmlnSGludDogd2luZG93LndnVUxTKCfmtojmrafkuYnov5nkuKrpk77mjqXliLAgW1slc11dJywgJ+a2iOatp+e+qemAmeWAi+mAo+e1kOWIsCBbWyVzXV0nKSxcblx0J0NsaWNrIHRvIGRpc2FtYmlndWF0ZSB0aGlzIGxpbmsgdG86Jzogd2luZG93LndnVUxTKCfngrnlh7vku6XmtojmrafkuYnov5nkuKrpk77mjqXliLDvvJonLCAn6bue5pOK5Lul5raI5q2n576p6YCZ5YCL6YCj57WQ5Yiw77yaJyksXG5cdCdyZW1vdmUgdGhpcyBsaW5rJzogd2luZG93LndnVUxTKCfnp7vpmaTpk77mjqUnLCAn56e76Zmk6YCj57WQJyksXG5cdCdyZW1vdmUgYWxsIGxpbmtzIHRvIHRoaXMgcGFnZSBmcm9tIHRoaXMgYXJ0aWNsZSc6IHdpbmRvdy53Z1VMUyhcblx0XHQn56e76Zmk5q2k5p2h55uu5Yiw6L+Z6aG155qE5omA5pyJ6ZO+5o6lJyxcblx0XHQn56e76Zmk5q2k5qKd55uu5Yiw6YCZ6aCB55qE5omA5pyJ6YCj57WQJ1xuXHQpLFxuXHQncmVtb3ZlIGFsbCBsaW5rcyB0byB0aGlzIGRpc2FtYmlnIHBhZ2UgZnJvbSB0aGlzIGFydGljbGUnOiB3aW5kb3cud2dVTFMoXG5cdFx0J+enu+mZpOatpOadoeebruWIsOi/mea2iOatp+S5ieeahOaJgOaciemTvuaOpScsXG5cdFx0J+enu+mZpOatpOaineebruWIsOmAmea2iOatp+e+qeeahOaJgOaciemAo+e1kCdcblx0KSxcblx0bWFpbmxpbms6IHdpbmRvdy53Z1VMUygn5Li76ZO+5o6lJywgJ+S4u+mAo+e1kCcpLFxuXHQvLyAvLy8gbGlua3MsIHdhdGNoLCB1bndhdGNoXG5cdHdpa2lMaW5rOiB3aW5kb3cud2dVTFMoJ+S4quWGhemDqOmTvuaOpScsICfkuKrlhafpg6jpgKPntZAnKSxcblx0d2lraUxpbmtzOiB3aW5kb3cud2dVTFMoJ+S4quWGhemDqOmTvuaOpScsICfkuKrlhafpg6jpgKPntZAnKSxcblx0J2xpbmtzIGhlcmUnOiB3aW5kb3cud2dVTFMoJ+mTvuWFpScsICfpj4jlhaUnKSxcblx0d2hhdExpbmtzSGVyZTogd2luZG93LndnVUxTKCfpk77lhaXpobXpnaInLCAn6Y+I5YWl6aCB6Z2iJyksXG5cdCd3aGF0IGxpbmtzIGhlcmUnOiB3aW5kb3cud2dVTFMoJ+mTvuWFpemhtemdoicsICfpj4jlhaXpoIHpnaInKSxcblx0V2hhdGxpbmtzaGVyZUhpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S66ZO+5o6l5YiwICVzIOeahOmhtemdoicsICfpoa/npLrpgKPntZDliLAgJXMg55qE6aCB6Z2iJyksXG5cdHVud2F0Y2hTaG9ydDogd2luZG93LndnVUxTKCflj5bmtognLCAn5Y+W5raIJyksXG5cdHdhdGNoVGhpbmd5OiB3aW5kb3cud2dVTFMoJ+ebkeinhicsICfnm6PoppYnKSxcblx0Ly8gY2FsbGVkIHdhdGNoVGhpbmd5IGJlY2F1c2Uge30ud2F0Y2ggaXMgYSBmdW5jdGlvblxuXHR3YXRjaEhpbnQ6IHdpbmRvdy53Z1VMUygn5Yqg5YWlICVzIOWIsOaIkeeahOebkeinhuWIl+ihqCcsICfliqDlhaUgJXMg5Yiw5oiR55qE55uj6KaW5YiX6KGoJyksXG5cdHVud2F0Y2hIaW50OiB3aW5kb3cud2dVTFMoJ+S7juaIkeeahOebkeinhuWIl+ihqOenu+mZpCAlcycsICflvp7miJHnmoTnm6PoppbliJfooajnp7vpmaQgJXMnKSxcblx0J09ubHkgZm91bmQgb25lIGVkaXRvcjogJXMgbWFkZSAlcyBlZGl0cyc6IHdpbmRvdy53Z1VMUyhcblx0XHQn5LuF5om+5Yiw5LiA5L2N57yW6ICF77yaJXMg5Yi26YCg5LqGICVzIOasoee8lui+kScsXG5cdFx0J+WDheaJvuWIsOS4gOS9jee3qOiAhe+8miVzIOijvemAoOS6hiAlcyDmrKHnt6jovK8nXG5cdCksXG5cdCclcyBzZWVtcyB0byBiZSB0aGUgbGFzdCBlZGl0b3IgdG8gdGhlIHBhZ2UgJXMnOiB3aW5kb3cud2dVTFMoXG5cdFx0JyVzIOeci+S4iuWOu+aYryAlcyDov5npobXnmoTmnIDlkI7kuIDkvY3nvJbogIUnLFxuXHRcdCclcyDnnIvkuIrljrvmmK8gJXMg6YCZ6aCB55qE5pyA5b6M5LiA5L2N57eo6ICFJ1xuXHQpLFxuXHRyc3M6IHdpbmRvdy53Z1VMUygnUlNTJywgJ1JTUycpLFxuXHQvLyBkaWZmIHByZXZpZXdzXG5cdCdEaWZmIHRydW5jYXRlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyc6IHdpbmRvdy53Z1VMUygn5Ye65LqO5oCn6IO96ICD6JmR77yM5beu5byC5bey6KKr5oiq5patJywgJ+WHuuaWvOaViOiDveiAg+aFru+8jOW3rueVsOW3suiiq+aIquaWtycpLFxuXHQnT2xkIHJldmlzaW9uJzogd2luZG93LndnVUxTKCfml6fniYjmnKwnLCAn6IiK54mI5pysJyksXG5cdCdOZXcgcmV2aXNpb24nOiB3aW5kb3cud2dVTFMoJ+aWsOeJiOacrCcsICfmlrDniYjmnKwnKSxcblx0J1NvbWV0aGluZyB3ZW50IHdyb25nIDotKCc6IHdpbmRvdy53Z1VMUygn5Ye66Zeu6aKY5LqGIDotKCcsICflh7rllY/poYzkuoYgOi0oJyksXG5cdCdFbXB0eSByZXZpc2lvbiwgbWF5YmUgbm9uLWV4aXN0ZW50Jzogd2luZG93LndnVUxTKCfnqbrnmoTkv67orqLvvIzlj6/og73lubbkuI3lrZjlnKgnLCAn56m655qE5L+u6KiC77yM5Y+v6IO95Lim5LiN5a2Y5ZyoJyksXG5cdCdVbmtub3duIGRhdGUnOiB3aW5kb3cud2dVTFMoJ+acquefpeaXpeacnycsICfmnKrnn6Xml6XmnJ8nKSxcblx0Ly8gb3RoZXIgc3BlY2lhbCBwcmV2aWV3c1xuXHQnRW1wdHkgY2F0ZWdvcnknOiB3aW5kb3cud2dVTFMoJ+epuueahOWIhuexuycsICfnqbrnmoTliIbpoZ4nKSxcblx0J0NhdGVnb3J5IG1lbWJlcnMgKCVzIHNob3duKSc6IHdpbmRvdy53Z1VMUygn5YiG57G75oiQ5ZGY77yIJXMg5pi+56S677yJJywgJ+WIhumhnuaIkOWToe+8iCVzIOmhr+ekuu+8iScpLFxuXHQnTm8gaW1hZ2UgbGlua3MgZm91bmQnOiB3aW5kb3cud2dVTFMoJ+acquaJvuWIsOaWh+S7tumTvuaOpScsICfmnKrmib7liLDmqpTmoYjpgKPntZAnKSxcblx0J0ZpbGUgbGlua3MnOiB3aW5kb3cud2dVTFMoJ+aWh+S7tumTvuaOpScsICfmqpTmoYjpgKPntZAnKSxcblx0J25vdCBjb21tb25zJzogd2luZG93LndnVUxTKCfnu7Tln7rlhbHkuqvkuK3ml6DmraTlkI3np7DnmoTmlofku7bjgIInLCAn57at5Z+65YWx5Lqr5Lit54Sh5q2k5ZCN56ix55qE5qqU5qGI44CCJyksXG5cdCdjb21tb25zIG9ubHknOiB3aW5kb3cud2dVTFMoJ+atpOaWh+S7tuadpeiHque7tOWfuuWFseS6q+OAgicsICfmraTmqpTmoYjkvoboh6rntq3ln7rlhbHkuqvjgIInKSxcblx0J05vIGltYWdlIGZvdW5kJzogd2luZG93LndnVUxTKCfmib7kuI3liLDmlofku7YnLCAn5om+5LiN5Yiw5qqU5qGIJyksXG5cdCdjb21tb25zIGR1cGUnOiB3aW5kb3cud2dVTFMoJ+e7tOWfuuWFseS6q+S4reWtmOWcqOatpOaWh+S7tueahOWJr+acrOOAgicsICfntq3ln7rlhbHkuqvkuK3lrZjlnKjmraTmqpTmoYjnmoTlia/mnKzjgIInKSxcblx0J2NvbW1vbnMgY29uZmxpY3QnOiB3aW5kb3cud2dVTFMoJ+e7tOWfuuWFseS6q+S4reWtmOWcqOatpOaWh+S7tuWQjeensOS4jeWQjOeahOWJr+acrOOAgicsICfntq3ln7rlhbHkuqvkuK3lrZjlnKjmraTmqpTlkI3nqLHkuI3lkIznmoTlia/mnKzjgIInKSxcblx0Ly8gdXNlci1yZWxhdGVkIGFjdGlvbnMgYW5kIGluZm9cblx0dXNlcjogd2luZG93LndnVUxTKCfnlKjmiLcnLCAn5L2/55So6ICFJyksXG5cdC8vIC8vLyB1c2VyIHBhZ2UsIHRhbGssIGVtYWlsLCBzcGFjZVxuXHQndXNlciZuYnNwO3BhZ2UnOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+mhtScsICfkvb/nlKjogIXpoIEnKSxcblx0J3VzZXIgdGFsayc6IHdpbmRvdy53Z1VMUygn55So5oi36K6o6K66JywgJ+S9v+eUqOiAheWwjeipsScpLFxuXHQnZWRpdCB1c2VyIHRhbGsnOiB3aW5kb3cud2dVTFMoJ+e8lui+keeUqOaIt+iuqOiuuicsICfnt6jovK/kvb/nlKjogIXlsI3oqbEnKSxcblx0J2xlYXZlIGNvbW1lbnQnOiB3aW5kb3cud2dVTFMoJ+eVmeiogCcsICfnlZnoqIAnKSxcblx0ZW1haWw6IHdpbmRvdy53Z1VMUygn55S16YKuJywgJ+mbu+mDtScpLFxuXHQnZW1haWwgdXNlcic6IHdpbmRvdy53Z1VMUygn55S16YKu55So5oi3JywgJ+mbu+mDteS9v+eUqOiAhScpLFxuXHRFbWFpbHVzZXJIaW50OiB3aW5kb3cud2dVTFMoJ+e7mSAlcyDlj5HpgIHnlLXlrZDpgq7ku7YnLCAn57WmICVzIOeZvOmAgembu+WtkOmDteS7ticpLFxuXHRzcGFjZTogd2luZG93LndnVUxTKCflrZDpobXpnaInLCAn5a2Q6aCB6Z2iJyksXG5cdC8vIHNob3J0IGZvcm0gZm9yIHVzZXJTcGFjZSBsaW5rXG5cdFByZWZpeGluZGV4SGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE55So5oi36aG15a2Q6aG16Z2iJywgJ+mhr+ekuiAlcyDnmoTkvb/nlKjogIXpoIHlrZDpoIHpnaInKSxcblx0Y291bnQ6IHdpbmRvdy53Z1VMUygn57uf6K6hJywgJ+e1seioiCcpLFxuXHQvLyAvLy8gY29udHJpYnV0aW9ucywgdHJlZSwgbG9nXG5cdCdlZGl0IGNvdW50ZXInOiB3aW5kb3cud2dVTFMoJ+e8lui+keasoeaVsCcsICfnt6jovK/mrKHmlbgnKSxcblx0a2F0ZWxpbmtIaW50OiB3aW5kb3cud2dVTFMoJyVzIOeahOe8lui+keasoeaVsCcsICclcyDnmoTnt6jovK/mrKHmlbgnKSxcblx0Y29udHJpYnM6IHdpbmRvdy53Z1VMUygn6LSh54yuJywgJ+iyoueNuycpLFxuXHRjb250cmlidXRpb25zOiB3aW5kb3cud2dVTFMoJ+i0oeeMricsICfosqLnjbsnKSxcblx0ZGVsZXRlZENvbnRyaWJzOiB3aW5kb3cud2dVTFMoJ+W3suWIoOmZpOeahOi0oeeMricsICflt7LliKrpmaTnmoTosqLnjbsnKSxcblx0Q29udHJpYnV0aW9uc0hpbnQ6IHdpbmRvdy53Z1VMUygnJXMg55qE55So5oi36LSh54yuJywgJyVzIOeahOS9v+eUqOiAheiyoueNuycpLFxuXHR0cmVlOiB3aW5kb3cud2dVTFMoJ+agkScsICfmqLknKSxcblx0Y29udHJpYnNUcmVlSGludDogd2luZG93LndnVUxTKCfmoLnmja7lkI3lrZfnqbrpl7Tmn6XnnIsgJXMg55qE6LSh54yuJywgJ+agueaTmuWRveWQjeepuumWk+aqouimliAlcyDnmoTosqLnjbsnKSxcblx0bG9nOiB3aW5kb3cud2dVTFMoJ+aXpeW/lycsICfml6XoqownKSxcblx0J3VzZXIgbG9nJzogd2luZG93LndnVUxTKCfnlKjmiLfml6Xlv5cnLCAn5L2/55So6ICF5pel6KqMJyksXG5cdHVzZXJMb2dIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuiAlcyDnmoTnlKjmiLfml6Xlv5cnLCAn6aGv56S6ICVzIOeahOS9v+eUqOiAheaXpeiqjCcpLFxuXHR1bmJsb2NrU2hvcnQ6IHdpbmRvdy53Z1VMUygn6Kej6ZmkJywgJ+ino+mZpCcpLFxuXHRibG9jazogd2luZG93LndnVUxTKCflsIHnpoEnLCAn5bCB6Y6WJyksXG5cdCdibG9jayB1c2VyJzogd2luZG93LndnVUxTKCflsIHnpoHnlKjmiLcnLCAn5bCB6Y6W5L2/55So6ICFJyksXG5cdElwYmxvY2tsaXN0SGludDogd2luZG93LndnVUxTKCfop6PlsIEgJXMnLCAn6Kej5bCBICVzJyksXG5cdEJsb2NraXBIaW50OiB3aW5kb3cud2dVTFMoJ+WwgeemgSAlcycsICflsIHpjpYgJXMnKSxcblx0J2Jsb2NrIGxvZyc6IHdpbmRvdy53Z1VMUygn5bCB56aB5pel5b+XJywgJ+WwgemOluaXpeiqjCcpLFxuXHRibG9ja0xvZ0hpbnQ6IHdpbmRvdy53Z1VMUygn5pi+56S6ICVzIOeahOWwgeemgeaXpeW/lycsICfpoa/npLogJXMg55qE5bCB6Y6W5pel6KqMJyksXG5cdHByb3RlY3RMb2dIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuiAlcyDnmoTkv53miqTml6Xlv5cnLCAn6aGv56S6ICVzIOeahOS/neitt+aXpeiqjCcpLFxuXHRwYWdlTG9nSGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE5pel5b+XJywgJ+mhr+ekuiAlcyDnmoTml6XoqownKSxcblx0ZGVsZXRlTG9nSGludDogd2luZG93LndnVUxTKCfmmL7npLogJXMg55qE5Yig6Zmk5pel5b+XJywgJ+mhr+ekuiAlcyDnmoTliKrpmaTml6XoqownKSxcblx0J0ludmFsaWQgJXMgJXMnOiB3aW5kb3cud2dVTFMoJ+mAiemhuSAlcyDkuI3lj6/nlKjvvJolcycsICfpgbjpoIUgJXMg5LiN5Y+v55So77yaJXMnKSxcblx0bTogJ+WwjycsXG5cdC8vIEF1dG9lZGl0aW5nXG5cdCdFbnRlciBhIG5vbi1lbXB0eSBlZGl0IHN1bW1hcnkgb3IgcHJlc3MgY2FuY2VsIHRvIGFib3J0Jzogd2luZG93LndnVUxTKFxuXHRcdCfovpPlhaXnvJbovpHmkZjopoHvvIzmiJbmjInlj5bmtojkuK3mraLmk43kvZwnLFxuXHRcdCfovLjlhaXnt6jovK/mkZjopoHvvIzmiJbmjInlj5bmtojkuK3mraLmk43kvZwnXG5cdCksXG5cdCdGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIGluZm9ybWF0aW9uLCBwbGVhc2UgZWRpdCBtYW51YWxseS5cXG5cXG4nOiB3aW5kb3cud2dVTFMoXG5cdFx0J+iOt+WPluS/ruiuoueJiOacrOS/oeaBr+Wksei0pe+8jOivt+aJi+WKqOS/ruaUueOAglxcblxcbicsXG5cdFx0J+eNsuWPluS/ruiogueJiOacrOizh+ioiuWkseaVl++8jOiri+aJi+WLleS/ruaUueOAglxcblxcbidcblx0KSxcblx0J1RoZSAlcyBidXR0b24gaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbGlja2VkLiBQbGVhc2Ugd2FpdCBmb3IgdGhlIG5leHQgcGFnZSB0byBsb2FkLic6IHdpbmRvdy53Z1VMUyhcblx0XHQn5oyJ6ZKuICVzIOW3suiiq+iHquWKqOeCueWHu++8jOivt+etieW+heS4i+S4gOS4qumhtemdouWKoOi9veOAgicsXG5cdFx0J+aMiemIlSAlcyDlt7Looqvoh6rli5Xpu57mk4rvvIzoq4vnrYnlvoXkuIvkuIDlgIvpoIHpnaLovInlhaXjgIInXG5cdCksXG5cdCdDb3VsZCBub3QgZmluZCBidXR0b24gJXMuIFBsZWFzZSBjaGVjayB0aGUgc2V0dGluZ3MgaW4geW91ciBqYXZhc2NyaXB0IGZpbGUuJzogd2luZG93LndnVUxTKFxuXHRcdCfmib7kuI3liLDmjInpkq4gJXPvvIzor7fmo4Dmn6XmgqggSmF2YVNjcmlwdCDmlofku7bkuK3nmoTorr7nva7jgIInLFxuXHRcdCfmib7kuI3liLDmjInpiJUgJXPvvIzoq4vmqqLmn6XmgqggSmF2YVNjcmlwdCDmqpTmoYjkuK3nmoToqK3lrprjgIInXG5cdCksXG5cdC8vIFBvcHVwcyBzZXR1cFxuXHQnT3BlbiBmdWxsLXNpemUgaW1hZ2UnOiB3aW5kb3cud2dVTFMoJ+afpeeci+WFqOWwuuWvuOWbvuWDjycsICfmqqLoppblhajlsLrlr7jlvbHlg48nKSxcblx0Ly8g5Lul5LiL5YaF5a6555SxIEFubkFuZ2VsYSDooaXmraNcblx0YmluZ1NlYXJjaEhpbnQ6IHdpbmRvdy53Z1VMUygn5ZyoIEJpbmcg5LiK5pCc57Si4oCcJXPigJ0nLCAn5ZyoIGJpbmcg5LiK5pCc5bCL44CMJXPjgI0nKSxcblx0J2VuYWJsZSBwcmV2aWV3cyc6IHdpbmRvdy53Z1VMUygn5ZCv55So6aKE6KeIJywgJ+WVn+eUqOmgkOimvScpLFxuXHQnc2hvdyBwcmV2aWV3Jzogd2luZG93LndnVUxTKCfnpoHnlKjpooTop4gnLCAn56aB55So6aCQ6Ka9JyksXG5cdGhpc3RvcnlmZWVkSGludDogd2luZG93LndnVUxTKCfor6XpobXpnaLnmoTov5HmnJ/mm7TmlLkgUlNTIGZlZWQnLCAn6Kmy6aCB6Z2i55qE6L+R5pyf5pu05pS5IFJTUyBmZWVkJyksXG5cdCdzZW5kIHRoYW5rcyc6IHdpbmRvdy53Z1VMUygn5Y+R6YCB5oSf6LCiJywgJ+WCs+mAgeaEn+isnScpLFxuXHRUaGFua3NIaW50OiB3aW5kb3cud2dVTFMoJ+WQkeivpeeUqOaIt+WPkemAgeS4gOWwgeaEn+iwoua2iOaBrycsICflkJHoqbLkvb/nlKjogIXlgrPpgIHkuIDlsIHmhJ/orJ3oqIrmga8nKSxcblx0J21hcmsgcGF0cm9sbGVkJzogd2luZG93LndnVUxTKCfmoIforrDkuLrlt7Llt6Hmn6UnLCAn5qiZ6KiY54K65bey5beh5p+lJyksXG5cdG1hcmtwYXRyb2xsZWRIaW50OiB3aW5kb3cud2dVTFMoJ+agh+iusOivpee8lui+keS4uuW3suW3oeafpScsICfmqJnoqJjoqbLnt6jovK/ngrrlt7Llt6Hmn6UnKSxcblx0J0NvdWxkIG5vdCBtYXJrZWQgdGhpcyBlZGl0IGFzIHBhdHJvbGxlZCc6IHdpbmRvdy53Z1VMUygn5peg5rOV5qCH6K6w6K+l57yW6L6R5Li65bey5beh5p+lJywgJ+eEoeazleaomeiomOipsue3qOi8r+eCuuW3suW3oeafpScpLFxuXHRkZWZhdWx0cG9wdXBSZXZpZXdlZFN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5qCH6K6w5LuO54mI5pysJXPliLAlc+mXtOeahOe8lui+keS4uuW3suW3oeafpScsICfmqJnoqJjlvp7niYjmnKwlc+WIsCVz6ZaT55qE57eo6Lyv54K65bey5beh5p+lJyksXG5cdCdJbWFnZSBmcm9tIENvbW1vbnMnOiB3aW5kb3cud2dVTFMoJ+adpeiHque7tOWfuuWFseS6q+eahOWbvueJhycsICfkvoboh6rntq3ln7rlhbHnlKjnmoTlnJbniYcnKSxcblx0J0Rlc2NyaXB0aW9uIHBhZ2UnOiB3aW5kb3cud2dVTFMoJ+WbvueJh+aPj+i/sOmhtScsICflnJbniYfmj4/ov7DpoIEnKSxcblx0J0FsdCB0ZXh0Oic6IHdpbmRvdy53Z1VMUygn5pu/5o2i5paH5pys77yIQWx077yJ77yaJywgJ+abv+aPm+aWh+Wtl++8iEFsdO+8ie+8micpLFxuXHRyZXZkZWw6IHdpbmRvdy53Z1VMUygn5Y6G5Y+y54mI5pys6KKr6ZqQ6JePJywgJ+att+WPsueJiOacrOiiq+maseiXjycpLFxuXHREZWxldGVkY29udHJpYnV0aW9uc0hpbnQ6IHdpbmRvdy53Z1VMUygn55So5oi3JXPnmoTooqvliKDpmaTnvJbovpHmrKHmlbAnLCAn5L2/55So6ICFJXPnmoTooqvliKrpmaTnt6jovK/mrKHmlbgnKSxcblx0J05vIGJhY2tsaW5rcyBmb3VuZCc6IHdpbmRvdy53Z1VMUygn5om+5LiN5Yiw6ZO+5YWl6aG16Z2iJywgJ+aJvuS4jeWIsOmPiOWFpemggemdoicpLFxuXHQnIGFuZCBtb3JlJzogd2luZG93LndnVUxTKCfku6Xlj4rlhbbku5bpobXpnaInLCAn5Lul5Y+K5YW25LuW6aCB6Z2iJyksXG5cdCdEb3dubG9hZCBwcmV2aWV3IGRhdGEnOiB3aW5kb3cud2dVTFMoJ+S4i+i9vemihOiniOaVsOaNricsICfkuIvovInpoJDopr3os4fmlpknKSxcblx0J05vdCBhIHJlZ2lzdGVyZWQgdXNlcm5hbWUnOiB3aW5kb3cud2dVTFMoJ+mdnuW3suazqOWGjOeahOeUqOaItycsICfpnZ7lt7LoqLvlhornmoTkvb/nlKjogIUnKSxcblx0QkxPQ0tFRDogd2luZG93LndnVUxTKCfooqvlsIHnpoEnLCAn6KKr5bCB6Y6WJyksXG5cdCdIYXMgYmxvY2tzJzogd2luZG93LndnVUxTKCfooqvpg6jliIblsIHnpoEnLCAn6KKr6YOo5YiG5bCB6Y6WJyksXG5cdCcgZWRpdHMgc2luY2U6ICc6IHdpbmRvdy53Z1VMUygn5qyh57yW6L6R77yM5rOo5YaM5pel5pyf5Li6JywgJ+asoee3qOi8r++8jOiou+WGiuaXpeacn+eCuicpLFxuXHQnbGFzdCBlZGl0IG9uICc6IHdpbmRvdy53Z1VMUygn5pyA5ZCO5LiA5qyh57yW6L6R5LqOJywgJ+acgOW+jOS4gOasoee3qOi8r+aWvCcpLFxuXHRFbWFpbFVzZXJIaW50OiB3aW5kb3cud2dVTFMoJ+e7mSAlcyDlj5HpgIHnlLXlrZDpgq7ku7YnLCAn57WmICVzIOeZvOmAgembu+WtkOmDteS7ticpLFxuXHRSQU5HRUJMT0NLRUQ6IHdpbmRvdy53Z1VMUygnSVDmrrXooqvlsIHnpoEnLCAnSVDmrrXooqvlsIHpjpYnKSxcblx0J0lQIHVzZXInOiB3aW5kb3cud2dVTFMoJ0lQ55So5oi3JywgJ0lQ5L2/55So6ICFJyksXG5cdCfimYAnOiAn4pmAJyxcblx0J+KZgic6ICfimYInLFxuXHRISURERU46IHdpbmRvdy53Z1VMUygn5YWo5Z+f6ZqQ6JePJywgJ+WFqOWfn+maseiXjycpLFxuXHRMT0NLRUQ6IHdpbmRvdy53Z1VMUygn5YWo5Z+f6ZSB5a6aJywgJ+WFqOWfn+mOluWumicpLFxuXHQnSW52YWxpZCB1c2VyJzogd2luZG93LndnVUxTKCfpnZ7ms5XnlKjmiLflkI0nLCAn6Z2e5rOV5L2/55So6ICF5ZCN56ixJyksXG5cdGRpZmY6IHdpbmRvdy53Z1VMUygn5beu5byCJywgJ+W3rueVsCcpLFxuXHQnIHRvICc6ICfoh7MnLFxuXG5cdGF1dG9lZGl0X3ZlcnNpb246ICducDIwMTQwNDE2Jyxcblx0UHJlZml4SW5kZXhIaW50OiB3aW5kb3cud2dVTFMoJ+aYvuekuueUqOaItyVz55qE5a2Q6aG16Z2iJywgJ+mhr+ekuuS9v+eUqOiAhSVz55qE5a2Q6aCB6Z2iJyksXG5cdG51bGxFZGl0U3VtbWFyeTogd2luZG93LndnVUxTKCfov5vooYzkuIDmrKHpm7bnvJbovpEnLCAn6YCy6KGM5LiA5qyh6Zu257eo6LyvJyksXG5cdC8vIOeUqOaIt+e7hOWQjeensOS7juezu+e7n+a2iOaBr+iOt+WPllxuXHQnZ3JvdXAtbm8tYXV0b2NvbmZpcm1lZCc6IHdpbmRvdy53Z1VMUygn6Z2e6Ieq5Yqo56Gu6K6k55So5oi3JywgJ+mdnuiHquWLleeiuuiqjeS9v+eUqOiAhScpLFxuXHRzZXBhcmF0b3I6ICfjgIEnLFxuXHRjb21tYTogJ++8jCcsXG59O1xuXG5leHBvcnQge3BvcHVwU3RyaW5nc307XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7cG9wdXBzfSBmcm9tICcuL21vZHVsZXMvY29yZSc7XG5cbiQocG9wdXBzKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHdGQUFBQSxTQUFBO0FBQUE7QUFDQSxRQUFJLFFBQVEsU0FBVSxJQUFJO0FBQ3hCLGFBQU8sTUFBTSxHQUFHLFNBQVMsUUFBUTtBQUFBLElBQ25DO0FBR0EsSUFBQUEsUUFBTztBQUFBLElBRUwsTUFBTSxPQUFPLGNBQWMsWUFBWSxVQUFVLEtBQ2pELE1BQU0sT0FBTyxVQUFVLFlBQVksTUFBTTtBQUFBLElBRXpDLE1BQU0sT0FBTyxRQUFRLFlBQVksSUFBSSxLQUNyQyxNQUFNLE9BQU8sVUFBVSxZQUFZLE1BQU0sS0FDekMsTUFBTSxPQUFPLFdBQVEsWUFBWSxPQUFJO0FBQUEsSUFFcEMsMkJBQVk7QUFBRSxhQUFPO0FBQUEsSUFBTSxFQUFHLEtBQUssU0FBUyxhQUFhLEVBQUU7QUFBQTtBQUFBOzs7QUNm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QUFDO0VBQ0YsR0FBRztBQUVKOztBRWovUEFELEVBQUV4cUIsTUFBTTsiLAogICJuYW1lcyI6IFsibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJnbG9iYWxUaGlzIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIlN5bWJvbCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiZG9jdW1lbnQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiVHlwZUVycm9yIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIiQiLCAibW9kdWxlIiwgIiQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiUmVnRXhwIiwgImtleSIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJyZXF1aXJlIiwgInBvcHVwU3RyaW5ncyIsICJhcnRpY2xlIiwgIndpbmRvdyIsICJ3Z1VMUyIsICJjYXRlZ29yeSIsICJjYXRlZ29yaWVzIiwgImltYWdlIiwgImltYWdlcyIsICJzdHViIiwgImtCIiwgImJ5dGVzIiwgImRheSIsICJkYXlzIiwgImhvdXIiLCAiaG91cnMiLCAibWludXRlIiwgIm1pbnV0ZXMiLCAic2Vjb25kIiwgInNlY29uZHMiLCAid2VlayIsICJ3ZWVrcyIsICJtb250aCIsICJtb250aHMiLCAieWVhciIsICJ5ZWFycyIsICJzZWFyY2giLCAiU2VhcmNoSGludCIsICJ3ZWIiLCAiZ2xvYmFsIiwgImFjdGlvbnMiLCAicG9wdXBzTWVudSIsICJ0b2dnbGVQcmV2aWV3c0hpbnQiLCAicmVzZXQiLCAiZGlzYWJsZSIsICJkaXNhYmxlUG9wdXBzSGludCIsICJwdXJnZVBvcHVwc0hpbnQiLCAiUG9wdXBzSGludCIsICJzcGFjZWJhciIsICJ2aWV3IiwgInZpZXdIaW50IiwgInRhbGsiLCAiZGVsIiwgImRlbGV0ZSIsICJkZWxldGVIaW50IiwgInVuZGVsZXRlU2hvcnQiLCAiVW5kZWxldGVIaW50IiwgInByb3RlY3QiLCAicHJvdGVjdEhpbnQiLCAidW5wcm90ZWN0U2hvcnQiLCAidW5wcm90ZWN0SGludCIsICJtb3ZlIiwgIk1vdmVwYWdlSGludCIsICJlZGl0IiwgImVkaXRIaW50IiwgIm5ldyIsICJuZXdTZWN0aW9uSGludCIsICJudWxsRWRpdEhpbnQiLCAiaGlzdCIsICJoaXN0b3J5IiwgImhpc3RvcnlIaW50IiwgImxhc3QiLCAibGFzdEVkaXQiLCAibGFzdENvbnRyaWIiLCAibGFzdENvbnRyaWJIaW50IiwgImN1ciIsICJkaWZmQ3VyIiwgIm9sZEVkaXQiLCAicHVyZ2UiLCAicHVyZ2VIaW50IiwgInJhdyIsICJyYXdIaW50IiwgInJlbmRlciIsICJyZW5kZXJIaW50IiwgInNpbmNlTWUiLCAic2luY2VNZUhpbnQiLCAiZWRzIiwgImVkaXRvcnMiLCAiZWRpdG9yTGlzdEhpbnQiLCAicmVsYXRlZCIsICJyZWxhdGVkQ2hhbmdlcyIsICJSZWNlbnRjaGFuZ2VzbGlua2VkSGludCIsICJlZGl0T2xkIiwgInJ2IiwgInJldmVydCIsICJyZXZlcnRIaW50IiwgInVuZG8iLCAidW5kb0hpbnQiLCAiZGVmYXVsdHBvcHVwUmVkbGlua1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwRml4RGFic1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwRml4UmVkaXJzU3VtbWFyeSIsICJkZWZhdWx0cG9wdXBFeHRlbmRlZFJldmVydFN1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUmV2ZXJ0U3VtbWFyeSIsICJkZWZhdWx0cG9wdXBRdWVyaWVkUmV2ZXJ0VG9QcmV2aW91c1N1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUXVlcmllZFJldmVydFN1bW1hcnkiLCAiZGVmYXVsdHBvcHVwUm1EYWJMaW5rU3VtbWFyeSIsICJSZWRpcmVjdHMiLCAiZGlzYW1iaWciLCAiZGlzYW1iaWdIaW50IiwgIm1haW5saW5rIiwgIndpa2lMaW5rIiwgIndpa2lMaW5rcyIsICJ3aGF0TGlua3NIZXJlIiwgIldoYXRsaW5rc2hlcmVIaW50IiwgInVud2F0Y2hTaG9ydCIsICJ3YXRjaFRoaW5neSIsICJ3YXRjaEhpbnQiLCAidW53YXRjaEhpbnQiLCAicnNzIiwgInVzZXIiLCAiZW1haWwiLCAiRW1haWx1c2VySGludCIsICJzcGFjZSIsICJQcmVmaXhpbmRleEhpbnQiLCAiY291bnQiLCAia2F0ZWxpbmtIaW50IiwgImNvbnRyaWJzIiwgImNvbnRyaWJ1dGlvbnMiLCAiZGVsZXRlZENvbnRyaWJzIiwgIkNvbnRyaWJ1dGlvbnNIaW50IiwgInRyZWUiLCAiY29udHJpYnNUcmVlSGludCIsICJsb2ciLCAidXNlckxvZ0hpbnQiLCAidW5ibG9ja1Nob3J0IiwgImJsb2NrIiwgIklwYmxvY2tsaXN0SGludCIsICJCbG9ja2lwSGludCIsICJibG9ja0xvZ0hpbnQiLCAicHJvdGVjdExvZ0hpbnQiLCAicGFnZUxvZ0hpbnQiLCAiZGVsZXRlTG9nSGludCIsICJtIiwgImJpbmdTZWFyY2hIaW50IiwgImhpc3RvcnlmZWVkSGludCIsICJUaGFua3NIaW50IiwgIm1hcmtwYXRyb2xsZWRIaW50IiwgImRlZmF1bHRwb3B1cFJldmlld2VkU3VtbWFyeSIsICJyZXZkZWwiLCAiRGVsZXRlZGNvbnRyaWJ1dGlvbnNIaW50IiwgIkJMT0NLRUQiLCAiRW1haWxVc2VySGludCIsICJSQU5HRUJMT0NLRUQiLCAiSElEREVOIiwgIkxPQ0tFRCIsICJkaWZmIiwgImF1dG9lZGl0X3ZlcnNpb24iLCAiUHJlZml4SW5kZXhIaW50IiwgIm51bGxFZGl0U3VtbWFyeSIsICJzZXBhcmF0b3IiLCAiY29tbWEiLCAicG9wdXBzIiwgInBnIiwgImFwaSIsICJyZSIsICJucyIsICJzdHJpbmciLCAid2lraSIsICJtaXNjIiwgIm9wdGlvbiIsICJvcHRpb25EZWZhdWx0IiwgImZsYWciLCAiY2FjaGUiLCAic3RydWN0dXJlcyIsICJ0aW1lciIsICJjb3VudGVyIiwgImN1cnJlbnQiLCAiZm4iLCAiZW5kb2ZsaXN0IiwgIkhUTUxFbGVtZW50IiwgInNldHVwVG9vbHRpcHMiLCAiY29udGFpbmVyIiwgInJlbW92ZSIsICJmb3JjZSIsICJwb3BEYXRhIiwgImNvbmNhdCIsICJnZXRWYWx1ZU9mIiwgImRvY3VtZW50IiwgImVkaXRmb3JtIiwgIndwVGV4dGJveDEiLCAib25tb3VzZXVwIiwgImRvU2VsZWN0aW9uUG9wdXAiLCAiZGVmYXVsdFBvcHVwc0NvbnRhaW5lciIsICJyYW5TZXR1cFRvb2x0aXBzQWxyZWFkeSIsICJhbmNob3JzIiwgInF1ZXJ5U2VsZWN0b3JBbGwiLCAic2V0dXBUb29sdGlwc0xvb3AiLCAicXVlcnlTZWxlY3RvciIsICJzZXR1cFRvb2x0aXBzTG9vcDIiLCAiYmVnaW4iLCAiaG93bWFueSIsICJzbGVlcCIsICJhcmdzIiwgInNpbXBsZVByaW50ZiIsICJmaW5pc2giLCAibG9vcGVuZCIsICJNYXRoIiwgIm1pbiIsICJsZW5ndGgiLCAiaiIsICJkb1Rvb2x0aXAiLCAicmVtb3ZlVG9vbHRpcCIsICJhZGRUb29sdGlwIiwgImEiLCAiaHJlZiIsICJzZXRUaW1lb3V0IiwgInJtVG9jVG9vbHRpcHMiLCAiZmluaXNoZWRMb2FkaW5nIiwgInRvYyIsICJ0b2NMaW5rcyIsICJ0b2NMZW4iLCAiaXNQb3B1cExpbmsiLCAib25tb3VzZW92ZXIiLCAibW91c2VPdmVyV2lraUxpbmsiLCAib25tb3VzZW91dCIsICJtb3VzZU91dFdpa2lMaW5rIiwgIm9ubW91c2Vkb3duIiwgImtpbGxQb3B1cCIsICJoYXNQb3B1cCIsICJvcmlnaW5hbFRpdGxlIiwgInRpdGxlIiwgInJlbW92ZVRpdGxlIiwgInJlc3RvcmVUaXRsZSIsICJyZWdpc3Rlckhvb2tzIiwgIm5wIiwgInBvcHVwTWF4V2lkdGgiLCAic2V0TWF4V2lkdGgiLCAibWFpbkRpdiIsICJzdHlsZSIsICJtYXhXaWR0aCIsICJhZGRIb29rIiwgImFkZFBvcHVwU2hvcnRjdXRzIiwgInJtUG9wdXBTaG9ydGN1dHMiLCAicmVtb3ZlTW9kaWZpZXJLZXlMaXN0ZW5lciIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgIm1vZGlmaWVyS2V5TGlzdGVuZXIiLCAibW91c2VPdmVyV2lraUxpbmszIiwgImV2dCIsICJldmVudCIsICJhY3Rpb24iLCAia2V5IiwgInNlbGYiLCAiZXZ0MiIsICJtb3VzZU92ZXJXaWtpTGluazIiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJmb290bm90ZVRhcmdldCIsICJhVGl0bGUiLCAiVGl0bGUiLCAiZnJvbUFuY2hvciIsICJhbmNoIiwgImFuY2hvciIsICJ0ZXN0IiwgImxUaXRsZSIsICJmcm9tVVJMIiwgImxvY2F0aW9uIiwgInRvU3RyaW5nIiwgImVsIiwgIm5vZGVOYW1lIiwgIm50IiwgInRvTG93ZXJDYXNlIiwgInBhcmVudE5vZGUiLCAiZm9vdG5vdGVQcmV2aWV3IiwgIngiLCAibmF2cG9wIiwgInNldFBvcHVwSFRNTCIsICJpbm5lckhUTUwiLCAiaWROdW1iZXIiLCAibW9kaWZpZXJQcmVzc2VkIiwgIm1vZCIsICJpc0NvcnJlY3RNb2RpZmllciIsICJfYSIsICJsaW5rIiwgIm5hdnBvcHVwIiwgImlzVmlzaWJsZSIsICJwb3B1cFN0cnVjdHVyZSIsICJzZXREZWZhdWx0IiwgIm5ld05hdnBvcHVwIiwgImxpbmtzSGFzaCIsICJsaW5rcyIsICJwdXNoIiwgInBlbmRpbmciLCAic2ltcGxlUG9wdXBDb250ZW50IiwgInNob3dTb29uSWZTdGFibGUiLCAiZGVsYXkiLCAiY2xlYXJJbnRlcnZhbCIsICJjaGVja1BvcHVwUG9zaXRpb24iLCAic2V0SW50ZXJ2YWwiLCAic2ltcGxlTm9Nb3JlIiwgImQiLCAiY3JlYXRlRWxlbWVudCIsICJjbGFzc05hbWUiLCAicyIsICJhcHBlbmQiLCAiZGlzcGxheSIsICJub25zaW1wbGVQb3B1cENvbnRlbnQiLCAicG9wdXBTdHJpbmciLCAiaGFzUG9wdXBNZW51IiwgInNldElubmVySFRNTCIsICJwb3B1cEhUTUwiLCAiZmlsbEVtcHR5U3BhbnMiLCAiZHJhZ0hhbmRsZSIsICJtYWtlRHJhZ2dhYmxlIiwgInBvcHVwUmVkbGlua0hUTUwiLCAiZGVidWdEYXRhIiwgIk5hdnBvcHVwIiwgImZ1enoiLCAicGFyZW50QW5jaG9yIiwgInBhcmVudFBvcHVwIiwgIm93bmVyIiwgInNob3VsZFNob3dOb25TaW1wbGUiLCAic2hvdWxkU2hvdyIsICJkaWZmMiIsICJwYXJhbXMiLCAicGFyc2VQYXJhbXMiLCAib2xkaWQiLCAicmVmZXJlbmNlRWxlbWVudCIsICJsb2FkRGlmZiIsICJsb2FkQVBJUHJldmlldyIsICJiYWNrbGlua3MiLCAibmFtZXNwYWNlSWQiLCAibnNJbWFnZUlkIiwgImFuY2hvckNvbnRhaW5zSW1hZ2UiLCAibG9hZEltYWdlIiwgIm5zQ2F0ZWdvcnlJZCIsICJuc1VzZXJJZCIsICJuc1VzZXJ0YWxrSWQiLCAic3RhcnRBcnRpY2xlUHJldmlldyIsICJwZW5kaW5nTmF2cG9wVGFzayIsICJjb21wbGV0ZWROYXZwb3BUYXNrIiwgInJlZGlyIiwgImxvYWRQcmV2aWV3IiwgIm9yaWdpbmFsQXJ0aWNsZSIsICJsb2FkUHJldmlld0Zyb21SZWRpciIsICJyZWRpck1hdGNoIiwgInRhcmdldCIsICJmcm9tV2lraVRleHQiLCAicmVkaXJUYXJnZXQiLCAid2FyblJlZGlyIiwgInJlZGlyTGluayIsICJpbnNlcnRQcmV2aWV3IiwgImRvd25sb2FkIiwgInJlZGlyZWN0IiwgImV4ZWMiLCAiZGF0YSIsICJ2aXNpYmxlIiwgImluc2VydFByZXZpZXdOb3ciLCAiaWQiLCAid2lraVRleHQiLCAiYXJ0IiwgIm1ha2VGaXhEYWJzIiwgImdldFBhZ2VJbmZvIiwgInNldFBvcHVwVHJhaWxlciIsICJpbWFnZVBhZ2UiLCAiZ2V0VmFsaWRJbWFnZUZyb21XaWtpVGV4dCIsICJpbnNlcnRBcnRpY2xlUHJldmlldyIsICJuc1RlbXBsYXRlSWQiLCAiaCIsICJlbnRpZnkiLCAic3BsaXQiLCAiU3RyaW5nIiwgIl90ZW1wbGF0ZU9iamVjdCIsICJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsIiwgImpvaW4iLCAiX3RlbXBsYXRlT2JqZWN0MiIsICJwIiwgInByZXBQcmV2aWV3bWFrZXIiLCAic2hvd1ByZXZpZXciLCAiYW5jaG9yaXplIiwgImFuY2hvclN0cmluZyIsICJ1cmxCYXNlIiwgImpvaW5QYXRoIiwgImFydGljbGViYXNlIiwgInVybFN0cmluZyIsICJQcmV2aWV3bWFrZXIiLCAiYW5jaFJlIiwgIlJlZ0V4cCIsICJsaXRlcmFsaXplUmVnZXgiLCAicmVwbGFjZSIsICJtYXRjaCIsICJzbGljZSIsICJtYXgiLCAiaW5kZXhPZiIsICJsaW5lcyIsICJpIiwgImtpbGxQb3B1cDIiLCAiYmFuaXNoIiwgImFib3J0QWxsRG93bmxvYWRzIiwgIkRyYWciLCAiY29uc3RydWN0b3IiLCAic3RhcnRDb25kaXRpb24iLCAiZW5kSG9vayIsICJmaXhFIiwgImUiLCAibGF5ZXJYIiwgIm9mZnNldFgiLCAibGF5ZXJZIiwgIm9mZnNldFkiLCAiaW5pdCIsICJvIiwgIm9Sb290IiwgIm9iaiIsICJzdGFydCIsICJkcmFnZ2luZyIsICJwb3B1cHNfZHJhZ2dhYmxlIiwgImhtb2RlIiwgInZtb2RlIiwgInJvb3QiLCAiTnVtYmVyIiwgImlzTmFOIiwgInBhcnNlSW50IiwgImxlZnQiLCAidG9wIiwgIm9udGhpc1N0YXJ0IiwgIm9udGhpc0VuZCIsICJvbnRoaXMiLCAieSIsICJib3R0b20iLCAicmlnaHQiLCAibGFzdE1vdXNlWCIsICJjbGllbnRYIiwgImxhc3RNb3VzZVkiLCAiY2xpZW50WSIsICJvbm1vdXNlbW92ZURlZmF1bHQiLCAib25tb3VzZW1vdmUiLCAiZTIiLCAiZHJhZyIsICJlbmQiLCAiZXkiLCAiZXgiLCAibngiLCAibnkiLCAib3JpZ2luYWwiLCAicG9wdXBMYXlvdXQiLCAicG9wdXBSZWRpclNwYW5zIiwgInBvcHVwVGl0bGUiLCAibmF2bGlua1N0cmluZ1RvSFRNTCIsICJwb3B1cFRvcExpbmtzIiwgIm5hdkxpbmtzSFRNTCIsICJoaW50IiwgInBvcHVwSW1hZ2UiLCAiaW1hZ2VIVE1MIiwgInBvcHVwUmVkaXJUaXRsZSIsICJwb3B1cFJlZGlyVG9wTGlua3MiLCAiY29weVN0cnVjdHVyZSIsICJvbGRTdHJ1Y3R1cmUiLCAibmV3U3RydWN0dXJlIiwgInByb3AiLCAiT2JqZWN0IiwgImhhc093biIsICJub3N0YWxnaWEiLCAic3RyIiwgImVkaXRzdHIiLCAiZWRpdE9sZGlkU3RyIiwgImhpc3RvcnlzdHIiLCAid2F0Y2hzdHIiLCAiZmFuY3kiLCAid2F0Y2giLCAicG9wdXBPdGhlckxpbmtzIiwgImFkbWluIiwgIm5vcm1hbCIsICJwb3B1cFJlZGlyT3RoZXJMaW5rcyIsICJmYW5jeTIiLCAibWVudXMiLCAic2hvcnRlciIsICJkcm9wZGl2IiwgImVuZGRpdiIsICJsYXN0ZWRpdCIsICJ0aGFuayIsICJqc0hpc3RvcnkiLCAibGlua3NoZXJlIiwgIm51bGxQdXJnZSIsICJ2aWV3T3B0aW9ucyIsICJlZGl0Um93IiwgIm1hcmtQYXRyb2xsZWQiLCAibmV3VG9waWMiLCAicHJvdGVjdERlbGV0ZSIsICJtZW51VGl0bGUiLCAic2hvcnRtZW51cyIsICJsaXRlIiwgInN1YnN0aXR1dGUiLCAiY21kQm9keSIsICJmcm9tUmUiLCAiZnJvbSIsICJmbGFncyIsICJ0byIsICJleGVjQ21kcyIsICJjbWRMaXN0IiwgIl9pdGVyYXRvciIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcCIsICJuIiwgImRvbmUiLCAiZWxlbWVudCIsICJ2YWx1ZSIsICJlcnIiLCAiZiIsICJwYXJzZUNtZCIsICJwYXJzZUNtZDIiLCAiY2hhckF0IiwgInBhcnNlU3Vic3RpdHV0ZSIsICJyZW1haW5kZXIiLCAidW5Fc2NhcGUiLCAic2VwIiwgIl90ZW1wbGF0ZU9iamVjdDMiLCAidG1wIiwgInNraXBPdmVyIiwgInNlZ21lbnQiLCAic2tpcFRvRW5kIiwgImVuZFNlZ21lbnQiLCAiZmluZE5leHQiLCAiX3NlcCIsICJjaCIsICJzZXRDaGVja2JveCIsICJwYXJhbSIsICJib3giLCAidmFsIiwgIm13IiwgInV0aWwiLCAiZ2V0UGFyYW1WYWx1ZSIsICJjaGVja2VkIiwgImF1dG9FZGl0IiwgImF1dG9FZGl0NCIsICJzZXR1cFBvcHVwcyIsICJhdXRvQ2xpY2tUb2tlbiIsICJtb2RpZnlXYXRjaGxpc3QiLCAiYWxyZWFkeVJhbiIsICJjbWRTdHJpbmciLCAiZWRpdGJveCIsICJpbnB1dCIsICJvdXRwdXQiLCAid3BNaW5vcmVkaXQiLCAid3BXYXRjaHRoaXMiLCAicnZpZCIsICJ1cmwiLCAiYXBpd2lraWJhc2UiLCAic3RhcnREb3dubG9hZCIsICJhdXRvRWRpdDIiLCAic3VtbWFyeSIsICJzdW1tYXJ5cHJvbXB0IiwgInN1bW1hcnlub3RpY2UiLCAiZ2V0UnZTdW1tYXJ5IiwgInR4dCIsICJyZXNwb25zZSIsICJwcm9tcHQiLCAid3BTdW1tYXJ5IiwgImF1dG9FZGl0MyIsICJzZXNzaW9uSWQiLCAiYnRuIiwgImJ1dHRvbiIsICJtc2ciLCAidHByaW50ZiIsICJiYW5uZXJNZXNzYWdlIiwgImNsaWNrIiwgIm5vdGlmeSIsICJ0YWciLCAidHlwZSIsICJoZWFkaW5ncyIsICJkaXYiLCAiZXNjYXBlUXVvdGVzSFRNTCIsICJpbnNlcnRCZWZvcmUiLCAidGVtcGxhdGUiLCAianNvbiIsICJnZXRKc09iaiIsICJhbnlDaGlsZCIsICJxdWVyeSIsICJwYWdlcyIsICJyZXZpc2lvbnMiLCAidGltZXN0YW1wIiwgInJldmlkIiwgInVzZXJoaWRkZW4iLCAiRG93bmxvYWRlciIsICJYTUxIdHRwUmVxdWVzdCIsICJodHRwIiwgImxhc3RNb2RpZmllZCIsICJjYWxsYmFja0Z1bmN0aW9uIiwgIm9uRmFpbHVyZSIsICJhYm9ydGVkIiwgIm1ldGhvZCIsICJhc3luYyIsICJzZW5kIiwgImFib3J0IiwgImdldERhdGEiLCAicmVzcG9uc2VUZXh0IiwgInNldFRhcmdldCIsICJvcGVuIiwgInNldFJlcXVlc3RIZWFkZXIiLCAidXNlckFnZW50IiwgImdldFJlYWR5U3RhdGUiLCAicmVhZHlTdGF0ZSIsICJkb3dubG9hZHNJblByb2dyZXNzIiwgImdldExhc3RNb2RpZmllZERhdGUiLCAibGFzdG1vZCIsICJnZXRSZXNwb25zZUhlYWRlciIsICJEYXRlIiwgInNldENhbGxiYWNrIiwgIm9ucmVhZHlzdGF0ZWNoYW5nZSIsICJnZXRTdGF0dXMiLCAic3RhdHVzIiwgIm5ld0Rvd25sb2FkIiwgIm5ld0Rvd25sb2FkMiIsICJjYWxsYmFjayIsICJvbmZhaWx1cmUiLCAiZmFrZURvd25sb2FkIiwgIkluc3RhIiwgInNldHVwTGl2ZVByZXZpZXciLCAiX2IiLCAiY29uZiIsICJiYXNlVXJsIiwgImxhbmciLCAiaW50ZXJ3aWtpIiwgImRlZmF1bHRfdGh1bWJfd2lkdGgiLCAicGF0aHMiLCAiYXJ0aWNsZXMiLCAiYXJ0aWNsZVBhdGgiLCAibWF0aCIsICJpbWFnZXNfZmFsbGJhY2siLCAibG9jYWxlIiwgImNvbmZpZyIsICJnZXQiLCAibmFtZSIsICJzaWduYXR1cmUiLCAiQkxPQ0tfSU1BR0UiLCAiZHVtcCIsICJjb252ZXJ0IiwgImxsIiwgInIiLCAicmVtYWluIiwgInNoIiwgInNoaWZ0IiwgInBzIiwgImYyIiwgImYzIiwgIm8yIiwgImMiLCAicDIiLCAiaHRtbF9lbnRpdGllcyIsICJodG1sZXNjYXBlX3RleHQiLCAiaHRtbGVzY2FwZV9hdHRyIiwgInN0cl9pbWF0Y2giLCAiYiIsICJsIiwgImNvbXBhcmVMaW5lU3RyaW5nT3JSZWciLCAiY29tcGFyZUxpbmVTdHJpbmciLCAiY2hhckF0UG9pbnQiLCAiZW5kbCIsICJwYXJzZV9saXN0IiwgInByZXYiLCAibF9tYXRjaCIsICJpcG9zIiwgInByZXZQb3MiLCAicGkiLCAibWF0Y2hQb3MiLCAibGkiLCAiYXQiLCAicGFyc2VfaW5saW5lX25vd2lraSIsICJkdF9tYXRjaCIsICJ1bnNoaWZ0IiwgInBhcnNlX3RhYmxlIiwgInBhcnNlX3RhYmxlX2RhdGEiLCAidGRfbGluZSIsICJtYXRjaF9pIiwgInRkX21hdGNoIiwgInBvcCIsICJ0YyIsICJ0ZCIsICJwYXJzZV9wcmUiLCAicGFyc2VfYmxvY2tfaW1hZ2UiLCAicGFyc2VfaW1hZ2UiLCAic3Vic3RyaW5nIiwgIndpZHRoIiwgImF0dHIiLCAiZmlsZW5hbWUiLCAiY2FwdGlvbiIsICJ0aHVtYiIsICJmcmFtZSIsICJjZW50ZXIiLCAiYWxpZ24iLCAibmVzdGluZyIsICJsYXN0X2F0dHIiLCAid19tYXRjaCIsICJsYXN0ZW5kIiwgInN1YnN0YXJ0IiwgIm5lc3RsZXYiLCAiY2xvc2UiLCAic3VibG9vcCIsICJodG1sIiwgInBhcnNlX2lubGluZV93aWtpIiwgInBhcnNlX2lubGluZV9pbWFnZXMiLCAibG9vcCIsICJ3aWtpMiIsICJwYXJzZV9pbmxpbmVfZm9ybWF0dGluZyIsICJlbSIsICJzdCIsICJkYXRlIiwgImdldFVUQ01pbnV0ZXMiLCAiZ2V0VVRDSG91cnMiLCAiZ2V0VVRDRGF0ZSIsICJnZXRVVENNb250aCIsICJnZXRVVENGdWxsWWVhciIsICJfJDAiLCAiJDEiLCAiJDIiLCAiJDMiLCAiJDQiLCAid2lraTJodG1sIiwgImJhc2V1cmwiLCAicG9wdXBGaWx0ZXJQYWdlU2l6ZSIsICJmb3JtYXRCeXRlcyIsICJwb3B1cEZpbHRlckNvdW50TGlua3MiLCAibnVtIiwgImNvdW50TGlua3MiLCAicG9wdXBGaWx0ZXJDb3VudEltYWdlcyIsICJjb3VudEltYWdlcyIsICJwb3B1cEZpbHRlckNvdW50Q2F0ZWdvcmllcyIsICJjb3VudENhdGVnb3JpZXMiLCAicG9wdXBGaWx0ZXJMYXN0TW9kaWZpZWQiLCAiX2RhdGEiLCAibm93IiwgImFnZSIsICJmb3JtYXRBZ2UiLCAiYWEiLCAic2VjbGVuIiwgIm1pbmxlbiIsICJob3VybGVuIiwgImRheWxlbiIsICJ3ZWVrbGVuIiwgIm51bXdlZWtzIiwgInN3ZWVrcyIsICJhZGR1bml0IiwgIm51bWRheXMiLCAic2RheXMiLCAibnVtaG91cnMiLCAic2hvdXJzIiwgIm51bW1pbnMiLCAic21pbnMiLCAibnVtc2VjcyIsICJzc2VjcyIsICJydW5Qb3B1cEZpbHRlcnMiLCAibGlzdCIsICJyZXQiLCAiX2l0ZXJhdG9yMiIsICJfc3RlcDIiLCAicG9wdXBGaWx0ZXJzIiwgImV4dHJhUG9wdXBGaWx0ZXJzIiwgInBhZ2VJbmZvQXJyYXkiLCAicGFnZUluZm8iLCAidXBjYXNlRmlyc3QiLCAiaW1hZ2VCcmFja2V0Q291bnQiLCAiY2F0ZWdvcnlCcmFja2V0Q291bnQiLCAicG9wdXBGaWx0ZXJTdHViRGV0ZWN0IiwgIl9kb3dubG9hZCIsICJjb3VudHMiLCAic3R1YkNvdW50IiwgInJlYWwiLCAic2VjdCIsICJwb3B1cEZpbHRlckRpc2FtYmlnRGV0ZWN0IiwgIm5hbWVzcGFjZSIsICJpc0Rpc2FtYmlnIiwgInJvdW5kIiwgIlN0cmluZ3dyYXBwZXIiLCAiU3RyaW5nd3JhcHBlcjIiLCAic2V0VXRmIiwgIm9taXRBbmNob3IiLCAibGVuIiwgImRlY29kZVVSSUNvbXBvbmVudCIsICJ1cmxBbmNob3IiLCAiYW5jaG9yRnJvbVV0ZiIsICJlbmNvZGVVUklDb21wb25lbnQiLCAic3BsaXR0ZWQiLCAidSIsICJkZWNvZGVOYXN0aWVzIiwgInN0cmlwTmFtZXNwYWNlIiwgInNwZWNpYWxkaWZmIiwgIm5zU3BlY2lhbElkIiwgIm1haW4iLCAiZnJvbUJvdEludGVyZmFjZSIsICJleHRyYWN0ZWQiLCAiaXNTYWZhcmkiLCAidW5lc2NhcGUiLCAiZGVjb2RlVVJJIiwgImRlY29kZUVzY2FwZXMiLCAibXlEZWNvZGVVUkkiLCAiaGludFZhbHVlIiwgInNhZmVEZWNvZGVVUkkiLCAidG9Vc2VyTmFtZSIsICJ3aXRoTnMiLCAidXNlck5hbWUiLCAidCIsICJ0b1RhbGtQYWdlIiwgImxvY2FsaXplZE5hbWVzcGFjZSIsICJ0YWxrUGFnZSIsICJpc1RhbGtQYWdlIiwgInRvQXJ0aWNsZUZyb21UYWxrUGFnZSIsICJhcnRpY2xlRnJvbVRhbGtQYWdlIiwgImFydGljbGVGcm9tVGFsa09yQXJ0aWNsZSIsICJpc0lwVXNlciIsICJpcFVzZXIiLCAibnNNYWluc3BhY2VJZCIsICJzZXRVcmwiLCAidXJsZnJhZyIsICJ2IiwgImtlZXBTcGFjZXMiLCAiZW5jb2RlVVJJIiwgInJlbW92ZUFuY2hvciIsICJ0b1VybCIsICJ0aXRsZWJhc2UiLCAic3BlY2lhbERpZmYiLCAiaW5jbHVkZXMiLCAiX2l0ZXJhdG9yMyIsICJfc3RlcDMiLCAieiIsICJoZWxwZXIiLCAiZGVjb2RlRXh0cmFzIiwgInNlY3RTdHViIiwgInJlYWxTdHViIiwgImlzVmFsaWRJbWFnZU5hbWUiLCAiaXNJblN0cmlwcGFibGVOYW1lc3BhY2UiLCAiaXNJbk1haW5OYW1lc3BhY2UiLCAia2lkcyIsICJjaGlsZE5vZGVzIiwgIl9pdGVyYXRvcjQiLCAiX3N0ZXA0IiwgImtpZCIsICJtYXJrTm9wb3B1cFNwYW5MaW5rcyIsICJpbk5vcG9wdXBTcGFuIiwgImdldEF0dHJpYnV0ZSIsICJiYXNlbmFtZXMiLCAidXJsTm9Qb3B1cCIsICJtYXJrTm9wb3B1cFNwYW5MaW5rczIiLCAiZml4VmVjdG9yTWVudVBvcHVwcyIsICIkYm9keSIsICIkIiwgImZpbmQiLCAidG9BcnJheSIsICJfaXRlcmF0b3I1IiwgIl9zdGVwNSIsICJhcyIsICJfaXRlcmF0b3I2IiwgIl9zdGVwNiIsICJnZXRQYWdlV2l0aENhY2hpbmciLCAib25Db21wbGV0ZSIsICJmaW5kSW5QYWdlQ2FjaGUiLCAiZ2V0UGFnZSIsICJhZGREb3dubG9hZCIsICJhZGRQYWdlVG9DYWNoZSIsICJwYWdlIiwgImpzb25fcmV0IiwgIkpTT04iLCAicGFyc2UiLCAid2FybmluZ3MiLCAidyIsICJlcnJvciIsICJlcnJsb2ciLCAiY29kZSIsICJpbmZvIiwgInRvVXBwZXJDYXNlIiwgImZpbmRJbkFycmF5IiwgImFyciIsICJmb28iLCAibmV4dE9uZSIsICJhcnJheSIsICJlc2NhcGVSZWdFeHAiLCAicHJvdG90eXBlIiwgInJlbW92ZU51bGxzIiwgImZpbHRlciIsICJzdWJzIiwgImNtZCIsICJpc1N0cmluZyIsICJpc051bWJlciIsICJpc1JlZ0V4cCIsICJpc0FycmF5IiwgIkFycmF5IiwgImlzT2JqZWN0IiwgImlzRnVuY3Rpb24iLCAiRnVuY3Rpb24iLCAicmVwZWF0U3RyaW5nIiwgIm11bHQiLCAiemVyb0ZpbGwiLCAibWFwIiwgIm1hcF9hcnJheSIsICJtYXBfb2JqZWN0IiwgIl9pdGVyYXRvcjciLCAiX3N0ZXA3IiwgInRleHQiLCAidW5lc2NhcGVRdW90ZXNIVE1MIiwgInJldGFyZ2V0RGFiIiwgIm5ld1RhcmdldCIsICJvbGRUYXJnZXQiLCAiZnJpZW5kbHlDdXJyZW50QXJ0aWNsZU5hbWUiLCAidGl0bGVUb0VkaXQiLCAiY2hhbmdlTGlua1RhcmdldExpbmsiLCAiY2xpY2tCdXR0b24iLCAibWlub3IiLCAibGlzdExpbmtzIiwgIndpa2l0ZXh0IiwgInJlZyIsICJvbWl0UmVnZXgiLCAid2lrUG9zIiwgInJtRHVwZXNGcm9tU29ydGVkTGlzdCIsICJzb3J0IiwgIndpa1RhcmdldCIsICJtZXRoIiwgIl9pdGVyYXRvcjgiLCAiX3N0ZXA4IiwgIm1ha2VGaXhEYWIiLCAic2V0UG9wdXBIVE1MMiIsICJlbGVtZW50SWQiLCAicG9wdXBJZCIsICJvblN1Y2Nlc3MiLCAicG9wdXBFbGVtZW50IiwgInJjaWQiLCAic3RydWN0dXJlIiwgInNwYW5zIiwgImZsYXR0ZW4iLCAibGF5b3V0IiwgIm51bXNwYW5zIiwgInJlZGlycyIsICJyZWRpclNwYW5zIiwgImZvdW5kIiwgInN0cnVjdHVyZWZuIiwgInNldGZuIiwgInNldFBvcHVwVGlwc0FuZEhUTUwiLCAiZmxhdHRlbjIiLCAicG9wdXBIVE1MMiIsICJtYWtlRW1wdHlTcGFucyIsICJtYWtlRW1wdHlTcGFuczIiLCAiX2l0ZXJhdG9yOSIsICJfc3RlcDkiLCAiZW1wdHlTcGFuSFRNTCIsICJub2RlVHlwZSIsICJlbXB0eVNwYW5IVE1MMiIsICJjbGFzc25hbWUiLCAiY2xhc3NBbGlhc2VzIiwgInBvcHVwU2Vjb25kUHJldmlldyIsICJfYXJ0aWNsZSIsICJwb3BUaXBzU29vbkZuIiwgIndoZW4iLCAicG9wVGlwcyIsICJkaXZuYW1lIiwgImlkbnVtYmVyIiwgImZ1enp5Q3Vyc29yT2ZmTWVudXMiLCAiX3giLCAiX3kiLCAiX2Z1enoiLCAicGFyZW50IiwgInVscyIsICJfaXRlcmF0b3IxMCIsICJfc3RlcDEwIiwgInVsIiwgIm9mZnNldFdpZHRoIiwgImxpbWl0SG9yaXpvbnRhbFBvc2l0aW9uIiwgIm1vdXNlT3V0V2lraUxpbmsyIiwgInRyYWNrZXIiLCAicG9zQ2hlY2tlckhvb2siLCAiZGlydHkiLCAibW91c2VPdmVyTmF2cG9wIiwgImlzV2l0aGluIiwgIm1vdXNlTGVhdmluZ1RpbWUiLCAicnVuU3RvcFBvcHVwVGltZXIiLCAic3RvcFBvcHVwVGltZXIiLCAib3JpZ2luYWxEYXRhIiwgIm1heENoYXJhY3RlcnMiLCAibWF4U2VudGVuY2VzIiwgInNldERhdGEiLCAibWF4U2l6ZSIsICJraWxsQ29tbWVudHMiLCAia2lsbERpdnMiLCAia2lsbEdhbGxlcmllcyIsICJraWxsIiwgIm9wZW5pbmciLCAiY2xvc2luZyIsICJzdWJvcGVuaW5nIiwgInN1YmNsb3NpbmciLCAicmVwbCIsICJvbGRrIiwgImsiLCAia2lsbFN0dWZmIiwgIm9wIiwgIm1ha2VSZWdleHAiLCAiY2wiLCAic2IiLCAic2MiLCAib3BSZXN1bHQiLCAiaW5kZXgiLCAiZGVwdGgiLCAicmVtb3ZhbCIsICJwcmVmaXgiLCAic3VmZml4IiwgInJlU3RyIiwgInNwIiwgImtpbGxCb3hUZW1wbGF0ZXMiLCAia2lsbFRlbXBsYXRlcyIsICJraWxsVGFibGVzIiwgImtpbGxJbWFnZXMiLCAiZm9yYmlkZGVuTmFtZXNwYWNlQWxpYXNlcyIsICJfaSIsICJfT2JqZWN0JGVudHJpZXMiLCAiZW50cmllcyIsICJsb2NhbGl6ZWROYW1lc3BhY2VMYyIsICJraWxsSFRNTCIsICJraWxsQ2h1bmtzIiwgIml0YWxpY0NodW5rUmVnZXgiLCAibW9wdXAiLCAiZmlyc3RCaXQiLCAic3R1ZmYiLCAibm90U2VudGVuY2VFbmRzIiwgImZpeFNlbnRlbmNlRW5kcyIsICJmdWxsTGVuZ3RoIiwgImRkIiwgImZpcnN0U2VudGVuY2VzIiwgInN0cnMiLCAia2lsbEJhZFdoaXRlc3BhY2UiLCAibWFrZVByZXZpZXciLCAia2lsbE11bHRpbGluZVRlbXBsYXRlcyIsICJmaXhIVE1MIiwgInN0cmlwTG9uZ1RlbXBsYXRlcyIsICJlc1dpa2kySHRtbFBhcnQiLCAicmVMaW5rcyIsICJsYXN0SW5kZXgiLCAicmVzdWx0IiwgInBvc3RmaXhJbmRleCIsICJfbWF0Y2gkIiwgImVkaXRTdW1tYXJ5UHJldmlldyIsICJyZUFlcyIsICJzZWN0aW9uIiwgInBvc3RmaXgiLCAic2VjdGlvbkxpbmsiLCAibW9yZSIsICJtb3JlTGluayIsICJvbmNsaWNrIiwgInF1ZXJ5VHlwZSIsICJodG1sR2VuZXJhdG9yIiwgInVzZXJuYW1lYXJ0IiwgIkFQSWhpc3RvcnlQcmV2aWV3SFRNTCIsICJBUEljYXRlZ29yeVByZXZpZXdIVE1MIiwgInVzZXJuYW1lIiwgIkFQSXVzZXJJbmZvUHJldmlld0hUTUwiLCAiQVBJY29udHJpYnNQcmV2aWV3SFRNTCIsICJ0cmFpbCIsICJBUElpbWFnZXBhZ2VQcmV2aWV3SFRNTCIsICJBUEliYWNrbGlua3NQcmV2aWV3SFRNTCIsICJBUElyZXZpc2lvblByZXZpZXdIVE1MIiwgImZldGNoVXNlckdyb3VwTmFtZXMiLCAidGhlbiIsICJzaG93QVBJUHJldmlldyIsICJnbyIsICJsaW5rTGlzdCIsICJidWYiLCAiX2l0ZXJhdG9yMTEiLCAiX3N0ZXAxMSIsICJnZXRUaW1lT2Zmc2V0IiwgInR6IiwgIm9wdGlvbnMiLCAiZ2V0VGltZVpvbmUiLCAidGltZVpvbmUiLCAidHpDb21wb25lbnRzIiwgInVzZVRpbWVPZmZzZXQiLCAiSW50bCIsICJEYXRlVGltZUZvcm1hdCIsICJmb3JtYXRUb1BhcnRzIiwgImdldExvY2FsZXMiLCAibG9jYWxlcyIsICJ1c2VyTGFuZ3VhZ2UiLCAiZ2V0TVdEYXRlRm9ybWF0IiwgInN1cHBvcnRlZExvY2FsZXNPZiIsICJuYXZpZ2F0b3IiLCAibGFuZ3VhZ2UiLCAiZWRpdFByZXZpZXdUYWJsZSIsICJyZWFsbHlDb250cmlicyIsICJjdXJhcnQiLCAibWFrZUZpcnN0Q29sdW1uTGlua3MiLCAiY3VycmVudFJldmlzaW9uIiwgImZpcnN0UmV2aWQiLCAiX2l0ZXJhdG9yMTIiLCAiX3N0ZXAxMiIsICJlZGl0RGF0ZSIsICJ0aGlzRGF5IiwgImZvcm1hdHRlZERhdGUiLCAidGhpc1RpbWUiLCAiZm9ybWF0dGVkVGltZSIsICJjb2wzdXJsIiwgImNvbDN0eHQiLCAiY29tbWVudCIsICJjb250ZW50IiwgImNvbW1lbnRoaWRkZW4iLCAiYWRqdXN0RGF0ZSIsICJvZmZzZXQiLCAiY29udmVydFRpbWVab25lIiwgInRvTG9jYWxlU3RyaW5nIiwgImZvcm1hdHRlZERhdGVUaW1lIiwgImQyIiwgImdldEZ1bGxZZWFyIiwgImdldE1vbnRoIiwgImdldERhdGUiLCAiZ2V0SG91cnMiLCAiZ2V0TWludXRlcyIsICJnZXRTZWNvbmRzIiwgInRvTG9jYWxlRGF0ZVN0cmluZyIsICJnZXRVVENTZWNvbmRzIiwgInRvTG9jYWxlVGltZVN0cmluZyIsICJ1c2VyaW5mb1Jlc3BvbnNlIiwgInF1ZXJ5T2JqIiwgInVzZXJzIiwgIm1lc3NhZ2VzIiwgImdyb3VwcyIsICJfaXRlcmF0b3IxMyIsICJfc3RlcDEzIiwgImdyb3VwTmFtZSIsICJnbG9iYWx1c2VyaW5mbyIsICJfaXRlcmF0b3IxNCIsICJfc3RlcDE0IiwgImdldE13QXBpIiwgImxvYWRNZXNzYWdlc0lmTWlzc2luZyIsICJqc09iaiIsICJtaXNzaW5nIiwgImNvbnRlbnRtb2RlbCIsICJfaXRlcmF0b3IxNSIsICJfc3RlcDE1IiwgImNvbnRpbnVlIiwgImJsY29udGludWUiLCAiQVBJc2hhcmVkSW1hZ2VQYWdlUHJldmlld0hUTUwiLCAicG9wdXBpZCIsICJyZXF1ZXN0aWQiLCAiYWx0IiwgImltYWdlcmVwb3NpdG9yeSIsICJlbmNhcnQiLCAic2hhcmVkX3VybCIsICJhcGljb21tb25zYmFzZSIsICJjb21tb25zYmFzZSIsICJsb2FkZXIiLCAibG9hZCIsICJBUElpbWFnZWxpbmtzUHJldmlld0hUTUwiLCAianNvYmoiLCAiaW1hZ2V1c2FnZSIsICJfaXRlcmF0b3IxNiIsICJfc3RlcDE2IiwgImNhdGVnb3J5bWVtYmVycyIsICJfaXRlcmF0b3IxNyIsICJfc3RlcDE3IiwgImNtY29udGludWUiLCAicXVlcnlvYmoiLCAiaW52YWxpZCIsICJibG9ja2VkYnkiLCAiYmxvY2twYXJ0aWFsIiwgImxvY2tlZFN1bEFjY291bnRJc0F0dGFjaGVkVG9UaGlzIiwgInVuYXR0YWNoZWQiLCAiZ2VuZGVyIiwgIl9pdGVyYXRvcjE4IiwgIl9zdGVwMTgiLCAibWVzc2FnZSIsICJfaXRlcmF0b3IxOSIsICJfc3RlcDE5IiwgInJlZ2lzdHJhdGlvbiIsICJfdXNlciRlZGl0Y291bnQiLCAiZWRpdGNvdW50IiwgInVzZXJjb250cmlicyIsICJibG9ja3MiLCAicmJzdHIiLCAicmFuZ2VzdGFydCIsICJyYW5nZWVuZCIsICJyZXN0cmljdGlvbnMiLCAic3BsaWNlIiwgIl9uYXZwb3AiLCAiZWRpdHMiLCAic2V0dXBEZWJ1Z2dpbmciLCAicG9wdXBEZWJ1ZyIsICJjb25zb2xlIiwgInBvcHVwc0luc2VydEltYWdlIiwgImltYWdlaW5mbyIsICJpbWFnZXBhZ2UiLCAidGh1bWJ1cmwiLCAic3JjIiwgIm1pbWUiLCAiZGVzY3JpcHRpb251cmwiLCAidG9nZ2xlU2l6ZSIsICJ0b2dnbGVTaXplMiIsICJpbWciLCAiZmlyc3RDaGlsZCIsICJtYXRjaGVkIiwgInJlbW92ZU1hdGNoZXNVbmxlc3MiLCAicmUxIiwgInBhcmVuY291bnQiLCAicmUyIiwgInNldE5hbWVzcGFjZXMiLCAic2V0UmVkaXJzIiwgIlIiLCAicmVkaXJMaXN0cyIsICJhciIsICJiZSIsICJiZyIsICJicyIsICJibiIsICJjcyIsICJjeSIsICJkZSIsICJlbyIsICJlcyIsICJldCIsICJnYSIsICJnbCIsICJoZSIsICJodSIsICJpcyIsICJpdCIsICJqYSIsICJtayIsICJuZHMiLCAibmwiLCAibm4iLCAicGwiLCAicHQiLCAicnUiLCAic2siLCAic3IiLCAidHQiLCAidWsiLCAidmkiLCAieWkiLCAiemgiLCAicmVkaXJMaXN0IiwgInNldEludGVyd2lraSIsICJ3aWtpbWVkaWEiLCAibnNSZSIsICJpbWFnZU5hbWVzcGFjZVZhcmlhbnRzIiwgIl9pMiIsICJfT2JqZWN0JGVudHJpZXMyIiwgIl9sb2NhbGl6ZWROYW1lc3BhY2VMYyIsICJfbmFtZXNwYWNlSWQiLCAibnNSZUltYWdlIiwgImdldEVkaXRib3hTZWxlY3Rpb24iLCAic2VsZWN0aW9uIiwgImNyZWF0ZVJhbmdlIiwgInNlbFN0YXJ0IiwgInNlbGVjdGlvblN0YXJ0IiwgInNlbEVuZCIsICJzZWxlY3Rpb25FbmQiLCAic2VsIiwgInBpcGUiLCAiZG9TZXBhcmF0ZVNlbGVjdGlvblBvcHVwIiwgIk1vdXNldHJhY2tlciIsICJsb29wRGVsYXkiLCAiYWN0aXZlIiwgImhvb2tzIiwgInJ1bkhvb2tzIiwgInJlbW92ZU9iaiIsICJyZW1vdmVIb29rcyIsICJuZXdIb29rcyIsICJ0cmFjayIsICJwYWdlWCIsICJwYWdlWSIsICJkb2NFbHQiLCAiZG9jdW1lbnRFbGVtZW50IiwgInNjcm9sbExlZnQiLCAic2Nyb2xsVG9wIiwgInNldFBvc2l0aW9uIiwgImxhc3RIb29rX3giLCAibGFzdEhvb2tfeSIsICJlbmFibGUiLCAic2F2ZWRMaXN0ZW5lciIsICJ1aWQiLCAibm9zaG93IiwgImNyZWF0ZSIsICJ1bmhpZGUiLCAiaGlkZSIsICJob29rSWRzIiwgImRvd25sb2FkcyIsICJjb25zdHJhaW5lZCIsICJoZWlnaHQiLCAiY3JlYXRlTWFpbkRpdiIsICJyZXBvc2l0aW9uIiwgIm5vTGltaXRIb3IiLCAidG9vV2lkZSIsICJ1cGRhdGVEaW1lbnNpb25zIiwgImNXaWR0aCIsICJjbGllbnRXaWR0aCIsICJuYXR1cmFsV2lkdGgiLCAibmV3TGVmdCIsICJyYWlzZSIsICJ6SW5kZXgiLCAiaGlnaGVzdCIsICJzaG93IiwgInRpbWUiLCAic3RhYmxlX3giLCAic3RhYmxlX3kiLCAic3RhYmxlU2hvdyIsICJuZXdfeCIsICJuZXdfeSIsICJkeCIsICJkeSIsICJmdXp6MiIsICJzaG93U29vblN0YWJsZVRpbWVyIiwgImtleUhvb2tzIiwgIlJlZmxlY3QiLCAiYXBwbHkiLCAiaG9vayIsICJob29rSWQiLCAiX3RoaXMkY2xhc3NOYW1lIiwgIm9uY2xpY2tMaXN0ZW5lciIsICJwb3NpdGlvbiIsICJtaW5XaWR0aCIsICJoYW5kbGVOYW1lIiwgInNoaWZ0S2V5IiwgImFib3J0RG93bmxvYWRzIiwgIm9mZnNldEhlaWdodCIsICJfaXRlcmF0b3IyMCIsICJfc3RlcDIwIiwgImRlbEZtdCIsICJpbnNGbXQiLCAiY291bnRDcm9zc2luZ3MiLCAiZWplY3QiLCAicm93IiwgIl9pdGVyYXRvcjIxIiwgIl9zdGVwMjEiLCAic2hvcnRlbkRpZmZTdHJpbmciLCAic2hvcnRlbkRpZmZTdHJpbmcyIiwgImNvbnRleHQiLCAiZGlmZlN0cmluZyIsICJvU3BsaXR0ZWQiLCAiblNwbGl0dGVkIiwgIm91dCIsICJhY2MiLCAibWF4T3V0cHV0UGFpciIsICJwYWlyZWQiLCAianNSZXNlcnZlZFByb3BlcnRpZXMiLCAiZGlmZkJ1Z0FsZXJ0IiwgImRpZmZCdWdBbGVydDIiLCAid29yZCIsICJtYWtlRGlmZkhhc2h0YWJsZSIsICJvcyIsICJzZXRTaXRlSW5mbyIsICJwb3B1cExvY2FsRGVidWciLCAiaG9zdG5hbWUiLCAid2lraWEiLCAiaXNMb2NhbCIsICJzdGFydHNXaXRoIiwgImNvbW1vbnMiLCAicG9ydCIsICJzaXRlYmFzZSIsICJzZXRVc2VySW5mbyIsICJ1c3VzZXJzIiwgInVzcHJvcCIsICJjYW5SZXZpZXciLCAicmlnaHRzIiwgImZldGNoU3BlY2lhbFBhZ2VOYW1lcyIsICJmb3JtYXQiLCAiZm9ybWF0dmVyc2lvbiIsICJtYXhhZ2UiLCAibWV0YSIsICJzaXByb3AiLCAidXNlbGFuZyIsICJzcGVjaWFscGFnZWFsaWFzZXMiLCAic2V0VGl0bGVCYXNlIiwgInByb3RvY29sIiwgImJvdEludGVyZmFjZVBhdGgiLCAiQVBJUGF0aCIsICJ0aXRsZXRhaWwiLCAid2lraWJhc2UiLCAic2V0TWFpblJlZ2V4IiwgInJlU3RhcnQiLCAicHJlVGl0bGVzIiwgInJlRW5kIiwgImJ1aWxkU3BlY2lhbFBhZ2VHcm91cCIsICJzcGVjaWFsUGFnZU9iaiIsICJ2YXJpYW50cyIsICJyZWFsbmFtZSIsICJfaXRlcmF0b3IyMiIsICJhbGlhc2VzIiwgIl9zdGVwMjIiLCAiYWxpYXMiLCAic2V0UmVnZXhwcyIsICJfaXRlcmF0b3IyMyIsICJfc3RlcDIzIiwgInNwZWNpYWxwYWdlIiwgImltIiwgIl90ZW1wbGF0ZU9iamVjdDQiLCAiX3RlbXBsYXRlT2JqZWN0NSIsICJzZXR1cENhY2hlIiwgInNldE1pc2MiLCAiY2xpZW50IiwgImluaXRNd0FwaSIsICJzZXR1cFBvcHVwczIiLCAiY29tcGxldGVkIiwgInNldE9wdGlvbnMiLCAiZGVmYXVsdE5hdmxpbmtTcGVjIiwgIl9oaW50IiwgImV4cGFuZENvbmRpdGlvbmFsTmF2bGlua1N0cmluZyIsICJleHBhbmRDb25kaXRpb25hbE5hdmxpbmtTdHJpbmcyIiwgInJlY3Vyc2lvbkNvdW50IiwgImNvbmRpdGlvbmFsU3BsaXRSZWdleCIsICJudW1QYXJlbnMiLCAidGVzdFN0cmluZyIsICJ0cnVlU3RyaW5nIiwgImZhbHNlU3RyaW5nIiwgInRlc3RSZXN1bHQiLCAibmF2bGlua1N0cmluZ1RvQXJyYXkiLCAiX2l0ZXJhdG9yMjQiLCAiX3N0ZXAyNCIsICJuYXZsaW5rVGFnIiwgInNzIiwgInNzcyIsICJuYXZsaW5rU3Vic3RpdHV0ZUhUTUwiLCAibmF2bGlua0RlcHRoIiwgIm1hZ2ljIiwgIm1lbnVkZXB0aCIsICJtZW51cm93ZGVwdGgiLCAiX2l0ZXJhdG9yMjUiLCAiX3N0ZXAyNSIsICJnZXROZXdXaW4iLCAiZ2V0UHJpbnRGdW5jdGlvbiIsICJ0YWdUeXBlIiwgInByaW50IiwgInNob3J0Y3V0IiwgImFkZFBvcHVwU2hvcnRjdXQiLCAicG9wdXBMaW5rc05ld1dpbmRvdyIsICJuZXdXaW4iLCAibm9Qb3B1cCIsICJzcGVjaWFsTGluayIsICJtYWdpY1dhdGNoTGluayIsICJ0aXRsZWRXaWtpTGluayIsICJfcGckY3VycmVudCRsaW5rJG9yaWciLCAiYXJpbkxpbmsiLCAiZWRpdENvdW50ZXJMaW5rIiwgImVkaXRvckxpc3RMaW5rIiwgInRpdGxlZERpZmZMaW5rIiwgIm1hZ2ljSGlzdG9yeUxpbmsiLCAic2ltcGxlUG9wdXBzIiwgInBvcHVwTWVudUxpbmsiLCAicG9wdXBIYW5kbGVLZXlwcmVzcyIsICJwb3B1cEhhbmRsZUtleXByZXNzMiIsICJfZXZ0JGtleUNvZGUiLCAia2V5Q29kZSIsICJ3aGljaCIsICJsZXR0ZXIiLCAiZnJvbUNvZGVQb2ludCIsICJzdGFydExpbmsiLCAibGFzdFBvcHVwTGlua1NlbGVjdGVkIiwgInByZXZlbnREZWZhdWx0IiwgImZvY3VzIiwgIm9sZFBvcHVwT25rZXlwcmVzcyIsICJvbmtleXByZXNzIiwgImFkZExpbmtQcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJkaWZmRGF0YSIsICJvbGRSZXYiLCAibmV3UmV2IiwgImZyb210aXRsZSIsICJ0b3JlbGF0aXZlIiwgImZyb21yZXYiLCAidG9yZXYiLCAiY29tcGFyZSIsICJmcm9tcmV2aWQiLCAidG9yZXZpZCIsICJhZGRSZXZpZXdMaW5rIiwgImRvbmVEaWZmIiwgInJldmlkcyIsICJzdGFibGVfcmV2aWQiLCAiZmxhZ2dlZCIsICJwYXJhbXMyIiwgInBvc3RXaXRoVG9rZW4iLCAiZmFpbCIsICJfaXRlcmF0b3IyNiIsICJfc3RlcDI2IiwgIl9pMyIsICJfcmV2aXNpb25zIiwgInJldmlzaW9uIiwgImluc2VydERpZmYiLCAicm1Cb3JpbmdMaW5lcyIsICJhYWEiLCAiYmIiLCAiYmJiIiwgInN0cmlwT3V0ZXJDb21tb25MaW5lcyIsICJvbGRsaW5lcyIsICJuZXdsaW5lcyIsICJpbm5lciIsICJ0cnVuY2F0ZWQiLCAicG9wdXBEaWZmTWF4TGluZXMiLCAicG9wdXBEaWZmQ29udGV4dExpbmVzIiwgImxpbmVEaWZmIiwgImxpbmVzMiIsICJvbGRsaW5lczIiLCAibmV3bGluZXMyIiwgImRpZmZEYXRlc1RhYmxlIiwgImRpZmZEYXRlc1RhYmxlUm93IiwgImxhYmVsIiwgImxhc3RNb2RpZmllZERhdGUiLCAicmV2bGluayIsICJnZW5lcmFsTGluayIsICJhY3Rpb25OYW1lIiwgInNhdmVkT2xkaWQiLCAib2xkaWREYXRhIiwgInJldmlzaW9uU3RyaW5nIiwgInJldmVydFN1bW1hcnkiLCAiYmFzZSIsICJjc3NDbGFzcyIsICJkZWZhdWx0TmF2bGlua0NsYXNzbmFtZSIsICJnZW5lcmFsTmF2TGluayIsICJnZXRMYXN0Q29udHJpYiIsICJ3aWtpcGFnZSIsICJnZXRIaXN0b3J5SW5mbyIsICJwcm9jZXNzTGFzdENvbnRyaWJJbmZvIiwgImZpcnN0TmV3RWRpdG9yIiwgImVkaXRvciIsICJuZXdVcmwiLCAiZGlzcGxheVVybCIsICJnZXREaWZmU2luY2VNeUVkaXQiLCAicHJvY2Vzc0RpZmZTaW5jZU15RWRpdCIsICJmcmllbmRseU5hbWUiLCAibXlMYXN0RWRpdCIsICJwdXJnZVBvcHVwcyIsICJwcm9jZXNzQWxsUG9wdXBzIiwgIm51bGxpZnkiLCAiZGlzYWJsZVBvcHVwcyIsICJ0b2dnbGVQcmV2aWV3cyIsICJtYWdpY1dhdGNoTGluazIiLCAiX3RlbXBsYXRlT2JqZWN0NiIsICJfcmVmIiwgIl9hc3luY1RvR2VuZXJhdG9yIiwgInJlcURhdGEiLCAidGl0bGVzIiwgInVud2F0Y2giLCAibXdUaXRsZSIsICJuZXdGcm9tVGV4dCIsICJtZXNzYWdlTmFtZSIsICJnZXROYW1lc3BhY2VJZCIsICJwYXJzZURvbSIsICJfeDIiLCAiX3gzIiwgImFyZ3VtZW50cyIsICJqc1VybCIsICJvbkNsaWNrIiwgIl90ZW1wbGF0ZU9iamVjdDciLCAiX3RlbXBsYXRlT2JqZWN0OCIsICJhcHBlbmRQYXJhbXNUb0xpbmsiLCAibGlua3N0ciIsICJjQSIsICJjaHMiLCAiY3VycmVudEFydGljbGVSZWdleEJpdCIsICJfdGVtcGxhdGVPYmplY3Q5IiwgIl90ZW1wbGF0ZU9iamVjdDEwIiwgIl90ZW1wbGF0ZU9iamVjdDExIiwgIl90ZW1wbGF0ZU9iamVjdDEyIiwgImxrIiwgImFsc29DaGFuZ2VMYWJlbCIsICJzYW5lTGlua0NoZWNrIiwgInVOIiwgInRvb2xEYk5hbWUiLCAiY29va2llU3R5bGUiLCAidG9vbCIsICJkZWZhdWx0VG9vbFVybCIsICJ0aGVXaWtpIiwgIndoYXROZXh0IiwgImdldEhpc3RvcnkiLCAicHJvY2Vzc0hpc3RvcnkiLCAiX2l0ZXJhdG9yMjciLCAiX3N0ZXAyNyIsICJmaW5pc2hQcm9jZXNzSGlzdG9yeSIsICJoaXN0SW5mbyIsICJwcmV2aWQiLCAiZGVmYXVsdGl6ZSIsICJuZXdPcHRpb24iLCAiZGVmIiwgInZhck5hbWUiLCAidXNlcklzU3lzb3AiLCAiZyIsICJob3VyMTIiLCAiX3RlbXBsYXRlT2JqZWN0MTMiLCAiZWRpdENvdW50ZXJMaW5rSGludCIsICJhcmluIiwgIm9uIiwgIm9uY2UiLCAiZHluYW1pY0NvbnRlbnRIYW5kbGVyIiwgIiRjb250ZW50IiwgInJlZ2lzdGVySG9va3NGb3JWaXNpYmxlTmF2cG9wcyIsICJkb0l0IiwgImVhY2giLCAiX2luZGV4IiwgImFkZCIsICIkb3ZlcmxheSJdCn0K