MediaWiki:Gadget-Twinkle.js

MediaWiki系统消息页面
/**
 * SPDX-License-Identifier: CC-BY-SA-4.0
 * _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
 *
 * @base {@link https://git.qiuwen.net.cn/Mirror/xiplus-twinkle}
 * @source {@link https://github.com/TopRealm/YsArchives-Gadgets/tree/master/src/Twinkle}
 * @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 $ = 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();
    $({ 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;
      }
    });
  }
});

// dist/Twinkle/Twinkle.js
require_es_array_push();
var _templateObject;
function _taggedTemplateLiteral(e, t) {
  return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } }));
}
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;
}
//! src/Twinkle/modules/twinkle.js
/*! Twinkle.js - twinkle.js */
(function twinkle($, _window) {
  const $body = $("body");
  const Twinkle2 = {};
  (_window = window).Twinkle || (_window.Twinkle = Twinkle2);
  if (!Morebits.userIsInGroup("autoconfirmed") && !Morebits.userIsInGroup("confirmed")) {
    console.warn("[Twinkle]非确认用户或自动确认用户,Twinkle不会运行。");
    return;
  }
  Twinkle2.changeTags = "Twinkle";
  Twinkle2.summaryAd = "([[H:TW|Twinkle]])";
  Twinkle2.hatnoteRegex = "(?:Short[ _]description)|(?:Rellink|Hatnote|HAT)|(?:Main|[细細][节節]|Main[ _]articles|主[条條]目|Hurricane[ _]main|[条條]目|主|[頁页]面|主[頁页]面|主[頁页]|主[題题]目|Main[ _]article|AP)|(?:Wrongtitle|Correct[ _]title)|(?:主条目消歧义|主條目消歧義|消歧义链接|消歧義鏈接|消歧義連結|消连|消連|消歧义连结|DisambLink|Noteref|Dablink)|(?:Distinguish|不是|Not|提示|混淆|分別|分别|區別|区别|本条目的主题不是|本條目的主題不是|本条目主题不是|本條目主題不是|条目主题不是|條目主題不是|主题不是|主題不是|Confused|区分|區分|Confusion|Confuse|RedirectNOT|Misspelling)|(?:Distinguish2|SelfDistinguish|Not2|不是2)|(?:For)|(?:Details|Further|See|另见|另見|More|相關條目|相关条目|Detail|见|見|更多资料|更多資料|Further[ _]information|更多资讯|更多資訊|More[ _]information|更多信息)|(?:Selfref)|(?:About|Otheruses4|关于|關於)|(?:Other[ _]uses|Otheruse|条目消歧义|條目消歧義|他用|Otheruses)|(?:Other[ _]uses list|Otheruselist|主條目消歧義列表|主条目消歧义列表|Otheruseslist|Aboutlist|About[ _]list|Otheruses[ _]list)|(?:Redirect|重定向至此|Redirects[ _]here|Redirect[ _]to)|(?:Redirect2|主條目消歧義2|主条目消歧义2|Redir|重定向至此2)|(?:Redirect3)|(?:Redirect4)|(?:Redirect-distinguish)|(?:Redirect-synonym)|(?:Redirect-multi)|(?:See[ _]Wiktionary|Seewikt)|(?:Seealso|参看|參看|See[ _]also|参见|參見|Also)|(?:See[ _]also2|Seealso2|不轉換參見|不转换参见)|(?:Other[ _]places)|(?:Contrast|對比|对比)";
  Twinkle2.initCallbacks = [];
  Twinkle2.addInitCallback = (func, name) => {
    Twinkle2.initCallbacks.push({
      func,
      name
    });
  };
  Twinkle2.defaultConfig = {};
  Twinkle2.defaultConfig = {
    // General
    userTalkPageMode: "tab",
    dialogLargeFont: false,
    disabledModules: Morebits.userIsSysop ? [] : ["block"],
    // default to disable block for non-sysop, if enable manually, they can only use it to tag userpage
    disabledSysopModules: [],
    // ARV
    spiWatchReport: "yes",
    // Block
    defaultToBlock64: false,
    defaultToPartialBlocks: false,
    blankTalkpageOnIndefBlock: false,
    watchBlockNotices: "yes",
    customBlockReasonList: [],
    // Fluff (revert and rollback)
    openTalkPage: [],
    openTalkPageOnAutoRevert: false,
    rollbackInPlace: false,
    markRevertedPagesAsMinor: ["vand"],
    watchRevertedPages: ["norm", "vand", "torev"],
    watchRevertedExpiry: "yes",
    offerReasonOnNormalRevert: true,
    confirmOnFluff: false,
    showRollbackLinks: ["diff", "others"],
    customRevertSummary: [],
    // DI (twinkleimage)
    notifyUserOnDeli: true,
    deliWatchPage: "default",
    deliWatchUser: "default",
    // Protect
    watchRequestedPages: "yes",
    watchPPTaggedPages: "default",
    watchProtectedPages: "default",
    // CSD
    speedySelectionStyle: "buttonClick",
    watchSpeedyPages: ["g1", "g3", "g4", "g7", "g8"],
    watchSpeedyExpiry: "yes",
    markSpeedyPagesAsPatrolled: false,
    watchSpeedyUser: "1 month",
    // these next two should probably be identical by default
    notifyUserOnSpeedyDeletionNomination: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "r1", "r2", "f1", "f2", "f3", "f4", "f5", "o1", "o2", "o3"],
    warnUserOnSpeedyDelete: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "r1", "r2", "f1", "f2", "f3", "f4", "f5", "o1", "o2", "o3"],
    promptForSpeedyDeletionSummary: [],
    openUserTalkPageOnSpeedyDelete: [],
    deleteTalkPageOnDelete: true,
    deleteRedirectsOnDelete: true,
    deleteSysopDefaultToDelete: false,
    speedyWindowHeight: 500,
    speedyWindowWidth: 800,
    logSpeedyNominations: true,
    speedyLogPageName: "CSD日志",
    noLogOnSpeedyNomination: ["o1"],
    enlargeG7Input: false,
    // Unlink
    unlinkNamespaces: ["0", "6", "10", "302"],
    // Warn
    defaultWarningGroup: "1",
    combinedSingletMenus: false,
    watchWarnings: "yes",
    oldSelect: false,
    customWarningList: [],
    autoMenuAfterRollback: false,
    // XfD
    logXfdNominations: true,
    xfdLogPageName: "XfD日志",
    noLogOnXfdNomination: [],
    xfdWatchDiscussion: "default",
    xfdWatchPage: "default",
    xfdWatchUser: "default",
    markXfdPagesAsPatrolled: true,
    FwdCsdToXfd: Morebits.userIsSysop,
    afdDefaultCategory: "delete",
    afdFameDefaultReason: "没有足够的可靠来源证明此条目符合[[LIB:收录标准|收录标准]]",
    afdSubstubDefaultReason: "过期小小作品",
    XfdClose: Morebits.userIsSysop ? "all" : "hide",
    // Copyvio
    copyvioWatchPage: "yes",
    copyvioWatchUser: "yes",
    markCopyvioPagesAsPatrolled: true,
    // Hidden preferences
    autolevelStaleDays: 3,
    revertMaxRevisions: 50,
    // intentionally limited
    batchMax: 5e3,
    batchChunks: 50,
    configPage: "Help:Twinkle/参数设置",
    projectNamespaceName: mw.config.get("wgFormattedNamespaces")[4],
    sandboxPage: "LIB:沙盒",
    // Deprecated options, as a fallback for add-on scripts/modules
    summaryAd: "([[H:TW|Twinkle]])",
    deletionSummaryAd: "([[H:TW|Twinkle]])",
    protectionSummaryAd: "([[H:TW|Twinkle]])",
    blockSummaryAd: "([[H:TW|Twinkle]])",
    // Tag
    groupByDefault: true,
    watchTaggedPages: "yes",
    watchMergeDiscussions: "yes",
    markTaggedPagesAsMinor: false,
    markTaggedPagesAsPatrolled: true,
    tagArticleSortOrder: "cat",
    customTagList: [],
    customFileTagList: [],
    customRedirectTagList: [],
    // Stub
    watchStubbedPages: false,
    markStubbedPagesAsMinor: false,
    markStubbedPagesAsPatrolled: true,
    stubArticleSortOrder: "cat",
    customStubList: [],
    // Talkback
    markTalkbackAsMinor: true,
    insertTalkbackSignature: true,
    // always sign talkback templates
    talkbackHeading: window.wgULS("回复通告", "回覆通告"),
    mailHeading: window.wgULS("您有新邮件!", "您有新郵件!")
  };
  switch (mw.config.get("skin")) {
    case "vector":
    case "vector-2022":
      Twinkle2.defaultConfig.portletArea = "right-navigation";
      Twinkle2.defaultConfig.portletId = "p-twinkle";
      Twinkle2.defaultConfig.portletName = "TW";
      Twinkle2.defaultConfig.portletType = "menu";
      Twinkle2.defaultConfig.portletNext = "p-search";
      break;
    case "gongbi":
      Twinkle2.defaultConfig.portletArea = $body.find("#page-tools .sidebar-inner").length > 0 ? "#page-tools .sidebar-inner" : "#page-more .sidebar-inner";
      Twinkle2.defaultConfig.portletId = "p-twinkle";
      Twinkle2.defaultConfig.portletName = "Twinkle";
      Twinkle2.defaultConfig.portletType = null;
      Twinkle2.defaultConfig.portletNext = $body.find("#page-tools .sidebar-inner").length > 0 ? "page-more" : null;
      break;
    case "citizen":
      Twinkle2.defaultConfig.portletArea = "#page-actions-more__card";
      Twinkle2.defaultConfig.portletId = "p-twinkle";
      Twinkle2.defaultConfig.portletName = "Twinkle";
      Twinkle2.defaultConfig.portletType = "nav";
      Twinkle2.defaultConfig.portletNext = "p-tb";
      break;
    default:
      Twinkle2.defaultConfig.portletArea = null;
      Twinkle2.defaultConfig.portletId = "p-cactions";
      Twinkle2.defaultConfig.portletName = null;
      Twinkle2.defaultConfig.portletType = null;
      Twinkle2.defaultConfig.portletNext = null;
  }
  Twinkle2.getPref = (name) => {
    if (typeof Twinkle2.prefs === "object" && Twinkle2.prefs[name] !== void 0) {
      return Twinkle2.prefs[name];
    }
    if (typeof window.TwinkleConfig === "object" && window.TwinkleConfig[name] !== void 0) {
      return window.TwinkleConfig[name];
    }
    return Twinkle2.defaultConfig[name];
  };
  Twinkle2.addPortlet = (navigation, id, text, type, nextnodeid) => {
    const root = document.querySelector(/^(?:#|\.)/.test(navigation) ? navigation : "#".concat(navigation));
    if (!root) {
      return null;
    }
    const item = document.querySelector("#".concat(id));
    if (item) {
      if (item.parentNode && item.parentNode === root) {
        return item;
      }
      return null;
    }
    let nextnode;
    if (nextnodeid) {
      nextnode = document.querySelector("#".concat(nextnodeid));
    }
    const skin = mw.config.get("skin");
    if (skin !== "vector" && skin !== "vector-2022" || navigation !== "left-navigation" && navigation !== "right-navigation") {
      type = null;
    }
    let outerNavClass;
    let innerDivClass;
    switch (skin) {
      case "vector":
      case "vector-2022":
        if (navigation !== "portal" && navigation !== "left-navigation" && navigation !== "right-navigation") {
          navigation = "mw-panel";
        }
        outerNavClass = "mw-portlet vector-menu";
        if (navigation === "mw-panel") {
          outerNavClass += " vector-menu-portal";
        } else if (type === "menu") {
          outerNavClass += " vector-menu-dropdown vector-dropdown vector-menu-dropdown-noicon";
        } else {
          outerNavClass += " vector-menu-tabs";
        }
        innerDivClass = "vector-menu-content vector-dropdown-content";
        break;
      case "gongbi":
        outerNavClass = "mw-portlet";
        innerDivClass = "mw-portlet-body";
        break;
      case "citizen":
        outerNavClass = "mw-portlet";
        innerDivClass = "mw-portlet-twinkle";
        break;
      default:
        navigation = "column-one";
        outerNavClass = "portlet";
        break;
    }
    let outerNav;
    let heading;
    if (skin === "vector-2022") {
      outerNav = document.createElement("div");
      heading = document.createElement("label");
    } else {
      outerNav = document.createElement("nav");
      heading = document.createElement("h3");
    }
    outerNav.setAttribute("aria-labelledby", "".concat(id, "-label"));
    outerNav.className = "".concat(outerNavClass, " emptyPortlet");
    outerNav.id = id;
    if (nextnode && nextnode.parentNode === root) {
      root.insertBefore(outerNav, nextnode);
    } else {
      root.appendChild(outerNav);
    }
    heading.id = "".concat(id, "-label");
    const ul = document.createElement("ul");
    if (skin === "vector" || skin === "vector-2022") {
      heading.setAttribute("for", "".concat(id, "-dropdown-checkbox"));
      ul.className = "vector-menu-content-list";
      heading.className = "vector-menu-heading vector-dropdown-label";
      if (outerNavClass.includes("vector-menu-dropdown")) {
        const chkbox = document.createElement("input");
        chkbox.id = "".concat(id, "-dropdown-checkbox");
        chkbox.className = "vector-menu-checkbox vector-dropdown-checkbox";
        chkbox.setAttribute("type", "checkbox");
        chkbox.setAttribute("aria-labelledby", "".concat(id, "-label"));
        outerNav.appendChild(chkbox);
        const span = document.createElement("span");
        span.appendChild(document.createTextNode(text));
        heading.appendChild(span);
        const a = document.createElement("a");
        a.href = "#";
        $(a).on("click", (e) => {
          e.preventDefault();
        });
        heading.appendChild(a);
      }
    } else {
      heading.appendChild(document.createTextNode(text));
    }
    outerNav.appendChild(heading);
    if (innerDivClass) {
      const innerDiv = document.createElement("div");
      innerDiv.className = innerDivClass;
      innerDiv.appendChild(ul);
      outerNav.appendChild(innerDiv);
    } else {
      outerNav.appendChild(ul);
    }
    return outerNav;
  };
  Twinkle2.addPortletLink = (task, text, id, tooltip) => {
    if (Twinkle2.getPref("portletArea") !== null) {
      Twinkle2.addPortlet(Twinkle2.getPref("portletArea"), Twinkle2.getPref("portletId"), Twinkle2.getPref("portletName"), Twinkle2.getPref("portletType"), Twinkle2.getPref("portletNext"));
    }
    const link = mw.util.addPortletLink(Twinkle2.getPref("portletId"), typeof task === "string" ? task : "#", text, id, tooltip);
    $body.find(".client-js .skin-vector #p-cactions").css("margin-right", "initial");
    if (typeof task === "function") {
      $(link).find("a").on("click", (ev) => {
        task();
        ev.preventDefault();
      });
    }
    if ($.collapsibleTabs) {
      $.collapsibleTabs.handleResize();
    }
    return link;
  };
  const scripturl = mw.util.getUrl("User:".concat(mw.config.get("wgUserName"), "/twinkleoptions.js"), {
    action: "raw",
    ctype: "text/javascript",
    happy: "yes"
  });
  Twinkle2.prefs || (Twinkle2.prefs = {});
  mw.loader.getScript(scripturl).fail(() => {
    mw.notify(window.wgULS("未能加载您的Twinkle参数设置", "未能載入您的Twinkle偏好設定"), {
      type: "error",
      tag: "twinkle"
    });
  }).always(() => {
    $(Twinkle2.load);
  });
  Twinkle2.load = () => {
    let activeSpecialPageList = ["Block", "Contributions", "AbuseLog", "Recentchanges", "Recentchangeslinked"];
    if (Morebits.userIsSysop) {
      activeSpecialPageList = [...activeSpecialPageList, "DeletedContributions", "Prefixindex", "BrokenRedirects"];
    }
    if (mw.config.get("wgNamespaceNumber") === -1 && !activeSpecialPageList.includes(mw.config.get("wgCanonicalSpecialPageName"))) {
      return;
    }
    if (window.top !== window.self) {
      return;
    }
    Twinkle2.userAgent = "Twinkle/1.1";
    Morebits.wiki.api.setApiUserAgent(Twinkle2.userAgent);
    Twinkle2.disabledModules = [...Twinkle2.getPref("disabledModules"), ...Twinkle2.getPref("disabledSysopModules")];
    Twinkle2.addInitCallback = (func, name) => {
      if (!name || !Twinkle2.disabledModules.includes(name)) {
        func();
      }
    };
    var _iterator = _createForOfIteratorHelper(Twinkle2.initCallbacks), _step;
    try {
      for (_iterator.s(); !(_step = _iterator.n()).done; ) {
        const module2 = _step.value;
        Twinkle2.addInitCallback(module2.func, module2.name);
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }
    if (Twinkle2.getPref("dialogLargeFont")) {
      mw.util.addCSS(".morebits-dialog-content,.morebits-dialog-footerlinks{font-size:100%!important}.morebits-dialog input,.morebits-dialog select,.morebits-dialog-content button{font-size:inherit !important}");
    }
    const isVector = ["vector", "vector-2022"].includes(mw.config.get("skin"));
    if (isVector && Twinkle2.getPref("portletType") === "menu" && $body.find("#p-twinkle").length === 0) {
      $body.find("#p-cactions").css("margin-right", "initial");
    }
  };
  Twinkle2.sortByNamespace = (first, second) => {
    return first.ns - second.ns || (first.title > second.title ? 1 : -1);
  };
  Twinkle2.generateBatchPageLinks = (checkbox) => {
    const $checkbox = $(checkbox);
    const link = Morebits.htmlNode("a", $checkbox.val());
    link.setAttribute("class", "tw-batchpage-link");
    link.setAttribute("href", mw.util.getUrl($checkbox.val()));
    link.setAttribute("target", "_blank");
    link.setAttribute("rel", "noopener noreferrer");
    $checkbox.next().prepend([link, " "]);
  };
})(jQuery);
//! src/Twinkle/modules/twinklearv.js
/*! Twinkle.js - twinklearv.js */
(function twinklearv($) {
  const $body = $("body");
  Twinkle.arv = () => {
    const username = mw.config.get("wgRelevantUserName");
    if (!username) {
      return;
    }
    const isIP = mw.util.isIPAddress(username);
    const title = isIP ? window.wgULS("报告IP给管理员", "報告IP給管理員") : window.wgULS("报告用户给管理人员", "報告使用者給管理人員");
    Twinkle.addPortletLink(() => {
      Twinkle.arv.callback(username, isIP);
    }, window.wgULS("告状", "告狀"), "tw-arv", title);
  };
  Twinkle.arv.callback = (uid, isIP) => {
    if (uid === mw.config.get("wgUserName")) {
      mw.notify(window.wgULS("你不想报告你自己,对吧?", "你不想報告你自己,對吧?"), {
        type: "warn",
        tag: "twinklearv"
      });
      return;
    }
    const Window = new Morebits.simpleWindow(600, 500);
    Window.setTitle(window.wgULS("报告用户给管理人员", "報告使用者給管理人員"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("告状设置", "告狀設定"), "H:TW/PREF#arv");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW#告狀");
    const form = new Morebits.quickForm(Twinkle.arv.callback.evaluate);
    const categories = form.append({
      type: "select",
      name: "category",
      label: window.wgULS("选择报告类型:", "選擇報告類別:"),
      event: Twinkle.arv.callback.changeCategory
    });
    categories.append({
      type: "option",
      label: window.wgULS("破坏(LIB:VIP)", "破壞(LIB:VIP)"),
      value: "aiv"
    });
    categories.append({
      type: "option",
      label: window.wgULS("编辑争议(LIB:EWIP)", "編輯爭議(LIB:EWIP)"),
      value: "ewip"
    });
    categories.append({
      type: "option",
      label: window.wgULS("用户名(LIB:UAA)", "使用者名稱(LIB:UAA)"),
      value: "username",
      disabled: mw.util.isIPAddress(uid)
    });
    categories.append({
      type: "option",
      label: window.wgULS("傀儡调查(LIB:SPI)", "傀儡調查(LIB:SPI)"),
      value: "spi",
      disabled: mw.util.isIPAddress(uid)
    });
    form.append({
      type: "div",
      label: "",
      style: "color: #f00",
      id: "twinkle-arv-blockwarning"
    });
    form.append({
      type: "field",
      label: "Work area",
      name: "work_area"
    });
    form.append({
      type: "submit",
      label: "提交"
    });
    form.append({
      type: "hidden",
      name: "uid",
      value: uid
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    const query = {
      action: "query",
      list: "blocks",
      bkprop: "range|flags",
      format: "json"
    };
    if (isIP) {
      query.bkip = uid;
    } else {
      query.bkusers = uid;
    }
    new Morebits.wiki.api(window.wgULS("检查用户的封禁状态", "檢查使用者的封鎖狀態"), query, (apiobj) => {
      const blocklist = apiobj.getResponse().query.blocks;
      if (blocklist.length) {
        const [block] = blocklist;
        let message = (isIP ? window.wgULS("此IP地址", "此IP位址") : window.wgULS("此账号", "此賬號")) + window.wgULS("已经被", "已經被") + (block.partial ? "部分" : "");
        message += block.rangestart === (block.rangeend ? "段" : "") + window.wgULS("封禁。", "封鎖。");
        if (block.partial) {
          $body.find("#twinkle-arv-blockwarning").css("color", "black");
        }
        $body.find("#twinkle-arv-blockwarning").text(message);
      }
    }).post();
    const evt = document.createEvent("Event");
    evt.initEvent("change", true, true);
    result.category.dispatchEvent(evt);
  };
  Twinkle.arv.lta_list = [{
    value: "",
    label: window.wgULS("请选择", "請選擇")
  }];
  Twinkle.arv.callback.sockmaster_changed = (e) => {
    Twinkle.arv.callback.set_sockmaster(e.target.value);
  };
  Twinkle.arv.callback.set_sockmaster = (sockmaster) => {
    $body.find("code.tw-arv-sockmaster").text("{{".concat("subst:", "Socksuspectnotice|1=".concat(sockmaster, "}}")));
  };
  Twinkle.arv.callback.changeCategory = (e) => {
    const value_ = e.target.value;
    const root_ = e.target.form;
    const [old_area] = Morebits.quickForm.getElements(root_, "work_area");
    let work_area = null;
    const previewlink = document.createElement("a");
    previewlink.style.cursor = "pointer";
    previewlink.textContent = window.wgULS("预览", "預覽");
    $(previewlink).on("click", () => {
      Twinkle.arv.callback.preview(root_);
    });
    switch (value_) {
      case "ewip":
        work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("报告编辑争议", "報告編輯爭議"),
          name: "work_area"
        });
        work_area.append({
          type: "dyninput",
          name: "page",
          label: window.wgULS("相关页面:", "相關頁面:"),
          sublabel: window.wgULS("页面:", "頁面:"),
          tooltip: window.wgULS("如不希望让报告链接到页面,请留空", "如不希望讓報告連結到頁面,請留空"),
          min: 1,
          max: 10
        });
        work_area.append({
          type: "textarea",
          name: "reason",
          label: window.wgULS("评论:", "評論:")
        });
        work_area.append({
          type: "div",
          id: "arvpreview",
          label: [previewlink]
        });
        work_area.append({
          type: "div",
          id: "twinklearv-previewbox",
          style: "display: none"
        });
        work_area = work_area.render();
        old_area.parentNode.replaceChild(work_area, old_area);
        break;
      case "username":
        work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("报告不当用户名", "報告不當使用者名稱"),
          name: "work_area"
        });
        work_area.append({
          type: "header",
          label: window.wgULS("不当用户名类型", "不當使用者名稱類別"),
          tooltip: window.wgULS("有兽档案馆不允许使用带有误导性、宣传性、侮辱性或破坏性的用户名。此外,使用域名及邮箱地址的用户名亦被禁止。这些准则俱应应用至用户名及签名。在其他语言中不当的用户名或通过错拼、替代、暗示、拆字或任何间接方法达成的非妥当用户名同样视为违规。", "有獸檔案館不允許使用帶有誤導性、宣傳性、侮辱性或破壞性的使用者名稱。此外,使用域名及電子信箱位址的使用者名稱亦被禁止。這些準則俱應應用至使用者名稱及簽名。在其他語言中不當的使用者名稱或通過錯拼、替代、暗示、拆字或任何間接方法達成的非妥當使用者名稱同樣視為違規。")
        });
        work_area.append({
          type: "checkbox",
          name: "arvtype",
          list: [{
            label: window.wgULS("误导性用户名", "誤導性使用者名稱"),
            value: window.wgULS("误导性", "誤導性"),
            tooltip: window.wgULS("误导性用户名隐含着与贡献者相关或误导他人的事情。例如︰不实观点、暗示账号拥有特定权限或暗示该账号并非由一人拥有而是由一个组群、一个项目或一个集体运作。", "誤導性使用者名稱隱含著與貢獻者相關或誤導他人的事情。例如︰不實觀點、暗示賬號擁有特定權限或暗示該賬號並非由一人擁有而是由一個群組、一個計畫或一個集體運作。")
          }, {
            label: window.wgULS("宣传性用户名", "宣傳性使用者名稱"),
            value: window.wgULS("宣传性", "宣傳性"),
            tooltip: window.wgULS("宣传性用户名会于有兽档案馆上起推销一个组群或一间公司的作用。", "宣傳性使用者名稱會於有獸檔案館上起推銷一個群組或一間公司的作用。")
          }, {
            label: window.wgULS("暗示并非由一人拥有", "暗示並非由一人擁有"),
            value: "shared",
            tooltip: window.wgULS("每个账号只可以代表个人(容许一些例外情况),所有与他人分享账号的行为(包括分享账号密码)均被禁止。", "每個賬號只可以代表個人(容許一些例外情況),所有與他人分享賬號的行為(包括分享賬號密碼)均被禁止。")
          }, {
            label: window.wgULS("侮辱性用户名", "侮辱性使用者名稱"),
            value: "侮辱性",
            tooltip: window.wgULS("侮辱性用户名令协调编辑变得困难,甚至无可能。", "侮辱性使用者名稱令協調編輯變得困難,甚至無可能。")
          }, {
            label: window.wgULS("破坏性用户名", "破壞性使用者名稱"),
            value: window.wgULS("破坏性", "破壞性"),
            tooltip: window.wgULS("破坏性用户名包括人身攻击、伪冒他人或其他一切有着清晰可见的破坏有兽档案馆意图的用户名。", "破壞性使用者名稱包括人身攻擊、偽冒他人或其他一切有著清晰可見的破壞有獸檔案館意圖的使用者名稱。")
          }]
        });
        work_area.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("在页面上隐藏用户名(需监督的用户名请勿于站内报告,勾选此项并不构成能在站内报告的理由)", "在頁面上隱藏使用者名稱(需監督的使用者名稱請勿於站內報告,勾選此項並不構成能在站內報告的理由)"),
            tooltip: window.wgULS("若用户名不当请勾选此项,注意:请考虑私下联系管理员处理。", "若使用者名稱不當請勾選此項,注意:請考慮私下聯絡管理員處理。"),
            name: "hidename",
            value: "hidename"
          }],
          style: "font-weight: bold;"
        });
        work_area.append({
          type: "textarea",
          name: "reason",
          label: window.wgULS("评论:", "評論:")
        });
        work_area.append({
          type: "div",
          id: "arvpreview",
          label: [previewlink]
        });
        work_area.append({
          type: "div",
          id: "twinklearv-previewbox",
          style: "display: none"
        });
        work_area = work_area.render();
        old_area.parentNode.replaceChild(work_area, old_area);
        break;
      case "spi":
        work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("发起傀儡调查", "發起傀儡調查"),
          name: "work_area"
        });
        work_area.append({
          type: "input",
          name: "sockmaster",
          tooltip: window.wgULS("主账号的用户名(不含User:前缀)", "主賬號的使用者名稱(不含User:字首)"),
          value: root_.uid.value,
          event: Twinkle.arv.callback.sockmaster_changed
        });
        work_area.append({
          type: "div",
          id: "twinklearv-spinoticebox",
          style: "display: none"
        });
        work_area.append({
          type: "dyninput",
          name: "sockpuppet",
          label: "傀儡",
          sublabel: "傀儡:",
          tooltip: window.wgULS("傀儡的用户名(不含User:前缀)", "傀儡的使用者名稱(不含User:字首)"),
          min: 2,
          max: 9
        });
        work_area.append({
          type: "textarea",
          label: window.wgULS("证据:", "證據:"),
          name: "reason",
          tooltip: window.wgULS("输入能够用来体现这些用户可能滥用多重账号的证据,这通常包括茶馆发言、页面历史或其他有关的信息。请避免在此处提供非与傀儡或滥用多重账号相关的其他讨论。", "輸入能夠用來體現這些使用者可能濫用多重賬號的證據,這通常包括茶館發言、頁面歷史或其他有關的資訊。請避免在此處提供非與傀儡或濫用多重賬號相關的其他討論。")
        });
        work_area.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("请求用户查核", "請求使用者查核"),
            name: "checkuser",
            tooltip: window.wgULS("用户查核是一种用于获取傀儡指控相关技术证据的工具,若没有正当理由则不会使用,您必须在证据字段充分解释为什么需要使用该工具。用户查核不会用于公开连接用户账号使用的IP地址。", "使用者查核是一種用於獲取傀儡指控相關技術證據的工具,若沒有正當理由則不會使用,您必須在證據欄位充分解釋為什麼需要使用該工具。使用者查核不會用於公開連接使用者賬號使用的IP位址。")
          }]
        });
        work_area.append({
          type: "div",
          id: "arvpreview",
          label: [previewlink]
        });
        work_area.append({
          type: "div",
          id: "twinklearv-previewbox",
          style: "display: none"
        });
        work_area.append({
          type: "div",
          label: [window.wgULS("请使用常识决定是否以", "請使用常識決定是否以"), $("<code>").addClass("tw-arv-sockmaster").css("margin", "2px;")[0], window.wgULS("通知用户。这不是必须的,对于涉及新用户的报告而言,通知他们能让报告显得更公平,但是许多情况下(如长期破坏者)通知更可能适得其反。", "通知使用者。這不是必須的,對於涉及新使用者的報告而言,通知他們能讓報告顯得更公平,但是許多情況下(如長期破壞者)通知更可能適得其反。")]
        });
        work_area = work_area.render();
        $("input:text[name=sockpuppet]", work_area).first().val(root_.uid.value);
        old_area.parentNode.replaceChild(work_area, old_area);
        root_.spinoticepreviewer = new Morebits.wiki.preview($(work_area).find("#twinklearv-spinoticebox").last()[0]);
        Twinkle.arv.callback.set_sockmaster(root_.uid.value);
        break;
      default:
        work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("报告用户破坏", "報告使用者破壞"),
          name: "work_area"
        });
        work_area.append({
          type: "div",
          label: window.wgULS("提报傀儡应优先发送至傀儡调查,除非相关的账号有高频率、涉及多个页面等紧急严重的破坏行为。", "提報傀儡應優先發送至傀儡調查,除非相關的賬號有高頻率、涉及多個頁面等緊急嚴重的破壞行為。")
        });
        work_area.append({
          type: "input",
          name: "page",
          label: window.wgULS("相关页面:", "相關頁面:"),
          tooltip: window.wgULS("如不希望让报告链接到页面,请留空", "如不希望讓報告連結到頁面,請留空"),
          value: mw.util.getParamValue("vanarticle") || "",
          event: (event) => {
            const {
              value
            } = event.target;
            const root = event.target.form;
            if (value === "") {
              root.badid.disabled = true;
              root.goodid.disabled = true;
            } else {
              root.badid.disabled = false;
              root.goodid.disabled = root.badid.value === "";
            }
          }
        });
        work_area.append({
          type: "input",
          name: "badid",
          label: window.wgULS("受到破坏的修订版本:", "受到破壞的修訂版本:"),
          tooltip: window.wgULS("留空以略过差异", "留空以略過差異"),
          value: mw.util.getParamValue("vanarticlerevid") || "",
          disabled: !mw.util.getParamValue("vanarticle"),
          event: (event) => {
            const {
              value
            } = event.target;
            const root = event.target.form;
            root.goodid.disabled = value === "";
          }
        });
        work_area.append({
          type: "input",
          name: "goodid",
          label: window.wgULS("破坏前的修订版本:", "破壞前的修訂版本:"),
          tooltip: window.wgULS("留空以略过差异的较早版本", "留空以略過差異的較早版本"),
          value: mw.util.getParamValue("vanarticlegoodrevid") || "",
          disabled: !mw.util.getParamValue("vanarticle") || mw.util.getParamValue("vanarticlerevid")
        });
        work_area.append({
          type: "checkbox",
          name: "arvtype",
          list: [{
            label: window.wgULS("已发出最后警告", "已發出最後警告"),
            value: "final"
          }, {
            label: window.wgULS("封禁过期后随即破坏", "封鎖過期後隨即破壞"),
            value: "postblock"
          }, {
            label: window.wgULS("显而易见的纯破坏用户", "顯而易見的純破壞使用者"),
            value: "vandalonly",
            disabled: mw.util.isIPAddress(root_.uid.value)
          }, {
            label: window.wgULS("显而易见的spambot或失窃账号", "顯而易見的spambot或失竊賬號"),
            value: "spambot"
          }, {
            label: window.wgULS("仅用来散发广告宣传的用户", "僅用來散發廣告宣傳的使用者"),
            value: "promoonly",
            disabled: mw.util.isIPAddress(root_.uid.value)
          }]
        });
        if (!mw.util.isIPAddress(mw.config.get("wgRelevantUserName"))) {
          work_area.append({
            type: "checkbox",
            list: [{
              label: window.wgULS("在页面上及编辑摘要隐藏用户名", "在頁面上及編輯摘要隱藏使用者名稱"),
              tooltip: window.wgULS("若用户名不当请勾选此项,注意:请考虑私下联系管理员处理。", "若使用者名稱不當請勾選此項,注意:請考慮私下聯絡管理員處理。"),
              name: "hidename",
              value: "hidename"
            }]
          });
        }
        work_area.append({
          type: "textarea",
          name: "reason",
          label: window.wgULS("评论:", "評論:")
        });
        work_area.append({
          type: "div",
          id: "arvpreview",
          label: [previewlink]
        });
        work_area.append({
          type: "div",
          id: "twinklearv-previewbox",
          style: "display: none"
        });
        work_area = work_area.render();
        old_area.parentNode.replaceChild(work_area, old_area);
        break;
    }
    root_.previewer = new Morebits.wiki.preview($(work_area).find("#twinklearv-previewbox").last()[0]);
  };
  Twinkle.arv.callback.preview = (form) => {
    const reason = Twinkle.arv.callback.getReportWikitext(form);
    if (reason === void 0) {
      return;
    }
    const input = Morebits.quickForm.getInputData(form);
    let title;
    switch (input.category) {
      case "vip":
        title = "LIB_talk:报告当前破坏";
        break;
      case "ewip":
        title = "LIB_talk:管理员告示板";
        break;
      case "username":
        title = "LIB_talk:管理员告示板";
        break;
      case "spi":
        title = "LIB_talk:管理员告示板";
        break;
      default:
        title = mw.config.get("wgPageName");
        break;
    }
    form.previewer.beginRender("__NOTOC__".concat(reason[0]), title);
  };
  Twinkle.arv.callback.getReportWikitext = (form) => {
    const input = Morebits.quickForm.getInputData(form);
    let reason = "";
    let comment = "";
    const {
      uid
    } = input;
    const checkTitle = (title, revid) => {
      if (/https?:\/\//.test(title)) {
        mw.notify(window.wgULS("页面名称不能使用网址。", "頁面名稱不能使用網址。"), {
          type: "warn",
          tag: "twinklearv"
        });
        return false;
      }
      let page_;
      try {
        page_ = new mw.Title(title);
      } catch {
        mw.notify("".concat(window.wgULS("“", "「") + title + window.wgULS("”不是一个有效的页面名称,如要使用差异链接请放在“评论”", "」不是一個有效的頁面名稱,如要使用差異連結請放在「評論」") + (revid ? window.wgULS(",或正确输入“修订版本”", ",或正確輸入「修訂版本」") : ""), "。"), {
          type: "warn",
          tag: "twinklearv"
        });
        return false;
      }
      if (page_.namespace === -1) {
        mw.notify("".concat(window.wgULS("“", "「") + title + window.wgULS("”属于特殊页面,如要使用差异链接请放在“评论”", "」屬於特殊頁面,如要使用差異連結請放在「評論」") + (revid ? window.wgULS(",或正确输入“修订版本”", ",或正確輸入「修訂版本」") : ""), "。"), {
          type: "warn",
          tag: "twinklearv"
        });
        return false;
      }
      return page_;
    };
    let page;
    switch (input.category) {
      case "ewip": {
        if (input.reason === "") {
          mw.notify(window.wgULS("您必须指定理由", "您必須指定理由"), {
            type: "warn",
            tag: "twinklearv"
          });
          return;
        }
        reason += "== 编辑战举报(".concat(uid, ") ==\n");
        reason += "* '''{{vandal|".concat(/[=]/.test(uid) ? "1=" : "").concat(uid, "}}'''\n");
        const pages = $("input:text[name=page]", form).map((o, e) => {
          return $(e).val() || null;
        });
        var _iterator2 = _createForOfIteratorHelper(pages), _step2;
        try {
          for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) {
            const page_ = _step2.value;
            page = checkTitle(page_, false);
            if (!page) {
              return;
            }
            comment += "* {{pagelinks|".concat(page.getPrefixedText().includes("=") ? "1=" : "").concat(page.getPrefixedText(), "}}\n");
          }
        } catch (err) {
          _iterator2.e(err);
        } finally {
          _iterator2.f();
        }
        input.reason = input.reason.replace(/\n\n+/g, "\n");
        input.reason = input.reason.replace(/\r?\n/g, "\n*:");
        comment += "* ".concat(input.reason, "\n");
        comment = comment.trim();
        comment = Morebits.string.appendPunctuation(comment);
        reason += "".concat(comment, "\n* 提报人:~~").concat("~~\n* 处理:");
        break;
      }
      case "username": {
        let types = input.arvtype.map(Morebits.string.toLowerCaseFirstChar);
        const hasShared = types.includes("shared");
        if (hasShared) {
          types.splice(types.indexOf("shared"), 1);
        }
        if (types.includes("侮辱性") && !confirm(window.wgULS("警告:严重的侮辱性用户名和针对特定个人的侮辱性用户名不应在公开页面报告,而是应当私下联系监督员处理。是否继续?", "警告:嚴重的侮辱性使用者名稱和針對特定個人的侮辱性使用者名稱不應在公開頁面報告,而是應當私下聯絡監督員處理。是否繼續?"))) {
          return;
        }
        if (types.length <= 2) {
          types = types.join("和");
        } else {
          types = [types.slice(0, -1).join("、"), types.slice(-1)].join("和");
        }
        comment += "*{{user-uaa|1=".concat(uid);
        if (input.hidename) {
          comment += "|hidename=1";
        }
        comment += "}} &ndash; ";
        if (types.length) {
          comment += types + window.wgULS("用户名", "使用者名稱");
        }
        if (types.length && hasShared) {
          comment += ",";
        }
        if (hasShared) {
          comment += window.wgULS("暗示该账号并非由一人拥有", "暗示該賬號並非由一人擁有");
        }
        if (types.length || hasShared) {
          comment += "。";
        }
        if (input.reason) {
          comment += Morebits.string.toUpperCaseFirstChar(input.reason);
        }
        comment = Morebits.string.appendPunctuation(comment);
        comment += "--~~".concat("~~");
        comment = comment.replace(/\r?\n/g, "\n*:");
        reason = "== 不当用户名报告(".concat(input.hidename ? window.wgULS("已隐藏用户名", "已隱藏使用者名稱") : uid, ") ==\n");
        reason += comment;
        break;
      }
      case "spi": {
        if (!input.reason) {
          mw.notify(window.wgULS("请输入证据。", "請輸入證據。"), {
            type: "warn",
            tag: "twinklearv"
          });
          return;
        }
        const sockpuppets = Morebits.array.uniq([...$("input:text[name=sockpuppet]", form)].map((o) => {
          return $(o).val().trim() || null;
        }));
        if (!sockpuppets[0]) {
          mw.notify(window.wgULS("您没有指定任何傀儡。", "您沒有指定任何傀儡。"), {
            type: "warn",
            tag: "twinklearv"
          });
          return;
        }
        comment += "{{".concat("subst:", "SPI report|");
        if (!sockpuppets.includes(input.sockmaster)) {
          comment += "1={{".concat("subst:", "#ifexist:{{", "subst:", "FULLPAGENAME}}||".concat(input.sockmaster, "}}|"));
        }
        comment += "".concat(sockpuppets.map((sock, index) => {
          return "".concat(index + 2, "=").concat(sock);
        }).join("|"), "\n|evidence=").concat(Morebits.string.appendPunctuation(input.reason), "\n");
        if (input.checkuser) {
          comment += "|checkuser=yes";
        }
        comment += "}}";
        reason = comment;
        break;
      }
      default: {
        if (!input.arvtype.length && input.reason === "") {
          mw.notify(window.wgULS("您必须指定理由", "您必須指定理由"), {
            type: "warn",
            tag: "twinklearv"
          });
          return;
        }
        reason += "== ".concat(input.hidename ? window.wgULS("已隐藏用户名", "已隱藏使用者名稱") : uid, " ==\n");
        reason += "* '''{{vandal|".concat(/[=]/.test(uid) ? "1=" : "").concat(uid);
        if (input.hidename) {
          reason += "|hidename=1";
        }
        reason += "}}'''\n";
        const types = input.arvtype.map((v) => {
          switch (v) {
            case "final":
              return "已发出最后警告";
            case "postblock":
              return "封禁过期后随即破坏";
            case "spambot":
              return "显而易见的spambot或失窃账号";
            case "vandalonly":
              return "显而易见的纯破坏用户";
            case "promoonly":
              return "仅用来散发广告宣传的用户";
            default:
              return "未知理由";
          }
        }).join(",");
        if (input.page !== "") {
          page = checkTitle(input.page, true);
          if (!page) {
            return;
          }
          comment += "* {{pagelinks|".concat(page.getPrefixedText().includes("=") ? "1=" : "").concat(page.getPrefixedText(), "}}");
          if (input.badid) {
            var _input$goodid;
            comment += "({{diff|".concat(page.getPrefixedText(), "|").concat(input.badid, "|").concat((_input$goodid = input.goodid) !== null && _input$goodid !== void 0 ? _input$goodid : "", "|diff}})");
          }
          comment += "\n";
        }
        if (types) {
          comment += "* ".concat(types);
        }
        if (input.reason !== "") {
          input.reason = input.reason.replace(/\n\n+/g, "\n");
          input.reason = input.reason.replace(/\r?\n/g, "\n*:");
          comment += (types ? "。" : "* ") + input.reason;
        }
        comment = comment.trim();
        comment = Morebits.string.appendPunctuation(comment);
        reason += "".concat(comment, "\n* 发现人:~~").concat("~~\n* 处理:");
        break;
      }
    }
    return [reason, comment];
  };
  Twinkle.arv.callback.evaluate = (e) => {
    const form = e.target;
    const input = Morebits.quickForm.getInputData(form);
    const {
      uid
    } = input;
    let reason;
    let summary;
    switch (input.category) {
      case "ewip": {
        reason = Twinkle.arv.callback.getReportWikitext(form);
        if (reason === void 0) {
          return;
        }
        summary = "".concat(window.wgULS("报告", "報告"), "[[Special:Contribs/").concat(uid, "|").concat(uid, "]]");
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Morebits.wiki.actionCompleted.redirect = "LIB_talk:管理员告示板";
        Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
        const ewipPage = new Morebits.wiki.page("LIB_talk:管理员告示板", window.wgULS("处理EWIP请求", "處理EWIP請求"));
        ewipPage.setFollowRedirect(true);
        ewipPage.load(() => {
          const text = ewipPage.getPageText();
          const $ewipLink = '<a rel="noopener" target="_blank" href="/wiki/LIB:EWIP">LIB:EWIP</a>';
          if (new RegExp("===\\s*\\{\\{\\s*(?:[Vv]andal)\\s*\\|\\s*(?:1=)?\\s*".concat(Morebits.string.escapeRegExp(uid), "\\s*\\}\\}\\s*===")).test(text)) {
            ewipPage.getStatusElement().error(window.wgULS("报告已存在,将不会加入新的", "報告已存在,將不會加入新的"));
            Morebits.status.printUserText(reason[1], window.wgULS("您输入的评论已在下方提供,您可以将其加入到", "您輸入的評論已在下方提供,您可以將其加入到") + $ewipLink + window.wgULS("已存在的小节中:", "已存在的小節中:"));
            return;
          }
          ewipPage.setPageSection(0);
          ewipPage.getStatusElement().status(window.wgULS("加入新报告…", "加入新報告…"));
          ewipPage.setEditSummary(summary);
          ewipPage.setChangeTags(Twinkle.changeTags);
          ewipPage.setAppendText("\n".concat(reason[0]));
          ewipPage.append();
        });
        break;
      }
      case "username": {
        reason = Twinkle.arv.callback.getReportWikitext(form);
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Morebits.wiki.actionCompleted.redirect = "LIB_talk:管理员告示板";
        Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
        const uaaPage = new Morebits.wiki.page("LIB_talk:管理员告示板", window.wgULS("处理UAA请求", "處理UAA請求"));
        uaaPage.setFollowRedirect(true);
        uaaPage.load(() => {
          const text = uaaPage.getPageText();
          if (new RegExp("\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?".concat(Morebits.string.escapeRegExp(uid), "\\s*(\\||\\})")).test(text)) {
            uaaPage.getStatusElement().error(window.wgULS("用户已被列入。", "使用者已被列入。"));
            const $uaaLink = '<a rel="noopener" target="_blank" href="/wiki/LIB:UAA">LIB:UAA</a>';
            Morebits.status.printUserText(reason[1], window.wgULS("您输入的评论已在下方提供,您可以将其手工加入", "您輸入的評論已在下方提供,您可以將其手工加入") + $uaaLink + window.wgULS("上该用户的报告中:", "上該使用者的報告中:"));
            return;
          }
          uaaPage.getStatusElement().status(window.wgULS("加入新报告…", "加入新報告…"));
          uaaPage.setEditSummary(window.wgULS("新提报", "新提報"));
          uaaPage.setChangeTags(Twinkle.changeTags);
          uaaPage.setAppendText("\n\n".concat(reason[0]));
          uaaPage.append();
        });
        break;
      }
      case "spi": {
        reason = Twinkle.arv.callback.getReportWikitext(form);
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        const reportpage = "LIB_talk:管理员告示板";
        Morebits.wiki.actionCompleted.redirect = reportpage;
        Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
        const spiPage = new Morebits.wiki.page(reportpage, window.wgULS("抓取讨论页面", "抓取討論頁面"));
        spiPage.setFollowRedirect(true);
        spiPage.setEditSummary(window.wgULS("加入新提报", "加入新提報"));
        spiPage.setChangeTags(Twinkle.changeTags);
        spiPage.setAppendText(reason[0]);
        spiPage.setWatchlist(Twinkle.getPref("spiWatchReport"));
        spiPage.append();
        break;
      }
      default: {
        reason = Twinkle.arv.callback.getReportWikitext(form);
        if (reason === void 0) {
          return;
        }
        summary = "".concat(window.wgULS("报告", "報告"), "[[Special:Contribs/").concat(uid, "|").concat(uid, "]]");
        if (input.hidename) {
          summary = window.wgULS("报告一名用户", "報告一名使用者");
        }
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Morebits.wiki.actionCompleted.redirect = "LIB_talk:报告当前破坏";
        Morebits.wiki.actionCompleted.notice = window.wgULS("报告完成", "報告完成");
        const aivPage = new Morebits.wiki.page("LIB_talk:报告当前破坏", window.wgULS("处理VIP请求", "處理VIP請求"));
        aivPage.setFollowRedirect(true);
        aivPage.load(() => {
          const text = aivPage.getPageText();
          const $aivLink = '<a rel="noopener" target="_blank" href="/wiki/LIB:VIP">LIB:VIP</a>';
          if (new RegExp("===\\s*\\{\\{\\s*(?:[Vv]andal)\\s*\\|\\s*(?:1=)?\\s*".concat(Morebits.string.escapeRegExp(uid), "\\s*\\}\\}\\s*===")).test(text)) {
            aivPage.getStatusElement().error(window.wgULS("报告已存在,将不会加入新的", "報告已存在,將不會加入新的"));
            Morebits.status.printUserText(reason[1], window.wgULS("您输入的评论已在下方提供,您可以将其加入到", "您輸入的評論已在下方提供,您可以將其加入到") + $aivLink + window.wgULS("已存在的小节中:", "已存在的小節中:"));
            return;
          }
          aivPage.setPageSection(0);
          aivPage.getStatusElement().status(window.wgULS("加入新报告…", "加入新報告…"));
          aivPage.setEditSummary(summary);
          aivPage.setChangeTags(Twinkle.changeTags);
          aivPage.setAppendText("\n".concat(reason[0]));
          aivPage.append();
        });
        break;
      }
    }
  };
  Twinkle.addInitCallback(Twinkle.arv, "arv");
})(jQuery);
//! src/Twinkle/modules/twinklewarn.js
/*! Twinkle.js - twinklewarn.js */
(function twinklewarn($) {
  const $body = $("body");
  const relevantUserName = mw.config.get("wgRelevantUserName");
  Twinkle.warn = () => {
    if (relevantUserName) {
      Twinkle.addPortletLink(Twinkle.warn.callback, "警告", "tw-warn", window.wgULS("警告或提醒用户", "警告或提醒使用者"));
      if (Twinkle.getPref("autoMenuAfterRollback") && mw.config.get("wgNamespaceNumber") === 3 && mw.util.getParamValue("vanarticle") && !mw.util.getParamValue("noautowarn")) {
        Twinkle.warn.callback();
      }
    }
    if (mw.config.get("wgAction") === "rollback") {
      const $vandalTalkLink = $body.find("#mw-rollback-success").find(".mw-usertoollinks a").first();
      if ($vandalTalkLink.length) {
        Twinkle.warn.makeVandalTalkLink($vandalTalkLink, Morebits.pageNameNorm);
        $vandalTalkLink.css("font-weight", "bold");
      }
    }
    if (mw.config.get("wgCanonicalSpecialPageName") === "AbuseLog" && mw.config.get("wgAbuseFilterVariables") !== null) {
      const afTalkLink = $body.find(".mw-usertoollinks-talk").first();
      if (afTalkLink.length) {
        Twinkle.warn.makeVandalTalkLink(afTalkLink, mw.config.get("wgAbuseFilterVariables").page_prefixedtitle);
        afTalkLink.css("font-weight", "bold");
      }
    }
  };
  Twinkle.warn.makeVandalTalkLink = ($vandalTalkLink, pagename) => {
    $vandalTalkLink.wrapInner($("<span>").attr("title", window.wgULS("如果合适,您可以用Twinkle在该用户讨论页上做出警告。", "如果合適,您可以用Twinkle在該使用者討論頁上做出警告。")));
    const extraParam = "vanarticle=".concat(mw.util.rawurlencode(pagename));
    const href = $vandalTalkLink.attr("href");
    if (href.includes("?")) {
      $vandalTalkLink.attr("href", "".concat(href, "&").concat(extraParam));
    } else {
      $vandalTalkLink.attr("href", "".concat(href, "?").concat(extraParam));
    }
  };
  Twinkle.warn.dialog = null;
  Twinkle.warn.callback = () => {
    if (relevantUserName === mw.config.get("wgUserName") && !confirm(window.wgULS("您将要警告自己!您确定要继续吗?", "您將要警告自己!您確定要繼續嗎?"))) {
      return;
    }
    Twinkle.warn.dialog = new Morebits.simpleWindow(600, 440);
    const {
      dialog
    } = Twinkle.warn;
    dialog.setTitle(window.wgULS("警告、提醒用户", "警告、提醒使用者"));
    dialog.setScriptName("Twinkle");
    dialog.addFooterLink(window.wgULS("警告设置", "警告設定"), "H:TW/PREF#warn");
    dialog.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#warn");
    const form = new Morebits.quickForm(Twinkle.warn.callback.evaluate);
    const main_select = form.append({
      type: "field",
      label: window.wgULS("选择要发送的警告或提醒类型", "選擇要傳送的警告或提醒類別"),
      tooltip: window.wgULS("首先选择一组,再选择具体的警告模板。", "首先選擇一組,再選擇具體的警告模板。")
    });
    const main_group = main_select.append({
      type: "select",
      name: "main_group",
      tooltip: window.wgULS("您可在Twinkle参数设置中设置默认选择的选项", "您可在Twinkle偏好設定中設定預設選擇的選項"),
      event: Twinkle.warn.callback.change_category
    });
    const defaultGroup = Number.parseInt(Twinkle.getPref("defaultWarningGroup"), 6);
    main_group.append({
      type: "option",
      label: window.wgULS("自动选择层级", "自動選擇層級"),
      value: "autolevel",
      selected: defaultGroup === 7
    });
    main_group.append({
      type: "option",
      label: "1:提醒",
      value: "level1",
      selected: defaultGroup === 1
    });
    main_group.append({
      type: "option",
      label: "2:警告",
      value: "level2",
      selected: defaultGroup === 2
    });
    if (Twinkle.getPref("combinedSingletMenus")) {
      main_group.append({
        type: "option",
        label: window.wgULS("单层级消息", "單層級訊息"),
        value: "singlecombined",
        selected: defaultGroup === 3 || defaultGroup === 4
      });
    } else {
      main_group.append({
        type: "option",
        label: window.wgULS("单层级提醒", "單層級提醒"),
        value: "singlenotice",
        selected: defaultGroup === 3
      });
      main_group.append({
        type: "option",
        label: window.wgULS("单层级警告", "單層級警告"),
        value: "singlewarn",
        selected: defaultGroup === 4
      });
    }
    if (Twinkle.getPref("customWarningList").length) {
      main_group.append({
        type: "option",
        label: window.wgULS("自定义警告", "自訂警告"),
        value: "custom",
        selected: defaultGroup === 5
      });
    }
    main_group.append({
      type: "option",
      label: "所有警告模板",
      value: "kitchensink",
      selected: defaultGroup === 6
    });
    main_select.append({
      type: "select",
      name: "sub_group",
      event: Twinkle.warn.callback.change_subcategory
    });
    form.append({
      type: "input",
      name: "article",
      label: window.wgULS("页面链接", "頁面連結"),
      value: mw.util.getParamValue("vanarticle") || "",
      size: 50,
      tooltip: window.wgULS("给模板中加入一页面链接,可留空。", "給模板中加入一頁面連結,可留空。"),
      placeholder: window.wgULS("仅限一个,勿使用网址、[[ ]],可使用Special:Diff", "僅限一個,勿使用網址、[[ ]],可使用Special:Diff")
    });
    form.append({
      type: "div",
      label: "",
      style: "color: #f00",
      id: "twinkle-warn-warning-messages"
    });
    const more = form.append({
      type: "field",
      name: "reasonGroup",
      label: window.wgULS("警告信息", "警告資訊")
    });
    more.append({
      type: "textarea",
      label: window.wgULS("可选信息:", "可選資訊:"),
      name: "reason",
      tooltip: window.wgULS("理由或是附加信息", "理由或是附加資訊")
    });
    const previewlink = document.createElement("a");
    $(previewlink).on("click", () => {
      Twinkle.warn.callbacks.preview(result);
    });
    previewlink.style.cursor = "pointer";
    previewlink.textContent = window.wgULS("预览", "預覽");
    more.append({
      type: "div",
      id: "warningpreview",
      label: [previewlink]
    });
    more.append({
      type: "div",
      id: "twinklewarn-previewbox",
      style: "display: none"
    });
    more.append({
      type: "submit",
      label: "提交"
    });
    const result = form.render();
    dialog.setContent(result);
    dialog.display();
    result.main_group.root = result;
    result.previewer = new Morebits.wiki.preview($(result).find("div#twinklewarn-previewbox").last()[0]);
    let message = "";
    let query = {};
    const vanrevid = mw.util.getParamValue("vanarticlerevid");
    if (vanrevid) {
      if (!mw.util.getParamValue("noautowarn") && mw.util.getParamValue("vanarticle")) {
        query = {
          action: "query",
          titles: mw.util.getParamValue("vanarticle"),
          prop: "revisions",
          rvstartid: vanrevid,
          rvlimit: 2,
          rvdir: "newer",
          rvprop: "user"
        };
        new Morebits.wiki.api(window.wgULS("检查您是否成功回退该页面", "檢查您是否成功回退該頁面"), query, (apiobj) => {
          const revertUser = $(apiobj.getResponse()).find("revisions rev")[1].getAttribute("user");
          if (revertUser && revertUser !== mw.config.get("wgUserName")) {
            message += window.wgULS("其他人回退了该页面,并可能已经警告该用户。", "其他人回退了該頁面,並可能已經警告該使用者。");
            $body.find("#twinkle-warn-warning-messages").text("警告:".concat(message));
          }
        }).post();
      }
      const checkStale = (vantimestamp_) => {
        const revDate = new Morebits.date(vantimestamp_);
        if (vantimestamp_ && revDate.isValid() && revDate.add(24, "hours").isBefore(/* @__PURE__ */ new Date())) {
          message += window.wgULS("这笔编辑是在24小时前做出的,现在警告可能已过时。", "這筆編輯是在24小時前做出的,現在警告可能已過時。");
          $body.find("#twinkle-warn-warning-messages").text("警告:".concat(message));
        }
      };
      let vantimestamp = mw.util.getParamValue("vantimestamp");
      if (vantimestamp) {
        checkStale(vantimestamp);
      } else {
        query = {
          action: "query",
          prop: "revisions",
          rvprop: "timestamp",
          revids: vanrevid
        };
        new Morebits.wiki.api(window.wgULS("获取版本时间戳", "取得版本時間戳"), query, (apiobj) => {
          vantimestamp = $(apiobj.getResponse()).find("revisions rev").attr("timestamp");
          checkStale(vantimestamp);
        }).post();
      }
    }
    const init = () => {
      const evt = document.createEvent("Event");
      evt.initEvent("change", true, true);
      result.main_group.dispatchEvent(evt);
    };
    init();
  };
  Twinkle.warn.messages = {
    levels: [{
      category: window.wgULS("不同类型的非建设编辑", "不同類別的非建設編輯"),
      list: {
        "uw-copyright": {
          level1: {
            label: window.wgULS("侵犯著作权", "侵犯版權"),
            summary: window.wgULS("注意:侵犯著作权", "注意:侵犯版權")
          },
          level2: {
            label: window.wgULS("多次侵犯著作权", "多次侵犯版權"),
            summary: window.wgULS("警告:多次侵犯著作权", "警告:多次侵犯版權")
          }
        },
        "uw-crystal": {
          level1: {
            label: window.wgULS("加入臆测或未确认的消息", "加入臆測或未確認的訊息"),
            summary: window.wgULS("注意:加入臆测或未确认的消息", "注意:加入臆測或未確認的訊息")
          },
          level2: {
            label: window.wgULS("多次加入臆测或未确认的消息", "多次加入臆測或未確認的訊息"),
            summary: window.wgULS("警告:多次加入臆测或未确认的消息", "警告:多次加入臆測或未確認的訊息")
          }
        },
        "uw-delete": {
          level1: {
            label: window.wgULS("不恰当地移除页面内容、模板或资料", "不恰當地移除頁面內容、模板或資料"),
            summary: window.wgULS("注意:不恰当地移除页面内容、模板或资料", "注意:不恰當地移除頁面內容、模板或資料")
          },
          level2: {
            label: window.wgULS("不恰当地移除页面内容、模板或资料", "不恰當地移除頁面內容、模板或資料"),
            summary: window.wgULS("警告:不恰当地移除页面内容、模板或资料", "警告:不恰當地移除頁面內容、模板或資料")
          }
        },
        "uw-image": {
          level1: {
            label: window.wgULS("在页面中加入不当图片", "在頁面中加入不當圖片"),
            summary: window.wgULS("注意:在页面中加入不当图片", "注意:在頁面中加入不當圖片")
          },
          level2: {
            label: window.wgULS("在页面中加入不当图片", "在頁面中加入不當圖片"),
            summary: window.wgULS("警告:在页面中加入不当图片", "警告:在頁面中加入不當圖片")
          }
        },
        "uw-newpage": {
          level1: {
            label: window.wgULS("创建不当页面", "建立不當頁面"),
            summary: window.wgULS("注意:创建不当页面", "注意:建立不當頁面")
          },
          level2: {
            label: window.wgULS("创建不当页面", "建立不當頁面"),
            summary: window.wgULS("警告:创建不当页面", "警告:建立不當頁面")
          }
        },
        "uw-nor": {
          level1: {
            label: window.wgULS("在条目中加入原创研究", "在條目中加入原創研究"),
            summary: window.wgULS("注意:在条目中加入原创研究", "注意:在條目中加入原創研究")
          },
          level2: {
            label: window.wgULS("在条目中加入原创研究", "在條目中加入原創研究"),
            summary: window.wgULS("警告:在条目中加入原创研究", "警告:在條目中加入原創研究")
          }
        },
        "uw-opov": {
          level1: {
            label: window.wgULS("违反客观原则", "違反客觀原則"),
            summary: window.wgULS("注意:违反客观原则", "注意:違反客觀原則")
          },
          level2: {
            label: window.wgULS("违反客观原则", "違反客觀原則"),
            summary: window.wgULS("警告:违反客观原则", "警告:違反客觀原則")
          }
        },
        "uw-redirect": {
          level1: {
            label: window.wgULS("创建破坏性的重定向", "建立破壞性的重定向"),
            summary: window.wgULS("注意:创建破坏性的重定向", "注意:建立破壞性的重定向")
          },
          level2: {
            label: window.wgULS("创建恶意重定向", "建立惡意重定向"),
            summary: window.wgULS("警告:创建恶意重定向", "警告:建立惡意重定向")
          }
        },
        "uw-upload": {
          level1: {
            label: window.wgULS("上传不当图像", "上傳不當圖像"),
            summary: window.wgULS("注意:上传不当图像", "注意:上傳不當圖像")
          },
          level2: {
            label: window.wgULS("上传不当图像", "上傳不當圖像"),
            summary: window.wgULS("警告:上传不当图像", "警告:上傳不當圖像")
          }
        },
        "uw-vandalism": {
          level1: {
            label: window.wgULS("明显的破坏", "明顯的破壞"),
            summary: window.wgULS("注意:明显破坏", "注意:明顯破壞")
          },
          level2: {
            label: window.wgULS("明显的破坏", "明顯的破壞"),
            summary: window.wgULS("警告:明显破坏", "警告:明顯破壞")
          }
        },
        "uw-tdel": {
          level1: {
            label: window.wgULS("在问题仍未解决的情况下移除维护性模板", "在問題仍未解決的情況下移除維護性模板"),
            summary: window.wgULS("注意:移除维护性模板", "注意:移除維護性模板")
          },
          level2: {
            label: window.wgULS("在问题仍未解决的情况下移除维护性模板", "在問題仍未解決的情況下移除維護性模板"),
            summary: window.wgULS("警告:移除维护性模板", "警告:移除維護性模板")
          }
        }
      }
    }, {
      category: window.wgULS("增加广告", "增加廣告"),
      list: {
        "uw-spam": {
          level1: {
            label: window.wgULS("增加不合适的外部链接", "增加不合適的外部連結"),
            summary: window.wgULS("注意:增加不合适的外部链接", "注意:增加不合適的外部連結")
          },
          level2: {
            label: window.wgULS("增加垃圾链接", "增加垃圾連結"),
            summary: window.wgULS("警告:增加垃圾链接", "警告:增加垃圾連結")
          }
        },
        "uw-advert": {
          level1: {
            label: window.wgULS("利用有兽档案馆来发布广告或推广", "利用有獸檔案館來發布廣告或推廣"),
            summary: window.wgULS("注意:利用有兽档案馆来发布广告或推广", "注意:利用有獸檔案館來發布廣告或推廣")
          },
          level2: {
            label: window.wgULS("利用有兽档案馆来发布广告或推广", "利用有獸檔案館來發布廣告或推廣"),
            summary: window.wgULS("警告:利用有兽档案馆来发布广告或推广", "警告:利用有獸檔案館來發布廣告或推廣")
          }
        }
      }
    }, {
      category: window.wgULS("加插不实、诽谤文字", "加插不實、誹謗文字"),
      list: {
        "uw-biog": {
          level1: {
            label: window.wgULS("在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容"),
            summary: window.wgULS("注意:在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "注意:在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容")
          },
          level2: {
            label: window.wgULS("在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容"),
            summary: window.wgULS("警告:在人物传记中加入没有可靠来源佐证而且可能引发争议的内容", "警告:在人物傳記中加入沒有可靠來源佐證而且可能引發爭議的內容")
          }
        },
        "uw-error": {
          level1: {
            label: window.wgULS("故意加入不实内容", "故意加入不實內容"),
            summary: window.wgULS("注意:故意加入不实内容", "注意:故意加入不實內容")
          },
          level2: {
            label: window.wgULS("故意加入不实内容", "故意加入不實內容"),
            summary: window.wgULS("警告:故意加入不实内容", "警告:故意加入不實內容")
          }
        },
        "uw-unsourced": {
          level1: {
            label: window.wgULS("加入没有可靠来源佐证的内容", "加入沒有可靠來源佐證的內容"),
            summary: window.wgULS("注意:加入没有可靠来源佐证的内容", "注意:加入沒有可靠來源佐證的內容")
          },
          level2: {
            label: window.wgULS("加入没有可靠来源佐证的内容", "加入沒有可靠來源佐證的內容"),
            summary: window.wgULS("警告:加入没有可靠来源佐证的内容", "警告:加入沒有可靠來源佐證的內容")
          }
        }
      }
    }, {
      category: window.wgULS("翻译品质", "翻譯品質"),
      list: {
        "uw-roughtranslation": {
          level1: {
            label: window.wgULS("您翻译的质量有待改善", "您翻譯的質量有待改善"),
            summary: window.wgULS("注意:您翻译的质量有待改善", "注意:您翻譯的質量有待改善")
          },
          level2: {
            label: window.wgULS("粗劣翻译", "粗劣翻譯"),
            summary: window.wgULS("警告:粗劣翻译", "警告:粗劣翻譯")
          }
        }
      }
    }, {
      category: window.wgULS("非能接受且违反条例的单方面行为或操作", "非能接受且違反條例的單方面行為或操作"),
      list: {
        "uw-afd": {
          level1: {
            label: window.wgULS("移除{{afd}}(页面存废讨论)模板", "移除{{afd}}(頁面存廢討論)模板"),
            summary: window.wgULS("注意:移除{{afd}}(页面存废讨论)模板", "注意:移除{{afd}}(頁面存廢討論)模板")
          },
          level2: {
            label: window.wgULS("移除{{afd}}(页面存废讨论)模板", "移除{{afd}}(頁面存廢討論)模板"),
            summary: window.wgULS("警告:移除{{afd}}(页面存废讨论)模板", "警告:移除{{afd}}(頁面存廢討論)模板")
          }
        },
        "uw-mos": {
          level1: {
            label: window.wgULS("不恰当的条目格式、日期、语言等", "不恰當的條目格式、日期、語言等"),
            summary: window.wgULS("注意:不恰当的条目格式、日期、语言等", "注意:不恰當的條目格式、日期、語言等")
          },
          level2: {
            label: window.wgULS("不恰当的条目格式、日期、语言等", "不恰當的條目格式、日期、語言等"),
            summary: window.wgULS("警告:不恰当的条目格式、日期、语言等", "警告:不恰當的條目格式、日期、語言等")
          }
        },
        "uw-move": {
          level1: {
            label: window.wgULS("无故移动条目/新名称不符合命名规范", "無故移動條目/新名稱不符合命名規範"),
            summary: window.wgULS("注意:不恰当地移动页面", "注意:不恰當地移動頁面")
          },
          level2: {
            label: window.wgULS("把页面移动到不恰当、违反命名常规或违反共识的标题", "把頁面移動到不恰當、違反命名常規或違反共識的標題"),
            summary: window.wgULS("警告:不恰当地移动页面", "警告:不恰當地移動頁面")
          }
        },
        "uw-speedy": {
          level1: {
            label: window.wgULS("移除{{delete}}(快速删除)模板", "移除{{delete}}(快速刪除)模板"),
            summary: window.wgULS("注意:移除{{delete}}(快速删除)模板", "注意:移除{{delete}}(快速刪除)模板")
          },
          level2: {
            label: window.wgULS("移除{{delete}}(快速删除)模板", "移除{{delete}}(快速刪除)模板"),
            summary: window.wgULS("警告:移除{{delete}}(快速删除)模板", "警告:移除{{delete}}(快速刪除)模板")
          }
        },
        "uw-talkpage": {
          level1: {
            label: window.wgULS("违反讨论页规范", "違反討論頁規範"),
            summary: window.wgULS("注意:违反讨论页规范", "注意:違反討論頁規範")
          },
          level2: {
            label: window.wgULS("违反讨论页规范", "違反討論頁規範"),
            summary: window.wgULS("警告:违反讨论页规范", "警告:違反討論頁規範")
          }
        },
        "uw-tpv": {
          level1: {
            label: "修改他人留言",
            summary: "注意:修改他人留言"
          },
          level2: {
            label: "修改他人留言",
            summary: "警告:修改他人留言"
          }
        }
      }
    }, {
      category: window.wgULS("对其他用户和条目的态度", "對其他用戶和條目的態度"),
      list: {
        "uw-illegal": {
          level1: {
            label: window.wgULS("加入不符合中国价值观的内容", "加入不符合中國價值觀的內容"),
            summary: window.wgULS("注意:加入不符合中国价值观的内容", "注意:加入不符合中國價值觀的內容")
          },
          level2: {
            label: window.wgULS("加入不符合中国价值观的内容", "加入不符合中國價值觀的內容"),
            summary: window.wgULS("警告:加入不符合中国价值观的内容", "警告:加入不符合中國價值觀的內容")
          }
        },
        "uw-own": {
          level1: {
            label: window.wgULS("主张条目所有权", "主張條目所有權"),
            summary: window.wgULS("注意:主张条目所有权", "注意:主張條目所有權")
          },
          level2: {
            label: window.wgULS("主张条目的所有权", "主張條目的所有權"),
            summary: window.wgULS("警告:主张条目的所有权", "警告:主張條目的所有權")
          }
        },
        "uw-socialmedia": {
          level1: {
            label: window.wgULS("将有兽档案馆当作社交媒体使用", "將有獸檔案館當作社交媒體使用"),
            summary: window.wgULS("注意:将有兽档案馆当作社交媒体使用", "注意:將有獸檔案館當作社交媒體使用")
          },
          level2: {
            label: window.wgULS("将有兽档案馆当作社交媒体使用", "將有獸檔案館當作社交媒體使用"),
            summary: window.wgULS("警告:将有兽档案馆当作社交媒体使用", "警告:將有獸檔案館當作社交媒體使用")
          }
        }
      }
    }],
    singlenotice: {
      "uw-2redirect": {
        label: window.wgULS("在移动页面后应该修复双重重定向", "在移動頁面後應該修復雙重重定向"),
        summary: window.wgULS("注意:在移动页面后应该修复双重重定向", "注意:在移動頁面後應該修復雙重重定向")
      },
      "uw-aiv": {
        label: window.wgULS("举报事项并不是破坏行为", "舉報事項並不是破壞行为"),
        summary: window.wgULS("注意:不恰当地举报破坏", "注意:不恰當地舉報破壞")
      },
      "uw-articlesig": {
        label: window.wgULS("在条目中签名", "在條目中簽名"),
        summary: window.wgULS("注意:在条目中签名", "注意:在條目中簽名")
      },
      "uw-autobiography": {
        label: window.wgULS("创建自传", "建立自傳"),
        summary: window.wgULS("注意:创建自传", "注意:建立自傳")
      },
      "uw-badcat": {
        label: window.wgULS("加入错误的页面分类", "加入錯誤的頁面分類"),
        summary: window.wgULS("注意:加入错误的页面分类", "注意:加入錯誤的頁面分類")
      },
      "uw-bite": {
        label: window.wgULS("伤害新手", "傷害新手"),
        summary: window.wgULS("注意:伤害新手", "注意:傷害新手")
      },
      "uw-chinese": {
        label: window.wgULS("请使用标准汉语沟通", "請使用標準漢語溝通"),
        summary: window.wgULS("注意:请使用标准汉语沟通", "注意:請使用標準漢語溝通")
      },
      "uw-cpmove": {
        label: window.wgULS("剪贴移动", "剪貼移動"),
        summary: window.wgULS("注意:剪贴移动", "注意:剪貼移動")
      },
      "uw-dab": {
        label: window.wgULS("消歧义页格式错误", "消歧義頁格式錯誤"),
        summary: window.wgULS("注意:消歧义页格式错误", "注意:消歧義頁格式錯誤")
      },
      "uw-newpage-draft": {
        label: window.wgULS("最近创建的页面被移动到草稿", "最近建立的頁面被移動到草稿"),
        summary: window.wgULS("注意:最近创建的页面被移动到草稿", "注意:最近建立的頁面被移動到草稿")
      },
      "uw-selfrevert": {
        label: window.wgULS("感谢您自行回退自己的测试,以后不要再这样做了", "感謝您自行回退自己的測試,以後不要再這樣做了"),
        summary: window.wgULS("注意:回退个人的测试", "注意:回退個人的測試")
      },
      "uw-substub": {
        label: window.wgULS("创建小小作品", "建立小小作品"),
        summary: window.wgULS("警告:创建小小作品", "警告:建立小小作品")
      },
      "uw-talkinarticle": {
        label: window.wgULS("在条目页中留下意见", "在條目頁中留下意見"),
        summary: window.wgULS("注意:在条目页中留下意见", "注意:在條目頁中留下意見")
      },
      "uw-unsigned": {
        label: window.wgULS("没有在讨论页上签名", "沒有在討論頁上簽名"),
        summary: window.wgULS("注意:没有在讨论页上签名", "注意:沒有在討論頁上簽名")
      },
      "uw-wrongcsd": {
        label: window.wgULS("快速删除理由不当", "快速刪除理由不當"),
        summary: window.wgULS("注意:快速删除理由不当", "注意:快速刪除理由不當")
      },
      "uw-wrongsummary": {
        label: window.wgULS("在编辑摘要制造不适当的内容", "在編輯摘要製造不適當的內容"),
        summary: window.wgULS("警告:在编辑摘要制造不适当的内容", "警告:在編輯摘要製造不適當的內容")
      }
    },
    singlewarn: {
      "uw-3rr": {
        label: window.wgULS("用户潜在违反回退不过三原则的可能性", "用戶潛在違反回退不過三原則的可能性"),
        summary: window.wgULS("警告:用户潜在违反回退不过三原则的可能性", "警告:用戶潛在違反回退不過三原則的可能性")
      },
      "uw-attack": {
        label: window.wgULS("人身攻击", "人身攻擊"),
        summary: window.wgULS("警告:人身攻击", "警告:人身攻擊"),
        suppressArticleInSummary: true
      },
      "uw-coi": {
        label: window.wgULS("利益冲突", "利益衝突"),
        summary: window.wgULS("注意:利益冲突", "注意:利益衝突")
      },
      "uw-fakesource": {
        label: window.wgULS("虚构数据源或引文", "虛構資料來源或引文"),
        summary: window.wgULS("警告:虚构数据源或引文", "警告:虛構資料來源或引文")
      },
      "uw-pinfo": {
        label: window.wgULS("张贴他人隐私", "張貼他人隱私"),
        summary: window.wgULS("警告:张贴他人隐私", "警告:張貼他人隱私")
      }
    }
  };
  Twinkle.warn.prev_article = null;
  Twinkle.warn.prev_reason = null;
  Twinkle.warn.talkpageObj = null;
  Twinkle.warn.callback.change_category = function change_category(e) {
    const {
      value
    } = e.target;
    const {
      sub_group
    } = e.target.root;
    sub_group.main_group = value;
    let old_subvalue = sub_group.value;
    let old_subvalue_re;
    if (old_subvalue) {
      if (value === "kitchensink") {
        old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue));
      } else {
        old_subvalue = old_subvalue.replace(/\d*(im)?$/, "");
        old_subvalue_re = new RegExp("".concat(mw.util.escapeRegExp(old_subvalue), "(\\d*?)$"));
      }
    }
    while (sub_group.hasChildNodes()) {
      sub_group.removeChild(sub_group.firstChild);
    }
    let selected = false;
    const createEntries = (contents, container, wrapInOptgroup, val = value) => {
      const level = val.replace(/^\D+/g, "");
      if (wrapInOptgroup && $.client.profile().platform === "iphone") {
        let wrapperOptgroup = new Morebits.quickForm.element({
          type: "optgroup",
          label: "可用模板"
        });
        wrapperOptgroup = wrapperOptgroup.render();
        container.appendChild(wrapperOptgroup);
        container = wrapperOptgroup;
      }
      for (var _i2 = 0, _Object$entries = Object.entries(contents); _i2 < _Object$entries.length; _i2++) {
        const [itemKey, itemProperties] = _Object$entries[_i2];
        if (!!level && !itemProperties[val]) {
          return;
        }
        const key = typeof itemKey === "string" ? itemKey : itemProperties.value;
        const template = key + level;
        const elem = new Morebits.quickForm.element({
          type: "option",
          label: "{{".concat(template, "}}: ").concat(level ? itemProperties[val].label : itemProperties.label),
          value: template
        });
        if (!selected && old_subvalue && old_subvalue_re.test(template)) {
          elem.data.selected = true;
          selected = true;
        }
        const elemRendered = container.appendChild(elem.render());
        $(elemRendered).data("messageData", itemProperties);
      }
    };
    switch (value) {
      case "singlenotice":
      case "singlewarn":
        createEntries(Twinkle.warn.messages[value], sub_group, true);
        break;
      case "singlecombined": {
        const unSortedSinglets = {
          ...Twinkle.warn.messages.singlenotice,
          ...Twinkle.warn.messages.singlewarn
        };
        const sortedSingletMessages = {};
        var _iterator3 = _createForOfIteratorHelper(Object.keys(unSortedSinglets).sort()), _step3;
        try {
          for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) {
            const key = _step3.value;
            sortedSingletMessages[key] = unSortedSinglets[key];
          }
        } catch (err) {
          _iterator3.e(err);
        } finally {
          _iterator3.f();
        }
        createEntries(sortedSingletMessages, sub_group, true);
        break;
      }
      case "custom":
        createEntries(Twinkle.getPref("customWarningList"), sub_group, true);
        break;
      case "kitchensink":
        for (var _i3 = 0, _arr = ["level1", "level2"]; _i3 < _arr.length; _i3++) {
          const lvl = _arr[_i3];
          var _iterator4 = _createForOfIteratorHelper(Twinkle.warn.messages.levels), _step4;
          try {
            for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) {
              const levelGroup = _step4.value;
              createEntries(levelGroup.list, sub_group, true, lvl);
            }
          } catch (err) {
            _iterator4.e(err);
          } finally {
            _iterator4.f();
          }
        }
        createEntries(Twinkle.warn.messages.singlenotice, sub_group, true);
        createEntries(Twinkle.warn.messages.singlewarn, sub_group, true);
        createEntries(Twinkle.getPref("customWarningList"), sub_group, true);
        break;
      case "level1":
      case "level2":
        var _iterator5 = _createForOfIteratorHelper(Twinkle.warn.messages.levels), _step5;
        try {
          for (_iterator5.s(); !(_step5 = _iterator5.n()).done; ) {
            const levelGroup = _step5.value;
            let optgroup = new Morebits.quickForm.element({
              type: "optgroup",
              label: levelGroup.category
            });
            optgroup = optgroup.render();
            sub_group.appendChild(optgroup);
            createEntries(levelGroup.list, optgroup, false);
          }
        } catch (err) {
          _iterator5.e(err);
        } finally {
          _iterator5.f();
        }
        break;
      case "autolevel": {
        const autolevelProc = () => {
          const wikitext = Twinkle.warn.talkpageObj.getPageText();
          const [latest] = Twinkle.warn.callbacks.dateProcessing(wikitext);
          const params = {
            sub_group: old_subvalue,
            article: e.target.root.article.value
          };
          const lvl = "level".concat(Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest)[1]);
          var _iterator6 = _createForOfIteratorHelper(Twinkle.warn.messages.levels), _step6;
          try {
            for (_iterator6.s(); !(_step6 = _iterator6.n()).done; ) {
              const levelGroup = _step6.value;
              let optgroup = new Morebits.quickForm.element({
                type: "optgroup",
                label: levelGroup.category
              });
              optgroup = optgroup.render();
              sub_group.appendChild(optgroup);
              createEntries(levelGroup.list, optgroup, false, lvl);
            }
          } catch (err) {
            _iterator6.e(err);
          } finally {
            _iterator6.f();
          }
          Twinkle.warn.callback.postCategoryCleanup(e);
        };
        if (Twinkle.warn.talkpageObj) {
          autolevelProc();
        } else {
          const usertalk_page = new Morebits.wiki.page("User_talk:".concat(relevantUserName), window.wgULS("加载上次警告", "載入上次警告"));
          usertalk_page.setFollowRedirect(true, false);
          usertalk_page.load((pageobj) => {
            Twinkle.warn.talkpageObj = pageobj;
            autolevelProc();
          }, () => {
            const $noTalkPageNode = $("<strong>").attr("id", "twinkle-warn-autolevel-message").css("color", "#f00").text(window.wgULS("无法加载用户讨论页,这可能是因为它是跨命名空间重定向,自动选择警告级别将不会运作。", "無法載入使用者討論頁,這可能是因為它是跨命名空間重新導向,自動選擇警告級別將不會運作。"));
            $noTalkPageNode.insertBefore($body.find("#twinkle-warn-warning-messages"));
            e.target.root.previewer.closePreview();
          });
        }
        break;
      }
      default:
        mw.notify(window.wgULS("twinklewarn:未知的警告组", "twinklewarn:未知的警告組"), {
          type: "warn",
          tag: "twinklewarn"
        });
        break;
    }
    if (value !== "autolevel") {
      $body.find("#twinkle-warn-autolevel-message").remove();
      Twinkle.warn.callback.postCategoryCleanup(e);
    }
  };
  Twinkle.warn.callback.postCategoryCleanup = (e) => {
    Morebits.quickForm.setElementTooltipVisibility(e.target.root.article, true);
    Morebits.quickForm.resetElementLabel(e.target.root.article);
    Twinkle.warn.callback.change_subcategory(e);
    if (!Twinkle.getPref("oldSelect")) {
      $body.find("select[name=sub_group]").select2({
        width: "100%",
        matcher: Morebits.select2.matchers.optgroupFull,
        templateResult: Morebits.select2.highlightSearchMatches,
        language: {
          searching: Morebits.select2.queryInterceptor
        }
      }).change(Twinkle.warn.callback.change_subcategory);
      $body.find(".select2-selection").on("keydown", Morebits.select2.autoStart).trigger("focus");
      mw.util.addCSS(
        /* Increase height;
         * Reduce padding;
         * Adjust font size.
         * */
        ".select2-container .select2-dropdown .select2-results>.select2-results__options{max-height:350px}.select2-results .select2-results__group,.select2-results .select2-results__option{padding-top:1px;padding-bottom:1px}.select2-container .select2-dropdown .select2-results,.select2-container .selection .select2-selection__rendered{font-size:13px}"
      );
    }
  };
  Twinkle.warn.callback.change_subcategory = (e) => {
    const main_group = e.target.form.main_group.value;
    const {
      value
    } = e.target.form.sub_group;
    const notLinkedArticle = {
      "uw-bite": window.wgULS("被“咬到”的用户(不含User:) ", "被「咬到」的使用者(不含User:) "),
      "uw-aiv": window.wgULS("可选输入被警告的用户名(不含User:) ", "可選輸入被警告的使用者名稱(不含User:) ")
    };
    if (["singlenotice", "singlewarn", "singlecombined", "kitchensink"].includes(main_group)) {
      if (notLinkedArticle[value]) {
        if (Twinkle.warn.prev_article === null) {
          Twinkle.warn.prev_article = e.target.form.article.value;
        }
        e.target.form.article.notArticle = true;
        e.target.form.article.value = "";
        Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);
        Morebits.quickForm.overrideElementLabel(e.target.form.article, notLinkedArticle[value]);
      } else if (e.target.form.article.notArticle) {
        if (Twinkle.warn.prev_article !== null) {
          e.target.form.article.value = Twinkle.warn.prev_article;
          Twinkle.warn.prev_article = null;
        }
        e.target.form.article.notArticle = false;
        Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, true);
        Morebits.quickForm.resetElementLabel(e.target.form.article);
      }
    }
    $body.find("#tw-warn-red-notice").remove();
  };
  Twinkle.warn.callbacks = {
    getWarningWikitext: (templateName, article, reason, isCustom, noSign) => {
      let text = "{{".concat("subst:", templateName);
      if (article) {
        text += "|1=".concat(article);
      }
      if (reason) {
        text += "|2=".concat(reason);
      }
      text += "|subst=".concat("subst:");
      if (!noSign) {
        text += "|sig=~~".concat("~~");
      }
      text += "}}";
      return text;
    },
    showPreview: (form, templatename) => {
      const input = Morebits.quickForm.getInputData(form);
      templatename || (templatename = input.sub_group);
      const linkedarticle = input.article;
      const templatetext = Twinkle.warn.callbacks.getWarningWikitext(templatename, linkedarticle, input.reason, input.main_group === "custom");
      form.previewer.beginRender(templatetext, "User_talk:".concat(relevantUserName));
    },
    // Just a pass-through unless the autolevel option was selected
    preview: (form) => {
      if (form.main_group.value === "autolevel") {
        const usertalk_page = new Morebits.wiki.page("User_talk:".concat(relevantUserName), window.wgULS("加载上次警告", "載入上次警告"));
        usertalk_page.setFollowRedirect(true, false);
        usertalk_page.load((pageobj) => {
          Twinkle.warn.talkpageObj = pageobj;
          const wikitext = pageobj.getPageText();
          const [latest] = Twinkle.warn.callbacks.dateProcessing(wikitext);
          const params = {
            sub_group: form.sub_group.value,
            article: form.article.value,
            messageData: $(form.sub_group).find('option[value="'.concat($(form.sub_group).val(), '"]')).data("messageData")
          };
          const [template] = Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest);
          Twinkle.warn.callbacks.showPreview(form, template);
          if (form.sub_group.value !== template) {
            const evt = document.createEvent("Event");
            evt.initEvent("change", true, true);
            form.main_group.dispatchEvent(evt);
          }
        });
      } else {
        Twinkle.warn.callbacks.showPreview(form);
      }
    },
    /**
     * Used in the main and autolevel loops to determine when to warn
     * about excessively recent, stale, or identical warnings.
     *
     * @param {string} wikitext  The text of a user's talk page, from getPageText()
     * @returns {Object[]} - Array of objects: latest contains most recent
     * warning and date; history lists all prior warnings
     */
    dateProcessing: (wikitext) => {
      const history_re = /<!--\s?Template:([uU]w-.*?)\s?-->.*?(\d{4})年(\d{1,2})月(\d{1,2})日 \([日一二三四五六]\) (\d{1,2}):(\d{1,2}) \(CST\)/g;
      const history = {};
      const latest = {
        date: new Morebits.date(0),
        type: ""
      };
      let current;
      while ((current = history_re.exec(wikitext)) !== null) {
        const [, template] = current;
        const current_date = new Morebits.date("".concat(current[2], "-").concat(current[3], "-").concat(current[4], " ").concat(current[5], ":").concat(current[6], " (CST)"));
        if (!(template in history) || history[template].isBefore(current_date)) {
          history[template] = current_date;
        }
        if (!latest.date.isAfter(current_date)) {
          latest.date = current_date;
          latest.type = template;
        }
      }
      return [latest, history];
    },
    /**
     * Main loop for deciding what the level should increment to. Most of
     * this is really just error catching and updating the subsequent data.
     * May produce up to two notices in a twinkle-warn-autolevel-messages div
     *
     * @param {string} wikitext  The text of a user's talk page, from getPageText() (required)
     * @param {Object} params  Params object: sub_group is the template (required);
     * article is the user-provided article (form.article) used to link ARV on recent level2 warnings;
     * messageData is only necessary if getting the full template, as it's
     * used to ensure a valid template of that level exists
     * @param {Object} latest  First element of the array returned from
     * dateProcessing. Provided here rather than processed within to avoid
     * repeated call to dateProcessing
     * @param {(Date|Morebits.date)} date  Date from which staleness is determined
     * @param {Morebits.status} statelem  Status element, only used for handling error in final execution
     *
     * @returns {Array} - Array that contains the full template and just the warning level
     */
    autolevelParseWikitext: (wikitext, params, latest, date, statelem) => {
      let level;
      if (/\d?$/.test(latest.type)) {
        level = Number.parseInt(latest.type.replace(/.*(\d)?$/, "$1"), 10);
      } else if (latest.type) {
        level = 1;
      }
      const $autolevelMessage = $("<div>").attr("id", "twinkle-warn-autolevel-message");
      if (Number.isNaN(level)) {
        level = 1;
      } else if (level > 2 || level < 1) {
        const message = window.wgULS("无法解析上次的警告层级,请手动选择一个警告层级。", "無法解析上次的警告層級,請手動選擇一個警告層級。");
        if (statelem) {
          statelem.error(message);
        } else {
          mw.notify(message, {
            type: "warn",
            tag: "twinklewarn"
          });
        }
        return;
      } else {
        date || (date = /* @__PURE__ */ new Date());
        const autoTimeout = new Morebits.date(latest.date.getTime()).add(Number.parseInt(Twinkle.getPref("autolevelStaleDays"), 10), "day");
        if (autoTimeout.isAfter(date)) {
          if (level === 2) {
            level = 2;
            if (!statelem) {
              const $link = $("<a>").attr("href", "#").text(window.wgULS("单击此处打开告状工具", "點擊此處打開告狀工具")).css("font-weight", "bold").on("click", () => {
                Morebits.wiki.actionCompleted.redirect = null;
                Twinkle.warn.dialog.close();
                Twinkle.arv.callback(relevantUserName);
                $body.find("input[name=page]").val(params.article);
                $body.find("input[value=final]").prop("checked", true);
              });
              const statusNode = $("<div>").css("color", "#f00").text(relevantUserName + window.wgULS("最后收到了一个层级2警告(", "最後收到了一個層級2警告(") + latest.type + window.wgULS("),所以将其报告给管理人员会比较好;", "),所以將其報告給管理人員會比較好;"));
              statusNode.append($link[0]);
              $autolevelMessage.append(statusNode);
            }
          } else {
            level += 1;
          }
        } else {
          level = 1;
        }
      }
      $autolevelMessage.prepend($("<div>".concat(window.wgULS("将发送", "將發送"), '<span style="font-weight: bold;">').concat(window.wgULS("层级", "層級")).concat(level, "</span>警告模板。</div>")));
      $body.find("#twinkle-warn-autolevel-message").remove();
      $autolevelMessage.insertAfter($body.find("#twinkle-warn-warning-messages"));
      let template = params.sub_group.replace(/(.*)\d$/, "$1");
      if (params.messageData && !params.messageData["level".concat(level)]) {
        template = "uw-generic";
      }
      template += level;
      return [template, level];
    },
    main: (pageobj) => {
      const text = pageobj.getPageText();
      const statelem = pageobj.getStatusElement();
      const params = pageobj.getCallbackParameters();
      let {
        messageData
      } = params;
      const warningHistory = Twinkle.warn.callbacks.dateProcessing(text);
      const [latest, history] = warningHistory;
      const now = new Morebits.date(pageobj.getLoadTime());
      Twinkle.warn.talkpageObj = pageobj;
      if (params.main_group === "autolevel") {
        const templateAndLevel = Twinkle.warn.callbacks.autolevelParseWikitext(text, params, latest, now, statelem);
        if (params.sub_group !== templateAndLevel[0] && !confirm(window.wgULS("将发送给用户{{", "將發送給使用者{{") + templateAndLevel[0] + window.wgULS("}}模板,好吗?", "}}模板,好嗎?"))) {
          statelem.error(window.wgULS("用户取消", "使用者取消"));
          return;
        }
        [params.sub_group] = templateAndLevel;
        messageData = params.messageData["level".concat(templateAndLevel[1])];
      } else if (params.sub_group in history && new Morebits.date(history[params.sub_group]).add(1, "day").isAfter(now) && !confirm(window.wgULS("近24小时内一个同样的 ", "近24小時內一個同樣的 ") + params.sub_group + window.wgULS(" 模板已被发出。\n是否继续?", " 模板已被發出。\n是否繼續?"))) {
        statelem.error(window.wgULS("用户取消", "使用者取消"));
        return;
      }
      latest.date.add(1, "minute");
      if (latest.date.isAfter(now) && !confirm(window.wgULS("近1分钟内 ", "近1分鐘內 ") + latest.type + window.wgULS(" 模板已被发出。\n是否继续?", " 模板已被發出。\n是否繼續?"))) {
        statelem.error(window.wgULS("用户取消", "使用者取消"));
        return;
      }
      const customProcess = (template) => {
        [template] = template.split("|");
        let prefix;
        switch (template.slice(-1)) {
          case "1":
            prefix = "注意";
            break;
          case "2":
            prefix = "警告";
            break;
          default:
            prefix = "提醒";
            break;
        }
        return "".concat(prefix, ":").concat(Morebits.string.toUpperCaseFirstChar(messageData.label));
      };
      let summary;
      if (params.main_group === "custom") {
        summary = customProcess(params.sub_group);
      } else {
        if (params.main_group === "kitchensink" && !/^D+$/.test(params.sub_group)) {
          let sub = params.sub_group.slice(-1);
          if (sub === "m") {
            sub = params.sub_group.slice(-3);
          }
          if (/\d/.test(sub)) {
            params.main_group = "level".concat(sub);
          }
        }
        summary = messageData.summary || messageData[params.main_group] && messageData[params.main_group].summary;
        if (!summary) {
          summary = customProcess(params.sub_group);
        }
        if (messageData.suppressArticleInSummary !== true && params.article) {
          if (params.sub_group === "uw-aiv") {
            summary += "(".concat(window.wgULS("对于", "對於"), "[[User:").concat(params.article, "]])");
          } else if (params.sub_group === "uw-bite") {
            summary += ",".concat(window.wgULS("于", "於"), "[[User talk:").concat(params.article, "]]");
          } else {
            summary += "".concat(window.wgULS(",于[[", ",於[[") + params.article, "]]");
          }
        }
      }
      pageobj.setEditSummary(summary);
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setWatchlist(Twinkle.getPref("watchWarnings"));
      const warningText = Twinkle.warn.callbacks.getWarningWikitext(params.sub_group, params.article, params.reason, params.main_group === "custom");
      let sectionExists = false;
      let sectionNumber = 0;
      if (!messageData.heading && text.length) {
        const sections = text.match(/^(==*).+\1/gm);
        if (sections && sections.length !== 0) {
          const dateHeaderRegex = now.monthHeaderRegex();
          sectionNumber = 0;
          sectionExists = sections.reverse().some((sec, idx) => {
            return /^(==)[^=].+\1/m.test(sec) && dateHeaderRegex.test(sec) && typeof (sectionNumber = sections.length - 1 - idx) === "number";
          });
        }
      }
      if (sectionExists) {
        pageobj.setPageSection(sectionNumber + 1);
        pageobj.setAppendText("\n\n".concat(warningText));
        pageobj.append();
      } else {
        if (messageData.heading) {
          pageobj.setNewSectionTitle(messageData.heading);
        } else {
          Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("未找到当月的二级标题,将创建新的", "未找到當月的二級標題,將建立新的"));
          pageobj.setNewSectionTitle(now.monthHeader(0));
        }
        pageobj.setNewSectionText(warningText);
        pageobj.newSection();
      }
    }
  };
  Twinkle.warn.callback.evaluate = (e) => {
    const userTalkPage = "User_talk:".concat(relevantUserName);
    const params = Morebits.quickForm.getInputData(e.target);
    if (params.article) {
      if (/https?:\/\//.test(params.article)) {
        mw.notify(window.wgULS("“页面链接”不能使用网址。", "「頁面連結」不能使用網址。"), {
          type: "warn",
          tag: "warn"
        });
        return;
      }
      try {
        const article = new mw.Title(params.article);
        params.article = article.getPrefixedText();
        if (article.getFragment()) {
          params.article += "#".concat(article.getFragment());
        }
      } catch {
        alert(window.wgULS("“页面链接”不合法,仅能输入一个页面名称,勿使用网址、[[ ]],可使用Special:Diff。", "「頁面連結」不合法,僅能輸入一個頁面名稱,勿使用網址、[[ ]],可使用Special:Diff。"));
        return;
      }
    }
    const $selectedEl = $(e.target.sub_group).find('option[value="'.concat($(e.target.sub_group).val(), '"]'));
    params.messageData = $selectedEl.data("messageData");
    if (params.messageData === void 0) {
      mw.notify(window.wgULS("请选择警告模板。", "請選擇警告模板。"), {
        type: "warn",
        tag: "warn"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(e.target);
    Morebits.wiki.actionCompleted.redirect = userTalkPage;
    Morebits.wiki.actionCompleted.notice = window.wgULS("警告完成,将在几秒后刷新", "警告完成,將在幾秒後重新整理");
    const ysarchives_page = new Morebits.wiki.page(userTalkPage, window.wgULS("用户讨论页修改", "使用者討論頁修改"));
    ysarchives_page.setCallbackParameters(params);
    ysarchives_page.setFollowRedirect(true, false);
    ysarchives_page.load(Twinkle.warn.callbacks.main);
  };
  Twinkle.addInitCallback(Twinkle.warn, "warn");
})(jQuery);
//! src/Twinkle/modules/twinkleblock.js
var import_ext_gadget = require("ext.gadget.Util");
/*! Twinkle.js - twinkleblock.js */
(function twinkleblock($) {
  const $body = $("body");
  const api = (0, import_ext_gadget.initMwApi)("morebits.js; Twinkle/1.1");
  let relevantUserName;
  let blockedUserName;
  const menuFormattedNamespaces = {
    ...mw.config.get("wgFormattedNamespaces")
  };
  menuFormattedNamespaces[0] = window.wgULS("(条目)", "(條目)");
  const blockActionText = {
    block: window.wgULS("封禁", "封鎖"),
    reblock: window.wgULS("重新封禁", "重新封鎖"),
    unblock: window.wgULS("解除封禁", "解除封鎖")
  };
  Twinkle.block = () => {
    relevantUserName = mw.config.get("wgRelevantUserName");
    if ((Morebits.userIsSysop || !mw.util.isIPAddress(relevantUserName, true)) && relevantUserName && (!Morebits.ip.isRange(relevantUserName) || Morebits.ip.validCIDR(relevantUserName))) {
      Twinkle.addPortletLink(Twinkle.block.callback, window.wgULS("封禁", "封鎖"), "tw-block", window.wgULS("封禁相关用户", "封鎖相關使用者"));
    }
  };
  Twinkle.block.callback = () => {
    if (relevantUserName === mw.config.get("wgUserName") && !confirm(window.wgULS("您即将对自己执行封禁相关操作!确认要继续吗?", "您即將對自己執行封鎖相關操作!確認要繼續嗎?"))) {
      return;
    }
    Twinkle.block.currentBlockInfo = void 0;
    Twinkle.block.field_block_options = {};
    Twinkle.block.field_template_options = {};
    const Window = new Morebits.simpleWindow(650, 530);
    Window.setTitle(window.wgULS("封禁或向", "封鎖或向") + relevantUserName + window.wgULS("发出封禁模板", "發出封鎖模板"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("封禁条例", "封鎖條例"), "LIB:BLOCK");
    Window.addFooterLink(window.wgULS("封禁设置", "封鎖設定"), "H:TW/PREF#block");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#block");
    const form = new Morebits.quickForm(Twinkle.block.callback.evaluate);
    const actionfield = form.append({
      type: "field",
      label: window.wgULS("操作类型", "操作類別")
    });
    actionfield.append({
      type: "checkbox",
      name: "actiontype",
      event: Twinkle.block.callback.change_action,
      list: [{
        label: window.wgULS("封禁用户", "封鎖使用者"),
        value: "block",
        tooltip: window.wgULS("用选择的选项全站封禁相关用户,若未勾选部分封禁则为全站封禁。", "用選擇的選項全站封鎖相關使用者,若未勾選部分封鎖則為全站封鎖。"),
        hidden: !Morebits.userIsSysop,
        checked: Morebits.userIsSysop
      }, {
        label: window.wgULS("部分封禁", "部分封鎖"),
        value: "partial",
        tooltip: window.wgULS("启用部分封禁及部分封禁模板。", "啟用部分封鎖及部分封鎖模板。"),
        hidden: !Morebits.userIsSysop,
        checked: Twinkle.getPref("defaultToPartialBlocks")
        // Overridden if already blocked
      }, {
        label: window.wgULS("加入封禁模板到用户讨论页", "加入封鎖模板到使用者討論頁"),
        value: "template",
        tooltip: window.wgULS("若执行封禁的管理员忘记发出封禁模板,或你封禁了用户而没有给其发出模板,则你可以用此来发出合适的模板。勾选部分封禁以使用部分封禁模板。", "若執行封鎖的管理員忘記發出封鎖模板,或你封鎖了使用者而沒有給其發出模板,則你可以用此來發出合適的模板。勾選部分封鎖以使用部分封鎖模板。"),
        // Disallow when viewing the block dialog on an IP range
        hidden: !Morebits.userIsSysop,
        checked: Morebits.userIsSysop && !Morebits.ip.isRange(relevantUserName),
        disabled: Morebits.ip.isRange(relevantUserName)
      }, {
        label: window.wgULS("标记用户页", "標記使用者頁面"),
        value: "tag",
        tooltip: window.wgULS("将用户页替换成相关的标记模板,仅限永久封禁使用。", "將使用者頁面替換成相關的標記模板,僅限永久封鎖使用。"),
        hidden: true,
        checked: !Morebits.userIsSysop
      }, {
        label: window.wgULS("保护用户页", "保護使用者頁面"),
        value: "protect",
        tooltip: window.wgULS("全保护用户页,仅限永久封禁使用。", "全保護使用者頁面,僅限永久封鎖使用。"),
        hidden: true
      }, {
        label: window.wgULS("解除封禁用户", "解除封鎖使用者"),
        value: "unblock",
        tooltip: window.wgULS("解除封禁相关用户。", "解除封鎖相關使用者。"),
        hidden: !Morebits.userIsSysop
      }]
    });
    const sixtyFour = Morebits.ip.get64(mw.config.get("wgRelevantUserName"));
    if (sixtyFour && sixtyFour !== mw.config.get("wgRelevantUserName")) {
      const block64field = form.append({
        type: "field",
        label: window.wgULS("转换为/64段封禁", "轉換為/64段封鎖"),
        name: "field_64"
      });
      block64field.append({
        type: "div",
        style: "margin-bottom: 0.5em",
        label: [wgULS("直接封禁/64段有益无害。", "直接封鎖/64段有益無害。")]
      });
      block64field.append({
        type: "checkbox",
        name: "block64",
        event: Twinkle.block.callback.change_block64,
        list: [{
          checked: Twinkle.getPref("defaultToBlock64"),
          label: window.wgULS("改成封禁/64", "改成封鎖/64"),
          value: "block64",
          tooltip: Morebits.ip.isRange(mw.config.get("wgRelevantUserName")) ? window.wgULS("将不会发送模板通知。", "將不會發送模板通知。") : window.wgULS("任何模板将会发送给原始IP:", "任何模板將會發送給原始IP:") + mw.config.get("wgRelevantUserName")
        }]
      });
    }
    form.append({
      type: "field",
      label: window.wgULS("默认", "預設"),
      name: "field_preset"
    });
    form.append({
      type: "field",
      label: window.wgULS("模板选项", "模板選項"),
      name: "field_template_options"
    });
    form.append({
      type: "field",
      label: window.wgULS("封禁选项", "封鎖選項"),
      name: "field_block_options"
    });
    form.append({
      type: "field",
      label: window.wgULS("标记用户页", "標記使用者頁面"),
      name: "field_tag_options"
    });
    form.append({
      type: "field",
      label: window.wgULS("解除封禁选项", "解除封鎖選項"),
      name: "field_unblock_options"
    });
    form.append({
      type: "submit",
      label: "提交"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    result.root = result;
    Twinkle.block.fetchUserInfo(() => {
      if (Twinkle.block.isRegistered) {
        const $form = $(result);
        Morebits.quickForm.setElementVisibility($form.find("[name=actiontype][value=tag]").parent(), true);
        if (Morebits.userIsSysop) {
          Morebits.quickForm.setElementVisibility($form.find("[name=actiontype][value=protect]").parent(), true);
        }
      }
      if (blockedUserName === relevantUserName) {
        $(result).find("[name=actiontype][value=partial]").prop("checked", Twinkle.block.currentBlockInfo.partial === "");
      }
      Twinkle.block.transformBlockPresets();
      const evt = document.createEvent("Event");
      evt.initEvent("change", true, true);
      if (result.block64 && result.block64.checked) {
        result.block64.dispatchEvent(evt);
      } else {
        result.actiontype[0].dispatchEvent(evt);
      }
    });
  };
  Twinkle.block.fetchedData = {};
  Twinkle.block.processUserInfo = (data, fn) => {
    let [blockinfo] = data.query.blocks;
    const [userinfo] = data.query.users;
    if (data.query.blocks.length > 1 && blockinfo.user !== relevantUserName) {
      [, blockinfo] = data.query.blocks;
    }
    Twinkle.block.fetchedData[userinfo.name] = data;
    Twinkle.block.isRegistered = !!userinfo.userid;
    if (Twinkle.block.isRegistered) {
      Twinkle.block.userIsBot = !!userinfo.groupmemberships && userinfo.groupmemberships.map((e) => {
        return e.group;
      }).includes("bot");
    } else {
      Twinkle.block.userIsBot = false;
    }
    if (blockinfo) {
      blockinfo.disabletalk = blockinfo.allowusertalk === void 0;
      blockinfo.hardblock = blockinfo.anononly === void 0;
    }
    Twinkle.block.currentBlockInfo = blockinfo;
    blockedUserName = Twinkle.block.currentBlockInfo && Twinkle.block.currentBlockInfo.user;
    Twinkle.block.hasBlockLog = !!data.query.logevents.length;
    Twinkle.block.blockLog = Twinkle.block.hasBlockLog && data.query.logevents;
    Twinkle.block.blockLogId = Twinkle.block.hasBlockLog ? data.query.logevents[0].logid : false;
    if (typeof fn === "function") {
      return fn();
    }
  };
  Twinkle.block.fetchUserInfo = (fn) => {
    const query = {
      format: "json",
      action: "query",
      list: "blocks|users|logevents",
      letype: "block",
      lelimit: 2,
      letitle: "User:".concat(relevantUserName),
      bkprop: "expiry|reason|flags|restrictions|range|user",
      ususers: relevantUserName
    };
    if (mw.util.isIPAddress(relevantUserName, true)) {
      query.bkip = relevantUserName;
    } else {
      query.bkusers = relevantUserName;
      query.usprop = "groupmemberships";
    }
    api.get(query).then((data) => {
      Twinkle.block.processUserInfo(data, fn);
    }, (error) => {
      Morebits.status.init($body.find('div[name="currentblock"] span').last()[0]);
      Morebits.status.warn(window.wgULS("抓取用户信息出错", "抓取使用者資訊出錯"), error);
    });
  };
  Twinkle.block.callback.saveFieldset = (fieldset) => {
    Twinkle.block[$(fieldset).prop("name")] = {};
    var _iterator7 = _createForOfIteratorHelper($(fieldset).serializeArray()), _step7;
    try {
      for (_iterator7.s(); !(_step7 = _iterator7.n()).done; ) {
        const el = _step7.value;
        Twinkle.block[$(fieldset).prop("name")][el.name] = el.value;
      }
    } catch (err) {
      _iterator7.e(err);
    } finally {
      _iterator7.f();
    }
  };
  Twinkle.block.callback.change_block64 = (e) => {
    const $form = $(e.target.form);
    const $block64 = $form.find("[name=block64]");
    const priorName = relevantUserName;
    if ($block64.is(":checked")) {
      relevantUserName = Morebits.ip.get64(mw.config.get("wgRelevantUserName"));
    } else {
      relevantUserName = mw.config.get("wgRelevantUserName");
    }
    const originalIsRange = Morebits.ip.isRange(mw.config.get("wgRelevantUserName"));
    $form.find("[name=actiontype][value=template]").prop("disabled", originalIsRange).prop("checked", !originalIsRange);
    const regenerateForm = () => {
      const titleBar = document.querySelector(".ui-dialog-title").firstChild.nextSibling;
      titleBar.nodeValue = titleBar.nodeValue.replace(priorName, relevantUserName);
      $form.find("[name=actiontype][value=partial]").prop("checked", Twinkle.getPref("defaultToPartialBlocks"));
      if (blockedUserName === relevantUserName) {
        $form.find("[name=actiontype][value=partial]").prop("checked", Twinkle.block.currentBlockInfo.partial === "");
      }
      Twinkle.block.callback.change_action(e);
    };
    if (Twinkle.block.fetchedData[relevantUserName]) {
      Twinkle.block.processUserInfo(Twinkle.block.fetchedData[relevantUserName], regenerateForm);
    } else {
      Twinkle.block.fetchUserInfo(regenerateForm);
    }
  };
  Twinkle.block.callback.change_action = (e) => {
    let field_preset;
    let field_template_options;
    let field_block_options;
    let field_tag_options;
    let field_unblock_options;
    const $form = $(e.target.form);
    const $block = $form.find("[name=actiontype][value=block]");
    let blockBox = $block.is(":checked");
    const $template = $form.find("[name=actiontype][value=template]");
    let templateBox = $template.is(":checked");
    const $tag = $form.find("[name=actiontype][value=tag]");
    const tagBox = $tag.is(":checked");
    const $protect = $form.find("[name=actiontype][value=protect]");
    const $partial = $form.find("[name=actiontype][value=partial]");
    const partialBox = $partial.is(":checked");
    const $unblock = $form.find("[name=actiontype][value=unblock]");
    const unblockBox = $unblock.is(":checked");
    let blockGroup = partialBox ? Twinkle.block.blockGroupsPartial : Twinkle.block.blockGroups;
    if (e.target.value === "unblock") {
      if (!Twinkle.block.currentBlockInfo) {
        $unblock.prop("checked", false);
        mw.notify(window.wgULS("用户没有被封禁", "使用者沒有被封鎖"), {
          type: "warn",
          tag: "twinkleblock"
        });
        return;
      }
      $block.prop("checked", false);
      blockBox = false;
      $template.prop("checked", false);
      templateBox = false;
      $tag.prop("checked", false);
      $protect.prop("checked", false);
      $partial.prop("checked", false);
    } else {
      $unblock.prop("checked", false);
    }
    $partial.prop("disabled", !blockBox && !templateBox);
    const prior = {
      label: window.wgULS("当前封禁", "目前封鎖")
    };
    if (blockedUserName === relevantUserName) {
      Twinkle.block.blockPresetsInfo.prior = Twinkle.block.currentBlockInfo;
      prior.list = [{
        label: window.wgULS("当前封禁设置", "目前封鎖設定"),
        value: "prior",
        selected: true
      }];
      if (!blockGroup.some((bg) => {
        return bg.label === prior.label;
      })) {
        blockGroup.push(prior);
      }
      if (partialBox) {
        Twinkle.block.blockPresetsInfo.prior.templateName = Morebits.string.isInfinity(Twinkle.block.currentBlockInfo.expiry) ? "uw-pblockindef" : "uw-pblock";
      } else if (Twinkle.block.isRegistered) {
        Twinkle.block.blockPresetsInfo.prior.templateName = Morebits.string.isInfinity(Twinkle.block.currentBlockInfo.expiry) ? "uw-blockindef" : "uw-block";
      } else {
        Twinkle.block.blockPresetsInfo.prior.templateName = "uw-ablock";
      }
    } else {
      blockGroup = blockGroup.filter((bg) => {
        return bg.label !== prior.label;
      });
    }
    Twinkle.block.callback.saveFieldset($body.find("[name=field_block_options]"));
    Twinkle.block.callback.saveFieldset($body.find("[name=field_template_options]"));
    Twinkle.block.callback.saveFieldset($body.find("[name=field_tag_options]"));
    Twinkle.block.callback.saveFieldset($body.find("[name=field_unblock_options]"));
    if (blockBox) {
      field_preset = new Morebits.quickForm.element({
        type: "field",
        label: window.wgULS("默认", "預設"),
        name: "field_preset"
      });
      field_preset.append({
        type: "select",
        name: "preset",
        label: window.wgULS("选择默认:", "選擇預設:"),
        event: Twinkle.block.callback.change_preset,
        list: Twinkle.block.callback.filtered_block_groups(blockGroup)
      });
      field_block_options = new Morebits.quickForm.element({
        type: "field",
        label: window.wgULS("封禁选项", "封鎖選項"),
        name: "field_block_options"
      });
      field_block_options.append({
        type: "div",
        name: "currentblock",
        label: " "
      });
      field_block_options.append({
        type: "div",
        name: "hasblocklog",
        label: " "
      });
      field_block_options.append({
        type: "select",
        name: "expiry_preset",
        label: window.wgULS("过期时间:", "過期時間:"),
        event: Twinkle.block.callback.change_expiry,
        list: [{
          label: window.wgULS("自定义", "自訂"),
          value: "custom",
          selected: true
        }, {
          label: window.wgULS("无限期", "無限期"),
          value: "infinity"
        }, {
          label: window.wgULS("3小时", "3小時"),
          value: "3 hours"
        }, {
          label: window.wgULS("12小时", "12小時"),
          value: "12 hours"
        }, {
          label: "1天",
          value: "1 day"
        }, {
          label: window.wgULS("31小时", "31小時"),
          value: "31 hours"
        }, {
          label: "2天",
          value: "2 days"
        }, {
          label: "3天",
          value: "3 days"
        }, {
          label: window.wgULS("1周", "1週"),
          value: "1 week"
        }, {
          label: window.wgULS("2周", "2週"),
          value: "2 weeks"
        }, {
          label: window.wgULS("1个月", "1個月"),
          value: "1 month"
        }, {
          label: window.wgULS("3个月", "3個月"),
          value: "3 months"
        }, {
          label: window.wgULS("6个月", "6個月"),
          value: "6 months"
        }, {
          label: "1年",
          value: "1 year"
        }, {
          label: "2年",
          value: "2 years"
        }, {
          label: "3年",
          value: "3 years"
        }]
      });
      field_block_options.append({
        type: "input",
        name: "expiry",
        label: window.wgULS("自定义过期时间", "自訂過期時間"),
        tooltip: window.wgULS("您可以使用相对时间,如“1 minute”或“19 days”;或绝对时间,“yyyymmddhhmm”(如“200602011405”是2006年2月1日14:05 UTC。)", "您可以使用相對時間,如「1 minute」或「19 days」;或絕對時間,「yyyymmddhhmm」(如「200602011405」是2006年2月1日14:05 UTC。)"),
        value: Twinkle.block.field_block_options.expiry || Twinkle.block.field_template_options.template_expiry
      });
      if (partialBox) {
        field_block_options.append({
          type: "select",
          multiple: true,
          name: "pagerestrictions",
          label: window.wgULS("页面封禁", "頁面封鎖"),
          value: "",
          tooltip: window.wgULS("最多10个页面。", "最多10個頁面。")
        });
        const ns = field_block_options.append({
          type: "select",
          multiple: true,
          name: "namespacerestrictions",
          label: window.wgULS("命名空间封禁", "命名空間封鎖"),
          value: "",
          tooltip: window.wgULS("指定封禁的命名空间。", "指定封鎖的命名空間。")
        });
        for (var _i4 = 0, _Object$entries2 = Object.entries(menuFormattedNamespaces); _i4 < _Object$entries2.length; _i4++) {
          const [number, name] = _Object$entries2[_i4];
          if (number >= 0 && number < 830) {
            ns.append({
              type: "option",
              label: name,
              value: number
            });
          }
        }
      }
      const blockoptions = [{
        checked: Twinkle.block.field_block_options.nocreate,
        label: window.wgULS("禁止创建账号", "禁止建立賬號"),
        name: "nocreate",
        value: "1"
      }, {
        checked: Twinkle.block.field_block_options.noemail,
        label: window.wgULS("电子邮件停用", "電子郵件停用"),
        name: "noemail",
        value: "1"
      }, {
        checked: Twinkle.block.field_block_options.disabletalk,
        label: window.wgULS("不能编辑自己的讨论页", "不能編輯自己的討論頁"),
        name: "disabletalk",
        value: "1",
        tooltip: partialBox ? window.wgULS("若使用部分封禁,不应选择此项,除非您也想要禁止编辑用户讨论页。", "若使用部分封鎖,不應選擇此項,除非您也想要禁止編輯使用者討論頁。") : ""
      }];
      if (Twinkle.block.isRegistered) {
        blockoptions.push({
          checked: Twinkle.block.field_block_options.autoblock,
          label: window.wgULS("自动封禁", "自動封鎖"),
          name: "autoblock",
          value: "1"
        });
      } else {
        blockoptions.push({
          checked: Twinkle.block.field_block_options.hardblock,
          label: window.wgULS("阻止登录用户使用该IP地址编辑", "阻止登入使用者使用該IP位址編輯"),
          name: "hardblock",
          value: "1"
        });
      }
      blockoptions.push({
        checked: Twinkle.block.field_block_options.watchuser,
        label: window.wgULS("监视该用户的用户页和讨论页", "監視該使用者的使用者頁面和討論頁"),
        name: "watchuser",
        value: "1"
      }, {
        checked: true,
        label: window.wgULS("标记当前的破坏中的请求", "標記當前的破壞中的請求"),
        name: "closevip",
        value: "1"
      });
      field_block_options.append({
        type: "checkbox",
        name: "blockoptions",
        list: blockoptions
      });
      field_block_options.append({
        type: "textarea",
        label: window.wgULS("理由(用于封禁日志):", "理由(用於封鎖日誌):"),
        name: "reason",
        tooltip: window.wgULS("请考虑在默认的消息中加入有用的详细信息。", "請考慮在預設的訊息中加入有用的詳細資訊。"),
        value: Twinkle.block.field_block_options.reason
      });
      field_block_options.append({
        type: "div",
        name: "filerlog_label",
        label: window.wgULS("参见:", "參見:"),
        style: "display:inline-block;font-style:normal !important",
        tooltip: window.wgULS("在封禁理由中标清特殊情况以供其他管理员参考", "在封鎖理由中標清特殊情況以供其他管理員參考")
      });
      field_block_options.append({
        type: "checkbox",
        name: "filter_see_also",
        event: Twinkle.block.callback.toggle_see_alsos,
        style: "display:inline-block; margin-right:5px",
        list: [{
          label: window.wgULS("过滤器日志", "過濾器日誌"),
          checked: false,
          value: window.wgULS("过滤器日志", "過濾器日誌")
        }]
      });
      field_block_options.append({
        type: "checkbox",
        name: "deleted_see_also",
        event: Twinkle.block.callback.toggle_see_alsos,
        style: "display:inline-block; margin-right:5px",
        list: [{
          label: window.wgULS("已删除的编辑", "已刪除的編輯"),
          checked: false,
          value: window.wgULS("已删除的编辑", "已刪除的編輯")
        }]
      });
      field_block_options.append({
        type: "checkbox",
        name: "filter_see_also",
        event: Twinkle.block.callback.toggle_see_alsos,
        style: "display:inline-block; margin-right:5px",
        list: [{
          label: window.wgULS("用户讨论页", "使用者討論頁"),
          checked: false,
          value: window.wgULS("用户讨论页", "使用者討論頁")
        }]
      });
      field_block_options.append({
        type: "checkbox",
        name: "filter_see_also",
        event: Twinkle.block.callback.toggle_see_alsos,
        style: "display:inline-block; margin-right:5px",
        list: [{
          label: window.wgULS("过去的封禁记录", "過去的封鎖記錄"),
          checked: false,
          value: window.wgULS("过去的封禁记录", "過去的封鎖記錄")
        }]
      });
      if (blockedUserName === relevantUserName) {
        field_block_options.append({
          type: "hidden",
          name: "reblock",
          value: "1"
        });
      }
    }
    if (templateBox) {
      field_template_options = new Morebits.quickForm.element({
        type: "field",
        label: window.wgULS("模板选项", "模板選項"),
        name: "field_template_options"
      });
      field_template_options.append({
        type: "select",
        name: "template",
        label: window.wgULS("选择讨论页模板:", "選擇討論頁模板:"),
        event: Twinkle.block.callback.change_template,
        list: Twinkle.block.callback.filtered_block_groups(blockGroup, true),
        value: Twinkle.block.field_template_options.template
      });
      field_template_options.append({
        type: "input",
        name: "article",
        label: window.wgULS("链接页面", "連結頁面"),
        value: "",
        tooltip: window.wgULS("可以随通知链接页面,例如破坏的目标。没有条目需要链接则请留空。", "可以隨通知連結頁面,例如破壞的目標。沒有條目需要連結則請留空。")
      });
      field_template_options.append({
        type: "input",
        name: "area",
        label: window.wgULS("封禁范围", "封鎖範圍"),
        value: "",
        tooltip: window.wgULS("阻止用户编辑的页面或命名空间的可选说明。", "阻止使用者編輯的頁面或命名空間的可選說明。")
      });
      if (!blockBox) {
        field_template_options.append({
          type: "input",
          name: "template_expiry",
          label: "封禁期限:",
          value: "",
          tooltip: window.wgULS("封禁时长,如24小时、2周、无限期等。", "封鎖時長,如24小時、2週、無限期等。")
        });
      }
      field_template_options.append({
        type: "input",
        name: "block_reason",
        label: window.wgULS("“由于……您已被封禁”", "「由於……您已被封鎖」"),
        tooltip: window.wgULS("可选的理由,用于替换默认理由。只在常规封禁模板中有效。", "可選的理由,用於替換預設理由。只在常規封鎖模板中有效。"),
        value: Twinkle.block.field_template_options.block_reason,
        size: 60
      });
      if (blockBox) {
        field_template_options.append({
          type: "checkbox",
          name: "blank_duration",
          list: [{
            label: window.wgULS("不在模板中包含封禁期限", "不在模板中包含封鎖期限"),
            checked: Twinkle.block.field_template_options.blank_duration,
            tooltip: window.wgULS("模板将会显示“一段时间”而不是具体时长", "模板將會顯示「一段時間」而不是具體時長")
          }]
        });
      } else {
        field_template_options.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("不能编辑自己的讨论页", "不能編輯自己的討論頁"),
            name: "notalk",
            checked: Twinkle.block.field_template_options.notalk,
            tooltip: window.wgULS("用此在封禁模板中指明该用户编辑讨论页的权限已被移除", "用此在封鎖模板中指明該使用者編輯討論頁的權限已被移除")
          }, {
            label: window.wgULS("不能发送电子邮件", "不能傳送電子郵件"),
            name: "noemail_template",
            checked: Twinkle.block.field_template_options.noemail_template,
            tooltip: window.wgULS("用此在封禁模板中指明该用户发送电子邮件的权限已被移除", "用此在封鎖模板中指明該使用者傳送電子郵件的權限已被移除")
          }, {
            label: window.wgULS("不能创建账号", "不能建立賬號"),
            name: "nocreate_template",
            checked: Twinkle.block.field_template_options.nocreate_template,
            tooltip: window.wgULS("用此在封禁模板中指明该用户创建账号的权限已被移除", "用此在封鎖模板中指明該使用者建立賬號的權限已被移除")
          }]
        });
      }
      const $previewlink = $('<a id="twinkleblock-preview-link">'.concat(window.wgULS("预览", "預覽"), "</a>"));
      $previewlink.off("click").on("click", () => {
        Twinkle.block.callback.preview($form[0]);
      });
      $previewlink.css({
        cursor: "pointer"
      });
      field_template_options.append({
        type: "div",
        id: "blockpreview",
        label: [$previewlink[0]]
      });
      field_template_options.append({
        type: "div",
        id: "twinkleblock-previewbox",
        style: "display: none"
      });
    }
    if (tagBox) {
      field_tag_options = new Morebits.quickForm.element({
        type: "field",
        label: window.wgULS("标记用户页", "標記使用者頁面"),
        name: "field_tag_options"
      });
      field_tag_options.append({
        type: "checkbox",
        name: "tag",
        label: window.wgULS("选择用户页模板:", "選擇使用者頁面模板:"),
        list: [{
          label: "{{Blocked user}}:".concat(window.wgULS("一般永久封禁", "一般永久封鎖")),
          value: "Blocked user"
        }, {
          label: "{{Sockpuppet}}:".concat(window.wgULS("傀儡账号", "傀儡賬號")),
          value: "Sockpuppet",
          subgroup: [{
            name: "sppUsername",
            type: "input",
            label: window.wgULS("主账号用户名:", "主賬號使用者名稱:")
          }, {
            name: "sppType",
            type: "select",
            label: window.wgULS("状态:", "狀態:"),
            list: [{
              type: "option",
              value: "blocked",
              label: "blocked - ".concat(window.wgULS("仅依行为证据认定", "僅依行為證據認定")),
              selected: true
            }, {
              type: "option",
              value: "proven",
              label: "proven - ".concat(window.wgULS("经傀儡调查确认", "經傀儡調查確認"))
            }, {
              type: "option",
              value: "confirmed",
              label: "confirmed - ".concat(window.wgULS("经查核确认", "經查核確認"))
            }]
          }, {
            name: "sppEvidence",
            type: "input",
            label: window.wgULS("根据……确定:", "根據……確定:"),
            tooltip: window.wgULS("纯文字或是带[[]]的链接,例如:[[Special:固定链接/xxxxxxxx|用户查核]]", "純文字或是帶[[]]的連結,例如:[[Special:固定链接/xxxxxxxx|用戶查核]]")
          }]
        }, {
          label: "{{Sockpuppeteer|blocked}}:".concat(window.wgULS("傀儡主账号", "傀儡主賬號")),
          value: "Sockpuppeteer",
          subgroup: [{
            type: "checkbox",
            list: [{
              name: "spmChecked",
              value: "spmChecked",
              label: window.wgULS("经用户查核确认", "經使用者查核確認")
            }]
          }, {
            name: "spmEvidence",
            type: "input",
            label: window.wgULS("额外理由:", "額外理由:")
          }]
        }]
      });
    }
    if (unblockBox) {
      field_unblock_options = new Morebits.quickForm.element({
        type: "field",
        label: window.wgULS("解除封禁选项", "解除封鎖選項"),
        name: "field_unblock_options"
      });
      field_unblock_options.append({
        type: "textarea",
        label: window.wgULS("理由(用于封禁日志):", "理由(用於封鎖日誌):"),
        name: "reason",
        value: Twinkle.block.field_unblock_options.reason
      });
    }
    let oldfield;
    if (field_preset) {
      [oldfield] = $form.find('fieldset[name="field_preset"]');
      oldfield.parentNode.replaceChild(field_preset.render(), oldfield);
    } else {
      $form.find('fieldset[name="field_preset"]').hide();
    }
    if (field_block_options) {
      [oldfield] = $form.find('fieldset[name="field_block_options"]');
      oldfield.parentNode.replaceChild(field_block_options.render(), oldfield);
      $form.find('fieldset[name="field_64"]').show();
      $form.find("[name=pagerestrictions]").select2({
        width: "100%",
        placeholder: window.wgULS("输入要阻止用户编辑的页面", "輸入要阻止使用者編輯的頁面"),
        language: {
          errorLoading: () => {
            return window.wgULS("搜索词汇不完整或无效", "搜尋詞彙不完整或無效");
          }
        },
        maximumSelectionLength: 10,
        minimumInputLength: 1,
        ajax: {
          url: mw.util.wikiScript("api"),
          dataType: "json",
          delay: 100,
          data: (params) => {
            const title = mw.Title.newFromText(params.term);
            if (!title) {
              return;
            }
            return {
              action: "query",
              format: "json",
              list: "allpages",
              apfrom: title.title,
              apnamespace: title.namespace,
              aplimit: "10"
            };
          },
          processResults: (data) => {
            return {
              results: data.query.allpages.map((page) => {
                const title = mw.Title.newFromText(page.title, page.ns).toText();
                return {
                  id: title,
                  text: title
                };
              })
            };
          }
        },
        templateSelection: (choice) => {
          return $("<a>").text(choice.text).attr({
            href: mw.util.getUrl(choice.text),
            target: "_blank",
            rel: "noopener noreferrer"
          });
        }
      });
      $form.find("[name=namespacerestrictions]").select2({
        width: "100%",
        matcher: Morebits.select2.matchers.wordBeginning,
        language: {
          searching: Morebits.select2.queryInterceptor
        },
        templateResult: Morebits.select2.highlightSearchMatches,
        placeholder: window.wgULS("选择要禁止用户编辑的命名空间", "選擇要禁止使用者編輯的命名空間")
      });
      mw.util.addCSS(
        /* Reduce padding;
         * Adjust font size;
         * Remove black border;
         * Make the tiny cross larger
         */
        ".select2-results .select2-results__option{padding-top:1px;padding-bottom:1px}.select2-container .select2-dropdown .select2-results,.select2-container .selection .select2-selection__rendered{font-size:13px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #aaa}.select2-selection__choice__remove{font-size:125%}"
      );
    } else {
      $form.find('fieldset[name="field_block_options"]').hide();
      $form.find('fieldset[name="field_64"]').hide();
      $form.find("[name=pagerestrictions]").val(null).trigger("change");
      $form.find("[name=namespacerestrictions]").val(null).trigger("change");
    }
    if (field_template_options) {
      [oldfield] = $form.find('fieldset[name="field_template_options"]');
      oldfield.parentNode.replaceChild(field_template_options.render(), oldfield);
      e.target.form.root.previewer = new Morebits.wiki.preview($(e.target.form.root).find("#twinkleblock-previewbox").last()[0]);
    } else {
      $form.find('fieldset[name="field_template_options"]').hide();
    }
    if (field_tag_options) {
      [oldfield] = $form.find('fieldset[name="field_tag_options"]');
      oldfield.parentNode.replaceChild(field_tag_options.render(), oldfield);
    } else {
      $form.find('fieldset[name="field_tag_options"]').hide();
    }
    if (field_unblock_options) {
      [oldfield] = $form.find('fieldset[name="field_unblock_options"]');
      oldfield.parentNode.replaceChild(field_unblock_options.render(), oldfield);
    } else {
      $form.find('fieldset[name="field_unblock_options"]').hide();
    }
    if (Twinkle.block.currentBlockInfo) {
      const sameUser = blockedUserName === relevantUserName;
      Morebits.status.init($body.find('div[name="currentblock"] span').last()[0]);
      let statusStr = "".concat(relevantUserName, "已被").concat(Twinkle.block.currentBlockInfo.partial === "" ? window.wgULS("部分封禁", "部分封鎖") : window.wgULS("全站封禁", "全站封鎖"));
      if (Twinkle.block.currentBlockInfo.rangestart !== Twinkle.block.currentBlockInfo.rangeend) {
        if (sameUser) {
          statusStr += window.wgULS("(段封禁)", "(段封鎖)");
        } else {
          const $rangeblockloglink = $("<span>").append($('<a rel="noopener" target="_blank" href="'.concat(mw.util.getUrl("Special:Log", {
            action: "view",
            page: blockedUserName,
            type: "block"
          }), '">').concat(Morebits.ip.get64(relevantUserName) === blockedUserName ? "/64" : blockedUserName, "</a>)")));
          statusStr += window.wgULS("(位于", "(位於") + $rangeblockloglink.html() + window.wgULS("段封禁内)", "段封鎖內)");
        }
      }
      if (Twinkle.block.currentBlockInfo.expiry === "infinity") {
        statusStr += window.wgULS("(无限期)", "(無限期)");
      } else if (new Morebits.date(Twinkle.block.currentBlockInfo.expiry).isValid()) {
        statusStr += "".concat(window.wgULS("(终止于", "(終止於") + new Morebits.date(Twinkle.block.currentBlockInfo.expiry).calendar("utc"), ")");
      }
      let infoStr = window.wgULS("此表单将", "此表單將");
      if (sameUser) {
        infoStr += window.wgULS("更改封禁", "變更封鎖");
        if (Twinkle.block.currentBlockInfo.partial === void 0 && partialBox) {
          infoStr += window.wgULS("为部分封禁", "為部分封鎖");
        } else if (Twinkle.block.currentBlockInfo.partial === "" && !partialBox) {
          infoStr += window.wgULS("为全站封禁", "為全站封鎖");
        }
        infoStr += "。";
      } else {
        infoStr += window.wgULS("加上额外的", "加上額外的") + (partialBox ? "部分" : "") + window.wgULS("封禁。", "封鎖。");
      }
      Morebits.status.warn(statusStr, infoStr);
      Twinkle.block.callback.update_form(e, Twinkle.block.currentBlockInfo);
    }
    if (Twinkle.block.hasBlockLog) {
      const blockloginfo = [];
      const $blockloglink = $("<span>").append($('<a rel="noopener" target="_blank" href="'.concat(mw.util.getUrl("Special:Log", {
        action: "view",
        page: relevantUserName,
        type: "block"
      }), '">').concat(window.wgULS("封禁日志", "封鎖日誌"), "</a>)")));
      if (Twinkle.block.currentBlockInfo) {
        blockloginfo.push(window.wgULS("封禁详情", "封鎖詳情"));
      } else {
        const [lastBlockAction] = Twinkle.block.blockLog;
        const blockAction = lastBlockAction.action === "unblock" ? Twinkle.block.blockLog[1] : lastBlockAction;
        blockloginfo.push("此".concat(Morebits.ip.isRange(relevantUserName) ? window.wgULS("IP范围", "IP範圍") : window.wgULS("用户", "使用者"), "曾在"), $("<b>".concat(new Morebits.date(blockAction.timestamp).calendar("utc"), "</b>"))[0], "被".concat(blockAction.user).concat(window.wgULS("封禁", "封鎖")), $("<b>".concat(Morebits.string.formatTime(blockAction.params.duration), "</b>"))[0]);
        if (lastBlockAction.action === "unblock") {
          blockloginfo.push(",".concat(new Morebits.date(lastBlockAction.timestamp).calendar("utc"), "解封"));
        } else {
          blockloginfo.push(",".concat(new Morebits.date(blockAction.params.expiry).calendar("utc")).concat(window.wgULS("过期", "過期")));
        }
      }
      Morebits.status.init($body.find('div[name="hasblocklog"] span').last()[0]);
      Morebits.status.warn(blockloginfo, $blockloglink[0]);
    }
    if (blockBox) {
      Twinkle.block.callback.change_preset(e);
    } else if (templateBox) {
      Twinkle.block.callback.change_template(e);
    }
  };
  Twinkle.block.blockPresetsInfo = {
    // uw-prefixed
    "uw-block": {
      autoblock: true,
      expiry: "1 day",
      forRegisteredOnly: true,
      nocreate: true,
      pageParam: true,
      reasonParam: true,
      summary: window.wgULS("封禁通知", "封鎖通知"),
      suppressArticleInSummary: true
    },
    "uw-blockindef": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      pageParam: true,
      reasonParam: true,
      summary: window.wgULS("封禁通知", "封鎖通知"),
      suppressArticleInSummary: true
    },
    "uw-blocknotalk": {
      disabletalk: true,
      pageParam: true,
      reasonParam: true,
      summary: window.wgULS("封禁通知:禁止编辑讨论页", "封鎖通知:禁止編輯討論頁"),
      suppressArticleInSummary: true
    },
    "uw-3block": {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("违反[[LIB:3RR|回退不过三原则]]", "違反[[LIB:3RR|回退不過三原則]]"),
      summary: window.wgULS("封禁通知:违反[[LIB:3RR|回退不过三原则]]", "封鎖通知:違反[[LIB:3RR|回退不過三原則]]")
    },
    "uw-adblock": {
      autoblock: true,
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("散发[[LIB:SOAP|散发广告或宣传]]", "散發[[LIB:SOAP|散發廣告或宣傳]]"),
      summary: window.wgULS("封禁通知:散发[[LIB:SOAP|散发广告或宣传]]", "封鎖通知:散發[[LIB:SOAP|散發廣告或宣傳]]")
    },
    "uw-attackblock": {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      reason: window.wgULS("[[LIB:CIV|行为无礼]]或[[LIB:NPA|人身攻击]]", "[[LIB:CIV|行為無禮]]或[[LIB:NPA|人身攻擊]]"),
      summary: window.wgULS("封禁通知:[[LIB:CIV|行为无礼]]或[[LIB:NPA|人身攻击]]", "封鎖通知:[[LIB:CIV|行為無禮]]或[[LIB:NPA|人身攻擊]]")
    },
    "uw-copyrightblock": {
      autoblock: true,
      expiry: "infinity",
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("持续[[LIB:COPYVIO|侵犯著作权]]", "持續[[LIB:COPYVIO|侵犯著作權]]"),
      summary: window.wgULS("封禁通知:持续[[LIB:COPYVIO|侵犯著作权]]", "封鎖通知:持續[[LIB:COPYVIO|侵犯著作權]]"),
      templateName: "uw-blockindef"
    },
    "uw-dblock": {
      autoblock: true,
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("持续[[LIB:VAN|删除内容]]", "持續[[LIB:VAN|刪除內容]]"),
      summary: window.wgULS("封禁通知:持续[[LIB:VAN|删除内容]]", "封鎖通知:持續[[LIB:VAN|刪除內容]]")
    },
    "uw-hblock": {
      autoblock: true,
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("[[LIB:骚扰|骚扰]]其他用户", "[[LIB:騷擾|騷擾]]其他使用者"),
      summary: window.wgULS("封禁通知:[[LIB:骚扰|骚扰]]其他用户", "封鎖通知:[[LIB:騷擾|騷擾]]其他使用者")
    },
    "uw-vblock": {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("[[LIB:VAN|破坏]]", "[[LIB:VAN|破壞]]"),
      summary: window.wgULS("封禁通知:[[LIB:VAN|破坏]]", "封鎖通知:[[LIB:VAN|破壞]]")
    },
    "uw-illegalblock": {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("持续加入不符合中国价值观的非法内容", "持續加入不符合中國價值觀的非法內容"),
      summary: window.wgULS("封禁通知:持续加入不符合中国价值观的非法内容", "封鎖通知:持續加入不符合中國價值觀的非法內容")
    },
    "uw-sockblock": {
      autoblock: true,
      expiry: "1 week",
      forRegisteredOnly: true,
      nocreate: true,
      reason: window.wgULS("滥用[[LIB:SOCK|多个账号]]", "濫用[[LIB:SOCK|多個賬號]]"),
      summary: window.wgULS("封禁通知:滥用[[LIB:SOCK|多个账号]]", "封鎖通知:濫用[[LIB:SOCK|多個賬號]]"),
      templateName: "uw-block"
    },
    // uw-u-prefixed
    "uw-ublock": {
      expiry: "infinity",
      forRegisteredOnly: true,
      reason: "{{uw-ublock}}<!-- ".concat(window.wgULS("不当用户名、软封禁", "不當使用者名稱"), " -->"),
      summary: window.wgULS("封禁通知:您的用户名违反[[LIB:U|用户名条例]]", "封鎖通知:您的使用者名稱違反[[LIB:U|使用者名稱條例]]")
    },
    "uw-ublock-illegal": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      reason: "{{uw-ublock-illegal}}<!-- ".concat(window.wgULS("不合规的用户名", "不合規的使用者名稱"), " -->"),
      summary: window.wgULS("封禁通知:您的用户名违反[[LIB:U|用户名条例]]", "封鎖通知:您的使用者名稱違反[[LIB:U|使用者名稱條例]]")
    },
    "uw-ublock-suggestive": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      reason: "{{uw-ublock-suggestive}}<!-- ".concat(window.wgULS("误导、混淆性用户名", "誤導、混淆性使用者名稱"), " -->"),
      summary: window.wgULS("封禁通知:您的用户名违反[[LIB:U|用户名条例]]", "封鎖通知:您的使用者名稱違反[[LIB:U|使用者名稱條例]]")
    },
    "uw-ublock-spam": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      reason: "{{uw-ublock-spam}}<!-- ".concat(window.wgULS("宣传性用户名或宣传性编辑", "宣傳性使用者名稱或宣傳性編輯"), " -->"),
      summary: window.wgULS("封禁通知:您的用户名违反[[LIB:U|用户名条例]]", "封鎖通知:您的使用者名稱違反[[LIB:U|使用者名稱條例]]")
    },
    // other block templates
    "range block": {
      expiry: "1 week",
      reason: "{{range block}}",
      nocreate: true,
      nonstandard: true,
      forAnonOnly: true,
      sig: "~~".concat("~~")
    },
    "blocked proxy": {
      expiry: "2 years",
      forAnonOnly: true,
      nocreate: true,
      nonstandard: true,
      hardblock: true,
      reason: "{{blocked proxy}}",
      sig: null
    },
    checkuserblock: {
      expiry: "1 week",
      forAnonOnly: true,
      nocreate: true,
      nonstandard: true,
      reason: "{{checkuserblock}}",
      sig: "~~".concat("~~")
    },
    "checkuserblock-account": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      nonstandard: true,
      reason: "{{checkuserblock-account}}",
      sig: "~~".concat("~~")
    },
    "school block": {
      expiry: "1 week",
      forAnonOnly: true,
      nocreate: true,
      nonstandard: true,
      reason: "{{school block}}",
      sig: "~~".concat("~~")
    },
    "Bot block message": {
      expiry: "infinity",
      forRegisteredOnly: true,
      reason: window.wgULS("机器人故障", "機器人故障"),
      summary: window.wgULS("封禁通知:机器人故障", "封鎖通知:機器人故障"),
      sig: "~~".concat("~~")
    },
    // other block reasons
    bioblock: {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("违反生者传记条例", "違反生者傳記條例"),
      summary: window.wgULS("封禁通知:违反生者传记条例", "封鎖通知:違反生者傳記條例"),
      templateName: "uw-vblock"
    },
    ucblock: {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("屡次增加没有[[LIB:RS|可靠来源]]的资料", "屢次增加沒有[[LIB:RS|可靠來源]]的資料"),
      summary: window.wgULS("封禁通知:屡次增加没有[[LIB:RS|可靠来源]]的资料", "封鎖通知:屢次增加沒有[[LIB:RS|可靠來源]]的資料"),
      templateName: "uw-block"
    },
    npblock: {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      pageParam: true,
      reason: window.wgULS("在条目中增加无意义文字", "在條目中增加無意義文字"),
      summary: window.wgULS("封禁通知:在条目中增加无意义文字", "封鎖通知:在條目中增加無意義文字"),
      templateName: "uw-vblock"
    },
    "point-block": {
      autoblock: true,
      expiry: "1 day",
      nocreate: true,
      pageParam: true,
      reasonParam: true,
      reason: window.wgULS("持续打制度擦边球", "持續打制度擦邊球"),
      summary: window.wgULS("封禁通知:持续打制度擦边球", "封鎖通知:持續打制度擦邊球"),
      templateName: "uw-block"
    },
    "sock-contribs": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      reasonParam: true,
      reason: window.wgULS("确认为[[LIB:SOCK|傀儡]]或真人傀儡 - 根据用户贡献确定", "確認為[[LIB:SOCK|傀儡]]或真人傀儡 - 根據使用者貢獻確定"),
      summary: window.wgULS("封禁通知:确认为[[LIB:SOCK|傀儡]]或真人傀儡", "封鎖通知:確認為[[LIB:SOCK|傀儡]]或真人傀儡"),
      templateName: "uw-blockindef"
    },
    "sock-cu": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      reasonParam: true,
      reason: window.wgULS("确认为[[LIB:SOCK|傀儡]]或真人傀儡 - 用户查核确认", "確認為[[LIB:SOCK|傀儡]]或真人傀儡 - 使用者查核確認"),
      summary: window.wgULS("封禁通知:确认为[[LIB:SOCK|傀儡]]或真人傀儡", "封鎖通知:確認為[[LIB:SOCK|傀儡]]或真人傀儡"),
      templateName: "uw-blockindef"
    },
    "uw-ublock-attack": {
      autoblock: true,
      expiry: "infinity",
      forRegisteredOnly: true,
      nocreate: true,
      reason: "{{uw-ublock-attack}}<!-- ".concat(window.wgULS("攻击性用户名", "攻擊性使用者名稱"), " -->"),
      summary: window.wgULS("封禁通知:攻击性用户名", "封鎖通知:攻擊性使用者名稱")
    },
    // Begin partial block templates, accessed in Twinkle.block.blockGroupsPartial
    "uw-pblock": {
      autoblock: true,
      expiry: "1 day",
      nocreate: false,
      pageParam: false,
      reasonParam: true,
      summary: window.wgULS("封禁通知:您已被禁止编辑有兽档案馆的部分区域", "封鎖通知:您已被禁止編輯有獸檔案館的部分區域")
    },
    "uw-pblockindef": {
      autoblock: true,
      expiry: "infinity",
      nocreate: false,
      pageParam: false,
      reasonParam: true,
      summary: window.wgULS("封禁通知:您已被永久禁止编辑有兽档案馆的部分区域", "封鎖通知:您已被永久禁止編輯有獸檔案館的部分區域")
    }
  };
  Twinkle.block.transformBlockPresets = () => {
    var _iterator8 = _createForOfIteratorHelper(Twinkle.getPref("customBlockReasonList")), _step8;
    try {
      for (_iterator8.s(); !(_step8 = _iterator8.n()).done; ) {
        const item = _step8.value;
        const newKey = "".concat(item.value, "|").concat(item.label);
        Twinkle.block.blockPresetsInfo[newKey] = {
          autoblock: true,
          nocreate: true,
          ...Twinkle.block.blockPresetsInfo[item.value],
          reason: item.label,
          templateName: item.value
        };
        if (Twinkle.block.blockPresetsInfo[item.value] === void 0) {
          Twinkle.block.blockPresetsInfo[item.value] = {
            pageParam: true,
            reasonParam: true,
            custom: true
          };
        }
      }
    } catch (err) {
      _iterator8.e(err);
    } finally {
      _iterator8.f();
    }
    for (var _i5 = 0, _Object$entries3 = Object.entries(Twinkle.block.blockPresetsInfo); _i5 < _Object$entries3.length; _i5++) {
      const [preset, settings] = _Object$entries3[_i5];
      settings.summary || (settings.summary = settings.reason);
      settings.sig = settings.sig === void 0 ? "yes" : settings.sig;
      settings.indefinite || (settings.indefinite = Morebits.string.isInfinity(settings.expiry));
      if (!Twinkle.block.isRegistered && settings.indefinite) {
        settings.expiry = "1 day";
      } else {
        settings.expiry || (settings.expiry = "1 day");
      }
      Twinkle.block.blockPresetsInfo[preset] = settings;
    }
  };
  Twinkle.block.blockGroups = [{
    label: window.wgULS("普通封禁", "普通封鎖"),
    list: [
      {
        label: window.wgULS("通用封禁(自定义理由)", "通用封鎖(自訂理由)"),
        value: "uw-block"
      },
      {
        label: window.wgULS("无限期封禁(自定义理由)", "無限期封鎖(自訂理由)"),
        value: "uw-blockindef"
      },
      {
        label: window.wgULS("禁止编辑讨论页", "禁止編輯討論頁"),
        value: "uw-blocknotalk",
        meta: true
      },
      {
        label: window.wgULS("违反回退不过三原则", "違反回退不過三原則"),
        value: "uw-3block"
      },
      {
        label: window.wgULS("散发广告或宣传", "散發廣告或宣傳"),
        value: "uw-adblock"
      },
      {
        label: window.wgULS("行为无礼或人身攻击", "行為無禮或人身攻擊"),
        value: "uw-attackblock"
      },
      {
        label: window.wgULS("多次加入侵犯著作权的内容", "多次加入侵犯著作權的內容"),
        value: "uw-copyrightblock"
      },
      {
        label: window.wgULS("无故删除内容", "無故刪除內容"),
        value: "uw-dblock"
      },
      {
        label: window.wgULS("骚扰用户", "騷擾使用者"),
        value: "uw-hblock"
      },
      {
        label: window.wgULS("破坏", "破壞"),
        value: "uw-vblock",
        selected: true
      },
      {
        label: window.wgULS("持续加入不符合中国价值观的非法内容", "持續加入不符合中國價值觀的非法內容"),
        value: "uw-illegalblock"
      },
      {
        label: window.wgULS("滥用多个账号", "濫用多個賬號"),
        value: "uw-sockblock"
      },
      // other block reasons
      {
        label: window.wgULS("违反生者传记条例", "違反生者傳記條例"),
        value: "bioblock"
      },
      {
        label: window.wgULS("屡次增加没有可靠来源的资料", "屢次增加沒有可靠來源的資料"),
        value: "ucblock"
      },
      {
        label: window.wgULS("在条目中增加无意义文字", "在條目中增加無意義文字"),
        value: "npblock"
      },
      {
        label: window.wgULS("持续打制度擦边球", "持續打制度擦邊球"),
        value: "point-block"
      },
      {
        label: window.wgULS("确认为傀儡或真人傀儡(根据用户贡献确定)", "確認為傀儡或真人傀儡(根據使用者貢獻確定)"),
        value: "sock-contribs"
      },
      {
        label: window.wgULS("确认为傀儡或真人傀儡(用户查核确认)", "確認為傀儡或真人傀儡(使用者查核確認)"),
        value: "sock-cu"
      },
      {
        label: window.wgULS("机器人发生故障并必须紧急停止", "機器人發生故障並必須緊急停止"),
        value: "Bot block message"
      }
    ]
  }, {
    custom: true,
    label: window.wgULS("自定义封禁理由", "自訂封鎖理由")
  }, {
    label: window.wgULS("用户名封禁", "使用者名稱封鎖"),
    list: [{
      label: window.wgULS("违反用户名条例", "違反使用者名稱條例"),
      value: "uw-ublock"
    }, {
      label: window.wgULS("不合规的用户名", "不合規的使用者名稱"),
      value: "uw-ublock-illegal"
    }, {
      label: window.wgULS("宣传性用户名", "宣傳性使用者名稱"),
      value: "uw-ublock-spam"
    }, {
      label: window.wgULS("攻击性用户名", "攻擊性使用者名稱"),
      value: "uw-ublock-attack"
    }, {
      label: window.wgULS("混淆性或误导性用户名", "混淆性或誤導性使用者名稱"),
      value: "uw-ublock-suggestive"
    }]
  }, {
    label: "其他模板",
    list: [{
      label: "range block",
      value: "range block",
      forAnonOnly: true
    }, {
      label: "school block",
      value: "school block",
      forAnonOnly: true
    }, {
      label: "blocked proxy",
      value: "blocked proxy",
      forAnonOnly: true
    }, {
      label: window.wgULS("用户查核封禁(主用户)", "使用者查核封鎖(主使用者)"),
      value: "checkuserblock",
      forAnonOnly: true
    }, {
      label: window.wgULS("用户查核封禁(子用户)", "使用者查核封鎖(子使用者)"),
      value: "checkuserblock-account",
      forRegisteredOnly: true
    }]
  }];
  Twinkle.block.blockGroupsPartial = [{
    label: window.wgULS("常见部分封禁理由", "常見部分封鎖理由"),
    list: [{
      label: window.wgULS("通用部分封禁(自定义理由)", "通用部分封鎖(自訂理由)"),
      value: "uw-pblock",
      selected: true
    }, {
      label: window.wgULS("无限期部分封禁(自定义理由)", "無限期部分封鎖(自訂理由)"),
      value: "uw-pblockindef"
    }]
  }];
  Twinkle.block.callback.filtered_block_groups = (group, show_template) => {
    return $.map(group, (blockGroup) => {
      if (blockGroup.custom) {
        if (show_template) {
          let templates = $.map(Twinkle.getPref("customBlockReasonList"), (item) => {
            if (Twinkle.block.blockPresetsInfo[item.value].custom) {
              return item.value;
            }
          });
          templates = Morebits.array.uniq(templates);
          blockGroup.list = $.map(templates, (template) => {
            return {
              label: window.wgULS("自定义模板", "自訂模板"),
              value: template
            };
          });
        } else {
          blockGroup.list = $.map(Twinkle.getPref("customBlockReasonList"), (item) => {
            return {
              label: item.label,
              value: "".concat(item.value, "|").concat(item.label)
            };
          });
        }
      }
      const list = $.map(blockGroup.list, (blockPreset) => {
        if (!show_template && blockPreset.meta) {
          return;
        }
        switch (blockPreset.value) {
          case "range block":
            if (!Morebits.ip.isRange(relevantUserName)) {
              return;
            }
            blockPreset.selected = !Morebits.ip.get64(relevantUserName);
            break;
          default:
            break;
        }
        const blockSettings = Twinkle.block.blockPresetsInfo[blockPreset.value];
        let registrationRestrict;
        if (blockSettings.forRegisteredOnly) {
          registrationRestrict = Twinkle.block.isRegistered;
        } else if (blockSettings.forAnonOnly) {
          registrationRestrict = !Twinkle.block.isRegistered;
        } else {
          registrationRestrict = true;
        }
        if (!(blockSettings.templateName && show_template) && registrationRestrict) {
          const templateName = blockSettings.templateName || blockPreset.value;
          return {
            label: (show_template ? "{{".concat(templateName, "}}: ") : "") + blockPreset.label,
            value: blockPreset.value,
            data: [{
              name: "template-name",
              value: templateName
            }],
            selected: !!blockPreset.selected,
            disabled: !!blockPreset.disabled
          };
        }
      });
      if (list.length) {
        return {
          label: blockGroup.label,
          list
        };
      }
    });
  };
  Twinkle.block.callback.change_preset = (e) => {
    const {
      form
    } = e.target;
    const key = form.preset.value;
    if (!key) {
      return;
    }
    Twinkle.block.callback.update_form(e, Twinkle.block.blockPresetsInfo[key]);
    if (form.template) {
      form.template.value = Twinkle.block.blockPresetsInfo[key].templateName || key;
      Twinkle.block.callback.change_template(e);
    }
  };
  Twinkle.block.callback.change_expiry = (e) => {
    const {
      expiry
    } = e.target.form;
    if (e.target.value === "custom") {
      Morebits.quickForm.setElementVisibility(expiry.parentNode, true);
    } else {
      Morebits.quickForm.setElementVisibility(expiry.parentNode, false);
      expiry.value = e.target.value;
    }
  };
  Twinkle.block.seeAlsos = [];
  Twinkle.block.callback.toggle_see_alsos = function() {
    const reason = this.form.reason.value.replace(new RegExp("(<!-- )(参见|參見)".concat(Twinkle.block.seeAlsos.join("、"), "( -->)")), "");
    Twinkle.block.seeAlsos = Twinkle.block.seeAlsos.filter((el) => {
      return el !== this.value;
    });
    if (this.checked) {
      Twinkle.block.seeAlsos.push(this.value);
    }
    const seeAlsoMessage = Twinkle.block.seeAlsos.join("、");
    if (Twinkle.block.seeAlsos.length) {
      this.form.reason.value = "".concat(reason, "<!-- ").concat(window.wgULS("参见", "參見")).concat(seeAlsoMessage, " -->");
    } else {
      this.form.reason.value = reason;
    }
  };
  Twinkle.block.callback.update_form = (e, data) => {
    const {
      form
    } = e.target;
    let {
      expiry
    } = data;
    if (!data.useInitialOptions) {
      if (Date.parse(expiry)) {
        expiry = new Date(expiry).toGMTString();
        form.expiry_preset.value = "custom";
      } else {
        form.expiry_preset.value = data.expiry || "custom";
      }
      form.expiry.value = expiry;
      if (form.expiry_preset.value === "custom") {
        Morebits.quickForm.setElementVisibility(form.expiry.parentNode, true);
      } else {
        Morebits.quickForm.setElementVisibility(form.expiry.parentNode, false);
      }
    }
    data.disabletalk = data.disabletalk === void 0 ? false : data.disabletalk;
    data.hardblock = data.hardblock === void 0 ? false : data.hardblock;
    if (Twinkle.block.userIsBot || /bot\b/i.test(relevantUserName)) {
      data.autoblock = false;
    }
    $(form).find("[name=field_block_options]").find(":checkbox").each((_i, el) => {
      if (data.useInitialOptions && data[el.name] === void 0) {
        return;
      }
      if (el.name === "closevip") {
        return;
      }
      const check = data[el.name] === "" || !!data[el.name];
      $(el).prop("checked", check);
    });
    if (data.prependReason && data.reason) {
      form.reason.value = "".concat(data.reason, ";").concat(form.reason.value);
    } else {
      form.reason.value = data.reason || "";
    }
    if (form.pagerestrictions) {
      const $pageSelect = $(form).find("[name=pagerestrictions]");
      const $namespaceSelect = $(form).find("[name=namespacerestrictions]");
      if (!data.useInitialOptions) {
        $pageSelect.val(null).trigger("change");
        $namespaceSelect.val(null).trigger("change");
      }
      if (data.restrictions) {
        if (data.restrictions.pages && !$pageSelect.val().length) {
          const pages = data.restrictions.pages.map((pr) => {
            return pr.title;
          });
          var _iterator9 = _createForOfIteratorHelper(pages), _step9;
          try {
            for (_iterator9.s(); !(_step9 = _iterator9.n()).done; ) {
              const page = _step9.value;
              if (!$pageSelect.find("option[value='".concat($.escapeSelector(page), "']")).length) {
                const newOption = new Option(page, page, true, true);
                $pageSelect.append(newOption);
              }
            }
          } catch (err) {
            _iterator9.e(err);
          } finally {
            _iterator9.f();
          }
          $pageSelect.val([...$pageSelect.val(), ...Array.isArray(pages) ? pages : [pages]]).trigger("change");
        }
        if (data.restrictions.namespaces) {
          $namespaceSelect.val([...$namespaceSelect.val(), ...Array.isArray(data.restrictions.namespaces) ? data.restrictions.namespaces : [data.restrictions.namespaces]]).trigger("change");
        }
      }
    }
  };
  Twinkle.block.callback.change_template = (e) => {
    const {
      form
    } = e.target;
    const {
      value
    } = form.template;
    const settings = Twinkle.block.blockPresetsInfo[value];
    const blockBox = $(form).find("[name=actiontype][value=block]").is(":checked");
    const partialBox = $(form).find("[name=actiontype][value=partial]").is(":checked");
    const templateBox = $(form).find("[name=actiontype][value=template]").is(":checked");
    if (!blockBox) {
      if (settings.indefinite || settings.nonstandard) {
        if (Twinkle.block.prev_template_expiry === null) {
          Twinkle.block.prev_template_expiry = form.template_expiry.value || "";
        }
        form.template_expiry.parentNode.style.display = "none";
        form.template_expiry.value = "infinity";
      } else if (form.template_expiry.parentNode.style.display === "none") {
        if (Twinkle.block.prev_template_expiry !== null) {
          form.template_expiry.value = Twinkle.block.prev_template_expiry;
          Twinkle.block.prev_template_expiry = null;
        }
        form.template_expiry.parentNode.style.display = "block";
      }
      if (Twinkle.block.prev_template_expiry) {
        form.expiry.value = Twinkle.block.prev_template_expiry;
      }
      Morebits.quickForm.setElementVisibility(form.notalk.parentNode, !settings.nonstandard);
      Morebits.quickForm.setElementVisibility(form.noemail_template.parentNode, partialBox);
      Morebits.quickForm.setElementVisibility(form.nocreate_template.parentNode, partialBox);
    } else if (templateBox) {
      Morebits.quickForm.setElementVisibility(form.blank_duration.parentNode, !settings.indefinite && !settings.nonstandard);
    }
    Morebits.quickForm.setElementVisibility(form.article.parentNode, settings && !!settings.pageParam);
    Morebits.quickForm.setElementVisibility(form.block_reason.parentNode, settings && !!settings.reasonParam);
    if (settings.reasonParam) {
      form.block_reason.value = Twinkle.block.blockPresetsInfo[form.preset.value].reason || "";
    } else {
      form.block_reason.value = "";
    }
    Morebits.quickForm.setElementVisibility(form.area.parentNode, partialBox && !blockBox);
    form.root.previewer.closePreview();
  };
  Twinkle.block.prev_template_expiry = null;
  Twinkle.block.callback.preview = (form) => {
    const params = {
      article: form.article.value,
      blank_duration: form.blank_duration ? form.blank_duration.checked : false,
      disabletalk: form.disabletalk.checked || (form.notalk ? form.notalk.checked : false),
      expiry: form.template_expiry ? form.template_expiry.value : form.expiry.value,
      hardblock: Twinkle.block.isRegistered ? form.autoblock.checked : form.hardblock.checked,
      indefinite: Morebits.string.isInfinity(form.template_expiry ? form.template_expiry.value : form.expiry.value),
      reason: form.block_reason.value,
      template: form.template.value,
      partial: $(form).find("[name=actiontype][value=partial]").is(":checked"),
      pagerestrictions: $(form.pagerestrictions).val() || [],
      namespacerestrictions: $(form.namespacerestrictions).val() || [],
      noemail: form.noemail.checked || (form.noemail_template ? form.noemail_template.checked : false),
      nocreate: form.nocreate.checked || (form.nocreate_template ? form.nocreate_template.checked : false),
      area: form.area.value
    };
    const templateText = Twinkle.block.callback.getBlockNoticeWikitext(params);
    form.previewer.beginRender(templateText, "User_talk:".concat(relevantUserName, "/Wikitext"));
  };
  Twinkle.block.callback.evaluate = (e) => {
    var _templateoptions;
    const params = Morebits.quickForm.getInputData(e.target);
    const $form = $(e.target);
    const toBlock = $form.find("[name=actiontype][value=block]").is(":checked");
    const toWarn = $form.find("[name=actiontype][value=template]").is(":checked");
    const toPartial = $form.find("[name=actiontype][value=partial]").is(":checked");
    const toTag = $form.find("[name=actiontype][value=tag]").is(":checked");
    const toProtect = $form.find("[name=actiontype][value=protect]").is(":checked");
    const toUnblock = $form.find("[name=actiontype][value=unblock]").is(":checked");
    let blockoptions = {};
    let templateoptions = {};
    let unblockoptions = {};
    Twinkle.block.callback.saveFieldset($form.find("[name=field_block_options]"));
    Twinkle.block.callback.saveFieldset($form.find("[name=field_template_options]"));
    Twinkle.block.callback.saveFieldset($form.find("[name=field_tag_options]"));
    Twinkle.block.callback.saveFieldset($form.find("[name=field_unblock_options]"));
    blockoptions = Twinkle.block.field_block_options;
    unblockoptions = Twinkle.block.field_unblock_options;
    const toClosevip = !!blockoptions.closevip;
    templateoptions = Twinkle.block.field_template_options;
    templateoptions.disabletalk = !!(templateoptions.disabletalk || blockoptions.disabletalk);
    templateoptions.hardblock = !!blockoptions.hardblock;
    delete blockoptions.expiry_preset;
    delete blockoptions.closevip;
    if (toPartial) {
      blockoptions.partial = true;
      templateoptions.partial = true;
    }
    templateoptions.pagerestrictions = $form.find("[name=pagerestrictions]").val() || [];
    templateoptions.namespacerestrictions = $form.find("[name=namespacerestrictions]").val() || [];
    blockoptions.pagerestrictions = templateoptions.pagerestrictions.join("|");
    blockoptions.namespacerestrictions = templateoptions.namespacerestrictions.join("|");
    (_templateoptions = templateoptions).summary || (_templateoptions.summary = blockoptions.reason);
    templateoptions.expiry = templateoptions.template_expiry || blockoptions.expiry;
    templateoptions.preset = toBlock ? params.preset : null;
    const checkIncompatible = (conflicts, extra) => {
      const count = conflicts.reduce((sum, tag) => {
        return sum += params.tag.includes(tag);
      }, 0);
      if (count > 1) {
        let message = "".concat(window.wgULS("请在以下标签中择一使用", "請在以下標籤中擇一使用"), ":{{").concat(conflicts.join("}}、{{"), "}}。");
        message += extra || "";
        mw.notify(message, {
          type: "warn",
          tag: "twinkleblock"
        });
        return true;
      }
    };
    if (toTag) {
      if (params.tag.length === 0) {
        mw.notify(window.wgULS("请至少选择一个用户页标记!", "請至少選擇一個使用者頁面標記!"), {
          type: "warn",
          tag: "twinkleblock"
        });
        return;
      }
      if (checkIncompatible(["Blocked user", "Sockpuppet"], window.wgULS("{{Sockpuppet}}已涵盖{{Blocked user}}的功能。", "{{Sockpuppet}}已涵蓋{{Blocked user}}的功能。"))) {
        return;
      }
      if (checkIncompatible(["Blocked user", "Sockpuppeteer"], window.wgULS("{{Sockpuppeteer}}已涵盖{{Blocked user}}的功能。", "{{Sockpuppeteer}}已涵蓋{{Blocked user}}的功能。"))) {
        return;
      }
      if (checkIncompatible(["Sockpuppet", "Sockpuppeteer"], window.wgULS("请从主账号和分身账号中选择一个。", "請從主賬號和分身賬號中選擇一個。"))) {
        return;
      }
      if (params.tag.includes("Sockpuppet") && params.sppUsername.trim() === "") {
        mw.notify(window.wgULS("请提供傀儡账号的主账号用户名!", "請提供傀儡賬號的主賬號使用者名稱!"), {
          type: "warn",
          tag: "twinkleblock"
        });
        return;
      }
    }
    if (toBlock) {
      if (blockoptions.partial) {
        if (blockoptions.disabletalk && !blockoptions.namespacerestrictions.includes("3")) {
          mw.notify(window.wgULS("部分封禁无法阻止编辑自己的讨论页,除非也封禁了User talk命名空间!", "部分封鎖無法阻止編輯自己的討論頁,除非也封鎖了User talk命名空間!"), {
            type: "warn",
            tag: "twinkleblock"
          });
          return;
        }
        if (!blockoptions.namespacerestrictions && !blockoptions.pagerestrictions) {
          if (!blockoptions.noemail && !blockoptions.nocreate) {
            mw.notify(window.wgULS("没有选择页面或命名空间,也没有停用电子邮件或禁止创建账号;请选择至少一个选项以应用部分封禁!", "沒有選擇頁面或命名空間,也沒有停用電子郵件或禁止建立賬號;請選擇至少一個選項以應用部分封鎖!"), {
              type: "warn",
              tag: "twinkleblock"
            });
            return;
          } else if (!confirm(window.wgULS("您将要进行封禁,但没有阻止任何页面或命名空间的编辑,确定要继续?", "您將要進行封鎖,但沒有阻止任何頁面或命名空間的編輯,確定要繼續?"))) {
            return;
          }
        }
      }
      if (!blockoptions.expiry) {
        mw.notify(window.wgULS("请提供过期时间!", "請提供過期時間!"), {
          type: "warn",
          tag: "twinkleblock"
        });
        return;
      } else if (Morebits.string.isInfinity(blockoptions.expiry) && !Twinkle.block.isRegistered) {
        mw.notify(window.wgULS("禁止无限期封禁IP地址!", "禁止無限期封鎖IP位址!"), {
          type: "warn",
          tag: "twinkleblock"
        });
        return;
      }
      if (!blockoptions.reason) {
        mw.notify(window.wgULS("请提供封禁理由!", "請提供封鎖理由!"), {
          type: "warn",
          tag: "twinkleblock"
        });
        return;
      }
      Morebits.simpleWindow.setButtonsEnabled(false);
      Morebits.status.init(e.target);
      const statusElement = new Morebits.status(window.wgULS("执行封禁", "執行封鎖"));
      blockoptions.action = "block";
      blockoptions.user = relevantUserName;
      blockoptions.anononly = blockoptions.hardblock ? void 0 : true;
      blockoptions.allowusertalk = blockoptions.disabletalk ? void 0 : true;
      const query = {
        format: "json",
        action: "query",
        list: "blocks|logevents",
        letype: "block",
        lelimit: 1,
        letitle: "User:".concat(blockoptions.user)
      };
      if (mw.util.isIPAddress(blockoptions.user, true)) {
        query.bkip = blockoptions.user;
      } else {
        query.bkusers = blockoptions.user;
        query.list += "|users";
        query.usprop = "groups";
        query.ususers = blockoptions.user;
        query.meta = "tokens";
        query.type = "userrights";
      }
      api.get(query).then((data) => {
        let [block] = data.query.blocks;
        if (data.query.blocks.length > 1 && block.user !== relevantUserName) {
          [, block] = data.query.blocks;
        }
        const [logevents] = data.query.logevents;
        const user = data.query.users ? data.query.users[0] : null;
        const logid = data.query.logevents.length ? logevents.logid : false;
        if (logid !== Twinkle.block.blockLogId || !!block !== !!Twinkle.block.currentBlockInfo) {
          let message = blockoptions.user + window.wgULS("的封禁状态已被修改。", "的封鎖狀態已被修改。");
          if (block) {
            message += window.wgULS("新状态:", "新狀態:");
          } else {
            message += window.wgULS("最新日志:", "最新日誌:");
          }
          let logExpiry = "";
          if (logevents.params.duration) {
            if (logevents.params.duration === "infinity") {
              logExpiry = window.wgULS("无限期", "無限期");
            } else {
              const expiryDate = new Morebits.date(logevents.params.expiry);
              logExpiry += (expiryDate.isBefore(/* @__PURE__ */ new Date()) ? window.wgULS("过期于", "過期於") : "直到") + expiryDate.calendar();
            }
          } else {
            logExpiry = "於".concat(new Morebits.date(logevents.timestamp).calendar());
          }
          message += "由".concat(logevents.user).concat(window.wgULS("以“", "以「")).concat(logevents.comment).concat(window.wgULS("”", "」")).concat(blockActionText[logevents.action]).concat(logExpiry).concat(window.wgULS(",你想要以你的设置更改封禁吗?", ",你想要以你的設定變更封鎖嗎?"));
          if (!confirm(message)) {
            Morebits.status.info(window.wgULS("执行封禁", "執行封鎖"), window.wgULS("用户取消操作", "使用者取消操作"));
            return;
          }
          blockoptions.reblock = 1;
        }
        const groupsCanBeRemoved = ["autopatrolled", "confirmed", "rnrsverify-exempt", "massmessage-sender", "patroller", "templateeditor", "importer"];
        let groupsToBeRemoved = [];
        if (user && Morebits.string.isInfinity(blockoptions.expiry)) {
          groupsToBeRemoved = user.groups.filter((group) => {
            return groupsCanBeRemoved.includes(group);
          });
        }
        blockoptions.tags = Twinkle.changeTags;
        blockoptions.token = mw.user.tokens.get("csrfToken");
        const mbApi = new Morebits.wiki.api(window.wgULS("执行封禁", "執行封鎖"), blockoptions, () => {
          statusElement.info("完成");
          if (toWarn) {
            Twinkle.block.callback.issue_template(templateoptions);
          }
          if (toClosevip) {
            const vipPage = new Morebits.wiki.page("LIB_talk:报告当前破坏", window.wgULS("关闭请求", "關閉請求"));
            vipPage.setFollowRedirect(true);
            vipPage.setCallbackParameters(blockoptions);
            vipPage.load(Twinkle.block.callback.closeRequest);
          }
          if (groupsToBeRemoved.length > 0) {
            const rightStatusElement = new Morebits.status(window.wgULS("移除权限", "移除權限"));
            if (confirm(window.wgULS("该用户有以下权限:", "該使用者有以下權限:") + groupsToBeRemoved.join("、") + window.wgULS(",您是否想要同时移除这些权限?", ",您是否想要同時移除這些權限?"))) {
              const revokeOptions = {
                action: "userrights",
                user: blockoptions.user,
                remove: groupsToBeRemoved.join("|"),
                reason: window.wgULS("用户已被无限期封禁", "使用者已被無限期封鎖"),
                token: data.query.tokens.userrightstoken,
                tags: Twinkle.changeTags
              };
              const mrApi = new Morebits.wiki.api(window.wgULS("移除权限", "移除權限"), revokeOptions, () => {
                rightStatusElement.info("已移除".concat(groupsToBeRemoved.join("、")));
              });
              mrApi.post();
            } else {
              rightStatusElement.error(window.wgULS("用户取消操作。", "使用者取消操作。"));
            }
          }
        });
        mbApi.post();
      });
    } else if (toWarn) {
      Morebits.simpleWindow.setButtonsEnabled(false);
      Morebits.status.init(e.target);
      Twinkle.block.callback.issue_template(templateoptions);
    }
    if (toTag || toProtect) {
      Morebits.simpleWindow.setButtonsEnabled(false);
      Morebits.status.init(e.target);
      const userPage = "User:".concat(mw.config.get("wgRelevantUserName"));
      const ysarchives_page = new Morebits.wiki.page(userPage, window.wgULS("标记或保护用户页", "標記或保護使用者頁面"));
      ysarchives_page.setCallbackParameters(params);
      ysarchives_page.load(Twinkle.block.callback.taguserpage);
    }
    if (toUnblock) {
      if (!unblockoptions.reason) {
        mw.notify(window.wgULS("请提供解除封禁理由!", "請提供解除封鎖理由!"), {
          type: "warn",
          tag: "twinkleblock"
        });
        return;
      }
      Morebits.simpleWindow.setButtonsEnabled(false);
      Morebits.status.init(e.target);
      const unblockStatusElement = new Morebits.status(window.wgULS("执行解除封禁", "執行解除封鎖"));
      unblockoptions.action = "unblock";
      unblockoptions.user = mw.config.get("wgRelevantUserName");
      unblockoptions.tags = Twinkle.changeTags;
      unblockoptions.token = mw.user.tokens.get("csrfToken");
      const unblockMbApi = new Morebits.wiki.api(window.wgULS("执行解除封禁", "執行解除封鎖"), unblockoptions, () => {
        unblockStatusElement.info("完成");
      });
      unblockMbApi.post();
    }
    if (!toBlock && !toWarn && !toTag && !toProtect && !toUnblock) {
      mw.notify(window.wgULS("请给Twinkle点事做!", "請給Twinkle點事做!"), {
        type: "warn",
        tag: "twinkleblock"
      });
    }
  };
  Twinkle.block.callback.taguserpage = (pageobj) => {
    const params = pageobj.getCallbackParameters();
    const statelem = pageobj.getStatusElement();
    if (params.actiontype.includes("tag")) {
      const tags = [];
      var _iterator10 = _createForOfIteratorHelper(params.tag), _step10;
      try {
        for (_iterator10.s(); !(_step10 = _iterator10.n()).done; ) {
          const tag = _step10.value;
          let tagtext = "{{".concat(tag);
          switch (tag) {
            case "Blocked user":
              break;
            case "Sockpuppet":
              tagtext += "\n| 1 = ".concat(params.sppUsername.trim());
              tagtext += "\n| 2 = ".concat(params.sppType.trim());
              if (params.sppEvidence.trim()) {
                tagtext += "\n| evidence = ".concat(params.sppEvidence.trim());
              }
              tagtext += "\n| locked = no";
              tagtext += "\n| notblocked = no";
              tagtext += "\n";
              break;
            case "Sockpuppeteer":
              tagtext += "\n| 1 = blocked";
              tagtext += "\n| checked = ".concat(params.spmChecked ? "yes" : "");
              if (params.spmEvidence.trim()) {
                tagtext += "\n| evidence = ".concat(params.spmEvidence.trim());
              }
              tagtext += "\n";
              break;
            default:
              mw.notify(window.wgULS("未知的用户页模板!", "未知的使用者頁面模板!"), {
                type: "warn",
                tag: "twinkleblock"
              });
              continue;
          }
          tagtext += "}}";
          tags.push(tagtext);
        }
      } catch (err) {
        _iterator10.e(err);
      } finally {
        _iterator10.f();
      }
      const text = tags.join("\n");
      pageobj.setPageText(text);
      pageobj.setEditSummary(window.wgULS("标记被永久封禁的用户页", "標記被永久封鎖的使用者頁面"));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.save(() => {
        Morebits.status.info(window.wgULS("标记用户页", "標記使用者頁面"), "完成");
        statelem.status(window.wgULS("正在保护页面", "正在保護頁面"));
        pageobj.load(Twinkle.block.callback.protectuserpage);
      });
    } else {
      Twinkle.block.callback.protectuserpage(pageobj);
    }
  };
  Twinkle.block.callback.protectuserpage = (pageobj) => {
    const params = pageobj.getCallbackParameters();
    const statelem = pageobj.getStatusElement();
    if (params.actiontype.includes("protect")) {
      if (pageobj.exists()) {
        pageobj.setEditProtection("sysop", "indefinite");
        pageobj.setMoveProtection("sysop", "indefinite");
      } else {
        pageobj.setCreateProtection("sysop", "indefinite");
      }
      pageobj.setEditSummary(window.wgULS("被永久封禁的用户页", "被永久封鎖的使用者頁面"));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.protect(() => {
        Morebits.status.info(window.wgULS("保护用户页", "保護使用者頁面"), pageobj.exists() ? window.wgULS("已全保护", "已全保護") : window.wgULS("已白纸保护", "已白紙保護"));
        statelem.info("全部完成");
      });
    } else {
      statelem.info("全部完成");
    }
  };
  Twinkle.block.callback.issue_template = (formData) => {
    const userTalkPage = "User_talk:".concat(mw.config.get("wgRelevantUserName"));
    const params = {
      ...formData,
      messageData: Twinkle.block.blockPresetsInfo[formData.template],
      usertalk_summary: Twinkle.block.blockPresetsInfo[formData.preset || formData.template].summary,
      reason: Twinkle.block.field_template_options.block_reason,
      disabletalk: Twinkle.block.field_template_options.notalk,
      noemail: Twinkle.block.field_template_options.noemail_template,
      nocreate: Twinkle.block.field_template_options.nocreate_template
    };
    Morebits.wiki.actionCompleted.redirect = userTalkPage;
    Morebits.wiki.actionCompleted.notice = window.wgULS("完成,将在几秒后加载用户讨论页", "完成,將在幾秒後載入使用者討論頁");
    const ysarchives_page = new Morebits.wiki.page(userTalkPage, window.wgULS("用户讨论页修改", "使用者討論頁修改"));
    ysarchives_page.setCallbackParameters(params);
    ysarchives_page.load(Twinkle.block.callback.main);
  };
  Twinkle.block.callback.closeRequest = (vipPage) => {
    const params = vipPage.getCallbackParameters();
    let text = vipPage.getPageText();
    const statusElement = vipPage.getStatusElement();
    const userName = mw.config.get("wgRelevantUserName");
    const expiryText = Morebits.string.formatTime(params.expiry);
    const comment = "{{Blocked|".concat(Morebits.string.isInfinity(params.expiry) ? "indef" : expiryText, "}}。");
    const requestList = text.split(/(?=\n===.+===\s*\n)/);
    let found = false;
    let hidename = false;
    const vipRe = new RegExp("{{\\s*[Vv]andal\\s*\\|\\s*(1\\s*=\\s*)?".concat(Morebits.pageNameRegex(userName), "\\s*(\\|\\s*hidename\\s*=[^|]+)?}}"), "m");
    for (let i = 1; i < requestList.length; i++) {
      if (vipRe.exec(requestList[i])) {
        hidename = /\|\s*hidename\s*=[^|]+/.test(requestList[i]);
        requestList[i] = requestList[i].trimEnd();
        let newText = requestList[i].replace(/^(\*\s*处理:)[ \t]*(<!-- 非管理員僅可標記已執行的封禁,針對提報的意見請放在下一行 -->)?[ \t]*$/m, "$1".concat(comment, "--~~").concat("~~"));
        if (requestList[i] === newText) {
          newText = "".concat(requestList[i], "\n* 处理:").concat(comment, "--~~").concat("~~");
        }
        requestList[i] = "".concat(newText, "\n");
        found = true;
        break;
      }
    }
    if (!found) {
      statusElement.warn(window.wgULS("没有找到相关的请求", "沒有找到相關的請求"));
      return;
    }
    text = requestList.join("");
    let summary;
    if (hidename) {
      summary = window.wgULS("标记为已处理", "標記為已處理");
    } else {
      summary = "/* ".concat(userName, " */ ");
      if (Morebits.string.isInfinity(params.expiry)) {
        summary += window.wgULS("不限期封禁", "不限期封鎖");
      } else {
        summary += window.wgULS("封禁", "封鎖") + expiryText;
      }
    }
    vipPage.setEditSummary(summary);
    vipPage.setChangeTags(Twinkle.changeTags);
    vipPage.setPageText(text);
    vipPage.save();
  };
  Twinkle.block.callback.getBlockNoticeWikitext = (params) => {
    let text = "{{";
    const settings = Twinkle.block.blockPresetsInfo[params.template];
    if (settings.nonstandard) {
      text += params.template;
    } else {
      text += "subst:".concat(params.template);
      if (params.article && settings.pageParam) {
        text += "|page=".concat(params.article);
      }
      if (!/te?mp|^\s*$|min/.exec(params.expiry)) {
        if (params.indefinite) {
          text += "|indef=yes";
        } else if (!params.blank_duration) {
          text += "|time=".concat(Morebits.string.formatTime(params.expiry));
        }
      }
      if (!Twinkle.block.isRegistered && !params.hardblock) {
        text += "|anon=yes";
      }
      if (params.reason) {
        text += "|reason=".concat(params.reason);
      }
      if (params.disabletalk) {
        text += "|notalk=yes";
      }
      if (params.partial) {
        if (params.pagerestrictions.length || params.namespacerestrictions.length) {
          const makeSentence = (array) => {
            if (array.length < 3) {
              return array.join("和");
            }
            const last = array.pop();
            return "".concat(array.join("、"), "和").concat(last);
          };
          text += "|area=某些";
          if (params.pagerestrictions.length) {
            text += "頁面(".concat(makeSentence(params.pagerestrictions.map((p) => {
              return "[[:".concat(p, "]]");
            })));
            text += params.namespacerestrictions.length ? ")和某些" : ")";
          }
          if (params.namespacerestrictions.length) {
            const namespaceNames = params.namespacerestrictions.map((id) => {
              return menuFormattedNamespaces[id];
            });
            text += "".concat(window.wgULS("[[Help:命名空间|命名空间]](", "[[Help:命名空間|命名空間]](") + makeSentence(namespaceNames), ")");
          }
        } else if (params.area) {
          text += "|area=".concat(params.area);
        } else {
          if (params.noemail) {
            text += "|email=yes";
          }
          if (params.nocreate) {
            text += "|accountcreate=yes";
          }
        }
      }
    }
    if (settings.sig) {
      text += "|sig=".concat(settings.sig);
    }
    return "".concat(text, "}}");
  };
  Twinkle.block.callback.main = (pageobj) => {
    const params = pageobj.getCallbackParameters();
    const date = new Morebits.date(pageobj.getLoadTime());
    const {
      messageData
    } = params;
    let text;
    params.indefinite = Morebits.string.isInfinity(params.expiry);
    if (Twinkle.getPref("blankTalkpageOnIndefBlock") && params.template !== "uw-lblock" && params.indefinite) {
      Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("根据参数设置清空讨论页并为日期创建新2级标题", "根據偏好設定清空討論頁並為日期建立新2級標題"));
      text = "".concat(date.monthHeader(), "\n");
    } else {
      text = pageobj.getPageText();
      const dateHeaderRegex = date.monthHeaderRegex();
      let dateHeaderRegexLast;
      let dateHeaderRegexResult;
      while ((dateHeaderRegexLast = dateHeaderRegex.exec(text)) !== null) {
        dateHeaderRegexResult = dateHeaderRegexLast;
      }
      const lastHeaderIndex = text.lastIndexOf("\n==") + 1;
      if (text.length > 0) {
        text += "\n\n";
      }
      if (!dateHeaderRegexResult || dateHeaderRegexResult.index !== lastHeaderIndex) {
        Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("未找到当月的二级标题,将创建新的", "未找到當月的二級標題,將建立新的"));
        text += "".concat(date.monthHeader(), "\n");
      }
    }
    params.expiry = params.template_expiry === void 0 ? params.expiry : params.template_expiry;
    text += Twinkle.block.callback.getBlockNoticeWikitext(params);
    let summary = params.usertalk_summary;
    if (messageData.suppressArticleInSummary !== true && params.article) {
      summary += "".concat(window.wgULS(",于", ",於"), "[[:").concat(params.article, "]]");
    }
    pageobj.setPageText(text);
    pageobj.setEditSummary(summary);
    pageobj.setChangeTags(Twinkle.changeTags);
    pageobj.setWatchlist(Twinkle.getPref("watchBlockNotices"));
    pageobj.save();
  };
  Twinkle.addInitCallback(Twinkle.block, "block");
})(jQuery);
//! src/Twinkle/modules/friendlytalkback.js
/*! Twinkle.js - friendlytalkback.js */
(function friendlytalkback($) {
  const $body = $("body");
  Twinkle.talkback = () => {
    if (!mw.config.get("wgRelevantUserName")) {
      return;
    }
    Twinkle.addPortletLink(Twinkle.talkback.callback, "通告", "friendly-talkback", window.wgULS("回复通告", "回覆通告"));
  };
  Twinkle.talkback.callback = () => {
    if (mw.config.get("wgRelevantUserName") === mw.config.get("wgUserName") && !confirm(window.wgULS("您寂寞到了要自己回复自己的程度么?", "您寂寞到了要自己回覆自己的程度麼?"))) {
      return;
    }
    const Window = new Morebits.simpleWindow(600, 350);
    Window.setTitle(window.wgULS("回复通告", "回覆通告"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("关于{{talkback}}", "關於{{talkback}}"), "Template:Talkback");
    Window.addFooterLink(window.wgULS("通告设置", "通告設定"), "H:TW/PREF#talkback");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#talkback");
    const form = new Morebits.quickForm(Twinkle.talkback.evaluate);
    form.append({
      type: "radio",
      name: "tbtarget",
      list: [{
        label: window.wgULS("回复:我的讨论页", "回覆:我的討論頁"),
        value: "mytalk",
        checked: "true"
      }, {
        label: window.wgULS("回复:其他用户的讨论页", "回覆:其他使用者的討論頁"),
        value: "usertalk"
      }, {
        label: window.wgULS("回复:其它页面", "回覆:其它頁面"),
        value: "other"
      }, {
        label: window.wgULS("邀请讨论", "邀請討論"),
        value: "see"
      }, {
        label: "通告板通知",
        value: "notice"
      }, {
        label: window.wgULS("“有新邮件”", "「有新郵件」"),
        value: "mail"
      }],
      event: Twinkle.talkback.changeTarget
    });
    form.append({
      type: "field",
      label: "工作区",
      name: "work_area"
    });
    const previewlink = document.createElement("a");
    $(previewlink).on("click", () => {
      Twinkle.talkback.preview(result);
    });
    previewlink.style.cursor = "pointer";
    previewlink.textContent = window.wgULS("预览", "預覽");
    form.append({
      type: "div",
      id: "talkbackpreview",
      label: [previewlink]
    });
    form.append({
      type: "div",
      id: "friendlytalkback-previewbox",
      style: "display: none"
    });
    form.append({
      type: "submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    result.previewer = new Morebits.wiki.preview($(result).find("div#friendlytalkback-previewbox").last()[0]);
    const evt = document.createEvent("Event");
    evt.initEvent("change", true, true);
    result.tbtarget[0].dispatchEvent(evt);
    const query = {
      action: "query",
      prop: "extlinks",
      titles: "User talk:".concat(mw.config.get("wgRelevantUserName")),
      elquery: "userjs.invalid/noTalkback",
      ellimit: "1"
    };
    const ysarchives_api = new Morebits.wiki.api(window.wgULS("抓取退出通告信息", "抓取退出通告資訊"), query, Twinkle.talkback.callback.optoutStatus);
    ysarchives_api.post();
  };
  Twinkle.talkback.optout = "";
  Twinkle.talkback.callback.optoutStatus = (apiobj) => {
    const $el = $(apiobj.getXML()).find("el");
    if ($el.length) {
      Twinkle.talkback.optout = mw.config.get("wgRelevantUserName") + window.wgULS("不希望收到回复通告", "不希望收到回覆通告");
      const url = $el.text();
      const reason = mw.util.getParamValue("reason", url);
      Twinkle.talkback.optout += reason ? ":".concat(Morebits.string.appendPunctuation(reason)) : "。";
    }
    $body.find("#twinkle-talkback-optout-message").text(Twinkle.talkback.optout);
  };
  let prev_page = "";
  let prev_section = "";
  let prev_message = "";
  Twinkle.talkback.changeTarget = (e) => {
    const value = e.target.values;
    const root = e.target.form;
    const [old_area] = Morebits.quickForm.getElements(root, "work_area");
    if (root.section) {
      prev_section = root.section.value;
    }
    if (root.message) {
      prev_message = root.message.value;
    }
    if (root.page) {
      prev_page = root.page.value;
    }
    let work_area = new Morebits.quickForm.element({
      type: "field",
      label: window.wgULS("回复通告信息", "回覆通告資訊"),
      name: "work_area"
    });
    root.previewer.closePreview();
    switch (value) {
      case "usertalk":
        work_area.append({
          type: "div",
          label: "",
          style: "color: #f00",
          id: "twinkle-talkback-optout-message"
        });
        work_area.append({
          type: "input",
          name: "page",
          label: window.wgULS("用户(必填)", "使用者(必填)"),
          tooltip: window.wgULS("您留言页面的用户名,必填。", "您留言頁面的使用者名稱,必填。"),
          value: prev_page,
          required: true
        });
        work_area.append({
          type: "input",
          name: "section",
          label: window.wgULS("章节(可选)", "章節(可選)"),
          tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
          value: prev_section
        });
        break;
      case "notice": {
        const noticeboard = work_area.append({
          type: "select",
          name: "noticeboard",
          label: "通告板:"
        });
        for (var _i6 = 0, _Object$entries4 = Object.entries(Twinkle.talkback.noticeboards); _i6 < _Object$entries4.length; _i6++) {
          const [nbname, data] = _Object$entries4[_i6];
          noticeboard.append({
            type: "option",
            label: data.label,
            value: nbname,
            selected: !!data.defaultSelected
          });
        }
        work_area.append({
          type: "input",
          name: "section",
          label: window.wgULS("章节(可选)", "章節(可選)"),
          tooltip: window.wgULS("章节标题,留空则不会产生章节链接。", "章節標題,留空則不會產生章節連結。"),
          value: prev_section
        });
        break;
      }
      case "other":
        work_area.append({
          type: "div",
          label: "",
          style: "color: #f00",
          id: "twinkle-talkback-optout-message"
        });
        work_area.append({
          type: "input",
          name: "page",
          label: window.wgULS("完整页面名", "完整頁面名"),
          tooltip: window.wgULS("您留下消息的完整页面名,例如“LIB_talk:首页”。", "您留下訊息的完整頁面名,例如「LIB_talk:首頁」。"),
          value: prev_page,
          required: true
        });
        work_area.append({
          type: "input",
          name: "section",
          label: window.wgULS("章节(可选)", "章節(可選)"),
          tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
          value: prev_section
        });
        break;
      case "mail":
        work_area.append({
          type: "input",
          name: "section",
          label: window.wgULS("电子邮件主题(可选)", "電子郵件主題(可選)"),
          tooltip: window.wgULS("您发出的电子邮件的主题。", "您發出的電子郵件的主題。")
        });
        break;
      case "see":
        work_area.append({
          type: "input",
          name: "page",
          label: window.wgULS("完整页面名", "完整頁面名"),
          tooltip: window.wgULS("您留下消息的完整页面名,例如“LIB_talk:首页”。", "您留下訊息的完整頁面名,例如「LIB_talk:首頁」。"),
          value: prev_page,
          required: true
        });
        work_area.append({
          type: "input",
          name: "section",
          label: window.wgULS("章节(可选)", "章節(可選)"),
          tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
          value: prev_section
        });
        break;
      default:
        work_area.append({
          type: "div",
          label: "",
          style: "color: #f00",
          id: "twinkle-talkback-optout-message"
        });
        work_area.append({
          type: "input",
          name: "section",
          label: window.wgULS("章节(可选)", "章節(可選)"),
          tooltip: window.wgULS("您留言的章节标题,留空则不会产生章节链接。", "您留言的章節標題,留空則不會產生章節連結。"),
          value: prev_section
        });
        break;
    }
    if (value !== "notice") {
      work_area.append({
        type: "textarea",
        label: window.wgULS("附加信息(可选):", "附加資訊(可選):"),
        name: "message",
        tooltip: window.wgULS("会在回复通告模板下出现的消息,您的签名会被加在最后。", "會在回覆通告模板下出現的訊息,您的簽名會被加在最後。")
      });
    }
    work_area = work_area.render();
    root.replaceChild(work_area, old_area);
    if (root.message) {
      root.message.value = prev_message;
    }
    $body.find("#twinkle-talkback-optout-message").text(Twinkle.talkback.optout);
  };
  Twinkle.talkback.noticeboards = {
    affp: {
      label: "LIB:AF/FP(".concat(window.wgULS("过滤器处理/报告", "過濾器處理/報告"), ")"),
      title: window.wgULS("过滤器错误报告有新回应", "過濾器錯誤報告有新回應"),
      content: "".concat(window.wgULS("您的[[LIB_talk:过滤器处理/报告|过滤器错误报告]]已有回应,请前往查看。", "您的[[LIB_talk:过滤器处理/报告|過濾器錯誤報告]]已有回應,請前往查看。"), "--~~").concat("~~"),
      editSummary: window.wgULS("有关[[LIB_talk:过滤器处理/报告|过滤器错误报告]]的通知", "有關[[LIB_talk:过滤器处理/报告|過濾器錯誤報告]]的通知"),
      defaultSelected: true
    },
    sbl: {
      label: "Spam-blacklist",
      title: window.wgULS("垃圾链接黑名单请求有新回应", "垃圾連結黑名單請求有新回應"),
      content: "".concat(window.wgULS("您的[[LIB_talk:管理员告示板|垃圾链接黑名单请求]]已有回应,请前往查看。", "您的[[LIB_talk:管理员告示板|垃圾連結黑名單請求]]已有回應,請前往查看。"), "--~~").concat("~~"),
      editSummary: window.wgULS("有关[[LIB_talk:管理员告示板|垃圾链接黑名单请求]]的通知", "有關[[LIB_talk:管理员告示板|垃圾連結黑名單請求]]的通知")
    },
    shl: {
      label: "Spam-whitelist",
      title: window.wgULS("垃圾链接白名单请求有新回应", "垃圾連結白名單請求有新回應"),
      content: "".concat(window.wgULS("您的[[LIB_talk:管理员告示板|垃圾链接白名单请求]]已有回应,请前往查看。", "您的[[LIB_talk:管理员告示板|垃圾連結白名單請求]]已有回應,請前往查看。"), "--~~").concat("~~"),
      editSummary: window.wgULS("有关[[LIB_talk:管理员告示板|垃圾链接白名单请求]]的通知", "有關[[LIB_talk:管理员告示板|垃圾連結白名單請求]]的通知")
    }
  };
  Twinkle.talkback.evaluate = (e) => {
    const form = e.target;
    const [tbtarget] = form.getChecked("tbtarget");
    let page;
    let message;
    const section = form.section.value;
    let editSummary;
    if (tbtarget === "notice") {
      page = form.noticeboard.value;
      ({
        editSummary
      } = Twinkle.talkback.noticeboards[page]);
    } else {
      page = form.page ? form.page.value : mw.config.get("wgUserName");
      if (form.message) {
        message = form.message.value.trim();
      }
      if (tbtarget === "mail") {
        editSummary = window.wgULS("通知:有新邮件", "通知:有新郵件");
      } else if (tbtarget === "see") {
        editSummary = "".concat(window.wgULS("请看看", "請看看"), "[[:").concat(page).concat(section ? "#".concat(section) : "", "]]").concat(window.wgULS("上的讨论", "上的討論"));
      } else {
        editSummary = "".concat(window.wgULS("回复通告", "回覆通告"), "([[:");
        if (tbtarget !== "other" && !new RegExp("^\\s*".concat(Morebits.namespaceRegex(3), ":"), "i").test(page)) {
          editSummary += "User talk:";
        }
        editSummary += "".concat(page + (section ? "#".concat(section) : ""), "]])");
      }
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    const fullUserTalkPageName = "".concat(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").user_talk], ":").concat(mw.config.get("wgRelevantUserName"));
    Morebits.wiki.actionCompleted.redirect = fullUserTalkPageName;
    Morebits.wiki.actionCompleted.notice = window.wgULS("回复通告完成,将在几秒内刷新页面", "回覆通告完成,將在幾秒內重新整理頁面");
    const text = "\n\n".concat(Twinkle.talkback.getNoticeWikitext(tbtarget, page, section, message)[0]);
    const talkpage = new Morebits.wiki.page(fullUserTalkPageName, window.wgULS("加入回复通告", "加入回覆通告"));
    talkpage.setEditSummary(editSummary);
    talkpage.setChangeTags(Twinkle.changeTags);
    talkpage.setAppendText(text);
    talkpage.setCreateOption("recreate");
    talkpage.setMinorEdit(Twinkle.getPref("markTalkbackAsMinor"));
    talkpage.setFollowRedirect(true);
    talkpage.append();
  };
  Twinkle.talkback.preview = (form) => {
    const [tbtarget] = form.getChecked("tbtarget");
    const section = form.section.value;
    let page;
    let message;
    if (tbtarget === "notice") {
      page = form.noticeboard.value;
    } else {
      page = form.page ? form.page.value : mw.config.get("wgUserName");
      if (form.message) {
        message = form.message.value.trim();
      }
    }
    const [noticetext] = Twinkle.talkback.getNoticeWikitext(tbtarget, page, section, message);
    form.previewer.beginRender(noticetext, "User_talk:".concat(mw.config.get("wgRelevantUserName")));
  };
  Twinkle.talkback.getNoticeWikitext = (tbtarget, page, section, message) => {
    let text;
    let title;
    let content;
    if (tbtarget === "notice") {
      ({
        title
      } = Twinkle.talkback.noticeboards[page]);
      content = Morebits.string.safeReplace(Twinkle.talkback.noticeboards[page].content, "$SECTION", section);
      text = "== ".concat(title, " ==\n").concat(content);
    } else if (tbtarget === "see") {
      title = page + window.wgULS("的相关讨论", "的相關討論");
      content = "{{".concat("subst:", "Please see|location=".concat(page).concat(section ? "#".concat(section) : "", "|more=").concat(message.trim(), "}}"));
      text = "{{".concat("subst:", "Please see|location=".concat(page).concat(section ? "#".concat(section) : "", "|more=").concat(message.trim(), "}}"));
    } else {
      text = "==";
      if (tbtarget === "mail") {
        title = Twinkle.getPref("mailHeading");
        content = "{{You've got mail|subject=".concat(section, "|ts=~~").concat("~", "~~}}");
        text += "".concat(Twinkle.getPref("mailHeading"), "==\n{{You've got mail|subject=").concat(section);
      } else {
        title = Twinkle.getPref("talkbackHeading").replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1");
        content = "{{talkback|".concat(page).concat(section ? "|".concat(section) : "");
        text += "".concat(Twinkle.getPref("talkbackHeading").replace(/^\s*=+\s*(.*?)\s*=+$\s*/, "$1"), "==\n{{talkback|").concat(page).concat(section ? "|".concat(section) : "");
      }
      content += "|ts=~~".concat("~", "~~}}");
      text += "|ts=~~".concat("~", "~~}}");
      if (message) {
        content += "\n".concat(message);
        text += "\n".concat(message, "  ~~").concat("~~");
      } else if (Twinkle.getPref("insertTalkbackSignature")) {
        text += "\n~~".concat("~~");
      }
    }
    return [text, title, content];
  };
  Twinkle.addInitCallback(Twinkle.talkback, "talkback");
})(jQuery);
//! src/Twinkle/modules/twinklespeedy.js
/*! Twinkle.js - twinklespeedy.js */
(function twinklespeedy($) {
  const $body = $("body");
  Twinkle.speedy = () => {
    if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId")) {
      return;
    }
    Twinkle.addPortletLink(Twinkle.speedy.callback, window.wgULS("速删", "速刪"), "tw-csd", Morebits.userIsSysop ? window.wgULS("快速删除", "快速刪除") : window.wgULS("请求快速删除", "請求快速刪除"));
  };
  Twinkle.speedy.callback = () => {
    Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
  };
  Twinkle.speedy.dialog = null;
  Twinkle.speedy.hasCSD = !!document.querySelector("#delete-reason");
  Twinkle.speedy.mode = {
    sysopSingleSubmit: 1,
    // radio buttons, no subgroups, submit when "Submit" button is clicked
    sysopRadioClick: 2,
    // radio buttons, no subgroups, submit when a radio button is clicked
    sysopMultipleSubmit: 3,
    // check boxes, subgroups, "Submit" button already present
    sysopMultipleRadioClick: 4,
    // check boxes, subgroups, need to add a "Submit" button
    userMultipleSubmit: 5,
    // check boxes, subgroups, "Submit" button already pressent
    userMultipleRadioClick: 6,
    // check boxes, subgroups, need to add a "Submit" button
    userSingleSubmit: 7,
    // radio buttons, subgroups, submit when "Submit" button is clicked
    userSingleRadioClick: 8,
    // radio buttons, subgroups, submit when a radio button is clicked
    // are we in "delete page" mode?
    // (sysops can access both "delete page" [sysop] and "tag page only" [user] modes)
    isSysop: (mode) => {
      return mode === Twinkle.speedy.mode.sysopSingleSubmit || mode === Twinkle.speedy.mode.sysopMultipleSubmit || mode === Twinkle.speedy.mode.sysopRadioClick || mode === Twinkle.speedy.mode.sysopMultipleRadioClick;
    },
    // do we have a "Submit" button once the form is created?
    hasSubmitButton: (mode) => {
      return mode === Twinkle.speedy.mode.sysopSingleSubmit || mode === Twinkle.speedy.mode.sysopMultipleSubmit || mode === Twinkle.speedy.mode.sysopMultipleRadioClick || mode === Twinkle.speedy.mode.userMultipleSubmit || mode === Twinkle.speedy.mode.userMultipleRadioClick || mode === Twinkle.speedy.mode.userSingleSubmit;
    },
    // is db-multiple the outcome here?
    isMultiple: (mode) => {
      return mode === Twinkle.speedy.mode.userMultipleSubmit || mode === Twinkle.speedy.mode.sysopMultipleSubmit || mode === Twinkle.speedy.mode.userMultipleRadioClick || mode === Twinkle.speedy.mode.sysopMultipleRadioClick;
    }
  };
  Twinkle.speedy.initDialog = (callbackfunc) => {
    Twinkle.speedy.dialog = new Morebits.simpleWindow(Twinkle.getPref("speedyWindowWidth"), Twinkle.getPref("speedyWindowHeight"));
    const {
      dialog
    } = Twinkle.speedy;
    dialog.setTitle(window.wgULS("选择快速删除理由", "選擇快速刪除理由"));
    dialog.setScriptName("Twinkle");
    dialog.addFooterLink(window.wgULS("快速删除条例", "快速刪除條例"), "LIB:CSD");
    dialog.addFooterLink(window.wgULS("速删设置", "速刪設定"), "H:TW/PREF#speedy");
    dialog.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#speedy");
    const form = new Morebits.quickForm(callbackfunc, Twinkle.getPref("speedySelectionStyle") === "radioClick" ? "change" : null);
    if (Morebits.userIsSysop) {
      form.append({
        type: "checkbox",
        list: [{
          label: window.wgULS("只标记,不删除", "只標記,不刪除"),
          value: "tag_only",
          name: "tag_only",
          tooltip: window.wgULS("若您只想标记此页面而不是将其删除", "若您只想標記此頁面而不是將其刪除"),
          checked: !(Twinkle.speedy.hasCSD || Twinkle.getPref("deleteSysopDefaultToDelete")),
          event: (event) => {
            const cForm = event.target.form;
            const cChecked = event.target.checked;
            if (cForm.talkpage) {
              cForm.talkpage.disabled = cChecked;
              cForm.talkpage.checked = !cChecked && Twinkle.getPref("deleteTalkPageOnDelete");
            }
            cForm.redirects.disabled = cChecked;
            cForm.redirects.checked = !cChecked;
            cForm.delmultiple.disabled = cChecked;
            cForm.delmultiple.checked = false;
            cForm.openusertalk.disabled = cChecked;
            cForm.openusertalk.checked = false;
            cForm.notify.disabled = !cChecked;
            cForm.notify.checked = cChecked;
            cForm.multiple.disabled = !cChecked;
            cForm.multiple.checked = false;
            cForm.salting.checked = false;
            Twinkle.speedy.callback.modeChanged(cForm);
            event.stopPropagation();
          }
        }]
      });
      const deleteOptions = form.append({
        type: "div",
        name: "delete_options"
      });
      deleteOptions.append({
        type: "header",
        label: window.wgULS("删除相关选项", "刪除相關選項")
      });
      if (mw.config.get("wgNamespaceNumber") % 2 === 0 && mw.config.get("wgNamespaceNumber") !== 2) {
        deleteOptions.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("删除讨论页", "刪除討論頁"),
            value: "talkpage",
            name: "talkpage",
            tooltip: window.wgULS("删除时附带删除此页面的讨论页。", "刪除時附帶刪除此頁面的討論頁。"),
            checked: Twinkle.getPref("deleteTalkPageOnDelete"),
            event: (event) => {
              event.stopPropagation();
            }
          }]
        });
      }
      deleteOptions.append({
        type: "checkbox",
        list: [{
          label: window.wgULS("删除重定向", "刪除重新導向"),
          value: "redirects",
          name: "redirects",
          tooltip: window.wgULS("删除到此页的重定向。", "刪除到此頁的重新導向。"),
          checked: Twinkle.getPref("deleteRedirectsOnDelete"),
          event: (event) => {
            event.stopPropagation();
          }
        }]
      });
      deleteOptions.append({
        type: "checkbox",
        list: [{
          label: window.wgULS("应用多个理由删除", "應用多個理由刪除"),
          value: "delmultiple",
          name: "delmultiple",
          tooltip: window.wgULS("您可选择应用于该页的多个理由。", "您可選擇應用於該頁的多個理由。"),
          event: (event) => {
            Twinkle.speedy.callback.modeChanged(event.target.form);
            event.stopPropagation();
          }
        }]
      });
      deleteOptions.append({
        type: "checkbox",
        list: [{
          label: window.wgULS("开启用户讨论页", "開啟使用者討論頁"),
          value: "openusertalk",
          name: "openusertalk",
          tooltip: window.wgULS("此项的默认值为您的开启讨论页设置。在您选择应用多条理由删除时此项将保持不变。", "此項的預設值為您的開啟討論頁設定。在您選擇應用多條理由刪除時此項將保持不變。"),
          checked: false
        }]
      });
    }
    const tagOptions = form.append({
      type: "div",
      name: "tag_options"
    });
    if (Morebits.userIsSysop) {
      tagOptions.append({
        type: "header",
        label: window.wgULS("标记相关选项", "標記相關選項")
      });
    }
    tagOptions.append({
      type: "checkbox",
      list: [{
        label: window.wgULS("如可能,通知创建者", "如可能,通知建立者"),
        value: "notify",
        name: "notify",
        tooltip: window.wgULS("一个通知模板将会被加入创建者的讨论页,若您启用了该理据的通知。", "一個通知模板將會被加入建立者的討論頁,若您啟用了該理據的通知。"),
        checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref("deleteSysopDefaultToDelete")),
        event: (event) => {
          event.stopPropagation();
        }
      }, {
        label: window.wgULS("清空页面", "清空頁面"),
        value: "blank",
        name: "blank",
        tooltip: window.wgULS("在标记模板前,先清空页面,适用于严重破坏或负面生者传记等。", "在標記模板前,先清空頁面,適用於嚴重破壞或負面生者傳記等。")
      }, {
        label: window.wgULS("同时标记以请求白纸保护", "同時標記以請求白紙保護"),
        value: "salting",
        name: "salting",
        tooltip: window.wgULS("选取后,快速删除模板后将附带 {{salt}} 标签,以请求执行删除的管理员进行白纸保护,仅在页面创建3次以上才选择此项。", "選取後,快速刪除模板後將附帶 {{salt}} 標籤,以請求執行刪除的管理員進行白紙保護,僅在頁面建立3次以上才選擇此項。")
      }, {
        label: window.wgULS("应用多个理由", "應用多個理由"),
        value: "multiple",
        name: "multiple",
        tooltip: window.wgULS("您可选择应用于该页的多个理由。", "您可選擇應用於該頁的多個理由。"),
        event: (event) => {
          Twinkle.speedy.callback.modeChanged(event.target.form);
          event.stopPropagation();
        }
      }]
    });
    form.append({
      type: "div",
      id: "prior-deletion-count"
    });
    form.append({
      type: "div",
      name: "work_area",
      label: window.wgULS("初始化CSD模块失败,请重试,或将这报告给Twinkle开发者。", "初始化CSD模組失敗,請重試,或將這報告給Twinkle開發者。")
    });
    if (Twinkle.getPref("speedySelectionStyle") !== "radioClick") {
      form.append({
        type: "submit",
        className: "tw-speedy-submit"
      });
    }
    const result = form.render();
    dialog.setContent(result);
    dialog.display();
    Twinkle.speedy.callback.modeChanged(result);
    Twinkle.speedy.callback.priorDeletionCount();
  };
  Twinkle.speedy.callback.getMode = (form) => {
    let mode = Twinkle.speedy.mode.userSingleSubmit;
    if (form.tag_only && !form.tag_only.checked) {
      if (form.delmultiple.checked) {
        mode = Twinkle.speedy.mode.sysopMultipleSubmit;
      } else {
        mode = Twinkle.speedy.mode.sysopSingleSubmit;
      }
    } else if (form.multiple.checked) {
      mode = Twinkle.speedy.mode.userMultipleSubmit;
    } else {
      mode = Twinkle.speedy.mode.userSingleSubmit;
    }
    if (Twinkle.getPref("speedySelectionStyle") === "radioClick") {
      mode++;
    }
    return mode;
  };
  Twinkle.speedy.callback.modeChanged = (form) => {
    const namespace = mw.config.get("wgNamespaceNumber");
    const mode = Twinkle.speedy.callback.getMode(form);
    const isSysopMode = Twinkle.speedy.mode.isSysop(mode);
    if (isSysopMode) {
      $body.find("[name=delete_options]").show();
      $body.find("[name=tag_options]").hide();
      $body.find("button.tw-speedy-submit").text(window.wgULS("删除页面", "刪除頁面"));
    } else {
      $body.find("[name=delete_options]").hide();
      $body.find("[name=tag_options]").show();
      $body.find("button.tw-speedy-submit").text(window.wgULS("标记页面", "標記頁面"));
    }
    const work_area = new Morebits.quickForm.element({
      type: "div",
      name: "work_area"
    });
    if (mode === Twinkle.speedy.mode.userMultipleRadioClick || mode === Twinkle.speedy.mode.sysopMultipleRadioClick) {
      const evaluateType = Twinkle.speedy.mode.isSysop(mode) ? "evaluateSysop" : "evaluateUser";
      work_area.append({
        type: "div",
        label: window.wgULS("当选择完成后,单击:", "當選擇完成後,點擊:")
      });
      work_area.append({
        type: "button",
        name: "submit-multiple",
        label: isSysopMode ? window.wgULS("删除页面", "刪除頁面") : window.wgULS("标记页面", "標記頁面"),
        event: (event) => {
          Twinkle.speedy.callback[evaluateType](event);
          event.stopPropagation();
        }
      });
    }
    const radioOrCheckbox = Twinkle.speedy.mode.isMultiple(mode) ? "checkbox" : "radio";
    if (isSysopMode && !Twinkle.speedy.mode.isMultiple(mode)) {
      work_area.append({
        type: "header",
        label: window.wgULS("自定义理由", "自訂理由")
      });
      work_area.append({
        type: radioOrCheckbox,
        name: "csd",
        list: Twinkle.speedy.generateCsdList(Twinkle.speedy.customRationale, mode)
      });
    }
    switch (namespace) {
      case 0:
        work_area.append({
          type: "header",
          label: window.wgULS("条目", "條目")
        });
        work_area.append({
          type: radioOrCheckbox,
          name: "csd",
          list: Twinkle.speedy.generateCsdList(Twinkle.speedy.articleList, mode)
        });
        break;
      case 2:
        work_area.append({
          type: "header",
          label: window.wgULS("用户页", "使用者頁面")
        });
        work_area.append({
          type: radioOrCheckbox,
          name: "csd",
          list: Twinkle.speedy.generateCsdList(Twinkle.speedy.userList, mode)
        });
        break;
      case 3:
        if (mw.util.isIPAddress(mw.config.get("wgRelevantUserName"))) {
          work_area.append({
            type: "header",
            label: window.wgULS("用户讨论页", "使用者討論頁")
          });
          work_area.append({
            type: radioOrCheckbox,
            name: "csd",
            list: Twinkle.speedy.generateCsdList(Twinkle.speedy.usertalkList, mode)
          });
        }
        break;
      case 6:
        work_area.append({
          type: "header",
          label: window.wgULS("文件", "檔案")
        });
        work_area.append({
          type: radioOrCheckbox,
          name: "csd",
          list: Twinkle.speedy.generateCsdList(Twinkle.speedy.fileList, mode)
        });
        if (!Twinkle.speedy.mode.isSysop(mode)) {
          work_area.append({
            type: "div",
            label: window.wgULS("标记CSD F1、F3、F5,请使用Twinkle的“图权”功能。", "標記CSD F1、F3、F5,請使用Twinkle的「圖權」功能。")
          });
        }
        break;
      case 14:
        work_area.append({
          type: "header",
          label: window.wgULS("分类", "分類")
        });
        work_area.append({
          type: radioOrCheckbox,
          name: "csd",
          list: Twinkle.speedy.generateCsdList(Twinkle.speedy.categoryList, mode)
        });
        break;
      case 302:
        work_area.append({
          type: "header",
          label: "草稿"
        });
        work_area.append({
          type: radioOrCheckbox,
          name: "csd",
          list: Twinkle.speedy.generateCsdList(Twinkle.speedy.draftList, mode)
        });
        break;
      case (namespace % 2 === 1 && namespace !== 3):
        work_area.append({
          type: "header",
          label: window.wgULS("讨论页", "討論頁")
        });
        work_area.append({
          type: radioOrCheckbox,
          name: "csd",
          list: Twinkle.speedy.generateCsdList(Twinkle.speedy.talkList, mode)
        });
        break;
      default:
        break;
    }
    let generalCriteria = Twinkle.speedy.generalList;
    if (!Twinkle.speedy.mode.isSysop(mode)) {
      generalCriteria = [...Twinkle.speedy.customRationale, ...Array.isArray(generalCriteria) ? generalCriteria : [generalCriteria]];
    }
    work_area.append({
      type: "header",
      label: window.wgULS("常规", "常規")
    });
    work_area.append({
      type: radioOrCheckbox,
      name: "csd",
      list: Twinkle.speedy.generateCsdList(generalCriteria, mode)
    });
    if (!Twinkle.speedy.mode.isSysop(mode)) {
      work_area.append({
        type: "div",
        label: window.wgULS("提报侵权页面,请使用Twinkle的“侵权”功能。", "提報侵權頁面,請使用Twinkle的「侵權」功能。")
      });
    }
    if (mw.config.get("wgIsRedirect") || Morebits.userIsSysop) {
      work_area.append({
        type: "header",
        label: "重定向"
      });
      work_area.append({
        type: radioOrCheckbox,
        name: "csd",
        list: Twinkle.speedy.generateCsdList(Twinkle.speedy.redirectList, mode)
      });
    }
    const [old_area] = Morebits.quickForm.getElements(form, "work_area");
    form.replaceChild(work_area.render(), old_area);
    if (isSysopMode && Twinkle.speedy.hasCSD) {
      const [customOption] = $body.find("input[name=csd][value=reason]");
      if (customOption) {
        if (Twinkle.getPref("speedySelectionStyle") !== "radioClick") {
          customOption.click();
          customOption.parentNode.appendChild(customOption.subgroup);
        }
        customOption.subgroup.querySelector("input").value = decodeURIComponent($body.find("#delete-reason").text()).replace(/\+/g, " ");
      }
    }
    if (document.querySelector('input[value="g7"]') && Twinkle.getPref("enlargeG7Input")) {
      document.querySelector('input[value="g7"]').style = "height: 2em; width: 2em; height: -moz-initial; width: -moz-initial; -moz-transform: scale(2); -o-transform: scale(2);";
      document.querySelector('input[value="g7"]').labels[0].style = "font-size: 1.5em; line-height: 1.5em;";
    }
    if (!isSysopMode && mw.config.get("wgPageContentModel") !== "wikitext") {
      $body.find("[name=tag_options]").hide();
      $body.find("[name=work_area]").empty();
      const message = [window.wgULS("Twinkle不支持在页面内容模型为", "Twinkle不支援在頁面內容模型為"), mw.config.get("wgPageContentModel"), window.wgULS("的页面上挂上快速删除模板,请参见", "的頁面上掛上快速刪除模板,請參見"), $("<a>").attr({
        target: "_blank",
        rel: "noopener noreferrer",
        href: mw.util.getUrl("LIB:SPECIALSD")
      }).text(window.wgULS("手动放置模板时的注意事项", "手動放置模板時的注意事項"))[0], "。"];
      $body.find("[name=work_area]").append(message);
      Morebits.simpleWindow.setButtonsEnabled(false);
    } else {
      Morebits.simpleWindow.setButtonsEnabled(true);
    }
  };
  Twinkle.speedy.callback.priorDeletionCount = () => {
    const query = {
      action: "query",
      format: "json",
      list: "logevents",
      letype: "delete",
      leaction: "delete/delete",
      // Just pure page deletion, no redirect overwrites or revdel
      letitle: mw.config.get("wgPageName"),
      leprop: "",
      // We're just counting we don't actually care about the entries
      lelimit: 5
      // A little bit goes a long way
    };
    new Morebits.wiki.api(window.wgULS("检查之前的删除", "檢查之前的刪除"), query, (apiobj) => {
      const response = apiobj.getResponse();
      const delCount = response.query.logevents.length;
      if (delCount) {
        let message = window.wgULS("被删除", "被刪除");
        if (response.continue) {
          message += window.wgULS("超过", "超過");
        }
        message += "".concat(delCount, "次");
        if (delCount >= 3) {
          $body.find("#prior-deletion-count").css("color", "#ff0000");
        }
        const link = Morebits.htmlNode("a", window.wgULS("(日志)", "(日誌)"));
        link.setAttribute("href", mw.util.getUrl("Special:Log", {
          page: mw.config.get("wgPageName")
        }));
        link.setAttribute("target", "_blank");
        link.setAttribute("rel", "noopener noreferrer");
        $body.find("#prior-deletion-count").text(message);
        $body.find("#prior-deletion-count").append(link);
      }
    }).post();
  };
  Twinkle.speedy.generateCsdList = (list, mode) => {
    const isSysopMode = Twinkle.speedy.mode.isSysop(mode);
    const multiple = Twinkle.speedy.mode.isMultiple(mode);
    const hasSubmitButton = Twinkle.speedy.mode.hasSubmitButton(mode);
    const openSubgroupHandler = (e) => {
      $(e.target.form).find("input").prop("disabled", true);
      $(e.target.form).children().css("color", "gray");
      $(e.target).parent().css("color", "black").find("input").prop("disabled", false);
      $(e.target).parent().find("input:text")[0].focus();
      e.stopPropagation();
    };
    const submitSubgroupHandler = (e) => {
      const evaluateType = Twinkle.speedy.mode.isSysop(mode) ? "evaluateSysop" : "evaluateUser";
      Twinkle.speedy.callback[evaluateType](e);
      e.stopPropagation();
    };
    return Array.prototype.map.call(list, (critElement) => {
      const criterion = {
        ...critElement
      };
      if (multiple) {
        if (criterion.hideWhenMultiple) {
          return null;
        }
        if (criterion.hideSubgroupWhenMultiple) {
          criterion.subgroup = null;
        }
      } else {
        if (criterion.hideWhenSingle) {
          return null;
        }
        if (criterion.hideSubgroupWhenSingle) {
          criterion.subgroup = null;
        }
      }
      if (isSysopMode) {
        if (criterion.hideWhenSysop) {
          return null;
        }
        if (criterion.hideSubgroupWhenSysop) {
          criterion.subgroup = null;
        }
      } else {
        if (criterion.hideWhenUser) {
          return null;
        }
        if (criterion.hideSubgroupWhenUser) {
          criterion.subgroup = null;
        }
      }
      if (mw.config.get("wgIsRedirect") && criterion.hideWhenRedirect) {
        return null;
      }
      if (criterion.showInNamespaces && !criterion.showInNamespaces.includes(mw.config.get("wgNamespaceNumber"))) {
        return null;
      } else if (criterion.hideInNamespaces && criterion.hideInNamespaces.includes(mw.config.get("wgNamespaceNumber"))) {
        return null;
      }
      if (criterion.subgroup && !hasSubmitButton) {
        if (Array.isArray(criterion.subgroup)) {
          criterion.subgroup.push({
            type: "button",
            name: "submit",
            label: isSysopMode ? window.wgULS("删除页面", "刪除頁面") : window.wgULS("标记页面", "標記頁面"),
            event: submitSubgroupHandler
          });
        } else {
          criterion.subgroup = [criterion.subgroup, {
            type: "button",
            name: "submit",
            label: isSysopMode ? window.wgULS("删除页面", "刪除頁面") : window.wgULS("标记页面", "標記頁面"),
            event: submitSubgroupHandler
          }];
        }
        criterion.event = openSubgroupHandler;
      }
      if (isSysopMode) {
        const originalEvent = criterion.event;
        criterion.event = (e) => {
          if (multiple) {
            return originalEvent(e);
          }
          const normalizedCriterion = Twinkle.speedy.normalizeHash[e.target.value];
          $body.find("[name=openusertalk]").prop("checked", Twinkle.getPref("openUserTalkPageOnSpeedyDelete").includes(normalizedCriterion));
          if (originalEvent) {
            return originalEvent(e);
          }
        };
      }
      return criterion;
    });
  };
  Twinkle.speedy.customRationale = [{
    label: "自定义理由".concat(Morebits.userIsSysop ? "(自定义删除理由)" : ""),
    value: "reason",
    tooltip: "该页至少应该符合一条快速删除的标准,并且您必须在理由中提到。",
    subgroup: {
      name: "reason_1",
      type: "input",
      label: "理由:",
      size: 60
    }
  }];
  Twinkle.speedy.fileList = [{
    label: "F1:明显不符合本站著作权条例的文件",
    value: "f1",
    tooltip: "包括以下情况:1.上传后3天内仍然来源不明、著作权不明的文件。2.上传者宣称拥有,而在其他来源找到的文件。3.文件宣称由某作者依据某自由著作权协议发布,但找不到该自由协议的声明。4.其他明显侵权的文件,可附加侵权理由。"
  }, {
    label: "F2:重复且不再被使用的文件",
    value: "f2",
    tooltip: "包括以下情况:与现有文件完全相同(或与现有文件内容一致但尺寸较小),且没有客观需要(如某些场合需使用小尺寸图片)的文件。或是被更加清晰的文件、SVG格式文件所取代的文件。请提报者确定文件没有任何页面使用后再提报删除,并附注对应质量更好的文件名。",
    subgroup: {
      name: "f2_filename",
      type: "input",
      label: "新文件名:",
      tooltip: "可不含“File:”前缀。"
    }
  }];
  Twinkle.speedy.articleList = [{
    label: "A1:内容空泛或完全没有内容。",
    value: "a1",
    tooltip: "条目的内容笼统,或甚至根本没有提及条目主体,使条目不能用以区分其他事物;或条目只包括外部链接、参见、参考来源、分类、模板,而没有文字描述。消歧义页、重定向页不适用此条。请注意有些用户可能会多次保存,若此类页面的最后一次编辑时间超过24小时,则可提请快速删除。"
  }, {
    label: "A2:与其他条目或其历史版本重复,且不适合作为其重定向。",
    value: "a2",
    tooltip: "条目创建时的内容,与其他现有条目(或其历史版本)内容完全相同或非常相似,且名称不适合作为后者的重定向。不包括拆分、合并、重组后产生的条目。如有疑虑,可转交删除讨论。若后创建的条目名称可作为重定向,可直接改为重定向;若先创建的条目宜作为后创建条目的重定向,请提请移动请求。",
    subgroup: {
      name: "a2_pagename",
      type: "input",
      label: "现有条目名:",
      tooltip: "不自动加上链接,若需要请自行加上[[]]。",
      size: 60
    }
  }, {
    label: "A3:非现代汉语或翻译拙劣的条目",
    value: "a3",
    tooltip: "条目内容绝大部分非现代汉语,包括未翻译的外语、方言及文言文;或翻译质量低下,以至于难以理解或出现较多错误。"
  }];
  Twinkle.speedy.categoryList = [{
    label: "O2:空分类。",
    value: "o2",
    tooltip: "没有收录任何页面、文件、子分类的分类。Category:请勿删除的分类中的分类不适用。"
  }];
  Twinkle.speedy.draftList = [{
    label: "O3:废弃草稿。",
    value: "o3",
    tooltip: "草稿名字空间内六个月内无编辑的页面。"
  }];
  Twinkle.speedy.userList = [{
    label: "O1:用户请求删除自己的用户页。",
    value: "o1",
    tooltip: "管理员需查看编辑历史,确认该页面不是从其他名字空间移动而来。"
  }];
  Twinkle.speedy.generalList = [{
    label: "G1:明显违反法律法规或违背公序良俗的页面",
    value: "g1",
    tooltip: "明显违反服务器所在地的法律法规及有关规定,或突破社会公序良俗底线,按照中华人民共和国互联网管理规定应予删除的页面。"
  }, {
    label: "G2:没有实际内容的页面",
    value: "g2",
    tooltip: "仅包括无意义字符串而没有实际内容的页面。由用户本人创建的用户页、用户讨论页,及专为测试提供的沙盒,不适用此准则。"
  }, {
    label: "G3:纯粹破坏",
    value: "g3",
    tooltip: "包括但不限于明显的恶作剧、错误信息、人身攻击等,以及清理移动破坏时留下的重定向。若收到或发现严重的人身攻击与诋毁,管理员及其他用户应通知监督员进行监督隐藏。"
  }, {
    label: "G4:重新创建已被删除的页面",
    value: "g4",
    tooltip: "若现有页面与曾在删除讨论(含页面存废讨论、文件存废讨论和侵权审核,不含快速删除)中被删除内容相同或非常相似,且现有内容仍然适用删除讨论中的结论,无论标题是否相同,都适用本标准。若现有页面标题与已删版本不一致,则提请速删者应一并注明已删版本的页面名;若该页面之前被快速删除,请以相同理由重新提请速删。若现有内容不适用删除讨论中的结论,应重新提出删除讨论。",
    subgroup: [{
      name: "g4_pagename",
      type: "input",
      label: "已删版此页面名:",
      size: 60
    }],
    hideSubgroupWhenMultiple: true
  }, {
    label: "G5:因技术原因删除页面",
    value: "g5",
    tooltip: "包括以下情形:因移动请求而删除页面;以覆盖删除重定向;删除无用的MediaWiki页面,及其他技术团队或界面管理员认为有必要执行的快速删除情形。"
  }, {
    label: "G6:原作者提请删除或清空页面,且页面原作者仅有一人",
    value: "g6",
    tooltip: "页面原作者持合理理由提出的快速删除;或页面原作者(实际贡献者)清空页面,其他用户提交的快速删除。页面原作者(实际贡献者)仅一人时满足本准则。若页面实际贡献者多于一人,请持合理理由提交删除讨论。后一情形不包括用户页、用户讨论页,且应在页面最后一次编辑6小时后提出。被导入的页面,导入者视为原作者。",
    subgroup: {
      name: "g6_rationale",
      type: "input",
      label: "删除原因:",
      size: 60
    },
    hideSubgroupWhenSysop: true
  }, {
    label: "G7:明显的广告宣传",
    value: "g7",
    tooltip: "应用于明显的广告宣传,或只有相关人物、组织等事物联系方法(包括但不限于电话、地址、电子邮箱、即时通讯软件联系方式(如QQ号、微信号)、社交媒体链接)。若宣传语气不明显,建议转交删除讨论。"
  }, {
    label: "G8:未列明可靠来源且语调负面的生者传记",
    value: "g8",
    tooltip: "本情况下有的页面严重侵犯他人名誉权,有时可能侵犯隐私权,可能需要提请监督。"
  }, {
    label: "G9:孤立页面",
    value: "g9",
    tooltip: "包括以下几种类型:1.没有对应文件的文件页面;2.没有对应母页面的子页面(用户页子页面除外);3.指向不存在页面的重定向;4.没有对应内容页面的讨论页(讨论页存档、用户讨论页,以及在主页面挂有{{CSD Placeholder}}模板的讨论页除外);5.不存在注册用户的用户页及用户页子页面(随用户更名产生的用户页重定向除外)。请在删除时注意有无将内容移至他处的必要。"
  }];
  Twinkle.speedy.redirectList = [{
    label: "R1:不能发挥实际作用的重定向。",
    value: "r1",
    tooltip: "包括以下情况:1.指向本身或循环的重定向,如A→B→C→……→A或A→A(繁简重定向不适用此项);2.格式错误的重定向,包括标题仅为繁体、繁简混用、消歧义使用的括弧或空格错误、间隔号使用错误(因类推简化字未收录至《通用规范汉字表》导致的繁简混杂情形,或系统无法自动进行繁简处理的情形,则不适用)。若重定向页面标题,与合乎命名常规的目标页面标题之间,仅存在繁简字体的区别,而不存在词语用法区别,则不保留该重定向。因系统无法自动繁简转换而必须保留的重定向页面除外。对于其他未列出的情况,若用户认为该重定向无法发挥实际作用,且依据常识没有任何争议,可凭合理理由提请速删,由管理员判断。指向不存在页面的重定向,适用G5准则。",
    subgroup: {
      name: "r1_type",
      type: "select",
      label: "适用类型:",
      list: [{
        label: "请选择",
        value: ""
      }, {
        label: "指向本身或循环的重定向",
        value: "指向本身或循环的重定向。"
      }, {
        label: "标题繁简混用",
        value: "标题繁简混用。"
      }, {
        label: "消歧义使用的括号或空格错误",
        value: "消歧义使用的括号或空格错误。"
      }, {
        label: "间隔号使用错误",
        value: "间隔号使用错误。"
      }, {
        label: "其他理由(请勾选上方“应用多个理由”,并填写自定义理由)",
        value: ""
      }]
    }
  }, {
    label: "R2:名称与导向目标代表事物不一致或不完全一致的重定向。",
    value: "r2",
    tooltip: "包括但不限于以下情况:1.由任何非条目页面(除用户页)导向条目页的重定向,以及由条目页导向任何非条目页面的重定向。2.明显笔误的重定向,如出现不常见的错别字等。(别称重定向不适用此项。若含错别字或有笔误的重定向使用频率高,此类重定向有助于帮助用户寻找到正确的页面,不适用此标准。有争议的此类重定向宜提交删除讨论。)3.明显与导向目标所涵盖的主题无关,或比导向目标所涵盖的主题更广泛的重定向。(若不明显,可改为提交删除讨论。)",
    subgroup: {
      name: "r2_type",
      type: "select",
      label: "适用类型:",
      list: [{
        label: "请选择",
        value: ""
      }, {
        label: "由非条目页面(除用户页)导向条目页的重定向",
        value: "由非条目页面(除用户页)导向条目页的重定向。"
      }, {
        label: "由条目页导向非条目页面的重定向",
        value: "由条目页导向任何非条目页面的重定向。"
      }, {
        label: "明显笔误的重定向",
        value: "明显笔误的重定向。"
      }, {
        label: "与导向目标无关或比其范围更广泛的重定向",
        value: "与导向目标无关或比其范围更广泛的重定向。"
      }, {
        label: "其他理由(请勾选上方“应用多个理由”,并填写自定义理由)",
        value: ""
      }]
    }
  }];
  Twinkle.speedy.normalizeHash = {
    reason: "db",
    multiple: "multiple",
    "multiple-finish": "multiple-finish",
    g1: "g1",
    g2: "g2",
    g3: "g3",
    g4: "g4",
    g5: "g5",
    g6: "g6",
    g7: "g7",
    g8: "g8",
    g9: "g9",
    a1: "a1",
    a2: "a2",
    a3: "a3",
    r1: "r1",
    r2: "r2",
    f1: "f1",
    f2: "f2",
    f3: "f3",
    f4: "f4",
    f5: "f5",
    o1: "o1",
    o2: "o2",
    o3: "o3"
  };
  Twinkle.speedy.callbacks = {
    getTemplateCodeAndParams: (params) => {
      let code;
      let parameters;
      let i;
      if (params.normalizeds.length > 1) {
        code = "{{delete";
        params.utparams = {};
        var _iterator11 = _createForOfIteratorHelper(params.normalizeds.entries()), _step11;
        try {
          for (_iterator11.s(); !(_step11 = _iterator11.n()).done; ) {
            const [index, norm] = _step11.value;
            if (norm !== "db") {
              code += "|".concat(norm.toUpperCase());
            }
            parameters = params.templateParams[index] || [];
            for (const i_ in parameters) {
              if (typeof parameters[i_] === "string") {
                code += "|".concat(parameters[i_]);
              }
            }
            params.utparams = {
              ...params.utparams,
              ...Twinkle.speedy.getUserTalkParameters(norm, parameters)
            };
          }
        } catch (err) {
          _iterator11.e(err);
        } finally {
          _iterator11.f();
        }
        code += "}}";
      } else {
        parameters = params.templateParams[0] || [];
        code = "{{delete";
        if (params.values[0] !== "reason") {
          code += "|".concat(params.values[0]);
        }
        for (i in parameters) {
          if (typeof parameters[i] === "string") {
            code += "|".concat(parameters[i]);
          }
        }
        code += "}}";
        params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
      }
      return [code, params.utparams];
    },
    parseWikitext: (title, wikitext, callback) => {
      const query = {
        action: "parse",
        prop: "text",
        pst: "true",
        text: wikitext,
        contentmodel: "wikitext",
        title
      };
      const statusIndicator = new Morebits.status(window.wgULS("构造删除理由", "構造刪除理由"));
      const api = new Morebits.wiki.api(window.wgULS("解析删除模板", "解析刪除模板"), query, (apiObj) => {
        const reason = decodeURIComponent($(apiObj.getXML().querySelector("text").childNodes[0].nodeValue).find("#delete-reason").text().replace(/\+/g, " "));
        if (reason) {
          statusIndicator.info("完成");
        } else {
          statusIndicator.warn(window.wgULS("未能从删除模板生成删除理由", "未能從刪除模板生成刪除理由"));
        }
        callback(reason);
      }, statusIndicator);
      api.post();
    },
    sysop: {
      main: (params) => {
        let reason;
        if (!params.normalizeds.length && params.normalizeds[0] === "db") {
          reason = prompt(window.wgULS("输入删除理由:", "輸入刪除理由:"), "");
          Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
        } else {
          const [code] = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
          Twinkle.speedy.callbacks.parseWikitext(mw.config.get("wgPageName"), code, (deleteReason) => {
            if (params.promptForSummary) {
              deleteReason = prompt(window.wgULS("输入删除理由,或单击确定以接受自动生成的:", "輸入刪除理由,或點擊確定以接受自動生成的:"), deleteReason);
            }
            Twinkle.speedy.callbacks.sysop.deletePage(deleteReason, params);
          });
        }
      },
      deletePage: (reason, params) => {
        const thispage = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("删除页面", "刪除頁面"));
        if (reason === null) {
          return Morebits.status.error(window.wgULS("询问理由", "詢問理由"), window.wgULS("用户取消操作。", "使用者取消操作。"));
        } else if (!reason || !reason.trim()) {
          return Morebits.status.error(window.wgULS("询问理由", "詢問理由"), window.wgULS("你不给我理由…我就…不管了…", "你不給我理由…我就…不管了…"));
        }
        const deleteMain = () => {
          thispage.setEditSummary(reason);
          thispage.setChangeTags(Twinkle.changeTags);
          thispage.setWatchlist(params.watch);
          thispage.deletePage(() => {
            thispage.getStatusElement().info("完成");
            Twinkle.speedy.callbacks.sysop.deleteTalk(params);
          });
        };
        if (params.openUserTalk) {
          thispage.setCallbackParameters(params);
          thispage.lookupCreation(() => {
            Twinkle.speedy.callbacks.sysop.openUserTalkPage(thispage);
            deleteMain();
          });
        } else {
          deleteMain();
        }
      },
      deleteTalk: (params) => {
        if (params.deleteTalkPage && params.normalized !== "o1" && !document.querySelector("#ca-talk").classList.contains("new")) {
          const talkpage = new Morebits.wiki.page("".concat(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceNumber") + 1], ":").concat(mw.config.get("wgTitle")), window.wgULS("删除讨论页", "刪除討論頁"));
          talkpage.setEditSummary("[[LIB:CSD#G9|G9]]: 孤立页面:已删除页面“".concat(Morebits.pageNameNorm, "”的讨论页"));
          talkpage.setChangeTags(Twinkle.changeTags);
          talkpage.deletePage();
          setTimeout(() => {
            Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
          }, 1800);
        } else {
          Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
        }
      },
      deleteRedirects: (params) => {
        if (params.deleteRedirects) {
          const query = {
            action: "query",
            titles: mw.config.get("wgPageName"),
            prop: "redirects",
            rdlimit: 5e3
            // 500 is max for normal users, 5000 for bots and sysops
          };
          const ysarchives_api = new Morebits.wiki.api(window.wgULS("获取重定向列表…", "取得重新導向列表…"), query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain, new Morebits.status(window.wgULS("删除重定向", "刪除重新導向")));
          ysarchives_api.params = params;
          ysarchives_api.post();
        }
        let $link;
        let $bigtext;
        if (params.normalized === "g7") {
          $link = $("<a>").attr("href", "#").text(window.wgULS("单击这里施行保护", "點擊這裡施行保護")).css({
            "font-size": "125%",
            "font-weight": "bold"
          }).on("click", () => {
            Morebits.wiki.actionCompleted.redirect = null;
            Twinkle.speedy.dialog.close();
            mw.config.set("wgArticleId", 0);
            Twinkle.protect.callback();
          });
          $bigtext = $("<span>").css({
            "font-size": "125%",
            "font-weight": "bold"
          }).text(window.wgULS("白纸保护该页", "白紙保護該頁"));
          Morebits.status.info($bigtext[0], $link[0]);
        }
        if (mw.config.get("wgNamespaceNumber") === 6) {
          $link = $("<a>").attr("href", "#").text(window.wgULS("单击这里前往取消链入工具", "點擊這裡前往取消連入工具")).css({
            "font-weight": "bold"
          }).on("click", () => {
            Morebits.wiki.actionCompleted.redirect = null;
            Twinkle.speedy.dialog.close();
            Twinkle.unlink.callback("".concat(window.wgULS("取消对已删除文件 ", "取消對已刪除檔案 ") + Morebits.pageNameNorm, " 的使用"));
          });
          $bigtext = $("<span>").css({
            "font-weight": "bold"
          }).text(window.wgULS("取消对已删除文件的使用", "取消對已刪除檔案的使用"));
          Morebits.status.info($bigtext[0], $link[0]);
        } else {
          $link = $("<a>").attr("href", "#").text(window.wgULS("单击这里前往取消链入工具", "點擊這裡前往取消連入工具")).css({
            "font-weight": "bold"
          }).on("click", () => {
            Morebits.wiki.actionCompleted.redirect = null;
            Twinkle.speedy.dialog.close();
            Twinkle.unlink.callback(window.wgULS("取消对已删除页面 ", "取消對已刪除頁面 ") + Morebits.pageNameNorm + window.wgULS(" 的链接", " 的連結"));
          });
          $bigtext = $("<span>").text(window.wgULS("取消对已删除页面的链接", "取消對已刪除頁面的連結")).css({
            "font-weight": "bold"
          });
          Morebits.status.info($bigtext[0], $link[0]);
        }
        $link = $("<a>").attr("href", mw.util.getUrl("Special:RandomInCategory/快速删除候选")).text(window.wgULS("单击前往下一个快速删除候选", "點擊前往下一個快速刪除候選"));
        Morebits.status.info("工具", $link[0]);
      },
      openUserTalkPage: (pageobj) => {
        pageobj.getStatusElement().unlink();
        const user = pageobj.getCreator();
        const params = pageobj.getCallbackParameters();
        const query = {
          action: "edit",
          preview: "yes",
          vanarticle: Morebits.pageNameNorm
        };
        const title = "User talk:".concat(user);
        if (params.normalized === "db" || Twinkle.getPref("promptForSpeedyDeletionSummary").includes(params.normalized)) {
          const $link = $("<a>").attr({
            href: mw.util.getUrl(title, query),
            target: "_blank",
            rel: "noopener noreferrer"
          }).css({
            "font-size": "125%",
            "font-weight": "bold"
          }).text(window.wgULS("点此打开User talk:", "點此打開User talk:") + user);
          const $bigtext = $("<span>").css({
            "font-size": "125%",
            "font-weight": "bold"
          }).text(window.wgULS("通知页面创建者", "通知頁面建立者"));
          Morebits.status.info($bigtext[0], $link[0]);
        } else {
          const statusIndicator = new Morebits.status(window.wgULS("打开用户", "打開使用者") + user + window.wgULS("的讨论页编辑窗口", "的討論頁編輯視窗"), window.wgULS("打开中…", "打開中…"));
          switch (Twinkle.getPref("userTalkPageMode")) {
            case "tab":
              window.open(mw.util.getUrl(title, query), "_blank", "noopener,noreferrer");
              break;
            case "blank":
              window.open(mw.util.getUrl(title, query), "_blank", "noopener,noreferrer,location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
              break;
            default:
              window.open(mw.util.getUrl(title, query), window.name === "twinklewarnwindow" ? "_blank" : "twinklewarnwindow", window.name === "twinklewarnwindow" ? "noopener,noreferrer," : "location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
              break;
          }
          statusIndicator.info("完成");
        }
      },
      deleteRedirectsMain: (apiobj) => {
        const xmlDoc = apiobj.getXML();
        const $snapshot = $(xmlDoc).find("redirects rd");
        const total = $snapshot.length;
        const statusIndicator = apiobj.statelem;
        if (!total) {
          statusIndicator.info(window.wgULS("未发现重定向", "未發現重新導向"));
          return;
        }
        statusIndicator.status("0%");
        let current = 0;
        const onsuccess = (apiobjInner) => {
          const now = "".concat(Number.parseInt(100 * ++current / total, 10), "%");
          statusIndicator.update(now);
          apiobjInner.statelem.unlink();
          if (current >= total) {
            statusIndicator.info("".concat(now, "(完成)"));
            Morebits.wiki.removeCheckpoint();
          }
        };
        Morebits.wiki.addCheckpoint();
        $snapshot.each((_key, value) => {
          const title = $(value).attr("title");
          const page = new Morebits.wiki.page(title, "".concat(window.wgULS('删除重定向 "', '刪除重新導向 "') + title, '"'));
          page.setEditSummary("[[LIB:CSD#G9|G9]]: 孤立页面:重定向到已删除页面“".concat(Morebits.pageNameNorm, "”"));
          page.setChangeTags(Twinkle.changeTags);
          page.deletePage(onsuccess);
        });
      }
    },
    user: {
      main: (pageobj) => {
        const statelem = pageobj.getStatusElement();
        if (!pageobj.exists()) {
          statelem.error(window.wgULS("页面不存在,可能已被删除", "頁面不存在,可能已被刪除"));
          return;
        }
        let text = pageobj.getPageText();
        const params = pageobj.getCallbackParameters();
        statelem.status(window.wgULS("检查页面已有标记…", "檢查頁面已有標記…"));
        const textNoSd = text.replace(/\{\{\s*(db(-\w*)?|d|delete|deletebecause|speedy|csd|速刪|速删|快删|快刪)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
        if (text !== textNoSd && !confirm(window.wgULS("在页面上找到快速删除模板,要移除并加入新的吗?", "在頁面上找到快速刪除模板,要移除並加入新的嗎?"))) {
          statelem.error(window.wgULS("快速删除模板已被置于页面中。", "快速刪除模板已被置於頁面中。"));
          return;
        }
        text = textNoSd;
        const copyvio = /(?:\{\{\s*(copyvio|侵权|侵權)[^{}]*?\}\})/i.exec(text);
        if (copyvio && !confirm(window.wgULS("著作权验证模板已被置于页面中,您是否仍想加入一个快速删除模板?", "著作權驗證模板已被置於頁面中,您是否仍想加入一個快速刪除模板?"))) {
          statelem.error(window.wgULS("页面中已有著作权验证模板。", "頁面中已有著作權驗證模板。"));
          return;
        }
        const xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec(text);
        if (xfd && !confirm(window.wgULS("删除相关模板{{", "刪除相關模板{{") + xfd[1] + window.wgULS("}}已被置于页面中,您是否仍想加入一个快速删除模板?", "}}已被置於頁面中,您是否仍想加入一個快速刪除模板?"))) {
          statelem.error(window.wgULS("页面已被提交至存废讨论。", "頁面已被提交至存廢討論。"));
          return;
        }
        const buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params);
        let [code] = buildData;
        [, params.utparams] = buildData;
        const thispage = new Morebits.wiki.page(mw.config.get("wgPageName"));
        if (Twinkle.getPref("markSpeedyPagesAsPatrolled")) {
          thispage.patrol();
        }
        if (mw.config.get("wgNamespaceNumber") === 10) {
          code = "<noinclude>".concat(code, "</noinclude>");
        }
        text = text.replace(/\{\{\s*([Nn]ew unreviewed article|[Uu]nreviewed|[Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
        if (mw.config.get("wgNamespaceNumber") === 6) {
          text = text.replace(/\{\{(mtc|(copy |move )?to ?(share|commons)|move to (ysarchives share|wikimedia commons)|copy to (ysarchives share|wikimedia commons))[^}]*\}\}/gi, "");
        }
        if (params.requestsalt) {
          code = "{{salt}}\n".concat(code);
        }
        let editsummary;
        if (params.normalizeds.length > 1) {
          editsummary = window.wgULS("请求快速删除(", "請求快速刪除(");
          var _iterator12 = _createForOfIteratorHelper(params.normalizeds), _step12;
          try {
            for (_iterator12.s(); !(_step12 = _iterator12.n()).done; ) {
              const norm = _step12.value;
              if (norm !== "db") {
                editsummary += "[[LIB:CSD#".concat(norm.toUpperCase(), "|CSD ").concat(norm.toUpperCase(), "]]、");
              }
            }
          } catch (err) {
            _iterator12.e(err);
          } finally {
            _iterator12.f();
          }
          editsummary = editsummary.slice(0, Math.max(0, editsummary.length - 1));
          editsummary += ")";
        } else if (params.normalizeds[0] === "db") {
          editsummary = window.wgULS("请求[[LIB:CSD|快速删除]]:", "請求[[LIB:CSD|快速刪除]]:") + params.templateParams[0]["1"];
        } else {
          editsummary = "".concat(window.wgULS("请求快速删除", "請求快速刪除"), "([[LIB:CSD#").concat(params.normalizeds[0].toUpperCase(), "|CSD ").concat(params.normalizeds[0].toUpperCase(), "]])");
        }
        if (params.blank) {
          text = code;
        } else {
          const ysarchives_page = new Morebits.wikitext.page(text);
          text = ysarchives_page.insertAfterTemplates("".concat(code, "\n"), Twinkle.hatnoteRegex).getText();
        }
        pageobj.setPageText(text);
        pageobj.setEditSummary(editsummary);
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setWatchlist(params.watch);
        pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
      },
      tagComplete: (pageobj) => {
        const params = pageobj.getCallbackParameters();
        if (params.usertalk) {
          const callback = (pageObj) => {
            let initialContrib = pageObj.getCreator();
            if (initialContrib === mw.config.get("wgUserName")) {
              Morebits.status.warn("您(".concat(initialContrib).concat(window.wgULS(")创建了该页,跳过通知", ")建立了該頁,跳過通知")));
              initialContrib = null;
            } else if (initialContrib === mw.config.get("wgTitle") && mw.config.get("wgNamespaceNumber") === 3) {
              Morebits.status.warn(window.wgULS("通知页面创建者:用户创建了自己的讨论页", "通知頁面建立者:使用者建立了自己的討論頁"));
              initialContrib = null;
            } else if (initialContrib === "A2093064-bot" && params.normalizeds[0] === "g15") {
              Morebits.status.warn(window.wgULS("通知页面创建者:由机器人创建,跳过通知", "通知頁面建立者:由機器人建立,跳過通知"));
              initialContrib = null;
            } else {
              const talkPageName = "User talk:".concat(initialContrib);
              const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + initialContrib, ")"));
              let notifytext;
              notifytext = "\n{{".concat("subst:", "db-notice|target=".concat(Morebits.pageNameNorm));
              notifytext += "|nowelcome=yes'}}--~~".concat("~~");
              let editsummary = "通知:";
              if (params.normalizeds.includes("g3")) {
                editsummary += "一攻击性页面";
              } else {
                editsummary += "页面[[".concat(Morebits.pageNameNorm, "]]");
              }
              editsummary += "快速删除提名";
              usertalkpage.setAppendText(notifytext);
              usertalkpage.setEditSummary(editsummary);
              usertalkpage.setChangeTags(Twinkle.changeTags);
              usertalkpage.setCreateOption("recreate");
              usertalkpage.setFollowRedirect(true, false);
              usertalkpage.append();
            }
            if (params.lognomination) {
              Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
            }
          };
          const thispage = new Morebits.wiki.page(Morebits.pageNameNorm);
          thispage.lookupCreation(callback);
        } else if (params.lognomination) {
          Twinkle.speedy.callbacks.user.addToLog(params, null);
        }
      },
      // note: this code is also invoked from twinkleimage
      // the params used are:
      //   for CSD: params.values, params.normalizeds  (note: normalizeds is an array)
      //   for DI: params.fromDI = true, params.templatename, params.normalized  (note: normalized is a string)
      addToLog: (params, initialContrib) => {
        const usl = new Morebits.userspaceLogger(Twinkle.getPref("speedyLogPageName"));
        usl.initialText = "这是该用户使用[[H:TW|Twinkle]]的速删模块做出的[[LIB:CSD|快速删除]]提名列表。\n\n若您不再想保留此日志,请在[[".concat(Twinkle.getPref("configPage"), "|参数设置]]中关掉,并使用[[LIB:CSD#O1|CSD O1]]提交快速删除。").concat(Morebits.userIsSysop ? "\n\n此日志并不记录用Twinkle直接执行的删除。" : "");
        let appendText = "# [[:".concat(Morebits.pageNameNorm, "]]:");
        if (params.fromDI) {
          appendText += "图版[[LIB:CSD#".concat(params.normalized.toUpperCase(), "|CSD ").concat(params.normalized.toUpperCase(), "]]({{tl|").concat(params.templatename, "}})");
        } else if (params.normalizeds.length > 1) {
          appendText += "多个理由(";
          var _iterator13 = _createForOfIteratorHelper(params.normalizeds), _step13;
          try {
            for (_iterator13.s(); !(_step13 = _iterator13.n()).done; ) {
              const norm = _step13.value;
              appendText += "[[LIB:CSD#".concat(norm.toUpperCase(), "|").concat(norm.toUpperCase(), "]]、");
            }
          } catch (err) {
            _iterator13.e(err);
          } finally {
            _iterator13.f();
          }
          appendText = appendText.slice(0, Math.max(0, appendText.length - 1));
          appendText += ")";
        } else if (params.normalizeds[0] === "db") {
          appendText += "自定义理由";
        } else {
          appendText += "[[LIB:CSD#".concat(params.normalizeds[0].toUpperCase(), "|CSD ").concat(params.normalizeds[0].toUpperCase(), "]]");
        }
        if (params.requestsalt) {
          appendText += window.wgULS(";请求白纸保护", ";請求白紙保護");
        }
        if (initialContrib) {
          appendText += ";通知{{user|".concat(initialContrib, "}}");
        }
        appendText += " ~~".concat("~", "~~\n");
        usl.changeTags = Twinkle.changeTags;
        usl.log(appendText, window.wgULS("记录对[[", "記錄對[[") + Morebits.pageNameNorm + window.wgULS("]]的快速删除提名", "]]的快速刪除提名"));
      }
    }
  };
  Twinkle.speedy.getParameters = (form, values) => {
    let parameters = [];
    var _iterator14 = _createForOfIteratorHelper(values), _step14;
    try {
      for (_iterator14.s(); !(_step14 = _iterator14.n()).done; ) {
        const value = _step14.value;
        const currentParams = [];
        let redimage;
        switch (value) {
          case "reason":
            if (form["csd.reason_1"]) {
              const dbrationale = form["csd.reason_1"].value;
              if (!dbrationale || !dbrationale.trim()) {
                mw.notify(window.wgULS("自定义理由:请指定理由。", "自訂理由:請指定理由。"), {
                  type: "warn",
                  tag: "twinklespeedy"
                });
                parameters = null;
                false;
                continue;
              }
              currentParams["1"] = dbrationale;
            }
            break;
          case "a2":
            if (form["csd.a2_pagename"]) {
              const otherpage = form["csd.a2_pagename"].value;
              if (!otherpage || !otherpage.trim()) {
                mw.notify(window.wgULS("CSD A2:请提供现有条目的名称。", "CSD A2:請提供現有條目的名稱。"), {
                  type: "warn",
                  tag: "twinklespeedy"
                });
                parameters = null;
                false;
                continue;
              }
              currentParams.pagename = otherpage;
            }
            break;
          case "g4":
            if (form["csd.g4_pagename"]) {
              const pagename = form["csd.g4_pagename"].value;
              if (!pagename || !pagename.trim()) {
                mw.notify(window.wgULS("CSD G4:请提供页面名称。", "CSD G4:請提供頁面名稱。"), {
                  type: "warn",
                  tag: "twinklespeedy"
                });
                parameters = null;
                false;
                continue;
              }
              currentParams.pagename = pagename;
            }
            break;
          case "f2":
            if (form["csd.f2_filename"]) {
              redimage = form["csd.f2_filename"].value;
              if (!redimage || !redimage.trim()) {
                mw.notify(window.wgULS("CSD F2:请提供另一文件的名称。", "CSD F2:請提供另一檔案的名稱。"), {
                  type: "warn",
                  tag: "twinklespeedy"
                });
                parameters = null;
                false;
                continue;
              }
              currentParams.filename = redimage.replace(new RegExp("^\\s*".concat(Morebits.namespaceRegex(6), ":"), "i"), "");
            }
            break;
          case "r1":
            if (form["csd.r1_type"]) {
              const redirtype = form["csd.r1_type"].value;
              if (!redirtype) {
                mw.notify(window.wgULS("CSD R1:请选择适用类型。", "CSD R1:請選擇適用類別。"), {
                  type: "warn",
                  tag: "twinklespeedy"
                });
                parameters = null;
                false;
                continue;
              }
              currentParams["1"] = redirtype;
            }
            break;
          case "r2":
            if (form["csd.r2_type"]) {
              const redirtype = form["csd.r2_type"].value;
              if (!redirtype) {
                mw.notify(window.wgULS("CSD R2:请选择适用类型。", "CSD R2:請選擇適用類別。"), {
                  type: "warn",
                  tag: "twinklespeedy"
                });
                parameters = null;
                false;
                continue;
              }
              currentParams["1"] = redirtype;
            }
            break;
          default:
            break;
        }
        parameters.push(currentParams);
      }
    } catch (err) {
      _iterator14.e(err);
    } finally {
      _iterator14.f();
    }
    return parameters;
  };
  Twinkle.speedy.getUserTalkParameters = (normalized) => {
    const utparams = [];
    switch (normalized) {
      default:
        break;
    }
    return utparams;
  };
  Twinkle.speedy.resolveCsdValues = (e) => {
    var _e$target$form;
    const values = ((_e$target$form = e.target.form) !== null && _e$target$form !== void 0 ? _e$target$form : e.target).getChecked("csd");
    if (values.length === 0) {
      mw.notify(window.wgULS("请选择一个理据!", "請選擇一個理據!"), {
        type: "warn",
        tag: "twinklespeedy"
      });
      return null;
    }
    return values;
  };
  Twinkle.speedy.callback.evaluateSysop = (e) => {
    var _e$target$form2;
    const form = (_e$target$form2 = e.target.form) !== null && _e$target$form2 !== void 0 ? _e$target$form2 : e.target;
    if (e.target.type === "checkbox" || e.target.type === "text" || e.target.type === "select") {
      return;
    }
    const {
      tag_only
    } = form;
    if (tag_only && tag_only.checked) {
      Twinkle.speedy.callback.evaluateUser(e);
      return;
    }
    const values = Twinkle.speedy.resolveCsdValues(e);
    if (!values) {
      return;
    }
    const normalizeds = values.map((value) => {
      return Twinkle.speedy.normalizeHash[value];
    });
    let watchPage;
    let promptForSummary;
    var _iterator15 = _createForOfIteratorHelper(normalizeds), _step15;
    try {
      for (_iterator15.s(); !(_step15 = _iterator15.n()).done; ) {
        const norm = _step15.value;
        if (Twinkle.getPref("watchSpeedyPages").includes(norm)) {
          watchPage = Twinkle.getPref("watchSpeedyExpiry");
        }
        if (Twinkle.getPref("promptForSpeedyDeletionSummary").includes(norm)) {
          promptForSummary = true;
        }
      }
    } catch (err) {
      _iterator15.e(err);
    } finally {
      _iterator15.f();
    }
    const params = {
      values,
      normalizeds,
      watch: watchPage,
      deleteTalkPage: form.talkpage && form.talkpage.checked,
      deleteRedirects: form.redirects.checked,
      openUserTalk: form.openusertalk.checked,
      promptForSummary,
      templateParams: Twinkle.speedy.getParameters(form, values)
    };
    if (!params.templateParams) {
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    Twinkle.speedy.callbacks.sysop.main(params);
  };
  Twinkle.speedy.callback.evaluateUser = (e) => {
    var _e$target$form3;
    const form = (_e$target$form3 = e.target.form) !== null && _e$target$form3 !== void 0 ? _e$target$form3 : e.target;
    if (e.target.type === "checkbox" || e.target.type === "text" || e.target.type === "select") {
      return;
    }
    const values = Twinkle.speedy.resolveCsdValues(e);
    if (!values) {
      return;
    }
    const normalizeds = [];
    var _iterator16 = _createForOfIteratorHelper(values), _step16;
    try {
      for (_iterator16.s(); !(_step16 = _iterator16.n()).done; ) {
        const value = _step16.value;
        const norm = Twinkle.speedy.normalizeHash[value];
        normalizeds.push(norm);
      }
    } catch (err) {
      _iterator16.e(err);
    } finally {
      _iterator16.f();
    }
    let watchPage = false;
    for (var _i7 = 0, _normalizeds = normalizeds; _i7 < _normalizeds.length; _i7++) {
      const norm = _normalizeds[_i7];
      if (Twinkle.getPref("watchSpeedyPages").includes(norm)) {
        watchPage = Twinkle.getPref("watchSpeedyExpiry");
        false;
        continue;
      }
    }
    let notifyuser = false;
    if (form.notify.checked) {
      var _iterator17 = _createForOfIteratorHelper(normalizeds), _step17;
      try {
        for (_iterator17.s(); !(_step17 = _iterator17.n()).done; ) {
          const norm = _step17.value;
          if (Twinkle.getPref("notifyUserOnSpeedyDeletionNomination").includes(norm)) {
            notifyuser = true;
            false;
            continue;
          }
        }
      } catch (err) {
        _iterator17.e(err);
      } finally {
        _iterator17.f();
      }
    }
    let csdlog = false;
    if (Twinkle.getPref("logSpeedyNominations")) {
      var _iterator18 = _createForOfIteratorHelper(normalizeds), _step18;
      try {
        for (_iterator18.s(); !(_step18 = _iterator18.n()).done; ) {
          const norm = _step18.value;
          if (!Twinkle.getPref("noLogOnSpeedyNomination").includes(norm)) {
            csdlog = true;
            false;
            continue;
          }
        }
      } catch (err) {
        _iterator18.e(err);
      } finally {
        _iterator18.f();
      }
    }
    const params = {
      values,
      normalizeds,
      watch: watchPage,
      usertalk: notifyuser,
      lognomination: csdlog,
      blank: form.blank.checked,
      requestsalt: form.salting.checked,
      templateParams: Twinkle.speedy.getParameters(form, values)
    };
    if (!params.templateParams) {
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
    Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成", "標記完成");
    const ysarchives_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("标记页面", "標記頁面"));
    ysarchives_page.setCallbackParameters(params);
    ysarchives_page.load(Twinkle.speedy.callbacks.user.main);
  };
  Twinkle.addInitCallback(Twinkle.speedy, "speedy");
})(jQuery);
//! src/Twinkle/modules/twinklecopyvio.js
/*! Twinkle.js - twinklecopyvio.js */
(function twinklecopyvio() {
  Twinkle.copyvio = () => {
    if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId") || mw.config.get("wgNamespaceNumber") === 6 && (document.querySelector("#mw-sharedupload") || !document.querySelector("#mw-imagepage-section-filehistory") && !Morebits.isPageRedirect())) {
      return;
    }
    Twinkle.addPortletLink(Twinkle.copyvio.callback, window.wgULS("侵权", "侵權"), "tw-copyvio", window.wgULS("提报侵权页面", "提報侵權頁面"), "");
  };
  Twinkle.copyvio.callback = () => {
    const Window = new Morebits.simpleWindow(600, 350);
    Window.setTitle(window.wgULS("提报侵权页面", "提報侵權頁面"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("侵权设置", "侵權設定"), "H:TW/PREF#copyvio");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#copyvio");
    const form = new Morebits.quickForm(Twinkle.copyvio.callback.evaluate);
    form.append({
      type: "textarea",
      label: window.wgULS("侵权来源:", "侵權來源:"),
      name: "source"
    });
    form.append({
      type: "checkbox",
      list: [{
        label: window.wgULS("CSD G4: 曾经根据侵权审核删除后又重新创建的内容", "CSD G4: 曾經根據侵權審核刪除後又重新建立的內容"),
        value: "g4",
        name: "g4",
        tooltip: window.wgULS("同时以G4准则提报快速删除", "同時以G4準則提報快速刪除"),
        subgroup: [{
          name: "g4_pagename",
          type: "input",
          label: window.wgULS("前次删除的页面名称", "前次刪除的頁面名稱"),
          tooltip: window.wgULS("选填,若前次删除的页面名称不同,请提供", "選填,若前次刪除的頁面名稱不同,請提供")
        }]
      }, {
        label: window.wgULS("通知页面创建者", "通知頁面建立者"),
        value: "notify",
        name: "notify",
        tooltip: window.wgULS("在页面创建者讨论页上放置一通知模板。", "在頁面建立者討論頁上放置一通知模板。"),
        checked: true
      }]
    });
    form.append({
      type: "submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
  };
  Twinkle.copyvio.callbacks = {
    tryTagging: (pageobj) => {
      const text = pageobj.getPageText();
      if (text.includes("{{Copyvio|")) {
        Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("页面已经标记侵权,请人工确认是否已经提报。", "頁面已經標記侵權,請人工確認是否已經提報。"));
      } else {
        Twinkle.copyvio.callbacks.taggingArticle(pageobj);
        const ysarchives_page = new Morebits.wiki.page(mw.config.get("wgPageName"));
        ysarchives_page.setCallbackParameters(pageobj.getCallbackParameters());
        ysarchives_page.lookupCreation(Twinkle.copyvio.callbacks.main);
      }
    },
    main: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      const initialContrib = pageobj.getCreator();
      const ysarchives_page = new Morebits.wiki.page(params.logpage, window.wgULS("加入侵权记录项", "加入侵權記錄項"));
      ysarchives_page.setFollowRedirect(true);
      ysarchives_page.setCallbackParameters(params);
      ysarchives_page.load(Twinkle.copyvio.callbacks.copyvioList);
      if (params.notify) {
        const usertalkpage = new Morebits.wiki.page("User talk:".concat(initialContrib), "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + initialContrib, ")"));
        const notifytext = "\n{{".concat("subst:", "CopyvioNotice|".concat(mw.config.get("wgPageName"), "}}"));
        usertalkpage.setAppendText(notifytext);
        usertalkpage.setEditSummary(window.wgULS("通知:页面[[", "通知:頁面[[") + mw.config.get("wgPageName") + window.wgULS("]]疑似侵犯著作权", "]]疑似侵犯版權"));
        usertalkpage.setChangeTags(Twinkle.changeTags);
        usertalkpage.setCreateOption("recreate");
        usertalkpage.setWatchlist(Twinkle.getPref("copyvioWatchUser"));
        usertalkpage.setFollowRedirect(true, false);
        usertalkpage.append();
      }
    },
    taggingArticle: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      const revisionId = mw.config.get("wgRevisionId") || mw.config.get("wgDiffNewId") || mw.config.get("wgCurRevisionId");
      let tag = "{{".concat("subst:", "Copyvio/auto|url=".concat(params.source.replace(/http/g, "&#104;ttp").replace(/\n+/g, "\n").replace(/^\s*([^*])/gm, "* $1").replace(/^\* $/m, ""), "|OldRevision=").concat(revisionId, "}}"));
      const text = pageobj.getPageText();
      const oldcsd = text.match(/\{\{\s*(db(-\w*)?|d|delete)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}/i);
      if (oldcsd && confirm(window.wgULS("在页面上找到快速删除模板,要保留吗?\n\n当页面同时侵犯著作权又符合快速删除标准时,应该优先走快速删除程序。\n单击“确认”以保留快速删除模板,若您认为快速删除理由不合,单击“取消”以移除快速删除模板。", "在頁面上找到快速刪除模板,要保留嗎?\n\n當頁面同時侵犯版權又符合快速刪除標準時,應該優先走快速刪除程序。\n點擊「確認」以保留快速刪除模板,若您認為快速刪除理由不合,點擊「取消」以移除快速刪除模板。"))) {
        tag = "".concat(oldcsd[0], "\n").concat(tag);
      }
      if (params.g4) {
        let speedyTag = "{{delete";
        speedyTag += "|g4";
        if (params.g4_pagename) {
          speedyTag += "|".concat(params.g4_pagename, "|c1=[[Special:Undelete/").concat(params.g4_pagename, "]]");
        } else {
          speedyTag += "|c1=[[Special:Undelete/".concat(mw.config.get("wgPageName"), "]]");
        }
        speedyTag += "}}";
        tag = "".concat(speedyTag, "\n").concat(tag);
      }
      pageobj.setPageText(tag);
      pageobj.setEditSummary(window.wgULS("此页面疑似侵犯著作权", "此頁面疑似侵犯版權"));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setWatchlist(Twinkle.getPref("copyvioWatchPage"));
      pageobj.save();
      if (Twinkle.getPref("markCopyvioPagesAsPatrolled")) {
        pageobj.patrol();
      }
    },
    copyvioList: (pageobj) => {
      const text = pageobj.getPageText();
      let output = "";
      const date = /* @__PURE__ */ new Date();
      const dateHeaderRegex = new RegExp("^==+\\s*".concat(date.getUTCMonth() + 1, "月").concat(date.getUTCDate(), "日\\s*==+"), "mg");
      if (!dateHeaderRegex.exec(text)) {
        output = "\n\n==".concat(date.getUTCMonth() + 1, "月").concat(date.getUTCDate(), "日==");
      }
      output += "\n{{".concat("subst:", "CopyvioVFDRecord|".concat(mw.config.get("wgPageName"), "}}"));
      pageobj.setAppendText(output);
      pageobj.setEditSummary("加入[[".concat(mw.config.get("wgPageName"), "]]"));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setCreateOption("recreate");
      pageobj.append();
    }
  };
  Twinkle.copyvio.callback.evaluate = (e) => {
    const params = Morebits.quickForm.getInputData(e.target);
    if (!params.source.trim()) {
      mw.notify(window.wgULS("请指定侵权来源", "請指定侵權來源"), {
        type: "warn",
        tag: "twinklecopyvio"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(e.target);
    params.logpage = "LIB_talk:侵权提报";
    Morebits.wiki.addCheckpoint();
    Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
    Morebits.wiki.actionCompleted.notice = window.wgULS("提报完成,将在几秒内刷新页面", "提報完成,將在幾秒內重新整理頁面");
    const ysarchives_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入侵权模板到页面", "加入侵權模板到頁面"));
    ysarchives_page.setCallbackParameters(params);
    ysarchives_page.load(Twinkle.copyvio.callbacks.tryTagging);
    Morebits.wiki.removeCheckpoint();
  };
  Twinkle.addInitCallback(Twinkle.copyvio, "copyvio");
})();
//! src/Twinkle/modules/twinklexfd.js
/*! Twinkle.js - twinklexfd.js */
(function twinklexfd() {
  Twinkle.xfd = () => {
    if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId") || mw.config.get("wgNamespaceNumber") === 6 && (document.querySelector("#mw-sharedupload") || !document.querySelector("#mw-imagepage-section-filehistory") && !Morebits.isPageRedirect())) {
      return;
    }
    Twinkle.addPortletLink(Twinkle.xfd.callback, window.wgULS("提删", "提刪"), "tw-xfd", window.wgULS("提交删除讨论", "提交刪除討論"));
  };
  Twinkle.xfd.currentRationale = null;
  Twinkle.xfd.printRationale = () => {
    if (Twinkle.xfd.currentRationale) {
      Morebits.status.printUserText(Twinkle.xfd.currentRationale, window.wgULS("您的理由已在下方提供,若您想重新提交,请将其复制到一新窗口中:", "您的理由已在下方提供,若您想重新提交,請將其複製到一新視窗中:"));
      Twinkle.xfd.currentRationale = null;
    }
  };
  Twinkle.xfd.callback = () => {
    const Window = new Morebits.simpleWindow(600, 350);
    Window.setTitle(window.wgULS("提交存废讨论", "提交存廢討論"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("提删设置", "提刪設定"), "H:TW/PREF#xfd");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#xfd");
    const form = new Morebits.quickForm(Twinkle.xfd.callback.evaluate);
    const categories = form.append({
      type: "select",
      name: "category",
      label: window.wgULS("提交类型:", "提交類別:"),
      event: Twinkle.xfd.callback.change_category
    });
    categories.append({
      type: "option",
      label: window.wgULS("页面存废讨论", "頁面存廢討論"),
      selected: mw.config.get("wgNamespaceNumber") === 0,
      value: "afd"
    });
    categories.append({
      type: "option",
      label: window.wgULS("文件存废讨论", "檔案存廢討論"),
      selected: mw.config.get("wgNamespaceNumber") === 6,
      value: "ffd"
    });
    form.append({
      type: "checkbox",
      list: [{
        label: window.wgULS("如可能,通知页面创建者", "如可能,通知頁面建立者"),
        value: "notify",
        name: "notify",
        tooltip: window.wgULS("在页面创建者讨论页上放置一通知模板。", "在頁面建立者討論頁上放置一通知模板。"),
        checked: true
      }]
    });
    form.append({
      type: "field",
      label: "工作区",
      name: "work_area"
    });
    form.append({
      type: "submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    const evt = document.createEvent("Event");
    evt.initEvent("change", true, true);
    result.category.dispatchEvent(evt);
  };
  Twinkle.xfd.callback.change_category = (e) => {
    const {
      value
    } = e.target;
    const {
      form
    } = e.target;
    const [old_area] = Morebits.quickForm.getElements(e.target.form, "work_area");
    let work_area = null;
    const oldreasontextbox = form.querySelector("textarea");
    let oldreason = oldreasontextbox ? oldreasontextbox.value : "";
    const appendReasonBox = (xfd_cat) => {
      switch (xfd_cat) {
        case "fwdcsd":
          oldreason = decodeURIComponent(document.querySelector("#delete-reason").textContent).replace(/\+/g, " ");
          break;
        case "fame":
          oldreason = Twinkle.getPref("afdFameDefaultReason");
          break;
        case "substub":
          oldreason = Twinkle.getPref("afdSubstubDefaultReason");
          break;
        default:
          break;
      }
      work_area.append({
        type: "textarea",
        name: "xfdreason",
        label: window.wgULS("提删理由:", "提刪理由:"),
        value: oldreason,
        tooltip: window.wgULS("您可以使用wikitext,Twinkle将自动为您加入签名。若您使用批量提删功能,存废讨论页只会使用第一次提交的理由,但之后您仍需提供以用于删除通告模板的参数。", "您可以使用wikitext,Twinkle將自動為您加入簽名。若您使用批次提刪功能,存廢討論頁只會使用第一次提交的理由,但之後您仍需提供以用於刪除通告模板的參數。"),
        placeholder: window.wgULS("此值亦显示于页面的删除通告模板内,故务必提供此值,避免使用“同上”等用语。", "此值亦顯示於頁面的刪除通告模板內,故務必提供此值,避免使用「同上」等用語。")
      });
    };
    switch (value) {
      case "afd": {
        work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("页面存废讨论", "頁面存廢討論"),
          name: "work_area"
        });
        work_area.append({
          type: "checkbox",
          list: [{
            label: "使用&lt;noinclude&gt;包裹模板",
            value: "noinclude",
            name: "noinclude",
            checked: mw.config.get("wgNamespaceNumber") === 10 && mw.config.get("wgPageContentModel") !== "Scribunto",
            // Template namespace
            tooltip: window.wgULS("使其不会在被包含时出现。", "使其不會在被包含時出現。"),
            disabled: mw.config.get("wgPageContentModel") === "Scribunto"
          }]
        });
        const afd_category = work_area.append({
          type: "select",
          name: "xfdcat",
          label: window.wgULS("选择提删类型:", "選擇提刪類別:"),
          event: Twinkle.xfd.callback.change_afd_category
        });
        let afd_cat = "delete";
        if (Twinkle.getPref("afdDefaultCategory") === "same") {
          if (localStorage.Twinkle_afdCategory === void 0) {
            localStorage.Twinkle_afdCategory = "delete";
          } else {
            afd_cat = localStorage.Twinkle_afdCategory;
          }
        }
        afd_category.append({
          type: "option",
          label: window.wgULS("删除", "刪除"),
          value: "delete",
          selected: afd_cat === "delete"
        });
        afd_category.append({
          type: "option",
          label: window.wgULS("合并", "合併"),
          value: "merge",
          selected: afd_cat === "merge"
        });
        if (Twinkle.getPref("FwdCsdToXfd")) {
          afd_category.append({
            type: "option",
            label: window.wgULS("转交自快速删除候选", "轉交自快速刪除候選"),
            value: "fwdcsd",
            selected: afd_cat === "fwdcsd"
          });
        }
        afd_category.append({
          type: "option",
          label: window.wgULS("批量关注度提删", "批次關注度提刪"),
          value: "fame",
          selected: afd_cat === "fame"
        });
        afd_category.append({
          type: "option",
          label: window.wgULS("批量小小作品提删", "批次小小作品提刪"),
          value: "substub",
          selected: afd_cat === "substub"
        });
        afd_category.append({
          type: "option",
          label: window.wgULS("批量其他提删", "批次其他提刪"),
          value: "batch",
          selected: afd_cat === "batch"
        });
        work_area.append({
          type: "input",
          name: "mergeinto",
          label: window.wgULS("合并到:", "合併到:"),
          hidden: true
        });
        appendReasonBox(afd_cat);
        work_area.append({
          type: "textarea",
          name: "fwdcsdreason",
          label: window.wgULS("转交理由:", "轉交理由:"),
          tooltip: window.wgULS("您可以使用wikitext,Twinkle将自动为您加入签名。", "您可以使用wikitext,Twinkle將自動為您加入簽名。"),
          hidden: true
        });
        work_area = work_area.render();
        old_area.parentNode.replaceChild(work_area, old_area);
        const evt = document.createEvent("Event");
        evt.initEvent("change", true, true);
        form.xfdcat.dispatchEvent(evt);
        break;
      }
      case "ffd":
        work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("文件存废讨论", "檔案存廢討論"),
          name: "work_area"
        });
        appendReasonBox("ffd");
        work_area = work_area.render();
        old_area.parentNode.replaceChild(work_area, old_area);
        break;
      default:
        work_area = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("未定义", "未定義"),
          name: "work_area"
        });
        work_area = work_area.render();
        old_area.parentNode.replaceChild(work_area, old_area);
        break;
    }
    form.notify.checked = true;
    form.notify.disabled = false;
  };
  Twinkle.xfd.callback.change_afd_category = (e) => {
    switch (e.target.value) {
      case "merge":
        e.target.form.mergeinto.parentElement.removeAttribute("hidden");
        e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
        e.target.form.mergeinto.previousElementSibling.innerHTML = window.wgULS("合并到:", "合併到:");
        break;
      case "fwdcsd":
        e.target.form.mergeinto.parentElement.removeAttribute("hidden");
        e.target.form.fwdcsdreason.parentElement.removeAttribute("hidden");
        e.target.form.mergeinto.previousElementSibling.innerHTML = "提交人:";
        e.target.form.xfdreason.value = decodeURIComponent(document.querySelector("#delete-reason").textContent).replace(/\+/g, " ");
        break;
      case "fame":
        e.target.form.mergeinto.parentElement.setAttribute("hidden", "");
        e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
        e.target.form.xfdreason.value = Twinkle.getPref("afdFameDefaultReason");
        break;
      case "substub":
        e.target.form.mergeinto.parentElement.setAttribute("hidden", "");
        e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
        e.target.form.xfdreason.value = Twinkle.getPref("afdSubstubDefaultReason");
        break;
      default:
        e.target.form.mergeinto.parentElement.setAttribute("hidden", "");
        e.target.form.fwdcsdreason.parentElement.setAttribute("hidden", "");
    }
    if (Twinkle.getPref("afdDefaultCategory") === "same") {
      localStorage.Twinkle_afdCategory = e.target.value;
    }
  };
  Twinkle.xfd.callbacks = {
    afd: {
      main: (tagging_page) => {
        const params = tagging_page.getCallbackParameters();
        Twinkle.xfd.callbacks.afd.taggingArticle(tagging_page);
        const discussion_page = new Morebits.wiki.page(params.logpage, window.wgULS("加入讨论到当日列表", "加入討論到當日列表"));
        discussion_page.setFollowRedirect(true);
        discussion_page.setCallbackParameters(params);
        discussion_page.load(Twinkle.xfd.callbacks.afd.todaysList);
        if (params.notify) {
          if (params.creator === mw.config.get("wgUserName")) {
            Morebits.status.warn("".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"), window.wgULS("您创建了该页,跳过通知", "您建立了該頁,跳過通知"));
            params.creator = null;
          } else {
            const talkPageName = "User talk:".concat(params.creator);
            const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"));
            const notifytext = "\n{{".concat("subst:").concat("AFDNote|".concat(Morebits.pageNameNorm, "}}--~~"), "~~");
            usertalkpage.setAppendText(notifytext);
            usertalkpage.setEditSummary("通知:页面[[".concat(Morebits.pageNameNorm, "]]存废讨论提名"));
            usertalkpage.setChangeTags(Twinkle.changeTags);
            usertalkpage.setCreateOption("recreate");
            usertalkpage.setWatchlist(Twinkle.getPref("xfdWatchUser"));
            usertalkpage.setFollowRedirect(true, false);
            usertalkpage.append();
          }
          if (params.lognomination) {
            Twinkle.xfd.callbacks.addToLog(params, params.creator);
          }
        } else if (params.lognomination) {
          Twinkle.xfd.callbacks.addToLog(params, null);
        }
      },
      taggingArticle: (pageobj) => {
        let text = pageobj.getPageText();
        const params = pageobj.getCallbackParameters();
        let tag = "{{vfd|".concat(Morebits.string.formatReasonText(params.xfdreason));
        if (Morebits.isPageRedirect()) {
          tag += "|r";
        }
        tag += "|date={{".concat("subst:", "#time:Y/m/d}}}}");
        if (params.noinclude) {
          tag = "<noinclude>".concat(tag, "</noinclude>");
          if (text.indexOf("{|") === 0) {
            tag += "\n";
          }
        } else {
          tag += "\n";
        }
        const textNoSd = text.replace(/\{\{\s*(db(-\w*)?|d|delete|(?:hang|hold)[- ]?on)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
        if (text !== textNoSd && confirm(window.wgULS("在页面上找到快速删除模板,要移除吗?", "在頁面上找到快速刪除模板,要移除嗎?"))) {
          text = textNoSd;
        }
        const textNoNotMandarin = text.replace(/\{\{\s*(NotMandarin|Notchinese|非中文|非現代漢語|非现代汉语|非現代標準漢語|非现代标准汉语)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
        if (text !== textNoNotMandarin && confirm(window.wgULS("在页面上找到非现代标准汉语模板,要移除吗?", "在頁面上找到非現代標準漢語模板,要移除嗎?"))) {
          text = textNoNotMandarin;
        }
        const textNoAfc = text.replace(/{{\s*AFC submission\s*\|\s*\|[^}]*?}}\s*/gi, "");
        if (text !== textNoAfc && confirm(window.wgULS("在页面上找到AFC提交模板,要移除吗?", "在頁面上找到AFC提交模板,要移除嗎?"))) {
          text = textNoAfc;
        }
        if (Twinkle.getPref("markXfdPagesAsPatrolled")) {
          pageobj.patrol();
        }
        const ysarchives_page = new Morebits.wikitext.page(text);
        text = ysarchives_page.insertAfterTemplates(tag, Twinkle.hatnoteRegex).getText();
        pageobj.setPageText(text);
        pageobj.setEditSummary("".concat(window.wgULS("页面存废讨论:[[", "頁面存廢討論:[[") + params.logpage, "#").concat(Morebits.pageNameNorm, "]]"));
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setWatchlist(Twinkle.getPref("xfdWatchPage"));
        pageobj.save();
      },
      todaysList: (pageobj) => {
        let text = pageobj.getPageText();
        const params = pageobj.getCallbackParameters();
        let type = "";
        let to = "";
        switch (params.xfdcat) {
          case "fwdcsd":
          case "merge":
            to = params.mergeinto;
          default:
            type = params.xfdcat;
            break;
        }
        let append = true;
        switch (type) {
          case "fame":
          case "substub":
          case "batch": {
            const commentText = "<!-- Twinkle: User:".concat(mw.config.get("wgUserName"), " 的 ").concat(type, " 提删插入点,请勿更改或移除此行,除非不再于此页面提删 -->");
            let newText = "===[[:".concat(Morebits.pageNameNorm, "]]===");
            if (type === "fame") {
              newText += "\n{{Findsources|".concat(Morebits.pageNameNorm, "}}");
            }
            if (text.includes(commentText)) {
              text = text.replace(commentText, "".concat(newText, "\n\n").concat(commentText));
              pageobj.setPageText(text);
              append = false;
            } else {
              const safesubst = "safesubst";
              const appendText = "\n{{".concat(safesubst).concat(":SafeAfdHead}}\n".concat({
                fame: '== 30天后仍挂有{{tl|notability}}模板的条目 ==\n<span style="font-size: smaller;">(已挂[[Template:notability|不符收录标准模板]]30天)</span>',
                substub: '== 30天后仍挂有{{tl|substub}}模板的条目 ==\n<span style="font-size: smaller;">(已挂[[Template:substub|小小条目模板]]30天)</span>',
                batch: "== 批量提删 =="
              }[type], "\n").concat(newText, "\n\n").concat(commentText, "\n----\n:建议:删除前述页面;理由:").concat(Morebits.string.formatReasonText(params.xfdreason), "\n提报以上").concat({
                fame: "<u>不符合收录标准</u>条目",
                substub: "<u>长度过短</u>条目",
                batch: "页面"
              }[type], '的求闻编者及时间:<br id="no-new-title">~~').concat("~~"));
              pageobj.setAppendText(appendText);
            }
            break;
          }
          default:
            pageobj.setAppendText("\n{{".concat("subst:", "DRItem|Type=".concat(type, "|DRarticles=").concat(Morebits.pageNameNorm, "|Reason=").concat(Morebits.string.formatReasonText(params.xfdreason)).concat(params.fwdcsdreason.trim() === "" ? "" : "<br>\n转交理由:".concat(params.fwdcsdreason), "|To=").concat(to, "}}~~").concat("~~")));
            break;
        }
        pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setWatchlist(Twinkle.getPref("xfdWatchDiscussion"));
        pageobj.setCreateOption("recreate");
        if (append) {
          pageobj.append();
        } else {
          pageobj.save();
        }
        Twinkle.xfd.currentRationale = null;
      },
      lookupCreation: (target_page) => {
        target_page.getStatusElement().info("完成");
        const params = target_page.getCallbackParameters();
        params.creator = target_page.getCreator();
        const tagging_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入存废讨论模板到页面", "加入存廢討論模板到頁面"));
        tagging_page.setFollowRedirect(false);
        tagging_page.setCallbackParameters(params);
        tagging_page.load(Twinkle.xfd.callbacks.afd.tryTagging);
      },
      tryTagging: (tagging_page) => {
        const statelem = tagging_page.getStatusElement();
        if (!tagging_page.exists()) {
          statelem.error(window.wgULS("页面不存在,可能已被删除", "頁面不存在,可能已被刪除"));
          return;
        }
        const text = tagging_page.getPageText();
        const xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec(text);
        if (xfd && !confirm(window.wgULS("删除相关模板{{", "刪除相關模板{{") + xfd[1] + window.wgULS("}}已被置于页面中,您是否仍想继续提报?", "}}已被置於頁面中,您是否仍想繼續提報?"))) {
          statelem.error(window.wgULS("页面已被提交至存废讨论。", "頁面已被提交至存廢討論。"));
          return;
        }
        const copyvio = /(?:\{\{\s*(copyvio)[^{}]*?\}\})/i.exec(text);
        if (copyvio) {
          statelem.error(window.wgULS("页面中已有著作权验证模板。", "頁面中已有著作權驗證模板。"));
          return;
        }
        Twinkle.xfd.callbacks.afd.main(tagging_page);
      }
    },
    ffd: {
      main: (tagging_page) => {
        const params = tagging_page.getCallbackParameters();
        Twinkle.xfd.callbacks.ffd.taggingImage(tagging_page);
        const ysarchives_page = new Morebits.wiki.page(params.logpage, window.wgULS("加入讨论到当日列表", "加入討論到當日列表"));
        ysarchives_page.setFollowRedirect(true);
        ysarchives_page.setCallbackParameters(params);
        ysarchives_page.load(Twinkle.xfd.callbacks.ffd.todaysList);
        if (params.notify) {
          if (params.creator === mw.config.get("wgUserName")) {
            Morebits.status.warn("".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"), window.wgULS("您创建了该页,跳过通知", "您建立了該頁,跳過通知"));
            return;
          }
          const talkPageName = "User talk:".concat(params.creator);
          const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知页面创建者(", "通知頁面建立者(") + params.creator, ")"));
          const notifytext = "\n{{".concat("subst:", "idw|File:".concat(mw.config.get("wgTitle"), "}}"), "--~~", "~~");
          usertalkpage.setAppendText(notifytext);
          usertalkpage.setEditSummary("通知:文件[[".concat(Morebits.pageNameNorm, "]]存废讨论提名"));
          usertalkpage.setChangeTags(Twinkle.changeTags);
          usertalkpage.setCreateOption("recreate");
          usertalkpage.setWatchlist(Twinkle.getPref("xfdWatchUser"));
          usertalkpage.setFollowRedirect(true, false);
          usertalkpage.append();
          if (params.lognomination) {
            Twinkle.xfd.callbacks.addToLog(params, params.creator);
          }
        } else if (params.lognomination) {
          Twinkle.xfd.callbacks.addToLog(params, null);
        }
      },
      taggingImage: (pageobj) => {
        const text = pageobj.getPageText();
        const params = pageobj.getCallbackParameters();
        pageobj.setPageText("{{ifd|".concat(Morebits.string.formatReasonText(params.xfdreason), "|date={{").concat("subst:", "#time:c}}}}\n".concat(text)));
        pageobj.setEditSummary("".concat(window.wgULS("文件存废讨论:[[", "檔案存廢討論:[[") + params.logpage, "#").concat(Morebits.pageNameNorm, "]]"));
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setWatchlist(Twinkle.getPref("xfdWatchPage"));
        pageobj.setCreateOption("recreate");
        pageobj.save();
      },
      todaysList: (pageobj) => {
        const params = pageobj.getCallbackParameters();
        pageobj.setAppendText("\n{{".concat("subst:", "IfdItem|Filename=".concat(mw.config.get("wgTitle"), "|Uploader=").concat(params.creator, "|Reason=").concat(Morebits.string.formatReasonText(params.xfdreason), "}}--~~").concat("~~")));
        pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setWatchlist(Twinkle.getPref("xfdWatchDiscussion"));
        pageobj.setCreateOption("recreate");
        pageobj.append(() => {
          Twinkle.xfd.currentRationale = null;
        });
      },
      lookupCreation: (target_page) => {
        target_page.getStatusElement().info("完成");
        const params = target_page.getCallbackParameters();
        params.creator = target_page.getCreator();
        const tagging_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入存废讨论模板到文件描述页", "加入存廢討論模板到檔案描述頁"));
        tagging_page.setFollowRedirect(false);
        tagging_page.setCallbackParameters(params);
        tagging_page.load(Twinkle.xfd.callbacks.ffd.tryTagging);
      },
      tryTagging: (tagging_page) => {
        const statelem = tagging_page.getStatusElement();
        if (!tagging_page.exists()) {
          statelem.error(window.wgULS("页面不存在,可能已被删除", "頁面不存在,可能已被刪除"));
          return;
        }
        const text = tagging_page.getPageText();
        const xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec(text);
        if (xfd && !confirm(window.wgULS("删除相关模板{{", "刪除相關模板{{") + xfd[1] + window.wgULS("}}已被置于页面中,您是否仍想继续提报?", "}}已被置於頁面中,您是否仍想繼續提報?"))) {
          statelem.error(window.wgULS("页面已被提交至存废讨论。", "頁面已被提交至存廢討論。"));
          return;
        }
        Twinkle.xfd.callbacks.ffd.main(tagging_page);
      }
    },
    addToLog: (params, initialContrib) => {
      const editsummary = window.wgULS("记录对[[", "記錄對[[") + Morebits.pageNameNorm + window.wgULS("]]的存废讨论提名", "]]的存廢討論提名");
      const usl = new Morebits.userspaceLogger(Twinkle.getPref("xfdLogPageName"));
      usl.initialText = window.wgULS("这是该用户使用[[H:TW|Twinkle]]的提删模块做出的[[LIB:XFD|存废讨论]]提名列表。\n\n若您不再想保留此日志,请在[[".concat(Twinkle.getPref("configPage"), "|参数设置]]中关掉,并使用[[LIB:CSD#O1|CSD O1]]提交快速删除。"), "這是該使用者使用[[H:TW|Twinkle]]的提刪模塊做出的[[LIB:XFD|存廢討論]]提名列表。\n\n若您不再想保留此日誌,請在[[".concat(Twinkle.getPref("configPage"), "|偏好設定]]中關掉,並使用[[LIB:CSD#O1|CSD O1]]提交快速刪除。"));
      let xfdCatName;
      switch (params.xfdcat) {
        case "delete":
          xfdCatName = window.wgULS("删除", "刪除");
          break;
        case "merge":
          xfdCatName = window.wgULS("合并到", "合併到");
          break;
        case "fwdcsd":
          xfdCatName = window.wgULS("转交自快速删除候选", "轉交自快速刪除候選");
          break;
        case "fame":
          xfdCatName = window.wgULS("批量关注度提删", "批次關注度提刪");
          break;
        case "substub":
          xfdCatName = window.wgULS("批量小小作品提删", "批次小小作品提刪");
          break;
        case "batch":
          xfdCatName = window.wgULS("批量其他提删", "批次其他提刪");
          break;
        default:
          xfdCatName = window.wgULS("文件存废讨论", "檔案存廢討論");
          break;
      }
      let appendText = "# [[:".concat(Morebits.pageNameNorm, "]]");
      if (mw.config.get("wgNamespaceNumber") === 6) {
        appendText += "([{{fullurl:Special:Log|page=".concat(mw.util.wikiUrlencode(mw.config.get("wgPageName")), "}} ").concat(window.wgULS("日志", "日誌"), "])");
      }
      appendText += ":".concat(xfdCatName);
      if (params.xfdcat === "merge") {
        appendText += "[[:".concat(params.mergeinto, "]]");
      }
      appendText += "。";
      if (params.xfdreason) {
        appendText += "'''".concat(params.xfdcat === "fwdcsd" ? window.wgULS("原删除理据", "原刪除理據") : window.wgULS("理据", "理據"), "''':").concat(Morebits.string.formatReasonForLog(params.xfdreason));
        appendText = Morebits.string.appendPunctuation(appendText);
      }
      if (params.fwdcsdreason) {
        appendText += "'''".concat(params.xfdcat === "fwdcsd" ? window.wgULS("转交理据", "轉交理據") : window.wgULS("理据", "理據"), "''':").concat(Morebits.string.formatReasonForLog(params.fwdcsdreason));
        appendText = Morebits.string.appendPunctuation(appendText);
      }
      if (initialContrib) {
        appendText += ";通知{{user|".concat(initialContrib, "}}");
      }
      appendText += " ~~".concat("~~", "~\n");
      usl.changeTags = Twinkle.changeTags;
      usl.log(appendText, editsummary);
    }
  };
  Twinkle.xfd.callback.evaluate = (e) => {
    const params = Morebits.quickForm.getInputData(e.target);
    if (params.xfdcat === "merge" && params.mergeinto.trim() === "") {
      mw.notify(window.wgULS("请提供合并目标!", "請提供合併目標!"), {
        type: "warn",
        tag: "twinklexfd"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(e.target);
    Twinkle.xfd.currentRationale = params.xfdreason;
    Morebits.status.onError(Twinkle.xfd.printRationale);
    if (!params.category) {
      Morebits.status.error("错误", "未定义的动作");
      return;
    }
    let target_page;
    const date = new Morebits.date();
    switch (params.category) {
      case "afd":
        params.logpage = "LIB_talk:存废讨论/记录/".concat(date.format("YYYY/MM/DD", "utc"));
        params.lognomination = Twinkle.getPref("logXfdNominations") && !Twinkle.getPref("noLogOnXfdNomination").includes(params.xfdcat);
        Morebits.wiki.addCheckpoint();
        Morebits.wiki.actionCompleted.redirect = params.logpage;
        Morebits.wiki.actionCompleted.notice = window.wgULS("提名完成,重定向到讨论页", "提名完成,重新導向到討論頁");
        target_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("获取页面创建信息", "取得頁面建立資訊"));
        target_page.setCallbackParameters(params);
        if (mw.config.get("wgPageContentModel") === "wikitext") {
          target_page.setLookupNonRedirectCreator(true);
        }
        target_page.lookupCreation(Twinkle.xfd.callbacks.afd.lookupCreation);
        Morebits.wiki.removeCheckpoint();
        break;
      case "ffd": {
        params.logpage = "LIB_talk:存废讨论/记录/".concat(date.format("YYYY/MM/DD", "utc"));
        params.lognomination = Twinkle.getPref("logXfdNominations") && !Twinkle.getPref("noLogOnXfdNomination").includes("ffd");
        Morebits.wiki.addCheckpoint();
        Morebits.wiki.actionCompleted.redirect = params.logpage;
        Morebits.wiki.actionCompleted.notice = window.wgULS("提名完成,重定向到讨论页", "提名完成,重新導向到討論頁");
        const ysarchives_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("获取页面创建信息", "取得頁面建立資訊"));
        ysarchives_page.setCallbackParameters(params);
        ysarchives_page.setLookupNonRedirectCreator(true);
        ysarchives_page.lookupCreation(Twinkle.xfd.callbacks.ffd.lookupCreation);
        Morebits.wiki.removeCheckpoint();
        break;
      }
      default:
        mw.notify("twinklexfd:未定义的类别", {
          type: "warn",
          tag: "twinklexfd"
        });
        break;
    }
  };
  Twinkle.addInitCallback(Twinkle.xfd, "xfd");
})();
//! src/Twinkle/modules/twinkleimage.js
/*! Twinkle.js - twinkleimage.js */
(function twinkleimage() {
  Twinkle.image = () => {
    if (mw.config.get("wgNamespaceNumber") === 6 && !document.querySelector("#mw-sharedupload") && document.querySelector("#mw-imagepage-section-filehistory")) {
      Twinkle.addPortletLink(Twinkle.image.callback, window.wgULS("图权", "圖權"), "tw-di", window.wgULS("提交文件快速删除", "提交檔案快速刪除"));
    }
  };
  Twinkle.image.callback = () => {
    const Window = new Morebits.simpleWindow(600, 330);
    Window.setTitle(window.wgULS("文件快速删除候选", "檔案快速刪除候選"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("快速删除条例", "快速刪除條例"), "LIB:CSD");
    Window.addFooterLink(window.wgULS("图权设置", "圖權設定"), "H:TW/PREF#image");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#image");
    const form = new Morebits.quickForm(Twinkle.image.callback.evaluate);
    form.append({
      type: "checkbox",
      list: [{
        label: window.wgULS("通知上传者", "通知上傳者"),
        value: "notify",
        name: "notify",
        tooltip: window.wgULS("若您在标记同一用户的很多文件,请取消此复选框以避免发送过多消息。CSD F5永远不会通知。", "若您在標記同一使用者的很多檔案,請取消此核取方塊以避免發送過多訊息。CSD F5永遠不會通知。"),
        checked: Twinkle.getPref("notifyUserOnDeli")
      }]
    });
    const field = form.append({
      type: "field",
      label: window.wgULS("需要的动作", "需要的動作")
    });
    field.append({
      type: "radio",
      name: "type",
      list: [{
        label: window.wgULS("明显侵权之文件(CSD F1)", "明顯侵權之檔案(CSD F1)"),
        value: "no permission",
        tooltip: window.wgULS("上传者宣称拥有,而在其他来源找到的文件,或从侵权的来源获取的文件。", "上傳者宣稱擁有,而在其他來源找到的檔案,或從侵權的來源取得的檔案。"),
        subgroup: {
          name: "f1_source",
          type: "textarea",
          label: window.wgULS("侵权来源:", "侵權來源:")
        }
      }, {
        label: window.wgULS("来源不明(CSD F3)", "來源不明(CSD F3)"),
        value: "no source",
        checked: true,
        tooltip: window.wgULS("本文件并未注明原始出处", "本檔案並未註明原始出處")
      }, {
        label: window.wgULS("未知著作权或著作权无法被查证(CSD F3)", "未知著作權或著作權無法被查證(CSD F3)"),
        value: "no license",
        tooltip: window.wgULS("本文件缺少著作权信息,或声称的著作权信息无法被查证", "本檔案缺少著作權資訊,或聲稱的著作權資訊無法被查證")
      }, {
        label: window.wgULS("来源不明且未知著作权或著作权无法被查证(CSD F3)", "來源不明且未知著作權或著作權無法被查證(CSD F3)"),
        value: "no source no license",
        tooltip: window.wgULS("本文件并未注明原始出处,且本文件缺少著作权信息或声称的著作权信息无法被查证", "本檔案並未註明原始出處,且本檔案缺少著作權資訊或聲稱的著作權資訊無法被查證")
      }, {
        label: window.wgULS("可被替代的非自由著作权文件(CSD F4)", "可被替代的非自由著作權檔案(CSD F4)"),
        value: "replaceable fair use",
        tooltip: window.wgULS("文件仅用于描述、识别或评论文件中展示的事物,或仅用作插图,且满足以下四个条件之一。若给出了其他合理使用依据,不适用本条。如对文件的可替代性存在争议,应交文件存废讨论处理。本条也不适用于正在或曾经由文件存废讨论处理过的文件。", "檔案僅用於描述、辨識或評論檔案中展示的事物,或僅用作插圖,且滿足以下四個條件之一。若給出了其他合理使用依據,不適用本條。如對檔案的可替代性存在爭議,應交檔案存廢討論處理。本條也不適用於正在或曾經由檔案存廢討論處理過的檔案。"),
        subgroup: {
          name: "f4_type",
          type: "select",
          label: window.wgULS("适用类型:", "適用類別:"),
          style: "width: 85%;",
          list: [{
            type: "option",
            label: window.wgULS("请选择", "請選擇"),
            value: ""
          }, {
            type: "option",
            label: window.wgULS("有其他自由著作权文件展示相同的事物", "有其他自由著作權檔案展示相同的事物"),
            value: "1"
          }, {
            type: "option",
            label: window.wgULS("文件描述的是在世或假定在世人物、仍然存在的建筑、室外雕塑或仍然在售的商品,且预计自行拍摄的照片不受他人著作权保护", "檔案描述的是在世或假定在世人物、仍然存在的建築、室外雕塑或仍然在售的商品,且預計自行拍攝的相片不受他人著作權保護"),
            value: "2"
          }, {
            type: "option",
            label: window.wgULS("文件为可自行绘制的地图或图表", "檔案為可自行繪製的地圖或圖表"),
            value: "3"
          }, {
            type: "option",
            label: window.wgULS("文件来自商业图片机构(如Getty)", "檔案來自商業圖片機構(如Getty)"),
            value: "4"
          }]
        }
      }, {
        label: window.wgULS("没有被条目使用的非自由著作权文件(CSD F5)", "沒有被條目使用的非自由著作權檔案(CSD F5)"),
        value: "orphaned fair use",
        tooltip: window.wgULS("本文件为非自由著作权且没有被条目使用", "本檔案為非自由著作權且沒有被條目使用")
      }, {
        label: window.wgULS("没有填写任何合理使用依据的非自由著作权文件(CSD F5)", "沒有填寫任何合理使用依據的非自由著作權檔案(CSD F5)"),
        value: "no fair use rationale",
        tooltip: window.wgULS("不适用于有争议但完整的合理使用依据。若非自由著作权文件只有部分条目的使用依据,但同时被使用于未提供合理使用依据的条目,则本条例也不适用。", "不適用於有爭議但完整的合理使用依據。若非自由著作權檔案只有部分條目的使用依據,但同時被使用於未提供合理使用依據的條目,則本條例也不適用。")
      }]
    });
    form.append({
      type: "submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    const evt = document.createEvent("Event");
    evt.initEvent("change", true, true);
    result.type[0].dispatchEvent(evt);
  };
  Twinkle.image.callback.evaluate = (event) => {
    let type;
    let notify = event.target.notify.checked;
    const types = event.target.type;
    var _iterator19 = _createForOfIteratorHelper(types), _step19;
    try {
      for (_iterator19.s(); !(_step19 = _iterator19.n()).done; ) {
        const type_ = _step19.value;
        if (type_.checked) {
          type = type_.values;
          break;
        }
      }
    } catch (err) {
      _iterator19.e(err);
    } finally {
      _iterator19.f();
    }
    let csdcrit;
    switch (type) {
      case "no source":
        csdcrit = "f3";
        break;
      case "no license":
        csdcrit = "f3";
        break;
      case "no source no license":
        csdcrit = "f3";
        break;
      case "orphaned fair use":
        csdcrit = "f5";
        notify = false;
        break;
      case "no permission":
        csdcrit = "f1";
        break;
      case "no fair use rationale":
        csdcrit = "f5";
        break;
      case "replaceable fair use":
        csdcrit = "f4";
        break;
      default:
        throw new Error("Twinkle.image.callback.evaluate:未知条款");
    }
    const lognomination = Twinkle.getPref("logSpeedyNominations") && !Twinkle.getPref("noLogOnSpeedyNomination").includes(csdcrit.toLowerCase());
    const templatename = type;
    const params = {
      type,
      templatename,
      normalized: csdcrit,
      lognomination
    };
    if (csdcrit === "f1") {
      params.f1_source = event.target["type.f1_source"].value;
    }
    if (csdcrit === "f4") {
      const f4_type = event.target["type.f4_type"].value;
      if (!f4_type) {
        mw.notify(window.wgULS("CSD F4:请选择适用类型。", "CSD F4:請選擇適用類別。"), {
          type: "warn",
          tag: "twinkleimage"
        });
        return false;
      }
      params.f4_type = f4_type;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(event.target);
    Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
    Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成", "標記完成");
    const ysarchives_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("加入删除标记", "加入刪除標記"));
    ysarchives_page.setCallbackParameters(params);
    ysarchives_page.load(Twinkle.image.callbacks.taggingImage);
    if (notify) {
      ysarchives_page.lookupCreation(Twinkle.image.callbacks.userNotification);
    } else {
      if (lognomination) {
        params.fromDI = true;
        Twinkle.speedy.callbacks.user.addToLog(params, null);
      }
      if (type !== "orphaned fair use") {
        const noteData = document.createElement("pre");
        noteData.appendChild(document.createTextNode("{{".concat("subst:", "Uploadvionotice|".concat(Morebits.pageNameNorm, "}}--~~"), "~~")));
        Morebits.status.info("提示", window.wgULS(["这些内容应贴进上传者对话页:", document.createElement("br"), noteData], ["這些內容應貼進上傳者討論頁:", document.createElement("br"), noteData]));
      }
    }
  };
  Twinkle.image.callbacks = {
    taggingImage: (pageobj) => {
      let text = pageobj.getPageText();
      const params = pageobj.getCallbackParameters();
      text = text.replace(/\{\{(mtc|(copy |move )?to ?(share|commons)|move to (ysarchives share|wikimedia commons)|copy to (ysarchives share|wikimedia commons))[^}]*\}\}/gi, "");
      if (params.type !== "orphaned fair use") {
        const ysarchives_page = new Morebits.wiki.page("LIB_talk:存废讨论/文件快速删除提报", window.wgULS("加入快速删除记录项", "加入快速刪除記錄項"));
        ysarchives_page.setFollowRedirect(true);
        ysarchives_page.setCallbackParameters(params);
        ysarchives_page.load(Twinkle.image.callbacks.imageList);
      }
      let tag = "";
      switch (params.type) {
        case "orphaned fair use":
          tag = "{{".concat("subst:", "orphaned fair use}}\n");
          break;
        case "no permission":
          tag = "{{".concat("subst:", "".concat(params.templatename, "/auto|1=").concat(params.f1_source.replace(/http/g, "&#104;ttp").replace(/\n+/g, "\n").replace(/^\s*([^*])/gm, "* $1").replace(/^\* $/m, ""), "}}\n"));
          break;
        case "replaceable fair use":
          tag = "{{".concat("subst:", "".concat(params.templatename, "/auto|1=").concat(params.f4_type, "}}\n"));
          break;
        default:
          tag = "{{".concat("subst:", "".concat(params.templatename, "/auto}}\n"));
          break;
      }
      const textNoSd = text.replace(/\{\{\s*(db(-\w*)?|d|delete|(?:hang|hold)[- ]?on)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
      if (text !== textNoSd && confirm(window.wgULS("在页面上找到快速删除模板,要移除吗?", "在頁面上找到快速刪除模板,要移除嗎?"))) {
        text = textNoSd;
      }
      pageobj.setPageText(tag + text);
      let editSummary = window.wgULS("请求快速删除(", "請求快速刪除(");
      editSummary += "[[LIB:CSD#".concat(params.normalized.toUpperCase(), "|CSD ").concat(params.normalized.toUpperCase(), "]]");
      editSummary += ")";
      pageobj.setEditSummary(editSummary);
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setWatchlist(Twinkle.getPref("deliWatchPage"));
      pageobj.setCreateOption("nocreate");
      pageobj.save();
    },
    userNotification: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      const initialContrib = pageobj.getCreator();
      if (initialContrib === mw.config.get("wgUserName")) {
        pageobj.getStatusElement().warn("您(".concat(initialContrib, ")").concat(window.wgULS("创建了该页,跳过通知", "建立了該頁,跳過通知")));
      } else {
        const talkPageName = "User talk:".concat(initialContrib);
        const usertalkpage = new Morebits.wiki.page(talkPageName, "".concat(window.wgULS("通知上传者", "通知上傳者"), "(").concat(initialContrib, ")"));
        const notifytext = "\n{{".concat("subst:", "Di-".concat(params.templatename, "-notice|1=").concat(Morebits.pageNameNorm, "}}--~~"), "~~");
        usertalkpage.setAppendText(notifytext);
        usertalkpage.setEditSummary(window.wgULS("通知:文件[[", "通知:檔案[[") + Morebits.pageNameNorm + window.wgULS("]]快速删除提名", "]]快速刪除提名"));
        usertalkpage.setChangeTags(Twinkle.changeTags);
        usertalkpage.setCreateOption("recreate");
        usertalkpage.setWatchlist(Twinkle.getPref("deliWatchUser"));
        usertalkpage.setFollowRedirect(true, false);
        usertalkpage.append();
      }
      if (params.lognomination) {
        params.fromDI = true;
        Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
      }
    },
    imageList: (pageobj) => {
      const text = pageobj.getPageText();
      pageobj.setPageText("".concat(text, "\n* [[:").concat(Morebits.pageNameNorm, "]]--~~").concat("~~"));
      pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setCreateOption("recreate");
      pageobj.save();
    }
  };
  Twinkle.addInitCallback(Twinkle.image, "image");
})();
//! src/Twinkle/modules/twinkleprotect.js
var import_ext_gadget2 = require("ext.gadget.Util");
/*! Twinkle.js - twinkleprotect.js */
(function twinkleprotect($) {
  const $body = $("body");
  Twinkle.protect = () => {
    if (mw.config.get("wgNamespaceNumber") < 0 || mw.config.get("wgNamespaceNumber") === 8) {
      return;
    }
    Twinkle.addPortletLink(Twinkle.protect.callback, window.wgULS("保护", "保護"), "tw-rpp", Morebits.userIsSysop ? window.wgULS("保护页面", "保護頁面") : window.wgULS("请求保护页面", "請求保護頁面"));
  };
  Twinkle.protect.callback = () => {
    const Window = new Morebits.simpleWindow(620, 530);
    Window.setTitle(Morebits.userIsSysop ? window.wgULS("施行或请求保护页面", "施行或請求保護頁面") : window.wgULS("请求保护页面", "請求保護頁面"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("保护条例", "保護條例"), "LIB:PROT");
    Window.addFooterLink(window.wgULS("保护设置", "保護設定"), "H:TW/PREF#protect");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#protect");
    const form = new Morebits.quickForm(Twinkle.protect.callback.evaluate);
    const actionfield = form.append({
      type: "field",
      label: window.wgULS("操作类型", "操作類別")
    });
    if (Morebits.userIsSysop) {
      actionfield.append({
        type: "radio",
        name: "actiontype",
        event: Twinkle.protect.callback.changeAction,
        list: [{
          label: window.wgULS("保护页面", "保護頁面"),
          value: "protect",
          checked: true
        }]
      });
    }
    actionfield.append({
      type: "radio",
      name: "actiontype",
      event: Twinkle.protect.callback.changeAction,
      list: [{
        label: window.wgULS("请求保护页面", "請求保護頁面"),
        value: "request",
        tooltip: window.wgULS("若您想在LIB:RFPP请求保护此页", "若您想在LIB:RFPP請求保護此頁") + (Morebits.userIsSysop ? "而不是自行完成。" : "。"),
        checked: !Morebits.userIsSysop
      }, {
        label: window.wgULS("用保护模板标记此页", "用保護模板標記此頁"),
        value: "tag",
        tooltip: window.wgULS("可以用此为页面加上合适的保护模板。", "可以用此為頁面加上合適的保護模板。"),
        disabled: mw.config.get("wgArticleId") === 0 || mw.config.get("wgPageContentModel") === "Scribunto"
      }]
    });
    form.append({
      type: "field",
      label: window.wgULS("默认", "預設"),
      name: "field_preset"
    });
    form.append({
      type: "field",
      label: "1",
      name: "field1"
    });
    form.append({
      type: "field",
      label: "2",
      name: "field2"
    });
    form.append({
      type: "submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    const evt = document.createEvent("Event");
    evt.initEvent("change", true, true);
    result.actiontype[0].dispatchEvent(evt);
    Twinkle.protect.fetchProtectionLevel();
  };
  const isTemplate = mw.config.get("wgNamespaceNumber") === 10 || mw.config.get("wgNamespaceNumber") === 828;
  Twinkle.protect.currentProtectionLevels = {};
  Twinkle.protect.previousProtectionLevels = {};
  Twinkle.protect.fetchProtectionLevel = /* @__PURE__ */ _asyncToGenerator(function* () {
    const api = (0, import_ext_gadget2.initMwApi)("morebits.js; Twinkle/1.1");
    try {
      const params = {
        format: "json",
        indexpageids: true,
        action: "query",
        list: "logevents",
        letype: "protect",
        letitle: mw.config.get("wgPageName"),
        prop: "info",
        inprop: "protection|watched",
        titles: mw.config.get("wgPageName")
      };
      const protectData = yield api.get(params);
      const [pageid] = protectData.query.pageids;
      const page = protectData.query.pages[pageid];
      const current = {};
      const previous = {};
      Twinkle.protect.watched = page.watchlistexpiry || page.watched === "";
      var _iterator20 = _createForOfIteratorHelper(page.protection), _step20;
      try {
        for (_iterator20.s(); !(_step20 = _iterator20.n()).done; ) {
          const protection = _step20.value;
          if (protection.type !== "aft") {
            current[protection.type] = {
              level: protection.level,
              expiry: protection.expiry,
              cascade: protection.cascade === ""
            };
          }
        }
      } catch (err) {
        _iterator20.e(err);
      } finally {
        _iterator20.f();
      }
      if (protectData.query.logevents.length >= 1 && protectData.query.logevents[0].action !== "unprotect") {
        [Twinkle.protect.previousProtectionLog] = protectData.query.logevents;
      } else if (protectData.query.logevents.length >= 2) {
        [, Twinkle.protect.previousProtectionLog] = protectData.query.logevents;
      }
      if (Twinkle.protect.previousProtectionLog) {
        var _iterator21 = _createForOfIteratorHelper(Twinkle.protect.previousProtectionLog.params.details), _step21;
        try {
          for (_iterator21.s(); !(_step21 = _iterator21.n()).done; ) {
            const protection = _step21.value;
            if (protection.type !== "aft") {
              previous[protection.type] = {
                level: protection.level,
                expiry: protection.expiry,
                cascade: protection.cascade === ""
              };
            }
          }
        } catch (err) {
          _iterator21.e(err);
        } finally {
          _iterator21.f();
        }
      }
      Twinkle.protect.hasProtectLog = !!protectData.query.logevents.length;
      Twinkle.protect.currentProtectionLevels = current;
      Twinkle.protect.previousProtectionLevels = previous;
      Twinkle.protect.callback.showLogAndCurrentProtectInfo();
    } catch {
    }
  });
  Twinkle.protect.callback.showLogAndCurrentProtectInfo = () => {
    const currentlyProtected = Object.keys(Twinkle.protect.currentProtectionLevels).length !== 0;
    if (Twinkle.protect.hasProtectLog || Twinkle.protect.hasStableLog) {
      const $linkMarkup = $("<span>");
      if (Twinkle.protect.hasProtectLog) {
        $linkMarkup.append($('<a rel="noopener" target="_blank" href="'.concat(mw.util.getUrl("Special:Log", {
          action: "view",
          page: mw.config.get("wgPageName"),
          type: "protect"
        }), '">').concat(window.wgULS("保护日志", "保護日誌"), "</a>")), Twinkle.protect.hasStableLog ? $("<span>").html(" &bull; ") : null);
      }
      Morebits.status.init($body.find('div[name="hasprotectlog"] span')[0]);
      Morebits.status.warn(currentlyProtected ? window.wgULS("先前保护", "先前保護") : [window.wgULS("此页面曾在", "此頁面曾在"), $("<b>".concat(new Morebits.date(Twinkle.protect.previousProtectionLog.timestamp).calendar("utc"), "</b>"))[0], "被".concat(Twinkle.protect.previousProtectionLog.user).concat(window.wgULS("保护", "保護"), ":"), ...Twinkle.protect.formatProtectionDescription(Twinkle.protect.previousProtectionLevels)], $linkMarkup[0]);
    }
    Morebits.status.init($body.find('div[name="currentprot"] span')[0]);
    let protectionNode = [];
    let statusLevel = "info";
    protectionNode = Twinkle.protect.formatProtectionDescription(Twinkle.protect.currentProtectionLevels);
    if (currentlyProtected) {
      statusLevel = "warn";
    }
    Morebits.status[statusLevel](window.wgULS("当前保护等级", "目前保護等級"), protectionNode);
  };
  Twinkle.protect.callback.changeAction = (e) => {
    let field_preset;
    let field1;
    let field2;
    switch (e.target.values) {
      case "protect":
        field_preset = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("默认", "預設"),
          name: "field_preset"
        });
        field_preset.append({
          type: "select",
          name: "category",
          label: window.wgULS("选择默认:", "選擇預設:"),
          event: Twinkle.protect.callback.changePreset,
          list: mw.config.get("wgArticleId") ? Twinkle.protect.protectionTypesAdmin : Twinkle.protect.protectionTypesCreate
        });
        field2 = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("保护选项", "保護選項"),
          name: "field2"
        });
        field2.append({
          type: "div",
          name: "currentprot",
          label: " "
        });
        field2.append({
          type: "div",
          name: "hasprotectlog",
          label: " "
        });
        if (mw.config.get("wgArticleId")) {
          field2.append({
            type: "checkbox",
            event: Twinkle.protect.formevents.editmodify,
            list: [{
              label: window.wgULS("修改编辑权限", "修改編輯權限"),
              name: "editmodify",
              tooltip: window.wgULS("若此项关闭,编辑权限将不会修改。", "若此項關閉,編輯權限將不會修改。"),
              checked: true
            }]
          });
          field2.append({
            type: "select",
            name: "editlevel",
            label: window.wgULS("编辑权限:", "編輯權限:"),
            event: Twinkle.protect.formevents.editlevel,
            list: Twinkle.protect.protectionLevels.filter(
              // Filter TE outside of templates and modules
              (level) => {
                return isTemplate || level.value !== "templateeditor";
              }
            )
          });
          field2.append({
            type: "select",
            name: "editexpiry",
            label: window.wgULS("终止时间:", "終止時間:"),
            event: (event) => {
              if (event.target.value === "custom") {
                Twinkle.protect.doCustomExpiry(event.target);
              }
              $("input[name=small]", $(event.target).closest("form"))[0].checked = event.target.selectedIndex >= 4;
            },
            // default expiry selection (2 days) is conditionally set in Twinkle.protect.callback.changePreset
            list: Twinkle.protect.protectionLengths
          });
          field2.append({
            type: "checkbox",
            event: Twinkle.protect.formevents.movemodify,
            list: [{
              label: window.wgULS("修改移动权限", "修改移動權限"),
              name: "movemodify",
              tooltip: window.wgULS("若此项被关闭,移动权限将不被修改。", "若此項被關閉,移動權限將不被修改。"),
              checked: true
            }]
          });
          field2.append({
            type: "select",
            name: "movelevel",
            label: window.wgULS("移动权限:", "移動權限:"),
            event: Twinkle.protect.formevents.movelevel,
            list: Twinkle.protect.protectionLevels.filter(
              // Autoconfirmed is required for a move, redundant
              (level) => {
                return level.value !== "autoconfirmed" && (isTemplate || level.value !== "templateeditor");
              }
            )
          });
          field2.append({
            type: "select",
            name: "moveexpiry",
            label: window.wgULS("终止时间:", "終止時間:"),
            event: (event) => {
              if (event.target.value === "custom") {
                Twinkle.protect.doCustomExpiry(event.target);
              }
            },
            // default expiry selection (2 days) is conditionally set in Twinkle.protect.callback.changePreset
            list: Twinkle.protect.protectionLengths
          });
        } else {
          field2.append({
            type: "select",
            name: "createlevel",
            label: window.wgULS("创建权限:", "建立權限:"),
            event: Twinkle.protect.formevents.createlevel,
            list: Twinkle.protect.protectionLevels.filter(
              // Filter TE always, and autoconfirmed in mainspace
              (level) => {
                return level.value !== "templateeditor";
              }
            )
          });
          field2.append({
            type: "select",
            name: "createexpiry",
            label: window.wgULS("终止时间:", "終止時間:"),
            event: (event) => {
              if (event.target.value === "custom") {
                Twinkle.protect.doCustomExpiry(event.target);
              }
            },
            // default expiry selection (indefinite) is conditionally set in Twinkle.protect.callback.changePreset
            list: Twinkle.protect.protectionLengths
          });
        }
        field2.append({
          type: "checkbox",
          list: [{
            name: "close",
            label: window.wgULS("标记请求保护页面中的请求", "標記請求保護頁面中的請求"),
            checked: true
          }]
        });
        field2.append({
          type: "textarea",
          name: "protectReason",
          label: window.wgULS("理由(保护日志):", "理由(保護日誌):")
        });
        if (!mw.config.get("wgArticleId") || mw.config.get("wgPageContentModel") === "Scribunto") {
          break;
        }
      case "tag":
        field1 = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("标记选项", "標記選項"),
          name: "field1"
        });
        field1.append({
          type: "div",
          name: "currentprot",
          label: " "
        });
        field1.append({
          type: "div",
          name: "hasprotectlog",
          label: " "
        });
        field1.append({
          type: "select",
          name: "tagtype",
          label: window.wgULS("选择保护模板:", "選擇保護模板:"),
          list: Twinkle.protect.protectionTags,
          event: Twinkle.protect.formevents.tagtype
        });
        field1.append({
          type: "checkbox",
          list: [{
            name: "small",
            label: window.wgULS("使用图标(small=yes)", "使用圖示(small=yes)"),
            tooltip: window.wgULS("将给模板加上|small=yes参数,显示成右上角的一把挂锁。", "將給模板加上|small=yes參數,顯示成右上角的一把掛鎖。")
          }, {
            name: "noinclude",
            label: window.wgULS("用&lt;noinclude&gt;包裹保护模板", "用&lt;noinclude&gt;包裹保護模板"),
            tooltip: window.wgULS("将保护模板包裹在&lt;noinclude&gt;中", "將保護模板包裹在&lt;noinclude&gt;中"),
            checked: mw.config.get("wgNamespaceNumber") === 10
          }, {
            name: "showexpiry",
            label: window.wgULS("在模板显示到期时间", "在模板顯示到期時間"),
            tooltip: window.wgULS("将给模板加上|expiry参数", "將給模板加上|expiry參數"),
            checked: true,
            hidden: e.target.values === "tag"
          }]
        });
        break;
      case "request":
        field_preset = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("保护类型", "保護類別"),
          name: "field_preset"
        });
        field_preset.append({
          type: "select",
          name: "category",
          label: window.wgULS("类型和理由:", "類別和理由:"),
          event: Twinkle.protect.callback.changePreset,
          list: mw.config.get("wgArticleId") ? Twinkle.protect.protectionTypes : Twinkle.protect.protectionTypesCreate
        });
        field1 = new Morebits.quickForm.element({
          type: "field",
          label: window.wgULS("选项", "選項"),
          name: "field1"
        });
        field1.append({
          type: "div",
          name: "currentprot",
          label: " "
        });
        field1.append({
          type: "div",
          name: "hasprotectlog",
          label: " "
        });
        field1.append({
          type: "select",
          name: "expiry",
          label: window.wgULS("时长:", "時長:"),
          list: [{
            label: "",
            selected: true,
            value: ""
          }, {
            label: window.wgULS("临时", "臨時"),
            value: "temporary"
          }, {
            label: "永久",
            value: "infinity"
          }]
        });
        field1.append({
          type: "textarea",
          name: "reason",
          label: "理由:"
        });
        break;
      default:
        mw.notify(window.wgULS("这玩意儿被海豚吃掉了!", "這玩意兒被海豚吃掉了!"), {
          type: "warn",
          tag: "twinkleprotect"
        });
        break;
    }
    let oldfield;
    if (field_preset) {
      [oldfield] = $(e.target.form).find('fieldset[name="field_preset"]');
      oldfield.parentNode.replaceChild(field_preset.render(), oldfield);
    } else {
      $(e.target.form).find('fieldset[name="field_preset"]').css("display", "none");
    }
    if (field1) {
      [oldfield] = $(e.target.form).find('fieldset[name="field1"]');
      oldfield.parentNode.replaceChild(field1.render(), oldfield);
    } else {
      $(e.target.form).find('fieldset[name="field1"]').css("display", "none");
    }
    if (field2) {
      [oldfield] = $(e.target.form).find('fieldset[name="field2"]');
      oldfield.parentNode.replaceChild(field2.render(), oldfield);
    } else {
      $(e.target.form).find('fieldset[name="field2"]').css("display", "none");
    }
    if (e.target.values === "protect") {
      const evt = document.createEvent("Event");
      evt.initEvent("change", true, true);
      e.target.form.category.dispatchEvent(evt);
      $(e.target.form).find('fieldset[name="field2"] select').parent().css({
        display: "inline-block",
        marginRight: "0.5em"
      });
    }
    Twinkle.protect.callback.showLogAndCurrentProtectInfo();
  };
  Twinkle.protect.formevents = {
    editmodify: (e) => {
      e.target.form.editlevel.disabled = !e.target.checked;
      e.target.form.editexpiry.disabled = !e.target.checked || e.target.form.editlevel.value === "all";
      e.target.form.editlevel.style.color = e.target.checked ? "" : "transparent";
      e.target.form.editexpiry.style.color = e.target.checked ? "" : "transparent";
    },
    editlevel: (e) => {
      e.target.form.editexpiry.disabled = e.target.value === "all";
    },
    movemodify: (e) => {
      if (e.target.form.movelevel.disabled && !e.target.form.editlevel.disabled) {
        e.target.form.movelevel.value = e.target.form.editlevel.value;
        e.target.form.moveexpiry.value = e.target.form.editexpiry.value;
      } else if (e.target.form.editlevel.disabled) {
        e.target.form.movelevel.value = "sysop";
        e.target.form.moveexpiry.value = "infinity";
      }
      e.target.form.movelevel.disabled = !e.target.checked;
      e.target.form.moveexpiry.disabled = !e.target.checked || e.target.form.movelevel.value === "all";
      e.target.form.movelevel.style.color = e.target.checked ? "" : "transparent";
      e.target.form.moveexpiry.style.color = e.target.checked ? "" : "transparent";
    },
    movelevel: (e) => {
      e.target.form.moveexpiry.disabled = e.target.value === "all";
    },
    createlevel: (e) => {
      e.target.form.createexpiry.disabled = e.target.value === "all";
    },
    tagtype: (e) => {
      e.target.form.small.disabled = e.target.value === "none" || e.target.value === "noop";
      e.target.form.noinclude.disabled = e.target.value === "none" || e.target.value === "noop";
      e.target.form.showexpiry.disabled = e.target.value === "none" || e.target.value === "noop";
    }
  };
  Twinkle.protect.doCustomExpiry = (target) => {
    const custom = prompt(window.wgULS("输入自定义终止时间。\n您可以使用相对时间,如“1 minute”或“19 days”,或绝对时间“yyyymmddhhmm”(如“200602011405”是2006年02月01日14:05(UTC))", "輸入自訂終止時間。\n您可以使用相對時間,如「1 minute」或「19 days」,或絕對時間「yyyymmddhhmm」(如「200602011405」是2006年02月01日14:05(UTC))"), "");
    if (custom) {
      const option = document.createElement("option");
      option.setAttribute("value", custom);
      option.textContent = custom;
      target.appendChild(option);
      target.value = custom;
    } else {
      target.selectedIndex = 0;
    }
  };
  Twinkle.protect.protectionLevels = [{
    label: "全部",
    value: "all"
  }, {
    label: window.wgULS("仅允许自动确认用户", "僅允許自動確認使用者"),
    value: "autoconfirmed"
  }, {
    label: window.wgULS("仅模板编辑员和管理员", "僅模板編輯員和管理員"),
    value: "templateeditor"
  }, {
    label: window.wgULS("仅管理员", "僅管理員"),
    value: "sysop",
    selected: true
  }, {
    label: window.wgULS("仅允许档案理事员", "僅允許檔案理事員"),
    value: "officialprotected"
  }];
  Twinkle.protect.protectionLengths = [{
    label: "1天",
    value: "1 day"
  }, {
    label: "3天",
    value: "3 days"
  }, {
    label: window.wgULS("1周", "1週"),
    value: "1 week"
  }, {
    label: window.wgULS("2周", "2週"),
    value: "2 weeks"
  }, {
    label: window.wgULS("1个月", "1個月"),
    value: "1 month"
  }, {
    label: window.wgULS("3个月", "3個月"),
    value: "3 months"
  }, {
    label: window.wgULS("6个月", "6個月"),
    value: "6 months"
  }, {
    label: "1年",
    value: "1 year"
  }, {
    label: window.wgULS("无限期", "無限期"),
    value: "infinity"
  }, {
    label: window.wgULS("自定义……", "自訂……"),
    value: "custom"
  }];
  Twinkle.protect.protectionTypesAdmin = [{
    label: window.wgULS("解除保护", "解除保護"),
    value: "unprotect"
  }, {
    label: window.wgULS("全保护", "全保護"),
    list: [{
      label: window.wgULS("常规(全)", "常規(全)"),
      value: "pp-protected"
    }, {
      label: window.wgULS("争议、编辑战(全)", "爭議、編輯戰(全)"),
      value: "pp-dispute"
    }]
  }, {
    label: window.wgULS("模板保护", "模板保護"),
    list: [{
      label: window.wgULS("高风险模板(模板)", "高風險模板(模板)"),
      value: "pp-template"
    }]
  }, {
    label: window.wgULS("半保护", "半保護"),
    list: [{
      label: window.wgULS("常规(半)", "常規(半)"),
      value: "pp-semi-protected"
    }, {
      label: window.wgULS("持续破坏(半)", "持續破壞(半)"),
      value: "pp-semi-vandalism"
    }, {
      label: window.wgULS("违反生者传记条例(半)", "違反生者傳記條例(半)"),
      value: "pp-semi-blp"
    }, {
      label: window.wgULS("傀儡破坏(半)", "傀儡破壞(半)"),
      value: "pp-semi-sock"
    }, {
      label: window.wgULS("高风险模板(半)", "高風險模板(半)"),
      value: "pp-semi-template"
    }, {
      label: window.wgULS("被封禁用户滥用讨论页(半)", "被封禁使用者濫用討論頁(半)"),
      value: "pp-semi-usertalk"
    }]
  }, {
    label: window.wgULS("移动保护", "移動保護"),
    list: [{
      label: window.wgULS("常规(移动)", "常規(移動)"),
      value: "pp-move"
    }, {
      label: window.wgULS("争议、移动战(移动)", "爭議、移動戰(移動)"),
      value: "pp-move-dispute"
    }, {
      label: window.wgULS("移动破坏(移动)", "移動破壞(移動)"),
      value: "pp-move-vandalism"
    }, {
      label: window.wgULS("高风险页面(移动)", "高風險頁面(移動)"),
      value: "pp-move-indef"
    }]
  }].filter(({
    label
  }) => {
    return isTemplate || label !== "模板保护" && label !== "模板保護";
  });
  Twinkle.protect.protectionTypesCreateOnly = [{
    label: window.wgULS("白纸保护", "白紙保護"),
    list: [{
      label: window.wgULS("常规(白纸)", "常規(白紙)"),
      value: "pp-create"
    }, {
      label: window.wgULS("多次重复创建(白纸)", "多次重複建立(白紙)"),
      value: "pp-create-repeat"
    }, {
      label: window.wgULS("持续破坏(白纸)", "持續破壞(白紙)"),
      value: "pp-create-vandalism"
    }, {
      label: window.wgULS("已封禁用户的用户页(白纸)", "已封禁使用者的使用者頁(白紙)"),
      value: "pp-create-userpage"
    }]
  }];
  Twinkle.protect.protectionTypes = [...Twinkle.protect.protectionTypesAdmin, ...Twinkle.protect.protectionTypesCreateOnly];
  Twinkle.protect.protectionTypesCreate = [{
    label: "解除保护",
    value: "unprotect"
  }, ...Twinkle.protect.protectionTypesCreateOnly];
  Twinkle.protect.protectionPresetsInfo = {
    "pp-protected": {
      edit: "sysop",
      move: "sysop",
      reason: null
    },
    "pp-dispute": {
      edit: "sysop",
      move: "sysop",
      reason: window.wgULS("编辑战", "編輯戰")
    },
    "pp-template": {
      edit: "templateeditor",
      move: "templateeditor",
      expiry: "infinity",
      reason: window.wgULS("[[LIB:HRT|高风险模板]]", "[[LIB:HRT|高風險模板]]"),
      template: "noop"
    },
    "pp-vandalism": {
      edit: "sysop",
      move: "sysop",
      reason: window.wgULS("被自动确认用户破坏", "被自動確認使用者破壞")
    },
    "pp-sock": {
      edit: "sysop",
      move: "sysop",
      reason: window.wgULS("持续的傀儡破坏", "持續的傀儡破壞")
    },
    "pp-semi-vandalism": {
      edit: "autoconfirmed",
      reason: window.wgULS("被新用户破坏", "被新使用者破壞"),
      template: "pp-vandalism"
    },
    "pp-semi-blp": {
      edit: "autoconfirmed",
      reason: window.wgULS("新用户违反生者传记条例", "新使用者違反生者傳記條例")
    },
    "pp-semi-usertalk": {
      edit: "autoconfirmed",
      reason: window.wgULS("被封禁用户滥用其讨论页", "被封禁使用者濫用其討論頁")
    },
    "pp-semi-template": {
      // removed for now
      edit: "autoconfirmed",
      expiry: "infinity",
      reason: window.wgULS("[[LIB:HRT|高风险模板]]", "[[LIB:HRT|高風險模板]]"),
      template: "noop"
    },
    "pp-semi-sock": {
      edit: "autoconfirmed",
      reason: window.wgULS("持续的傀儡破坏", "持續的傀儡破壞"),
      template: "pp-sock"
    },
    "pp-semi-protected": {
      edit: "autoconfirmed",
      reason: null,
      template: "pp-protected"
    },
    "pp-move": {
      move: "sysop",
      reason: null
    },
    "pp-move-dispute": {
      move: "sysop",
      reason: window.wgULS("页面移动战", "頁面移動戰")
    },
    "pp-move-vandalism": {
      move: "sysop",
      reason: window.wgULS("移动破坏", "移動破壞")
    },
    "pp-move-indef": {
      move: "sysop",
      expiry: "infinity",
      reason: window.wgULS("高风险页面", "高風險頁面")
    },
    unprotect: {
      edit: "all",
      move: "all",
      create: "all",
      reason: null,
      template: "none"
    },
    "pp-create": {
      create: "autoconfirmed",
      reason: null
    },
    "pp-create-repeat": {
      create: "autoconfirmed",
      reason: window.wgULS("多次重复创建", "多次重複建立")
    },
    "pp-create-vandalism": {
      create: "autoconfirmed",
      reason: window.wgULS("被新用户破坏", "被新使用者破壞")
    },
    "pp-create-userpage": {
      create: "sysop",
      expiry: "infinity",
      reason: window.wgULS("被永久封禁的用户页", "被永久封禁的使用者頁面")
    }
  };
  Twinkle.protect.protectionTags = [{
    label: window.wgULS("无(移除现有模板)", "無(移除現有模板)"),
    value: "none"
  }, {
    label: window.wgULS("无(不移除现有模板)", "無(不移除現有模板)"),
    value: "noop"
  }, {
    label: "通用模板",
    list: [{
      label: "{{pp-dispute}}: ".concat(window.wgULS("争议", "爭議")),
      value: "pp-dispute"
    }, {
      label: "{{pp-vandalism}}: ".concat(window.wgULS("破坏", "破壞")),
      value: "pp-vandalism",
      selected: true
    }, {
      label: "{{pp-sock}}: 傀儡",
      value: "pp-sock"
    }, {
      label: "{{pp-template}}: ".concat(window.wgULS("高风险模板", "高風險模板")),
      value: "pp-template"
    }, {
      label: "{{pp-protected}}: ".concat(window.wgULS("常规", "常規")),
      value: "pp-protected"
    }]
  }, {
    label: window.wgULS("半保护模板", "半保護模板"),
    list: [{
      label: "{{pp-semi-usertalk}}: ".concat(window.wgULS("封禁的用户", "封禁的使用者")),
      value: "pp-semi-usertalk"
    }, {
      label: "{{pp-semi-blp}}: ".concat(window.wgULS("生者传记", "生者傳記")),
      value: "pp-semi-blp"
    }, {
      label: "{{pp-semi-indef}}: ".concat(window.wgULS("长期", "長期")),
      value: "pp-semi-indef"
    }]
  }, {
    label: window.wgULS("移动保护模板", "移動保護模板"),
    list: [{
      label: "{{pp-move-dispute}}: ".concat(window.wgULS("争议", "爭議")),
      value: "pp-move-dispute"
    }, {
      label: "{{pp-move-vandalism}}: ".concat(window.wgULS("破坏", "破壞")),
      value: "pp-move-vandalism"
    }, {
      label: "{{pp-move-indef}}: ".concat(window.wgULS("长期", "長期")),
      value: "pp-move-indef"
    }, {
      label: "{{pp-move}}: ".concat(window.wgULS("常规", "常規")),
      value: "pp-move"
    }]
  }];
  Twinkle.protect.callback.changePreset = (e) => {
    const {
      form
    } = e.target;
    const actiontypes = form.actiontype;
    let actiontype;
    var _iterator22 = _createForOfIteratorHelper(actiontypes), _step22;
    try {
      for (_iterator22.s(); !(_step22 = _iterator22.n()).done; ) {
        const action_type_value = _step22.value;
        if (!action_type_value.checked) {
          continue;
        }
        actiontype = action_type_value.values;
        break;
      }
    } catch (err) {
      _iterator22.e(err);
    } finally {
      _iterator22.f();
    }
    if (actiontype === "protect") {
      const item = Twinkle.protect.protectionPresetsInfo[form.category.value];
      if (mw.config.get("wgArticleId")) {
        if (item.edit) {
          form.editmodify.checked = true;
          Twinkle.protect.formevents.editmodify({
            target: form.editmodify
          });
          form.editlevel.value = item.edit;
          Twinkle.protect.formevents.editlevel({
            target: form.editlevel
          });
        } else {
          form.editmodify.checked = false;
          Twinkle.protect.formevents.editmodify({
            target: form.editmodify
          });
        }
        if (item.move) {
          form.movemodify.checked = true;
          Twinkle.protect.formevents.movemodify({
            target: form.movemodify
          });
          form.movelevel.value = item.move;
          Twinkle.protect.formevents.movelevel({
            target: form.movelevel
          });
        } else {
          form.movemodify.checked = false;
          Twinkle.protect.formevents.movemodify({
            target: form.movemodify
          });
        }
        form.editexpiry.value = item.expiry || "1 week";
        form.moveexpiry.value = item.expiry || "1 week";
      } else {
        if (item.create) {
          form.createlevel.value = item.create;
          Twinkle.protect.formevents.createlevel({
            target: form.createlevel
          });
          form.createexpiry.value = item.createexpiry || "1 week";
        }
        form.createexpiry.value = item.expiry || "1 week";
      }
      const reasonField = actiontype === "protect" ? form.protectReason : form.reason;
      if (item.reason) {
        reasonField.value = item.reason;
      } else {
        reasonField.value = "";
      }
      if (mw.config.get("wgArticleId") && mw.config.get("wgPageContentModel") !== "Scribunto") {
        if (form.category.value === "unprotect") {
          form.tagtype.value = "none";
        } else {
          var _item$template;
          form.tagtype.value = (_item$template = item.template) !== null && _item$template !== void 0 ? _item$template : form.category.value;
        }
        Twinkle.protect.formevents.tagtype({
          target: form.tagtype
        });
        if (/template/.test(form.category.value)) {
          form.noinclude.checked = true;
        } else if (mw.config.get("wgNamespaceNumber") !== 10) {
          form.noinclude.checked = false;
        }
      }
    } else if (form.category.value === "unprotect") {
      form.expiry.value = "";
      form.expiry.disabled = true;
    } else {
      form.expiry.value = "";
      form.expiry.disabled = false;
    }
  };
  Twinkle.protect.callback.evaluate = (e) => {
    const form = e.target;
    const input = Morebits.quickForm.getInputData(form);
    let tagparams;
    if (input.actiontype === "tag" || input.actiontype === "protect" && mw.config.get("wgArticleId") && mw.config.get("wgPageContentModel") !== "Scribunto") {
      tagparams = {
        tag: input.tagtype,
        reason: (input.tagtype === "pp-protected" || input.tagtype === "pp-semi-protected" || input.tagtype === "pp-move") && input.protectReason ? input.protectReason : null,
        showexpiry: input.actiontype === "protect" ? input.showexpiry : null,
        small: input.small,
        noinclude: input.noinclude
      };
      if (input.actiontype === "protect") {
        if (input.editmodify) {
          tagparams.expiry = input.editexpiry;
        } else if (input.movemodify) {
          tagparams.expiry = input.moveexpiry;
        }
      }
    }
    const closeparams = {};
    if (input.close) {
      if (input.category === "unprotect") {
        closeparams.type = "unprotect";
      } else if (mw.config.get("wgArticleId")) {
        if (input.editmodify) {
          switch (input.editlevel) {
            case "officialprotected":
              closeparams.type = "officialprotected";
              closeparams.expiry = input.editexpiry;
              break;
            case "revisionprotected":
              closeparams.type = "revisionprotected";
              closeparams.expiry = input.editexpiry;
              break;
            case "sysop":
              closeparams.type = "full";
              closeparams.expiry = input.editexpiry;
              break;
            case "templateeditor":
              closeparams.type = "temp";
              closeparams.expiry = input.editexpiry;
              break;
            case "autoconfirmed":
              closeparams.type = "semi";
              closeparams.expiry = input.editexpiry;
              break;
          }
        } else if (input.movemodify && ["officialprotected", "revisionprotected", "sysop", "templateeditor"].includes(input.movelevel)) {
          closeparams.type = "move";
          closeparams.expiry = input.moveexpiry;
        }
      } else if (input.createlevel !== "all") {
        closeparams.type = "salt";
        closeparams.expiry = input.createexpiry;
      }
    }
    switch (input.actiontype) {
      case "protect": {
        Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
        Morebits.wiki.actionCompleted.notice = window.wgULS("保护完成", "保護完成");
        let statusInited = false;
        let thispage;
        const allDone = () => {
          if (thispage) {
            thispage.getStatusElement().info("完成");
          }
          if (tagparams) {
            Twinkle.protect.callbacks.taggingPageInitial(tagparams);
          }
          if (closeparams && closeparams.type) {
            const rppPage = new Morebits.wiki.page("LIB_talk:页面保护请求", window.wgULS("关闭请求", "關閉請求"));
            rppPage.setFollowRedirect(true);
            rppPage.setCallbackParameters(closeparams);
            rppPage.load(Twinkle.protect.callbacks.closeRequest);
          }
        };
        const protectIt = (next) => {
          thispage = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("保护页面", "保護頁面"));
          if (mw.config.get("wgArticleId")) {
            if (input.editmodify) {
              thispage.setEditProtection(input.editlevel, input.editexpiry);
            }
            if (input.movemodify) {
              if (input.movelevel) {
                thispage.setMoveProtection(input.movelevel, input.moveexpiry);
              } else {
                mw.notify(window.wgULS("您需要选择保护层级!", "您需要選擇保護層級!"), {
                  type: "warn",
                  tag: "twinkleprotect"
                });
                return;
              }
            }
            thispage.setWatchlist(Twinkle.getPref("watchProtectedPages"));
          } else {
            thispage.setCreateProtection(input.createlevel, input.createexpiry);
            thispage.setWatchlist(false);
          }
          if (input.protectReason) {
            thispage.setEditSummary(input.protectReason);
            thispage.setChangeTags(Twinkle.changeTags);
          } else {
            mw.notify(window.wgULS("您必须输入保护理由,这将被记录在保护日志中。", "您必須輸入保護理由,這將被記錄在保護日誌中。"), {
              type: "warn",
              tag: "twinkleprotect"
            });
            return;
          }
          if (!statusInited) {
            Morebits.simpleWindow.setButtonsEnabled(false);
            Morebits.status.init(form);
            statusInited = true;
          }
          thispage.setChangeTags(Twinkle.changeTags);
          thispage.protect(next);
        };
        if (input.editmodify || input.movemodify || !mw.config.get("wgArticleId")) {
          protectIt(allDone);
        } else {
          mw.notify(window.wgULS("请告诉Twinkle要做什么!\n若您只是想标记该页,请选择上面的“用保护模板标记此页”选项。", "請告訴Twinkle要做什麼!\n若您只是想標記該頁,請選擇上面的「用保護模板標記此頁」選項。"), {
            type: "warn",
            tag: "twinkleprotect"
          });
        }
        break;
      }
      case "tag":
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
        Morebits.wiki.actionCompleted.followRedirect = false;
        Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成", "標記完成");
        Twinkle.protect.callbacks.taggingPageInitial(tagparams);
        break;
      case "request": {
        let typename;
        let typereason;
        switch (input.category) {
          case "pp-dispute":
          case "pp-protected":
            typename = window.wgULS("全保护", "全保護");
            break;
          case "pp-template":
            typename = window.wgULS("模板保护", "模板保護");
            break;
          case "pp-vandalism":
          case "pp-semi-disruptive":
          case "pp-semi-unsourced":
          case "pp-semi-vandalism":
          case "pp-semi-usertalk":
          case "pp-semi-template":
          case "pp-semi-sock":
          case "pp-semi-blp":
          case "pp-semi-protected":
            typename = window.wgULS("半保护", "半保護");
            break;
          case "pp-move":
          case "pp-move-dispute":
          case "pp-move-indef":
          case "pp-move-vandalism":
            typename = window.wgULS("移动保护", "移動保護");
            break;
          case "pp-create":
          case "pp-create-offensive":
          case "pp-create-blp":
          case "pp-create-salt":
          case "pp-create-userpage":
          case "pp-create-repeat":
          case "pp-create-vandalism":
            typename = window.wgULS("白纸保护", "白紙保護");
            break;
          default:
            typename = window.wgULS("解除保护", "解除保護");
            break;
        }
        switch (input.category) {
          case "pp-dispute":
            typereason = window.wgULS("争议、编辑战", "爭議、編輯戰");
            break;
          case "pp-vandalism":
          case "pp-semi-vandalism":
          case "pp-create-vandalism":
            typereason = window.wgULS("持续破坏", "持續破壞");
            break;
          case "pp-template":
          case "pp-semi-template":
            typereason = window.wgULS("高风险模板", "高風險模板");
            break;
          case "pp-create-userpage":
            typereason = window.wgULS("被永久封禁的用户页", "被永久封鎖的使用者頁面");
            break;
          case "pp-semi-usertalk":
            typereason = window.wgULS("已封禁用户的讨论页", "已封鎖使用者的討論頁");
            break;
          case "pp-semi-sock":
            typereason = window.wgULS("傀儡破坏", "傀儡破壞");
            break;
          case "pp-semi-blp":
            typereason = window.wgULS("违反生者传记条例", "違反生者傳記條例");
            break;
          case "pp-move-dispute":
            typereason = window.wgULS("争议、移动战", "爭議、移動戰");
            break;
          case "pp-move-vandalism":
            typereason = window.wgULS("移动破坏", "移動破壞");
            break;
          case "pp-move-indef":
            typereason = window.wgULS("高风险页面", "高風險頁面");
            break;
          case "pp-create-repeat":
            typereason = window.wgULS("多次重复创建", "多次重複建立");
            break;
          default:
            typereason = "";
            break;
        }
        let reason = typereason;
        if (input.reason !== "") {
          if (typereason !== "") {
            reason += ":";
          }
          reason += input.reason;
        }
        if (reason !== "") {
          reason = Morebits.string.appendPunctuation(reason);
        }
        const rppparams = {
          reason,
          typename,
          category: input.category,
          expiry: input.expiry
        };
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(form);
        const rppName = "LIB_talk:页面保护请求";
        Morebits.wiki.actionCompleted.redirect = rppName;
        Morebits.wiki.actionCompleted.notice = window.wgULS("提名完成,重定向到讨论页", "提名完成,重新導向到討論頁");
        const rppPage = new Morebits.wiki.page(rppName, window.wgULS("请求保护页面", "請求保護頁面"));
        rppPage.setFollowRedirect(true);
        rppPage.setCallbackParameters(rppparams);
        rppPage.load(Twinkle.protect.callbacks.fileRequest);
        break;
      }
      default:
        mw.notify("twinkleprotect: 未知操作类型", {
          type: "warn",
          tag: "twinkleprotect"
        });
        break;
    }
  };
  Twinkle.protect.callbacks = {
    taggingPageInitial: (tagparams) => {
      if (tagparams.tag === "noop") {
        Morebits.status.info(window.wgULS("应用保护模板", "應用保護模板"), window.wgULS("没什么要做的", "沒什麼要做的"));
        return;
      }
      const pageName = mw.config.get("wgPageName");
      const protectedPage = new Morebits.wiki.page(pageName, window.wgULS("标记页面", "標記頁面"));
      protectedPage.setCallbackParameters(tagparams);
      protectedPage.load(Twinkle.protect.callbacks.taggingPage);
    },
    getTaggedPage: (params, text) => {
      let tag;
      let summary;
      const oldtag_re = /(?:<noinclude>)?[ \t]*\{\{\s*(pp-[^{}]*?|protected|(?:t|v|s|p-|usertalk-v|usertalk-s|sb|move)protected(?:2)?|protected template|privacy protection)\s*?\}\}\s*(?:<\/noinclude>)?\s*/gi;
      const re_result = oldtag_re.exec(text);
      if (re_result && (params.tag === "none" || confirm(window.wgULS("在页面上找到{{", "在頁面上找到{{") + re_result[1] + window.wgULS("}}\n单击确定以移除,或单击取消以取消操作。", "}}\n點擊確定以移除,或點擊取消以取消操作。")))) {
        text = text.replace(oldtag_re, "");
      }
      if (params.tag === "none") {
        summary = window.wgULS("移除保护模板", "移除保護模板");
      } else {
        ({
          tag
        } = params);
        if (params.reason) {
          tag += "|reason=".concat(params.reason);
        }
        if (params.showexpiry && params.expiry && !Morebits.string.isInfinity(params.expiry)) {
          tag += "|expiry={{".concat("subst:", "#time:c|".concat(params.expiry, "}}"));
        }
        if (params.small) {
          tag += "|small=yes";
        }
        if (/^\s*#(?:redirect|重定向|重新導向)/i.test(text)) {
          if (text.match(/{{(?:Redirect[ _]category shell|Rcat[ _]shell|This[ _]is a redirect|多种类型重定向|多種類型重定向|多種類型重新導向|多种类型重新导向|R0|其他重定向|RCS|Redirect[ _]shell)/i)) {
            Morebits.status.info("已存在Redirect category shell", window.wgULS("没什么可做的", "沒什麼可做的"));
            return;
          }
          text = text.replace(/#(?:redirect|重定向|重新導向) ?(\[\[.*?\]\])(.*)/i, "#REDIRECT $1$2\n\n{{".concat(tag, "}}"));
        } else {
          if (params.noinclude) {
            tag = "<noinclude>{{".concat(tag, "}}</noinclude>");
            if (text.indexOf("{|") === 0) {
              tag += "\n";
            }
          } else {
            tag = "{{".concat(tag, "}}\n");
          }
          const ysarchives_page = new Morebits.wikitext.page(text);
          text = ysarchives_page.insertAfterTemplates(tag, Twinkle.hatnoteRegex).getText();
        }
        summary = "加入{{".concat(params.tag, "}}");
      }
      return {
        text,
        summary
      };
    },
    taggingPage: (protectedPage) => {
      const params = protectedPage.getCallbackParameters();
      const text = protectedPage.getPageText();
      const newVersion = Twinkle.protect.callbacks.getTaggedPage(params, text);
      if (newVersion === void 0) {
        protectedPage.getStatusElement().info("完成");
        return;
      }
      protectedPage.setEditSummary(newVersion.summary);
      protectedPage.setChangeTags(Twinkle.changeTags);
      protectedPage.setWatchlist(Twinkle.getPref("watchPPTaggedPages"));
      protectedPage.setPageText(newVersion.text);
      protectedPage.setCreateOption("nocreate");
      protectedPage.suppressProtectWarning();
      protectedPage.save();
    },
    fileRequest: (rppPage) => {
      const params = rppPage.getCallbackParameters();
      let text = rppPage.getPageText();
      const statusElement = rppPage.getStatusElement();
      const rppRe = new RegExp("===\\s*(\\[\\[)?\\s*:?\\s*".concat(Morebits.string.escapeRegExp(Morebits.pageNameNorm), "\\s*(\\]\\])?\\s*==="), "m");
      const tag = rppRe.exec(text);
      const rppLink = document.createElement("a");
      rppLink.setAttribute("href", mw.util.getUrl(rppPage.getPageName()));
      rppLink.appendChild(document.createTextNode(rppPage.getPageName()));
      if (tag) {
        statusElement.error([rppLink, window.wgULS("已有对此页面的保护提名,取消操作。", "已有對此頁面的保護提名,取消操作。")]);
        return;
      }
      let newtag = "=== [[:".concat(Morebits.pageNameNorm, "]] ===\n");
      if (new RegExp("^".concat(mw.util.escapeRegExp(newtag).replace(/\s+/g, String.raw(_templateObject || (_templateObject = _taggedTemplateLiteral(["s*"], ["\\s*"]))))), "m").test(text)) {
        statusElement.error([rppLink, window.wgULS("已有对此页面的保护提名,取消操作。", "已有對此頁面的保護提名,取消操作。")]);
        return;
      }
      let words;
      switch (params.expiry) {
        case "temporary":
          words = window.wgULS("临时", "臨時");
          break;
        case "infinity":
          words = "永久";
          break;
        default:
          words = "";
          break;
      }
      words += params.typename;
      newtag += '* <span style="font-size: 90%">'.concat(window.wgULS("当前保护状态", "目前保護狀態"), ":{{protection status|").concat(/[=]/.test(Morebits.pageNameNorm) ? "1=" : "").concat(Morebits.pageNameNorm, "}}</span>\n");
      newtag += "".concat(window.wgULS("请求", "請求") + Morebits.string.toUpperCaseFirstChar(words) + (params.reason === "" ? "。" : ":".concat(Morebits.string.formatReasonText(params.reason))), "--~~").concat("~~");
      let reg;
      if (params.category === "unprotect") {
        reg = /(==\s*请求解除保护\s*==)/;
      } else {
        reg = /({{\s*\/header\s*}})/;
      }
      const originalTextLength = text.length;
      text = text.replace(reg, "$1\n".concat(newtag, "\n"));
      if (text.length === originalTextLength) {
        const linknode = document.createElement("a");
        linknode.setAttribute("href", mw.util.getUrl("Help:Twinkle/修复RFPP"));
        linknode.appendChild(document.createTextNode(window.wgULS("如何修复RFPP", "如何修復RFPP")));
        statusElement.error([window.wgULS("无法在LIB:RFPP上找到相关定位点标记,要修复此问题,请参见", "無法在LIB:RFPP上找到相關定位點標記,要修復此問題,請參見"), linknode, "。"]);
        return;
      }
      statusElement.status("加入新提名…");
      rppPage.setEditSummary("/* ".concat(Morebits.pageNameNorm, " */ ").concat(window.wgULS("请求对", "請求對"), "[[").concat(Morebits.pageNameNorm, "]]").concat(params.typename));
      rppPage.setChangeTags(Twinkle.changeTags);
      rppPage.setPageText(text);
      rppPage.setCreateOption("recreate");
      rppPage.save(() => {
        const watchPref = Twinkle.getPref("watchRequestedPages");
        const watch = watchPref !== "no" && (watchPref !== "default" || !!Number.parseInt(mw.user.options.get("watchdefault"), 10));
        if (watch) {
          const watch_query = {
            action: "watch",
            titles: mw.config.get("wgPageName"),
            token: mw.user.tokens.get("watchToken")
          };
          if (Twinkle.protect.watched !== true && watchPref !== "default" && watchPref !== "yes") {
            watch_query.expiry = watchPref;
          }
          new Morebits.wiki.api(window.wgULS("将请求保护的页面加入到监视列表", "將請求保護的頁面加入到監視清單"), watch_query).post();
        }
      });
    },
    closeRequest: (rppPage) => {
      const params = rppPage.getCallbackParameters();
      let text = rppPage.getPageText();
      const statusElement = rppPage.getStatusElement();
      const sections = text.split(/(?=\n==\s*请求解除保护\s*==)/);
      if (sections.length !== 2) {
        const linknode2 = document.createElement("a");
        linknode2.setAttribute("href", mw.util.getUrl("Help:Twinkle/修复RFPP"));
        linknode2.appendChild(document.createTextNode("如何修复RFPP"));
        statusElement.error([window.wgULS("无法在LIB:RFPP上找到相关定位点标记,要修复此问题,请参见", "無法在LIB:RFPP上找到相關定位點標記,要修復此問題,請參見"), linknode2, "。"]);
        return;
      }
      let sectionText;
      let expiryText = "";
      if (params.type === "unprotect") {
        [, sectionText] = sections;
      } else {
        [sectionText] = sections;
        expiryText = Morebits.string.formatTime(params.expiry);
      }
      const requestList = sectionText.split(/(?=\n===.+===\s*\n)/);
      let found = false;
      const rppRe = new RegExp("===\\s*(\\[\\[)?\\s*:?\\s*".concat(Morebits.pageNameRegex(Morebits.pageNameNorm), "\\s*(\\]\\])?\\s*==="), "m");
      for (let i = 1; i < requestList.length; i++) {
        if (rppRe.exec(requestList[i])) {
          requestList[i] = requestList[i].trimEnd();
          if (params.type === "unprotect") {
            requestList[i] += "\n: {{RFPP|isun}}。--~~".concat("~~\n");
          } else {
            requestList[i] += "\n: {{RFPP|".concat(params.type, "|").concat(Morebits.string.isInfinity(params.expiry) ? "infinity" : expiryText, "}}。--~~").concat("~~\n");
          }
          found = true;
          break;
        }
      }
      if (!found) {
        statusElement.warn(window.wgULS("没有找到相关的请求", "沒有找到相關的請求"));
        return;
      }
      if (params.type === "unprotect") {
        text = sections[0] + requestList.join("");
      } else {
        text = requestList.join("") + sections[1];
      }
      let summary = "";
      if (params.type === "unprotect") {
        [, sectionText] = sections;
      } else {
        [sectionText] = sections;
      }
      switch (params.type) {
        case "semi":
          summary = window.wgULS("半保护", "半保護");
          break;
        case "temp":
          summary = window.wgULS("模板保护", "模板保護");
          break;
        case "ecp":
          summary = window.wgULS("延伸确认保护", "延伸確認保護");
          break;
        case "full":
          summary = window.wgULS("全保护", "全保護");
          break;
        case "revisionprotected":
          summary = window.wgULS("版本保护", "版本保護");
          break;
        case "officialprotected":
          summary = window.wgULS("裁委会保护", "裁委會保護");
          break;
        case "move":
          summary = window.wgULS("移动保护", "移動保護");
          break;
        case "salt":
          summary = window.wgULS("白纸保护", "白紙保護");
          break;
        case "unprotect":
          summary = window.wgULS("解除保护", "解除保護");
          break;
        default:
          statusElement.warn(window.wgULS("未知保护类型", "未知保護類別"));
          return;
      }
      if (Morebits.string.isInfinity(params.expiry)) {
        summary = expiryText + summary;
      } else {
        summary += expiryText;
      }
      rppPage.setEditSummary("/* ".concat(Morebits.pageNameNorm, " */ ").concat(summary));
      rppPage.setChangeTags(Twinkle.changeTags);
      rppPage.setPageText(text);
      rppPage.save();
    }
  };
  Twinkle.protect.formatProtectionDescription = (protectionLevels) => {
    const protectionNode = [];
    if (Object.keys(protectionLevels).length === 0) {
      protectionNode.push($("<b>".concat(window.wgULS("无保护", "無保護"), "</b>"))[0]);
    } else {
      for (var _i8 = 0, _Object$entries5 = Object.entries(protectionLevels); _i8 < _Object$entries5.length; _i8++) {
        const [type, settings] = _Object$entries5[_i8];
        let label;
        switch (type) {
          case "edit":
            label = window.wgULS("编辑", "編輯");
            break;
          case "move":
            label = window.wgULS("移动", "移動");
            break;
          case "create":
            label = window.wgULS("创建", "建立");
            break;
          case "upload":
            label = window.wgULS("上传", "上傳");
            break;
          default:
            label = type;
            break;
        }
        let level;
        switch (settings.level) {
          case "officialprotected":
            level = window.wgULS("仅允许档案理事员", "僅允許檔案理事員");
            break;
          case "autoconfirmed":
            level = window.wgULS("仅允许自动确认用户", "僅允許自動確認使用者");
            break;
          case "templateeditor":
            level = window.wgULS("仅模板编辑员和管理员", "僅模板編輯員和管理員");
            break;
          case "sysop":
            level = window.wgULS("仅管理员", "僅管理員");
            break;
          default:
            ({
              level
            } = settings);
            break;
        }
        protectionNode.push($("<b>".concat(label, ":").concat(level, "</b>"))[0]);
        if (Morebits.string.isInfinity(settings.expiry)) {
          protectionNode.push(window.wgULS("(无限期)", "(無限期)"));
        } else {
          protectionNode.push("".concat(window.wgULS("(过期:", "(過期:") + new Morebits.date(settings.expiry).calendar("utc"), ")"));
        }
        if (settings.cascade) {
          protectionNode.push(window.wgULS("(连锁)", "(連鎖)"));
        }
      }
    }
    return protectionNode;
  };
  Twinkle.addInitCallback(Twinkle.protect, "protect");
})(jQuery);
//! src/Twinkle/modules/friendlytag.js
/*! Twinkle.js - friendlytag.js */
(function friendlytag($) {
  const $body = $("body");
  Twinkle.tag = () => {
    if (Morebits.isPageRedirect()) {
      Twinkle.tag.mode = window.wgULS("重定向", "重新導向");
      Twinkle.tag.modeEn = "redirect";
      Twinkle.addPortletLink(Twinkle.tag.callback, window.wgULS("标记", "標記"), "friendly-tag", window.wgULS("标记重定向", "標記重新導向"));
    } else if (mw.config.get("wgNamespaceNumber") === 6 && !document.querySelector("#mw-sharedupload") && document.querySelector("#mw-imagepage-section-filehistory")) {
      Twinkle.tag.mode = window.wgULS("文件", "檔案");
      Twinkle.tag.modeEn = "file";
      Twinkle.addPortletLink(Twinkle.tag.callback, window.wgULS("标记", "標記"), "friendly-tag", window.wgULS("标记文件", "標記檔案"));
    } else if ([0, 302].includes(mw.config.get("wgNamespaceNumber")) && mw.config.get("wgCurRevisionId") || Morebits.pageNameNorm === Twinkle.getPref("sandboxPage")) {
      Twinkle.tag.mode = window.wgULS("条目", "條目");
      Twinkle.tag.modeEn = "article";
      Twinkle.tag.canRemove = mw.config.get("wgCurRevisionId") === mw.config.get("wgRevisionId") && // Disabled on latest diff because the diff slider could be used to slide
      // away from the latest diff without causing the script to reload
      !mw.config.get("wgDiffNewId");
      Twinkle.addPortletLink(Twinkle.tag.callback, window.wgULS("标记", "標記"), "friendly-tag", window.wgULS("标记条目", "標記條目"));
    }
  };
  Twinkle.tag.checkedTags = [];
  Twinkle.tag.callback = () => {
    const Window = new Morebits.simpleWindow(630, Twinkle.tag.modeEn === "article" ? 500 : 400);
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("标记设置", "標記設定"), "H:TW/PREF#tag");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#tag");
    const form = new Morebits.quickForm(Twinkle.tag.callback.evaluate);
    form.append({
      type: "input",
      label: window.wgULS("筛选标记列表:", "篩選標記列表:"),
      name: "quickfilter",
      size: "30",
      event: function event() {
        $allCheckboxDivs.find(".search-hit").each((_i, e) => {
          const label_element = e.parentElement;
          label_element.innerHTML = label_element.textContent;
        });
        if (this.value) {
          $allCheckboxDivs.hide();
          $allHeaders.hide();
          const searchString = this.value;
          const searchRegex = new RegExp(mw.util.escapeRegExp(searchString), "i");
          $allCheckboxDivs.find("label").each((_index, element) => {
            const label_text = element.textContent;
            const searchHit = searchRegex.exec(label_text);
            if (searchHit) {
              const range = document.createRange();
              const [textnode] = element.childNodes;
              range.selectNodeContents(textnode);
              range.setStart(textnode, searchHit.index);
              range.setEnd(textnode, searchHit.index + searchString.length);
              const [underline_span] = $("<span>").addClass("search-hit").css("text-decoration", "underline");
              range.surroundContents(underline_span);
              element.parentElement.style.display = "block";
            }
          });
        } else {
          $allCheckboxDivs.show();
          $allHeaders.show();
        }
      }
    });
    switch (Twinkle.tag.modeEn) {
      case "article":
        Window.setTitle(window.wgULS("条目维护标记", "條目維護標記"));
        Twinkle.tag.article.flatObject = {};
        var _iterator23 = _createForOfIteratorHelper(Twinkle.tag.article.tagList), _step23;
        try {
          for (_iterator23.s(); !(_step23 = _iterator23.n()).done; ) {
            const group = _step23.value;
            var _iterator24 = _createForOfIteratorHelper(group.value), _step24;
            try {
              for (_iterator24.s(); !(_step24 = _iterator24.n()).done; ) {
                const subgroup = _step24.value;
                if (subgroup.value) {
                  var _iterator25 = _createForOfIteratorHelper(subgroup.value), _step25;
                  try {
                    for (_iterator25.s(); !(_step25 = _iterator25.n()).done; ) {
                      const item = _step25.value;
                      Twinkle.tag.article.flatObject[item.tag] = {
                        description: item.description,
                        excludeMI: !!item.excludeMI
                      };
                    }
                  } catch (err) {
                    _iterator25.e(err);
                  } finally {
                    _iterator25.f();
                  }
                } else {
                  Twinkle.tag.article.flatObject[subgroup.tag] = {
                    description: subgroup.description,
                    excludeMI: !!subgroup.excludeMI
                  };
                }
              }
            } catch (err) {
              _iterator24.e(err);
            } finally {
              _iterator24.f();
            }
          }
        } catch (err) {
          _iterator23.e(err);
        } finally {
          _iterator23.f();
        }
        form.append({
          type: "select",
          name: "sortorder",
          label: window.wgULS("查看列表:", "檢視列表:"),
          tooltip: window.wgULS("您可以在Twinkle参数设置(H:TW/PREF)中更改此项。", "您可以在Twinkle偏好設定(H:TW/PREF)中更改此項。"),
          event: Twinkle.tag.updateSortOrder,
          list: [{
            type: "option",
            value: "cat",
            label: window.wgULS("按类型", "按類別"),
            selected: Twinkle.getPref("tagArticleSortOrder") === "cat"
          }, {
            type: "option",
            value: "alpha",
            label: "按字母",
            selected: Twinkle.getPref("tagArticleSortOrder") === "alpha"
          }]
        });
        if (!Twinkle.tag.canRemove) {
          const divElement = document.createElement("div");
          divElement.innerHTML = window.wgULS("要移除现有维护标记,请从当前条目版本中打开“标记”菜单", "要移除現有維護標記,請從目前條目版本中打開「標記」選單");
          form.append({
            type: "div",
            name: "untagnotice",
            label: divElement
          });
        }
        form.append({
          type: "div",
          id: "tagWorkArea",
          className: "morebits-scrollbox",
          style: "max-height: 28em"
        });
        form.append({
          type: "checkbox",
          list: [{
            label: window.wgULS("如可能,合并入{{multiple issues}}", "如可能,合併入{{multiple issues}}"),
            value: "group",
            name: "group",
            tooltip: window.wgULS("若加入{{multiple issues}}支持的三个以上的模板,所有支持的模板都会被合并入{{multiple issues}}模板中。", "若加入{{multiple issues}}支援的三個以上的模板,所有支援的模板都會被合併入{{multiple issues}}模板中。"),
            checked: Twinkle.getPref("groupByDefault")
          }]
        });
        form.append({
          type: "input",
          label: "理由:",
          name: "reason",
          tooltip: window.wgULS("附加于编辑摘要的可选理由,例如指出条目内容的哪些部分有问题或移除模板的理由,但若理由很长则应该发表在讨论页。", "附加於編輯摘要的可選理由,例如指出條目內容的哪些部分有問題或移除模板的理由,但若理由很長則應該發表在討論頁。"),
          size: "80"
        });
        break;
      case "file":
        Window.setTitle(window.wgULS("文件维护标记", "檔案維護標記"));
        var _iterator26 = _createForOfIteratorHelper(Twinkle.tag.fileList), _step26;
        try {
          for (_iterator26.s(); !(_step26 = _iterator26.n()).done; ) {
            const group = _step26.value;
            if (group.buildFilename) {
              var _iterator27 = _createForOfIteratorHelper(group.value), _step27;
              try {
                for (_iterator27.s(); !(_step27 = _iterator27.n()).done; ) {
                  const el = _step27.value;
                  el.subgroup = {
                    type: "input",
                    label: window.wgULS("替换的文件:", "替換的檔案:"),
                    tooltip: window.wgULS("输入替换此文件的文件名称(必填)", "輸入替換此檔案的檔案名稱(必填)"),
                    name: "".concat(el.value.replace(/ /g, "_"), "File")
                  };
                }
              } catch (err) {
                _iterator27.e(err);
              } finally {
                _iterator27.f();
              }
            }
            form.append({
              type: "header",
              label: group.key
            });
            form.append({
              type: "checkbox",
              name: "tags",
              list: group.value
            });
          }
        } catch (err) {
          _iterator26.e(err);
        } finally {
          _iterator26.f();
        }
        if (Twinkle.getPref("customFileTagList").length) {
          form.append({
            type: "header",
            label: window.wgULS("自定义模板", "自訂模板")
          });
          form.append({
            type: "checkbox",
            name: "tags",
            list: Twinkle.getPref("customFileTagList")
          });
        }
        break;
      case "redirect": {
        Window.setTitle(window.wgULS("重定向标记", "重新導向標記"));
        const i = 1;
        var _iterator28 = _createForOfIteratorHelper(Twinkle.tag.redirectList), _step28;
        try {
          for (_iterator28.s(); !(_step28 = _iterator28.n()).done; ) {
            const group = _step28.value;
            form.append({
              type: "header",
              id: "tagHeader".concat(i),
              label: group.key
            });
            form.append({
              type: "checkbox",
              name: "tags",
              list: group.value.map((item) => {
                return {
                  value: item.tag,
                  label: "{{".concat(item.tag, "}}:").concat(item.description),
                  subgroup: item.subgroup
                };
              })
            });
          }
        } catch (err) {
          _iterator28.e(err);
        } finally {
          _iterator28.f();
        }
        if (Twinkle.getPref("customRedirectTagList").length) {
          form.append({
            type: "header",
            label: window.wgULS("自定义模板", "自訂模板")
          });
          form.append({
            type: "checkbox",
            name: "tags",
            list: Twinkle.getPref("customRedirectTagList")
          });
        }
        break;
      }
      default:
        mw.notify("Twinkle.tag:未知模式 ".concat(Twinkle.tag.mode), {
          type: "warn",
          tag: "friendlytag"
        });
        break;
    }
    if (document.querySelectorAll(".patrollink").length) {
      form.append({
        type: "checkbox",
        list: [{
          label: window.wgULS("标记页面为已巡查", "標記頁面為已巡查"),
          value: "patrol",
          name: "patrol",
          checked: Twinkle.getPref("markTaggedPagesAsPatrolled")
        }]
      });
    }
    form.append({
      type: "submit",
      className: "tw-tag-submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    $allCheckboxDivs = $(result).find("[name$=tags]").parent();
    $allHeaders = $(result).find("h5");
    result.quickfilter.focus();
    result.quickfilter.autocomplete = "off";
    result.quickfilter.addEventListener("keypress", (e) => {
      if (e.key === "Enter") {
        e.preventDefault();
        return false;
      }
    });
    if (Twinkle.tag.modeEn === "article") {
      Twinkle.tag.alreadyPresentTags = [];
      if (Twinkle.tag.canRemove) {
        $body.find(".mw-parser-output").children().each((_i, e) => {
          if (e.tagName === "H2") {
            return false;
          }
          if (e.className.indexOf("box-") === 0) {
            if (e.classList[0] === "box-问题条目") {
              $(e).find(".ambox").each((_index, element) => {
                if (element.classList[0].indexOf("box-") === 0) {
                  const boxTag = element.classList[0].slice("box-".length).replace(/_/g, " ");
                  Twinkle.tag.alreadyPresentTags.push(boxTag);
                }
              });
              return true;
            }
            const tag = e.classList[0].slice("box-".length).replace(/_/g, " ");
            Twinkle.tag.alreadyPresentTags.push(tag);
          }
        });
        if ($body.find(".box-Uncategorized").length) {
          Twinkle.tag.alreadyPresentTags.push("Uncategorized");
        }
        if ($body.find(".box-Improve_categories").length) {
          Twinkle.tag.alreadyPresentTags.push("Improve categories");
        }
      }
      const statusNode = document.createElement("span");
      statusNode.style.fontSize = "90%";
      statusNode.id = "tw-tag-status";
      Twinkle.tag.status = {
        // initial state; defined like this because these need to be available for reference
        // in the click event handler
        numAdded: 0,
        numRemoved: 0
      };
      $body.find("button.tw-tag-submit").after(statusNode);
      const evt = document.createEvent("Event");
      evt.initEvent("change", true, true);
      result.sortorder.dispatchEvent(evt);
    } else {
      var _iterator29 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "tags")), _step29;
      try {
        for (_iterator29.s(); !(_step29 = _iterator29.n()).done; ) {
          const checkbox = _step29.value;
          generateLinks(checkbox);
        }
      } catch (err) {
        _iterator29.e(err);
      } finally {
        _iterator29.f();
      }
    }
  };
  let $allCheckboxDivs;
  let $allHeaders;
  Twinkle.tag.updateSortOrder = (e) => {
    const {
      form
    } = e.target;
    const sortorder = e.target.value;
    Twinkle.tag.checkedTags = form.getChecked("tags");
    const container = new Morebits.quickForm.element({
      type: "fragment"
    });
    const makeCheckbox = (tag, description) => {
      const checkbox = {
        value: tag,
        label: "{{".concat(tag, "}}: ").concat(description)
      };
      if (Twinkle.tag.checkedTags.includes(tag)) {
        checkbox.checked = true;
      }
      switch (tag) {
        case "Expert needed":
          checkbox.subgroup = [{
            name: "expert",
            type: "input",
            label: window.wgULS("哪个领域的专家(必填):", "哪個領域的專家(必填):"),
            tooltip: window.wgULS("必填,可参考 Category:需要专业人士关注的页面 使用现存的分类。", "必填,可參考 Category:需要專業人士關注的頁面 使用現存的分類。")
          }, {
            name: "expert2",
            type: "input",
            label: window.wgULS("哪个领域的专家:", "哪個領域的專家:"),
            tooltip: window.wgULS("可选,可参考 Category:需要专业人士关注的页面 使用现存的分类。", "可選,可參考 Category:需要專業人士關注的頁面 使用現存的分類。")
          }, {
            name: "expert3",
            type: "input",
            label: window.wgULS("哪个领域的专家:", "哪個領域的專家:"),
            tooltip: window.wgULS("可选,可参考 Category:需要专业人士关注的页面 使用现存的分类。", "可選,可參考 Category:需要專業人士關注的頁面 使用現存的分類。")
          }];
          break;
        case "Merge":
        case "Merge from":
        case "Merge to": {
          let otherTagName = "Merge";
          switch (tag) {
            case "Merge from":
              otherTagName = "Merge to";
              break;
            case "Merge to":
              otherTagName = "Merge from";
              break;
          }
          checkbox.subgroup = [{
            name: "mergeTarget",
            type: "input",
            label: window.wgULS("其他条目:", "其他條目:"),
            tooltip: window.wgULS("如指定多个条目,请用管道符分隔:条目甲|条目乙", "如指定多個條目,請用管道符分隔:條目甲|條目乙")
          }, {
            type: "checkbox",
            list: [{
              name: "mergeTagOther",
              label: "用{{".concat(otherTagName).concat(window.wgULS("}}标记其他条目", "}}標記其他條目")),
              checked: true,
              tooltip: window.wgULS("仅在只输入了一个条目名时可用", "僅在只輸入了一個條目名時可用")
            }]
          }];
          if (mw.config.get("wgNamespaceNumber") === 0) {
            checkbox.subgroup.push({
              name: "mergeReason",
              type: "textarea",
              label: window.wgULS("合并理由(会被贴上".concat(tag === "Merge to" ? "其他" : "这", "条目的讨论页):"), "合併理由(會被貼上".concat(tag === "Merge to" ? "其他" : "這", "條目的討論頁):")),
              tooltip: window.wgULS("可选,但强烈推荐。如不需要请留空。仅在只输入了一个条目名时可用。", "可選,但強烈推薦。如不需要請留空。僅在只輸入了一個條目名時可用。")
            });
          }
          break;
        }
        case "Missing information":
          checkbox.subgroup = {
            name: "missingInformation",
            type: "input",
            label: window.wgULS("缺少的内容(必填):", "缺少的內容(必填):"),
            tooltip: window.wgULS("必填,显示为“缺少有关……的信息。”", "必填,顯示為「缺少有關……的資訊。」")
          };
          break;
        case "Notability":
          checkbox.subgroup = {
            name: "notability",
            type: "select",
            list: [{
              label: "{{Notability}}:".concat(window.wgULS("通用的关注度指引", "通用的關注度指引")),
              value: "none"
            }, {
              label: "{{Notability|Astro}}:".concat(window.wgULS("天体", "天體")),
              value: "Astro"
            }, {
              label: "{{Notability|Biographies}}:".concat(window.wgULS("人物传记", "人物傳記")),
              value: "Biographies"
            }, {
              label: "{{Notability|Book}}:".concat(window.wgULS("书籍", "書籍")),
              value: "Book"
            }, {
              label: "{{Notability|Cyclone}}:".concat(window.wgULS("气旋", "氣旋")),
              value: "Cyclone"
            }, {
              label: "{{Notability|Fiction}}:".concat(window.wgULS("虚构事物", "虛構事物")),
              value: "Fiction"
            }, {
              label: "{{Notability|Geographic}}:".concat(window.wgULS("地理特征", "地理特徵")),
              value: "Geographic"
            }, {
              label: "{{Notability|Geometry}}:".concat(window.wgULS("几何图形", "幾何圖形")),
              value: "Geometry"
            }, {
              label: "{{Notability|Invention}}:".concat(window.wgULS("发明、研究", "發明、研究")),
              value: "Invention"
            }, {
              label: "{{Notability|Music}}:".concat(window.wgULS("音乐", "音樂")),
              value: "Music"
            }, {
              label: "{{Notability|Numbers}}:".concat(window.wgULS("数字", "數字")),
              value: "Numbers"
            }, {
              label: "{{Notability|Organizations}}:".concat(window.wgULS("组织", "組織")),
              value: "Organizations"
            }, {
              label: "{{Notability|Property}}:".concat(window.wgULS("性质表", "性質表")),
              value: "Property"
            }, {
              label: "{{Notability|Traffic}}:交通",
              value: "Traffic"
            }, {
              label: "{{Notability|Web}}:".concat(window.wgULS("网站、网络内容", "網站、網路內容"), "(非正式指引)"),
              value: "Web"
            }]
          };
          break;
        case "Requested move":
          checkbox.subgroup = [{
            name: "moveTarget",
            type: "input",
            label: window.wgULS("新名称:", "新名稱:")
          }, {
            name: "moveReason",
            type: "textarea",
            label: window.wgULS("移动理由(会被粘贴该条目的讨论页):", "移動理由(會被貼上該條目的討論頁):"),
            tooltip: window.wgULS("可选,但强烈推荐。如不需要请留空。", "可選,但強烈推薦。如不需要請留空。")
          }];
          break;
        case "Split":
          checkbox.subgroup = [{
            name: "target1",
            type: "input",
            label: window.wgULS("页面名1:", "頁面名1:"),
            tooltip: window.wgULS("可选。", "可選。")
          }, {
            name: "target2",
            type: "input",
            label: window.wgULS("页面名2:", "頁面名2:"),
            tooltip: window.wgULS("可选。", "可選。")
          }, {
            name: "target3",
            type: "input",
            label: window.wgULS("页面名3:", "頁面名3:"),
            tooltip: window.wgULS("可选。", "可選。")
          }];
          break;
        case "Cleanup":
          checkbox.subgroup = [{
            name: "cleanupReason",
            type: "input",
            label: "需要清理的理由",
            tooltip: window.wgULS("可选,但强烈推荐。如不需要请留空。", "可選,但強烈推薦。如不需要請留空。")
          }];
          break;
        default:
          break;
      }
      return checkbox;
    };
    const makeCheckboxesForAlreadyPresentTags = () => {
      container.append({
        type: "header",
        id: "tagHeader0",
        label: window.wgULS("已放置的维护标记", "已放置的維護標記")
      });
      const subdiv = container.append({
        type: "div",
        id: "tagSubdiv0"
      });
      const checkboxes = [];
      const unCheckedTags = e.target.form.getUnchecked("existingTags");
      var _iterator30 = _createForOfIteratorHelper(Twinkle.tag.alreadyPresentTags), _step30;
      try {
        for (_iterator30.s(); !(_step30 = _iterator30.n()).done; ) {
          const tag = _step30.value;
          const checkbox = {
            value: tag,
            label: "{{".concat(tag, "}}").concat(Twinkle.tag.article.flatObject[tag] ? ": ".concat(Twinkle.tag.article.flatObject[tag].description) : ""),
            checked: !unCheckedTags.includes(tag)
          };
          checkboxes.push(checkbox);
        }
      } catch (err) {
        _iterator30.e(err);
      } finally {
        _iterator30.f();
      }
      subdiv.append({
        type: "checkbox",
        name: "existingTags",
        list: checkboxes
      });
    };
    if (sortorder === "cat") {
      const doCategoryCheckboxes = (subdiv, subgroup) => {
        const checkboxes = [];
        var _iterator31 = _createForOfIteratorHelper(subgroup), _step31;
        try {
          for (_iterator31.s(); !(_step31 = _iterator31.n()).done; ) {
            const item = _step31.value;
            if (!Twinkle.tag.alreadyPresentTags.includes(item.tag)) {
              checkboxes.push(makeCheckbox(item.tag, item.description));
            }
          }
        } catch (err) {
          _iterator31.e(err);
        } finally {
          _iterator31.f();
        }
        subdiv.append({
          type: "checkbox",
          name: "tags",
          list: checkboxes
        });
      };
      if (Twinkle.tag.alreadyPresentTags.length > 0) {
        makeCheckboxesForAlreadyPresentTags();
      }
      let i = 1;
      var _iterator32 = _createForOfIteratorHelper(Twinkle.tag.article.tagList), _step32;
      try {
        for (_iterator32.s(); !(_step32 = _iterator32.n()).done; ) {
          const group = _step32.value;
          container.append({
            type: "header",
            id: "tagHeader".concat(i),
            label: group.key
          });
          const subdiv = container.append({
            type: "div",
            id: "tagSubdiv".concat(i++)
          });
          if (group.value[0].tag) {
            doCategoryCheckboxes(subdiv, group.value);
          } else {
            var _iterator33 = _createForOfIteratorHelper(group.value), _step33;
            try {
              for (_iterator33.s(); !(_step33 = _iterator33.n()).done; ) {
                const subgroup = _step33.value;
                subdiv.append({
                  type: "div",
                  label: [Morebits.htmlNode("b", subgroup.key)]
                });
                doCategoryCheckboxes(subdiv, subgroup.value);
              }
            } catch (err) {
              _iterator33.e(err);
            } finally {
              _iterator33.f();
            }
          }
        }
      } catch (err) {
        _iterator32.e(err);
      } finally {
        _iterator32.f();
      }
    } else {
      var _Twinkle$tag$article;
      if (Twinkle.tag.alreadyPresentTags.length > 0) {
        makeCheckboxesForAlreadyPresentTags();
        container.append({
          type: "header",
          id: "tagHeader1",
          label: window.wgULS("可用的维护标记", "可用的維護標記")
        });
      }
      (_Twinkle$tag$article = Twinkle.tag.article).alphabeticalList || (_Twinkle$tag$article.alphabeticalList = Object.keys(Twinkle.tag.article.flatObject).sort());
      const checkboxes = [];
      var _iterator34 = _createForOfIteratorHelper(Twinkle.tag.article.alphabeticalList), _step34;
      try {
        for (_iterator34.s(); !(_step34 = _iterator34.n()).done; ) {
          const tag = _step34.value;
          if (!Twinkle.tag.alreadyPresentTags.includes(tag)) {
            checkboxes.push(makeCheckbox(tag, Twinkle.tag.article.flatObject[tag].description));
          }
        }
      } catch (err) {
        _iterator34.e(err);
      } finally {
        _iterator34.f();
      }
      container.append({
        type: "checkbox",
        name: "tags",
        list: checkboxes
      });
    }
    if (Twinkle.getPref("customTagList").length) {
      container.append({
        type: "header",
        label: window.wgULS("自定义模板", "自訂模板")
      });
      container.append({
        type: "checkbox",
        name: "tags",
        list: Twinkle.getPref("customTagList").map((el) => {
          el.checked = Twinkle.tag.checkedTags.includes(el.value);
          return el;
        })
      });
    }
    const $workarea = $(form).find("#tagWorkArea");
    const rendered = container.render();
    $workarea.empty().append(rendered);
    $allCheckboxDivs = $workarea.find("[name=tags], [name=existingTags]").parent();
    $allHeaders = $workarea.find("h5, .quickformDescription");
    form.quickfilter.value = "";
    form.quickfilter.focus();
    $workarea.find("h5").css({
      "font-size": "110%"
    });
    $workarea.find("h5:not(:first-child)").css({
      "margin-top": "1em"
    });
    $workarea.find("div").filter(":has(span.quickformDescription)").css({
      "margin-top": "0.4em"
    });
    var _iterator35 = _createForOfIteratorHelper(Morebits.quickForm.getElements(form, "existingTags")), _step35;
    try {
      for (_iterator35.s(); !(_step35 = _iterator35.n()).done; ) {
        const checkbox = _step35.value;
        generateLinks(checkbox);
      }
    } catch (err) {
      _iterator35.e(err);
    } finally {
      _iterator35.f();
    }
    var _iterator36 = _createForOfIteratorHelper(Morebits.quickForm.getElements(form, "tags")), _step36;
    try {
      for (_iterator36.s(); !(_step36 = _iterator36.n()).done; ) {
        const checkbox = _step36.value;
        generateLinks(checkbox);
      }
    } catch (err) {
      _iterator36.e(err);
    } finally {
      _iterator36.f();
    }
    const statusNode = document.querySelector("#tw-tag-status");
    $body.find("[name=tags], [name=existingTags]").on("click", function() {
      if (this.name === "tags") {
        Twinkle.tag.status.numAdded += this.checked ? 1 : -1;
      } else if (this.name === "existingTags") {
        Twinkle.tag.status.numRemoved += this.checked ? -1 : 1;
      }
      const firstPart = "加入".concat(Twinkle.tag.status.numAdded).concat(window.wgULS("个标记", "個標記"));
      const secondPart = "移除".concat(Twinkle.tag.status.numRemoved).concat(window.wgULS("个标记", "個標記"));
      statusNode.textContent = (Twinkle.tag.status.numAdded ? "  ".concat(firstPart) : "") + (Twinkle.tag.status.numRemoved ? (Twinkle.tag.status.numAdded ? ";" : "  ") + secondPart : "");
    });
  };
  const generateLinks = (checkbox) => {
    const link = Morebits.htmlNode("a", ">");
    link.setAttribute("class", "tag-template-link");
    const tagname = checkbox.values;
    link.setAttribute("href", mw.util.getUrl((tagname.includes(":") ? "" : "Template:") + (tagname.includes("|") ? tagname.slice(0, tagname.indexOf("|")) : tagname)));
    link.setAttribute("target", "_blank");
    link.setAttribute("rel", "noopener noreferrer");
    $(checkbox).parent().append([" ", link]);
  };
  Twinkle.tag.article = {};
  Twinkle.tag.article.tagList = [{
    key: window.wgULS("清理和维护模板", "清理和維護模板"),
    value: [{
      key: window.wgULS("常规清理", "常規清理"),
      value: [{
        tag: "Cleanup",
        description: window.wgULS("可能需要进行清理,以符合有兽档案馆的质量标准", "可能需要進行清理,以符合有獸檔案館的質量標準")
      }, {
        tag: "Cleanup rewrite",
        description: window.wgULS("不符合有兽档案馆的质量标准,需要完全重写", "不符合有獸檔案館的質量標準,需要完全重寫")
      }, {
        tag: "Cleanup-jargon",
        description: window.wgULS("包含过多行话或专业术语,可能需要简化或提出进一步解释", "包含過多行話或專業術語,可能需要簡化或提出進一步解釋")
      }, {
        tag: "Copy edit",
        description: window.wgULS("需要编修,以确保文法、用词、语气、格式、标点等使用恰当", "需要編修,以確保文法、用詞、語氣、格式、標點等使用恰當")
      }]
    }, {
      key: window.wgULS("可能多余的内容", "可能多餘的內容"),
      value: [{
        tag: "Copypaste",
        description: window.wgULS("内容可能是从某个来源处拷贝后粘贴", "內容可能是從某個來源處拷貝後貼上")
      }, {
        tag: "External links",
        description: window.wgULS("使用外部链接的方式可能不符合有兽档案馆的条例", "使用外部連結的方式可能不符合有獸檔案館的條例")
      }, {
        tag: "Non-free",
        description: window.wgULS("可能过多或不当地使用了受著作权保护的文字、图像或多媒体文件", "可能過多或不當地使用了受版權保護的文字、圖像或多媒體檔案")
      }]
    }, {
      key: window.wgULS("结构和导言", "結構和導言"),
      value: [{
        tag: "Lead too long",
        description: window.wgULS("导言部分也许过于冗长", "導言部分也許過於冗長")
      }, {
        tag: "Lead too short",
        description: window.wgULS("导言部分也许不足以概括其内容", "導言部分也許不足以概括其內容")
      }, {
        tag: "Very long",
        description: window.wgULS("可能过于冗长", "可能過於冗長")
      }]
    }, {
      key: window.wgULS("虚构作品相关清理", "虛構作品相關清理"),
      value: [{
        tag: "In-universe",
        description: window.wgULS("使用小说故事内的观点描述一个虚构事物", "使用小說故事內的觀點描述一個虛構事物")
      }, {
        tag: "Long plot",
        description: window.wgULS("可能包含过于详细的剧情摘要", "可能包含過於詳細的劇情摘要")
      }]
    }]
  }, {
    key: window.wgULS("常规条目问题", "常規條目問題"),
    value: [{
      key: "重要性和知名度",
      value: [{
        tag: "Notability",
        description: window.wgULS("可能不符合通用关注度指引", "可能不符合通用關注度指引"),
        excludeMI: true
      }, {
        tag: "Notability Unreferenced",
        description: window.wgULS("可能具备关注度,但需要来源加以彰显", "可能具備關注度,但需要來源加以彰顯")
      }]
    }, {
      key: window.wgULS("写作风格", "寫作風格"),
      value: [{
        tag: "Advert",
        description: window.wgULS("类似广告或宣传性内容", "類似廣告或宣傳性內容")
      }, {
        tag: "Fanpov",
        description: window.wgULS("类似爱好者网页", "類似愛好者網頁")
      }, {
        tag: "How-to",
        description: window.wgULS("包含指南或教学内容", "包含指南或教學內容")
      }, {
        tag: "Inappropriate person",
        description: window.wgULS("使用不适当的第一人称和第二人称", "使用不適當的第一人稱和第二人稱")
      }, {
        tag: "Newsrelease",
        description: window.wgULS("阅读起来像是新闻稿及包含过度的宣传性语调", "閱讀起來像是新聞稿及包含過度的宣傳性語調")
      }, {
        tag: "Prose",
        description: window.wgULS("使用了日期或时间列表式记述,需要改写为连贯的叙述性文字", "使用了日期或時間列表式記述,需要改寫為連貫的敘述性文字")
      }, {
        tag: "Review",
        description: window.wgULS("阅读起来类似评论,需要清理", "閱讀起來類似評論,需要清理")
      }, {
        tag: "Tone",
        description: window.wgULS("语调或风格可能不适合百科全书的写作方式", "語調或風格可能不適合百科全書的寫作方式")
      }]
    }, {
      key: window.wgULS("内容", "內容"),
      value: [
        {
          tag: "Missing information",
          description: "缺少必要的信息"
        },
        // these three have a subgroup with several options
        {
          tag: "Substub",
          description: window.wgULS("过于短小", "過於短小"),
          excludeMI: true
        },
        {
          tag: "Unencyclopedic",
          description: window.wgULS("可能不适合写入百科全书", "可能不適合寫入百科全書")
        }
      ]
    }, {
      key: window.wgULS("信息和细节", "資訊和細節"),
      value: [{
        tag: "Expert needed",
        description: window.wgULS("需要精通或熟悉本主题的专业人士(专家)参与及协助编辑", "需要精通或熟悉本主題的專業人士(專家)參與及協助編輯")
      }, {
        tag: "Overly detailed",
        description: window.wgULS("包含太多过度细节内容", "包含太多過度細節內容")
      }, {
        tag: "Trivia",
        description: window.wgULS("应避免有陈列杂项、琐碎资料的部分", "應避免有陳列雜項、瑣碎資料的部分")
      }]
    }, {
      key: window.wgULS("时间性", "時間性"),
      value: [{
        tag: "Current",
        description: window.wgULS("记述新闻动态", "記述新聞動態"),
        excludeMI: true
      }, {
        tag: "Update",
        description: window.wgULS("当前条目或章节需要更新", "當前條目或章節需要更新")
      }]
    }, {
      key: window.wgULS("客观性和事实准确性", "客觀性和事實準確性"),
      value: [{
        tag: "Autobiography",
        description: window.wgULS("类似一篇自传,或内容主要由条目描述的当事人或组织撰写、编辑", "類似一篇自傳,或內容主要由條目描述的當事人或組織撰寫、編輯")
      }, {
        tag: "COI",
        description: window.wgULS("主要贡献者与本条目所宣扬的内容可能存在利益冲突", "主要貢獻者與本條目所宣揚的內容可能存在利益衝突")
      }, {
        tag: "Disputed",
        description: window.wgULS("内容疑欠准确,有待查证", "內容疑欠準確,有待查證")
      }, {
        tag: "Globalize",
        description: window.wgULS("仅具有一部分地区的信息或观点", "僅具有一部分地區的資訊或觀點")
      }, {
        tag: "Hoax",
        description: window.wgULS("真实性被质疑", "真實性被質疑")
      }, {
        tag: "POV",
        description: window.wgULS("客观性有争议。内容、语调可能带有明显的个人观点或地方色彩", "客觀性有爭議。內容、語調可能帶有明顯的個人觀點或地方色彩")
      }, {
        tag: "Self-contradictory",
        description: window.wgULS("内容自相矛盾", "內容自相矛盾")
      }, {
        tag: "Weasel",
        description: window.wgULS("语义模棱两可而损及其客观性或准确性", "語意模棱兩可而損及其客觀性或準確性")
      }]
    }, {
      key: window.wgULS("可供查证和来源", "可供查證和來源"),
      value: [{
        tag: "BLPdispute",
        description: window.wgULS("可能违反了有兽档案馆关于生者传记的条例", "可能違反了有獸檔案館關於生者傳記的條例")
      }, {
        tag: "BLPsources",
        description: window.wgULS("生者传记需要补充更多可供查证的来源", "生者傳記需要補充更多可供查證的來源")
      }, {
        tag: "BLP unsourced",
        description: window.wgULS("生者传记没有列出任何参考或来源", "生者傳記沒有列出任何參考或來源")
      }, {
        tag: "Citecheck",
        description: window.wgULS("可能包含不适用或被曲解的引用资料,部分内容的准确性无法被证实", "可能包含不適用或被曲解的引用資料,部分內容的準確性無法被證實")
      }, {
        tag: "More footnotes needed",
        description: window.wgULS("因为文内引用不足,部分字句的来源仍然不明", "因為文內引用不足,部分字句的來源仍然不明")
      }, {
        tag: "No footnotes",
        description: window.wgULS("因为没有内文引用而来源仍然不明", "因為沒有內文引用而來源仍然不明")
      }, {
        tag: "Onesource",
        description: window.wgULS("极大或完全地依赖于某个单一的来源", "極大或完全地依賴於某個單一的來源")
      }, {
        tag: "Original research",
        description: window.wgULS("可能包含原创研究或未查证内容", "可能包含原創研究或未查證內容")
      }, {
        tag: "Primarysources",
        description: window.wgULS("依赖第一手来源", "依賴第一手來源")
      }, {
        tag: "Refimprove",
        description: window.wgULS("需要补充更多来源", "需要補充更多來源")
      }, {
        tag: "Unreferenced",
        description: window.wgULS("没有列出任何参考或来源", "沒有列出任何參考或來源")
      }]
    }]
  }, {
    key: window.wgULS("具体内容问题", "具體內容問題"),
    value: [{
      key: window.wgULS("语言", "語言"),
      value: [{
        tag: "NotMandarin",
        description: window.wgULS("包含过多不是现代标准汉语的内容", "包含過多不是現代標準漢語的內容"),
        excludeMI: true
      }, {
        tag: "Rough translation",
        description: window.wgULS("翻译品质不佳", "翻譯品質不佳")
      }]
    }, {
      key: window.wgULS("链接", "連結"),
      value: [{
        tag: "Dead end",
        description: window.wgULS("需要加上内部链接以构筑百科全书的链接网络", "需要加上內部連結以構築百科全書的連結網絡")
      }, {
        tag: "Orphan",
        description: window.wgULS("没有或只有很少链入页面", "沒有或只有很少連入頁面")
      }, {
        tag: "Overlinked",
        description: window.wgULS("含有过多、重复、或不必要的内部链接", "含有過多、重複、或不必要的內部連結")
      }, {
        tag: "Underlinked",
        description: window.wgULS("需要更多内部链接以构筑百科全书的链接网络", "需要更多內部連結以構築百科全書的連結網絡")
      }]
    }, {
      key: window.wgULS("参考技术", "參考技術"),
      value: [{
        tag: "Citation style",
        description: window.wgULS("引用需要进行清理", "引用需要進行清理")
      }]
    }, {
      key: window.wgULS("分类", "分類"),
      value: [{
        tag: "Improve categories",
        description: window.wgULS("需要更多页面分类", "需要更多頁面分類"),
        excludeMI: true
      }, {
        tag: "Uncategorized",
        description: window.wgULS("缺少页面分类", "缺少頁面分類"),
        excludeMI: true
      }]
    }]
  }, {
    key: window.wgULS("合并、拆分、移动", "合併、拆分、移動"),
    value: [{
      tag: "Merge from",
      description: window.wgULS("建议将页面并入此页面", "建議將頁面併入此頁面"),
      excludeMI: true
    }, {
      tag: "Merge to",
      description: window.wgULS("建议将此页面并入页面", "建議將此頁面併入頁面"),
      excludeMI: true
    }, {
      tag: "Merge",
      description: window.wgULS("建议此页面与页面合并", "建議此頁面與頁面合併"),
      excludeMI: true
    }, {
      tag: "Requested move",
      description: window.wgULS("建议将此页面移动到新名称", "建議將此頁面移動到新名稱"),
      excludeMI: true
    }, {
      tag: "Split",
      description: window.wgULS("建议将此页面分割为多个页面", "建議將此頁面分割為多個頁面"),
      excludeMI: true
    }]
  }];
  Twinkle.tag.redirectList = [{
    key: "常用模板",
    value: [{
      tag: window.wgULS("合并重定向", "合併重定向"),
      description: window.wgULS("保持页面题名至相应主条目,令页面内容在合并后仍能保存其编辑历史", "保持頁面題名至相應主條目,令頁面內容在合併後仍能儲存其編輯歷史")
    }, {
      tag: window.wgULS("简繁重定向", "簡繁重定向"),
      description: window.wgULS("引导简体至繁体,或繁体至简体", "引導簡體至繁體,或繁體至簡體")
    }, {
      tag: window.wgULS("关注度重定向", "關注度重定向"),
      description: window.wgULS("缺乏关注度的子主题向有关注度的母主题的重定向", "缺乏關注度的子主題向有關注度的母主題的重定向")
    }, {
      tag: "模板重定向",
      description: window.wgULS("指向模板的重定向页面", "指向模板的重定向頁面")
    }, {
      tag: window.wgULS("别名重定向", "別名重定向"),
      description: window.wgULS("标题的其他名称、笔名、绰号、同义字等", "標題的其他名稱、筆名、綽號、同義字等")
    }, {
      tag: window.wgULS("译名重定向", "譯名重定向"),
      description: window.wgULS("人物、作品等各项事物的其他翻译名称", "人物、作品等各項事物的其他翻譯名稱")
    }, {
      tag: window.wgULS("缩写重定向", "縮寫重定向"),
      description: window.wgULS("标题缩写", "標題縮寫")
    }, {
      tag: window.wgULS("拼写重定向", "拼寫重定向"),
      description: window.wgULS("标题的其他不同拼写", "標題的其他不同拼寫")
    }, {
      tag: window.wgULS("错字重定向", "錯字重定向"),
      description: window.wgULS("纠正标题的常见错误拼写或误植", "糾正標題的常見錯誤拼寫或誤植")
    }, {
      tag: window.wgULS("旧名重定向", "舊名重定向"),
      description: window.wgULS("将事物早前的名称引导至更改后的主题", "將事物早前的名稱引導至更改後的主題")
    }, {
      tag: "全名重定向",
      description: window.wgULS("标题的完整或更完整名称", "標題的完整或更完整名稱")
    }, {
      tag: "短名重定向",
      description: window.wgULS("完整标题名称或人物全名的部分、不完整的名称或简称", "完整標題名稱或人物全名的部分、不完整的名稱或簡稱")
    }, {
      tag: "姓氏重定向",
      description: "人物姓氏"
    }, {
      tag: "名字重定向",
      description: "人物人名"
    }, {
      tag: "本名重定向",
      description: "人物本名"
    }, {
      tag: "非中文重定向",
      description: window.wgULS("非中文标题", "非中文標題"),
      subgroup: [{
        name: "altLangFrom",
        type: "input",
        label: "本重新導向的語言(可選)",
        tooltip: "輸入重新導向名稱所使用語言的ISO 639代碼,例如en代表英語,代碼可參見 Template:ISO_639_name"
      }]
    }, {
      tag: "日文重定向",
      description: window.wgULS("日语名称", "日語名稱")
    }]
  }, {
    key: "偶用模板",
    value: [{
      tag: "角色重定向",
      description: window.wgULS("电视剧、电影、书籍等作品的角色", "電視劇、電影、書籍等作品的角色")
    }, {
      tag: window.wgULS("章节重定向", "章節重定向"),
      description: window.wgULS("导向至较高密度组织的页面", "導向至較高密度組織的頁面")
    }, {
      tag: "列表重定向",
      description: window.wgULS("导向至低密度的列表", "導向至低密度的列表")
    }, {
      tag: "可能性重定向",
      description: window.wgULS("导向至当前提供内容更为详尽的目标页面", "導向至當前提供內容更為詳盡的目標頁面")
    }, {
      tag: window.wgULS("关联字重定向", "關聯字重定向"),
      description: window.wgULS("标题名称关联字", "標題名稱關聯字")
    }, {
      tag: window.wgULS("条目请求重定向", "條目請求重定向"),
      description: window.wgULS("需要独立条目的页面", "需要獨立條目的頁面"),
      subgroup: [{
        name: "reqArticleLang",
        type: "input",
        label: "外語語言代碼:",
        tooltip: "使用ISO 639代碼,可參見 Template:ISO_639_name"
      }, {
        name: "reqArticleTitle",
        type: "input",
        label: "外語頁面名稱:",
        size: 60
      }]
    }, {
      tag: window.wgULS("快捷方式重定向", "捷徑重定向"),
      description: window.wgULS("有兽档案馆快捷方式", "有獸檔案館快捷方式")
    }]
  }, {
    key: window.wgULS("鲜用模板", "鮮用模板"),
    value: [{
      tag: window.wgULS("词组重定向", "詞組重定向"),
      description: window.wgULS("将词组/词组/成语指向切题的条目及恰当章节", "將詞組/詞組/成語指向切題的條目及恰當章節")
    }, {
      tag: window.wgULS("消歧义页重定向", "消歧義頁重定向"),
      description: window.wgULS("指向消歧义页", "指向消歧義頁")
    }, {
      tag: "域名重定向",
      description: window.wgULS("域名", "網域名稱")
    }, {
      tag: "年代重定向",
      description: window.wgULS("于年份条目导向至年代条目", "於年份條目導向至年代條目")
    }, {
      tag: window.wgULS("用户框模板重定向", "用戶框模板重定向"),
      description: window.wgULS("用户框模板", "用戶框模板")
    }, {
      tag: "重定向模板用重定向",
      description: window.wgULS("导向至重定向模板", "導向至重定向模板")
    }, {
      tag: "EXIF重定向",
      description: window.wgULS("JPEG图像文件包含EXIF信息", "JPEG圖檔包含EXIF資訊")
    }]
  }];
  Twinkle.tag.fileList = [{
    key: window.wgULS("著作权和来源问题标签", "著作權和來源問題標籤"),
    value: [{
      label: "{{Non-free reduce}}:".concat(window.wgULS("非低分辨率的合理使用图像(或过长的音频剪辑等)", "非低解析度的合理使用圖像(或過長的音頻剪輯等)")),
      value: "Non-free reduce"
    }]
  }, {
    key: window.wgULS("清理标签", "清理標籤"),
    value: [{
      label: "{{Watermark}}:".concat(window.wgULS("图像包含了水印", "圖像包含了浮水印")),
      value: "Watermark"
    }, {
      label: "{{Rename media}}:".concat(window.wgULS("文件应该根据文件名称指引被重命名", "檔案應該根據檔案名稱指引被重新命名")),
      value: "Rename media",
      subgroup: [{
        type: "input",
        name: "renamemediaNewname",
        label: window.wgULS("新名称:", "新名稱:"),
        tooltip: window.wgULS("输入图像的新名称(可选)", "輸入圖像的新名稱(可選)")
      }, {
        type: "input",
        name: "renamemediaReason",
        label: "原因:",
        tooltip: window.wgULS("输入重命名的原因(可选)", "輸入重新命名的原因(可選)")
      }]
    }, {
      label: "{{Should be SVG}}:".concat(window.wgULS("PNG、GIF、JPEG文件应该重制成矢量图形", "PNG、GIF、JPEG檔案應該重製成向量圖形")),
      value: "Should be SVG"
    }]
  }, {
    key: window.wgULS("文件取代标签", "檔案取代標籤"),
    value: [{
      label: "{{Obsolete}}:".concat(window.wgULS("有新版本可用的过时文件", "有新版本可用的過時檔案")),
      value: "Obsolete"
    }, {
      label: "{{Vector version available}}:".concat(window.wgULS("有矢量图形可用的非矢量图形文件", "有向量圖形可用的非向量圖形檔案")),
      value: "Vector version available"
    }],
    buildFilename: true
  }];
  Twinkle.tag.callbacks = {
    article: (pageobj) => {
      let pageText = pageobj.getPageText().replace(/\{\{\s*([Nn]ew unreviewed article|[Uu]nreviewed|[Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
      const params = pageobj.getCallbackParameters();
      const postRemoval = () => {
        if (params.tagsToRemove.length) {
          pageText = pageText.replace(/\{\{(multiple ?issues|article ?issues|mi|ai|issues|多個問題|多个问题|問題條目|问题条目|數個問題|数个问题)\s*\|\s*\}\}\n?/im, "");
          pageText = pageText.replace(/\{\{(?:multiple ?issues|article ?issues|mi|ai|issues|多個問題|多个问题|問題條目|问题条目|數個問題|数个问题)\s*\|\s*(\{\{(?:\{\{[^{}]*\}\}|[^{}])+\}\})\s*\}\}/im, "$1");
        }
        const makeSentence = (array) => {
          if (array.length < 3) {
            return array.join("和");
          }
          const last = array.pop();
          return "".concat(array.join("、"), "和").concat(last);
        };
        const makeTemplateLink = (tag) => {
          let text = "{{[[";
          if (tag.includes("|")) {
            tag = tag.slice(0, tag.indexOf("|"));
          }
          text += tag.includes(":") ? tag : "Template:".concat(tag, "|").concat(tag);
          return "".concat(text, "]]}}");
        };
        let summaryText;
        const addedTags = params.tags.map(makeTemplateLink);
        const removedTags = params.tagsToRemove.map(makeTemplateLink);
        if (addedTags.length) {
          summaryText = "加入".concat(makeSentence(addedTags));
          summaryText += removedTags.length ? "並移除".concat(makeSentence(removedTags)) : "";
        } else {
          summaryText = "移除".concat(makeSentence(removedTags));
        }
        summaryText += window.wgULS("标记", "標記");
        if (params.reason) {
          summaryText += ":".concat(params.reason);
        }
        if (summaryText.length > 499) {
          summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, "$1");
        }
        pageobj.setPageText(pageText);
        pageobj.setEditSummary(summaryText);
        pageobj.setChangeTags(Twinkle.changeTags);
        pageobj.setWatchlist(Twinkle.getPref("watchTaggedPages"));
        pageobj.setMinorEdit(Twinkle.getPref("markTaggedPagesAsMinor"));
        pageobj.setCreateOption("nocreate");
        pageobj.save(() => {
          if (params.mergeReason) {
            const talkpage = new Morebits.wiki.page("Talk:".concat(params.discussArticle), window.wgULS("将理由贴进讨论页", "將理由貼進討論頁"));
            talkpage.setNewSectionText("".concat(params.mergeReason.trim(), " ~~").concat("~~"));
            talkpage.setNewSectionTitle("请求与[[".concat(params.nonDiscussArticle, "]]合并"));
            talkpage.setChangeTags(Twinkle.changeTags);
            talkpage.setWatchlist(Twinkle.getPref("watchMergeDiscussions"));
            talkpage.setCreateOption("recreate");
            talkpage.newSection();
          }
          if (params.mergeTagOther) {
            let otherTagName = "Merge";
            if (params.mergeTag === "Merge from") {
              otherTagName = "Merge to";
            } else if (params.mergeTag === "Merge to") {
              otherTagName = "Merge from";
            }
            const newParams = {
              tags: [otherTagName],
              tagsToRemove: [],
              tagsToRemain: [],
              mergeTarget: Morebits.pageNameNorm,
              discussArticle: params.discussArticle,
              talkDiscussionTitle: params.talkDiscussionTitle,
              talkDiscussionTitleLinked: params.talkDiscussionTitleLinked
            };
            const otherpage = new Morebits.wiki.page(params.mergeTarget, "".concat(window.wgULS("标记其他页面(", "標記其他頁面(") + params.mergeTarget, ")"));
            otherpage.setCallbackParameters(newParams);
            otherpage.load(Twinkle.tag.callbacks.article);
          }
          if (params.moveReason) {
            let moveTalkpageText = "\n\n{{".concat("subst:", "RM|1=".concat(params.moveReason.trim()));
            if (params.moveTarget) {
              moveTalkpageText += "|2=".concat(params.moveTarget);
            }
            moveTalkpageText += "}}";
            const moveTalkpage = new Morebits.wiki.page("Talk:".concat(params.discussArticle), window.wgULS("将理由贴进讨论页", "將理由貼進討論頁"));
            moveTalkpage.setAppendText(moveTalkpageText);
            moveTalkpage.setEditSummary(window.wgULS("请求移动", "請求移動") + (params.moveTarget ? "至[[".concat(params.moveTarget, "]]") : ""));
            moveTalkpage.setChangeTags(Twinkle.changeTags);
            moveTalkpage.setCreateOption("recreate");
            moveTalkpage.append();
          }
        });
        if (params.patrol) {
          pageobj.patrol();
        }
      };
      const removeTags = () => {
        if (params.tagsToRemove.length === 0) {
          postRemoval();
          return;
        }
        Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("移除取消选择的已存在标记", "移除取消選擇的已存在標記"));
        const getRedirectsFor = [];
        var _iterator37 = _createForOfIteratorHelper(params.tagsToRemove), _step37;
        try {
          for (_iterator37.s(); !(_step37 = _iterator37.n()).done; ) {
            const tag = _step37.value;
            const tag_re = new RegExp("\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|[^}]+)?\\}\\}\\n?"));
            if (tag_re.test(pageText)) {
              pageText = pageText.replace(tag_re, "");
            } else {
              getRedirectsFor.push("Template:".concat(tag));
            }
          }
        } catch (err) {
          _iterator37.e(err);
        } finally {
          _iterator37.f();
        }
        if (!getRedirectsFor.length) {
          postRemoval();
          return;
        }
        const api = new Morebits.wiki.api(window.wgULS("获取模板重定向", "取得模板重新導向"), {
          action: "query",
          prop: "linkshere",
          titles: getRedirectsFor.join("|"),
          redirects: 1,
          lhnamespace: "10",
          lhshow: "redirect",
          lhlimit: "max"
          // 500 is max for normal users, 5000 for bots and sysops
        }, (apiobj) => {
          $(apiobj.responseXML).find("page").each((_idx, page) => {
            let removed = false;
            $(page).find("lh").each((_index, element) => {
              const tag = $(element).attr("title").slice(9);
              const tag_re = new RegExp("\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?\\}\\}\\n?"));
              if (tag_re.test(pageText)) {
                pageText = pageText.replace(tag_re, "");
                removed = true;
                return false;
              }
            });
            if (!removed) {
              Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("无法在页面上找到{{", "無法在頁面上找到{{") + $(page).attr("title").slice(9) + window.wgULS("}}……跳过", "}}……跳過"));
            }
          });
          postRemoval();
        });
        api.post();
      };
      if (!params.tags.length) {
        removeTags();
        return;
      }
      let tagRe;
      let tagText = "";
      let tags = [];
      const groupableTags = [];
      const groupableExistingTags = [];
      const addTag = (tagName) => {
        let currentTag = "";
        if (tagName === "Uncategorized" || tagName === "Improve categories") {
          pageText += "\n\n{{".concat(tagName, "|time={{").concat("subst:", "#time:c}}}}");
        } else {
          currentTag += "{{".concat(tagName);
          switch (tagName) {
            case "Expert needed":
              currentTag += "|subject=".concat(params.expert);
              if (params.expert2) {
                currentTag += "|subject2=".concat(params.expert2);
              }
              if (params.expert3) {
                currentTag += "|subject3=".concat(params.expert3);
              }
              break;
            case "Merge":
            case "Merge to":
            case "Merge from":
              if (params.mergeTarget) {
                params.mergeTarget = Morebits.string.toUpperCaseFirstChar(params.mergeTarget.replace(/_/g, " "));
                currentTag += "|".concat(params.mergeTarget);
                if (mw.config.get("wgNamespaceNumber") === 0 && (params.mergeReason || params.discussArticle)) {
                  if (!params.discussArticle) {
                    params.discussArticle = tagName === "Merge to" ? params.mergeTarget : mw.config.get("wgTitle");
                    params.nonDiscussArticle = tagName === "Merge to" ? mw.config.get("wgTitle") : params.mergeTarget;
                    params.talkDiscussionTitle = window.wgULS("请求与", "請求與") + params.nonDiscussArticle + window.wgULS("合并", "合併");
                  }
                  currentTag += "|discuss=Talk:".concat(params.discussArticle, "#").concat(params.talkDiscussionTitle);
                }
              }
              break;
            case "Missing information":
              currentTag += "|1=".concat(params.missingInformation);
              break;
            case "Notability":
              if (params.notability !== "none") {
                currentTag += "|3=".concat(params.notability);
              }
              break;
            case "Requested move":
              if (params.moveTarget) {
                params.moveTarget = Morebits.string.toUpperCaseFirstChar(params.moveTarget.replace(/_/g, " "));
                params.discussArticle = mw.config.get("wgTitle");
                currentTag += "|".concat(params.moveTarget);
              }
              break;
            case "Split":
              if (params.target1) {
                currentTag += "|1=".concat(params.target1);
              }
              if (params.target2) {
                currentTag += "|2=".concat(params.target2);
              }
              if (params.target3) {
                currentTag += "|3=".concat(params.target3);
              }
              break;
            case "Cleanup":
              if (params.cleanupReason) {
                currentTag += "|reason=".concat(params.cleanupReason);
              }
              break;
            default:
              break;
          }
          currentTag += "|time={{".concat("subst:", "#time:c}}}}\n");
          tagText += currentTag;
        }
      };
      const addUngroupedTags = () => {
        for (var _i9 = 0, _tags = tags; _i9 < _tags.length; _i9++) {
          const tag = _tags[_i9];
          addTag(tag);
        }
        const ysarchives_page = new Morebits.wikitext.page(pageText);
        const templatesAfter = (
          // Protection templates
          // CSD
          // AfD
          "".concat(Twinkle.hatnoteRegex, "pp|pp-.*?|(?:Delete|Db-reason|D|Deletebecause|Db|速删|速刪|Speedy|SD|快删|快刪|CSD)|[rsaiftcmv]fd|vfd-(?:b|q|s|source|v|wikt)|(?:移动到维基|移動到維基)(?:教科书|教科書|语录|語錄|文库|文庫|导游|導遊|词典|詞典)")
        );
        pageText = ysarchives_page.insertAfterTemplates(tagText, templatesAfter).getText();
        removeTags();
      };
      var _iterator38 = _createForOfIteratorHelper(params.tags), _step38;
      try {
        for (_iterator38.s(); !(_step38 = _iterator38.n()).done; ) {
          const tag = _step38.value;
          tagRe = new RegExp("\\{\\{".concat(tag, "(\\||\\}\\})"), "im");
          if (Twinkle.tag.canRemove || !tagRe.exec(pageText)) {
            if (tag === "Notability" && (mw.config.get("wgNamespaceNumber") === 0 || confirm(window.wgULS("该页面不是条目,您仍要提报到关注度提报吗?", "該頁面不是條目,您仍要提報到關注度提報嗎?")))) {
              const ysarchives_page = new Morebits.wiki.page("LIB_talk:存废讨论/关注度提报", window.wgULS("加入关注度记录项", "加入關注度記錄項"));
              ysarchives_page.setFollowRedirect(true);
              ysarchives_page.setCallbackParameters(params);
              ysarchives_page.load(Twinkle.tag.callbacks.notabilityList);
            }
            if (Twinkle.tag.article.flatObject[tag] && !Twinkle.tag.article.flatObject[tag].excludeMI) {
              groupableTags.push(tag);
            } else {
              tags.push(tag);
            }
          } else if (tag === "Merge from") {
            tags.push(tag);
          } else {
            Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("在页面上找到{{", "在頁面上找到{{") + tag + window.wgULS("}}……跳过", "}}……跳過"));
            if (["Merge", "Merge to"].includes(tag)) {
              params.mergeTarget = null;
              params.mergeReason = null;
              params.mergeTagOther = null;
            }
          }
        }
      } catch (err) {
        _iterator38.e(err);
      } finally {
        _iterator38.f();
      }
      var _iterator39 = _createForOfIteratorHelper(params.tagsToRemain), _step39;
      try {
        for (_iterator39.s(); !(_step39 = _iterator39.n()).done; ) {
          const tag = _step39.value;
          if (Twinkle.tag.article.flatObject[tag] && !Twinkle.tag.article.flatObject[tag].excludeMI) {
            groupableExistingTags.push(tag);
          }
        }
      } catch (err) {
        _iterator39.e(err);
      } finally {
        _iterator39.f();
      }
      const miTest = /\{\{(multiple ?issues|article ?issues|mi|ai|issues|多個問題|多个问题|問題條目|问题条目|數個問題|数个问题)\s*\|[^}]+\{/im.exec(pageText);
      if (miTest && groupableTags.length > 0) {
        Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("加入支持的标记入已存在的{{multiple issues}}", "加入支援的標記入已存在的{{multiple issues}}"));
        tagText = "";
        var _iterator40 = _createForOfIteratorHelper(groupableTags), _step40;
        try {
          for (_iterator40.s(); !(_step40 = _iterator40.n()).done; ) {
            const tag = _step40.value;
            addTag(tag);
          }
        } catch (err) {
          _iterator40.e(err);
        } finally {
          _iterator40.f();
        }
        const miRegex = new RegExp("(\\{\\{\\s*".concat(miTest[1], "\\s*(?:\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?)\\}\\}\\s*"), "im");
        pageText = pageText.replace(miRegex, "$1".concat(tagText, "}}\n"));
        tagText = "";
        addUngroupedTags();
      } else if (params.group && !miTest && groupableExistingTags.length + groupableTags.length >= 2) {
        Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("加入支持的标记入{{multiple issues}}", "加入支援的標記入{{multiple issues}}"));
        tagText += "{{Multiple issues|\n";
        const addNewTagsToMI = () => {
          var _iterator41 = _createForOfIteratorHelper(groupableTags), _step41;
          try {
            for (_iterator41.s(); !(_step41 = _iterator41.n()).done; ) {
              const tag = _step41.value;
              addTag(tag);
            }
          } catch (err) {
            _iterator41.e(err);
          } finally {
            _iterator41.f();
          }
          tagText += "}}\n";
          addUngroupedTags();
        };
        const getRedirectsFor = [];
        var _iterator42 = _createForOfIteratorHelper(groupableExistingTags), _step42;
        try {
          for (_iterator42.s(); !(_step42 = _iterator42.n()).done; ) {
            const tag = _step42.value;
            const tag_re = new RegExp("(\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|[^}]+)?\\}\\}\\n?)"));
            if (tag_re.test(pageText)) {
              tagText += tag_re.exec(pageText)[1];
              pageText = pageText.replace(tag_re, "");
            } else {
              getRedirectsFor.push("Template:".concat(tag));
            }
          }
        } catch (err) {
          _iterator42.e(err);
        } finally {
          _iterator42.f();
        }
        if (!getRedirectsFor.length) {
          addNewTagsToMI();
          return;
        }
        const api = new Morebits.wiki.api(window.wgULS("获取模板重定向", "取得模板重新導向"), {
          action: "query",
          prop: "linkshere",
          titles: getRedirectsFor.join("|"),
          redirects: 1,
          lhnamespace: "10",
          lhshow: "redirect",
          lhlimit: "max"
          // 500 is max for normal users, 5000 for bots and sysops
        }, (apiobj) => {
          $(apiobj.responseXML).find("page").each((_idx, page) => {
            let found = false;
            $(page).find("lh").each((_index, element) => {
              const tag = $(element).attr("title").slice(9);
              const tag_re = new RegExp("(\\{\\{".concat(Morebits.pageNameRegex(tag), "\\s*(\\|[^}]*)?\\}\\}\\n?)"));
              if (tag_re.test(pageText)) {
                tagText += tag_re.exec(pageText)[1];
                pageText = pageText.replace(tag_re, "");
                found = true;
                return false;
              }
            });
            if (!found) {
              Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("无法在页面上找到{{", "無法在頁面上找到{{") + $(page).attr("title").slice(9) + window.wgULS("}}……跳过", "}}……跳過"));
            }
          });
          addNewTagsToMI();
        });
        api.post();
      } else {
        tags = [...tags, ...groupableTags];
        addUngroupedTags();
      }
    },
    notabilityList: (pageobj) => {
      pageobj.setAppendText("\n{{".concat("subst:", "Fameitem|title=".concat(Morebits.pageNameNorm, "}}")));
      pageobj.setEditSummary("加入[[".concat(Morebits.pageNameNorm, "]]"));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setCreateOption("recreate");
      pageobj.append();
    },
    redirect: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      let pageText = pageobj.getPageText();
      let tagRe;
      let tagText = "";
      let summaryText = "加入";
      const tags = [];
      let i;
      for (i = 0; i < params.tags.length; i++) {
        tagRe = new RegExp("(\\{\\{".concat(params.tags[i], "(\\||\\}\\}))"), "im");
        if (tagRe.exec(pageText)) {
          Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("在重定向上找到{{", "在重新導向上找到{{") + params.tags[i] + window.wgULS("}}……跳过", "}}……跳過"));
        } else {
          tags.push(params.tags[i]);
        }
      }
      const addTag = (tagName, tagIndex) => {
        tagText += "\n{{".concat(tagName);
        if (tagName === "非中文重定向") {
          if (params.altLangFrom) {
            tagText += "|1=".concat(params.altLangFrom);
          }
        } else if ((tagName === "条目请求重定向" || tagName === "條目請求重定向") && params.reqArticleLang && params.reqArticleTitle) {
          tagText += "|1=".concat(params.reqArticleLang);
          tagText += "|2=".concat(params.reqArticleTitle);
        }
        tagText += "}}";
        if (tagIndex > 0) {
          if (tagIndex === tags.length - 1) {
            summaryText += "和";
          } else if (tagIndex < tags.length - 1) {
            summaryText += "、";
          }
        }
        summaryText += "{{[[:".concat(tagName.includes(":") ? tagName : "Template:".concat(tagName, "|").concat(tagName), "]]}}");
      };
      if (!tags.length) {
        Morebits.status.warn(window.wgULS("信息", "資訊"), window.wgULS("没有标签可供标记", "沒有標籤可供標記"));
      }
      tags.sort();
      for (var _i10 = 0, _tags2 = tags; _i10 < _tags2.length; _i10++) {
        const tag = _tags2[_i10];
        addTag(tag);
      }
      if (pageText.match(/{{(?:redr|this is a redirect|r(?:edirect)?(?:.?cat.*)?[ _]?sh)/i)) {
        const oldTags = pageText.match(/(\s*{{[A-Za-z\s]+\|(?:\s*1=)?)((?:[^|{}]|{{[^}]+}})+)(}})\s*/i);
        pageText = pageText.replace(oldTags[0], oldTags[1] + tagText + oldTags[2] + oldTags[3]);
      } else {
        const pageTags = pageText.match(/\s*{{.+?重定向.*?}}/gim);
        let oldPageTags = "";
        if (pageTags) {
          var _iterator43 = _createForOfIteratorHelper(pageTags), _step43;
          try {
            for (_iterator43.s(); !(_step43 = _iterator43.n()).done; ) {
              let pageTag = _step43.value;
              const pageRe = new RegExp(Morebits.string.escapeRegExp(pageTag), "img");
              pageText = pageText.replace(pageRe, "");
              pageTag = pageTag.trim();
              oldPageTags += "\n".concat(pageTag);
            }
          } catch (err) {
            _iterator43.e(err);
          } finally {
            _iterator43.f();
          }
        }
        pageText += "\n{{Redirect category shell|".concat(tagText).concat(oldPageTags, "\n}}");
      }
      summaryText += (tags.length > 0 ? window.wgULS("标记", "標記") : "{{Redirect category shell}}") + window.wgULS("到重定向", "到重新導向");
      if (summaryText.length > 499) {
        summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, "$1");
      }
      pageobj.setPageText(pageText);
      pageobj.setEditSummary(summaryText);
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setWatchlist(Twinkle.getPref("watchTaggedPages"));
      pageobj.setMinorEdit(Twinkle.getPref("markTaggedPagesAsMinor"));
      pageobj.setCreateOption("nocreate");
      pageobj.save();
      if (params.patrol) {
        pageobj.patrol();
      }
    },
    file: (pageobj) => {
      let text = pageobj.getPageText();
      const params = pageobj.getCallbackParameters();
      let summary = "加入";
      if (params.tags.length) {
        let tagtext = "";
        let currentTag;
        var _iterator44 = _createForOfIteratorHelper(params.tags), _step44;
        try {
          for (_iterator44.s(); !(_step44 = _iterator44.n()).done; ) {
            const tag = _step44.value;
            if (["Keep local", "Now YsArchives Share", "Do not move to YsArchives Share"].includes(tag)) {
              text = text.replace(/{{(mtc|(copy |move )?to ?share|move to ysarchives share|copy to ysarchives share)[^}]*}}/gi, "");
            }
            if (tag === "Vector version available") {
              text = text.replace(/\{\{((convert to |convertto|should be |shouldbe|to)?svg|badpng|vectorize)[^}]*\}\}/gi, "");
            }
            currentTag = tag;
            switch (tag) {
              case "Now Commons":
                currentTag = "subst:".concat(currentTag);
                if (params.nowcommonsName !== "") {
                  currentTag += "|1=".concat(params.nowcommonsName);
                }
                break;
              case "Keep local":
                if (params.keeplocalName !== "") {
                  currentTag += "|1=".concat(params.keeplocalName);
                }
                if (params.keeplocalReason !== "") {
                  currentTag += "|reason=".concat(params.keeplocalReason);
                }
                break;
              case "Rename media":
                if (params.renamemediaNewname !== "") {
                  currentTag += "|1=".concat(params.renamemediaNewname);
                }
                if (params.renamemediaReason !== "") {
                  currentTag += "|2=".concat(params.renamemediaReason);
                }
                break;
              case "Vector version available":
              case "Obsolete":
                currentTag += "|1=".concat(params["".concat(tag.replace(/ /g, "_"), "File")]);
                break;
              case "Do not move to Commons":
                currentTag += "|reason=".concat(params.DoNotMoveToCommons_reason);
                break;
              case "Copy to Wikimedia Commons":
                currentTag += "|human=".concat(mw.config.get("wgUserName"));
                break;
              default:
                break;
            }
            currentTag = "{{".concat(currentTag, "}}\n");
            tagtext += currentTag;
            summary += "{{".concat(tag, "}}、");
          }
        } catch (err) {
          _iterator44.e(err);
        } finally {
          _iterator44.f();
        }
        if (!tagtext) {
          pageobj.getStatusElement().warn(window.wgULS("用户取消操作,没什么要做的", "使用者取消操作,沒什麼要做的"));
          return;
        }
        text = tagtext + text;
      }
      pageobj.setPageText(text);
      pageobj.setEditSummary(summary.slice(0, Math.max(0, summary.length - 1)));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setWatchlist(Twinkle.getPref("watchTaggedPages"));
      pageobj.setMinorEdit(Twinkle.getPref("markTaggedPagesAsMinor"));
      pageobj.setCreateOption("nocreate");
      pageobj.save();
      if (params.patrol) {
        pageobj.patrol();
      }
    }
  };
  Twinkle.tag.callback.evaluate = (e) => {
    const form = e.target;
    const params = Morebits.quickForm.getInputData(form);
    const checkIncompatible = (conflicts, extra) => {
      const count = conflicts.reduce((sum, tag) => {
        return sum += params.tags.includes(tag);
      }, 0);
      if (count > 1) {
        let message = "".concat(window.wgULS("请在以下标签中择一使用", "請在以下標籤中擇一使用"), ":{{").concat(conflicts.join("}}、{{"), "}}。");
        message += extra || "";
        mw.notify(message, {
          type: "warn",
          tag: "friendlytag"
        });
        return true;
      }
    };
    const checkParameter = (tag, parameter, description = "理由") => {
      if (params.tags.includes(tag) && params[parameter].trim() === "") {
        mw.notify("".concat(window.wgULS("您必须指定", "您必須指定"), "{{").concat(tag, "}}的").concat(description, "。"), {
          type: "warn",
          tag: "friendlytag"
        });
        return true;
      }
    };
    switch (Twinkle.tag.modeEn) {
      case "article":
        params.tagsToRemove = form.getUnchecked("existingTags");
        params.tagsToRemain = params.existingTags || [];
        if (params.tags.includes("Merge") || params.tags.includes("Merge from") || params.tags.includes("Merge to")) {
          if (checkIncompatible(["Merge", "Merge from", "Merge to"], window.wgULS("若需要多次合并,请使用{{Merge}}并用管道符分隔条目名(但在这种情形中Twinkle不能自动标记其他条目)。", "若需要多次合併,請使用{{Merge}}並用管道符分隔條目名(但在這種情形中Twinkle不能自動標記其他條目)。"))) {
            return;
          }
          if (!params.mergeTarget) {
            mw.notify(window.wgULS("请指定使用于merge模板中的另一个页面标题。", "請指定使用於merge模板中的另一個頁面標題。"), {
              type: "warn",
              tag: "friendlytag"
            });
            return;
          }
          if ((params.mergeTagOther || params.mergeReason) && params.mergeTarget.includes("|")) {
            mw.notify(window.wgULS("当前还不支持在一次合并中标记多个条目,与开启关于多个条目的讨论。请不要勾选“标记其他条目”并清空“理由”框后再提交。", "目前還不支援在一次合併中標記多個條目,與開啟關於多個條目的討論。請不要勾選「標記其他條目」並清空「理由」框後再提交。"), {
              type: "warn",
              tag: "friendlytag"
            });
            return;
          }
        }
        if (checkParameter("Missing information", "missingInformation", window.wgULS("缺少的内容", "缺少的內容"))) {
          return;
        }
        if (checkParameter("Expert needed", "expert", window.wgULS("专家领域", "專家領域"))) {
          return;
        }
        break;
      case "file":
        if (checkParameter("Obsolete", "ObsoleteFile", window.wgULS("替换的文件名称", "替換的檔案名稱")) || checkParameter("Vector version available", "Vector_version_availableFile", window.wgULS("替换的文件名称", "替換的檔案名稱"))) {
          return;
        }
        if (checkParameter("Do not move to Commons", "DoNotMoveToCommons_reason")) {
          return;
        }
        break;
      case "redirect":
        break;
      default:
        mw.notify("Twinkle.tag:未知模式 ".concat(Twinkle.tag.mode), {
          type: "warn",
          tag: "friendlytag"
        });
        break;
    }
    if (params.tags.length === 0 && (Twinkle.tag.modeEn !== "article" || params.tagsToRemove.length === 0)) {
      mw.notify(window.wgULS("必须选择至少一个标记!", "必須選擇至少一個標記!"), {
        type: "warn",
        tag: "friendlytag"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    Morebits.wiki.actionCompleted.redirect = Morebits.pageNameNorm;
    Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成,将在几秒内刷新页面", "標記完成,將在幾秒內重新整理頁面");
    if (Twinkle.tag.modeEn === "redirect") {
      Morebits.wiki.actionCompleted.followRedirect = false;
    }
    const ysarchives_page = new Morebits.wiki.page(Morebits.pageNameNorm, window.wgULS("正在标记", "正在標記") + Twinkle.tag.mode);
    ysarchives_page.setCallbackParameters(params);
    ysarchives_page.load(Twinkle.tag.callbacks[Twinkle.tag.modeEn]);
  };
  Twinkle.addInitCallback(Twinkle.tag, "tag");
})(jQuery);
//! src/Twinkle/modules/twinklestub.js
/*! Twinkle.js - twinklestub.js */
(function twinklestub($) {
  Twinkle.stub = () => {
    if (Morebits.isPageRedirect()) {
    } else if ([0, 302].includes(mw.config.get("wgNamespaceNumber")) && mw.config.get("wgCurRevisionId") || Morebits.pageNameNorm === Twinkle.getPref("sandboxPage")) {
      Twinkle.stub.mode = "条目";
      Twinkle.addPortletLink(Twinkle.stub.callback, "小作品", "friendly-tag", "标记小作品");
    }
  };
  Twinkle.stub.callback = () => {
    if (Morebits.isPageRedirect()) {
    } else if ((mw.config.get("wgNamespaceNumber") === 0 || mw.config.get("wgNamespaceNumber") === 302) && mw.config.get("wgCurRevisionId") || Morebits.pageNameNorm === Twinkle.getPref("sandboxPage")) {
      Twinkle.stub.mode = window.wgULS("条目", "條目");
      Twinkle.addPortletLink(Twinkle.stub.callback, "小作品", "friendly-tag", window.wgULS("标记小作品", "標記小作品"));
    }
  };
  Twinkle.stub.callback = () => {
    const Window = new Morebits.simpleWindow(630, Twinkle.stub.mode === "article" ? 450 : 400);
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("小作品說明", "小作品说明"), "LIB:小作品");
    Window.addFooterLink(window.wgULS("小作品设置", "小作品設定"), "H:TW/PREF#stub");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#stub");
    const form = new Morebits.quickForm(Twinkle.stub.callback.evaluate);
    if (document.querySelectorAll(".patrollink").length) {
      form.append({
        type: "checkbox",
        list: [{
          label: window.wgULS("标记页面为已巡查", "標記頁面為已巡查"),
          value: "patrolPage",
          name: "patrolPage",
          checked: Twinkle.getPref("markStubbedPagesAsPatrolled")
        }]
      });
    }
    switch (Twinkle.stub.mode) {
      case "條目":
      case "条目":
        Window.setTitle(window.wgULS("条目小作品标记", "條目小作品標記"));
        form.append({
          type: "select",
          name: "sortorder",
          label: window.wgULS("查看列表:", "檢視列表:"),
          tooltip: window.wgULS("您可以在Twinkle参数设置(H:TW/PREF)中更改此项。", "您可以在Twinkle偏好設定(H:TW/PREF)中更改此項。"),
          event: Twinkle.stub.updateSortOrder,
          list: [{
            type: "option",
            value: "cat",
            label: window.wgULS("按类型", "按類別"),
            selected: Twinkle.getPref("stubArticleSortOrder") === "cat"
          }, {
            type: "option",
            value: "alpha",
            label: "按字母",
            selected: Twinkle.getPref("stubArticleSortOrder") === "alpha"
          }]
        });
        form.append({
          type: "div",
          id: "tagWorkArea"
        });
        break;
      default:
        mw.notify("Twinkle.stub:未知模式 ".concat(Twinkle.stub.mode), {
          type: "warn",
          tag: "twinklestub"
        });
        break;
    }
    form.append({
      type: "submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    if (["条目", "條目"].includes(Twinkle.stub.mode)) {
      const evt = document.createEvent("Event");
      evt.initEvent("change", true, true);
      result.sortorder.dispatchEvent(evt);
    }
  };
  Twinkle.stub.checkedTags = [];
  Twinkle.stub.updateSortOrder = (e) => {
    const sortorder = e.target.value;
    Twinkle.stub.checkedTags = e.target.form.getChecked("articleTags");
    if (!Twinkle.stub.checkedTags) {
      Twinkle.stub.checkedTags = [];
    }
    const container = new Morebits.quickForm.element({
      type: "fragment"
    });
    const makeCheckbox = (tag, description) => {
      const checkbox = {
        value: tag,
        label: "{{".concat(tag, "}}: ").concat(description)
      };
      if (Twinkle.stub.checkedTags.includes(tag)) {
        checkbox.checked = true;
      }
      return checkbox;
    };
    if (Twinkle.getPref("customStubList").length) {
      container.append({
        type: "header",
        label: window.wgULS("自定义模板", "自訂模板")
      });
      const customcheckboxes = [];
      var _iterator45 = _createForOfIteratorHelper(Twinkle.getPref("customStubList")), _step45;
      try {
        for (_iterator45.s(); !(_step45 = _iterator45.n()).done; ) {
          const item = _step45.value;
          customcheckboxes.push(makeCheckbox(item.value, item.label));
        }
      } catch (err) {
        _iterator45.e(err);
      } finally {
        _iterator45.f();
      }
      container.append({
        type: "checkbox",
        name: "articleTags",
        list: customcheckboxes
      });
    }
    if (sortorder === "cat") {
      const doCategoryCheckboxes = (subdiv, array) => {
        const checkboxes = [];
        var _iterator46 = _createForOfIteratorHelper(array), _step46;
        try {
          for (_iterator46.s(); !(_step46 = _iterator46.n()).done; ) {
            const tag = _step46.value;
            const description = Twinkle.stub.article.tags[tag];
            checkboxes.push(makeCheckbox(tag, description));
          }
        } catch (err) {
          _iterator46.e(err);
        } finally {
          _iterator46.f();
        }
        subdiv.append({
          type: "checkbox",
          name: "articleTags",
          list: checkboxes
        });
      };
      let i = 0;
      for (var _i11 = 0, _Object$entries6 = Object.entries(Twinkle.stub.article.tagCategories); _i11 < _Object$entries6.length; _i11++) {
        const [title, content] = _Object$entries6[_i11];
        const titleName = Twinkle.stub.article.tagCategoriesHeader[title];
        container.append({
          type: "header",
          id: "tagHeader".concat(i),
          label: titleName
        });
        const subdiv = container.append({
          type: "div",
          id: "tagSubdiv".concat(i++)
        });
        if (Array.isArray(content)) {
          doCategoryCheckboxes(subdiv, content);
        } else {
          for (var _i12 = 0, _Object$entries7 = Object.entries(content); _i12 < _Object$entries7.length; _i12++) {
            const [subtitle, subcontent] = _Object$entries7[_i12];
            subdiv.append({
              type: "div",
              label: [Morebits.htmlNode("b", subtitle)]
            });
            doCategoryCheckboxes(subdiv, subcontent);
          }
        }
      }
    } else {
      const checkboxes = [];
      for (var _i13 = 0, _Object$entries8 = Object.entries(Twinkle.stub.article.tags); _i13 < _Object$entries8.length; _i13++) {
        const [tag, description] = _Object$entries8[_i13];
        checkboxes.push(makeCheckbox(tag, description));
      }
      container.append({
        type: "checkbox",
        name: "articleTags",
        list: checkboxes
      });
    }
    const $workarea = $(e.target.form).find("div#tagWorkArea");
    const rendered = container.render();
    $workarea.empty().append(rendered);
    $workarea.find("h5").css({
      "font-size": "110%"
    });
    $workarea.find("h5:not(:first-child)").css({
      "margin-top": "1em"
    });
    $workarea.find("div").filter(":has(span.quickformDescription)").css({
      "margin-top": "0.4em"
    });
    var _iterator47 = _createForOfIteratorHelper(Morebits.quickForm.getElements(e.target.form, "articleTags")), _step47;
    try {
      for (_iterator47.s(); !(_step47 = _iterator47.n()).done; ) {
        const checkbox = _step47.value;
        const $checkbox = $(checkbox);
        const link = Morebits.htmlNode("a", ">");
        link.setAttribute("class", "tag-template-link");
        link.setAttribute("href", mw.util.getUrl("Template:".concat(Morebits.string.toUpperCaseFirstChar(checkbox.values))));
        link.setAttribute("target", "_blank");
        link.setAttribute("rel", "noopener noreferrer");
        $checkbox.parent().append([" ", link]);
      }
    } catch (err) {
      _iterator47.e(err);
    } finally {
      _iterator47.f();
    }
  };
  Twinkle.stub.article = {};
  Twinkle.stub.article.tags = {
    "actor-stub": "演员",
    "asia-stub": "亚洲",
    "bio-stub": "人物",
    "biology-stub": "生物学",
    "chem-stub": "化学",
    "europe-stub": "欧洲",
    "expand list": "未完成列表",
    "food-stub": "食物",
    "france-geo-stub": "法国地理",
    "geo-stub": "地理位置",
    "hist-stub": "历史或历史学",
    "JP-stub": "日本",
    "lit-stub": "文学",
    "math-stub": "数学",
    "med-stub": "医学",
    "mil-stub": "军事",
    "movie-stub": "电影",
    "music-stub": "音乐",
    "physics-stub": "物理学",
    "politic-stub": "政治",
    "religion-stub": "宗教",
    "science-stub": "科学",
    "sport-stub": "体育",
    stub: "通用小作品",
    "switzerland-stub": "瑞士",
    "tech-stub": "科技",
    "transp-stub": "交通",
    "TV-stub": "电视",
    "UK-stub": "英国",
    "US-bio-stub": "美国人物",
    "US-geo-stub": "美国地理",
    "US-stub": "美国",
    "weather-stub": "天气和特别的天气事件"
  };
  Twinkle.stub.article.tagCategoriesHeader = {
    general: "通用模板",
    geo: "国家和地理",
    others: "杂项",
    bio: "人物",
    science: "科学",
    sport: "体育",
    tech: "技术",
    art: "艺术"
  };
  Twinkle.stub.article.tagCategories = {
    general: ["stub", "expand list"],
    geo: ["asia-stub", "europe-stub", "france-geo-stub", "geo-stub", "JP-stub", "switzerland-stub", "UK-stub", "US-bio-stub", "US-geo-stub", "US-stub"],
    others: ["food-stub", "hist-stub", "mil-stub", "politic-stub", "religion-stub", "transp-stub"],
    bio: ["actor-stub", "bio-stub", "US-bio-stub"],
    science: ["biology-stub", "chem-stub", "math-stub", "med-stub", "physics-stub", "science-stub", "weather-stub"],
    sport: ["sport-stub"],
    tech: ["tech-stub"],
    art: ["actor-stub", "lit-stub", "movie-stub", "music-stub", "TV-stub"]
  };
  Twinkle.stub.callbacks = {
    main: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      let tagRe;
      let summaryText = "加入";
      let tags = [];
      const groupableTags = [];
      let i;
      let pageText = pageobj.getPageText();
      for (i = 0; i < params.tags.length; i++) {
        tagRe = new RegExp("(\\{\\{".concat(params.tags[i], "(\\||\\}\\}))"), "im");
        if (tagRe.exec(pageText)) {
          Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS("在页面上找到{{".concat(params.tags[i], "}}……跳过"), "在頁面上找到{{".concat(params.tags[i], "}}……跳過")));
        } else {
          tags = [...tags, ...Array.isArray(params.tags[i]) ? params.tags[i] : [params.tags[i]]];
        }
      }
      tags = [...tags, ...groupableTags];
      tags.sort();
      const totalTags = tags.length;
      const addTag = (tagName, tagIndex) => {
        pageText += "\n{{".concat(tagName, "}}");
        if (tagIndex > 0) {
          if (tagIndex === totalTags - 1) {
            summaryText += "和";
          } else if (tagIndex < totalTags - 1) {
            summaryText += "、";
          }
        }
        summaryText += "{{[[";
        summaryText += tagName.includes(":") ? tagName : "Template:".concat(tagName, "|").concat(tagName);
        summaryText += "]]}}";
      };
      for (var _i14 = 0, _tags3 = tags; _i14 < _tags3.length; _i14++) {
        const tag = _tags3[_i14];
        addTag(tag);
      }
      summaryText += window.wgULS("标记到", "標記到") + Twinkle.stub.mode;
      pageobj.setPageText(pageText);
      pageobj.setEditSummary(summaryText);
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setWatchlist(Twinkle.getPref("watchStubbedPages"));
      pageobj.setMinorEdit(Twinkle.getPref("markStubbedPagesAsMinor"));
      pageobj.setCreateOption("nocreate");
      pageobj.save();
      if (params.patrol) {
        pageobj.patrol();
      }
    }
  };
  Twinkle.stub.callback.evaluate = (e) => {
    const form = e.target;
    const params = {};
    if (form.patrolPage) {
      params.patrol = form.patrolPage.checked;
    }
    switch (Twinkle.stub.mode) {
      case "條目":
      case "条目":
        params.tags = form.getChecked("articleTags");
        params.group = false;
        break;
      default:
        mw.notify("Twinkle.stub:未知模式 ".concat(Twinkle.stub.mode), {
          type: "warn",
          tag: "twinklestub"
        });
        break;
    }
    if (!params.tags.length) {
      mw.notify("必须选择至少一个标记!", {
        type: "warn",
        tag: "twinklestub"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
    Morebits.wiki.actionCompleted.notice = window.wgULS("标记完成,将在几秒内刷新页面", "標記完成,將在幾秒內重新整理頁面");
    if (Twinkle.stub.mode === "重定向") {
      Morebits.wiki.actionCompleted.followRedirect = false;
    }
    const ysarchives_page = new Morebits.wiki.page(mw.config.get("wgPageName"), window.wgULS("正在标记", "正在標記") + Twinkle.stub.mode);
    ysarchives_page.setCallbackParameters(params);
    switch (Twinkle.stub.mode) {
      case "條目":
      case "条目":
      case "重定向":
        ysarchives_page.load(Twinkle.stub.callbacks.main);
        return;
      case "文件":
      case "檔案":
        ysarchives_page.load(Twinkle.stub.callbacks.file);
        break;
      default:
        mw.notify("Twinkle.stub:未知模式 ".concat(Twinkle.stub.mode), {
          type: "warn",
          tag: "twinklestub"
        });
        break;
    }
  };
  Twinkle.addInitCallback(Twinkle.stub, "stub");
})(jQuery);
//! src/Twinkle/modules/twinklediff.js
/*! Twinkle.js - twinklediff.js */
(function twinklediff($) {
  Twinkle.diff = () => {
    if (mw.config.get("wgNamespaceNumber") < 0 || !mw.config.get("wgArticleId")) {
      return;
    }
    Twinkle.addPortletLink(mw.util.getUrl(mw.config.get("wgPageName"), {
      diff: "cur",
      oldid: "prev"
    }), window.wgULS("最后", "最後"), "tw-lastdiff", window.wgULS("显示最后修改", "顯示最後修改"));
    if (mw.config.get("wgDiffNewId")) {
      Twinkle.addPortletLink(() => {
        Twinkle.diff.evaluate(false);
      }, "自上", "tw-since", window.wgULS("显示与上一修订版本间的差异", "顯示與上一修訂版本間的差異"));
      Twinkle.addPortletLink(() => {
        Twinkle.diff.evaluate(true);
      }, "自我", "tw-sincemine", window.wgULS("显示与我做出的修订版本的差异", "顯示與我做出的修訂版本的差異"));
      Twinkle.addPortletLink(mw.util.getUrl(mw.config.get("wgPageName"), {
        diff: "cur",
        oldid: mw.config.get("wgDiffNewId")
      }), window.wgULS("当前", "目前"), "tw-curdiff", window.wgULS("显示与当前版本间的差异", "顯示與目前版本間的差異"));
    }
  };
  Twinkle.diff.evaluate = (me) => {
    let user;
    if (me) {
      user = mw.config.get("wgUserName");
    } else {
      const node = document.querySelector("#mw-diff-ntitle2");
      if (!node) {
        return;
      }
      user = $(node).find("a").first().text();
    }
    const query = {
      prop: "revisions",
      action: "query",
      titles: mw.config.get("wgPageName"),
      rvlimit: 1,
      rvprop: ["ids", "user"],
      rvstartid: mw.config.get("wgCurRevisionId") - 1,
      rvuser: user
    };
    Morebits.status.init(document.querySelector("#mw-content-text"));
    const ysarchives_api = new Morebits.wiki.api(window.wgULS("抓取最初贡献者信息", "抓取最初貢獻者資訊"), query, Twinkle.diff.callbacks.main);
    ysarchives_api.params = {
      user
    };
    ysarchives_api.post();
  };
  Twinkle.diff.callbacks = {
    main: (self2) => {
      const xmlDoc = self2.responseXML;
      const revid = $(xmlDoc).find("rev").attr("revid");
      if (!revid) {
        self2.statelem.error(window.wgULS("未找到合适的早期版本,或 ", "未找到合適的早期版本,或 ") + self2.params.user + window.wgULS(" 是唯一贡献者。取消。", " 是唯一貢獻者。取消。"));
        return;
      }
      location = mw.util.getUrl(mw.config.get("wgPageName"), {
        diff: mw.config.get("wgCurRevisionId"),
        oldid: revid
      });
    }
  };
  Twinkle.addInitCallback(Twinkle.diff, "diff");
})(jQuery);
//! src/Twinkle/modules/twinkleunlink.js
/*! Twinkle.js - twinkleunlink.js */
(function twinkleunlink($) {
  Twinkle.unlink = () => {
    if (mw.config.get("wgNamespaceNumber") < 0 || mw.config.get("wgPageName") === Twinkle.getPref("sandboxPage") || !Morebits.userIsSysop) {
      return;
    }
    Twinkle.addPortletLink(Twinkle.unlink.callback, window.wgULS("消链", "消連"), "tw-unlink", window.wgULS("取消到本页的链接", "取消到本頁的連結"));
  };
  Twinkle.unlink.callback = (presetReason) => {
    const fileSpace = mw.config.get("wgNamespaceNumber") === 6;
    const Window = new Morebits.simpleWindow(600, 440);
    Window.setTitle(window.wgULS("取消链入", "取消連入") + (fileSpace ? window.wgULS("和模板、文件使用", "和模板、檔案使用") : ""));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("链入设置", "連入設定"), "H:TW/PREF#unlink");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#unlink");
    const form = new Morebits.quickForm(Twinkle.unlink.callback.evaluate);
    const linkTextBefore = Morebits.htmlNode("code", "[[".concat(fileSpace ? ":" : "").concat(Morebits.pageNameNorm).concat(window.wgULS("|链接文字]]", "|連結文字]]")));
    const linkTextAfter = Morebits.htmlNode("code", window.wgULS("链接文字", "連結文字"));
    const linkPlainBefore = Morebits.htmlNode("code", "[[".concat(Morebits.pageNameNorm, "]]"));
    const linkTemplateBefore = Morebits.htmlNode("code", "{{".concat(mw.config.get("wgTitle"), "}}"));
    let linkPlainAfter;
    if (fileSpace) {
      linkPlainAfter = Morebits.htmlNode("code", "<!-- [[".concat(Morebits.pageNameNorm, "]] -->"));
    } else {
      linkPlainAfter = Morebits.htmlNode("code", Morebits.pageNameNorm);
    }
    for (var _i15 = 0, _arr2 = [linkTextBefore, linkTextAfter, linkPlainBefore, linkPlainAfter, linkTemplateBefore]; _i15 < _arr2.length; _i15++) {
      const node = _arr2[_i15];
      node.style.fontFamily = "monospace";
      node.style.fontStyle = "normal";
    }
    form.append({
      type: "div",
      style: "margin-bottom: 0.5em; font-style: normal",
      label: ["".concat(window.wgULS("这个工具可以取消所有指向该页的链接(“链入”)", "這個工具可以取消所有指向該頁的連結(「連入」)") + (fileSpace ? window.wgULS(",或通过加入<!-- -->注释标记隐藏所有对此文件的使用", ",或透過加入<!-- -->注釋標記隱藏所有對此檔案的使用") : ""), "。例如:"), linkTextBefore, window.wgULS("将会变成", "將會變成"), linkTextAfter, ",", linkPlainBefore, window.wgULS("将会变成", "將會變成"), linkPlainAfter, ",", linkTemplateBefore, window.wgULS("将会被移除", "將會被移除"), window.wgULS("。请小心使用。", "。請小心使用。")]
    });
    form.append({
      type: "input",
      name: "reason",
      label: "理由:",
      value: presetReason || "",
      size: 60
    });
    const query = {
      action: "query",
      list: "backlinks",
      bltitle: mw.config.get("wgPageName"),
      bllimit: "max",
      // 500 is max for normal users, 5000 for bots and sysops
      blnamespace: Twinkle.getPref("unlinkNamespaces"),
      rawcontinue: true,
      format: "json"
    };
    if (fileSpace) {
      query.list += "|imageusage";
      query.iutitle = query.bltitle;
      query.iulimit = query.bllimit;
      query.iunamespace = query.blnamespace;
    } else {
      query.blfilterredir = "nonredirects";
    }
    const ysarchives_api = new Morebits.wiki.api(window.wgULS("抓取链入", "抓取連入"), query, Twinkle.unlink.callbacks.display.backlinks);
    ysarchives_api.params = {
      form,
      Window,
      image: fileSpace
    };
    ysarchives_api.post();
    const root = document.createElement("div");
    root.style.padding = "15px";
    Morebits.status.init(root);
    ysarchives_api.statelem.status(window.wgULS("加载中……", "載入中……"));
    Window.setContent(root);
    Window.display();
  };
  Twinkle.unlink.callback.evaluate = (event) => {
    const form = event.target;
    const input = Morebits.quickForm.getInputData(form);
    if (!input.reason) {
      mw.notify(window.wgULS("您必须指定取消链入的理由。", "您必須指定取消連入的理由。"), {
        type: "warn",
        tag: "twinkleunlink"
      });
      return;
    }
    input.backlinks || (input.backlinks = []);
    input.imageusage || (input.imageusage = []);
    const pages = Morebits.array.uniq([...input.backlinks, ...input.imageusage]);
    if (!pages.length) {
      mw.notify(window.wgULS("您必须至少选择一个要取消链入的页面。", "您必須至少選擇一個要取消連入的頁面。"), {
        type: "warn",
        tag: "twinkleunlink"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    const unlinker = new Morebits.batchOperation("取消".concat(input.backlinks.length ? window.wgULS("链入", "連入") + (input.imageusage.length ? window.wgULS("与文件使用", "與檔案使用") : "") : window.wgULS("文件使用", "檔案使用")));
    unlinker.setOption("preserveIndividualStatusLines", true);
    unlinker.setPageList(pages);
    const params = {
      reason: input.reason,
      unlinker
    };
    unlinker.run((pageName) => {
      const ysarchives_page = new Morebits.wiki.page(pageName, window.wgULS("在页面“", "在頁面「") + pageName + window.wgULS("”中取消链入", "」中取消連入"));
      ysarchives_page.setBotEdit(true);
      ysarchives_page.setCallbackParameters({
        doBacklinks: input.backlinks.includes(pageName),
        doImageusage: input.imageusage.includes(pageName),
        ...params
      });
      ysarchives_page.load(Twinkle.unlink.callbacks.unlinkBacklinks);
    });
  };
  Twinkle.unlink.callbacks = {
    display: {
      backlinks: (apiobj) => {
        const response = apiobj.getResponse();
        let havecontent = false;
        let list;
        let namespaces;
        let i;
        if (apiobj.params.image) {
          const imageusage = response.query.imageusage.sort(Twinkle.sortByNamespace);
          list = [];
          for (i = 0; i < imageusage.length; ++i) {
            list.push({
              label: "",
              value: imageusage[i].title,
              checked: true
            });
          }
          if (list.length) {
            apiobj.params.form.append({
              type: "header",
              label: window.wgULS("文件使用", "檔案使用")
            });
            namespaces = [];
            var _iterator48 = _createForOfIteratorHelper(Twinkle.getPref("unlinkNamespaces")), _step48;
            try {
              for (_iterator48.s(); !(_step48 = _iterator48.n()).done; ) {
                const v = _step48.value;
                namespaces.push(v === "0" ? window.wgULS("(条目)", "(條目)") : mw.config.get("wgFormattedNamespaces")[v]);
              }
            } catch (err) {
              _iterator48.e(err);
            } finally {
              _iterator48.f();
            }
            apiobj.params.form.append({
              type: "div",
              label: window.wgULS("已选择的命名空间:", "已選擇的命名空間:") + namespaces.join("、"),
              tooltip: window.wgULS("您可在Twinkle参数设置中更改相关选项,请参见[[H:TW/PREF]]", "您可在Twinkle偏好設定中更改相關選項,請參見[[H:TW/PREF]]")
            });
            if (response["query-continue"] && response["query-continue"].imageusage) {
              apiobj.params.form.append({
                type: "div",
                label: window.wgULS("显示前", "顯示前") + mw.language.convertNumber(list.length) + window.wgULS("个文件使用。", "個檔案使用。")
              });
            }
            apiobj.params.form.append({
              type: "button",
              label: window.wgULS("全选", "全選"),
              event: (e) => {
                $(Morebits.quickForm.getElements(e.target.form, "imageusage")).prop("checked", true);
              }
            });
            apiobj.params.form.append({
              type: "button",
              label: window.wgULS("全不选", "全不選"),
              event: (e) => {
                $(Morebits.quickForm.getElements(e.target.form, "imageusage")).prop("checked", false);
              }
            });
            apiobj.params.form.append({
              type: "checkbox",
              name: "imageusage",
              shiftClickSupport: true,
              list
            });
            havecontent = true;
          } else {
            apiobj.params.form.append({
              type: "div",
              label: window.wgULS("未找到文件使用。", "未找到檔案使用。")
            });
          }
        }
        const backlinks = response.query.backlinks.sort(Twinkle.sortByNamespace);
        if (backlinks.length > 0) {
          list = [];
          for (i = 0; i < backlinks.length; ++i) {
            list.push({
              label: "",
              value: backlinks[i].title,
              checked: true
            });
          }
          apiobj.params.form.append({
            type: "header",
            label: window.wgULS("链入", "連入")
          });
          namespaces = [];
          var _iterator49 = _createForOfIteratorHelper(Twinkle.getPref("unlinkNamespaces")), _step49;
          try {
            for (_iterator49.s(); !(_step49 = _iterator49.n()).done; ) {
              const v = _step49.value;
              namespaces.push(v === "0" ? window.wgULS("(条目)", "(條目)") : mw.config.get("wgFormattedNamespaces")[v]);
            }
          } catch (err) {
            _iterator49.e(err);
          } finally {
            _iterator49.f();
          }
          apiobj.params.form.append({
            type: "div",
            label: window.wgULS("已选择的命名空间:", "已選擇的命名空間:") + namespaces.join("、"),
            tooltip: window.wgULS("您可在Twinkle参数设置中更改相关选项,请参见[[H:TW/PREF]]", "您可在Twinkle偏好設定中更改相關選項,請參見[[H:TW/PREF]]")
          });
          if (response["query-continue"] && response["query-continue"].backlinks) {
            apiobj.params.form.append({
              type: "div",
              label: window.wgULS("显示前", "顯示前") + mw.language.convertNumber(list.length) + window.wgULS("个链入。", "個連入。")
            });
          }
          apiobj.params.form.append({
            type: "button",
            label: window.wgULS("全选", "全選"),
            event: (e) => {
              $(Morebits.quickForm.getElements(e.target.form, "backlinks")).prop("checked", true);
            }
          });
          apiobj.params.form.append({
            type: "button",
            label: window.wgULS("全不选", "全不選"),
            event: (e) => {
              $(Morebits.quickForm.getElements(e.target.form, "backlinks")).prop("checked", false);
            }
          });
          apiobj.params.form.append({
            type: "checkbox",
            name: "backlinks",
            shiftClickSupport: true,
            list
          });
          havecontent = true;
        } else {
          apiobj.params.form.append({
            type: "div",
            label: window.wgULS("未找到链入。", "未找到連入。")
          });
        }
        if (havecontent) {
          apiobj.params.form.append({
            type: "submit"
          });
        }
        const result = apiobj.params.form.render();
        apiobj.params.Window.setContent(result);
        var _iterator50 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "backlinks")), _step50;
        try {
          for (_iterator50.s(); !(_step50 = _iterator50.n()).done; ) {
            const link = _step50.value;
            Twinkle.generateBatchPageLinks(link);
          }
        } catch (err) {
          _iterator50.e(err);
        } finally {
          _iterator50.f();
        }
        var _iterator51 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "imageusage")), _step51;
        try {
          for (_iterator51.s(); !(_step51 = _iterator51.n()).done; ) {
            const link = _step51.value;
            Twinkle.generateBatchPageLinks(link);
          }
        } catch (err) {
          _iterator51.e(err);
        } finally {
          _iterator51.f();
        }
      }
    },
    unlinkBacklinks: (pageobj) => {
      let oldtext = pageobj.getPageText();
      const params = pageobj.getCallbackParameters();
      const ysarchives_page = new Morebits.wikitext.page(oldtext);
      let summaryText = "";
      let warningString = false;
      let text;
      if (params.doImageusage) {
        text = ysarchives_page.commentOutImage(mw.config.get("wgTitle"), window.wgULS("注释", "注釋")).getText();
        if (text === oldtext) {
          warningString = window.wgULS("文件使用", "檔案使用");
        } else {
          summaryText = window.wgULS("注释文件使用", "注釋檔案使用");
          oldtext = text;
        }
      }
      if (params.doBacklinks) {
        text = ysarchives_page.removeLink(Morebits.pageNameNorm).getText();
        text = ysarchives_page.removeTemplate(mw.config.get("wgTitle")).getText();
        if (text === oldtext) {
          warningString = warningString ? window.wgULS("取消链入或文件使用", "取消連入或檔案使用") : window.wgULS("取消链入", "取消連入");
        } else {
          summaryText = (summaryText ? "".concat(summaryText, " / ") : "") + window.wgULS("取消链结到", "取消連結到");
          oldtext = text;
        }
      }
      if (warningString) {
        pageobj.getStatusElement().error("".concat(window.wgULS("未能在页面上找到", "未能在頁面上找到") + warningString, "。"));
        params.unlinker.workerFailure(pageobj);
        return;
      }
      pageobj.setPageText(text);
      pageobj.setEditSummary(summaryText + window.wgULS("“", "「") + Morebits.pageNameNorm + window.wgULS("”:", "」:") + params.reason);
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setCreateOption("nocreate");
      pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
    }
  };
  Twinkle.addInitCallback(Twinkle.unlink, "unlink");
})(jQuery);
//! src/Twinkle/modules/twinklefluff.js
/*! Twinkle.js - twinklefluff.js */
(function twinklefluff($) {
  const $body = $("body");
  Twinkle.fluff = () => {
    if (mw.config.get("wgIsProbablyEditable")) {
      if (mw.config.get("wgDiffNewId") || mw.config.get("wgDiffOldId")) {
        mw.hook("wikipage.diff").add(() => {
          Twinkle.fluff.addLinks.diff();
        });
      } else if (mw.config.get("wgAction") === "view" && mw.config.get("wgRevisionId") && mw.config.get("wgCurRevisionId") !== mw.config.get("wgRevisionId")) {
        Twinkle.fluff.addLinks.oldid();
      } else if (mw.config.get("wgAction") === "history") {
        Twinkle.fluff.addLinks.history();
      }
    } else if (mw.config.get("wgNamespaceNumber") === -1) {
      Twinkle.fluff.skipTalk = !Twinkle.getPref("openTalkPageOnAutoRevert");
      Twinkle.fluff.rollbackInPlace = Twinkle.getPref("rollbackInPlace");
      if (mw.config.get("wgCanonicalSpecialPageName") === "Contributions") {
        Twinkle.fluff.addLinks.contributions();
      } else if (mw.config.get("wgCanonicalSpecialPageName") === "Recentchanges" || mw.config.get("wgCanonicalSpecialPageName") === "Recentchangeslinked") {
        mw.hook("wikipage.content").add((item) => {
          if (item.is("div")) {
            Twinkle.fluff.addLinks.recentchanges();
          }
        });
      }
    }
  };
  Twinkle.fluff.trustedBots = [];
  Twinkle.fluff.skipTalk = null;
  Twinkle.fluff.rollbackInPlace = null;
  Twinkle.fluff.hiddenName = window.wgULS("已隐藏的用户", "已隱藏的使用者");
  Twinkle.fluff.linkBuilder = {
    spanTag: (color, content) => {
      const span = document.createElement("span");
      span.style.color = color;
      span.appendChild(document.createTextNode(content));
      return span;
    },
    buildLink: (color, text) => {
      const link = document.createElement("a");
      link.appendChild(Twinkle.fluff.linkBuilder.spanTag("Black", "["));
      link.appendChild(Twinkle.fluff.linkBuilder.spanTag(color, text));
      link.appendChild(Twinkle.fluff.linkBuilder.spanTag("Black", "]"));
      link.href = "#";
      return link;
    },
    /**
     * @param {string} [vandal=null] - Username of the editor being reverted
     * Provide a falsey value if the username is hidden, defaults to null
     * @param {boolean} inline - True to create two links in a span, false
     * to create three links in a div (optional)
     * @param {number|string} [rev=wgCurRevisionId] - Revision ID being reverted (optional)
     * @param {string} [page=wgPageName] - Page being reverted (optional)
     * @return {HTMLElement} revNode
     */
    rollbackLinks: (vandal, inline, rev, page) => {
      vandal || (vandal = null);
      const elem = inline ? "span" : "div";
      const revNode = document.createElement(elem);
      rev = Number.parseInt(rev, 10);
      if (rev) {
        revNode.setAttribute("id", "tw-revert".concat(rev));
      } else {
        revNode.setAttribute("id", "tw-revert");
      }
      const normNode = document.createElement("strong");
      const vandNode = document.createElement("strong");
      const normLink = Twinkle.fluff.linkBuilder.buildLink("SteelBlue", "回退");
      const vandLink = Twinkle.fluff.linkBuilder.buildLink("Red", window.wgULS("破坏", "破壞"));
      $(normLink).on("click", (e) => {
        e.preventDefault();
        Twinkle.fluff.revert("norm", vandal, rev, page);
        Twinkle.fluff.disableLinks(revNode);
      });
      $(vandLink).on("click", (e) => {
        e.preventDefault();
        Twinkle.fluff.revert("vand", vandal, rev, page);
        Twinkle.fluff.disableLinks(revNode);
      });
      vandNode.appendChild(vandLink);
      normNode.appendChild(normLink);
      const separator = inline ? " " : " || ";
      revNode.appendChild(normNode);
      revNode.appendChild(document.createTextNode(separator));
      revNode.appendChild(vandNode);
      return revNode;
    },
    // Build [restore this revision] links
    restoreThisRevisionLink: (revisionRef, inline) => {
      revisionRef = typeof revisionRef === "number" ? revisionRef : mw.config.get(revisionRef);
      const elem = inline ? "span" : "div";
      const revertToRevisionNode = document.createElement(elem);
      revertToRevisionNode.setAttribute("id", "tw-revert-to-".concat(revisionRef));
      revertToRevisionNode.style.fontWeight = "bold";
      const revertToRevisionLink = Twinkle.fluff.linkBuilder.buildLink("SaddleBrown", window.wgULS("恢复此版本", "恢復此版本"));
      $(revertToRevisionLink).on("click", (e) => {
        e.preventDefault();
        Twinkle.fluff.revertToRevision(revisionRef);
      });
      if (inline) {
        revertToRevisionNode.appendChild(document.createTextNode(" "));
      }
      revertToRevisionNode.appendChild(revertToRevisionLink);
      return revertToRevisionNode;
    }
  };
  Twinkle.fluff.addLinks = {
    contributions: () => {
      const isRange = !!$body.find("#sp-contributions-footer-anon-range")[0];
      if (mw.config.exists("wgRelevantUserName") || isRange) {
        let username = mw.config.get("wgRelevantUserName");
        if (Twinkle.getPref("showRollbackLinks").includes("contribs") || mw.config.get("wgUserName") !== username && Twinkle.getPref("showRollbackLinks").includes("others") || mw.config.get("wgUserName") === username && Twinkle.getPref("showRollbackLinks").includes("mine")) {
          const $list = $body.find("#mw-content-text").find("ul li:has(span.mw-uctop):has(.mw-changeslist-diff)");
          $list.each((_key, current) => {
            const page = $(current).find(".mw-contributions-title").text();
            if (isRange) {
              username = $(current).find(".mw-userlink:not(.history-deleted)").text();
            }
            current.appendChild(Twinkle.fluff.linkBuilder.rollbackLinks(username, true, current.dataset.mwRevid, page));
          });
        }
      }
    },
    recentchanges: () => {
      if (mw.config.get("wgCanonicalSpecialPageName") === "Recentchanges" && Twinkle.getPref("showRollbackLinks").includes("recentchanges") || mw.config.get("wgCanonicalSpecialPageName") === "Recentchangeslinked" && Twinkle.getPref("showRollbackLinks").includes("recentchangeslinked")) {
        let $list = $body.find(".mw-changeslist .mw-changeslist-last.mw-changeslist-src-mw-edit");
        $list = $list.not(".mw-rcfilters-ui-highlights-enhanced-toplevel").find(".mw-changeslist-line-inner, td.mw-enhanced-rc-nested");
        $list.each((_key, current) => {
          const vandal = $(current).find(".mw-userlink:not(.history-deleted)").text();
          const href = $(current).find(".mw-changeslist-diff").attr("href");
          const rev = mw.util.getParamValue("diff", href);
          const page = current.dataset.targetPage;
          current.appendChild(Twinkle.fluff.linkBuilder.rollbackLinks(vandal, true, rev, page));
        });
      }
    },
    history: () => {
      if (Twinkle.getPref("showRollbackLinks").includes("history")) {
        const histList = $body.find("#pagehistory li").toArray();
        if (!$body.find("a.mw-firstlink").length) {
          const first = histList.shift();
          const vandal = $(first).find(".mw-userlink:not(.history-deleted)").text();
          var _iterator52 = _createForOfIteratorHelper(histList), _step52;
          try {
            for (_iterator52.s(); !(_step52 = _iterator52.n()).done; ) {
              const item = _step52.value;
              if ($(item).find(".mw-userlink").text() !== vandal) {
                first.appendChild(Twinkle.fluff.linkBuilder.rollbackLinks(vandal, true));
                break;
              }
            }
          } catch (err) {
            _iterator52.e(err);
          } finally {
            _iterator52.f();
          }
        }
        var _iterator53 = _createForOfIteratorHelper(histList), _step53;
        try {
          for (_iterator53.s(); !(_step53 = _iterator53.n()).done; ) {
            const rev = _step53.value;
            const {
              href
            } = rev.querySelector(".mw-changeslist-date");
            const oldid = Number.parseInt(mw.util.getParamValue("oldid", href), 10);
            if (!Number.isNaN(oldid)) {
              rev.appendChild(Twinkle.fluff.linkBuilder.restoreThisRevisionLink(oldid, true));
            }
          }
        } catch (err) {
          _iterator53.e(err);
        } finally {
          _iterator53.f();
        }
      }
    },
    diff: () => {
      const warnFromTalk = (xtitle) => {
        const talkLink = $("#mw-diff-".concat(xtitle, "2 .mw-usertoollinks a")).first();
        if (talkLink.length) {
          let extraParams = "vanarticle=".concat(mw.util.rawurlencode(Morebits.pageNameNorm), "&noautowarn=true");
          extraParams += "&vanarticlerevid=";
          extraParams += xtitle === "otitle" ? mw.config.get("wgDiffOldId") : mw.config.get("wgDiffNewId");
          const href = talkLink.attr("href");
          if (href.includes("?")) {
            talkLink.attr("href", "".concat(href, "&").concat(extraParams));
          } else {
            talkLink.attr("href", "".concat(href, "?").concat(extraParams));
          }
        }
      };
      warnFromTalk("otitle");
      if (mw.config.get("wgDiffOldId") && mw.config.get("wgDiffOldId") !== mw.config.get("wgDiffNewId")) {
        const oldTitle = document.querySelector("#mw-diff-otitle1").parentNode;
        const revertToRevision = Twinkle.fluff.linkBuilder.restoreThisRevisionLink("wgDiffOldId");
        oldTitle.insertBefore(revertToRevision, oldTitle.firstChild);
        if (Twinkle.getPref("customRevertSummary").length > 0) {
          revertToRevision.appendChild(document.createTextNode(" || "));
          const revertsummary = new Morebits.quickForm.element({
            type: "select",
            name: "revertsummary"
          });
          revertsummary.append({
            type: "option",
            label: window.wgULS("选择回退理由", "選擇回退理由"),
            value: ""
          });
          $(Twinkle.getPref("customRevertSummary")).each((_, e) => {
            revertsummary.append({
              type: "option",
              label: e.label,
              value: e.value
            });
          });
          revertToRevision.appendChild(revertsummary.render().childNodes[0]);
        }
      }
      warnFromTalk("ntitle");
      if (document.querySelector("#differences-nextlink")) {
        const newTitle = document.querySelector("#mw-diff-ntitle1").parentNode;
        newTitle.insertBefore(Twinkle.fluff.linkBuilder.restoreThisRevisionLink("wgDiffNewId"), newTitle.firstChild);
      } else if (Twinkle.getPref("showRollbackLinks").includes("diff") && mw.config.get("wgDiffOldId") && (mw.config.get("wgDiffOldId") !== mw.config.get("wgDiffNewId") || document.querySelector("#differences-prevlink"))) {
        const vandal = $body.find("#mw-diff-ntitle2").find(".mw-userlink")[0].text;
        const ntitle = document.querySelector("#mw-diff-ntitle1").parentNode;
        ntitle.insertBefore(Twinkle.fluff.linkBuilder.rollbackLinks(vandal), ntitle.firstChild);
      }
    },
    oldid: () => {
      const title = document.querySelector("#mw-revision-info").parentNode;
      title.insertBefore(Twinkle.fluff.linkBuilder.restoreThisRevisionLink("wgRevisionId"), title.firstChild);
    }
  };
  Twinkle.fluff.disableLinks = (parentNode) => {
    $(parentNode).children().each((_i, node) => {
      node.innerHTML = node.textContent;
      $(node).css("font-weight", "normal").css("color", "darkgray");
    });
  };
  Twinkle.fluff.revert = (type, vandal, rev, page) => {
    if (mw.util.isIPv6Address(vandal)) {
      vandal = Morebits.sanitizeIPv6(vandal);
    }
    const pagename = page || mw.config.get("wgPageName");
    const revid = rev || mw.config.get("wgCurRevisionId");
    let summary = "";
    if (document.getElementsByName("revertsummary")[0] !== void 0) {
      summary = document.getElementsByName("revertsummary")[0].value;
    }
    if (Twinkle.fluff.rollbackInPlace) {
      const notifyStatus = document.createElement("span");
      mw.notify(notifyStatus, {
        autoHide: false,
        title: "回退".concat(page),
        tag: "twinklefluff_".concat(rev)
        // Shouldn't be necessary given disableLink
      });
      Morebits.status.init(notifyStatus);
    } else {
      Morebits.status.init(document.querySelector("#mw-content-text"));
      $body.find("#catlinks").remove();
    }
    const params = {
      type,
      user: vandal,
      userHidden: !vandal,
      pagename,
      revid,
      summary
    };
    const query = {
      action: "query",
      prop: ["info", "revisions"],
      titles: pagename,
      intestactions: "edit",
      rvlimit: Twinkle.getPref("revertMaxRevisions"),
      rvprop: ["ids", "timestamp", "user"],
      curtimestamp: "",
      meta: "tokens",
      type: "csrf"
    };
    const ysarchives_api = new Morebits.wiki.api(window.wgULS("抓取较早修订版本信息", "抓取較早修訂版本資訊"), query, Twinkle.fluff.callbacks.main);
    ysarchives_api.params = params;
    ysarchives_api.post();
  };
  Twinkle.fluff.revertToRevision = (oldrev) => {
    let summary = "";
    if (document.getElementsByName("revertsummary")[0] !== void 0) {
      summary = document.getElementsByName("revertsummary")[0].value;
    }
    Morebits.status.init(document.querySelector("#mw-content-text"));
    const query = {
      action: "query",
      prop: ["info", "revisions"],
      titles: mw.config.get("wgPageName"),
      rvlimit: 1,
      rvstartid: oldrev,
      rvprop: ["ids", "user"],
      format: "xml",
      curtimestamp: "",
      meta: "tokens",
      type: "csrf"
    };
    const ysarchives_api = new Morebits.wiki.api(window.wgULS("抓取较早修订版本信息", "抓取較早修訂版本資訊"), query, Twinkle.fluff.callbacks.toRevision);
    ysarchives_api.params = {
      rev: oldrev,
      summary
    };
    ysarchives_api.post();
  };
  Twinkle.fluff.callbacks = {
    toRevision: (apiobj) => {
      const xmlDoc = apiobj.responseXML;
      const lastrevid = Number.parseInt($(xmlDoc).find("page").attr("lastrevid"), 10);
      const touched = $(xmlDoc).find("page").attr("touched");
      const loadtimestamp = $(xmlDoc).find("api").attr("curtimestamp");
      const csrftoken = $(xmlDoc).find("tokens").attr("csrftoken");
      const revertToRevID = Number.parseInt($(xmlDoc).find("rev").attr("revid"), 10);
      const revertToUser = $(xmlDoc).find("rev").attr("user");
      const revertToUserHidden = typeof $(xmlDoc).find("rev").attr("userhidden") === "string";
      if (revertToRevID !== apiobj.params.rev) {
        apiobj.statelem.error(window.wgULS("抓取到的修订版本与请求的修订版本不符,取消。", "抓取到的修訂版本與請求的修訂版本不符,取消。"));
        return;
      }
      const optional_summary = prompt("".concat(window.wgULS("请输入回退理由:", "請輸入回退理由:"), "                                "), apiobj.params.summary);
      if (optional_summary === null) {
        apiobj.statelem.error(window.wgULS("由用户取消。", "由使用者取消。"));
        return;
      }
      const summary = Twinkle.fluff.formatSummary(window.wgULS("回退到由$USER做出的修订版本", "回退到由$USER做出的修訂版本") + revertToRevID, revertToUserHidden ? null : revertToUser, optional_summary);
      const query = {
        action: "edit",
        title: mw.config.get("wgPageName"),
        summary,
        tags: Twinkle.changeTags,
        token: csrftoken,
        undo: lastrevid,
        undoafter: revertToRevID,
        basetimestamp: touched,
        starttimestamp: loadtimestamp,
        minor: Twinkle.getPref("markRevertedPagesAsMinor").includes("torev") ? true : void 0,
        bot: true
      };
      if (Twinkle.getPref("watchRevertedPages").includes("torev")) {
        const watchOrExpiry = Twinkle.getPref("watchRevertedExpiry");
        if (!watchOrExpiry || watchOrExpiry === "no") {
          query.watchlist = "nochange";
        } else if (watchOrExpiry === "default" || watchOrExpiry === "preferences") {
          query.watchlist = "preferences";
        } else {
          query.watchlist = "watch";
          if (typeof watchOrExpiry === "string" && watchOrExpiry !== "yes") {
            query.watchlistexpiry = watchOrExpiry;
          }
        }
      }
      Morebits.wiki.actionCompleted.redirect = mw.config.get("wgPageName");
      Morebits.wiki.actionCompleted.notice = "回退完成";
      const ysarchives_api = new Morebits.wiki.api(window.wgULS("保存回退内容", "儲存回退內容"), query, Twinkle.fluff.callbacks.complete, apiobj.statelem);
      ysarchives_api.params = apiobj.params;
      ysarchives_api.post();
    },
    main: (apiobj) => {
      const xmlDoc = apiobj.responseXML;
      if ($(xmlDoc).find("actions").attr("edit") === void 0) {
        apiobj.statelem.error("Unable to edit the page, it's probably protected.");
        return;
      }
      const lastrevid = Number.parseInt($(xmlDoc).find("page").attr("lastrevid"), 10);
      const touched = $(xmlDoc).find("page").attr("touched");
      const loadtimestamp = $(xmlDoc).find("api").attr("curtimestamp");
      const csrftoken = $(xmlDoc).find("tokens").attr("csrftoken");
      const revs = $(xmlDoc).find("rev");
      const {
        statelem
      } = apiobj;
      const {
        params
      } = apiobj;
      if (revs.length < 1) {
        statelem.error(window.wgULS("没有其它修订版本,无法回退", "沒有其它修訂版本,無法回退"));
        return;
      }
      const [top] = revs;
      const lastuser = top.getAttribute("user");
      if (lastrevid < params.revid) {
        Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS(["从服务器获取的最新修订版本ID ", Morebits.htmlNode("strong", lastrevid), " 小于目前所显示的修订版本ID。这可能意味着当前修订版本已被删除、服务器延迟、或抓取到了坏掉的信息。取消。"], ["從伺服器取得的最新修訂版本ID ", Morebits.htmlNode("strong", lastrevid), " 小於目前所顯示的修訂版本ID。這可能意味著當前修訂版本已被刪除、伺服器延遲、或擷取到了壞掉的資訊。取消。"]));
        return;
      }
      let userNorm = params.user || Twinkle.fluff.hiddenName;
      let index = 1;
      if (params.revid === lastrevid) {
        params.user = lastuser;
        userNorm = params.user || Twinkle.fluff.hiddenName;
      } else {
        Morebits.status.warn("警告", window.wgULS(["最新修订版本 ", Morebits.htmlNode("strong", lastrevid), " 与我们的修订版本 ", Morebits.htmlNode("strong", params.revid), "不同"], ["最新修訂版本 ", Morebits.htmlNode("strong", lastrevid), " 與我們的修訂版本 ", Morebits.htmlNode("strong", params.revid), " 不同"]));
        if (lastuser === params.user) {
          switch (params.type) {
            case "vand":
              Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("最新修订版本由 ", "最新修訂版本由 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 做出,因我们假定破坏,继续回退操作。", " 做出,因我們假定破壞,繼續回退操作。")]);
              break;
            default:
              Morebits.status.warn("提示", [window.wgULS("最新修订版本由 ", "最新修訂版本由 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 做出,但我们还是不回退了。", " 做出,但我們還是不回退了。")]);
              return;
          }
        } else if (params.type === "vand" && // Okay to test on user since it will either fail or sysop will correctly access it
        // Besides, none of the trusted bots are going to be revdel'd
        Twinkle.fluff.trustedBots.includes(top.getAttribute("user")) && revs.length > 1 && revs[1].getAttribute("revid") === params.revid) {
          Morebits.status.info(window.wgULS("信息", "資訊"), window.wgULS(["最新修订版本由 ", Morebits.htmlNode("strong", lastuser), ",一个可信的机器人做出,但之前的版本被认为是破坏,继续回退操作。"], ["最新修訂版本由 ", Morebits.htmlNode("strong", lastuser), ",一個可信的機器人做出,但之前的版本被認為是破壞,繼續回退操作。"]));
          index = 2;
        } else {
          Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS(["最新修订版本由 ", Morebits.htmlNode("strong", lastuser), " 做出,所以这个修订版本可能已经被回退了,取消回退操作。"], ["最新修訂版本由 ", Morebits.htmlNode("strong", lastuser), " 做出,所以這個修訂版本可能已經被回退了,取消回退操作。"]));
          return;
        }
      }
      if (Twinkle.fluff.trustedBots.includes(params.user)) {
        switch (params.type) {
          case "vand":
            Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("将对 ", "將對 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 执行破坏回退,这是一个可信的机器人,我们假定您要回退前一个修订版本。", " 執行破壞回退,這是一個可信的機器人,我們假定您要回退前一個修訂版本。")]);
            index = 2;
            params.user = revs[1].getAttribute("user");
            params.userHidden = revs[1].getAttribute("userhidden") === "";
            break;
          default: {
            const cont = confirm(window.wgULS("选择了常规回退,但最新修改是由一个可信的机器人(", "選擇了常規回退,但最新修改是由一個可信的機器人(") + userNorm + window.wgULS(")做出的。确定以回退前一个修订版本,取消以回退机器人的修改", ")做出的。確定以回退前一個修訂版本,取消以回退機器人的修改"));
            if (cont) {
              Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("将对 ", "將對 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 执行常规回退,这是一个可信的机器人,基于确认,我们将回退前一个修订版本。", " 執行常規回退,這是一個可信的機器人,基於確認,我們將回退前一個修訂版本。")]);
              index = 2;
              params.user = revs[1].getAttribute("user");
              params.userHidden = revs[1].getAttribute("userhidden") === "";
              userNorm = params.user || Twinkle.fluff.hiddenName;
            } else {
              Morebits.status.warn("提示", [window.wgULS("将对 ", "將對 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 执行常规回退,这是一个可信的机器人,基于确认,我们仍将回退这个修订版本。", " 執行常規回退,這是一個可信的機器人,基於確認,我們仍將回退這個修訂版本。")]);
            }
            break;
          }
        }
      }
      let found = false;
      let count = 0;
      for (let i = index; i < revs.length; ++i) {
        ++count;
        if (revs[i].getAttribute("user") !== params.user) {
          found = i;
          break;
        }
      }
      if (!found) {
        statelem.error([window.wgULS("未找到之前的修订版本,可能 ", "未找到之前的修訂版本,可能 "), Morebits.htmlNode("strong", userNorm), window.wgULS(" 是唯一贡献者,或这个用户连续做出了超过 ", " 是唯一貢獻者,或這個用戶連續做出了超過 ") + mw.language.convertNumber(Twinkle.getPref("revertMaxRevisions")) + window.wgULS(" 次编辑。", " 次編輯。")]);
        return;
      }
      if (!count) {
        Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("我们将要回退0个修订版本,这没有意义,所以取消回退操作。可能是因为这个修订版本已经被回退,但修订版本ID仍是一样的。", "我們將要回退0個修訂版本,這沒有意義,所以取消回退操作。可能是因為這個修訂版本已經被回退,但修訂版本ID仍是一樣的。"));
        return;
      }
      const good_revision = revs[found];
      let userHasAlreadyConfirmedAction = false;
      if (params.type !== "vand" && count > 1) {
        if (!confirm(userNorm + window.wgULS(" 连续做出了 ", " 連續做出了 ") + mw.language.convertNumber(count) + window.wgULS(" 次编辑,是否要全部回退?", " 次編輯,是否要全部回退?"))) {
          Morebits.status.info("提示", window.wgULS("用户取消操作", "使用者取消操作"));
          return;
        }
        userHasAlreadyConfirmedAction = true;
      }
      params.count = count;
      params.goodid = good_revision.getAttribute("revid");
      params.gooduser = good_revision.getAttribute("user");
      params.gooduserHidden = good_revision.getAttribute("userhidden") === "";
      statelem.status([Morebits.htmlNode("strong", mw.language.convertNumber(count)), window.wgULS(" 个修订版本之前由 ", " 個修訂版本之前由 "), Morebits.htmlNode("strong", params.gooduserHidden ? Twinkle.fluff.hiddenName : params.gooduser), window.wgULS(" 做出的修订版本 ", " 做出的修訂版本 "), Morebits.htmlNode("strong", params.goodid)]);
      let summary;
      let extra_summary;
      switch (params.type) {
        case "vand":
          summary = Twinkle.fluff.formatSummary("回退$USER做出的".concat(params.count).concat(window.wgULS("次编辑,到由", "次編輯,到由")).concat(params.gooduserHidden ? Twinkle.fluff.hiddenName : params.gooduser).concat(window.wgULS("做出的最后修订版本 ", "做出的最後修訂版本 ")), params.userHidden ? null : params.user);
          break;
        default:
          if (Twinkle.getPref("offerReasonOnNormalRevert")) {
            extra_summary = prompt("".concat(window.wgULS("可选的编辑摘要:", "可選的編輯摘要:"), "                              "), params.summary);
            if (extra_summary === null) {
              statelem.error(window.wgULS("用户取消操作。", "使用者取消操作。"));
              return;
            }
            userHasAlreadyConfirmedAction = true;
          }
          summary = Twinkle.fluff.formatSummary("回退$USER做出的".concat(params.count).concat(window.wgULS("次编辑", "次編輯")), params.userHidden ? null : params.user, extra_summary);
          break;
      }
      if (Twinkle.getPref("confirmOnFluff") && !userHasAlreadyConfirmedAction && !confirm(window.wgULS("回退页面:您确定吗?", "回退頁面:您確定嗎?"))) {
        statelem.error(window.wgULS("用户取消操作。", "使用者取消操作。"));
        return;
      }
      if (!Twinkle.fluff.skipTalk && Twinkle.getPref("openTalkPage").includes(params.type) && !params.userHidden && mw.config.get("wgUserName") !== params.user) {
        params.notifyUser = true;
        params.vantimestamp = top.getAttribute("timestamp");
      }
      const query = {
        action: "edit",
        title: params.pagename,
        summary,
        tags: Twinkle.changeTags,
        token: csrftoken,
        undo: lastrevid,
        undoafter: params.goodid,
        basetimestamp: touched,
        starttimestamp: loadtimestamp,
        minor: Twinkle.getPref("markRevertedPagesAsMinor").includes(params.type) ? true : void 0,
        bot: true
      };
      if (Twinkle.getPref("watchRevertedPages").includes(params.type)) {
        const watchOrExpiry = Twinkle.getPref("watchRevertedExpiry");
        if (!watchOrExpiry || watchOrExpiry === "no") {
          query.watchlist = "nochange";
        } else if (watchOrExpiry === "default" || watchOrExpiry === "preferences") {
          query.watchlist = "preferences";
        } else {
          query.watchlist = "watch";
          if (typeof watchOrExpiry === "string" && watchOrExpiry !== "yes") {
            query.watchlistexpiry = watchOrExpiry;
          }
        }
      }
      if (!Twinkle.fluff.rollbackInPlace) {
        Morebits.wiki.actionCompleted.redirect = params.pagename;
      }
      Morebits.wiki.actionCompleted.notice = "回退完成";
      const ysarchives_api = new Morebits.wiki.api(window.wgULS("保存回退内容", "儲存回退內容"), query, Twinkle.fluff.callbacks.complete, statelem);
      ysarchives_api.params = params;
      ysarchives_api.post();
    },
    complete: (apiobj) => {
      const xml = apiobj.getXML();
      const $edit = $(xml).find("edit");
      if ($(xml).find("captcha").length > 0) {
        apiobj.statelem.error(window.wgULS("不能回退,因服务器要求您输入验证码。", "不能回退,因伺服器要求您輸入驗證碼。"));
      } else if ($edit.attr("nochange") === "") {
        apiobj.statelem.error(window.wgULS("要回退到的版本与当前版本相同,没什么要做的", "要回退到的版本與目前版本相同,沒什麼要做的"));
      } else {
        apiobj.statelem.info("完成");
        const {
          params
        } = apiobj;
        if (params.notifyUser && !params.userHidden) {
          Morebits.status.info(window.wgULS("信息", "資訊"), [window.wgULS("开启用户 ", "開啟使用者 "), Morebits.htmlNode("strong", params.user), window.wgULS(" 的讨论页", " 的討論頁")]);
          const windowQuery = {
            title: "User talk:".concat(params.user),
            action: "edit",
            preview: "yes",
            vanarticle: params.pagename.replace(/_/g, " "),
            vanarticlerevid: params.revid,
            vantimestamp: params.vantimestamp,
            vanarticlegoodrevid: params.goodid,
            type: params.type,
            count: params.count
          };
          switch (Twinkle.getPref("userTalkPageMode")) {
            case "tab":
              window.open(mw.util.getUrl("", windowQuery), "_blank", "noopener,noreferrer");
              break;
            case "blank":
              window.open(mw.util.getUrl("", windowQuery), "_blank", "noopener,noreferrer,location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
              break;
            default:
              window.open(mw.util.getUrl("", windowQuery), window.name === "twinklewarnwindow" ? "_blank" : "twinklewarnwindow", window.name === "twinklewarnwindow" ? "noopener,noreferrer," : "location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800");
              break;
          }
        }
      }
    }
  };
  Twinkle.fluff.formatSummary = (builtInString, userName, customString) => {
    let result = builtInString;
    if (customString) {
      result += ":".concat(Morebits.string.toUpperCaseFirstChar(customString));
    }
    if (/\$USER/.test(builtInString)) {
      if (userName) {
        const resultLen = unescape(encodeURIComponent(result.replace("$USER", ""))).length;
        const contribsLink = "[[Special:Contributions/".concat(userName, "|").concat(userName, "]]");
        const contribsLen = unescape(encodeURIComponent(contribsLink)).length;
        if (resultLen + contribsLen <= 499) {
          const talkLink = "([[User talk:".concat(userName).concat(window.wgULS("|讨论]])", "|討論]])"));
          if (resultLen + contribsLen + unescape(encodeURIComponent(talkLink)).length <= 499) {
            result = Morebits.string.safeReplace(result, "$USER", contribsLink + talkLink);
          } else {
            result = Morebits.string.safeReplace(result, "$USER", contribsLink);
          }
        } else {
          result = Morebits.string.safeReplace(result, "$USER", userName);
        }
      } else {
        result = Morebits.string.safeReplace(result, "$USER", Twinkle.fluff.hiddenName);
      }
    }
    return result;
  };
  Twinkle.addInitCallback(Twinkle.fluff, "fluff");
})(jQuery);
//! src/Twinkle/modules/twinklebatchdelete.js
/*! Twinkle.js - twinklebatchdelete.js */
(function twinklebatchdelete($) {
  const $body = $("body");
  Twinkle.batchdelete = () => {
    if (Morebits.userIsSysop && (mw.config.get("wgCurRevisionId") && mw.config.get("wgNamespaceNumber") > 0 || mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex" || mw.config.get("wgCanonicalSpecialPageName") === "BrokenRedirects")) {
      Twinkle.addPortletLink(Twinkle.batchdelete.callback, window.wgULS("批删", "批刪"), "tw-batch", window.wgULS("删除此分类或页面中的所有链接", "刪除此分類或頁面中的所有連結"));
    }
  };
  Twinkle.batchdelete.unlinkCache = {};
  let subpagesLoaded;
  Twinkle.batchdelete.callback = () => {
    subpagesLoaded = false;
    const Window = new Morebits.simpleWindow(600, 400);
    Window.setTitle(window.wgULS("批量删除", "批次刪除"));
    Window.setScriptName("Twinkle");
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#batchdelete");
    const form = new Morebits.quickForm(Twinkle.batchdelete.callback.evaluate);
    form.append({
      type: "checkbox",
      list: [{
        label: window.wgULS("删除页面", "刪除頁面"),
        name: "delete_page",
        value: "delete",
        checked: true,
        subgroup: {
          type: "checkbox",
          list: [{
            label: window.wgULS("删除关联的讨论页(用户讨论页除外)", "刪除關聯的討論頁(使用者討論頁除外)"),
            name: "delete_talk",
            value: "delete_talk",
            checked: true
          }, {
            label: window.wgULS("删除到已删页面的重定向页", "刪除到已刪頁面的重新導向頁面"),
            name: "delete_redirects",
            value: "delete_redirects",
            checked: true
          }, {
            label: window.wgULS("删除已删页面的子页面", "刪除已刪頁面的子頁面"),
            name: "delete_subpages",
            value: "delete_subpages",
            checked: false,
            event: Twinkle.batchdelete.callback.toggleSubpages,
            subgroup: {
              type: "checkbox",
              list: [{
                label: window.wgULS("删除已删子页面的讨论页", "刪除已刪子頁面的討論頁"),
                name: "delete_subpage_talks",
                value: "delete_subpage_talks"
              }, {
                label: window.wgULS("删除到已删子页面的重定向页", "刪除到已刪子頁面的重新導向頁面"),
                name: "delete_subpage_redirects",
                value: "delete_subpage_redirects"
              }, {
                label: window.wgULS("取消所有已删页面的链入(仅处理条目命名空间)", "取消所有已刪頁面的連入(僅處理條目命名空間)"),
                name: "unlink_subpages",
                value: "unlink_subpages"
              }]
            }
          }]
        }
      }, {
        label: window.wgULS("取消链入(仅处理条目命名空间)", "取消連入(僅處理條目命名空間)"),
        name: "unlink_page",
        value: "unlink",
        checked: false
      }, {
        label: window.wgULS("移除文件使用(所有命名空间)", "移除檔案使用(所有命名空間)"),
        name: "unlink_file",
        value: "unlink_file",
        checked: true
      }]
    });
    form.append({
      type: "select",
      name: "common_reason",
      label: "常用理由:",
      style: "width: 85%;",
      list: Twinkle.batchdelete.deletereasonlist,
      event: Twinkle.batchdelete.callback.change_common_reason
    });
    form.append({
      name: "reason",
      type: "input",
      label: "理由:",
      size: 75
    });
    const query = {
      action: "query",
      prop: "revisions|info|imageinfo",
      inprop: "protection",
      rvprop: "size|user"
    };
    if (mw.config.get("wgNamespaceNumber") === 14) {
      query.generator = "categorymembers";
      query.gcmtitle = mw.config.get("wgPageName");
      query.gcmlimit = Twinkle.getPref("batchMax");
    } else if (mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex") {
      query.generator = "allpages";
      query.gaplimit = Twinkle.getPref("batchMax");
      if (mw.util.getParamValue("prefix")) {
        query.gapnamespace = mw.util.getParamValue("namespace");
        query.gapprefix = mw.util.getParamValue("prefix");
      } else {
        let pathSplit = decodeURIComponent(location.pathname).split("/");
        if (pathSplit.length < 3 || pathSplit[2] !== "Special:前缀索引") {
          return;
        }
        const titleSplit = pathSplit[3].split(":");
        query.gapnamespace = mw.config.get("wgNamespaceIds")[titleSplit[0].toLowerCase()];
        if (titleSplit.length < 2 || query.gapnamespace === void 0) {
          query.gapnamespace = 0;
          query.gapprefix = pathSplit.splice(3).join("/");
        } else {
          pathSplit = pathSplit.splice(4);
          pathSplit.splice(0, 0, titleSplit.splice(1).join(":"));
          query.gapprefix = pathSplit.join("/");
        }
      }
    } else if (mw.config.get("wgCanonicalSpecialPageName") === "BrokenRedirects") {
      query.generator = "querypage";
      query.gqppage = "BrokenRedirects";
      query.gqplimit = Twinkle.getPref("batchMax");
    } else {
      query.generator = "links";
      query.titles = mw.config.get("wgPageName");
      query.gpllimit = Twinkle.getPref("batchMax");
    }
    const statusdiv = document.createElement("div");
    statusdiv.style.padding = "15px";
    Window.setContent(statusdiv);
    Morebits.status.init(statusdiv);
    Window.display();
    Twinkle.batchdelete.pages = {};
    const statelem = new Morebits.status(window.wgULS("抓取页面列表", "抓取頁面列表"));
    const ysarchives_api = new Morebits.wiki.api(window.wgULS("加载中…", "載入中…"), query, (apiobj) => {
      const xml = apiobj.responseXML;
      const $pages = $(xml).find("page").filter(":not([missing])");
      $pages.each((_index, page) => {
        const $page = $(page);
        const ns = $page.attr("ns");
        const title = $page.attr("title");
        const isRedir = $page.attr("redirect") === "";
        const $editprot = $page.find('pr[type="edit"][level="sysop"]');
        const isProtected = $editprot.length > 0;
        const size = $page.find("rev").attr("size");
        const metadata = [];
        if (isRedir) {
          metadata.push(window.wgULS("重定向", "重新導向"));
        }
        if (isProtected) {
          metadata.push(window.wgULS("全保护,", "全保護,") + ($editprot.attr("expiry") === "infinity" ? window.wgULS("无限期", "無限期") : "".concat(new Morebits.date($editprot.attr("expiry")).calendar("utc"), " (UTC)")) + window.wgULS("过期", "過期"));
        }
        if (ns === "6") {
          metadata.push(window.wgULS("上传者:", "上傳者:") + $page.find("ii").attr("user"), window.wgULS("最后编辑:", "最後編輯:") + $page.find("rev").attr("user"));
        } else {
          metadata.push(mw.language.convertNumber(size) + window.wgULS("字节", "位元組"));
        }
        Twinkle.batchdelete.pages[title] = {
          label: title + (metadata.length ? "(".concat(metadata.join(","), ")") : ""),
          value: title,
          checked: true,
          style: isProtected ? "color: #f00" : ""
        };
      });
      const form_ = apiobj.params.form;
      form_.append({
        type: "header",
        label: window.wgULS("待删除页面", "待刪除頁面")
      });
      form_.append({
        type: "button",
        label: window.wgULS("全选", "全選"),
        event: () => {
          $(result).find("input[name=pages]:not(:checked)").each((_, e) => {
            e.click();
          });
          $body.find('input[name="pages.subpages"]').prop("checked", true);
        }
      });
      form_.append({
        type: "button",
        label: window.wgULS("全不选", "全不選"),
        event: () => {
          $(result).find("input[name=pages]:checked").each((_, e) => {
            e.click();
          });
        }
      });
      form_.append({
        type: "checkbox",
        name: "pages",
        id: "tw-dbatch-pages",
        shiftClickSupport: true,
        list: Object.values(Twinkle.batchdelete.pages).map((e) => {
          return e;
        })
      });
      form_.append({
        type: "submit"
      });
      const result = form_.render();
      apiobj.params.Window.setContent(result);
      var _iterator54 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "pages")), _step54;
      try {
        for (_iterator54.s(); !(_step54 = _iterator54.n()).done; ) {
          const checkbox = _step54.value;
          generateArrowLinks(checkbox);
        }
      } catch (err) {
        _iterator54.e(err);
      } finally {
        _iterator54.f();
      }
    }, statelem);
    ysarchives_api.params = {
      form,
      Window
    };
    ysarchives_api.post();
  };
  const generateArrowLinks = (checkbox) => {
    const link = Morebits.htmlNode("a", " >");
    link.setAttribute("class", "tw-dbatch-page-link");
    link.setAttribute("href", mw.util.getUrl(checkbox.value));
    link.setAttribute("target", "_blank");
    link.setAttribute("rel", "noopener noreferrer");
    checkbox.nextElementSibling.append(link);
  };
  Twinkle.batchdelete.generateNewPageList = (form) => {
    const elements = form.elements.pages;
    if (elements instanceof NodeList) {
      var _iterator55 = _createForOfIteratorHelper(elements), _step55;
      try {
        for (_iterator55.s(); !(_step55 = _iterator55.n()).done; ) {
          const element = _step55.value;
          Twinkle.batchdelete.pages[element.value].checked = element.checked;
        }
      } catch (err) {
        _iterator55.e(err);
      } finally {
        _iterator55.f();
      }
    } else if (elements instanceof HTMLInputElement) {
      Twinkle.batchdelete.pages[elements.value].checked = elements.checked;
    }
    return new Morebits.quickForm.element({
      type: "checkbox",
      name: "pages",
      id: "tw-dbatch-pages",
      shiftClickSupport: true,
      list: Object.values(Twinkle.batchdelete.pages).map((e) => {
        return e;
      })
    }).render();
  };
  Twinkle.batchdelete.deletereasonlist = [{
    label: window.wgULS("请选择", "請選擇"),
    value: ""
  }, {
    label: window.wgULS("G6:原作者提请删除或清空页面,且页面原作者仅有一人", "G6:原作者提請刪除或清空頁面,且頁面原作者僅有一人"),
    value: window.wgULS("[[LIB:CSD#G6|G6]]:原作者提请删除或清空页面,且页面原作者仅有一人", "[[LIB:CSD#G6|G6]]:原作者提請刪除或清空頁面,且頁面原作者僅有一人")
  }, {
    label: window.wgULS("G9:孤立页面,比如没有主页面的讨论页、指向空页面的重定向等", "G9:孤立頁面,比如沒有主頁面的討論頁、指向空頁面的重新導向等"),
    value: window.wgULS("[[LIB:CSD#G9|G9]]:孤立页面", "[[LIB:CSD#G9|G9]]:孤立頁面")
  }, {
    label: window.wgULS("R1:不能发挥实际作用的重定向。", "R1:不能發揮實際作用的重定向。"),
    value: window.wgULS("[[LIB:CSD#R1|R1]]:不能发挥实际作用的重定向。", "[[LIB:CSD#R1|R1]]:不能發揮實際作用的重定向。")
  }, {
    label: window.wgULS("R2:名称与导向目标代表事物不一致或不完全一致的重定向。", "R2:名稱與導向目標代表事物不一致或不完全一致的重定向。"),
    value: window.wgULS("[[LIB:CSD#R2|R2]]:名称与导向目标代表事物不一致或不完全一致的重定向。", "[[LIB:CSD#R2|R2]]:名稱與導向目標代表事物不一致或不完全一致的重定向。")
  }, {
    label: window.wgULS("F4:可被替代的合理使用文件", "F4:可被替代的合理使用檔案"),
    value: window.wgULS("[[LIB:CSD#F4|F4]]:可被替代的合理使用文件", "[[LIB:CSD#F4|F4]]:可被替代的合理使用檔案")
  }, {
    label: window.wgULS("F5:没有被条目使用的非自由著作权文件、没有填写任何合理使用依据的非自由著作权文件", "F5:沒有被條目使用的非自由版權檔案、沒有填寫任何合理使用依據的非自由版權檔案"),
    value: window.wgULS("[[LIB:CSD#F5|F5]]:没有被条目使用的非自由著作权文件、没有填写任何合理使用依据的非自由著作权文件", "[[LIB:CSD#F5|F5]]:沒有被條目使用的非自由版權檔案、沒有填寫任何合理使用依據的非自由版權檔案")
  }, {
    label: window.wgULS("O1:用户请求删除自己的用户页或其子页面", "O1:使用者請求刪除自己的使用者頁面或其子頁面"),
    value: window.wgULS("[[LIB:CSD#O1|O1]]:用户请求删除自己的[[Help:用户页|用户页]]或其子页面。", "[[LIB:CSD#O1|O1]]:使用者請求刪除自己的[[Help:用户页|使用者頁面]]或其子頁面。")
  }, {
    label: window.wgULS("O2:空的分类(没有条目也没有子分类)", "O2:空的分類(沒有條目也沒有子分類)"),
    value: window.wgULS("[[LIB:CSD#O2|O2]]:空的分类(没有条目也没有子分类)。", "[[LIB:CSD#O2|O2]]:空的分類(沒有條目也沒有子分類)。")
  }, {
    label: window.wgULS("O3:废弃草稿", "O3:廢棄草稿"),
    value: window.wgULS("[[LIB:CSD#O3|O3]]:废弃草稿。", "[[LIB:CSD#O3|O3]]:廢棄草稿。")
  }];
  Twinkle.batchdelete.callback.change_common_reason = (e) => {
    if (e.target.form.reason.value !== "") {
      e.target.form.reason.value = Morebits.string.appendPunctuation(e.target.form.reason.value);
    }
    e.target.form.reason.value += e.target.value;
    e.target.value = "";
  };
  Twinkle.batchdelete.callback.toggleSubpages = (e) => {
    const {
      form
    } = e.target;
    let newPageList;
    if (e.target.checked) {
      form.delete_subpage_redirects.checked = form.delete_redirects.checked;
      form.delete_subpage_talks.checked = form.delete_talk.checked;
      form.unlink_subpages.checked = form.unlink_page.checked;
      if (subpagesLoaded) {
        var _iterator56 = _createForOfIteratorHelper(Twinkle.batchdelete.pages), _step56;
        try {
          for (_iterator56.s(); !(_step56 = _iterator56.n()).done; ) {
            const el = _step56.value;
            if (el.subgroup === null && el.subgroup_) {
              el.subgroup = el.subgroup_;
            }
          }
        } catch (err) {
          _iterator56.e(err);
        } finally {
          _iterator56.f();
        }
        newPageList = Twinkle.batchdelete.generateNewPageList(form);
        $body.find("#tw-dbatch-pages").replaceWith(newPageList);
        var _iterator57 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages")), _step57;
        try {
          for (_iterator57.s(); !(_step57 = _iterator57.n()).done; ) {
            const checkbox = _step57.value;
            generateArrowLinks(checkbox);
          }
        } catch (err) {
          _iterator57.e(err);
        } finally {
          _iterator57.f();
        }
        var _iterator58 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages.subpages")), _step58;
        try {
          for (_iterator58.s(); !(_step58 = _iterator58.n()).done; ) {
            const checkbox = _step58.value;
            generateArrowLinks(checkbox);
          }
        } catch (err) {
          _iterator58.e(err);
        } finally {
          _iterator58.f();
        }
        return;
      }
      const loadingText = '<strong id="dbatch-subpage-loading">'.concat(window.wgULS("加载中...", "載入中..."), "</strong>");
      $(e.target).after(loadingText);
      const pages = $(form.pages).map((_i, el) => {
        return el.value;
      }).get();
      const subpageLister = new Morebits.batchOperation();
      subpageLister.setOption("chunkSize", Twinkle.getPref("batchChunks"));
      subpageLister.setPageList(pages);
      subpageLister.run((pageName) => {
        const pageTitle = mw.Title.newFromText(pageName);
        if ([0, 6, 8].includes(pageTitle.namespace)) {
          subpageLister.workerSuccess();
          return;
        }
        const ysarchives_api = new Morebits.wiki.api(window.wgULS("正在获取 ", "正在取得 ") + pageName + window.wgULS(" 的子页面", " 的子頁面"), {
          action: "query",
          prop: "revisions|info|imageinfo",
          generator: "allpages",
          rvprop: "size",
          inprop: "protection",
          gapprefix: "".concat(pageTitle.title, "/"),
          gapnamespace: pageTitle.namespace,
          gaplimit: "max",
          pageNameFull: pageName
          // Not used by API, but added for access in onSuccess()
        }, (apiobj) => {
          const xml = apiobj.responseXML;
          const $pages = $(xml).find("page");
          const subpageList = [];
          $pages.each((_index, page) => {
            const $page = $(page);
            const ns = $page.attr("ns");
            const title = $page.attr("title");
            const isRedir = $page.attr("redirect") === "";
            const $editprot = $page.find('pr[type="edit"][level="sysop"]');
            const isProtected = $editprot.length > 0;
            const size = $page.find("rev").attr("size");
            const metadata = [];
            if (isRedir) {
              metadata.push("redirect");
            }
            if (isProtected) {
              metadata.push(window.wgULS("全保护,", "全保護,") + ($editprot.attr("expiry") === "infinity" ? window.wgULS("无限期", "無限期") : "".concat(new Morebits.date($editprot.attr("expiry")).calendar("utc"), " (UTC)")) + window.wgULS("过期", "過期"));
            }
            if (ns === "6") {
              metadata.push(window.wgULS("上传者:", "上傳者:") + $page.find("ii").attr("user"), window.wgULS("最后编辑:", "最後編輯:") + $page.find("rev").attr("user"));
            } else {
              metadata.push(mw.language.convertNumber(size) + window.wgULS("字节", "位元組"));
            }
            subpageList.push({
              label: title + (metadata.length ? " (".concat(metadata.join("; "), ")") : ""),
              value: title,
              checked: true,
              style: isProtected ? "color: #f00" : ""
            });
          });
          if (subpageList.length) {
            const pageName_ = apiobj.query.pageNameFull;
            Twinkle.batchdelete.pages[pageName_].subgroup = {
              type: "checkbox",
              name: "subpages",
              className: "dbatch-subpages",
              shiftClickSupport: true,
              list: subpageList
            };
          }
          subpageLister.workerSuccess();
        }, null, () => {
          subpageLister.workerFailure();
        });
        ysarchives_api.post();
      }, () => {
        newPageList = Twinkle.batchdelete.generateNewPageList(form);
        $body.find("#tw-dbatch-pages").replaceWith(newPageList);
        var _iterator59 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages")), _step59;
        try {
          for (_iterator59.s(); !(_step59 = _iterator59.n()).done; ) {
            const checkbox = _step59.value;
            generateArrowLinks(checkbox);
          }
        } catch (err) {
          _iterator59.e(err);
        } finally {
          _iterator59.f();
        }
        var _iterator60 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages.subpages")), _step60;
        try {
          for (_iterator60.s(); !(_step60 = _iterator60.n()).done; ) {
            const checkbox = _step60.value;
            generateArrowLinks(checkbox);
          }
        } catch (err) {
          _iterator60.e(err);
        } finally {
          _iterator60.f();
        }
        subpagesLoaded = true;
        $body.find("#dbatch-subpage-loading").remove();
      });
    } else if (!e.target.checked) {
      var _iterator61 = _createForOfIteratorHelper(Twinkle.batchdelete.pages), _step61;
      try {
        for (_iterator61.s(); !(_step61 = _iterator61.n()).done; ) {
          const el = _step61.value;
          if (el.subgroup) {
            el.subgroup_ = el.subgroup;
            el.subgroup = null;
          }
        }
      } catch (err) {
        _iterator61.e(err);
      } finally {
        _iterator61.f();
      }
      newPageList = Twinkle.batchdelete.generateNewPageList(form);
      $body.find("#tw-dbatch-pages").replaceWith(newPageList);
      var _iterator62 = _createForOfIteratorHelper(Morebits.quickForm.getElements(newPageList, "pages")), _step62;
      try {
        for (_iterator62.s(); !(_step62 = _iterator62.n()).done; ) {
          const checkbox = _step62.value;
          generateArrowLinks(checkbox);
        }
      } catch (err) {
        _iterator62.e(err);
      } finally {
        _iterator62.f();
      }
    }
  };
  Twinkle.batchdelete.callback.evaluate = (event) => {
    Morebits.wiki.actionCompleted.notice = window.wgULS("批量删除已完成", "批次刪除已完成");
    const form = event.target;
    const numProtected = $(Morebits.quickForm.getElements(form, "pages")).filter((_index, element) => {
      return element.checked && element.nextElementSibling.style.color === "red";
    }).length;
    if (numProtected > 0 && !confirm(window.wgULS("您正要删除 ", "您正要刪除 ") + mw.language.convertNumber(numProtected) + window.wgULS(" 个全保护页面,您确定吗?", " 個全保護頁面,您確定嗎?"))) {
      return;
    }
    const pages = form.getChecked("pages");
    const subpages = form.getChecked("pages.subpages");
    const reason = form.reason.value;
    const delete_page = form.delete_page.checked;
    let delete_talk;
    let delete_redirects;
    let delete_subpages;
    let delete_subpage_redirects;
    let delete_subpage_talks;
    let unlink_subpages;
    if (delete_page) {
      delete_talk = form.delete_talk.checked;
      delete_redirects = form.delete_redirects.checked;
      delete_subpages = form.delete_subpages.checked;
      if (delete_subpages) {
        delete_subpage_redirects = form.delete_subpage_redirects.checked;
        delete_subpage_talks = form.delete_subpage_talks.checked;
        unlink_subpages = form.unlink_subpages.checked;
      }
    }
    const unlink_page = form.unlink_page.checked;
    const unlink_file = form.unlink_file.checked;
    if (!reason) {
      mw.notify(window.wgULS("您需要给出一个理由", "您需要給出一個理由"), {
        type: "warn",
        tag: "twinklebatchdelete"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    if (!pages) {
      Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("没有要删除的内容,中止", "沒有要刪除的內容,中止"));
      return;
    }
    const pageDeleter = new Morebits.batchOperation(delete_page ? window.wgULS("正在删除页面", "正在刪除頁面") : window.wgULS("正在启动要求的任务", "正在啟動要求的任務"));
    pageDeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
    pageDeleter.setOption("preserveIndividualStatusLines", delete_page);
    pageDeleter.setPageList(pages);
    pageDeleter.run((pageName) => {
      const params = {
        page: pageName,
        delete_page,
        delete_talk,
        delete_redirects,
        unlink_page,
        unlink_file: unlink_file && new RegExp("^".concat(Morebits.namespaceRegex(6), ":"), "i").test(pageName),
        reason,
        pageDeleter
      };
      const ysarchives_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除页面 ", "正在刪除頁面 ") + pageName);
      ysarchives_page.setCallbackParameters(params);
      if (delete_page) {
        ysarchives_page.setEditSummary("".concat(reason, "(批量)"));
        ysarchives_page.setChangeTags(Twinkle.changeTags);
        ysarchives_page.suppressProtectWarning();
        ysarchives_page.deletePage(Twinkle.batchdelete.callbacks.doExtras, pageDeleter.workerFailure);
      } else {
        Twinkle.batchdelete.callbacks.doExtras(ysarchives_page);
      }
    }, () => {
      if (delete_subpages) {
        const subpageDeleter = new Morebits.batchOperation(window.wgULS("正在删除子页面", "正在刪除子頁面"));
        subpageDeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
        subpageDeleter.setOption("preserveIndividualStatusLines", true);
        subpageDeleter.setPageList(subpages);
        subpageDeleter.run((pageName) => {
          const params = {
            page: pageName,
            delete_page: true,
            delete_talk: delete_subpage_talks,
            delete_redirects: delete_subpage_redirects,
            unlink_page: unlink_subpages,
            unlink_file: false,
            reason,
            pageDeleter: subpageDeleter
          };
          const ysarchives_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除子页面 ", "正在刪除子頁面 ") + pageName);
          ysarchives_page.setCallbackParameters(params);
          ysarchives_page.setEditSummary("".concat(reason, "(批量)"));
          ysarchives_page.setChangeTags(Twinkle.changeTags);
          ysarchives_page.suppressProtectWarning();
          ysarchives_page.deletePage(Twinkle.batchdelete.callbacks.doExtras, pageDeleter.workerFailure);
        });
      }
    });
  };
  Twinkle.batchdelete.callbacks = {
    // this stupid parameter name is a temporary thing until I implement an overhaul
    // of Morebits.wiki.* callback parameters
    doExtras: (thingWithParameters) => {
      const params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() : thingWithParameters.getCallbackParameters();
      params.pageDeleter.workerSuccess(thingWithParameters);
      let query;
      let ysarchives_api;
      if (params.unlink_page) {
        Twinkle.batchdelete.unlinkCache = {};
        query = {
          action: "query",
          list: "backlinks",
          blfilterredir: "nonredirects",
          blnamespace: [0],
          bltitle: params.page,
          bllimit: "max"
          // 500 is max for normal users, 5000 for bots and sysops
        };
        ysarchives_api = new Morebits.wiki.api(window.wgULS("正在获取链入", "正在取得連入"), query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain);
        ysarchives_api.params = params;
        ysarchives_api.post();
      }
      if (params.unlink_file) {
        query = {
          action: "query",
          list: "imageusage",
          iutitle: params.page,
          iulimit: "max"
          // 500 is max for normal users, 5000 for bots and sysops
        };
        ysarchives_api = new Morebits.wiki.api(window.wgULS("正在获取文件链入", "正在取得檔案連入"), query, Twinkle.batchdelete.callbacks.unlinkImageInstancesMain);
        ysarchives_api.params = params;
        ysarchives_api.post();
      }
      if (params.delete_page) {
        if (params.delete_redirects) {
          query = {
            action: "query",
            titles: params.page,
            prop: "redirects",
            rdlimit: "max"
            // 500 is max for normal users, 5000 for bots and sysops
          };
          ysarchives_api = new Morebits.wiki.api(window.wgULS("正在获取重定向", "正在取得重新導向"), query, Twinkle.batchdelete.callbacks.deleteRedirectsMain);
          ysarchives_api.params = params;
          ysarchives_api.post();
        }
        if (params.delete_talk) {
          const pageTitle = mw.Title.newFromText(params.page);
          if (pageTitle && pageTitle.namespace % 2 === 0 && pageTitle.namespace !== 2) {
            pageTitle.namespace++;
            query = {
              action: "query",
              titles: pageTitle.toText()
            };
            ysarchives_api = new Morebits.wiki.api(window.wgULS("正在检查讨论页面是否存在", "正在檢查討論頁面是否存在"), query, Twinkle.batchdelete.callbacks.deleteTalk);
            ysarchives_api.params = params;
            ysarchives_api.params.talkPage = pageTitle.toText();
            ysarchives_api.post();
          }
        }
      }
    },
    deleteRedirectsMain: (apiobj) => {
      const xml = apiobj.responseXML;
      const pages = $(xml).find("rd").map((_index, element) => {
        return $(element).attr("title");
      }).get();
      if (!pages.length) {
        return;
      }
      const redirectDeleter = new Morebits.batchOperation(window.wgULS("正在删除到 ", "正在刪除到 ") + apiobj.params.page + window.wgULS(" 的重定向", " 的重新導向"));
      redirectDeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
      redirectDeleter.setPageList(pages);
      redirectDeleter.run((pageName) => {
        const ysarchives_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除 ", "正在刪除 ") + pageName);
        ysarchives_page.setEditSummary("[[LIB:CSD#G9|G9]]: ".concat(window.wgULS("指向已删页面“", "指向已刪頁面「")).concat(apiobj.params.page).concat(window.wgULS("”的重定向", "」的重新導向")));
        ysarchives_page.setChangeTags(Twinkle.changeTags);
        ysarchives_page.deletePage(redirectDeleter.workerSuccess, redirectDeleter.workerFailure);
      });
    },
    deleteTalk: (apiobj) => {
      const xml = apiobj.responseXML;
      const exists = $(xml).find("page:not([missing])").length > 0;
      if (!exists) {
        return;
      }
      const page = new Morebits.wiki.page(apiobj.params.talkPage, window.wgULS("正在删除页面 ", "正在刪除頁面 ") + apiobj.params.page + window.wgULS(" 的讨论页", " 的討論頁"));
      page.setEditSummary("[[LIB:CSD#G9|G9]]: ".concat(window.wgULS("已删页面“", "已刪頁面「")).concat(apiobj.params.page).concat(window.wgULS("”的[[Help:讨论页|讨论页]]", "」的[[Help:討論頁|討論頁]]")));
      page.setChangeTags(Twinkle.changeTags);
      page.deletePage();
    },
    unlinkBacklinksMain: (apiobj) => {
      const xml = apiobj.responseXML;
      const pages = $(xml).find("bl").map((_index, element) => {
        return $(element).attr("title");
      }).get();
      if (!pages.length) {
        return;
      }
      const unlinker = new Morebits.batchOperation("正在取消到 ".concat(apiobj.params.page).concat(window.wgULS(" 的链入", " 的連入")));
      unlinker.setOption("chunkSize", Twinkle.getPref("batchChunks"));
      unlinker.setPageList(pages);
      unlinker.run((pageName) => {
        const ysarchives_page = new Morebits.wiki.page(pageName, "正在取消 ".concat(pageName).concat(window.wgULS(" 上的链入", " 上的連入")));
        const params = {
          ...apiobj.params
        };
        params.title = pageName;
        params.unlinker = unlinker;
        ysarchives_page.setCallbackParameters(params);
        ysarchives_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);
      });
    },
    unlinkBacklinks: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      if (!pageobj.exists()) {
        params.unlinker.workerSuccess(pageobj);
        return;
      }
      let text;
      if (params.title in Twinkle.batchdelete.unlinkCache) {
        text = Twinkle.batchdelete.unlinkCache[params.title];
      } else {
        text = pageobj.getPageText();
      }
      const old_text = text;
      const ysarchives_page = new Morebits.wikitext.page(text);
      text = ysarchives_page.removeLink(params.page).getText();
      Twinkle.batchdelete.unlinkCache[params.title] = text;
      if (text === old_text) {
        params.unlinker.workerSuccess(pageobj);
        return;
      }
      pageobj.setEditSummary(window.wgULS("取消到已删页面", "取消到已刪頁面") + params.page + window.wgULS("的链入", "的連入"));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setPageText(text);
      pageobj.setCreateOption("nocreate");
      pageobj.setMaxConflictRetries(10);
      pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
    },
    unlinkImageInstancesMain: (apiobj) => {
      const xml = apiobj.responseXML;
      const pages = $(xml).find("iu").map((_index, element) => {
        return $(element).attr("title");
      }).get();
      if (!pages.length) {
        return;
      }
      const unlinker = new Morebits.batchOperation("正在取消到 ".concat(apiobj.params.page).concat(window.wgULS(" 的链入", " 的連入")));
      unlinker.setOption("chunkSize", Twinkle.getPref("batchChunks"));
      unlinker.setPageList(pages);
      unlinker.run((pageName) => {
        const ysarchives_page = new Morebits.wiki.page(pageName, "取消 ".concat(pageName).concat(window.wgULS(" 的文件使用", " 的檔案使用")));
        const params = {
          ...apiobj.params
        };
        params.title = pageName;
        params.unlinker = unlinker;
        ysarchives_page.setCallbackParameters(params);
        ysarchives_page.load(Twinkle.batchdelete.callbacks.unlinkImageInstances);
      });
    },
    unlinkImageInstances: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      if (!pageobj.exists()) {
        params.unlinker.workerSuccess(pageobj);
        return;
      }
      const image = params.page.replace(new RegExp("^".concat(Morebits.namespaceRegex(6), ":")), "");
      let text;
      if (params.title in Twinkle.batchdelete.unlinkCache) {
        text = Twinkle.batchdelete.unlinkCache[params.title];
      } else {
        text = pageobj.getPageText();
      }
      const old_text = text;
      const ysarchives_page = new Morebits.wikitext.page(text);
      text = ysarchives_page.commentOutImage(image, window.wgULS("因文件已删,故注解", "因檔案已刪,故註解")).getText();
      Twinkle.batchdelete.unlinkCache[params.title] = text;
      if (text === old_text) {
        pageobj.getStatusElement().error("在 ".concat(pageobj.getPageName(), " 上取消 ").concat(image).concat(window.wgULS(" 的文件使用失败", " 的檔案使用失敗")));
        params.unlinker.workerFailure(pageobj);
        return;
      }
      pageobj.setEditSummary(window.wgULS("取消使用已被删除文件", "取消使用已被刪除檔案") + image + window.wgULS(",因为:", ",因為:") + params.reason);
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setPageText(text);
      pageobj.setCreateOption("nocreate");
      pageobj.setMaxConflictRetries(10);
      pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
    }
  };
  Twinkle.addInitCallback(Twinkle.batchdelete, "batchdelete");
})(jQuery);
//! src/Twinkle/modules/twinklebatchundelete.js
/*! Twinkle.js - twinklebatchundelete.js */
(function twinklebatchundelete($) {
  Twinkle.batchundelete = () => {
    if (!Morebits.userIsSysop || !mw.config.get("wgArticleId") || mw.config.get("wgNamespaceNumber") !== mw.config.get("wgNamespaceIds").user && mw.config.get("wgNamespaceNumber") !== mw.config.get("wgNamespaceIds").project) {
      return;
    }
    Twinkle.addPortletLink(Twinkle.batchundelete.callback, window.wgULS("批复", "批復"), "tw-batch-undel", window.wgULS("反删除页面", "反刪除頁面"));
  };
  Twinkle.batchundelete.callback = () => {
    const Window = new Morebits.simpleWindow(600, 400);
    Window.setScriptName("Twinkle");
    Window.setTitle(window.wgULS("批量反删除", "批次反刪除"));
    Window.addFooterLink(window.wgULS("Twinkle帮助", "Twinkle說明"), "H:TW/DOC#batchundelete");
    const form = new Morebits.quickForm(Twinkle.batchundelete.callback.evaluate);
    form.append({
      type: "checkbox",
      list: [{
        label: window.wgULS("若存在已删除的讨论页,也恢复", "若存在已刪除的討論頁,也恢復"),
        name: "undel_talk",
        value: "undel_talk",
        checked: true
      }]
    });
    form.append({
      type: "input",
      name: "reason",
      label: "理由:",
      size: 60
    });
    const statusdiv = document.createElement("div");
    statusdiv.style.padding = "15px";
    Window.setContent(statusdiv);
    Morebits.status.init(statusdiv);
    Window.display();
    const query = {
      action: "query",
      generator: "links",
      prop: "info",
      inprop: "protection",
      titles: mw.config.get("wgPageName"),
      gpllimit: Twinkle.getPref("batchMax")
    };
    const statelem = new Morebits.status(window.wgULS("抓取页面列表", "抓取頁面列表"));
    const ysarchives_api = new Morebits.wiki.api(window.wgULS("加载中…", "載入中…"), query, (apiobj) => {
      const xml = apiobj.responseXML;
      const $pages = $(xml).find("page[missing]");
      const list = [];
      $pages.each((_index, page) => {
        const $page = $(page);
        const title = $page.attr("title");
        const $editprot = $page.find('pr[type="create"][level="sysop"]');
        const isProtected = $editprot.length > 0;
        list.push({
          label: title + (isProtected ? "(".concat(window.wgULS("全保护,", "全保護,")).concat($editprot.attr("expiry") === "infinity" ? window.wgULS("无限期", "無限期") : "".concat(new Morebits.date($editprot.attr("expiry")).calendar("utc"), " (UTC)").concat(window.wgULS("过期", "過期")), ")") : ""),
          value: title,
          checked: true,
          style: isProtected ? "color: #f00" : ""
        });
      });
      apiobj.params.form.append({
        type: "header",
        label: window.wgULS("待恢复页面", "待恢復頁面")
      });
      apiobj.params.form.append({
        type: "button",
        label: window.wgULS("全选", "全選"),
        event: (e) => {
          $(Morebits.quickForm.getElements(e.target.form, "pages")).prop("checked", true);
        }
      });
      apiobj.params.form.append({
        type: "button",
        label: window.wgULS("全不选", "全不選"),
        event: (e) => {
          $(Morebits.quickForm.getElements(e.target.form, "pages")).prop("checked", false);
        }
      });
      apiobj.params.form.append({
        type: "checkbox",
        name: "pages",
        shiftClickSupport: true,
        list
      });
      apiobj.params.form.append({
        type: "submit"
      });
      const result = apiobj.params.form.render();
      apiobj.params.Window.setContent(result);
    }, statelem);
    ysarchives_api.params = {
      form,
      Window
    };
    ysarchives_api.post();
  };
  Twinkle.batchundelete.callback.evaluate = (event) => {
    Morebits.wiki.actionCompleted.notice = window.wgULS("反删除已完成", "反刪除已完成");
    const numProtected = $(Morebits.quickForm.getElements(event.target, "pages")).filter((_index, element) => {
      return element.checked && element.nextElementSibling.style.color === "red";
    }).length;
    if (numProtected > 0 && !confirm(window.wgULS("您正要反删除 ", "您正要反刪除 ") + numProtected + window.wgULS(" 个全保护页面,您确定吗?", " 個全保護頁面,您確定嗎?"))) {
      return;
    }
    const pages = event.target.getChecked("pages");
    const reason = event.target.reason.value;
    const undel_talk = event.target.reason.value;
    if (!reason) {
      mw.notify("您需要指定理由。", {
        type: "warn",
        tag: "twinklebatchundelete"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(event.target);
    if (!pages) {
      Morebits.status.error(window.wgULS("错误", "錯誤"), window.wgULS("没什么要反删除的,取消操作", "沒什麼要反刪除的,取消操作"));
      return;
    }
    const pageUndeleter = new Morebits.batchOperation(window.wgULS("反删除页面", "反刪除頁面"));
    pageUndeleter.setOption("chunkSize", Twinkle.getPref("batchChunks"));
    pageUndeleter.setOption("preserveIndividualStatusLines", true);
    pageUndeleter.setPageList(pages);
    pageUndeleter.run((pageName) => {
      const params = {
        page: pageName,
        undel_talk,
        reason,
        pageUndeleter
      };
      const ysarchives_page = new Morebits.wiki.page(pageName, window.wgULS("反删除页面", "反刪除頁面") + pageName);
      ysarchives_page.setCallbackParameters(params);
      ysarchives_page.setEditSummary("".concat(reason, " (批量)"));
      ysarchives_page.setChangeTags(Twinkle.changeTags);
      ysarchives_page.suppressProtectWarning();
      ysarchives_page.setMaxRetries(3);
      ysarchives_page.undeletePage(Twinkle.batchundelete.callbacks.doExtras, pageUndeleter.workerFailure);
    });
  };
  Twinkle.batchundelete.callbacks = {
    // this stupid parameter name is a temporary thing until I implement an overhaul
    // of Morebits.wiki.* callback parameters
    doExtras: (thingWithParameters) => {
      const params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() : thingWithParameters.getCallbackParameters();
      params.pageUndeleter.workerSuccess(thingWithParameters);
      let query;
      let ysarchives_api;
      if (params.undel_talk) {
        const talkpagename = new mw.Title(params.page).getTalkPage().getPrefixedText();
        if (talkpagename !== params.page) {
          query = {
            action: "query",
            prop: "deletedrevisions",
            drvprop: "ids",
            drvlimit: 1,
            titles: talkpagename
          };
          ysarchives_api = new Morebits.wiki.api(window.wgULS("检查讨论页的已删版本", "檢查討論頁的已刪版本"), query, Twinkle.batchundelete.callbacks.undeleteTalk);
          ysarchives_api.params = params;
          ysarchives_api.params.talkPage = talkpagename;
          ysarchives_api.post();
        }
      }
    },
    undeleteTalk: (apiobj) => {
      const xml = apiobj.responseXML;
      const exists = $(xml).find("page:not([missing])").length > 0;
      const delrevs = $(xml).find("rev").attr("revid");
      if (exists || !delrevs) {
        return;
      }
      const page = new Morebits.wiki.page(apiobj.params.talkPage, window.wgULS("正在反删除", "正在反刪除") + apiobj.params.page + window.wgULS("的讨论页", "的討論頁"));
      page.setEditSummary(window.wgULS("反删除“", "反刪除「") + apiobj.params.page + window.wgULS("”的[[Help:讨论页|讨论页]]", "」的[[Help:討論頁|討論頁]]"));
      page.setChangeTags(Twinkle.changeTags);
      page.undeletePage();
    }
  };
  Twinkle.addInitCallback(Twinkle.batchundelete, "batchundelete");
})(jQuery);
//! src/Twinkle/modules/twinklebatchprotect.js
/*! Twinkle.js - twinklebatchprotect.js */
(function twinklebatchprotect($) {
  Twinkle.batchprotect = () => {
    if (Morebits.userIsSysop && (mw.config.get("wgArticleId") > 0 && [2, 4].includes(mw.config.get("wgNamespaceNumber")) || mw.config.get("wgNamespaceNumber") === 14 || mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex")) {
      Twinkle.addPortletLink(Twinkle.batchprotect.callback, "批保", "tw-pbatch", "批量保护链出页面");
    }
  };
  Twinkle.batchprotect.unlinkCache = {};
  Twinkle.batchprotect.callback = () => {
    const Window = new Morebits.simpleWindow(600, 400);
    Window.setTitle("批保");
    Window.setScriptName("Twinkle");
    Window.addFooterLink("保护条例", "LIB:PROT");
    Window.addFooterLink(window.wgULS("帮助文档", "幫助文檔"), "H:TW/DOC#保护");
    Window.addFooterLink(window.wgULS("问题反馈", "問題反饋"), "HT:TW");
    const form = new Morebits.quickForm(Twinkle.batchprotect.callback.evaluate);
    form.append({
      type: "checkbox",
      event: Twinkle.protect.formevents.editmodify,
      list: [{
        label: "修改编辑保护",
        value: "editmodify",
        name: "editmodify",
        tooltip: "仅限现有页面。",
        checked: true
      }]
    });
    form.append({
      type: "select",
      name: "editlevel",
      label: "编辑权限:",
      event: Twinkle.protect.formevents.editlevel,
      list: Twinkle.protect.protectionLevels
    });
    form.append({
      type: "select",
      name: "editexpiry",
      label: "终止时间:",
      event: (event) => {
        if (event.target.value === "custom") {
          Twinkle.protect.doCustomExpiry(event.target);
        }
      },
      list: Twinkle.protect.protectionLengths
      // Default (2 days) set after render
    });
    form.append({
      type: "checkbox",
      event: Twinkle.protect.formevents.movemodify,
      list: [{
        label: "修改移动保护",
        value: "movemodify",
        name: "movemodify",
        tooltip: "仅限现有页面。",
        checked: true
      }]
    });
    form.append({
      type: "select",
      name: "movelevel",
      label: "移动权限:",
      event: Twinkle.protect.formevents.movelevel,
      list: Twinkle.protect.protectionLevels.filter(
        // Autoconfirmed is required for a move, redundant
        (protLevel) => {
          return protLevel.value !== "autoconfirmed";
        }
      )
    });
    form.append({
      type: "select",
      name: "moveexpiry",
      label: "终止时间:",
      event: (event) => {
        if (event.target.value === "custom") {
          Twinkle.protect.doCustomExpiry(event.target);
        }
      },
      list: Twinkle.protect.protectionLengths
      // Default (2 days) set after render
    });
    form.append({
      type: "checkbox",
      event: (event) => {
        event.target.form.createlevel.disabled = !event.target.checked;
        event.target.form.createexpiry.disabled = !event.target.checked || event.target.form.createlevel.value === "all";
        event.target.form.createlevel.style.color = event.target.checked ? "" : "transparent";
        event.target.form.createexpiry.style.color = event.target.checked ? "" : "transparent";
      },
      list: [{
        label: "修改创建保护",
        value: "createmodify",
        name: "createmodify",
        tooltip: "仅限不存在的页面。",
        checked: true
      }]
    });
    form.append({
      type: "select",
      name: "createlevel",
      label: "创建权限:",
      event: Twinkle.protect.formevents.createlevel,
      list: Twinkle.protect.protectionLevels
    });
    form.append({
      type: "select",
      name: "createexpiry",
      label: "终止时间:",
      event: (event) => {
        if (event.target.value === "custom") {
          Twinkle.protect.doCustomExpiry(event.target);
        }
      },
      list: Twinkle.protect.protectionLengths
      // Default (indefinite) set after render
    });
    form.append({
      type: "header",
      label: ""
      // horizontal rule
    });
    form.append({
      type: "input",
      name: "reason",
      label: "理由(保护日志)",
      size: 60
    });
    const query = {
      action: "query",
      prop: "revisions|info|imageinfo",
      rvprop: "size|user",
      inprop: "protection",
      format: "json"
    };
    if (mw.config.get("wgNamespaceNumber") === 14) {
      query.generator = "categorymembers";
      query.gcmtitle = mw.config.get("wgPageName");
      query.gcmlimit = Twinkle.getPref("batchMax");
    } else if (mw.config.get("wgCanonicalSpecialPageName") === "Prefixindex") {
      query.generator = "allpages";
      query.gapnamespace = mw.util.getParamValue("namespace") || document.querySelectorAll("select[name=namespace]")[0].value;
      query.gapprefix = mw.util.getParamValue("prefix") || document.querySelectorAll("input[name=prefix]")[0].value;
      query.gaplimit = Twinkle.getPref("batchMax");
    } else {
      query.generator = "links";
      query.titles = mw.config.get("wgPageName");
      query.gpllimit = Twinkle.getPref("batchMax");
    }
    const statusdiv = document.createElement("div");
    statusdiv.style.padding = "15px";
    Window.setContent(statusdiv);
    Morebits.status.init(statusdiv);
    Window.display();
    const statelem = new Morebits.status("抓取页面列表");
    const ysarchives_api = new Morebits.wiki.api("加载中……", query, (apiobj) => {
      const response = apiobj.getResponse();
      const pages = response.query && response.query.pages || [];
      const list = [];
      pages.sort(Twinkle.sortByNamespace);
      var _iterator63 = _createForOfIteratorHelper(pages), _step63;
      try {
        for (_iterator63.s(); !(_step63 = _iterator63.n()).done; ) {
          const page = _step63.value;
          const metadata = [];
          const missing = !!page.missing;
          let editProt;
          if (missing) {
            metadata.push("页面不存在");
            editProt = page.protection.filter((protection) => {
              return protection.type === "create" && protection.level === "sysop";
            }).pop();
          } else {
            if (page.redirect) {
              metadata.push("重定向");
            }
            if (page.ns === 6) {
              metadata.push("上传者:".concat(page.imageinfo[0].user), "最后编辑者:".concat(page.revisions[0].user));
            } else {
              metadata.push("".concat(mw.language.convertNumber(page.revisions[0].size), "字节"));
            }
            editProt = page.protection.filter((protection) => {
              return protection.type === "edit" && protection.level === "sysop";
            }).pop();
          }
          if (editProt) {
            metadata.push("".concat(missing ? "白纸" : "", "全保护").concat(editProt.expiry === "infinity" ? "(永久)" : "(".concat(new Morebits.date(editProt.expiry).calendar("utc"), " (UTC)过期)")));
          }
          const {
            title
          } = page;
          list.push({
            label: title + (metadata.length > 0 ? " (".concat(metadata.join("; "), ")") : ""),
            value: title,
            checked: true,
            style: editProt ? "color: #f00" : ""
          });
        }
      } catch (err) {
        _iterator63.e(err);
      } finally {
        _iterator63.f();
      }
      form.append({
        type: "header",
        label: "待保护页面"
      });
      form.append({
        type: "button",
        label: "全选",
        event: (event) => {
          $(Morebits.quickForm.getElements(event.target.form, "pages")).prop("checked", true);
        }
      });
      form.append({
        type: "button",
        label: "全不选",
        event: (event) => {
          $(Morebits.quickForm.getElements(event.target.form, "pages")).prop("checked", false);
        }
      });
      form.append({
        type: "checkbox",
        name: "pages",
        shiftClickSupport: true,
        list
      });
      form.append({
        type: "submit"
      });
      const result = form.render();
      Window.setContent(result);
      result.editexpiry.value = "2 days";
      result.moveexpiry.value = "2 days";
      result.createexpiry.value = "infinity";
      var _iterator64 = _createForOfIteratorHelper(Morebits.quickForm.getElements(result, "个页面")), _step64;
      try {
        for (_iterator64.s(); !(_step64 = _iterator64.n()).done; ) {
          const links = _step64.value;
          Twinkle.generateArrowLinks(links);
        }
      } catch (err) {
        _iterator64.e(err);
      } finally {
        _iterator64.f();
      }
    }, statelem);
    ysarchives_api.post();
  };
  Twinkle.batchprotect.currentProtectCounter = 0;
  Twinkle.batchprotect.currentprotector = 0;
  Twinkle.batchprotect.callback.evaluate = (event) => {
    Morebits.wiki.actionCompleted.notice = "批量保护完成";
    const form = event.target;
    const numProtected = $(Morebits.quickForm.getElements(form, "个页面")).filter((_index, element) => {
      return element.checked && element.nextElementSibling.style.color === "#f00";
    }).length;
    if (numProtected > 0 && !confirm("您即将对".concat(mw.language.convertNumber(numProtected), "个全保护页面进行操作。您确定吗?"))) {
      return;
    }
    const input = Morebits.quickForm.getInputData(form);
    if (!input.reason) {
      mw.notify("您必须给出一个理由。", {
        type: "warn",
        tag: "twinklebatchprotect"
      });
      return;
    }
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(form);
    if (input.pages.length === 0) {
      Morebits.status.error("Error", "待保护页面不存在,程序终止");
      return;
    }
    const batchOperation = new Morebits.batchOperation("应用保护设置");
    batchOperation.setOption("chunkSize", Twinkle.getPref("batchChunks"));
    batchOperation.setOption("preserveIndividualStatusLines", true);
    batchOperation.setPageList(input.pages);
    batchOperation.run((pageName) => {
      const query = {
        action: "query",
        titles: pageName,
        format: "json"
      };
      const ysarchives_api = new Morebits.wiki.api("正在检查页面“".concat(pageName, "”是否存在"), query, Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure);
      ysarchives_api.params = {
        page: pageName,
        batchOperation,
        ...input
      };
      ysarchives_api.post();
    });
  };
  Twinkle.batchprotect.callbacks = {
    main: (apiobj) => {
      const response = apiobj.getResponse();
      if (response.query.normalized) {
        apiobj.params.page = response.query.normalized[0].to;
      }
      const exists = !response.query.pages[0].missing;
      const page = new Morebits.wiki.page(apiobj.params.page, "正在保护".concat(apiobj.params.page));
      let takenAction = false;
      if (exists && apiobj.params.editmodify) {
        page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);
        takenAction = true;
      }
      if (exists && apiobj.params.movemodify) {
        page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);
        takenAction = true;
      }
      if (!exists && apiobj.params.createmodify) {
        page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);
        takenAction = true;
      }
      if (!takenAction) {
        Morebits.status.warn("正在保护“".concat(apiobj.params.page), "”页面".concat(exists ? "存在" : "不存在", ";无事可做,跳过"));
        apiobj.params.batchOperation.workerFailure(apiobj);
        return;
      }
      page.setEditSummary(apiobj.params.reason);
      page.setChangeTags(Twinkle.changeTags);
      page.protect(apiobj.params.batchOperation.workerSuccess, apiobj.params.batchOperation.workerFailure);
    }
  };
  Twinkle.addInitCallback(Twinkle.batchprotect, "batchprotect");
})(jQuery);
//! src/Twinkle/modules/twinkleclose.js
/*! Twinkle.js - twinkleclose.js */
(function twinkleclose($) {
  const $body = $("body");
  Twinkle.close = () => {
    if (Twinkle.getPref("XfdClose") === "hide" || !/^有兽档案馆([_ ]talk)?:存废讨论\/记录(?:\/\d+){3}$/.test(mw.config.get("wgPageName"))) {
      return;
    }
    mw.hook("wikipage.content").add((item) => {
      if (item.attr("id") === "mw-content-text") {
        Twinkle.close.addLinks();
      }
    });
  };
  Twinkle.close.addLinks = () => {
    const spanTag = (color, content) => {
      const span = document.createElement("span");
      span.style.color = color;
      span.appendChild(document.createTextNode(content));
      return span;
    };
    $body.find("h1:has(.mw-headline),h2:has(.mw-headline),h3:has(.mw-headline),h4:has(.mw-headline),h5:has(.mw-headline),h6:has(.mw-headline)", "#bodyContent").each((index, element) => {
      element.dataset.section = index + 1;
    });
    const selector = ":has(.mw-headline a:only-of-type):not(:has(+ div.NavFrame))";
    const titles = $body.find("#bodyContent").find("h2".concat(selector, ":not(:has(+ p + h3)), h3").concat(selector));
    const delNode = document.createElement("strong");
    const delLink = document.createElement("a");
    delLink.appendChild(spanTag("Black", "["));
    delLink.appendChild(spanTag("Red", window.wgULS("关闭讨论", "關閉討論")));
    delLink.appendChild(spanTag("Black", "]"));
    delNode.appendChild(delLink);
    var _iterator65 = _createForOfIteratorHelper(titles), _step65;
    try {
      for (_iterator65.s(); !(_step65 = _iterator65.n()).done; ) {
        const current = _step65.value;
        const headlinehref = $(current).find(".mw-headline a").attr("href");
        if (headlinehref !== void 0) {
          let title = null;
          if (headlinehref.includes("redlink=1")) {
            title = headlinehref.slice(19, -22);
          } else {
            const m = headlinehref.match(/\/wiki\/([^?]+)/, "$1");
            if (m !== null) {
              [, title] = m;
            }
          }
          if (title !== null) {
            title = decodeURIComponent(title);
            title = title.replace(/_/g, " ");
            const pagenotexist = $(current).find(".mw-headline a").hasClass("new");
            const {
              section
            } = current.dataset;
            const [node] = current.querySelectorAll(".mw-headline");
            node.appendChild(document.createTextNode(" "));
            const tmpNode = delNode.cloneNode(true);
            tmpNode.firstChild.href = "#".concat(section);
            $(tmpNode.firstChild).on("click", () => {
              Twinkle.close.callback(title, section, pagenotexist);
              return false;
            });
            node.appendChild(tmpNode);
          }
        }
      }
    } catch (err) {
      _iterator65.e(err);
    } finally {
      _iterator65.f();
    }
  };
  Twinkle.close.codes = [{
    key: window.wgULS("请求无效", "請求無效"),
    value: {
      ir: {
        label: window.wgULS("请求无效", "請求無效"),
        action: "keep"
      },
      rep: {
        label: window.wgULS("重复提出,无效", "重複提出,無效"),
        action: "keep"
      },
      ne: {
        label: window.wgULS("目标页面或文件不存在,无效", "目標頁面或檔案不存在,無效"),
        action: "keep"
      },
      nq: {
        label: window.wgULS("提删者未获取提删资格,无效", "提刪者未取得提刪資格,無效"),
        action: "keep"
      }
    }
  }, {
    key: "保留",
    value: {
      k: {
        label: "保留",
        action: "keep",
        adminonly: true
      },
      sk: {
        label: "快速保留",
        action: "keep"
      },
      tk: {
        label: window.wgULS("暂时保留,改挂维护模板(关注度等)", "暫時保留,改掛維護模板(關注度等)"),
        value: window.wgULS("暂时保留", "暫時保留"),
        action: "keep"
      },
      rr: {
        label: window.wgULS("请求理由消失", "請求理由消失"),
        action: "keep",
        selected: Twinkle.getPref("XfdClose") === "nonadminonly"
      },
      dan: {
        label: window.wgULS("删后重建", "刪後重建"),
        action: "keep",
        adminonly: true
      }
    }
  }, {
    key: window.wgULS("删除", "刪除"),
    value: {
      d: {
        label: window.wgULS("删除", "刪除"),
        action: "del",
        adminonly: true,
        selected: Twinkle.getPref("XfdClose") === "all"
      },
      ic: {
        label: window.wgULS("图像因侵权被删", "圖像因侵權被刪"),
        action: "del",
        adminonly: true
      }
    }
  }, {
    key: window.wgULS("快速删除", "快速刪除"),
    value: {
      sd: {
        label: window.wgULS("快速删除", "快速刪除"),
        action: "del"
      },
      lssd: {
        label: window.wgULS("无来源或著作权信息,快速删除", "無來源或版權資訊,快速刪除"),
        action: "del"
      },
      svg: {
        label: window.wgULS("已改用SVG图形,快速删除", "已改用SVG圖形,快速刪除"),
        action: "del"
      },
      drep: {
        label: window.wgULS("多次被删除,条目锁定", "多次被刪除,條目鎖定"),
        action: "del",
        adminonly: true
      }
    }
  }, {
    key: window.wgULS("其他处理方法", "其他處理方法"),
    value: {
      c: {
        label: window.wgULS("转交侵权", "轉交侵權"),
        action: "noop"
      },
      r: {
        label: "重定向",
        action: "keep",
        adminonly: true
      },
      cr: {
        label: window.wgULS("分类重定向", "分類重定向"),
        action: "keep",
        adminonly: true
      },
      m: {
        label: window.wgULS("移动", "移動"),
        action: "keep",
        adminonly: true
      },
      merge: {
        label: window.wgULS("并入", "併入"),
        action: "keep",
        adminonly: true
      },
      mergeapproved: {
        label: window.wgULS("允许并入", "允許併入"),
        action: "keep",
        adminonly: true
      },
      nc: {
        label: window.wgULS("无共识暂时保留", "無共識暫時保留"),
        value: window.wgULS("无共识", "無共識"),
        action: "keep"
      }
    }
  }];
  Twinkle.close.callback = (title, section, noop) => {
    const Window = new Morebits.simpleWindow(410, 200);
    Window.setTitle("关闭存废讨论 · ".concat(title));
    Window.setScriptName("Twinkle");
    Window.addFooterLink("存废讨论设置", "H:TW/PREF#关闭存废讨论");
    Window.addFooterLink("Twinkle帮助", "H:TW/DOC#关闭存废讨论");
    const form = new Morebits.quickForm(Twinkle.close.callback.evaluate);
    form.append({
      type: "select",
      label: "处理结果:",
      name: "sub_group",
      event: Twinkle.close.callback.change_code
    });
    form.append({
      type: "input",
      name: "sdreason",
      label: "速删理由:",
      tooltip: "用于删除日志,使用{{delete}}的参数格式,例如 A1 或 A1|G1",
      hidden: true
    });
    form.append({
      type: "input",
      name: "remark",
      label: "补充说明:"
    });
    form.append({
      type: "checkbox",
      list: [{
        label: "只关闭讨论,不进行其他操作",
        value: "noop",
        name: "noop",
        event: Twinkle.close.callback.change_operation,
        checked: noop
      }]
    });
    if (new mw.Title(title).namespace % 2 === 0 && new mw.Title(title).namespace !== 2) {
      form.append({
        type: "checkbox",
        list: [{
          label: "删除关联的讨论页",
          value: "talkpage",
          name: "talkpage",
          tooltip: "删除时附带删除此页面的讨论页。",
          checked: true,
          event: (e) => {
            e.stopPropagation();
          }
        }]
      });
    }
    form.append({
      type: "checkbox",
      list: [{
        label: "删除重定向页",
        value: "redirects",
        name: "redirects",
        tooltip: "删除到此页的重定向。",
        checked: true,
        event: (e) => {
          e.stopPropagation();
        }
      }]
    });
    form.append({
      type: "submit"
    });
    const result = form.render();
    Window.setContent(result);
    Window.display();
    const [sub_group] = result.querySelectorAll("select");
    const resultData = {
      title,
      section: Number.parseInt(section, 10),
      noop
    };
    $(result).data("resultData", resultData);
    const createEntries = (contents, container) => {
      for (var _i16 = 0, _Object$entries9 = Object.entries(contents); _i16 < _Object$entries9.length; _i16++) {
        const [itemKey, itemProperties] = _Object$entries9[_i16];
        const key = typeof itemKey === "string" ? itemKey : itemProperties.value;
        const elem = new Morebits.quickForm.element({
          type: "option",
          label: "".concat(key, ":").concat(itemProperties.label),
          value: key,
          selected: itemProperties.selected,
          disabled: Twinkle.getPref("XfdClose") !== "all" && itemProperties.adminonly || itemProperties.disabled
        });
        const elemRendered = container.appendChild(elem.render());
        $(elemRendered).data("messageData", itemProperties);
      }
    };
    var _iterator66 = _createForOfIteratorHelper(Twinkle.close.codes), _step66;
    try {
      for (_iterator66.s(); !(_step66 = _iterator66.n()).done; ) {
        const group = _step66.value;
        let optgroup = new Morebits.quickForm.element({
          type: "optgroup",
          label: group.key
        });
        optgroup = optgroup.render();
        sub_group.appendChild(optgroup);
        createEntries(group.value, optgroup);
      }
    } catch (err) {
      _iterator66.e(err);
    } finally {
      _iterator66.f();
    }
    const event = document.createEvent("Event");
    event.initEvent("change", true, true);
    result.sub_group.dispatchEvent(event);
  };
  Twinkle.close.callback.change_operation = (e) => {
    const noop = e.target.checked;
    const code = e.target.form.sub_group.value;
    const messageData = $(e.target.form.sub_group).find('option[value="'.concat(code, '"]')).data("messageData");
    const {
      talkpage
    } = e.target.form;
    const {
      redirects
    } = e.target.form;
    if (noop || messageData.action === "keep") {
      if (talkpage) {
        talkpage.checked = false;
        talkpage.disabled = true;
      }
      redirects.checked = false;
      redirects.disabled = true;
    } else {
      if (talkpage) {
        talkpage.checked = true;
        talkpage.disabled = false;
      }
      redirects.checked = true;
      redirects.disabled = false;
    }
  };
  Twinkle.close.callback.change_code = (e) => {
    const resultData = $(e.target.form).data("resultData");
    const messageData = $(e.target).find('option[value="'.concat(e.target.value, '"]')).data("messageData");
    const {
      noop
    } = e.target.form;
    const {
      talkpage
    } = e.target.form;
    const {
      redirects
    } = e.target.form;
    if (resultData.noop || messageData.action === "noop") {
      noop.checked = true;
      noop.disabled = true;
      if (talkpage) {
        talkpage.checked = false;
        talkpage.disabled = true;
      }
      redirects.checked = false;
      redirects.disabled = true;
    } else {
      noop.checked = false;
      noop.disabled = false;
      if (messageData.action === "keep") {
        if (talkpage) {
          talkpage.checked = false;
          talkpage.disabled = true;
        }
        redirects.checked = false;
        redirects.disabled = true;
      } else {
        if (talkpage) {
          talkpage.checked = true;
          talkpage.disabled = false;
        }
        redirects.checked = true;
        redirects.disabled = false;
      }
      if (e.target.value === "sd") {
        e.target.form.sdreason.parentElement.removeAttribute("hidden");
      } else {
        e.target.form.sdreason.parentElement.setAttribute("hidden", "");
      }
    }
  };
  Twinkle.close.callback.evaluate = (e) => {
    const code = e.target.sub_group.value;
    const resultData = $(e.target).data("resultData");
    const messageData = $(e.target.sub_group).find('option[value="'.concat(code, '"]')).data("messageData");
    const noop = e.target.noop.checked;
    const talkpage = e.target.talkpage && e.target.talkpage.checked;
    const redirects = e.target.redirects.checked;
    const params = {
      title: resultData.title,
      code,
      remark: e.target.remark.value,
      sdreason: e.target.sdreason.value,
      section: resultData.section,
      parentSection: resultData.parentSection,
      messageData,
      talkpage,
      redirects
    };
    Morebits.simpleWindow.setButtonsEnabled(false);
    Morebits.status.init(e.target);
    Morebits.wiki.actionCompleted.notice = "操作完成";
    if (noop || messageData.action === "noop") {
      Twinkle.close.callbacks.talkend(params);
    } else {
      switch (messageData.action) {
        case "del":
          Twinkle.close.callbacks.del(params);
          break;
        case "keep": {
          const ysarchives_page = new Morebits.wiki.page(params.title, "移除存废讨论模板");
          ysarchives_page.setCallbackParameters(params);
          ysarchives_page.load(Twinkle.close.callbacks.keep);
          break;
        }
        default:
          mw.notify("关闭存废讨论:未定义 ".concat(code), {
            type: "warn",
            tag: "twinkleclose"
          });
      }
    }
  };
  Twinkle.close.callbacks = {
    del: (params) => {
      let query;
      let ysarchives_api;
      Morebits.wiki.addCheckpoint();
      const page = new Morebits.wiki.page(params.title, "删除页面");
      if (params.code === "sd") {
        Twinkle.speedy.callbacks.parseWikitext(params.title, "{{delete|".concat(params.sdreason, "}}"), (reason) => {
          reason = prompt("输入删除理由,或点击确定以接受自动生成的:", reason);
          if (reason === null) {
            page.getStatusElement().warn("没有执行删除");
            Twinkle.close.callbacks.talkend(params);
          } else {
            page.setEditSummary(reason);
            page.setChangeTags(Twinkle.changeTags);
            page.deletePage(() => {
              page.getStatusElement().info("完成");
              Twinkle.close.callbacks.talkend(params);
            });
          }
        });
      } else {
        page.setEditSummary("存废讨论通过:[[".concat(mw.config.get("wgPageName"), "#").concat(params.title, "]]"));
        page.setChangeTags(Twinkle.changeTags);
        page.deletePage(() => {
          page.getStatusElement().info("完成");
          Twinkle.close.callbacks.talkend(params);
        });
      }
      if (params.redirects) {
        query = {
          action: "query",
          titles: params.title,
          prop: "redirects",
          rdlimit: "max"
          // 500 is max for normal users, 5000 for bots and sysops
        };
        ysarchives_api = new Morebits.wiki.api("正在获取重定向", query, Twinkle.close.callbacks.deleteRedirectsMain);
        ysarchives_api.params = params;
        ysarchives_api.post();
      }
      if (params.talkPage) {
        const pageTitle = mw.Title.newFromText(params.title);
        if (pageTitle && pageTitle.namespace % 2 === 0 && pageTitle.namespace !== 2) {
          pageTitle.namespace++;
          query = {
            action: "query",
            titles: pageTitle.toText()
          };
          ysarchives_api = new Morebits.wiki.api("正在检查讨论页面是否存在", query, Twinkle.close.callbacks.deleteTalk);
          ysarchives_api.params = params;
          ysarchives_api.apiobj.params.talkPage = pageTitle.toText();
          ysarchives_api.post();
        }
      }
      Morebits.wiki.removeCheckpoint();
    },
    deleteRedirectsMain: (apiobj) => {
      const xml = apiobj.responseXML;
      const pages = $(xml).find("rd").map((_index, element) => {
        return $(element).attr("title");
      }).get();
      if (pages.length === 0) {
        return;
      }
      const redirectDeleter = new Morebits.batchOperation(window.wgULS("正在删除到 ", "正在刪除到 ") + apiobj.params.title + window.wgULS(" 的重定向", " 的重新導向"));
      redirectDeleter.setOption("chunkSize", Twinkle.getPref("batchdeleteChunks"));
      redirectDeleter.setPageList(pages);
      redirectDeleter.run((pageName) => {
        const ysarchives_page = new Morebits.wiki.page(pageName, window.wgULS("正在删除 ", "正在刪除 ") + pageName);
        ysarchives_page.setEditSummary("[[LIB:CSD#G5|G5]]:".concat(window.wgULS("指向已删页面“", "指向已刪頁面「")).concat(apiobj.params.title).concat(window.wgULS("”的重定向", "」的重新導向")));
        ysarchives_page.setChangeTags(Twinkle.changeTags);
        ysarchives_page.deletePage(redirectDeleter.workerSuccess, redirectDeleter.workerFailure);
      });
    },
    deleteTalk: (apiobj) => {
      const xml = apiobj.responseXML;
      const exists = $(xml).find("page:not([missing])").length > 0;
      if (!exists) {
        return;
      }
      const page = new Morebits.wiki.page(apiobj.params.talkPage, window.wgULS("正在删除页面 ", "正在刪除頁面 ") + apiobj.params.title + window.wgULS(" 的讨论页", " 的討論頁"));
      page.setEditSummary("[[LIB:CSD#G5|G5]]:".concat(window.wgULS("已删页面“", "已刪頁面「")).concat(apiobj.params.title).concat(window.wgULS("”的[[Help:讨论页|讨论页]]", "」的[[Help:討論頁|討論頁]]")));
      page.setChangeTags(Twinkle.changeTags);
      page.deletePage();
    },
    keep: (pageobj) => {
      const statelem = pageobj.getStatusElement();
      if (!pageobj.exists()) {
        statelem.error("页面不存在,可能已被删除");
        return;
      }
      const text = pageobj.getPageText();
      const params = pageobj.getCallbackParameters();
      const pagetitle = mw.Title.newFromText(params.title);
      if (pagetitle.getNamespaceId() % 2 === 0) {
        const talkpagetitle = new mw.Title(pagetitle.getMainText(), pagetitle.getNamespaceId() + 1);
        const talkpage = new Morebits.wiki.page(talkpagetitle.toString(), window.wgULS("标记讨论页", "標記討論頁"));
        const reason = params.messageData.value || params.messageData.label;
        const vfdkept = "{{Old vfd multi|".concat(mw.config.get("wgPageName").split("/").slice(2).join("/"), "|").concat(reason, "}}\n");
        talkpage.setPrependText(vfdkept);
        talkpage.setEditSummary("[[".concat(mw.config.get("wgPageName"), "#").concat(params.title, "]]:").concat(reason));
        talkpage.setChangeTags(Twinkle.changeTags);
        talkpage.setCreateOption("recreate");
        talkpage.prepend();
      }
      let newtext = text.replace(/<noinclude>\s*\{\{([rsaiftcmv]fd)(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*<\/noinclude>\s*/gi, "");
      newtext = newtext.replace(/\{\{([rsaiftcmv]fd)(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/gi, "");
      if (params.code !== "tk") {
        newtext = newtext.replace(/{{(notability|fame|mair|知名度|重要性|显著性|顯著性|知名度不足|人物重要性|重要性不足|notable|关注度|关注度不足|關注度|關注度不足|重要|重要度)(\|(?:{{[^{}]*}}|[^{}])*)?}}\n*/gi, "");
        newtext = newtext.replace(/{{(substub|小小作品|cod|小小條目|小小条目)(\|(?:{{[^{}]*}}|[^{}])*)?}}\n*/gi, "");
      }
      if (params.code === "mergeapproved") {
        const tag = "{{".concat("subst:").concat("Merge approved/auto|discuss=".concat(mw.config.get("wgPageName"), "#").concat(params.title, "}}\n"));
        const ysarchives_page = new Morebits.wikitext.page(newtext);
        newtext = ysarchives_page.insertAfterTemplates(tag, Twinkle.hatnoteRegex).getText();
      }
      if (newtext === text) {
        statelem.warn("未找到存废讨论模板,可能已被移除");
        Twinkle.close.callbacks.talkend(params);
        return;
      }
      const editsummary = "存废讨论关闭:[[".concat(mw.config.get("wgPageName"), "#").concat(params.title, "]]");
      pageobj.setPageText(newtext);
      pageobj.setEditSummary(editsummary);
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setCreateOption("nocreate");
      pageobj.save(Twinkle.close.callbacks.keepComplete);
    },
    keepComplete: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      Twinkle.close.callbacks.talkend(params);
    },
    talkend: (params) => {
      const ysarchives_page = new Morebits.wiki.page(mw.config.get("wgPageName"), "关闭讨论");
      ysarchives_page.setCallbackParameters(params);
      ysarchives_page.setPageSection(params.section);
      ysarchives_page.load(Twinkle.close.callbacks.saveTalk);
    },
    saveTalk: (pageobj) => {
      const statelem = pageobj.getStatusElement();
      let text = pageobj.getPageText();
      const params = pageobj.getCallbackParameters();
      if (text.includes("{{delh")) {
        statelem.error("讨论已被关闭");
        return;
      }
      const sbegin = text.includes("<section begin=backlog />");
      const send = text.includes("<section end=backlog />");
      text = text.replace("\n<section begin=backlog />", "");
      text = text.replace("\n<section end=backlog />", "");
      const bar = text.split("\n----\n");
      const split = bar[0].split("\n");
      text = "".concat(split[0], "\n{{delh|").concat(params.code, "}}\n");
      text += split.slice(1).join("\n");
      const reason = params.messageData.value || params.messageData.label;
      text += "\n<hr>\n: ".concat(reason);
      if (params.remark) {
        text += ":".concat(Morebits.string.appendPunctuation(params.remark));
      } else {
        text += "。";
      }
      if (!Morebits.userIsSysop) {
        text += "{{".concat("subst:").concat("NAC}}");
      }
      text += "--~~".concat("~~", "\n{{delf}}");
      if (bar[1]) {
        text += "\n----\n".concat(bar.slice(1).join("\n----\n"));
      }
      if (send) {
        text += "\n<section end=backlog />";
      }
      if (sbegin) {
        text += "\n<section begin=backlog />";
      }
      pageobj.setPageText(text);
      pageobj.setEditSummary("/* ".concat(params.title, " */ ").concat(reason));
      pageobj.setChangeTags(Twinkle.changeTags);
      pageobj.setCreateOption("nocreate");
      pageobj.save(Twinkle.close.callbacks.disableLink);
    },
    disableLink: (pageobj) => {
      const params = pageobj.getCallbackParameters();
      $("strong a[href=#".concat(params.section, "] span")).css("color", "#808080");
    }
  };
  Twinkle.addInitCallback(Twinkle.close, "close");
})(jQuery);
//! src/Twinkle/modules/twinkleconfig.js
/*! Twinkle.js - twinkleconfig.js */
(function twinkleconfig($) {
  const $body = $("body");
  Twinkle.config = {};
  Twinkle.config.watchlistEnums = {
    yes: window.wgULS("永久加入到监视列表", "永久加入到監視清單"),
    no: window.wgULS("不加入到监视列表", "不加入到監視清單"),
    default: window.wgULS("遵守站点设置", "遵守站點設定"),
    "1 week": window.wgULS("加入到监视列表1周", "加入到監視清單1週"),
    "1 month": window.wgULS("加入到监视列表1个月", "加入到監視清單1個月"),
    "3 months": window.wgULS("加入到监视列表3个月", "加入到監視清單3個月"),
    "6 months": window.wgULS("加入到监视列表6个月", "加入到監視清單6個月")
  };
  Twinkle.config.commonSets = {
    csdCriteria: {
      db: window.wgULS("自定义理由", "自訂理由"),
      g1: "G1",
      g2: "G2",
      g3: "G3",
      g4: "G4",
      g5: "G5",
      g6: "G6",
      g7: "G7",
      g8: "G8",
      g9: "G9",
      a1: "A1",
      a2: "A2",
      a3: "A3",
      o1: "O1",
      o2: "O2",
      o3: "O3",
      f1: "F1",
      f2: "F2",
      f3: "F3",
      f4: "F4",
      f5: "F5",
      r1: "R1",
      r2: "R2"
    },
    csdCriteriaDisplayOrder: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "o1", "o2", "o3", "f1", "f2", "f3", "f4", "f5", "r1", "r2"],
    csdCriteriaNotification: {
      db: window.wgULS("自定义理由", "自訂理由"),
      g1: "G1",
      g2: "G2",
      g3: "G3",
      g4: "G4",
      g5: "G5",
      g6: "G6",
      g7: "G7",
      g8: "G8",
      g9: "G9",
      a1: "A1",
      a2: "A2",
      a3: "A3",
      o1: "O1",
      o2: "O2",
      o3: "O3",
      f1: "F1",
      f2: "F2",
      f3: "F3",
      f4: "F4",
      f5: "F5",
      r1: "R1",
      r2: "R2"
    },
    csdCriteriaNotificationDisplayOrder: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "o1", "o2", "o3", "f1", "f2", "f3", "f4", "f5", "r1", "r2"],
    csdAndDICriteria: {
      db: window.wgULS("自定义理由", "自訂理由"),
      g1: "G1",
      g2: "G2",
      g3: "G3",
      g4: "G4",
      g5: "G5",
      g6: "G6",
      g7: "G7",
      g8: "G8",
      g9: "G9",
      a1: "A1",
      a2: "A2",
      a3: "A3",
      o1: "O1",
      o2: "O2",
      o3: "O3",
      f1: "F1",
      f2: "F2",
      f3: "F3",
      f4: "F4",
      f5: "F5",
      r1: "R1",
      r2: "R2"
    },
    csdAndDICriteriaDisplayOrder: ["db", "g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8", "g9", "a1", "a2", "a3", "o1", "o2", "o3", "f1", "f2", "f3", "f4", "f5", "r1", "r2"],
    xfdCriteria: {
      delete: window.wgULS("删除", "刪除"),
      merge: window.wgULS("合并", "合併"),
      fwdcsd: window.wgULS("转交自快速删除候选", "轉交自快速刪除候選"),
      fame: window.wgULS("批量关注度提删", "批次關注度提刪"),
      substub: window.wgULS("批量小小作品提删", "批次小小作品提刪"),
      batch: window.wgULS("批量其他提删", "批次其他提刪")
    },
    xfdCriteriaDisplayOrder: ["delete", "merge", "fwdcsd", "fame", "substub", "batch"],
    namespacesNoSpecial: {
      0: window.wgULS("(条目)", "(條目)"),
      1: "Talk",
      2: "User",
      3: "User talk",
      4: "LIB",
      5: "LIB talk",
      6: "File",
      7: "File talk",
      8: "MediaWiki",
      9: "MediaWiki talk",
      10: "Template",
      11: "Template talk",
      12: "Help",
      13: "Help talk",
      14: "Category",
      15: "Category talk",
      274: "Widget",
      275: "Widget talk",
      300: "Fanmade",
      301: "Fanmade talk",
      302: "Draft",
      303: "Draft talk",
      304: "SMWData",
      305: "SMWData talk",
      829: "Module talk"
    }
  };
  Twinkle.config.sections = [{
    title: window.wgULS("常规", "常規"),
    module: "general",
    preferences: [
      // TwinkleConfig.userTalkPageMode may take arguments:
      // 'window': open a new window, remember the opened window
      // 'tab': opens in a new tab, if possible.
      // 'blank': force open in a new window, even if such a window exists
      {
        name: "userTalkPageMode",
        label: window.wgULS("当要打开用户讨论页时", "當要打開使用者討論頁時"),
        type: "enum",
        enumValues: {
          window: window.wgULS("在窗口中,替换成其它用户对话页", "在當前分頁,替換成其它用戶討論頁"),
          tab: window.wgULS("在新标签页中", "在新分頁中"),
          blank: window.wgULS("在全新的窗口中", "在新視窗中")
        }
      },
      // TwinkleConfig.dialogLargeFont (boolean)
      {
        name: "dialogLargeFont",
        label: window.wgULS("在Twinkle对话框中使用大号字体", "在Twinkle對話方塊中使用大號字型"),
        type: "boolean"
      },
      // Twinkle.config.disabledModules (array)
      {
        name: "disabledModules",
        label: window.wgULS("关闭指定的Twinkle模块", "關閉指定的Twinkle模組"),
        helptip: window.wgULS("您在此选择的功能将无法使用,取消选择以重新启用功能。", "您在此選擇的功能將無法使用,取消選擇以重新啟用功能。"),
        type: "set",
        setValues: {
          arv: window.wgULS("告状", "告狀"),
          warn: "警告",
          block: window.wgULS("封禁", "封鎖"),
          talkback: "通告",
          speedy: window.wgULS("速删", "速刪"),
          copyvio: window.wgULS("侵权", "侵權"),
          xfd: window.wgULS("提删", "提刪"),
          image: window.wgULS("图权", "圖權"),
          protect: window.wgULS("保护", "保護"),
          tag: window.wgULS("标记", "標記"),
          stub: "小作品",
          diff: window.wgULS("差异", "差異"),
          unlink: window.wgULS("链入", "連入"),
          fluff: "回退"
        }
      },
      // Twinkle.config.disabledSysopModules (array)
      {
        name: "disabledSysopModules",
        label: window.wgULS("关闭指定的Twinkle管理员模块", "關閉指定的Twinkle管理員模組"),
        helptip: window.wgULS("您在此选择的功能将无法使用,取消选择以重新启用功能。", "您在此選擇的功能將無法使用,取消選擇以重新啟用功能。"),
        adminOnly: true,
        type: "set",
        setValues: {
          batchdelete: window.wgULS("批删", "批刪"),
          batchundelete: window.wgULS("批复", "批復")
        }
      }
    ]
  }, {
    title: window.wgULS("告状", "告狀"),
    module: "arv",
    preferences: [{
      name: "spiWatchReport",
      label: window.wgULS("发起傀儡调查时加入到监视列表", "發起傀儡調查時加入到監視清單"),
      type: "enum",
      enumValues: Twinkle.config.watchlistEnums
    }]
  }, {
    title: window.wgULS("封禁用户", "封鎖使用者"),
    module: "block",
    adminOnly: true,
    preferences: [
      // TwinkleConfig.defaultToBlock64 (boolean)
      // Whether to default to just blocking the /64 on or off
      {
        name: "defaultToBlock64",
        label: window.wgULS("对于IPv6地址,默认选择封禁/64段", "對於IPv6地址,預設選擇封鎖/64段"),
        type: "boolean"
      },
      // TwinkleConfig.defaultToPartialBlocks (boolean)
      // Whether to default partial blocks on or off
      {
        name: "defaultToPartialBlocks",
        label: window.wgULS("打开封禁菜单时默认选择部分封禁", "打開封鎖選單時預設選擇部分封鎖"),
        type: "boolean"
      },
      // TwinkleConfig.watchBlockNotices (string)
      // Watchlist setting for the page which has been dispatched an warning or notice
      {
        name: "watchBlockNotices",
        label: window.wgULS("发送封禁模板时加入用户讨论页到监视列表", "發送封鎖模板時加入使用者討論頁到監視清單"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      {
        name: "customBlockReasonList",
        label: window.wgULS("自定义封禁理由", "自訂封鎖理由"),
        helptip: window.wgULS("您可以加入常用的封禁理由。自定义的封禁理由会出现在一般的封禁理由下方。", "您可以加入常用的封鎖理由。自訂的封鎖理由會出現在一般的封鎖理由下方。"),
        type: "customList",
        customListValueTitle: window.wgULS("使用封禁模板(默认为 uw-block1)", "使用封鎖模板(預設為 uw-block1)"),
        customListLabelTitle: window.wgULS("“由于…您已被封禁”及封禁日志理由", "「由於…您已被封鎖」及封鎖日誌理由")
      }
    ]
  }, {
    title: window.wgULS("图片删除", "圖片刪除"),
    module: "image",
    preferences: [
      // TwinkleConfig.notifyUserOnDeli (boolean)
      // If the user should be notified after placing a file deletion tag
      {
        name: "notifyUserOnDeli",
        label: window.wgULS("默认勾选“通知创建者”", "預設勾選「通知建立者」"),
        type: "boolean"
      },
      // TwinkleConfig.deliWatchPage (string)
      // The watchlist setting of the page tagged for deletion.
      {
        name: "deliWatchPage",
        label: window.wgULS("标记图片时加入到监视列表", "標記圖片時加入到監視清單"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.deliWatchUser (string)
      // The watchlist setting of the user talk page if a notification is placed.
      {
        name: "deliWatchUser",
        label: window.wgULS("标记图片时加入创建者讨论页到监视列表", "標記圖片時加入建立者討論頁到監視清單"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      }
    ]
  }, {
    title: window.wgULS("保护", "保護"),
    module: "protect",
    preferences: [{
      name: "watchRequestedPages",
      label: window.wgULS("请求保护页面时加入到监视列表", "請求保護頁面時加入到監視清單"),
      type: "enum",
      enumValues: Twinkle.config.watchlistEnums
    }, {
      name: "watchPPTaggedPages",
      label: window.wgULS("标记保护模板时加入到监视列表", "標記保護模板時加入到監視清單"),
      type: "enum",
      enumValues: Twinkle.config.watchlistEnums
    }, {
      name: "watchProtectedPages",
      label: window.wgULS("保护时加入到监视列表", "保護時加入到監視清單"),
      helptip: window.wgULS("若在保护后也标记页面,则使用标记页面的参数设置。", "若在保護後也標記頁面,則使用標記頁面的偏好設定。"),
      adminOnly: true,
      type: "enum",
      enumValues: Twinkle.config.watchlistEnums
    }]
  }, {
    title: "回退",
    // twinklefluff module
    module: "fluff",
    preferences: [
      // TwinkleConfig.autoMenuAfterRollback (bool)
      // Option to automatically open the warning menu if the user talk page is opened post-reversion
      {
        name: "autoMenuAfterRollback",
        label: window.wgULS("在Twinkle回退后自动打开用户讨论页上的Twinkle警告菜单", "在Twinkle回退後自動打開使用者討論頁上的Twinkle警告選單"),
        helptip: window.wgULS("仅在选取下方对应框时才执行", "僅在選取下方對應框時才執行"),
        type: "boolean"
      },
      // TwinkleConfig.openTalkPage (array)
      // What types of actions that should result in opening of talk page
      {
        name: "openTalkPage",
        label: window.wgULS("在这些类型的回退后打开用户讨论页", "在這些類別的回退後打開使用者討論頁"),
        type: "set",
        setValues: {
          norm: window.wgULS("常规回退", "常規回退"),
          vand: window.wgULS("破坏回退", "破壞回退")
        }
      },
      // TwinkleConfig.openTalkPageOnAutoRevert (bool)
      // Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
      {
        name: "openTalkPageOnAutoRevert",
        label: window.wgULS("在从用户贡献及最近更改中发起回退时打开用户讨论页", "在從使用者貢獻及近期變更中發起回退時打開使用者討論頁"),
        helptip: window.wgULS("当它打开时,依赖上一个设置。", "當它打開時,依賴上一個設定。"),
        type: "boolean"
      },
      // TwinkleConfig.rollbackInPlace (bool)
      //
      {
        name: "rollbackInPlace",
        label: window.wgULS("在从用户贡献及最近更改中发起回退时不刷新页面", "在從使用者貢獻及近期變更中發起回退時不重新整理頁面"),
        helptip: window.wgULS("当它打开时,Twinkle将不会在从用户贡献及最近更改中发起回退时刷新页面,允许您一次性回退多个编辑。", "當它打開時,Twinkle將不會在從使用者貢獻及近期變更中發起回退時重新整理頁面,允許您一次性回退多個編輯。"),
        type: "boolean"
      },
      // TwinkleConfig.markRevertedPagesAsMinor (array)
      // What types of actions that should result in marking edit as minor
      {
        name: "markRevertedPagesAsMinor",
        label: window.wgULS("将这些类型的回退标记为小修改", "將這些類別的回退標記為小修改"),
        type: "set",
        setValues: {
          norm: window.wgULS("常规回退", "常規回退"),
          vand: window.wgULS("破坏回退", "破壞回退"),
          torev: window.wgULS("“恢复此版本”", "「恢復此版本」")
        }
      },
      // TwinkleConfig.watchRevertedPages (array)
      // What types of actions that should result in forced addition to watchlist
      {
        name: "watchRevertedPages",
        label: window.wgULS("把这些类型的回退加入到监视列表", "把這些類別的回退加入到監視清單"),
        type: "set",
        setValues: {
          norm: window.wgULS("常规回退", "常規回退"),
          vand: window.wgULS("破坏回退", "破壞回退"),
          torev: window.wgULS("“恢复此版本”", "「恢復此版本」")
        }
      },
      // TwinkleConfig.watchRevertedExpiry
      // If any of the above items are selected, whether to expire the watch
      {
        name: "watchRevertedExpiry",
        label: window.wgULS("当回退页面时,加入到监视列表的期限", "當回退頁面時,加入到監視清單的期限"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.offerReasonOnNormalRevert (boolean)
      // If to offer a prompt for extra summary reason for normal reverts, default to true
      {
        name: "offerReasonOnNormalRevert",
        label: window.wgULS("常规回退时询问理由", "常規回退時詢問理由"),
        helptip: window.wgULS("“常规”回退是中间的那个[回退]链接。", "「常規」回退是中間的那個[回退]連結。"),
        type: "boolean"
      },
      {
        name: "confirmOnFluff",
        label: window.wgULS("回退前要求确认(所有设备)", "回退前要求確認(所有裝置)"),
        helptip: window.wgULS("对于使用移动设备的用户,或者意志不坚定的。", "對於使用行動裝置的使用者,或者意志不堅定的。"),
        type: "boolean"
      },
      // TwinkleConfig.showRollbackLinks (array)
      // Where Twinkle should show rollback links:
      // diff, others, mine, contribs, history, recent
      // Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
      {
        name: "showRollbackLinks",
        label: window.wgULS("在这些页面上显示回退链接", "在這些頁面上顯示回退連結"),
        type: "set",
        setValues: {
          diff: window.wgULS("差异", "差異"),
          history: window.wgULS("历史记录", "歷史記錄"),
          others: window.wgULS("其它用户的贡献", "其它使用者的貢獻"),
          mine: window.wgULS("我的贡献", "我的貢獻"),
          recentchanges: window.wgULS("最近更改", "近期變更"),
          recentchangeslinked: window.wgULS("相关更改", "相關變更")
        }
      },
      {
        name: "customRevertSummary",
        label: "回退理由",
        helptip: window.wgULS("在查看差异时可选,仅善意回退、常规回退、恢复此版本", "在檢視差異時可選,僅善意回退、常規回退、恢復此版本"),
        type: "customList",
        customListValueTitle: "理由",
        customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
      }
    ]
  }, {
    title: window.wgULS("快速删除", "快速刪除"),
    module: "speedy",
    preferences: [
      {
        name: "speedySelectionStyle",
        label: window.wgULS("什么时候执行标记或删除", "什麼時候執行標記或刪除"),
        type: "enum",
        enumValues: {
          buttonClick: window.wgULS("当我点“提交”时", "當我點「提交」時"),
          radioClick: window.wgULS("当我点一个选项时", "當我點一個選項時")
        }
      },
      // TwinkleConfig.watchSpeedyPages (array)
      // Whether to add speedy tagged pages to watchlist
      {
        name: "watchSpeedyPages",
        label: window.wgULS("将以下理由加入到监视列表", "將以下理由加入到監視清單"),
        type: "set",
        setValues: Twinkle.config.commonSets.csdCriteria,
        setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
      },
      // TwinkleConfig.watchSpeedyExpiry
      // If any of the above items are selected, whether to expire the watch
      {
        name: "watchSpeedyExpiry",
        label: window.wgULS("当标记页面时,加入到监视列表的期限", "當標記頁面時,加入到監視清單的期限"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
      // If, when applying speedy template to page, to mark the page as patrolled (if the page was reached from NewPages)
      {
        name: "markSpeedyPagesAsPatrolled",
        label: window.wgULS("标记时标记页面为已巡查(如可能)", "標記時標記頁面為已巡查(如可能)"),
        type: "boolean"
      },
      // TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
      // What types of actions should result that the author of the page being notified of nomination
      {
        name: "notifyUserOnSpeedyDeletionNomination",
        label: window.wgULS("仅在使用以下理由时通知页面创建者", "僅在使用以下理由時通知頁面建立者"),
        helptip: window.wgULS("尽管您在对话框中选择通知,通知仍只会在使用这些理由时发出。", "儘管您在對話方塊中選擇通知,通知仍只會在使用這些理由時發出。"),
        type: "set",
        setValues: Twinkle.config.commonSets.csdCriteriaNotification,
        setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
      },
      // TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
      {
        name: "promptForSpeedyDeletionSummary",
        label: window.wgULS("使用以下理由删除时允许编辑删除理由", "使用以下理由刪除時允許編輯刪除理由"),
        adminOnly: true,
        type: "set",
        setValues: Twinkle.config.commonSets.csdAndDICriteria,
        setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
      },
      // TwinkleConfig.openUserTalkPageOnSpeedyDelete (array of strings)
      // What types of actions that should result user talk page to be opened when speedily deleting (admin only)
      {
        name: "openUserTalkPageOnSpeedyDelete",
        label: window.wgULS("使用以下理由时打开用户讨论页", "使用以下理由時打開使用者討論頁"),
        adminOnly: true,
        type: "set",
        setValues: Twinkle.config.commonSets.csdAndDICriteria,
        setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
      },
      // TwinkleConfig.deleteTalkPageOnDelete (boolean)
      // If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
      {
        name: "deleteTalkPageOnDelete",
        label: window.wgULS("默认勾选“删除讨论页”", "預設勾選「刪除討論頁」"),
        adminOnly: true,
        type: "boolean"
      },
      {
        name: "deleteRedirectsOnDelete",
        label: window.wgULS("默认勾选“删除重定向”", "預設勾選「刪除重新導向」"),
        adminOnly: true,
        type: "boolean"
      },
      // TwinkleConfig.deleteSysopDefaultToDelete (boolean)
      // Make the CSD screen default to "delete" instead of "tag" (admin only)
      {
        name: "deleteSysopDefaultToDelete",
        label: window.wgULS("默认为直接删除而不是标记", "預設為直接刪除而不是標記"),
        helptip: window.wgULS("若已放置快速删除标记,则永远默认为删除模式。", "若已放置快速刪除標記,則永遠預設為刪除模式。"),
        adminOnly: true,
        type: "boolean"
      },
      // TwinkleConfig.speedyWindowWidth (integer)
      // Defines the width of the Twinkle SD window in pixels
      {
        name: "speedyWindowWidth",
        label: window.wgULS("快速删除对话框宽度(像素)", "快速刪除對話方塊寬度(像素)"),
        type: "integer"
      },
      // TwinkleConfig.speedyWindowWidth (integer)
      // Defines the width of the Twinkle SD window in pixels
      {
        name: "speedyWindowHeight",
        label: window.wgULS("快速删除对话框高度(像素)", "快速刪除對話方塊高度(像素)"),
        helptip: window.wgULS("若您有一台很大的显示器,您可以将此调高。", "若您有一台很大的顯示器,您可以將此調高。"),
        type: "integer"
      },
      {
        name: "logSpeedyNominations",
        label: window.wgULS("在用户空间中记录所有快速删除提名", "在使用者空間中記錄所有快速刪除提名"),
        helptip: window.wgULS("非管理员无法访问到已删除的贡献,用户空间日志提供了一个很好的方法来记录这些历史。", "非管理員無法存取到已刪除的貢獻,使用者空間日誌提供了一個很好的方法來記錄這些歷史。"),
        type: "boolean"
      },
      {
        name: "speedyLogPageName",
        label: window.wgULS("在此页保留日志", "在此頁保留日誌"),
        helptip: window.wgULS("在此框中输入子页面名称,您将在User:<i>用户名</i>/<i>子页面</i>找到CSD日志。仅在启用日志时工作。", "在此框中輸入子頁面名稱,您將在User:<i>使用者名稱</i>/<i>子頁面</i>找到CSD日誌。僅在啟用日誌時工作。"),
        type: "string"
      },
      {
        name: "noLogOnSpeedyNomination",
        label: window.wgULS("在使用以下理由时不做记录", "在使用以下理由時不做記錄"),
        type: "set",
        setValues: Twinkle.config.commonSets.csdAndDICriteria,
        setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
      },
      {
        name: "enlargeG7Input",
        label: window.wgULS("扩大CSD G7的按钮", "擴大CSD G7的按鈕"),
        helptip: window.wgULS("扩为默认的两倍大。", "擴為預設的兩倍大。"),
        type: "boolean"
      }
    ]
  }, {
    title: window.wgULS("标记", "標記"),
    module: "tag",
    preferences: [{
      name: "watchTaggedPages",
      label: window.wgULS("标记时加入到监视列表", "標記時加入到監視清單"),
      type: "enum",
      enumValues: Twinkle.config.watchlistEnums
    }, {
      name: "watchMergeDiscussions",
      label: window.wgULS("加入合并讨论时监视讨论页", "加入合併討論時監視討論頁"),
      type: "enum",
      enumValues: Twinkle.config.watchlistEnums
    }, {
      name: "markTaggedPagesAsMinor",
      label: window.wgULS("将标记标记为小修改", "將標記標記為小修改"),
      type: "boolean"
    }, {
      name: "markTaggedPagesAsPatrolled",
      label: window.wgULS("默认勾选“标记页面为已巡查”框", "預設勾選「標記頁面為已巡查」框"),
      type: "boolean"
    }, {
      name: "groupByDefault",
      label: window.wgULS("默认勾选“合并到{{multiple issues}}”复选框", "預設勾選「合併到{{multiple issues}}」核取方塊"),
      type: "boolean"
    }, {
      name: "tagArticleSortOrder",
      label: window.wgULS("条目标记的默认查看方式", "條目標記的預設檢視方式"),
      type: "enum",
      enumValues: {
        cat: window.wgULS("按类型", "按類別"),
        alpha: "按字母"
      }
    }, {
      name: "customTagList",
      label: window.wgULS("自定义条目维护标记", "自訂條目維護標記"),
      helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
      type: "customList",
      customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
      customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
    }, {
      name: "customFileTagList",
      label: window.wgULS("自定义文件维护标记", "自訂檔案維護標記"),
      helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
      type: "customList",
      customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
      customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
    }, {
      name: "customRedirectTagList",
      label: window.wgULS("自定义重定向维护标记", "自訂重新導向維護標記"),
      helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
      type: "customList",
      customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
      customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
    }]
  }, {
    title: "小作品",
    module: "stub",
    preferences: [{
      name: "watchStubbedPages",
      label: window.wgULS("标记时加入到监视列表", "標記時加入到監視清單"),
      type: "boolean"
    }, {
      name: "markStubbedPagesAsMinor",
      label: window.wgULS("将小作品标记为小修改", "將小作品標記為小修改"),
      type: "boolean"
    }, {
      name: "markStubbedPagesAsPatrolled",
      label: window.wgULS("默认勾选“标记页面为已巡查”框", "預設勾選「標記頁面為已巡查」框"),
      type: "boolean"
    }, {
      name: "stubArticleSortOrder",
      label: window.wgULS("条目小作品的默认查看方式", "條目小作品的預設檢視方式"),
      type: "enum",
      enumValues: {
        cat: window.wgULS("按类型", "按類別"),
        alpha: "按字母"
      }
    }, {
      name: "customStubList",
      label: window.wgULS("自定义条目小作品标记", "自訂條目小作品標記"),
      helptip: window.wgULS("这些会出现在列表的末尾。", "這些會出現在列表的末尾。"),
      type: "customList",
      customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
      customListLabelTitle: window.wgULS("显示的文字", "顯示的文字")
    }]
  }, {
    title: "通告",
    module: "talkback",
    preferences: [{
      name: "markTalkbackAsMinor",
      label: window.wgULS("将通告标记为小修改", "將通告標記為小修改"),
      type: "boolean"
    }, {
      name: "insertTalkbackSignature",
      label: window.wgULS("通告时加入签名", "通告時加入簽名"),
      type: "boolean"
    }, {
      name: "talkbackHeading",
      label: window.wgULS("通告所用的小节标题", "通告所用的小節標題"),
      type: "string"
    }, {
      name: "mailHeading",
      label: window.wgULS("“有新邮件”所用的小节标题", "「有新郵件」所用的小節標題"),
      type: "string"
    }]
  }, {
    title: window.wgULS("取消链入", "取消連入"),
    module: "unlink",
    preferences: [
      // TwinkleConfig.unlinkNamespaces (array)
      // In what namespaces unlink should happen, default in 0 (article) and 100 (portal)
      {
        name: "unlinkNamespaces",
        label: window.wgULS("取消以下命名空间中的反向链接", "取消以下命名空間中的反向連結"),
        helptip: window.wgULS("请避免选择讨论页,因这样会导致Twinkle试图修改讨论存档。", "請避免選擇討論頁,因這樣會導致Twinkle試圖修改討論存檔。"),
        type: "set",
        setValues: Twinkle.config.commonSets.namespacesNoSpecial
      }
    ]
  }, {
    title: window.wgULS("警告用户", "警告使用者"),
    module: "warn",
    preferences: [
      // TwinkleConfig.defaultWarningGroup (int)
      // if true, watch the page which has been dispatched an warning or notice, if false, default applies
      {
        name: "defaultWarningGroup",
        label: window.wgULS("默认警告级别", "預設警告級別"),
        type: "enum",
        enumValues: {
          1: "1:注意",
          2: "2:警告",
          3: window.wgULS("单层级提醒", "單層級提醒"),
          4: window.wgULS("单层级警告", "單層級警告"),
          5: window.wgULS("自定义提醒或警告", "自訂提醒或警告"),
          6: "所有警告模板",
          7: window.wgULS("自动选择层级", "自動選擇層級")
          // 8 was used for block templates before #260
          // 9 was deprecated
          // 10 was deprecated
          // 11 was deprecated
        }
      },
      // TwinkleConfig.combinedSingletMenus (boolean)
      // if true, show one menu with both single-issue notices and warnings instead of two separately
      {
        name: "combinedSingletMenus",
        label: window.wgULS("将两个单层级菜单合并成一个", "將兩個單層級選單合併成一個"),
        helptip: window.wgULS("当启用此选项时,无论默认警告级别选择单层级通知或单层级警告皆属于此项。", "當啟用此選項時,無論預設警告級別選擇單層級通知或單層級警告皆屬於此項。"),
        type: "boolean"
      },
      // TwinkleConfig.watchWarnings (string)
      // Watchlist setting for the page which has been dispatched an warning or notice
      {
        name: "watchWarnings",
        label: window.wgULS("警告时加入用户讨论页到监视列表", "警告時加入使用者討論頁到監視清單"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.oldSelect (boolean)
      // if true, use the native select menu rather the jquery chosen-based one
      {
        name: "oldSelect",
        label: window.wgULS("使用不可搜索的经典菜单", "使用不可搜尋的經典選單"),
        type: "boolean"
      },
      {
        name: "customWarningList",
        label: window.wgULS("自定义警告模板", "自訂警告模板"),
        helptip: window.wgULS("您可以加入模板或用户子页面。自定义警告会出现在警告对话框中“自定义警告”一节。", "您可以加入模板或使用者子頁面。自訂警告會出現在警告對話方塊中「自訂警告」一節。"),
        type: "customList",
        customListValueTitle: window.wgULS("模板名(不含大括号)", "模板名(不含大括號)"),
        customListLabelTitle: window.wgULS("显示的文字(和编辑摘要)", "顯示的文字(和編輯摘要)")
      }
    ]
  }, {
    title: window.wgULS("存废讨论", "存廢討論"),
    module: "xfd",
    preferences: [
      {
        name: "logXfdNominations",
        label: window.wgULS("在用户空间中记录所有存废讨论提名", "在使用者空間中記錄所有存廢討論提名"),
        helptip: window.wgULS("该日志供您追踪所有通过Twinkle提交的存废讨论", "該日誌供您追蹤所有透過Twinkle提交的存廢討論"),
        type: "boolean"
      },
      {
        name: "xfdLogPageName",
        label: window.wgULS("在此页保留日志", "在此頁保留日誌"),
        helptip: window.wgULS("在此框中输入子页面名称,您将在User:<i>用户名</i>/<i>子页面</i>找到XFD日志。仅在启用日志时工作。", "在此框中輸入子頁面名稱,您將在User:<i>使用者名稱</i>/<i>子頁面</i>找到XFD日誌。僅在啟用日誌時工作。"),
        type: "string"
      },
      {
        name: "noLogOnXfdNomination",
        label: window.wgULS("在使用以下理由时不做记录", "在使用以下理由時不做記錄"),
        type: "set",
        setValues: Twinkle.config.commonSets.xfdCriteria,
        setDisplayOrder: Twinkle.config.commonSets.xfdCriteriaDisplayOrder
      },
      // TwinkleConfig.xfdWatchPage (string)
      // The watchlist setting of the page being nominated for XfD.
      {
        name: "xfdWatchPage",
        label: window.wgULS("加入提名的页面到监视列表", "加入提名的頁面到監視清單"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.xfdWatchDiscussion (string)
      // The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
      // or the list page for the other processes.
      {
        name: "xfdWatchDiscussion",
        label: window.wgULS("加入存废讨论页到监视列表", "加入存廢討論頁到監視清單"),
        helptip: window.wgULS("当日的页面。", "當日的頁面。"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.xfdWatchUser (string)
      // The watchlist setting of the user talk page if they receive a notification.
      {
        name: "xfdWatchUser",
        label: window.wgULS("加入创建者讨论页到监视列表(在通知时)", "加入建立者討論頁到監視清單(在通知時)"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      {
        name: "markXfdPagesAsPatrolled",
        label: window.wgULS("标记时标记页面为已巡查(如可能)", "標記時標記頁面為已巡查(如可能)"),
        helptip: window.wgULS("基于技术原因,页面仅会在由Special:NewPages到达时被标记为已巡查。", "基於技術原因,頁面僅會在由Special:NewPages到達時被標記為已巡查。"),
        type: "boolean"
      },
      {
        name: "FwdCsdToXfd",
        label: window.wgULS("提删类型增加转交自快速删除候选", "提刪類別增加轉交自快速刪除候選"),
        helptip: window.wgULS("请确保您充分了解[[LIB:快速删除条例]]才开启此功能。", "請確保您充分了解[[LIB:快速刪除條例]]才開啟此功能。"),
        type: "boolean"
      },
      {
        name: "afdDefaultCategory",
        label: window.wgULS("默认提删类型", "預設提刪類別"),
        helptip: window.wgULS("若选择“相同于上次选择”将使用localStorage来记忆。", "若選擇「相同於上次選擇」將使用localStorage來記憶。"),
        type: "enum",
        enumValues: {
          delete: window.wgULS("删除", "刪除"),
          same: window.wgULS("相同于上次选择", "相同於上次選擇")
        }
      },
      {
        name: "afdFameDefaultReason",
        label: window.wgULS("默认关注度提删理由", "預設關注度提刪理由"),
        helptip: window.wgULS("用于批量提删。", "用於批次提刪。"),
        type: "string"
      },
      {
        name: "afdSubstubDefaultReason",
        label: window.wgULS("默认小小作品提删理由", "預設小小作品提刪理由"),
        helptip: window.wgULS("用于批量提删。", "用於批次提刪。"),
        type: "string"
      }
    ]
  }, {
    title: window.wgULS("关闭存废讨论", "關閉存廢討論"),
    module: "close",
    preferences: [{
      name: "XfdClose",
      label: window.wgULS("在存废讨论显示关闭讨论按钮", "在存廢討論顯示關閉討論按鈕"),
      helptip: window.wgULS("请确保您充分了解[[LIB:删除条例]]才开启此功能。", "請確保您充分了解[[LIB:刪除條例]]才開啟此功能。"),
      type: "enum",
      enumValues: {
        hide: window.wgULS("不显示", "不顯示"),
        nonadminonly: window.wgULS("只包含非管理员可使用选项", "只包含非管理員可使用選項"),
        all: window.wgULS("显示所有选项", "顯示所有選項")
      }
    }]
  }, {
    title: window.wgULS("侵犯著作权", "侵犯著作權"),
    module: "copyvio",
    preferences: [
      // TwinkleConfig.copyvioWatchPage (string)
      // The watchlist setting of the page being nominated for XfD.
      {
        name: "copyvioWatchPage",
        label: window.wgULS("加入提报的页面到监视列表", "加入提報的頁面到監視清單"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.copyvioWatchUser (string)
      // The watchlist setting of the user if he receives a notification.
      {
        name: "copyvioWatchUser",
        label: window.wgULS("加入创建者讨论页到监视列表(在通知时)", "加入建立者討論頁到監視清單(在通知時)"),
        type: "enum",
        enumValues: Twinkle.config.watchlistEnums
      },
      // TwinkleConfig.markCopyvioPagesAsPatrolled (boolean)
      // If, when applying copyvio template to page, to mark the page as patrolled (if the page was reached from NewPages)
      {
        name: "markCopyvioPagesAsPatrolled",
        label: window.wgULS("标记时标记页面为已巡查(如可能)", "標記時標記頁面為已巡查(如可能)"),
        helptip: window.wgULS("基于技术原因,页面仅会在由Special:NewPages到达时被标记为已巡查。", "基於技術原因,頁面僅會在由Special:NewPages到達時被標記為已巡查。"),
        type: "boolean"
      }
    ]
  }, {
    title: window.wgULS("隐藏", "隱藏"),
    hidden: true,
    preferences: [
      // twinkle.js: portlet setup
      {
        name: "portletArea",
        type: "string"
      },
      {
        name: "portletId",
        type: "string"
      },
      {
        name: "portletName",
        type: "string"
      },
      {
        name: "portletType",
        type: "string"
      },
      {
        name: "portletNext",
        type: "string"
      },
      // twinklefluff.js: defines how many revision to query maximum, maximum possible is 50, default is 50
      {
        name: "revertMaxRevisions",
        type: "integer"
      },
      // twinklebatchdelete.js: How many pages should be processed maximum
      {
        name: "batchMax",
        type: "integer",
        adminOnly: true
      },
      // How many pages should be processed at a time by deprod and batchdelete/protect/undelete
      {
        name: "batchChunks",
        type: "integer",
        adminOnly: true
      }
    ]
  }];
  Twinkle.config.init = () => {
    if (mw.config.get("wgPageName") === Twinkle.getPref("configPage") && mw.config.get("wgAction") === "view") {
      if (!document.querySelector("#twinkle-config")) {
        return;
      }
      const contentdiv = document.querySelector("#twinkle-config-content");
      contentdiv.textContent = "";
      const toctable = document.createElement("div");
      toctable.className = "toc";
      toctable.style.marginLeft = "0.4em";
      const toctitle = document.createElement("div");
      toctitle.id = "toctitle";
      const toch2 = document.createElement("h2");
      toch2.textContent = window.wgULS("目录 ", "目錄 ");
      toctitle.appendChild(toch2);
      const toctoggle = document.createElement("span");
      toctoggle.className = "toctoggle";
      toctoggle.appendChild(document.createTextNode("["));
      const toctogglelink = document.createElement("a");
      toctogglelink.className = "internal";
      toctogglelink.setAttribute("href", "#tw-tocshowhide");
      toctogglelink.textContent = window.wgULS("隐藏", "隱藏");
      toctoggle.appendChild(toctogglelink);
      toctoggle.appendChild(document.createTextNode("]"));
      toctitle.appendChild(toctoggle);
      toctable.appendChild(toctitle);
      const tocul = document.createElement("ul");
      toctogglelink.addEventListener("click", () => {
        const $tocul = $(tocul);
        $tocul.toggle();
        if ($tocul.find(":visible").length) {
          toctogglelink.textContent = window.wgULS("隐藏", "隱藏");
        } else {
          toctogglelink.textContent = window.wgULS("显示", "顯示");
        }
      }, false);
      toctable.appendChild(tocul);
      contentdiv.appendChild(toctable);
      const contentform = document.createElement("form");
      contentform.setAttribute("action", "javascript:void(0)");
      contentform.addEventListener("submit", Twinkle.config.save, true);
      contentdiv.appendChild(contentform);
      const container = document.createElement("table");
      container.style.width = "100%";
      contentform.appendChild(container);
      $(Twinkle.config.sections).each((sectionkey, section) => {
        if (section.hidden || section.adminOnly && !Morebits.userIsSysop) {
          return true;
        }
        const tocli = document.createElement("li");
        tocli.className = "toclevel-1";
        const toca = document.createElement("a");
        toca.setAttribute("href", "#".concat(section.module));
        toca.appendChild(document.createTextNode(section.title));
        tocli.appendChild(toca);
        tocul.appendChild(tocli);
        let row = document.createElement("tr");
        let cell = document.createElement("td");
        cell.setAttribute("colspan", "3");
        const heading = document.createElement("h4");
        heading.style.borderBottom = "1px solid #808080";
        heading.style.marginTop = "0.2em";
        heading.id = section.module;
        heading.appendChild(document.createTextNode(section.title));
        cell.appendChild(heading);
        row.appendChild(cell);
        container.appendChild(row);
        let rowcount = 1;
        $(section.preferences).each((prefkey, pref) => {
          if (pref.adminOnly && !Morebits.userIsSysop) {
            return true;
          }
          row = document.createElement("tr");
          row.style.marginBottom = "0.2em";
          if (rowcount++ % 2 === 0) {
            row.style.backgroundColor = "rgb(128 128 128/.1)";
          }
          cell = document.createElement("td");
          let label;
          let input;
          const gotPref = Twinkle.getPref(pref.name);
          switch (pref.type) {
            case "boolean":
              cell.setAttribute("colspan", "2");
              label = document.createElement("label");
              input = document.createElement("input");
              input.setAttribute("type", "checkbox");
              input.setAttribute("id", pref.name);
              input.setAttribute("name", pref.name);
              if (gotPref === true) {
                input.checked = true;
              }
              label.appendChild(input);
              label.appendChild(document.createTextNode(pref.label));
              cell.appendChild(label);
              break;
            case "string":
            case "integer":
              cell.style.textAlign = "right";
              cell.style.paddingRight = "0.5em";
              label = document.createElement("label");
              label.setAttribute("for", pref.name);
              label.appendChild(document.createTextNode("".concat(pref.label, ":")));
              cell.appendChild(label);
              row.appendChild(cell);
              cell = document.createElement("td");
              cell.style.paddingRight = "1em";
              input = document.createElement("input");
              input.setAttribute("type", "text");
              input.setAttribute("id", pref.name);
              input.setAttribute("name", pref.name);
              if (pref.type === "integer") {
                input.setAttribute("size", 6);
                input.setAttribute("type", "number");
                input.setAttribute("step", "1");
              }
              if (gotPref) {
                input.setAttribute("value", gotPref);
              }
              cell.appendChild(input);
              break;
            case "enum": {
              cell.style.textAlign = "right";
              cell.style.paddingRight = "0.5em";
              label = document.createElement("label");
              label.setAttribute("for", pref.name);
              label.appendChild(document.createTextNode("".concat(pref.label, ":")));
              cell.appendChild(label);
              row.appendChild(cell);
              cell = document.createElement("td");
              cell.style.paddingRight = "1em";
              input = document.createElement("select");
              input.setAttribute("id", pref.name);
              input.setAttribute("name", pref.name);
              let optionExists = false;
              for (var _i17 = 0, _Object$entries10 = Object.entries(pref.enumValues); _i17 < _Object$entries10.length; _i17++) {
                const [enumvalue, enumdisplay] = _Object$entries10[_i17];
                const option = document.createElement("option");
                option.setAttribute("value", enumvalue);
                if (gotPref === enumvalue || // Hack to convert old boolean watchlist prefs
                // to corresponding enums (added in v2.1)
                typeof gotPref === "boolean" && (gotPref && enumvalue === "yes" || !gotPref && enumvalue === "no")) {
                  option.setAttribute("selected", "selected");
                  optionExists = true;
                }
                option.appendChild(document.createTextNode(enumdisplay));
                input.appendChild(option);
              }
              if (!optionExists) {
                const option = document.createElement("option");
                option.setAttribute("value", gotPref);
                option.setAttribute("selected", "selected");
                option.appendChild(document.createTextNode(gotPref));
                input.appendChild(option);
              }
              cell.appendChild(input);
              break;
            }
            case "set": {
              cell.setAttribute("colspan", "2");
              label = document.createElement("label");
              label.appendChild(document.createTextNode("".concat(pref.label, ":")));
              cell.appendChild(label);
              const checkdiv = document.createElement("div");
              checkdiv.style.paddingLeft = "1em";
              const worker = (itemkey, itemvalue) => {
                const checklabel = document.createElement("label");
                checklabel.style.marginRight = "0.7em";
                checklabel.style.display = "inline-block";
                const check = document.createElement("input");
                check.setAttribute("type", "checkbox");
                check.setAttribute("id", "".concat(pref.name, "_").concat(itemkey));
                check.setAttribute("name", "".concat(pref.name, "_").concat(itemkey));
                if (gotPref && gotPref.includes(itemkey)) {
                  check.checked = true;
                }
                if (pref.name === "unlinkNamespaces" && gotPref && gotPref.includes(Number.parseInt(itemkey, 10))) {
                  check.checked = true;
                }
                checklabel.appendChild(check);
                checklabel.appendChild(document.createTextNode(itemvalue));
                checkdiv.appendChild(checklabel);
              };
              if (pref.setDisplayOrder) {
                var _iterator67 = _createForOfIteratorHelper(pref.setDisplayOrder), _step67;
                try {
                  for (_iterator67.s(); !(_step67 = _iterator67.n()).done; ) {
                    const item = _step67.value;
                    worker(item, pref.setValues[item]);
                  }
                } catch (err) {
                  _iterator67.e(err);
                } finally {
                  _iterator67.f();
                }
              } else {
                for (var _i18 = 0, _Object$entries11 = Object.entries(pref.setValues); _i18 < _Object$entries11.length; _i18++) {
                  const [itemkey, itemvalue] = _Object$entries11[_i18];
                  worker(itemkey, itemvalue);
                }
              }
              cell.appendChild(checkdiv);
              break;
            }
            case "customList": {
              cell.style.textAlign = "right";
              cell.style.paddingRight = "0.5em";
              label = document.createElement("label");
              label.setAttribute("for", pref.name);
              label.appendChild(document.createTextNode("".concat(pref.label, ":")));
              cell.appendChild(label);
              row.appendChild(cell);
              cell = document.createElement("td");
              cell.style.paddingRight = "1em";
              const customListButton = document.createElement("button");
              customListButton.setAttribute("id", pref.name);
              customListButton.setAttribute("name", pref.name);
              customListButton.setAttribute("type", "button");
              customListButton.addEventListener("click", Twinkle.config.listDialog.display, false);
              $(customListButton).data({
                value: gotPref,
                pref
              });
              customListButton.appendChild(document.createTextNode(window.wgULS("编辑项目", "編輯項目")));
              cell.appendChild(customListButton);
              break;
            }
            default:
              mw.notify("twinkleconfig: 未知类型的属性 ".concat(pref.name), {
                type: "warn",
                tag: "twinkleconfig"
              });
              break;
          }
          row.appendChild(cell);
          cell = document.createElement("td");
          cell.style.fontSize = "90%";
          cell.style.color = "gray";
          if (pref.helptip) {
            cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g, '{{<a href="'.concat(mw.util.getUrl("Template:"), '$1" rel="noopener" target="_blank">$1</a>}}')).replace(/\[\[(.+?)]]/g, '<a href="'.concat(mw.util.getUrl(""), '$1" rel="noopener" target="_blank">$1</a>'));
          }
          if (pref.type !== "customList") {
            const resetlink = document.createElement("a");
            resetlink.setAttribute("href", "#tw-reset");
            resetlink.setAttribute("id", "twinkle-config-reset-".concat(pref.name));
            resetlink.addEventListener("click", Twinkle.config.resetPrefLink, false);
            resetlink.style.cssFloat = "right";
            resetlink.style.margin = "0 0.6em";
            resetlink.appendChild(document.createTextNode(window.wgULS("复位", "復位")));
            cell.appendChild(resetlink);
          }
          row.appendChild(cell);
          container.appendChild(row);
          return true;
        });
        return true;
      });
      const footerbox = document.createElement("div");
      footerbox.setAttribute("id", "twinkle-config-buttonpane");
      footerbox.style.backgroundColor = "#BCCADF";
      footerbox.style.padding = "0.5em";
      const submitButton = document.createElement("button");
      submitButton.setAttribute("id", "twinkle-config-submit");
      submitButton.setAttribute("type", "submit");
      submitButton.appendChild(document.createTextNode(window.wgULS("保存修改", "儲存修改")));
      footerbox.appendChild(submitButton);
      const footerspan = document.createElement("span");
      footerspan.className = "plainlinks";
      footerspan.style.marginLeft = "2.4em";
      footerspan.style.fontSize = "90%";
      const footera = document.createElement("a");
      footera.setAttribute("href", "#tw-reset-all");
      footera.setAttribute("id", "twinkle-config-resetall");
      footera.addEventListener("click", Twinkle.config.resetAllPrefs, false);
      footera.appendChild(document.createTextNode(window.wgULS("恢复默认", "恢復預設")));
      footerspan.appendChild(footera);
      footerbox.appendChild(footerspan);
      contentform.appendChild(footerbox);
      if (window.location.hash) {
        const loc = window.location.hash;
        window.location.hash = "";
        window.location.hash = loc;
      }
    } else if (mw.config.get("wgNamespaceNumber") === mw.config.get("wgNamespaceIds").user && mw.config.get("wgTitle").indexOf(mw.config.get("wgUserName")) === 0 && mw.config.get("wgPageName").slice(-3) === ".js") {
      const box = document.createElement("div");
      box.setAttribute("id", "twinkle-config-headerbox");
      let link;
      const scriptPageName = mw.config.get("wgPageName").slice(mw.config.get("wgPageName").lastIndexOf("/") + 1, mw.config.get("wgPageName").lastIndexOf(".js"));
      if (scriptPageName === "twinkleoptions") {
        box.setAttribute("class", "config-twopt-box");
        if (mw.config.get("wgArticleId") > 0) {
          box.appendChild(document.createTextNode(window.wgULS("这页包含您的Twinkle参数设置,您可使用", "這頁包含您的Twinkle偏好設定,您可使用")));
        } else {
          box.appendChild(document.createTextNode(window.wgULS("您可配置您的Twinkle,通过使用", "您可配置您的Twinkle,通過使用")));
        }
        link = document.createElement("a");
        link.setAttribute("href", mw.util.getUrl(Twinkle.getPref("configPage")));
        link.appendChild(document.createTextNode(window.wgULS("Twinkle参数设置面板", "Twinkle偏好設定面板")));
        box.appendChild(link);
        box.appendChild(document.createTextNode(window.wgULS(",或直接编辑本页。", ",或直接編輯本頁。")));
        $(box).insertAfter($body.find("#contentSub"));
      } else if (["vector", "vector-2022", "gongbi", "citizen", "common"].includes(scriptPageName)) {
        box.setAttribute("class", "config-userskin-box");
        box.appendChild(document.createTextNode(window.wgULS("若您想配置您的Twinkle,请使用", "若您想配置您的Twinkle,請使用")));
        link = document.createElement("a");
        link.setAttribute("href", mw.util.getUrl(Twinkle.getPref("configPage")));
        link.appendChild(document.createTextNode(window.wgULS("Twinkle参数设置面板", "Twinkle偏好設定面板")));
        box.appendChild(link);
        box.appendChild(document.createTextNode("。"));
        $(box).insertAfter($body.find("#contentSub"));
      }
    }
  };
  Twinkle.config.listDialog = {};
  Twinkle.config.listDialog.addRow = (dlgtable, value, label) => {
    const contenttr = document.createElement("tr");
    let contenttd = document.createElement("td");
    const removeButton = document.createElement("button");
    removeButton.setAttribute("type", "button");
    removeButton.addEventListener("click", () => {
      $(contenttr).remove();
    }, false);
    removeButton.textContent = "移除";
    contenttd.appendChild(removeButton);
    contenttr.appendChild(contenttd);
    contenttd = document.createElement("td");
    let input = document.createElement("input");
    input.setAttribute("type", "text");
    input.className = "twinkle-config-customlist-value";
    input.style.width = "97%";
    if (value) {
      input.setAttribute("value", value);
    }
    contenttd.appendChild(input);
    contenttr.appendChild(contenttd);
    contenttd = document.createElement("td");
    input = document.createElement("input");
    input.setAttribute("type", "text");
    input.className = "twinkle-config-customlist-label";
    input.style.width = "98%";
    if (label) {
      input.setAttribute("value", label);
    }
    contenttd.appendChild(input);
    contenttr.appendChild(contenttd);
    dlgtable.appendChild(contenttr);
  };
  Twinkle.config.listDialog.display = (e) => {
    var _curpref$customListVa, _curpref$customListLa;
    const $prefbutton = $(e.target);
    const curvalue = $prefbutton.data("value");
    const curpref = $prefbutton.data("pref");
    const dialog = new Morebits.simpleWindow(720, 400);
    dialog.setTitle(curpref.label);
    dialog.setScriptName(window.wgULS("Twinkle参数设置", "Twinkle偏好設定"));
    const dialogcontent = document.createElement("div");
    const dlgtable = document.createElement("table");
    dlgtable.className = "wikitable";
    dlgtable.style.margin = "1.4em 1em";
    dlgtable.style.width = "97%";
    const dlgtbody = document.createElement("tbody");
    let dlgtr = document.createElement("tr");
    let dlgth = document.createElement("th");
    dlgth.style.width = "5%";
    dlgtr.appendChild(dlgth);
    dlgth = document.createElement("th");
    dlgth.style.width = "35%";
    dlgth.textContent = (_curpref$customListVa = curpref.customListValueTitle) !== null && _curpref$customListVa !== void 0 ? _curpref$customListVa : window.wgULS("数值", "數值");
    dlgtr.appendChild(dlgth);
    dlgth = document.createElement("th");
    dlgth.style.width = "60%";
    dlgth.textContent = (_curpref$customListLa = curpref.customListLabelTitle) !== null && _curpref$customListLa !== void 0 ? _curpref$customListLa : window.wgULS("标签", "標籤");
    dlgtr.appendChild(dlgth);
    dlgtbody.appendChild(dlgtr);
    let gotRow = false;
    var _iterator68 = _createForOfIteratorHelper(curvalue), _step68;
    try {
      for (_iterator68.s(); !(_step68 = _iterator68.n()).done; ) {
        const v = _step68.value;
        gotRow = true;
        Twinkle.config.listDialog.addRow(dlgtbody, v.value, v.label);
      }
    } catch (err) {
      _iterator68.e(err);
    } finally {
      _iterator68.f();
    }
    if (!gotRow) {
      Twinkle.config.listDialog.addRow(dlgtbody);
    }
    const dlgtfoot = document.createElement("tfoot");
    dlgtr = document.createElement("tr");
    const dlgtd = document.createElement("td");
    dlgtd.setAttribute("colspan", "3");
    const addButton = document.createElement("button");
    addButton.style.minWidth = "8em";
    addButton.setAttribute("type", "button");
    addButton.addEventListener("click", () => {
      Twinkle.config.listDialog.addRow(dlgtbody);
    }, false);
    addButton.textContent = "添加";
    dlgtd.appendChild(addButton);
    dlgtr.appendChild(dlgtd);
    dlgtfoot.appendChild(dlgtr);
    dlgtable.appendChild(dlgtbody);
    dlgtable.appendChild(dlgtfoot);
    dialogcontent.appendChild(dlgtable);
    let button = document.createElement("button");
    button.setAttribute("type", "submit");
    button.addEventListener("click", () => {
      Twinkle.config.listDialog.save($prefbutton, dlgtbody);
      dialog.close();
    }, false);
    button.textContent = window.wgULS("保存修改", "儲存修改");
    dialogcontent.appendChild(button);
    button = document.createElement("button");
    button.setAttribute("type", "submit");
    button.addEventListener("click", () => {
      Twinkle.config.listDialog.reset($prefbutton, dlgtbody);
    }, false);
    button.textContent = window.wgULS("复位", "復位");
    dialogcontent.appendChild(button);
    button = document.createElement("button");
    button.setAttribute("type", "submit");
    button.addEventListener("click", () => {
      dialog.close();
    }, false);
    button.textContent = "取消";
    dialogcontent.appendChild(button);
    dialog.setContent(dialogcontent);
    dialog.display();
  };
  Twinkle.config.listDialog.reset = (button, tbody) => {
    const $button = $(button);
    const curpref = $button.data("pref");
    const oldvalue = $button.data("value");
    Twinkle.config.resetPref(curpref);
    const $tbody = $(tbody);
    $tbody.find("tr").slice(1).remove();
    const curvalue = $button.data("value");
    var _iterator69 = _createForOfIteratorHelper(curvalue), _step69;
    try {
      for (_iterator69.s(); !(_step69 = _iterator69.n()).done; ) {
        const v = _step69.value;
        Twinkle.config.listDialog.addRow(tbody, v.value, v.label);
      }
    } catch (err) {
      _iterator69.e(err);
    } finally {
      _iterator69.f();
    }
    $button.data("value", oldvalue);
  };
  Twinkle.config.listDialog.save = (button, tbody) => {
    const result = [];
    let current = {};
    $(tbody).find('input[type="text"]').each((inputkey, input) => {
      if ($(input).hasClass("twinkle-config-customlist-value")) {
        current = {
          value: input.value
        };
      } else {
        current.label = input.value;
        if (current.value || current.label) {
          result.push(current);
        }
      }
    });
    $(button).data("value", result);
  };
  Twinkle.config.resetPrefLink = (e) => {
    const wantedpref = e.target.id.slice(21);
    $(Twinkle.config.sections).each((sectionkey, section) => {
      if (section.hidden || section.adminOnly && !Morebits.userIsSysop) {
        return true;
      }
      let foundit = false;
      $(section.preferences).each((prefkey, pref) => {
        if (pref.name !== wantedpref) {
          return true;
        }
        Twinkle.config.resetPref(pref);
        foundit = true;
        return false;
      });
      if (foundit) {
        return false;
      }
    });
    return false;
  };
  Twinkle.config.resetPref = (pref) => {
    switch (pref.type) {
      case "boolean":
        document.querySelector("#".concat(pref.name)).checked = Twinkle.defaultConfig[pref.name];
        break;
      case "string":
      case "integer":
      case "enum":
        document.querySelector("#".concat(pref.name)).value = Twinkle.defaultConfig[pref.name];
        break;
      case "set":
        for (var _i19 = 0, _Object$entries12 = Object.entries(pref.setValues); _i19 < _Object$entries12.length; _i19++) {
          const [itemkey] = _Object$entries12[_i19];
          if (document.querySelector("#".concat(pref.name, "_").concat(itemkey))) {
            document.querySelector("#".concat(pref.name, "_").concat(itemkey)).checked = Twinkle.defaultConfig[pref.name].includes(itemkey);
          }
        }
        break;
      case "customList":
        $(document.querySelector("#".concat(pref.name))).data("value", Twinkle.defaultConfig[pref.name]);
        break;
      default:
        mw.notify("twinkleconfig: unknown data type for preference ".concat(pref.name), {
          type: "warn",
          tag: "twinkleconfig"
        });
        break;
    }
  };
  Twinkle.config.resetAllPrefs = () => {
    $(Twinkle.config.sections).each((sectionkey, section) => {
      if (section.hidden || section.adminOnly && !Morebits.userIsSysop) {
        return true;
      }
      $(section.preferences).each((prefkey, pref) => {
        if (!pref.adminOnly || Morebits.userIsSysop) {
          Twinkle.config.resetPref(pref);
        }
      });
      return true;
    });
    return false;
  };
  Twinkle.config.save = (e) => {
    Morebits.status.init(document.querySelector("#twinkle-config-content"));
    const userjs = "".concat(mw.config.get("wgFormattedNamespaces")[mw.config.get("wgNamespaceIds").user], ":").concat(mw.config.get("wgUserName"), "/twinkleoptions.js");
    const ysarchives_page = new Morebits.wiki.page(userjs, window.wgULS("保存参数设置到 ", "儲存偏好設定到 ") + userjs);
    ysarchives_page.setCallbackParameters(e.target);
    ysarchives_page.load(Twinkle.config.writePrefs);
    return false;
  };
  Twinkle.config.writePrefs = (pageobj) => {
    const form = pageobj.getCallbackParameters();
    const newConfig = {
      optionsVersion: 2.1
    };
    const compare = (a, b) => {
      if (Array.isArray(a)) {
        if (a.length !== b.length) {
          return false;
        }
        a.sort();
        b.sort();
        for (let i = 0; a[i]; ++i) {
          if (typeof a[i] === "object" && (a[i].label !== b[i].label || a[i].value !== b[i].value)) {
            return false;
          } else if (a[i].toString() !== b[i].toString()) {
            return false;
          }
        }
        return true;
      }
      return a === b;
    };
    $(Twinkle.config.sections).each((sectionkey, section) => {
      if (section.adminOnly && !Morebits.userIsSysop) {
        return;
      }
      $(section.preferences).each((prefkey, pref) => {
        let userValue;
        if (!pref.adminOnly || Morebits.userIsSysop) {
          if (!section.hidden) {
            switch (pref.type) {
              case "boolean":
                userValue = form[pref.name].checked;
                break;
              case "string":
              case "enum":
                userValue = form[pref.name].value;
                break;
              case "integer":
                userValue = Number.parseInt(form[pref.name].value, 10);
                if (Number.isNaN(userValue)) {
                  Morebits.status.warn(window.wgULS("保存", "儲存"), "".concat(window.wgULS("您为 ", "您為 ") + pref.name, " 指定的值(").concat(pref.value).concat(window.wgULS(")不合法,会继续保存操作,但此值将会跳过。", ")不合法,會繼續儲存操作,但此值將會跳過。")));
                  userValue = null;
                }
                break;
              case "set":
                userValue = [];
                if (pref.setDisplayOrder) {
                  var _iterator70 = _createForOfIteratorHelper(pref.setDisplayOrder), _step70;
                  try {
                    for (_iterator70.s(); !(_step70 = _iterator70.n()).done; ) {
                      const item = _step70.value;
                      if (form["".concat(pref.name, "_").concat(item)].checked) {
                        userValue.push(item);
                      }
                    }
                  } catch (err) {
                    _iterator70.e(err);
                  } finally {
                    _iterator70.f();
                  }
                } else {
                  for (var _i20 = 0, _Object$entries13 = Object.entries(pref.setValues); _i20 < _Object$entries13.length; _i20++) {
                    const [itemkey] = _Object$entries13[_i20];
                    if (form["".concat(pref.name, "_").concat(itemkey)].checked) {
                      userValue.push(itemkey);
                    }
                  }
                }
                break;
              case "customList":
                userValue = $(form[pref.name]).data("value");
                break;
              default:
                mw.notify("twinkleconfig: 未知数据类型,属性 ".concat(pref.name), {
                  type: "warn",
                  tag: "twinkleconfig"
                });
                break;
            }
          } else if (Twinkle.prefs) {
            userValue = Twinkle.prefs[pref.name];
          }
        }
        if (userValue !== void 0 && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
          newConfig[pref.name] = userValue;
        }
      });
    });
    const nowiki = "nowiki";
    let text = "// <".concat(nowiki, ">\n").concat(window.wgULS("// twinkleoptions.js:用户Twinkle参数设置文件\n//\n// 注:修改您的参数设置最简单的办法是使用\n// Twinkle参数设置面板,在[[".concat(Morebits.pageNameNorm, "]]。\n//\n// 这个文件是自动生成的,您所做的任何修改(除了\n// 以一种合法的JavaScript的方式来修改这些属性值)会\n// 在下一次您点击“保存”时被覆盖。\n// 修改此文件时,请记得使用合法的JavaScript。\n"), "// twinkleoptions.js:使用者Twinkle參數設定檔案\n//\n// 註:修改您的參數設定最簡單的辦法是使用\n// Twinkle參數設定面板,在[[".concat(Morebits.pageNameNorm, "]]。\n//\n// 這個檔案是自動產生的,您所做的任何修改(除了\n// 以一種合法的JavaScript的方式來修改這些屬性值)會\n// 在下一次您點擊「儲存」時被覆蓋。\n// 修改此檔案時,請記得使用合法的JavaScript。\n")));
    text += "\nwindow.Twinkle = window.Twinkle || {};\nwindow.Twinkle.prefs = window.Twinkle.prefs || {};\nwindow.Twinkle.prefs = ";
    text += JSON.stringify(newConfig, null, 2);
    text += ";\n\n".concat(window.wgULS("// twinkleoptions.js到此为止\n", "// twinkleoptions.js到此為止\n"), "// </").concat(nowiki, ">");
    pageobj.setPageText(text);
    pageobj.setEditSummary(window.wgULS("保存Twinkle参数设置:来自[[", "儲存Twinkle偏好設定:來自[[") + Morebits.pageNameNorm + window.wgULS("]]的自动编辑", "]]的自動編輯"));
    pageobj.setChangeTags(Twinkle.changeTags);
    pageobj.setCreateOption("recreate");
    pageobj.save(Twinkle.config.saveSuccess);
  };
  Twinkle.config.saveSuccess = (pageobj) => {
    pageobj.getStatusElement().info("成功");
    const noticebox = document.createElement("div");
    noticebox.className = "mw-message-box mw-message-box-success";
    noticebox.style.fontSize = "100%";
    noticebox.style.marginTop = "2em";
    noticebox.innerHTML = "<p><b>".concat(window.wgULS("您的Twinkle参数设置已被保存。", "您的Twinkle偏好設定已被儲存。"), "</b></p><p>").concat(window.wgULS("要看到这些更改,您可能需要", "要看到這些更改,您可能需要"), '<a href="').concat(mw.util.getUrl("LIB:BYPASS"), '" title="LIB:BYPASS"><b>').concat(window.wgULS("绕过浏览器缓存", "繞過瀏覽器快取"), "</b></a>。</p>");
    Morebits.status.root.appendChild(noticebox);
    const noticeclear = document.createElement("br");
    noticeclear.style.clear = "both";
    Morebits.status.root.appendChild(noticeclear);
  };
  Twinkle.addInitCallback(Twinkle.config.init);
})(jQuery);

})();

/* </nowiki> */

//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXRydW5jLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL2NvcmUtanNAMy4zNy4xL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb3JlLWpzQDMuMzcuMS9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvLnBucG0vY29yZS1qc0AzLjM3LjEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZS5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGVhcnYuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xld2Fybi5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGVibG9jay5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL2ZyaWVuZGx5dGFsa2JhY2suanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlc3BlZWR5LmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWNvcHl2aW8uanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xleGZkLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWltYWdlLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZXByb3RlY3QuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy9mcmllbmRseXRhZy5qcyIsICJzcmMvVHdpbmtsZS9tb2R1bGVzL3R3aW5rbGVzdHViLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWRpZmYuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xldW5saW5rLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWZsdWZmLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWJhdGNoZGVsZXRlLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWJhdGNodW5kZWxldGUuanMiLCAic3JjL1R3aW5rbGUvbW9kdWxlcy90d2lua2xlYmF0Y2hwcm90ZWN0LmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWNsb3NlLmpzIiwgInNyYy9Ud2lua2xlL21vZHVsZXMvdHdpbmtsZWNvbmZpZy5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAmJiBpdC5NYXRoID09PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgY2hlY2sodHlwZW9mIHRoaXMgPT0gJ29iamVjdCcgJiYgdGhpcykgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPT0gNztcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IGNhbGwuYmluZChjYWxsKSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoY2FsbCwgYXJndW1lbnRzKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xudmFyIHVuY3VycnlUaGlzV2l0aEJpbmQgPSBOQVRJVkVfQklORCAmJiBGdW5jdGlvblByb3RvdHlwZS5iaW5kLmJpbmQoY2FsbCwgY2FsbCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyB1bmN1cnJ5VGhpc1dpdGhCaW5kIDogZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGwuYXBwbHkoZm4sIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoe30udG9TdHJpbmcpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgc3BsaXQgPSB1bmN1cnJ5VGhpcygnJy5zcGxpdCk7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICEkT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gd2UgY2FuJ3QgdXNlIGp1c3QgYGl0ID09IG51bGxgIHNpbmNlIG9mIGBkb2N1bWVudC5hbGxgIHNwZWNpYWwgY2FzZVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1Jc0hUTUxEREEtaW50ZXJuYWwtc2xvdC1hZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gbnVsbCB8fCBpdCA9PT0gdW5kZWZpbmVkO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG4vLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3RcbnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7XG5cbi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdHlwZW9mLXVuZGVmaW5lZCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgZG9jdW1lbnRBbGwgPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnRBbGwgIT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbicgfHwgYXJndW1lbnQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbic7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IGlzQ2FsbGFibGUoaXQpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNDYWxsYWJsZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSkgOiBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgbmF2aWdhdG9yICE9ICd1bmRlZmluZWQnICYmIFN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCAnJztcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERlbm8gPSBnbG9iYWwuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICAvLyBpbiBvbGQgQ2hyb21lLCB2ZXJzaW9ucyBvZiBWOCBpc24ndCBWOCA9IENocm9tZSAvIDEwXG4gIC8vIGJ1dCB0aGVpciBjb3JyZWN0IHZlcnNpb25zIGFyZSBub3QgaW50ZXJlc3RpbmcgZm9yIHVzXG4gIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5cbi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYFxuLy8gc28gY2hlY2sgYHVzZXJBZ2VudGAgZXZlbiBpZiBgLnY4YCBleGlzdHMsIGJ1dCAwXG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gK21hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbjtcbiIsICIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciAkU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBTeW1ib2woJ3N5bWJvbCBkZXRlY3Rpb24nKTtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gYGdldC1vd24tcHJvcGVydHktc3ltYm9sc2AgcG9seWZpbGwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gb2JqZWN0IGFyZSBub3QgU3ltYm9sIGluc3RhbmNlc1xuICAvLyBuYjogRG8gbm90IGNhbGwgYFN0cmluZ2AgZGlyZWN0bHkgdG8gYXZvaWQgdGhpcyBiZWluZyBvcHRpbWl6ZWQgb3V0IHRvIGBzeW1ib2wrJydgIHdoaWNoIHdpbGwsXG4gIC8vIG9mIGNvdXJzZSwgZmFpbC5cbiAgcmV0dXJuICEkU3RyaW5nKHN5bWJvbCkgfHwgIShPYmplY3Qoc3ltYm9sKSBpbnN0YW5jZW9mIFN5bWJvbCkgfHxcbiAgICAvLyBDaHJvbWUgMzgtNDAgc3ltYm9scyBhcmUgbm90IGluaGVyaXRlZCBmcm9tIERPTSBjb2xsZWN0aW9ucyBwcm90b3R5cGVzIHRvIGluc3RhbmNlc1xuICAgICFTeW1ib2wuc2hhbSAmJiBWOF9WRVJTSU9OICYmIFY4X1ZFUlNJT04gPCA0MTtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0xcbiAgJiYgIVN5bWJvbC5zaGFtXG4gICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCc7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVTRV9TWU1CT0xfQVNfVUlEID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciAkU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG4gIHJldHVybiBpc0NhbGxhYmxlKCRTeW1ib2wpICYmIGlzUHJvdG90eXBlT2YoJFN5bWJvbC5wcm90b3R5cGUsICRPYmplY3QoaXQpKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYE9yZGluYXJ5VG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKHByZWYgPT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChpc0NhbGxhYmxlKGZuID0gaW5wdXQudmFsdWVPZikgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChwcmVmICE9PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbCwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZGVmaW5lR2xvYmFsUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eScpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbFRoaXNbU0hBUkVEXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShTSEFSRUQsIHt9KTtcblxuKHN0b3JlLnZlcnNpb25zIHx8IChzdG9yZS52ZXJzaW9ucyA9IFtdKSkucHVzaCh7XG4gIHZlcnNpb246ICczLjM3LjEnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTQtMjAyNCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScsXG4gIGxpY2Vuc2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjM3LjEvTElDRU5TRScsXG4gIHNvdXJjZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzJ1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgfHwge30pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gJE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gdW5jdXJyeVRoaXMoe30uaGFzT3duUHJvcGVydHkpO1xuXG4vLyBgSGFzT3duUHJvcGVydHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1oYXNvd25wcm9wZXJ0eVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1oYXNvd24gLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaGFzT3duIHx8IGZ1bmN0aW9uIGhhc093bihpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eSh0b09iamVjdChpdCksIGtleSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKDEuMC50b1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArIHRvU3RyaW5nKCsraWQgKyBwb3N0Zml4LCAzNik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2xbJ2ZvciddIHx8IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgaGFzT3duKFN5bWJvbCwgbmFtZSlcbiAgICAgID8gU3ltYm9sW25hbWVdXG4gICAgICA6IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTtcbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbiAgfVxuICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ251bWJlcic7XG4gIHJldHVybiBvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBwcmVmKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmtzIHRvIElFOCBmb3IgaXRzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9PSA3O1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhc093bihPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLCBPLCBQKSwgT1tQXSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFY4IH4gQ2hyb21lIDM2LVxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNFxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7XG4gICAgdmFsdWU6IDQyLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KS5wcm90b3R5cGUgIT09IDQyO1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKCRTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBFTlVNRVJBQkxFID0gJ2VudW1lcmFibGUnO1xudmFyIENPTkZJR1VSQUJMRSA9ICdjb25maWd1cmFibGUnO1xudmFyIFdSSVRBQkxFID0gJ3dyaXRhYmxlJztcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA/IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKHR5cGVvZiBPID09PSAnZnVuY3Rpb24nICYmIFAgPT09ICdwcm90b3R5cGUnICYmICd2YWx1ZScgaW4gQXR0cmlidXRlcyAmJiBXUklUQUJMRSBpbiBBdHRyaWJ1dGVzICYmICFBdHRyaWJ1dGVzW1dSSVRBQkxFXSkge1xuICAgIHZhciBjdXJyZW50ID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50W1dSSVRBQkxFXSkge1xuICAgICAgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gICAgICBBdHRyaWJ1dGVzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IENPTkZJR1VSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tDT05GSUdVUkFCTEVdIDogY3VycmVudFtDT05GSUdVUkFCTEVdLFxuICAgICAgICBlbnVtZXJhYmxlOiBFTlVNRVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0VOVU1FUkFCTEVdIDogY3VycmVudFtFTlVNRVJBQkxFXSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfSByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xufSA6ICRkZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHVuY3VycnlUaGlzKEZ1bmN0aW9uLnRvU3RyaW5nKTtcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGBjb3JlLWpzQDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlclxuaWYgKCFpc0NhbGxhYmxlKHN0b3JlLmluc3BlY3RTb3VyY2UpKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZyhpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0NhbGxhYmxlKFdlYWtNYXApICYmIC9uYXRpdmUgY29kZS8udGVzdChTdHJpbmcoV2Vha01hcCkpO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQIHx8IHNoYXJlZC5zdGF0ZSkge1xuICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpO1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1zZWxmLWFzc2lnbiAtLSBwcm90b3R5cGUgbWV0aG9kcyBwcm90ZWN0aW9uICovXG4gIHN0b3JlLmdldCA9IHN0b3JlLmdldDtcbiAgc3RvcmUuaGFzID0gc3RvcmUuaGFzO1xuICBzdG9yZS5zZXQgPSBzdG9yZS5zZXQ7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHN0b3JlLmhhcyhpdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHN0b3JlLnNldChpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldChpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5oYXMoaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUnKS5DT05GSUdVUkFCTEU7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcblxudmFyIENPTkZJR1VSQUJMRV9MRU5HVEggPSBERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAnbGVuZ3RoJywgeyB2YWx1ZTogOCB9KS5sZW5ndGggIT09IDg7XG59KTtcblxudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG52YXIgbWFrZUJ1aWx0SW4gPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSwgb3B0aW9ucykge1xuICBpZiAoc3RyaW5nU2xpY2UoJFN0cmluZyhuYW1lKSwgMCwgNykgPT09ICdTeW1ib2woJykge1xuICAgIG5hbWUgPSAnWycgKyByZXBsYWNlKCRTdHJpbmcobmFtZSksIC9eU3ltYm9sXFwoKFteKV0qKVxcKS4qJC8sICckMScpICsgJ10nO1xuICB9XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZ2V0dGVyKSBuYW1lID0gJ2dldCAnICsgbmFtZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXR0ZXIpIG5hbWUgPSAnc2V0ICcgKyBuYW1lO1xuICBpZiAoIWhhc093bih2YWx1ZSwgJ25hbWUnKSB8fCAoQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgJiYgdmFsdWUubmFtZSAhPT0gbmFtZSkpIHtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICBlbHNlIHZhbHVlLm5hbWUgPSBuYW1lO1xuICB9XG4gIGlmIChDT05GSUdVUkFCTEVfTEVOR1RIICYmIG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsICdhcml0eScpICYmIHZhbHVlLmxlbmd0aCAhPT0gb3B0aW9ucy5hcml0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KHZhbHVlLCAnbGVuZ3RoJywgeyB2YWx1ZTogb3B0aW9ucy5hcml0eSB9KTtcbiAgfVxuICB0cnkge1xuICAgIGlmIChvcHRpb25zICYmIGhhc093bihvcHRpb25zLCAnY29uc3RydWN0b3InKSAmJiBvcHRpb25zLmNvbnN0cnVjdG9yKSB7XG4gICAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KHZhbHVlLCAncHJvdG90eXBlJywgeyB3cml0YWJsZTogZmFsc2UgfSk7XG4gICAgLy8gaW4gVjggfiBDaHJvbWUgNTMsIHByb3RvdHlwZXMgb2Ygc29tZSBtZXRob2RzLCBsaWtlIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCwgYXJlIG5vbi13cml0YWJsZVxuICAgIH0gZWxzZSBpZiAodmFsdWUucHJvdG90eXBlKSB2YWx1ZS5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpO1xuICBpZiAoIWhhc093bihzdGF0ZSwgJ3NvdXJjZScpKSB7XG4gICAgc3RhdGUuc291cmNlID0gam9pbihURU1QTEFURSwgdHlwZW9mIG5hbWUgPT0gJ3N0cmluZycgPyBuYW1lIDogJycpO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG5cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dGVuZC1uYXRpdmUgLS0gcmVxdWlyZWRcbkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IG1ha2VCdWlsdEluKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gaXNDYWxsYWJsZSh0aGlzKSAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpO1xufSwgJ3RvU3RyaW5nJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgbWFrZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbicpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMuZW51bWVyYWJsZTtcbiAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgaWYgKGlzQ2FsbGFibGUodmFsdWUpKSBtYWtlQnVpbHRJbih2YWx1ZSwgbmFtZSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lR2xvYmFsUHJvcGVydHkoa2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3B0aW9ucy51bnNhZmUpIGRlbGV0ZSBPW2tleV07XG4gICAgICBlbHNlIGlmIChPW2tleV0pIHNpbXBsZSA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiAhb3B0aW9ucy5ub25Db25maWd1cmFibGUsXG4gICAgICB3cml0YWJsZTogIW9wdGlvbnMubm9uV3JpdGFibGVcbiAgICB9KTtcbiAgfSByZXR1cm4gTztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgTWF0aC50cnVuY2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hdGgudHJ1bmNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXRoLXRydW5jIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiB0cnVuYyh4KSB7XG4gIHZhciBuID0gK3g7XG4gIHJldHVybiAobiA+IDAgPyBmbG9vciA6IGNlaWwpKG4pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdHJ1bmMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWF0aC10cnVuYycpO1xuXG4vLyBgVG9JbnRlZ2VyT3JJbmZpbml0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvaW50ZWdlcm9yaW5maW5pdHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBudW1iZXIgPSArYXJndW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gIHJldHVybiBudW1iZXIgIT09IG51bWJlciB8fCBudW1iZXIgPT09IDAgPyAwIDogdHJ1bmMobnVtYmVyKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGxlbiA9IHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpO1xuICByZXR1cm4gbGVuID4gMCA/IG1pbihsZW4sIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBMZW5ndGhPZkFycmF5TGlrZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWxlbmd0aG9mYXJyYXlsaWtlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRvTGVuZ3RoKG9iai5sZW5ndGgpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT09IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzT3duKGhpZGRlbktleXMsIGtleSkgJiYgaGFzT3duKE8sIGtleSkgJiYgcHVzaChyZXN1bHQsIGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXNPd24oTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcHVzaChyZXN1bHQsIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQoa2V5cywgZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlLCBleGNlcHRpb25zKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzT3duKHRhcmdldCwga2V5KSAmJiAhKGV4Y2VwdGlvbnMgJiYgaGFzT3duKGV4Y2VwdGlvbnMsIGtleSkpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgfVxuICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIHJlcGxhY2VtZW50ID0gLyN8XFwucHJvdG90eXBlXFwuLztcblxudmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikge1xuICB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07XG4gIHJldHVybiB2YWx1ZSA9PT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IGlzQ2FsbGFibGUoZGV0ZWN0aW9uKSA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgICAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLmRvbnRDYWxsR2V0U2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuICBvcHRpb25zLm5hbWUgICAgICAgICAgIC0gdGhlIC5uYW1lIG9mIHRoZSBmdW5jdGlvbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUga2V5XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IGRlZmluZUdsb2JhbFByb3BlcnR5KFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdICYmIGdsb2JhbFtUQVJHRVRdLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIGRlZmluZUJ1aWx0SW4odGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ0FycmF5Jztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBTYWZhcmkgPCAxMyBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpbiB0aGlzIGNhc2VcbnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhZnVuY3Rpb24gKCkge1xuICAvLyBtYWtlcyBubyBzZW5zZSB3aXRob3V0IHByb3BlciBzdHJpY3QgbW9kZSBzdXBwb3J0XG4gIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwgJ2xlbmd0aCcsIHsgd3JpdGFibGU6IGZhbHNlIH0pLmxlbmd0aCA9IDE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID8gZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICBpZiAoaXNBcnJheShPKSAmJiAhZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sICdsZW5ndGgnKS53cml0YWJsZSkge1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3Qgc2V0IHJlYWQgb25seSAubGVuZ3RoJyk7XG4gIH0gcmV0dXJuIE8ubGVuZ3RoID0gbGVuZ3RoO1xufSA6IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgcmV0dXJuIE8ubGVuZ3RoID0gbGVuZ3RoO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyAkVHlwZUVycm9yKCdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGgnKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBJTkNPUlJFQ1RfVE9fTEVOR1RIID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW10ucHVzaC5jYWxsKHsgbGVuZ3RoOiAweDEwMDAwMDAwMCB9LCAxKSAhPT0gNDI5NDk2NzI5Nztcbn0pO1xuXG4vLyBWOCA8PSAxMjEgYW5kIFNhZmFyaSA8PSAxNS40OyBGRiA8IDIzIHRocm93cyBJbnRlcm5hbEVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjY4MVxudmFyIHByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5wdXNoKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59O1xuXG52YXIgRk9SQ0VEID0gSU5DT1JSRUNUX1RPX0xFTkdUSCB8fCAhcHJvcGVyRXJyb3JPbk5vbldyaXRhYmxlTGVuZ3RoKCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUucHVzaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5wdXNoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgcHVzaDogZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgYXJnQ291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykge1xuICAgICAgT1tsZW5dID0gYXJndW1lbnRzW2ldO1xuICAgICAgbGVuKys7XG4gICAgfVxuICAgIHNldEFycmF5TGVuZ3RoKE8sIGxlbik7XG4gICAgcmV0dXJuIGxlbjtcbiAgfVxufSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZS5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGUoJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0Y29uc3QgVHdpbmtsZSA9IHt9O1xuXHR3aW5kb3cuVHdpbmtsZSB8fD0gVHdpbmtsZTsgLy8gYWxsb3cgZ2xvYmFsIGFjY2Vzc1xuXHQvLyBXcmFwIHdpdGggYW5vbnltb3VzIGZ1bmN0aW9uXG5cdC8vIENoZWNrIGlmIGFjY291bnQgaXMgZXhwZXJpZW5jZWQgZW5vdWdoIHRvIHVzZSBUd2lua2xlXG5cdGlmICghTW9yZWJpdHMudXNlcklzSW5Hcm91cCgnYXV0b2NvbmZpcm1lZCcpICYmICFNb3JlYml0cy51c2VySXNJbkdyb3VwKCdjb25maXJtZWQnKSkge1xuXHRcdGNvbnNvbGUud2FybignW1R3aW5rbGVd6Z2e56Gu6K6k55So5oi35oiW6Ieq5Yqo56Gu6K6k55So5oi377yMVHdpbmtsZeS4jeS8mui/kOihjOOAgicpO1xuXHRcdHJldHVybjtcblx0fVxuXHQvKipcblx0ICogVHdpbmtsZS1zcGVjaWZpYyBkYXRhIHNoYXJlZCBieSBtdWx0aXBsZSBtb2R1bGVzXG5cdCAqIExpa2VseSBjdXN0b21pemVkIHBlciBpbnN0YWxsYXRpb25cblx0ICovXG5cdC8vIEN1c3RvbSBjaGFuZ2UgdGFnKHMpIHRvIGJlIGFwcGxpZWQgdG8gYWxsIFR3aW5rbGUgYWN0aW9ucywgY3JlYXRlIGF0IFNwZWNpYWw6VGFnc1xuXHRUd2lua2xlLmNoYW5nZVRhZ3MgPSAnVHdpbmtsZSc7XG5cdC8vIEF2YWlsYWJsZSBmb3IgYWN0aW9ucyB0aGF0IGRvbid0ICh5ZXQpIHN1cHBvcnQgdGFnc1xuXHRUd2lua2xlLnN1bW1hcnlBZCA9ICfvvIhbW0g6VFd8VHdpbmtsZV1d77yJJztcblx0Ly8gVmFyaW91cyBoYXRub3RlIHRlbXBsYXRlcywgdXNlZCB3aGVuIHRhZ2dpbmcgKGNzZC94ZmQvdGFnL3Byb2QvcHJvdGVjdCkgdG8gZW5zdXJlIG9yZGVyXG5cdFR3aW5rbGUuaGF0bm90ZVJlZ2V4ID1cblx0XHQnKD86U2hvcnRbIF9dZGVzY3JpcHRpb24pfCg/OlJlbGxpbmt8SGF0bm90ZXxIQVQpfCg/Ok1haW58W+e7hue0sF1b6IqC56+AXXxNYWluWyBfXWFydGljbGVzfOS4u1vmnaHmop1d55uufEh1cnJpY2FuZVsgX11tYWlufFvmnaHmop1d55uufOS4u3xb6aCB6aG1XemdonzkuLtb6aCB6aG1XemdonzkuLtb6aCB6aG1XXzkuLtb6aGM6aKYXeebrnxNYWluWyBfXWFydGljbGV8QVApfCg/Oldyb25ndGl0bGV8Q29ycmVjdFsgX110aXRsZSl8KD865Li75p2h55uu5raI5q2n5LmJfOS4u+aineebrua2iOatp+e+qXzmtojmrafkuYnpk77mjqV85raI5q2n576p6Y+I5o6lfOa2iOatp+e+qemAo+e1kHzmtojov5585raI6YCjfOa2iOatp+S5iei/nue7k3xEaXNhbWJMaW5rfE5vdGVyZWZ8RGFibGluayl8KD86RGlzdGluZ3Vpc2h85LiN5pivfE5vdHzmj5DnpLp85re35reGfOWIhuWIpXzliIbliKt85Y2A5YilfOWMuuWIq3zmnKzmnaHnm67nmoTkuLvpopjkuI3mmK985pys5qKd55uu55qE5Li76aGM5LiN5pivfOacrOadoeebruS4u+mimOS4jeaYr3zmnKzmop3nm67kuLvpoYzkuI3mmK985p2h55uu5Li76aKY5LiN5pivfOaineebruS4u+mhjOS4jeaYr3zkuLvpopjkuI3mmK985Li76aGM5LiN5pivfENvbmZ1c2VkfOWMuuWIhnzljYDliIZ8Q29uZnVzaW9ufENvbmZ1c2V8UmVkaXJlY3ROT1R8TWlzc3BlbGxpbmcpfCg/OkRpc3Rpbmd1aXNoMnxTZWxmRGlzdGluZ3Vpc2h8Tm90MnzkuI3mmK8yKXwoPzpGb3IpfCg/OkRldGFpbHN8RnVydGhlcnxTZWV85Y+m6KeBfOWPpuimi3xNb3JlfOebuOmXnOaineebrnznm7jlhbPmnaHnm658RGV0YWlsfOingXzopot85pu05aSa6LWE5paZfOabtOWkmuizh+aWmXxGdXJ0aGVyWyBfXWluZm9ybWF0aW9ufOabtOWkmui1hOiur3zmm7TlpJros4foqIp8TW9yZVsgX11pbmZvcm1hdGlvbnzmm7TlpJrkv6Hmga8pfCg/OlNlbGZyZWYpfCg/OkFib3V0fE90aGVydXNlczR85YWz5LqOfOmXnOaWvCl8KD86T3RoZXJbIF9ddXNlc3xPdGhlcnVzZXzmnaHnm67mtojmrafkuYl85qKd55uu5raI5q2n576pfOS7lueUqHxPdGhlcnVzZXMpfCg/Ok90aGVyWyBfXXVzZXMgbGlzdHxPdGhlcnVzZWxpc3R85Li75qKd55uu5raI5q2n576p5YiX6KGofOS4u+adoeebrua2iOatp+S5ieWIl+ihqHxPdGhlcnVzZXNsaXN0fEFib3V0bGlzdHxBYm91dFsgX11saXN0fE90aGVydXNlc1sgX11saXN0KXwoPzpSZWRpcmVjdHzph43lrprlkJHoh7PmraR8UmVkaXJlY3RzWyBfXWhlcmV8UmVkaXJlY3RbIF9ddG8pfCg/OlJlZGlyZWN0MnzkuLvmop3nm67mtojmrafnvqkyfOS4u+adoeebrua2iOatp+S5iTJ8UmVkaXJ86YeN5a6a5ZCR6Iez5q2kMil8KD86UmVkaXJlY3QzKXwoPzpSZWRpcmVjdDQpfCg/OlJlZGlyZWN0LWRpc3Rpbmd1aXNoKXwoPzpSZWRpcmVjdC1zeW5vbnltKXwoPzpSZWRpcmVjdC1tdWx0aSl8KD86U2VlWyBfXVdpa3Rpb25hcnl8U2Vld2lrdCl8KD86U2VlYWxzb3zlj4LnnIt85Y+D55yLfFNlZVsgX11hbHNvfOWPguingXzlj4Popot8QWxzbyl8KD86U2VlWyBfXWFsc28yfFNlZWFsc28yfOS4jei9ieaPm+WPg+imi3zkuI3ovazmjaLlj4Lop4EpfCg/Ok90aGVyWyBfXXBsYWNlcyl8KD86Q29udHJhc3R85bCN5q+UfOWvueavlCknO1xuXHRUd2lua2xlLmluaXRDYWxsYmFja3MgPSBbXTtcblx0LyoqXG5cdCAqIEFkZHMgYSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gVHdpbmtsZSBoYXMgbG9hZGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBuYW1lIG9mIG1vZHVsZSB1c2VkIHRvIGNoZWNrIGlmIGlzIGRpc2FibGVkLlxuXHQgKiBJZiBuYW1lIGlzIG5vdCBnaXZlbiwgbW9kdWxlIGlzIGxvYWRlZCB1bmNvbmRpdGlvbmFsbHkuXG5cdCAqL1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayA9IChmdW5jLCBuYW1lKSA9PiB7XG5cdFx0VHdpbmtsZS5pbml0Q2FsbGJhY2tzLnB1c2goe1xuXHRcdFx0ZnVuYyxcblx0XHRcdG5hbWUsXG5cdFx0fSk7XG5cdH07XG5cdFR3aW5rbGUuZGVmYXVsdENvbmZpZyA9IHt9O1xuXHQvKipcblx0ICogVGhpcyBob2xkcyB0aGUgZGVmYXVsdCBzZXQgb2YgcHJlZmVyZW5jZXMgdXNlZCBieSBUd2lua2xlLlxuXHQgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCBhbGwgbmV3IHByZWZlcmVuY2VzIGFkZGVkIGhlcmUsIGVzcGVjaWFsbHkgYWRtaW4tb25seSBvbmVzLCBhcmUgYWxzbyBhZGRlZCB0b1xuXHQgKiB8VHdpbmtsZS5jb25maWcuc2VjdGlvbnN8IGluIHR3aW5rbGVjb25maWcuanMsIHNvIHRoZXkgYXJlIGNvbmZpZ3VyYWJsZSB2aWEgdGhlIFR3aW5rbGUgcHJlZmVyZW5jZXMgcGFuZWwuXG5cdCAqIEZvciBoZWxwIG9uIHRoZSBhY3R1YWwgcHJlZmVyZW5jZXMsIHNlZSB0aGUgY29tbWVudHMgaW4gdHdpbmtsZWNvbmZpZy5qcy5cblx0ICpcblx0ICogRm9ybWVybHkgVHdpbmtsZS5kZWZhdWx0Q29uZmlnLnR3aW5rbGVcblx0ICovXG5cdFR3aW5rbGUuZGVmYXVsdENvbmZpZyA9IHtcblx0XHQvLyBHZW5lcmFsXG5cdFx0dXNlclRhbGtQYWdlTW9kZTogJ3RhYicsXG5cdFx0ZGlhbG9nTGFyZ2VGb250OiBmYWxzZSxcblx0XHRkaXNhYmxlZE1vZHVsZXM6IE1vcmViaXRzLnVzZXJJc1N5c29wID8gW10gOiBbJ2Jsb2NrJ10sXG5cdFx0Ly8gZGVmYXVsdCB0byBkaXNhYmxlIGJsb2NrIGZvciBub24tc3lzb3AsIGlmIGVuYWJsZSBtYW51YWxseSwgdGhleSBjYW4gb25seSB1c2UgaXQgdG8gdGFnIHVzZXJwYWdlXG5cdFx0ZGlzYWJsZWRTeXNvcE1vZHVsZXM6IFtdLFxuXHRcdC8vIEFSVlxuXHRcdHNwaVdhdGNoUmVwb3J0OiAneWVzJyxcblx0XHQvLyBCbG9ja1xuXHRcdGRlZmF1bHRUb0Jsb2NrNjQ6IGZhbHNlLFxuXHRcdGRlZmF1bHRUb1BhcnRpYWxCbG9ja3M6IGZhbHNlLFxuXHRcdGJsYW5rVGFsa3BhZ2VPbkluZGVmQmxvY2s6IGZhbHNlLFxuXHRcdHdhdGNoQmxvY2tOb3RpY2VzOiAneWVzJyxcblx0XHRjdXN0b21CbG9ja1JlYXNvbkxpc3Q6IFtdLFxuXHRcdC8vIEZsdWZmIChyZXZlcnQgYW5kIHJvbGxiYWNrKVxuXHRcdG9wZW5UYWxrUGFnZTogW10sXG5cdFx0b3BlblRhbGtQYWdlT25BdXRvUmV2ZXJ0OiBmYWxzZSxcblx0XHRyb2xsYmFja0luUGxhY2U6IGZhbHNlLFxuXHRcdG1hcmtSZXZlcnRlZFBhZ2VzQXNNaW5vcjogWyd2YW5kJ10sXG5cdFx0d2F0Y2hSZXZlcnRlZFBhZ2VzOiBbJ25vcm0nLCAndmFuZCcsICd0b3JldiddLFxuXHRcdHdhdGNoUmV2ZXJ0ZWRFeHBpcnk6ICd5ZXMnLFxuXHRcdG9mZmVyUmVhc29uT25Ob3JtYWxSZXZlcnQ6IHRydWUsXG5cdFx0Y29uZmlybU9uRmx1ZmY6IGZhbHNlLFxuXHRcdHNob3dSb2xsYmFja0xpbmtzOiBbJ2RpZmYnLCAnb3RoZXJzJ10sXG5cdFx0Y3VzdG9tUmV2ZXJ0U3VtbWFyeTogW10sXG5cdFx0Ly8gREkgKHR3aW5rbGVpbWFnZSlcblx0XHRub3RpZnlVc2VyT25EZWxpOiB0cnVlLFxuXHRcdGRlbGlXYXRjaFBhZ2U6ICdkZWZhdWx0Jyxcblx0XHRkZWxpV2F0Y2hVc2VyOiAnZGVmYXVsdCcsXG5cdFx0Ly8gUHJvdGVjdFxuXHRcdHdhdGNoUmVxdWVzdGVkUGFnZXM6ICd5ZXMnLFxuXHRcdHdhdGNoUFBUYWdnZWRQYWdlczogJ2RlZmF1bHQnLFxuXHRcdHdhdGNoUHJvdGVjdGVkUGFnZXM6ICdkZWZhdWx0Jyxcblx0XHQvLyBDU0Rcblx0XHRzcGVlZHlTZWxlY3Rpb25TdHlsZTogJ2J1dHRvbkNsaWNrJyxcblx0XHR3YXRjaFNwZWVkeVBhZ2VzOiBbJ2cxJywgJ2czJywgJ2c0JywgJ2c3JywgJ2c4J10sXG5cdFx0d2F0Y2hTcGVlZHlFeHBpcnk6ICd5ZXMnLFxuXHRcdG1hcmtTcGVlZHlQYWdlc0FzUGF0cm9sbGVkOiBmYWxzZSxcblx0XHR3YXRjaFNwZWVkeVVzZXI6ICcxIG1vbnRoJyxcblx0XHQvLyB0aGVzZSBuZXh0IHR3byBzaG91bGQgcHJvYmFibHkgYmUgaWRlbnRpY2FsIGJ5IGRlZmF1bHRcblx0XHRub3RpZnlVc2VyT25TcGVlZHlEZWxldGlvbk5vbWluYXRpb246IFtcblx0XHRcdCdkYicsXG5cdFx0XHQnZzEnLFxuXHRcdFx0J2cyJyxcblx0XHRcdCdnMycsXG5cdFx0XHQnZzQnLFxuXHRcdFx0J2c1Jyxcblx0XHRcdCdnNicsXG5cdFx0XHQnZzcnLFxuXHRcdFx0J2c4Jyxcblx0XHRcdCdnOScsXG5cdFx0XHQnYTEnLFxuXHRcdFx0J2EyJyxcblx0XHRcdCdhMycsXG5cdFx0XHQncjEnLFxuXHRcdFx0J3IyJyxcblx0XHRcdCdmMScsXG5cdFx0XHQnZjInLFxuXHRcdFx0J2YzJyxcblx0XHRcdCdmNCcsXG5cdFx0XHQnZjUnLFxuXHRcdFx0J28xJyxcblx0XHRcdCdvMicsXG5cdFx0XHQnbzMnLFxuXHRcdF0sXG5cdFx0d2FyblVzZXJPblNwZWVkeURlbGV0ZTogW1xuXHRcdFx0J2RiJyxcblx0XHRcdCdnMScsXG5cdFx0XHQnZzInLFxuXHRcdFx0J2czJyxcblx0XHRcdCdnNCcsXG5cdFx0XHQnZzUnLFxuXHRcdFx0J2c2Jyxcblx0XHRcdCdnNycsXG5cdFx0XHQnZzgnLFxuXHRcdFx0J2c5Jyxcblx0XHRcdCdhMScsXG5cdFx0XHQnYTInLFxuXHRcdFx0J2EzJyxcblx0XHRcdCdyMScsXG5cdFx0XHQncjInLFxuXHRcdFx0J2YxJyxcblx0XHRcdCdmMicsXG5cdFx0XHQnZjMnLFxuXHRcdFx0J2Y0Jyxcblx0XHRcdCdmNScsXG5cdFx0XHQnbzEnLFxuXHRcdFx0J28yJyxcblx0XHRcdCdvMycsXG5cdFx0XSxcblx0XHRwcm9tcHRGb3JTcGVlZHlEZWxldGlvblN1bW1hcnk6IFtdLFxuXHRcdG9wZW5Vc2VyVGFsa1BhZ2VPblNwZWVkeURlbGV0ZTogW10sXG5cdFx0ZGVsZXRlVGFsa1BhZ2VPbkRlbGV0ZTogdHJ1ZSxcblx0XHRkZWxldGVSZWRpcmVjdHNPbkRlbGV0ZTogdHJ1ZSxcblx0XHRkZWxldGVTeXNvcERlZmF1bHRUb0RlbGV0ZTogZmFsc2UsXG5cdFx0c3BlZWR5V2luZG93SGVpZ2h0OiA1MDAsXG5cdFx0c3BlZWR5V2luZG93V2lkdGg6IDgwMCxcblx0XHRsb2dTcGVlZHlOb21pbmF0aW9uczogdHJ1ZSxcblx0XHRzcGVlZHlMb2dQYWdlTmFtZTogJ0NTROaXpeW/lycsXG5cdFx0bm9Mb2dPblNwZWVkeU5vbWluYXRpb246IFsnbzEnXSxcblx0XHRlbmxhcmdlRzdJbnB1dDogZmFsc2UsXG5cdFx0Ly8gVW5saW5rXG5cdFx0dW5saW5rTmFtZXNwYWNlczogWycwJywgJzYnLCAnMTAnLCAnMzAyJ10sXG5cdFx0Ly8gV2FyblxuXHRcdGRlZmF1bHRXYXJuaW5nR3JvdXA6ICcxJyxcblx0XHRjb21iaW5lZFNpbmdsZXRNZW51czogZmFsc2UsXG5cdFx0d2F0Y2hXYXJuaW5nczogJ3llcycsXG5cdFx0b2xkU2VsZWN0OiBmYWxzZSxcblx0XHRjdXN0b21XYXJuaW5nTGlzdDogW10sXG5cdFx0YXV0b01lbnVBZnRlclJvbGxiYWNrOiBmYWxzZSxcblx0XHQvLyBYZkRcblx0XHRsb2dYZmROb21pbmF0aW9uczogdHJ1ZSxcblx0XHR4ZmRMb2dQYWdlTmFtZTogJ1hmROaXpeW/lycsXG5cdFx0bm9Mb2dPblhmZE5vbWluYXRpb246IFtdLFxuXHRcdHhmZFdhdGNoRGlzY3Vzc2lvbjogJ2RlZmF1bHQnLFxuXHRcdHhmZFdhdGNoUGFnZTogJ2RlZmF1bHQnLFxuXHRcdHhmZFdhdGNoVXNlcjogJ2RlZmF1bHQnLFxuXHRcdG1hcmtYZmRQYWdlc0FzUGF0cm9sbGVkOiB0cnVlLFxuXHRcdEZ3ZENzZFRvWGZkOiBNb3JlYml0cy51c2VySXNTeXNvcCxcblx0XHRhZmREZWZhdWx0Q2F0ZWdvcnk6ICdkZWxldGUnLFxuXHRcdGFmZEZhbWVEZWZhdWx0UmVhc29uOiAn5rKh5pyJ6Laz5aSf55qE5Y+v6Z2g5p2l5rqQ6K+B5piO5q2k5p2h55uu56ym5ZCIW1tMSUI65pS25b2V5qCH5YeGfOaUtuW9leagh+WHhl1dJyxcblx0XHRhZmRTdWJzdHViRGVmYXVsdFJlYXNvbjogJ+i/h+acn+Wwj+Wwj+S9nOWTgScsXG5cdFx0WGZkQ2xvc2U6IE1vcmViaXRzLnVzZXJJc1N5c29wID8gJ2FsbCcgOiAnaGlkZScsXG5cdFx0Ly8gQ29weXZpb1xuXHRcdGNvcHl2aW9XYXRjaFBhZ2U6ICd5ZXMnLFxuXHRcdGNvcHl2aW9XYXRjaFVzZXI6ICd5ZXMnLFxuXHRcdG1hcmtDb3B5dmlvUGFnZXNBc1BhdHJvbGxlZDogdHJ1ZSxcblx0XHQvLyBIaWRkZW4gcHJlZmVyZW5jZXNcblx0XHRhdXRvbGV2ZWxTdGFsZURheXM6IDMsXG5cdFx0cmV2ZXJ0TWF4UmV2aXNpb25zOiA1MCxcblx0XHQvLyBpbnRlbnRpb25hbGx5IGxpbWl0ZWRcblx0XHRiYXRjaE1heDogNTAwMCxcblx0XHRiYXRjaENodW5rczogNTAsXG5cdFx0Y29uZmlnUGFnZTogJ0hlbHA6VHdpbmtsZS/lj4LmlbDorr7nva4nLFxuXHRcdHByb2plY3ROYW1lc3BhY2VOYW1lOiBtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVs0XSxcblx0XHRzYW5kYm94UGFnZTogJ0xJQjrmspnnm5InLFxuXHRcdC8vIERlcHJlY2F0ZWQgb3B0aW9ucywgYXMgYSBmYWxsYmFjayBmb3IgYWRkLW9uIHNjcmlwdHMvbW9kdWxlc1xuXHRcdHN1bW1hcnlBZDogJ++8iFtbSDpUV3xUd2lua2xlXV3vvIknLFxuXHRcdGRlbGV0aW9uU3VtbWFyeUFkOiAn77yIW1tIOlRXfFR3aW5rbGVdXe+8iScsXG5cdFx0cHJvdGVjdGlvblN1bW1hcnlBZDogJ++8iFtbSDpUV3xUd2lua2xlXV3vvIknLFxuXHRcdGJsb2NrU3VtbWFyeUFkOiAn77yIW1tIOlRXfFR3aW5rbGVdXe+8iScsXG5cdFx0Ly8gVGFnXG5cdFx0Z3JvdXBCeURlZmF1bHQ6IHRydWUsXG5cdFx0d2F0Y2hUYWdnZWRQYWdlczogJ3llcycsXG5cdFx0d2F0Y2hNZXJnZURpc2N1c3Npb25zOiAneWVzJyxcblx0XHRtYXJrVGFnZ2VkUGFnZXNBc01pbm9yOiBmYWxzZSxcblx0XHRtYXJrVGFnZ2VkUGFnZXNBc1BhdHJvbGxlZDogdHJ1ZSxcblx0XHR0YWdBcnRpY2xlU29ydE9yZGVyOiAnY2F0Jyxcblx0XHRjdXN0b21UYWdMaXN0OiBbXSxcblx0XHRjdXN0b21GaWxlVGFnTGlzdDogW10sXG5cdFx0Y3VzdG9tUmVkaXJlY3RUYWdMaXN0OiBbXSxcblx0XHQvLyBTdHViXG5cdFx0d2F0Y2hTdHViYmVkUGFnZXM6IGZhbHNlLFxuXHRcdG1hcmtTdHViYmVkUGFnZXNBc01pbm9yOiBmYWxzZSxcblx0XHRtYXJrU3R1YmJlZFBhZ2VzQXNQYXRyb2xsZWQ6IHRydWUsXG5cdFx0c3R1YkFydGljbGVTb3J0T3JkZXI6ICdjYXQnLFxuXHRcdGN1c3RvbVN0dWJMaXN0OiBbXSxcblx0XHQvLyBUYWxrYmFja1xuXHRcdG1hcmtUYWxrYmFja0FzTWlub3I6IHRydWUsXG5cdFx0aW5zZXJ0VGFsa2JhY2tTaWduYXR1cmU6IHRydWUsXG5cdFx0Ly8gYWx3YXlzIHNpZ24gdGFsa2JhY2sgdGVtcGxhdGVzXG5cdFx0dGFsa2JhY2tIZWFkaW5nOiB3aW5kb3cud2dVTFMoJ+WbnuWkjemAmuWRiicsICflm57opobpgJrlkYonKSxcblx0XHRtYWlsSGVhZGluZzogd2luZG93LndnVUxTKCfmgqjmnInmlrDpgq7ku7bvvIEnLCAn5oKo5pyJ5paw6YO15Lu277yBJyksXG5cdH07XG5cdC8vIG5vdyBzb21lIHNraW4gZGVwZW5kZW50IGNvbmZpZy5cblx0c3dpdGNoIChtdy5jb25maWcuZ2V0KCdza2luJykpIHtcblx0XHRjYXNlICd2ZWN0b3InOlxuXHRcdGNhc2UgJ3ZlY3Rvci0yMDIyJzpcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0QXJlYSA9ICdyaWdodC1uYXZpZ2F0aW9uJztcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0SWQgPSAncC10d2lua2xlJztcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0TmFtZSA9ICdUVyc7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldFR5cGUgPSAnbWVudSc7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldE5leHQgPSAncC1zZWFyY2gnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnZ29uZ2JpJzpcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0QXJlYSA9XG5cdFx0XHRcdCRib2R5LmZpbmQoJyNwYWdlLXRvb2xzIC5zaWRlYmFyLWlubmVyJykubGVuZ3RoID4gMFxuXHRcdFx0XHRcdD8gJyNwYWdlLXRvb2xzIC5zaWRlYmFyLWlubmVyJ1xuXHRcdFx0XHRcdDogJyNwYWdlLW1vcmUgLnNpZGViYXItaW5uZXInO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRJZCA9ICdwLXR3aW5rbGUnO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXROYW1lID0gJ1R3aW5rbGUnO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRUeXBlID0gbnVsbDtcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0TmV4dCA9XG5cdFx0XHRcdCRib2R5LmZpbmQoJyNwYWdlLXRvb2xzIC5zaWRlYmFyLWlubmVyJykubGVuZ3RoID4gMCA/ICdwYWdlLW1vcmUnIDogbnVsbDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2NpdGl6ZW4nOlxuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRBcmVhID0gJyNwYWdlLWFjdGlvbnMtbW9yZV9fY2FyZCc7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldElkID0gJ3AtdHdpbmtsZSc7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldE5hbWUgPSAnVHdpbmtsZSc7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldFR5cGUgPSAnbmF2Jztcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0TmV4dCA9ICdwLXRiJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldEFyZWEgPSBudWxsO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXRJZCA9ICdwLWNhY3Rpb25zJztcblx0XHRcdFR3aW5rbGUuZGVmYXVsdENvbmZpZy5wb3J0bGV0TmFtZSA9IG51bGw7XG5cdFx0XHRUd2lua2xlLmRlZmF1bHRDb25maWcucG9ydGxldFR5cGUgPSBudWxsO1xuXHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnLnBvcnRsZXROZXh0ID0gbnVsbDtcblx0fVxuXHRUd2lua2xlLmdldFByZWYgPSAobmFtZSkgPT4ge1xuXHRcdGlmICh0eXBlb2YgVHdpbmtsZS5wcmVmcyA9PT0gJ29iamVjdCcgJiYgVHdpbmtsZS5wcmVmc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gVHdpbmtsZS5wcmVmc1tuYW1lXTtcblx0XHR9XG5cdFx0Ly8gT2xkIHByZWZlcmVuY2VzIGZvcm1hdCwgdXNlZCBiZWZvcmUgdHdpbmtsZW9wdGlvbnMuanMgd2FzIGEgdGhpbmdcblx0XHRpZiAodHlwZW9mIHdpbmRvdy5Ud2lua2xlQ29uZmlnID09PSAnb2JqZWN0JyAmJiB3aW5kb3cuVHdpbmtsZUNvbmZpZ1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gd2luZG93LlR3aW5rbGVDb25maWdbbmFtZV07XG5cdFx0fVxuXHRcdHJldHVybiBUd2lua2xlLmRlZmF1bHRDb25maWdbbmFtZV07XG5cdH07XG5cdC8qKlxuXHQgKiAqKioqKioqKioqKioqKioqIFR3aW5rbGUuYWRkUG9ydGxldCgpICoqKioqKioqKioqKioqKipcblx0ICpcblx0ICogQWRkcyBhIHBvcnRsZXQgbWVudSB0byBvbmUgb2YgdGhlIG5hdmlnYXRpb24gYXJlYXMgb24gdGhlIHBhZ2UuXG5cdCAqIFRoaXMgaXMgbmVjZXNzYXJpbHkgcXVpdGUgYSBoYWNrIHNpbmNlIHNraW5zLCBuYXZpZ2F0aW9uIGFyZWFzLCBhbmRcblx0ICogcG9ydGxldCBtZW51IHR5cGVzIGFsbCB3b3JrIHNsaWdodGx5IGRpZmZlcmVudC5cblx0ICpcblx0ICogQXZhaWxhYmxlIG5hdmlnYXRpb24gYXJlYXMgZGVwZW5kIG9uIHRoZSBza2luIHVzZWQuXG5cdCAqIFZlY3Rvcjpcblx0ICogLSBGb3IgZWFjaCBvcHRpb24sIHRoZSBvdXRlciBuYXYgY2xhc3MgY29udGFpbnMgXCJ2ZWN0b3ItbWVudVwiLCB0aGUgaW5uZXIgZGl2IGNsYXNzIGlzIFwidmVjdG9yLW1lbnUtY29udGVudFwiLCBhbmQgdGhlIHVsIGlzIFwidmVjdG9yLW1lbnUtY29udGVudC1saXN0XCJcblx0ICogLSBcIm13LXBhbmVsXCIsIG91dGVyIG5hdiBjbGFzcyBjb250YWlucyBcInZlY3Rvci1tZW51LXBvcnRhbFwiLiBFeGlzdGluZyBwb3J0bGV0cy9lbGVtZW50czogXCJwLWxvZ29cIiwgXCJwLW5hdmlnYXRpb25cIiwgXCJwLWludGVyYWN0aW9uXCIsIFwicC10YlwiLCBcInAtY29sbC1wcmludF9leHBvcnRcIlxuXHQgKiAtIFwibGVmdC1uYXZpZ2F0aW9uXCIsIG91dGVyIG5hdiBjbGFzcyBjb250YWlucyBcInZlY3Rvci1tZW51LXRhYnNcIiBvciBcInZlY3Rvci1tZW51LWRyb3Bkb3duXCIuIEV4aXN0aW5nIHBvcnRsZXRzOiBcInAtbmFtZXNwYWNlc1wiLCBcInAtdmFyaWFudHNcIiAobWVudSlcblx0ICogLSBcInJpZ2h0LW5hdmlnYXRpb25cIiwgb3V0ZXIgbmF2IGNsYXNzIGNvbnRhaW5zIFwidmVjdG9yLW1lbnUtdGFic1wiIG9yIFwidmVjdG9yLW1lbnUtZHJvcGRvd25cIi4gRXhpc3RpbmcgcG9ydGxldHM6IFwicC12aWV3c1wiLCBcInAtY2FjdGlvbnNcIiAobWVudSksIFwicC1zZWFyY2hcIlxuXHQgKiAtIFNwZWNpYWwgbGF5b3V0IG9mIHAtcGVyc29uYWwgcG9ydGxldCAocGFydCBvZiBcImhlYWRcIikgdGhyb3VnaCBzcGVjaWFsaXplZCBzdHlsZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYXZpZ2F0aW9uIC0tIGlkIG9mIHRoZSB0YXJnZXQgbmF2aWdhdGlvbiBhcmVhIChza2luIGRlcGVuZGFudCwgb24gdmVjdG9yIGVpdGhlciBvZiBcImxlZnQtbmF2aWdhdGlvblwiLCBcInJpZ2h0LW5hdmlnYXRpb25cIiwgb3IgXCJtdy1wYW5lbFwiKVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLS0gaWQgb2YgdGhlIHBvcnRsZXQgbWVudSB0byBjcmVhdGUsIHByZWZlcmFibHkgc3RhcnQgd2l0aCBcInAtXCIuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0tIG5hbWUgb2YgdGhlIHBvcnRsZXQgbWVudSB0byBjcmVhdGUuIFZpc2liaWxpdHkgZGVwZW5kcyBvbiB0aGUgY2xhc3MgdXNlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLS0gdHlwZSBvZiBwb3J0bGV0LiBDdXJyZW50bHkgb25seSB1c2VkIGZvciB0aGUgdmVjdG9yIG5vbi1zaWRlYmFyIHBvcnRsZXRzLCBwYXNzIFwibWVudVwiIHRvIG1ha2UgdGhpcyBwb3J0bGV0IGEgZHJvcCBkb3duIG1lbnUuXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbmV4dG5vZGVpZCAtLSB0aGUgaWQgb2YgdGhlIG5vZGUgYmVmb3JlIHdoaWNoIHRoZSBuZXcgaXRlbSBzaG91bGQgYmUgYWRkZWQsIHNob3VsZCBiZSBhbm90aGVyIGl0ZW0gaW4gdGhlIHNhbWUgbGlzdCwgb3IgdW5kZWZpbmVkIHRvIHBsYWNlIGl0IGF0IHRoZSBlbmQuXG5cdCAqXG5cdCAqIEByZXR1cm4ge05vZGV9IC0tIHRoZSBET00gbm9kZSBvZiB0aGUgbmV3IGl0ZW0gKGEgRElWIGVsZW1lbnQpIG9yIG51bGxcblx0ICovXG5cdFR3aW5rbGUuYWRkUG9ydGxldCA9IChuYXZpZ2F0aW9uLCBpZCwgdGV4dCwgdHlwZSwgbmV4dG5vZGVpZCkgPT4ge1xuXHRcdC8vIHNhbml0eSBjaGVja3MsIGFuZCBnZXQgcmVxdWlyZWQgRE9NIG5vZGVzXG5cdFx0Y29uc3Qgcm9vdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoL14oPzojfFxcLikvLnRlc3QobmF2aWdhdGlvbikgPyBuYXZpZ2F0aW9uIDogYCMke25hdmlnYXRpb259YCk7XG5cdFx0aWYgKCFyb290KSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgaXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2lkfWApO1xuXHRcdGlmIChpdGVtKSB7XG5cdFx0XHRpZiAoaXRlbS5wYXJlbnROb2RlICYmIGl0ZW0ucGFyZW50Tm9kZSA9PT0gcm9vdCkge1xuXHRcdFx0XHRyZXR1cm4gaXRlbTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRsZXQgbmV4dG5vZGU7XG5cdFx0aWYgKG5leHRub2RlaWQpIHtcblx0XHRcdG5leHRub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7bmV4dG5vZGVpZH1gKTtcblx0XHR9XG5cdFx0Ly8gdmVyaWZ5L25vcm1hbGl6ZSBpbnB1dFxuXHRcdGNvbnN0IHNraW4gPSBtdy5jb25maWcuZ2V0KCdza2luJyk7XG5cdFx0aWYgKFxuXHRcdFx0KHNraW4gIT09ICd2ZWN0b3InICYmIHNraW4gIT09ICd2ZWN0b3ItMjAyMicpIHx8XG5cdFx0XHQobmF2aWdhdGlvbiAhPT0gJ2xlZnQtbmF2aWdhdGlvbicgJiYgbmF2aWdhdGlvbiAhPT0gJ3JpZ2h0LW5hdmlnYXRpb24nKVxuXHRcdCkge1xuXHRcdFx0dHlwZSA9IG51bGw7IC8vIG1lbnUgc3VwcG9ydGVkIG9ubHkgaW4gdmVjdG9yJ3MgI2xlZnQtbmF2aWdhdGlvbiAmICNyaWdodC1uYXZpZ2F0aW9uXG5cdFx0fVxuXHRcdGxldCBvdXRlck5hdkNsYXNzO1xuXHRcdGxldCBpbm5lckRpdkNsYXNzO1xuXHRcdHN3aXRjaCAoc2tpbikge1xuXHRcdFx0Y2FzZSAndmVjdG9yJzpcblx0XHRcdGNhc2UgJ3ZlY3Rvci0yMDIyJzpcblx0XHRcdFx0Ly8gWFhYOiBwb3J0YWwgZG9lc24ndCB3b3JrXG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uICE9PSAncG9ydGFsJyAmJiBuYXZpZ2F0aW9uICE9PSAnbGVmdC1uYXZpZ2F0aW9uJyAmJiBuYXZpZ2F0aW9uICE9PSAncmlnaHQtbmF2aWdhdGlvbicpIHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uID0gJ213LXBhbmVsJztcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRlck5hdkNsYXNzID0gJ213LXBvcnRsZXQgdmVjdG9yLW1lbnUnO1xuXHRcdFx0XHRpZiAobmF2aWdhdGlvbiA9PT0gJ213LXBhbmVsJykge1xuXHRcdFx0XHRcdG91dGVyTmF2Q2xhc3MgKz0gJyB2ZWN0b3ItbWVudS1wb3J0YWwnO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdtZW51Jykge1xuXHRcdFx0XHRcdG91dGVyTmF2Q2xhc3MgKz0gJyB2ZWN0b3ItbWVudS1kcm9wZG93biB2ZWN0b3ItZHJvcGRvd24gdmVjdG9yLW1lbnUtZHJvcGRvd24tbm9pY29uJztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvdXRlck5hdkNsYXNzICs9ICcgdmVjdG9yLW1lbnUtdGFicyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5uZXJEaXZDbGFzcyA9ICd2ZWN0b3ItbWVudS1jb250ZW50IHZlY3Rvci1kcm9wZG93bi1jb250ZW50Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdnb25nYmknOlxuXHRcdFx0XHRvdXRlck5hdkNsYXNzID0gJ213LXBvcnRsZXQnO1xuXHRcdFx0XHRpbm5lckRpdkNsYXNzID0gJ213LXBvcnRsZXQtYm9keSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY2l0aXplbic6XG5cdFx0XHRcdG91dGVyTmF2Q2xhc3MgPSAnbXctcG9ydGxldCc7XG5cdFx0XHRcdGlubmVyRGl2Q2xhc3MgPSAnbXctcG9ydGxldC10d2lua2xlJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRuYXZpZ2F0aW9uID0gJ2NvbHVtbi1vbmUnO1xuXHRcdFx0XHRvdXRlck5hdkNsYXNzID0gJ3BvcnRsZXQnO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Ly8gQnVpbGQgdGhlIERPTSBlbGVtZW50cy5cblx0XHRsZXQgb3V0ZXJOYXY7XG5cdFx0bGV0IGhlYWRpbmc7XG5cdFx0aWYgKHNraW4gPT09ICd2ZWN0b3ItMjAyMicpIHtcblx0XHRcdG91dGVyTmF2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0ZXJOYXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduYXYnKTtcblx0XHRcdGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMycpO1xuXHRcdH1cblx0XHRvdXRlck5hdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGAke2lkfS1sYWJlbGApO1xuXHRcdC8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBoZXJlIChvdXRlck5hdkNsYXNzKTpcblx0XHQvLyAqIG13LXBvcnRsZXQgdmVjdG9yLW1lbnUgdmVjdG9yLW1lbnUtKlxuXHRcdC8vICogbXctcG9ydGxldFxuXHRcdC8vICogY29sdW1uLW9uZVxuXHRcdC8vIFZlY3RvciBnZXR0aW5nIHZlY3Rvci1tZW51LWVtcHR5IEZJWE1FIFRPRE9cblx0XHRvdXRlck5hdi5jbGFzc05hbWUgPSBgJHtvdXRlck5hdkNsYXNzfSBlbXB0eVBvcnRsZXRgO1xuXHRcdG91dGVyTmF2LmlkID0gaWQ7XG5cdFx0aWYgKG5leHRub2RlICYmIG5leHRub2RlLnBhcmVudE5vZGUgPT09IHJvb3QpIHtcblx0XHRcdHJvb3QuaW5zZXJ0QmVmb3JlKG91dGVyTmF2LCBuZXh0bm9kZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJvb3QuYXBwZW5kQ2hpbGQob3V0ZXJOYXYpO1xuXHRcdH1cblx0XHRoZWFkaW5nLmlkID0gYCR7aWR9LWxhYmVsYDtcblx0XHRjb25zdCB1bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG5cdFx0aWYgKHNraW4gPT09ICd2ZWN0b3InIHx8IHNraW4gPT09ICd2ZWN0b3ItMjAyMicpIHtcblx0XHRcdGhlYWRpbmcuc2V0QXR0cmlidXRlKCdmb3InLCBgJHtpZH0tZHJvcGRvd24tY2hlY2tib3hgKTtcblx0XHRcdHVsLmNsYXNzTmFtZSA9ICd2ZWN0b3ItbWVudS1jb250ZW50LWxpc3QnO1xuXHRcdFx0aGVhZGluZy5jbGFzc05hbWUgPSAndmVjdG9yLW1lbnUtaGVhZGluZyB2ZWN0b3ItZHJvcGRvd24tbGFiZWwnO1xuXHRcdFx0Ly8gYWRkIGludmlzaWJsZSBjaGVja2JveCB0byBrZWVwIG1lbnUgb3BlbiB3aGVuIGNsaWNrZWRcblx0XHRcdC8vIHNpbWlsYXIgdG8gdGhlIHAtY2FjdGlvbnMgKFwiTW9yZVwiKSBtZW51XG5cdFx0XHRpZiAob3V0ZXJOYXZDbGFzcy5pbmNsdWRlcygndmVjdG9yLW1lbnUtZHJvcGRvd24nKSkge1xuXHRcdFx0XHRjb25zdCBjaGtib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuXHRcdFx0XHRjaGtib3guaWQgPSBgJHtpZH0tZHJvcGRvd24tY2hlY2tib3hgO1xuXHRcdFx0XHRjaGtib3guY2xhc3NOYW1lID0gJ3ZlY3Rvci1tZW51LWNoZWNrYm94IHZlY3Rvci1kcm9wZG93bi1jaGVja2JveCc7XG5cdFx0XHRcdGNoa2JveC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcblx0XHRcdFx0Y2hrYm94LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgYCR7aWR9LWxhYmVsYCk7XG5cdFx0XHRcdG91dGVyTmF2LmFwcGVuZENoaWxkKGNoa2JveCk7XG5cdFx0XHRcdC8vIFZlY3RvciBnZXRzIGl0cyB0aXRsZSBpbiBhIHNwYW47IGFsbCBvdGhlcnMgZXhjZXB0XG5cdFx0XHRcdC8vIGdvbmdiaSBoYXZlIG5vIHRpdGxlLCBhbmQgaXQgaGFzIG5vIHNwYW5cblx0XHRcdFx0Y29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRcdFx0c3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG5cdFx0XHRcdGhlYWRpbmcuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cdFx0XHRcdGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0XHRcdGEuaHJlZiA9ICcjJztcblx0XHRcdFx0JChhKS5vbignY2xpY2snLCAoZSkgPT4ge1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGhlYWRpbmcuYXBwZW5kQ2hpbGQoYSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEJhc2ljYWxseSBqdXN0IEdvbmdiaVxuXHRcdFx0aGVhZGluZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG5cdFx0fVxuXHRcdG91dGVyTmF2LmFwcGVuZENoaWxkKGhlYWRpbmcpO1xuXHRcdGlmIChpbm5lckRpdkNsYXNzKSB7XG5cdFx0XHRjb25zdCBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0Ly8gVGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSB1c2VkIGhlcmUgKGlubmVyRGl2Q2xhc3MpOlxuXHRcdFx0Ly8gKiB2ZWN0b3ItbWVudS1jb250ZW50XG5cdFx0XHQvLyAqIG13LXBvcnRsZXQtYm9keVxuXHRcdFx0Ly8gKiBtdy1wb3J0bGV0LXR3aW5rbGVcblx0XHRcdC8vICogcG9ydGxldFxuXHRcdFx0aW5uZXJEaXYuY2xhc3NOYW1lID0gaW5uZXJEaXZDbGFzcztcblx0XHRcdGlubmVyRGl2LmFwcGVuZENoaWxkKHVsKTtcblx0XHRcdG91dGVyTmF2LmFwcGVuZENoaWxkKGlubmVyRGl2KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0ZXJOYXYuYXBwZW5kQ2hpbGQodWwpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0ZXJOYXY7XG5cdH07XG5cdC8qKlxuXHQgKiAqKioqKioqKioqKioqKioqIFR3aW5rbGUuYWRkUG9ydGxldExpbmsoKSAqKioqKioqKioqKioqKioqXG5cdCAqIEJ1aWxkcyBhIHBvcnRsZXQgbWVudSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCwgYW5kIGFkZCB0aGUgcG9ydGxldCBsaW5rLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbn0gdGFzayAtLSBFaXRoZXIgYSBVUkwgZm9yIHRoZSBwb3J0bGV0IGxpbmsgb3IgYSBmdW5jdGlvbiB0byBleGVjdXRlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRvb2x0aXBcblx0ICogQHJldHVybiB7T2JqZWN0fSBsaW5rXG5cdCAqL1xuXHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rID0gKHRhc2ssIHRleHQsIGlkLCB0b29sdGlwKSA9PiB7XG5cdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZigncG9ydGxldEFyZWEnKSAhPT0gbnVsbCkge1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0KFxuXHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3BvcnRsZXRBcmVhJyksXG5cdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZigncG9ydGxldElkJyksXG5cdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZigncG9ydGxldE5hbWUnKSxcblx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdwb3J0bGV0VHlwZScpLFxuXHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3BvcnRsZXROZXh0Jylcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGNvbnN0IGxpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdwb3J0bGV0SWQnKSxcblx0XHRcdHR5cGVvZiB0YXNrID09PSAnc3RyaW5nJyA/IHRhc2sgOiAnIycsXG5cdFx0XHR0ZXh0LFxuXHRcdFx0aWQsXG5cdFx0XHR0b29sdGlwXG5cdFx0KTtcblx0XHQkYm9keS5maW5kKCcuY2xpZW50LWpzIC5za2luLXZlY3RvciAjcC1jYWN0aW9ucycpLmNzcygnbWFyZ2luLXJpZ2h0JywgJ2luaXRpYWwnKTtcblx0XHRpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdCQobGluaylcblx0XHRcdFx0LmZpbmQoJ2EnKVxuXHRcdFx0XHQub24oJ2NsaWNrJywgKGV2KSA9PiB7XG5cdFx0XHRcdFx0dGFzaygpO1xuXHRcdFx0XHRcdGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoJC5jb2xsYXBzaWJsZVRhYnMpIHtcblx0XHRcdCQuY29sbGFwc2libGVUYWJzLmhhbmRsZVJlc2l6ZSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gbGluaztcblx0fTtcblx0LyoqXG5cdCAqICoqKioqKioqKioqKioqKiogR2VuZXJhbCBpbml0aWFsaXphdGlvbiBjb2RlICoqKioqKioqKioqKioqKipcblx0ICovXG5cdGNvbnN0IHNjcmlwdHVybCA9IG13LnV0aWwuZ2V0VXJsKGBVc2VyOiR7bXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpfS90d2lua2xlb3B0aW9ucy5qc2AsIHtcblx0XHRhY3Rpb246ICdyYXcnLFxuXHRcdGN0eXBlOiAndGV4dC9qYXZhc2NyaXB0Jyxcblx0XHRoYXBweTogJ3llcycsXG5cdH0pO1xuXHQvLyBSZXRyaWV2ZSB0aGUgdXNlcidzIFR3aW5rbGUgcHJlZmVyZW5jZXMgKHdpbmRvdy5Ud2lua2xlLnByZWZzKVxuXHRUd2lua2xlLnByZWZzIHx8PSB7fTtcblx0bXcubG9hZGVyXG5cdFx0LmdldFNjcmlwdChzY3JpcHR1cmwpXG5cdFx0LmZhaWwoKCkgPT4ge1xuXHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5pyq6IO95Yqg6L295oKo55qEVHdpbmtsZeWPguaVsOiuvue9ricsICfmnKrog73ovInlhaXmgqjnmoRUd2lua2xl5YGP5aW96Kit5a6aJyksIHtcblx0XHRcdFx0dHlwZTogJ2Vycm9yJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZScsXG5cdFx0XHR9KTtcblx0XHR9KVxuXHRcdC5hbHdheXMoKCkgPT4ge1xuXHRcdFx0JChUd2lua2xlLmxvYWQpO1xuXHRcdH0pO1xuXHQvLyBEZXZlbG9wZXJzOiB5b3UgY2FuIGltcG9ydCBjdXN0b20gVHdpbmtsZSBtb2R1bGVzIGhlcmVcblx0Ly8gRm9yIGV4YW1wbGUsIG13LmxvYWRlci5sb2FkKHNjcmlwdHBhdGhiZWZvcmUgKyBcIlVzZXI6VW5jbGVEb3VnZ2llL21vcmViaXRzLXRlc3QuanNcIiArIHNjcmlwdHBhdGhhZnRlcik7XG5cdFR3aW5rbGUubG9hZCA9ICgpID0+IHtcblx0XHQvLyBEb24ndCBhY3RpdmF0ZSBvbiBzcGVjaWFsIHBhZ2VzIG90aGVyIHRoYW4gdGhvc2UgbGlzdGVkIGhlcmUsIHNvXG5cdFx0Ly8gdGhhdCBvdGhlcnMgbG9hZCBmYXN0ZXIsIGVzcGVjaWFsbHkgdGhlIHdhdGNobGlzdC5cblx0XHRsZXQgYWN0aXZlU3BlY2lhbFBhZ2VMaXN0ID0gWydCbG9jaycsICdDb250cmlidXRpb25zJywgJ0FidXNlTG9nJywgJ1JlY2VudGNoYW5nZXMnLCAnUmVjZW50Y2hhbmdlc2xpbmtlZCddOyAvLyB3Z1JlbGV2YW50VXNlck5hbWUgZGVmaW5lZCBmb3Igbm9uLXN5c29wcyBvbiBTcGVjaWFsOkJsb2NrXG5cdFx0aWYgKE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRhY3RpdmVTcGVjaWFsUGFnZUxpc3QgPSBbXG5cdFx0XHRcdC4uLmFjdGl2ZVNwZWNpYWxQYWdlTGlzdCxcblx0XHRcdFx0J0RlbGV0ZWRDb250cmlidXRpb25zJyxcblx0XHRcdFx0J1ByZWZpeGluZGV4Jyxcblx0XHRcdFx0J0Jyb2tlblJlZGlyZWN0cycsXG5cdFx0XHRdO1xuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAtMSAmJlxuXHRcdFx0IWFjdGl2ZVNwZWNpYWxQYWdlTGlzdC5pbmNsdWRlcyhtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBQcmV2ZW50IGNsaWNramFja2luZ1xuXHRcdGlmICh3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBTZXQgY3VzdG9tIEFwaS1Vc2VyLUFnZW50IGhlYWRlciwgZm9yIHNlcnZlci1zaWRlIGxvZ2dpbmcgcHVycG9zZXNcblx0XHRUd2lua2xlLnVzZXJBZ2VudCA9ICdUd2lua2xlLzEuMSc7XG5cdFx0TW9yZWJpdHMud2lraS5hcGkuc2V0QXBpVXNlckFnZW50KFR3aW5rbGUudXNlckFnZW50KTtcblx0XHRUd2lua2xlLmRpc2FibGVkTW9kdWxlcyA9IFsuLi5Ud2lua2xlLmdldFByZWYoJ2Rpc2FibGVkTW9kdWxlcycpLCAuLi5Ud2lua2xlLmdldFByZWYoJ2Rpc2FibGVkU3lzb3BNb2R1bGVzJyldO1xuXHRcdC8vIFJlZGVmaW5lIGFkZEluaXRDYWxsYmFjayBzbyB0aGF0IGFueSBtb2R1bGVzIGJlaW5nIGxvYWRlZCBub3cgb24gYXJlIGRpcmVjdGx5XG5cdFx0Ly8gaW5pdGlhbGlzZWQgcmF0aGVyIHRoYW4gYWRkZWQgdG8gaW5pdENhbGxiYWNrcyBhcnJheVxuXHRcdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrID0gKGZ1bmMsIG5hbWUpID0+IHtcblx0XHRcdGlmICghbmFtZSB8fCAhVHdpbmtsZS5kaXNhYmxlZE1vZHVsZXMuaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0ZnVuYygpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gSW5pdGlhbGlzZSBtb2R1bGVzIHRoYXQgd2VyZSBzYXZlZCBpbiBpbml0Q2FsbGJhY2tzIGFycmF5XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgVHdpbmtsZS5pbml0Q2FsbGJhY2tzKSB7XG5cdFx0XHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhtb2R1bGUuZnVuYywgbW9kdWxlLm5hbWUpO1xuXHRcdH1cblx0XHQvLyBJbmNyZWFzZXMgdGV4dCBzaXplIGluIFR3aW5rbGUgZGlhbG9ncywgaWYgc28gY29uZmlndXJlZFxuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2RpYWxvZ0xhcmdlRm9udCcpKSB7XG5cdFx0XHRtdy51dGlsLmFkZENTUyhcblx0XHRcdFx0Jy5tb3JlYml0cy1kaWFsb2ctY29udGVudCwubW9yZWJpdHMtZGlhbG9nLWZvb3Rlcmxpbmtze2ZvbnQtc2l6ZToxMDAlIWltcG9ydGFudH0ubW9yZWJpdHMtZGlhbG9nIGlucHV0LC5tb3JlYml0cy1kaWFsb2cgc2VsZWN0LC5tb3JlYml0cy1kaWFsb2ctY29udGVudCBidXR0b257Zm9udC1zaXplOmluaGVyaXQgIWltcG9ydGFudH0nXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvLyBIaWRlIHRoZSBsaW5nZXJpbmcgc3BhY2UgaWYgdGhlIFRXIG1lbnUgaXMgZW1wdHlcblx0XHRjb25zdCBpc1ZlY3RvciA9IFsndmVjdG9yJywgJ3ZlY3Rvci0yMDIyJ10uaW5jbHVkZXMobXcuY29uZmlnLmdldCgnc2tpbicpKTtcblx0XHRpZiAoaXNWZWN0b3IgJiYgVHdpbmtsZS5nZXRQcmVmKCdwb3J0bGV0VHlwZScpID09PSAnbWVudScgJiYgJGJvZHkuZmluZCgnI3AtdHdpbmtsZScpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0JGJvZHkuZmluZCgnI3AtY2FjdGlvbnMnKS5jc3MoJ21hcmdpbi1yaWdodCcsICdpbml0aWFsJyk7XG5cdFx0fVxuXHR9O1xuXHQvKipcblx0ICogVHdpbmtsZS1zcGVjaWZpYyB1dGlsaXR5IGZ1bmN0aW9ucyBzaGFyZWQgYnkgbXVsdGlwbGUgbW9kdWxlc1xuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGZpcnN0XG5cdCAqIEBwYXJhbSB7Kn0gc2Vjb25kXG5cdCAqL1xuXHQvLyBVc2VkIGluIGJhdGNoLCB1bmxpbmssIGFuZCBkZXByb2QgdG8gc29ydCBwYWdlcyBieSBuYW1lc3BhY2UsIGFzXG5cdC8vIGpzb24gZm9ybWF0dmVyc2lvbj0yIHNvcnRzIGJ5IHBhZ2VpZCBpbnN0ZWFkICgjMTI1MSlcblx0VHdpbmtsZS5zb3J0QnlOYW1lc3BhY2UgPSAoZmlyc3QsIHNlY29uZCkgPT4ge1xuXHRcdHJldHVybiBmaXJzdC5ucyAtIHNlY29uZC5ucyB8fCAoZmlyc3QudGl0bGUgPiBzZWNvbmQudGl0bGUgPyAxIDogLTEpO1xuXHR9O1xuXHQvLyBVc2VkIGluIHVubGluayBsaXN0aW5ncyB0byBsaW5rIHRoZSBwYWdlIHRpdGxlXG5cdFR3aW5rbGUuZ2VuZXJhdGVCYXRjaFBhZ2VMaW5rcyA9IChjaGVja2JveCkgPT4ge1xuXHRcdGNvbnN0ICRjaGVja2JveCA9ICQoY2hlY2tib3gpO1xuXHRcdGNvbnN0IGxpbmsgPSBNb3JlYml0cy5odG1sTm9kZSgnYScsICRjaGVja2JveC52YWwoKSk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3R3LWJhdGNocGFnZS1saW5rJyk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBtdy51dGlsLmdldFVybCgkY2hlY2tib3gudmFsKCkpKTtcblx0XHRsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuXHRcdCRjaGVja2JveC5uZXh0KCkucHJlcGVuZChbbGluaywgJyAnXSk7XG5cdH07XG59KShqUXVlcnkpO1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5cbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWFydi5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVhcnYoJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0LyoqXG5cdCAqIHR3aW5rbGVhcnYuanM6IEFSViBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiQVJWXCIpXG5cdCAqIEFjdGl2ZSBvbjogQW55IHBhZ2Ugd2l0aCByZWxldmFudCB1c2VyIG5hbWUgKHVzZXJzcGFjZSwgY29udHJpYnMsIGV0Yy4pXG5cdCAqL1xuXHRUd2lua2xlLmFydiA9ICgpID0+IHtcblx0XHRjb25zdCB1c2VybmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpO1xuXHRcdGlmICghdXNlcm5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgaXNJUCA9IG13LnV0aWwuaXNJUEFkZHJlc3ModXNlcm5hbWUpO1xuXHRcdGNvbnN0IHRpdGxlID0gaXNJUFxuXHRcdFx0PyB3aW5kb3cud2dVTFMoJ+aKpeWRiklQ57uZ566h55CG5ZGYJywgJ+WgseWRiklQ57Wm566h55CG5ZOhJylcblx0XHRcdDogd2luZG93LndnVUxTKCfmiqXlkYrnlKjmiLfnu5nnrqHnkIbkurrlkZgnLCAn5aCx5ZGK5L2/55So6ICF57Wm566h55CG5Lq65ZOhJyk7XG5cdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0VHdpbmtsZS5hcnYuY2FsbGJhY2sodXNlcm5hbWUsIGlzSVApO1xuXHRcdFx0fSxcblx0XHRcdHdpbmRvdy53Z1VMUygn5ZGK54q2JywgJ+WRiueLgCcpLFxuXHRcdFx0J3R3LWFydicsXG5cdFx0XHR0aXRsZVxuXHRcdCk7XG5cdH07XG5cdFR3aW5rbGUuYXJ2LmNhbGxiYWNrID0gKHVpZCwgaXNJUCkgPT4ge1xuXHRcdGlmICh1aWQgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkge1xuXHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5L2g5LiN5oOz5oql5ZGK5L2g6Ieq5bex77yM5a+55ZCn77yfJywgJ+S9oOS4jeaDs+WgseWRiuS9oOiHquW3se+8jOWwjeWQp++8nycpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZWFydicsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgV2luZG93ID0gbmV3IE1vcmViaXRzLnNpbXBsZVdpbmRvdyg2MDAsIDUwMCk7XG5cdFx0V2luZG93LnNldFRpdGxlKHdpbmRvdy53Z1VMUygn5oql5ZGK55So5oi357uZ566h55CG5Lq65ZGYJywgJ+WgseWRiuS9v+eUqOiAhee1pueuoeeQhuS6uuWToScpKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5ZGK54q26K6+572uJywgJ+WRiueLgOioreWumicpLCAnSDpUVy9QUkVGI2FydicpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXI+WRiueLgCcpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUuYXJ2LmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRjb25zdCBjYXRlZ29yaWVzID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRuYW1lOiAnY2F0ZWdvcnknLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCJ5oup5oql5ZGK57G75Z6L77yaJywgJ+mBuOaTh+WgseWRiumhnuWIpe+8micpLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYXJ2LmNhbGxiYWNrLmNoYW5nZUNhdGVnb3J5LFxuXHRcdH0pO1xuXHRcdGNhdGVnb3JpZXMuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56C05Z2P77yITElCOlZJUO+8iScsICfnoLTlo57vvIhMSUI6VklQ77yJJyksXG5cdFx0XHR2YWx1ZTogJ2FpdicsXG5cdFx0fSk7XG5cdFx0Y2F0ZWdvcmllcy5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnvJbovpHkuonorq7vvIhMSUI6RVdJUO+8iScsICfnt6jovK/niK3orbDvvIhMSUI6RVdJUO+8iScpLFxuXHRcdFx0dmFsdWU6ICdld2lwJyxcblx0XHR9KTtcblx0XHRjYXRlZ29yaWVzLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+WQje+8iExJQjpVQUHvvIknLCAn5L2/55So6ICF5ZCN56ix77yITElCOlVBQe+8iScpLFxuXHRcdFx0dmFsdWU6ICd1c2VybmFtZScsXG5cdFx0XHRkaXNhYmxlZDogbXcudXRpbC5pc0lQQWRkcmVzcyh1aWQpLFxuXHRcdH0pO1xuXHRcdGNhdGVnb3JpZXMuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YKA5YSh6LCD5p+l77yITElCOlNQSe+8iScsICflgoDlhKHoqr/mn6XvvIhMSUI6U1BJ77yJJyksXG5cdFx0XHR2YWx1ZTogJ3NwaScsXG5cdFx0XHRkaXNhYmxlZDogbXcudXRpbC5pc0lQQWRkcmVzcyh1aWQpLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0c3R5bGU6ICdjb2xvcjogI2YwMCcsXG5cdFx0XHRpZDogJ3R3aW5rbGUtYXJ2LWJsb2Nrd2FybmluZycsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiAnV29yayBhcmVhJyxcblx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdFx0bGFiZWw6ICfmj5DkuqQnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdoaWRkZW4nLFxuXHRcdFx0bmFtZTogJ3VpZCcsXG5cdFx0XHR2YWx1ZTogdWlkLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0V2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGJsb2NrZWQsIHVwZGF0ZSBub3RpY2Vcblx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGxpc3Q6ICdibG9ja3MnLFxuXHRcdFx0Ymtwcm9wOiAncmFuZ2V8ZmxhZ3MnLFxuXHRcdFx0Zm9ybWF0OiAnanNvbicsXG5cdFx0fTtcblx0XHRpZiAoaXNJUCkge1xuXHRcdFx0cXVlcnkuYmtpcCA9IHVpZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cXVlcnkuYmt1c2VycyA9IHVpZDtcblx0XHR9XG5cdFx0bmV3IE1vcmViaXRzLndpa2kuYXBpKHdpbmRvdy53Z1VMUygn5qOA5p+l55So5oi355qE5bCB56aB54q25oCBJywgJ+aqouafpeS9v+eUqOiAheeahOWwgemOlueLgOaFiycpLCBxdWVyeSwgKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgYmxvY2tsaXN0ID0gYXBpb2JqLmdldFJlc3BvbnNlKCkucXVlcnkuYmxvY2tzO1xuXHRcdFx0aWYgKGJsb2NrbGlzdC5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgW2Jsb2NrXSA9IGJsb2NrbGlzdDtcblx0XHRcdFx0bGV0IG1lc3NhZ2UgPVxuXHRcdFx0XHRcdChpc0lQID8gd2luZG93LndnVUxTKCfmraRJUOWcsOWdgCcsICfmraRJUOS9jeWdgCcpIDogd2luZG93LndnVUxTKCfmraTotKblj7cnLCAn5q2k6LOs6JmfJykpICtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+W3sue7j+iiqycsICflt7LntpPooqsnKSArXG5cdFx0XHRcdFx0KGJsb2NrLnBhcnRpYWwgPyAn6YOo5YiGJyA6ICcnKTtcblx0XHRcdFx0Ly8gU3RhcnQgYW5kIGVuZCBkaWZmZXIsIHJhbmdlIGJsb2NrZWRcblx0XHRcdFx0bWVzc2FnZSArPSBibG9jay5yYW5nZXN0YXJ0ID09PSAoYmxvY2sucmFuZ2VlbmQgPyAn5q61JyA6ICcnKSArIHdpbmRvdy53Z1VMUygn5bCB56aB44CCJywgJ+WwgemOluOAgicpO1xuXHRcdFx0XHRpZiAoYmxvY2sucGFydGlhbCkge1xuXHRcdFx0XHRcdCRib2R5LmZpbmQoJyN0d2lua2xlLWFydi1ibG9ja3dhcm5pbmcnKS5jc3MoJ2NvbG9yJywgJ2JsYWNrJyk7IC8vIExlc3Mgc2V2ZXJlXG5cdFx0XHRcdH1cblx0XHRcdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtYXJ2LWJsb2Nrd2FybmluZycpLnRleHQobWVzc2FnZSk7XG5cdFx0XHR9XG5cdFx0fSkucG9zdCgpO1xuXHRcdC8vIFdlIG11c3QgaW5pdCB0aGVcblx0XHRjb25zdCBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRyZXN1bHQuY2F0ZWdvcnkuZGlzcGF0Y2hFdmVudChldnQpO1xuXHR9O1xuXHRUd2lua2xlLmFydi5sdGFfbGlzdCA9IFtcblx0XHR7XG5cdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fpgInmi6knLCAn6KuL6YG45pOHJyksXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5hcnYuY2FsbGJhY2suc29ja21hc3Rlcl9jaGFuZ2VkID0gKGUpID0+IHtcblx0XHRUd2lua2xlLmFydi5jYWxsYmFjay5zZXRfc29ja21hc3RlcihlLnRhcmdldC52YWx1ZSk7XG5cdH07XG5cdFR3aW5rbGUuYXJ2LmNhbGxiYWNrLnNldF9zb2NrbWFzdGVyID0gKHNvY2ttYXN0ZXIpID0+IHtcblx0XHQkYm9keS5maW5kKCdjb2RlLnR3LWFydi1zb2NrbWFzdGVyJykudGV4dCgne3snLmNvbmNhdCgnc3Vic3Q6JywgYFNvY2tzdXNwZWN0bm90aWNlfDE9JHtzb2NrbWFzdGVyfX19YCkpO1xuXHR9O1xuXHRUd2lua2xlLmFydi5jYWxsYmFjay5jaGFuZ2VDYXRlZ29yeSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgdmFsdWVfID0gZS50YXJnZXQudmFsdWU7XG5cdFx0Y29uc3Qgcm9vdF8gPSBlLnRhcmdldC5mb3JtO1xuXHRcdGNvbnN0IFtvbGRfYXJlYV0gPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocm9vdF8sICd3b3JrX2FyZWEnKTtcblx0XHRsZXQgd29ya19hcmVhID0gbnVsbDtcblx0XHRjb25zdCBwcmV2aWV3bGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRwcmV2aWV3bGluay5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0cHJldmlld2xpbmsudGV4dENvbnRlbnQgPSB3aW5kb3cud2dVTFMoJ+mihOiniCcsICfpoJDopr0nKTtcblx0XHQkKHByZXZpZXdsaW5rKS5vbignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRUd2lua2xlLmFydi5jYWxsYmFjay5wcmV2aWV3KHJvb3RfKTtcblx0XHR9KTtcblx0XHRzd2l0Y2ggKHZhbHVlXykge1xuXHRcdFx0Y2FzZSAnZXdpcCc6XG5cdFx0XHRcdHdvcmtfYXJlYSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmiqXlkYrnvJbovpHkuonorq4nLCAn5aCx5ZGK57eo6Lyv54it6K2wJyksXG5cdFx0XHRcdFx0bmFtZTogJ3dvcmtfYXJlYScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZHluaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdwYWdlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnm7jlhbPpobXpnaLvvJonLCAn55u46Zec6aCB6Z2i77yaJyksXG5cdFx0XHRcdFx0c3VibGFiZWw6IHdpbmRvdy53Z1VMUygn6aG16Z2i77yaJywgJ+mggemdou+8micpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5aaC5LiN5biM5pyb6K6p5oql5ZGK6ZO+5o6l5Yiw6aG16Z2i77yM6K+355WZ56m6JywgJ+WmguS4jeW4jOacm+iuk+WgseWRiumAo+e1kOWIsOmggemdou+8jOiri+eVmeepuicpLFxuXHRcdFx0XHRcdG1pbjogMSxcblx0XHRcdFx0XHRtYXg6IDEwLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor4TorrrvvJonLCAn6KmV6KuW77yaJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogJ2FydnByZXZpZXcnLFxuXHRcdFx0XHRcdGxhYmVsOiBbcHJldmlld2xpbmtdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0d2lua2xlYXJ2LXByZXZpZXdib3gnLFxuXHRcdFx0XHRcdHN0eWxlOiAnZGlzcGxheTogbm9uZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEgPSB3b3JrX2FyZWEucmVuZGVyKCk7XG5cdFx0XHRcdG9sZF9hcmVhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdvcmtfYXJlYSwgb2xkX2FyZWEpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXJuYW1lJzpcblx0XHRcdFx0d29ya19hcmVhID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aKpeWRiuS4jeW9k+eUqOaIt+WQjScsICfloLHlkYrkuI3nlbbkvb/nlKjogIXlkI3nqLEnKSxcblx0XHRcdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S4jeW9k+eUqOaIt+WQjeexu+WeiycsICfkuI3nlbbkvb/nlKjogIXlkI3nqLHpoZ7liKUnKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5pyJ5YW95qGj5qGI6aaG5LiN5YWB6K645L2/55So5bim5pyJ6K+v5a+85oCn44CB5a6j5Lyg5oCn44CB5L6u6L6x5oCn5oiW56C05Z2P5oCn55qE55So5oi35ZCN44CC5q2k5aSW77yM5L2/55So5Z+f5ZCN5Y+K6YKu566x5Zyw5Z2A55qE55So5oi35ZCN5Lqm6KKr56aB5q2i44CC6L+Z5Lqb5YeG5YiZ5L+x5bqU5bqU55So6Iez55So5oi35ZCN5Y+K562+5ZCN44CC5Zyo5YW25LuW6K+t6KiA5Lit5LiN5b2T55qE55So5oi35ZCN5oiW6YCa6L+H6ZSZ5ou844CB5pu/5Luj44CB5pqX56S644CB5ouG5a2X5oiW5Lu75L2V6Ze05o6l5pa55rOV6L6+5oiQ55qE6Z2e5aal5b2T55So5oi35ZCN5ZCM5qC36KeG5Li66L+d6KeE44CCJyxcblx0XHRcdFx0XHRcdCfmnInnjbjmqpTmoYjppKjkuI3lhYHoqLHkvb/nlKjluLbmnInoqqTlsI7mgKfjgIHlrqPlgrPmgKfjgIHkvq7ovrHmgKfmiJbnoLTlo57mgKfnmoTkvb/nlKjogIXlkI3nqLHjgILmraTlpJbvvIzkvb/nlKjln5/lkI3lj4rpm7vlrZDkv6HnrrHkvY3lnYDnmoTkvb/nlKjogIXlkI3nqLHkuqbooqvnpoHmraLjgILpgJnkupvmupbliYfkv7Hmh4nmh4nnlKjoh7Pkvb/nlKjogIXlkI3nqLHlj4rnsL3lkI3jgILlnKjlhbbku5boqp7oqIDkuK3kuI3nlbbnmoTkvb/nlKjogIXlkI3nqLHmiJbpgJrpgY7pjK/mi7zjgIHmm7/ku6PjgIHmmpfnpLrjgIHmi4blrZfmiJbku7vkvZXplpPmjqXmlrnms5XpgZTmiJDnmoTpnZ7lpqXnlbbkvb/nlKjogIXlkI3nqLHlkIzmqKPoppbngrrpgZXopo/jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bmFtZTogJ2FydnR5cGUnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K+v5a+85oCn55So5oi35ZCNJywgJ+iqpOWwjuaAp+S9v+eUqOiAheWQjeeosScpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCfor6/lr7zmgKcnLCAn6Kqk5bCO5oCnJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K+v5a+85oCn55So5oi35ZCN6ZqQ5ZCr552A5LiO6LSh54yu6ICF55u45YWz5oiW6K+v5a+85LuW5Lq655qE5LqL5oOF44CC5L6L5aaC77iw5LiN5a6e6KeC54K544CB5pqX56S66LSm5Y+35oul5pyJ54m55a6a5p2D6ZmQ5oiW5pqX56S66K+l6LSm5Y+35bm26Z2e55Sx5LiA5Lq65oul5pyJ6ICM5piv55Sx5LiA5Liq57uE576k44CB5LiA5Liq6aG555uu5oiW5LiA5Liq6ZuG5L2T6L+Q5L2c44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn6Kqk5bCO5oCn5L2/55So6ICF5ZCN56ix6Zqx5ZCr6JGX6IiH6LKi54276ICF55u46Zec5oiW6Kqk5bCO5LuW5Lq655qE5LqL5oOF44CC5L6L5aaC77iw5LiN5a+m6KeA6bue44CB5pqX56S66LOs6Jmf5pOB5pyJ54m55a6a5qyK6ZmQ5oiW5pqX56S66Kmy6LOs6Jmf5Lim6Z2e55Sx5LiA5Lq65pOB5pyJ6ICM5piv55Sx5LiA5YCL576k57WE44CB5LiA5YCL6KiI55Wr5oiW5LiA5YCL6ZuG6auU6YGL5L2c44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5a6j5Lyg5oCn55So5oi35ZCNJywgJ+Wuo+WCs+aAp+S9v+eUqOiAheWQjeeosScpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCflrqPkvKDmgKcnLCAn5a6j5YKz5oCnJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5a6j5Lyg5oCn55So5oi35ZCN5Lya5LqO5pyJ5YW95qGj5qGI6aaG5LiK6LW35o6o6ZSA5LiA5Liq57uE576k5oiW5LiA6Ze05YWs5Y+455qE5L2c55So44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5a6j5YKz5oCn5L2/55So6ICF5ZCN56ix5pyD5pa85pyJ54245qqU5qGI6aSo5LiK6LW35o6o6Yq35LiA5YCL576k57WE5oiW5LiA6ZaT5YWs5Y+455qE5L2c55So44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pqX56S65bm26Z2e55Sx5LiA5Lq65oul5pyJJywgJ+aal+ekuuS4pumdnueUseS4gOS6uuaTgeaciScpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3NoYXJlZCcsXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5q+P5Liq6LSm5Y+35Y+q5Y+v5Lul5Luj6KGo5Liq5Lq677yI5a656K645LiA5Lqb5L6L5aSW5oOF5Ya177yJ77yM5omA5pyJ5LiO5LuW5Lq65YiG5Lqr6LSm5Y+355qE6KGM5Li677yI5YyF5ous5YiG5Lqr6LSm5Y+35a+G56CB77yJ5Z2H6KKr56aB5q2i44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5q+P5YCL6LOs6Jmf5Y+q5Y+v5Lul5Luj6KGo5YCL5Lq677yI5a656Kix5LiA5Lqb5L6L5aSW5oOF5rOB77yJ77yM5omA5pyJ6IiH5LuW5Lq65YiG5Lqr6LOs6Jmf55qE6KGM54K677yI5YyF5ous5YiG5Lqr6LOs6Jmf5a+G56K877yJ5Z2H6KKr56aB5q2i44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L6u6L6x5oCn55So5oi35ZCNJywgJ+S+rui+seaAp+S9v+eUqOiAheWQjeeosScpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ+S+rui+seaApycsXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5L6u6L6x5oCn55So5oi35ZCN5Luk5Y2P6LCD57yW6L6R5Y+Y5b6X5Zuw6Zq+77yM55Sa6Iez5peg5Y+v6IO944CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5L6u6L6x5oCn5L2/55So6ICF5ZCN56ix5Luk5Y2U6Kq/57eo6Lyv6K6K5b6X5Zuw6Zuj77yM55Sa6Iez54Sh5Y+v6IO944CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56C05Z2P5oCn55So5oi35ZCNJywgJ+egtOWjnuaAp+S9v+eUqOiAheWQjeeosScpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCfnoLTlnY/mgKcnLCAn56C05aOe5oCnJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn56C05Z2P5oCn55So5oi35ZCN5YyF5ous5Lq66Lqr5pS75Ye744CB5Lyq5YaS5LuW5Lq65oiW5YW25LuW5LiA5YiH5pyJ552A5riF5pmw5Y+v6KeB55qE56C05Z2P5pyJ5YW95qGj5qGI6aaG5oSP5Zu+55qE55So5oi35ZCN44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn56C05aOe5oCn5L2/55So6ICF5ZCN56ix5YyF5ous5Lq66Lqr5pS75pOK44CB5YG95YaS5LuW5Lq65oiW5YW25LuW5LiA5YiH5pyJ6JGX5riF5pmw5Y+v6KaL55qE56C05aOe5pyJ54245qqU5qGI6aSo5oSP5ZyW55qE5L2/55So6ICF5ZCN56ix44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WcqOmhtemdouS4iumakOiXj+eUqOaIt+WQje+8iOmcgOebkeedo+eahOeUqOaIt+WQjeivt+WLv+S6juermeWGheaKpeWRiu+8jOWLvumAieatpOmhueW5tuS4jeaehOaIkOiDveWcqOermeWGheaKpeWRiueahOeQhueUse+8iScsXG5cdFx0XHRcdFx0XHRcdFx0J+WcqOmggemdouS4iumaseiXj+S9v+eUqOiAheWQjeeose+8iOmcgOebo+edo+eahOS9v+eUqOiAheWQjeeoseiri+WLv+aWvOermeWFp+WgseWRiu+8jOWLvumBuOatpOmgheS4puS4jeani+aIkOiDveWcqOermeWFp+WgseWRiueahOeQhueUse+8iSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfoi6XnlKjmiLflkI3kuI3lvZPor7fli77pgInmraTpobnvvIzms6jmhI/vvJror7fogIPomZHnp4HkuIvogZTns7vnrqHnkIblkZjlpITnkIbjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfoi6Xkvb/nlKjogIXlkI3nqLHkuI3nlbboq4vli77pgbjmraTpoIXvvIzms6jmhI/vvJroq4vogIPmha7np4HkuIvoga/ntaHnrqHnkIblk6HomZXnkIbjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdoaWRlbmFtZScsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnaGlkZW5hbWUnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdHN0eWxlOiAnZm9udC13ZWlnaHQ6IGJvbGQ7Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K+E6K6677yaJywgJ+ipleirlu+8micpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICdhcnZwcmV2aWV3Jyxcblx0XHRcdFx0XHRsYWJlbDogW3ByZXZpZXdsaW5rXSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGlkOiAndHdpbmtsZWFydi1wcmV2aWV3Ym94Jyxcblx0XHRcdFx0XHRzdHlsZTogJ2Rpc3BsYXk6IG5vbmUnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhID0gd29ya19hcmVhLnJlbmRlcigpO1xuXHRcdFx0XHRvbGRfYXJlYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3b3JrX2FyZWEsIG9sZF9hcmVhKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzcGknOlxuXHRcdFx0XHR3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y+R6LW35YKA5YSh6LCD5p+lJywgJ+eZvOi1t+WCgOWEoeiqv+afpScpLFxuXHRcdFx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAnc29ja21hc3RlcicsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfkuLvotKblj7fnmoTnlKjmiLflkI3vvIjkuI3lkKtVc2VyOuWJjee8gO+8iScsICfkuLvos6zomZ/nmoTkvb/nlKjogIXlkI3nqLHvvIjkuI3lkKtVc2VyOuWtl+mmlu+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiByb290Xy51aWQudmFsdWUsXG5cdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYXJ2LmNhbGxiYWNrLnNvY2ttYXN0ZXJfY2hhbmdlZCxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGlkOiAndHdpbmtsZWFydi1zcGlub3RpY2Vib3gnLFxuXHRcdFx0XHRcdHN0eWxlOiAnZGlzcGxheTogbm9uZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZHluaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdzb2NrcHVwcGV0Jyxcblx0XHRcdFx0XHRsYWJlbDogJ+WCgOWEoScsXG5cdFx0XHRcdFx0c3VibGFiZWw6ICflgoDlhKHvvJonLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5YKA5YSh55qE55So5oi35ZCN77yI5LiN5ZCrVXNlcjrliY3nvIDvvIknLCAn5YKA5YSh55qE5L2/55So6ICF5ZCN56ix77yI5LiN5ZCrVXNlcjrlrZfpppbvvIknKSxcblx0XHRcdFx0XHRtaW46IDIsXG5cdFx0XHRcdFx0bWF4OiA5LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor4Hmja7vvJonLCAn6K2J5pOa77yaJyksXG5cdFx0XHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+i+k+WFpeiDveWkn+eUqOadpeS9k+eOsOi/meS6m+eUqOaIt+WPr+iDvea7peeUqOWkmumHjei0puWPt+eahOivgeaNru+8jOi/memAmuW4uOWMheaLrOiMtummhuWPkeiogOOAgemhtemdouWOhuWPsuaIluWFtuS7luacieWFs+eahOS/oeaBr+OAguivt+mBv+WFjeWcqOatpOWkhOaPkOS+m+mdnuS4juWCgOWEoeaIlua7peeUqOWkmumHjei0puWPt+ebuOWFs+eahOWFtuS7luiuqOiuuuOAgicsXG5cdFx0XHRcdFx0XHQn6Ly45YWl6IO95aSg55So5L6G6auU54++6YCZ5Lqb5L2/55So6ICF5Y+v6IO95r+r55So5aSa6YeN6LOs6Jmf55qE6K2J5pOa77yM6YCZ6YCa5bi45YyF5ous6Iy26aSo55m86KiA44CB6aCB6Z2i5q235Y+y5oiW5YW25LuW5pyJ6Zec55qE6LOH6KiK44CC6KuL6YG/5YWN5Zyo5q2k6JmV5o+Q5L6b6Z2e6IiH5YKA5YSh5oiW5r+r55So5aSa6YeN6LOs6Jmf55u46Zec55qE5YW25LuW6KiO6KuW44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K+35rGC55So5oi35p+l5qC4JywgJ+iri+axguS9v+eUqOiAheafpeaguCcpLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiAnY2hlY2t1c2VyJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmiLfmn6XmoLjmmK/kuIDnp43nlKjkuo7ojrflj5blgoDlhKHmjIfmjqfnm7jlhbPmioDmnK/or4Hmja7nmoTlt6XlhbfvvIzoi6XmsqHmnInmraPlvZPnkIbnlLHliJnkuI3kvJrkvb/nlKjvvIzmgqjlv4XpobvlnKjor4Hmja7lrZfmrrXlhYXliIbop6Pph4rkuLrku4DkuYjpnIDopoHkvb/nlKjor6Xlt6XlhbfjgILnlKjmiLfmn6XmoLjkuI3kvJrnlKjkuo7lhazlvIDov57mjqXnlKjmiLfotKblj7fkvb/nlKjnmoRJUOWcsOWdgOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+S9v+eUqOiAheafpeaguOaYr+S4gOeorueUqOaWvOeNsuWPluWCgOWEoeaMh+aOp+ebuOmXnOaKgOihk+itieaTmueahOW3peWFt++8jOiLpeaykuacieato+eVtueQhueUseWJh+S4jeacg+S9v+eUqO+8jOaCqOW/hemgiOWcqOitieaTmuashOS9jeWFheWIhuino+mHi+eCuuS7gOm6vOmcgOimgeS9v+eUqOipsuW3peWFt+OAguS9v+eUqOiAheafpeaguOS4jeacg+eUqOaWvOWFrOmWi+mAo+aOpeS9v+eUqOiAheizrOiZn+S9v+eUqOeahElQ5L2N5Z2A44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICdhcnZwcmV2aWV3Jyxcblx0XHRcdFx0XHRsYWJlbDogW3ByZXZpZXdsaW5rXSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGlkOiAndHdpbmtsZWFydi1wcmV2aWV3Ym94Jyxcblx0XHRcdFx0XHRzdHlsZTogJ2Rpc3BsYXk6IG5vbmUnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0bGFiZWw6IFtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6K+35L2/55So5bi46K+G5Yaz5a6a5piv5ZCm5LulJywgJ+iri+S9v+eUqOW4uOitmOaxuuWumuaYr+WQpuS7pScpLFxuXHRcdFx0XHRcdFx0JCgnPGNvZGU+JykuYWRkQ2xhc3MoJ3R3LWFydi1zb2NrbWFzdGVyJykuY3NzKCdtYXJnaW4nLCAnMnB4OycpWzBdLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn6YCa55+l55So5oi344CC6L+Z5LiN5piv5b+F6aG755qE77yM5a+55LqO5raJ5Y+K5paw55So5oi355qE5oql5ZGK6ICM6KiA77yM6YCa55+l5LuW5Lus6IO96K6p5oql5ZGK5pi+5b6X5pu05YWs5bmz77yM5L2G5piv6K645aSa5oOF5Ya15LiL77yI5aaC6ZW/5pyf56C05Z2P6ICF77yJ6YCa55+l5pu05Y+v6IO96YCC5b6X5YW25Y+N44CCJyxcblx0XHRcdFx0XHRcdFx0J+mAmuefpeS9v+eUqOiAheOAgumAmeS4jeaYr+W/hemgiOeahO+8jOWwjeaWvOa2ieWPiuaWsOS9v+eUqOiAheeahOWgseWRiuiAjOiogO+8jOmAmuefpeS7luWAkeiDveiuk+WgseWRiumhr+W+l+abtOWFrOW5s++8jOS9huaYr+ioseWkmuaDheazgeS4i++8iOWmgumVt+acn+egtOWjnuiAhe+8iemAmuefpeabtOWPr+iDvemBqeW+l+WFtuWPjeOAgidcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYSA9IHdvcmtfYXJlYS5yZW5kZXIoKTtcblx0XHRcdFx0JCgnaW5wdXQ6dGV4dFtuYW1lPXNvY2twdXBwZXRdJywgd29ya19hcmVhKS5maXJzdCgpLnZhbChyb290Xy51aWQudmFsdWUpO1xuXHRcdFx0XHRvbGRfYXJlYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3b3JrX2FyZWEsIG9sZF9hcmVhKTtcblx0XHRcdFx0cm9vdF8uc3Bpbm90aWNlcHJldmlld2VyID0gbmV3IE1vcmViaXRzLndpa2kucHJldmlldyhcblx0XHRcdFx0XHQkKHdvcmtfYXJlYSkuZmluZCgnI3R3aW5rbGVhcnYtc3Bpbm90aWNlYm94JykubGFzdCgpWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHRcdFR3aW5rbGUuYXJ2LmNhbGxiYWNrLnNldF9zb2NrbWFzdGVyKHJvb3RfLnVpZC52YWx1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiBjYXNlICdhaXYnOiAqL1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0d29ya19hcmVhID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aKpeWRiueUqOaIt+egtOWdjycsICfloLHlkYrkvb/nlKjogIXnoLTlo54nKSxcblx0XHRcdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5o+Q5oql5YKA5YSh5bqU5LyY5YWI5Y+R6YCB6Iez5YKA5YSh6LCD5p+l77yM6Zmk6Z2e55u45YWz55qE6LSm5Y+35pyJ6auY6aKR546H44CB5raJ5Y+K5aSa5Liq6aG16Z2i562J57Sn5oCl5Lil6YeN55qE56C05Z2P6KGM5Li644CCJyxcblx0XHRcdFx0XHRcdCfmj5DloLHlgoDlhKHmh4nlhKrlhYjnmbzpgIHoh7PlgoDlhKHoqr/mn6XvvIzpmaTpnZ7nm7jpl5znmoTos6zomZ/mnInpq5jpoLvnjofjgIHmtonlj4rlpJrlgIvpoIHpnaLnrYnnt4rmgKXlmrTph43nmoTnoLTlo57ooYzngrrjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3BhZ2UnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ebuOWFs+mhtemdou+8micsICfnm7jpl5zpoIHpnaLvvJonKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WmguS4jeW4jOacm+iuqeaKpeWRiumTvuaOpeWIsOmhtemdou+8jOivt+eVmeepuicsICflpoLkuI3luIzmnJvorpPloLHlkYrpgKPntZDliLDpoIHpnaLvvIzoq4vnlZnnqbonKSxcblx0XHRcdFx0XHR2YWx1ZTogbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlJykgfHwgJycsXG5cdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qge3ZhbHVlfSA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0XHRcdGNvbnN0IHJvb3QgPSBldmVudC50YXJnZXQuZm9ybTtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gJycpIHtcblx0XHRcdFx0XHRcdFx0cm9vdC5iYWRpZC5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHJvb3QuZ29vZGlkLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJvb3QuYmFkaWQuZGlzYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0cm9vdC5nb29kaWQuZGlzYWJsZWQgPSByb290LmJhZGlkLnZhbHVlID09PSAnJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAnYmFkaWQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WPl+WIsOegtOWdj+eahOS/ruiuoueJiOacrO+8micsICflj5fliLDnoLTlo57nmoTkv67oqILniYjmnKzvvJonKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+eVmeepuuS7peeVpei/h+W3ruW8gicsICfnlZnnqbrku6XnlaXpgY7lt67nlbAnKSxcblx0XHRcdFx0XHR2YWx1ZTogbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlcmV2aWQnKSB8fCAnJyxcblx0XHRcdFx0XHRkaXNhYmxlZDogIW13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgndmFuYXJ0aWNsZScpLFxuXHRcdFx0XHRcdGV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHt2YWx1ZX0gPSBldmVudC50YXJnZXQ7XG5cdFx0XHRcdFx0XHRjb25zdCByb290ID0gZXZlbnQudGFyZ2V0LmZvcm07XG5cdFx0XHRcdFx0XHRyb290Lmdvb2RpZC5kaXNhYmxlZCA9IHZhbHVlID09PSAnJztcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAnZ29vZGlkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnoLTlnY/liY3nmoTkv67orqLniYjmnKzvvJonLCAn56C05aOe5YmN55qE5L+u6KiC54mI5pys77yaJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfnlZnnqbrku6XnlaXov4flt67lvILnmoTovoPml6nniYjmnKwnLCAn55WZ56m65Lul55Wl6YGO5beu55Ww55qE6LyD5pep54mI5pysJyksXG5cdFx0XHRcdFx0dmFsdWU6IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgndmFuYXJ0aWNsZWdvb2RyZXZpZCcpIHx8ICcnLFxuXHRcdFx0XHRcdGRpc2FibGVkOiAhbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlJykgfHwgbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlcmV2aWQnKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bmFtZTogJ2FydnR5cGUnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bey5Y+R5Ye65pyA5ZCO6K2m5ZGKJywgJ+W3sueZvOWHuuacgOW+jOitpuWRiicpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2ZpbmFsJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+Wwgeemgei/h+acn+WQjumaj+WNs+egtOWdjycsICflsIHpjpbpgY7mnJ/lvozpmqjljbPnoLTlo54nKSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdwb3N0YmxvY2snLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pi+6ICM5piT6KeB55qE57qv56C05Z2P55So5oi3JywgJ+mhr+iAjOaYk+imi+eahOe0lOegtOWjnuS9v+eUqOiAhScpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3ZhbmRhbG9ubHknLFxuXHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogbXcudXRpbC5pc0lQQWRkcmVzcyhyb290Xy51aWQudmFsdWUpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pi+6ICM5piT6KeB55qEc3BhbWJvdOaIluWkseeqg+i0puWPtycsICfpoa/ogIzmmJPopovnmoRzcGFtYm905oiW5aSx56uK6LOs6JmfJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnc3BhbWJvdCcsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfku4XnlKjmnaXmlaPlj5Hlub/lkYrlrqPkvKDnmoTnlKjmiLcnLCAn5YOF55So5L6G5pWj55m85buj5ZGK5a6j5YKz55qE5L2/55So6ICFJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAncHJvbW9vbmx5Jyxcblx0XHRcdFx0XHRcdFx0ZGlzYWJsZWQ6IG13LnV0aWwuaXNJUEFkZHJlc3Mocm9vdF8udWlkLnZhbHVlKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghbXcudXRpbC5pc0lQQWRkcmVzcyhtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSkpIHtcblx0XHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjpobXpnaLkuIrlj4rnvJbovpHmkZjopoHpmpDol4/nlKjmiLflkI0nLCAn5Zyo6aCB6Z2i5LiK5Y+K57eo6Lyv5pGY6KaB6Zqx6JeP5L2/55So6ICF5ZCN56ixJyksXG5cdFx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+iLpeeUqOaIt+WQjeS4jeW9k+ivt+WLvumAieatpOmhue+8jOazqOaEj++8muivt+iAg+iZkeengeS4i+iBlOezu+euoeeQhuWRmOWkhOeQhuOAgicsXG5cdFx0XHRcdFx0XHRcdFx0XHQn6Iul5L2/55So6ICF5ZCN56ix5LiN55W26KuL5Yu+6YG45q2k6aCF77yM5rOo5oSP77ya6KuL6ICD5oWu56eB5LiL6IGv57Wh566h55CG5ZOh6JmV55CG44CCJ1xuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogJ2hpZGVuYW1lJyxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2hpZGVuYW1lJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor4TorrrvvJonLCAn6KmV6KuW77yaJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogJ2FydnByZXZpZXcnLFxuXHRcdFx0XHRcdGxhYmVsOiBbcHJldmlld2xpbmtdLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0d2lua2xlYXJ2LXByZXZpZXdib3gnLFxuXHRcdFx0XHRcdHN0eWxlOiAnZGlzcGxheTogbm9uZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEgPSB3b3JrX2FyZWEucmVuZGVyKCk7XG5cdFx0XHRcdG9sZF9hcmVhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdvcmtfYXJlYSwgb2xkX2FyZWEpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cm9vdF8ucHJldmlld2VyID0gbmV3IE1vcmViaXRzLndpa2kucHJldmlldygkKHdvcmtfYXJlYSkuZmluZCgnI3R3aW5rbGVhcnYtcHJldmlld2JveCcpLmxhc3QoKVswXSk7XG5cdH07XG5cdFR3aW5rbGUuYXJ2LmNhbGxiYWNrLnByZXZpZXcgPSAoZm9ybSkgPT4ge1xuXHRcdGNvbnN0IHJlYXNvbiA9IFR3aW5rbGUuYXJ2LmNhbGxiYWNrLmdldFJlcG9ydFdpa2l0ZXh0KGZvcm0pO1xuXHRcdGlmIChyZWFzb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBpbnB1dCA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZm9ybSk7XG5cdFx0bGV0IHRpdGxlO1xuXHRcdHN3aXRjaCAoaW5wdXQuY2F0ZWdvcnkpIHtcblx0XHRcdGNhc2UgJ3ZpcCc6XG5cdFx0XHRcdHRpdGxlID0gJ0xJQl90YWxrOuaKpeWRiuW9k+WJjeegtOWdjyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZXdpcCc6XG5cdFx0XHRcdHRpdGxlID0gJ0xJQl90YWxrOueuoeeQhuWRmOWRiuekuuadvyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcm5hbWUnOlxuXHRcdFx0XHR0aXRsZSA9ICdMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb8nO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NwaSc6XG5cdFx0XHRcdHRpdGxlID0gJ0xJQl90YWxrOueuoeeQhuWRmOWRiuekuuadvyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRmb3JtLnByZXZpZXdlci5iZWdpblJlbmRlcihgX19OT1RPQ19fJHtyZWFzb25bMF19YCwgdGl0bGUpO1xuXHR9O1xuXHRUd2lua2xlLmFydi5jYWxsYmFjay5nZXRSZXBvcnRXaWtpdGV4dCA9IChmb3JtKSA9PiB7XG5cdFx0Y29uc3QgaW5wdXQgPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0SW5wdXREYXRhKGZvcm0pO1xuXHRcdGxldCByZWFzb24gPSAnJztcblx0XHRsZXQgY29tbWVudCA9ICcnO1xuXHRcdGNvbnN0IHt1aWR9ID0gaW5wdXQ7XG5cdFx0Y29uc3QgY2hlY2tUaXRsZSA9ICh0aXRsZSwgcmV2aWQpID0+IHtcblx0XHRcdGlmICgvaHR0cHM/OlxcL1xcLy8udGVzdCh0aXRsZSkpIHtcblx0XHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6aG16Z2i5ZCN56ew5LiN6IO95L2/55So572R5Z2A44CCJywgJ+mggemdouWQjeeoseS4jeiDveS9v+eUqOe2suWdgOOAgicpLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHBhZ2VfO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cGFnZV8gPSBuZXcgbXcuVGl0bGUodGl0bGUpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdG13Lm5vdGlmeShcblx0XHRcdFx0XHRgJHtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn4oCcJywgJ+OAjCcpICtcblx0XHRcdFx0XHRcdHRpdGxlICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+KAneS4jeaYr+S4gOS4quacieaViOeahOmhtemdouWQjeensO+8jOWmguimgeS9v+eUqOW3ruW8gumTvuaOpeivt+aUvuWcqOKAnOivhOiuuuKAnScsXG5cdFx0XHRcdFx0XHRcdCfjgI3kuI3mmK/kuIDlgIvmnInmlYjnmoTpoIHpnaLlkI3nqLHvvIzlpoLopoHkvb/nlKjlt67nlbDpgKPntZDoq4vmlL7lnKjjgIzoqZXoq5bjgI0nXG5cdFx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdChyZXZpZCA/IHdpbmRvdy53Z1VMUygn77yM5oiW5q2j56Gu6L6T5YWl4oCc5L+u6K6i54mI5pys4oCdJywgJ++8jOaIluato+eiuui8uOWFpeOAjOS/ruiogueJiOacrOOAjScpIDogJycpXG5cdFx0XHRcdFx0feOAgmAsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZWFydicsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFnZV8ubmFtZXNwYWNlID09PSAtMSkge1xuXHRcdFx0XHRtdy5ub3RpZnkoXG5cdFx0XHRcdFx0YCR7XG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+KAnCcsICfjgIwnKSArXG5cdFx0XHRcdFx0XHR0aXRsZSArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCfigJ3lsZ7kuo7nibnmrorpobXpnaLvvIzlpoLopoHkvb/nlKjlt67lvILpk77mjqXor7fmlL7lnKjigJzor4TorrrigJ0nLFxuXHRcdFx0XHRcdFx0XHQn44CN5bGs5pa854m55q6K6aCB6Z2i77yM5aaC6KaB5L2/55So5beu55Ww6YCj57WQ6KuL5pS+5Zyo44CM6KmV6KuW44CNJ1xuXHRcdFx0XHRcdFx0KSArXG5cdFx0XHRcdFx0XHQocmV2aWQgPyB3aW5kb3cud2dVTFMoJ++8jOaIluato+ehrui+k+WFpeKAnOS/ruiuoueJiOacrOKAnScsICfvvIzmiJbmraPnorrovLjlhaXjgIzkv67oqILniYjmnKzjgI0nKSA6ICcnKVxuXHRcdFx0XHRcdH3jgIJgLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBhZ2VfO1xuXHRcdH07XG5cdFx0bGV0IHBhZ2U7XG5cdFx0c3dpdGNoIChpbnB1dC5jYXRlZ29yeSkge1xuXHRcdFx0Ly8gUmVwb3J0IDNSUlxuXHRcdFx0Y2FzZSAnZXdpcCc6IHtcblx0XHRcdFx0aWYgKGlucHV0LnJlYXNvbiA9PT0gJycpIHtcblx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfmgqjlv4XpobvmjIflrprnkIbnlLEnLCAn5oKo5b+F6aCI5oyH5a6a55CG55SxJyksIHtcblx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZWFzb24gKz0gYD09IOe8lui+keaImOS4vuaKpe+8iCR7dWlkfe+8iSA9PVxcbmA7XG5cdFx0XHRcdHJlYXNvbiArPSBgKiAnJyd7e3ZhbmRhbHwkey9bPV0vLnRlc3QodWlkKSA/ICcxPScgOiAnJ30ke3VpZH19fScnJ1xcbmA7XG5cdFx0XHRcdGNvbnN0IHBhZ2VzID0gJCgnaW5wdXQ6dGV4dFtuYW1lPXBhZ2VdJywgZm9ybSkubWFwKChvLCBlKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuICQoZSkudmFsKCkgfHwgbnVsbDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvciAoY29uc3QgcGFnZV8gb2YgcGFnZXMpIHtcblx0XHRcdFx0XHRwYWdlID0gY2hlY2tUaXRsZShwYWdlXywgZmFsc2UpO1xuXHRcdFx0XHRcdGlmICghcGFnZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb21tZW50ICs9IGAqIHt7cGFnZWxpbmtzfCR7XG5cdFx0XHRcdFx0XHRwYWdlLmdldFByZWZpeGVkVGV4dCgpLmluY2x1ZGVzKCc9JykgPyAnMT0nIDogJydcblx0XHRcdFx0XHR9JHtwYWdlLmdldFByZWZpeGVkVGV4dCgpfX19XFxuYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpbnB1dC5yZWFzb24gPSBpbnB1dC5yZWFzb24ucmVwbGFjZSgvXFxuXFxuKy9nLCAnXFxuJyk7XG5cdFx0XHRcdGlucHV0LnJlYXNvbiA9IGlucHV0LnJlYXNvbi5yZXBsYWNlKC9cXHI/XFxuL2csICdcXG4qOicpOyAvLyBpbmRlbnQgbmV3bGluZXNcblx0XHRcdFx0Y29tbWVudCArPSBgKiAke2lucHV0LnJlYXNvbn1cXG5gO1xuXHRcdFx0XHRjb21tZW50ID0gY29tbWVudC50cmltKCk7XG5cdFx0XHRcdGNvbW1lbnQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oY29tbWVudCk7XG5cdFx0XHRcdHJlYXNvbiArPSBgJHtjb21tZW50fVxcbiog5o+Q5oql5Lq677yafn5gLmNvbmNhdCgnfn5cXG4qIOWkhOeQhu+8micpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdC8vIFJlcG9ydCBpbmFwcHJvcHJpYXRlIHVzZXJuYW1lXG5cdFx0XHRjYXNlICd1c2VybmFtZSc6IHtcblx0XHRcdFx0bGV0IHR5cGVzID0gaW5wdXQuYXJ2dHlwZS5tYXAoTW9yZWJpdHMuc3RyaW5nLnRvTG93ZXJDYXNlRmlyc3RDaGFyKTtcblx0XHRcdFx0Y29uc3QgaGFzU2hhcmVkID0gdHlwZXMuaW5jbHVkZXMoJ3NoYXJlZCcpO1xuXHRcdFx0XHRpZiAoaGFzU2hhcmVkKSB7XG5cdFx0XHRcdFx0dHlwZXMuc3BsaWNlKHR5cGVzLmluZGV4T2YoJ3NoYXJlZCcpLCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dHlwZXMuaW5jbHVkZXMoJ+S+rui+seaApycpICYmXG5cdFx0XHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCforablkYrvvJrkuKXph43nmoTkvq7ovrHmgKfnlKjmiLflkI3lkozpkojlr7nnibnlrprkuKrkurrnmoTkvq7ovrHmgKfnlKjmiLflkI3kuI3lupTlnKjlhazlvIDpobXpnaLmiqXlkYrvvIzogIzmmK/lupTlvZPnp4HkuIvogZTns7vnm5HnnaPlkZjlpITnkIbjgILmmK/lkKbnu6fnu63vvJ8nLFxuXHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Zq06YeN55qE5L6u6L6x5oCn5L2/55So6ICF5ZCN56ix5ZKM6Yed5bCN54m55a6a5YCL5Lq655qE5L6u6L6x5oCn5L2/55So6ICF5ZCN56ix5LiN5oeJ5Zyo5YWs6ZaL6aCB6Z2i5aCx5ZGK77yM6ICM5piv5oeJ55W256eB5LiL6IGv57Wh55uj552j5ZOh6JmV55CG44CC5piv5ZCm57m857qM77yfJ1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlcy5sZW5ndGggPD0gMikge1xuXHRcdFx0XHRcdHR5cGVzID0gdHlwZXMuam9pbign5ZKMJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHlwZXMgPSBbdHlwZXMuc2xpY2UoMCwgLTEpLmpvaW4oJ+OAgScpLCB0eXBlcy5zbGljZSgtMSldLmpvaW4oJ+WSjCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbW1lbnQgKz0gYCp7e3VzZXItdWFhfDE9JHt1aWR9YDtcblx0XHRcdFx0aWYgKGlucHV0LmhpZGVuYW1lKSB7XG5cdFx0XHRcdFx0Y29tbWVudCArPSAnfGhpZGVuYW1lPTEnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbW1lbnQgKz0gJ319ICZuZGFzaDsgJztcblx0XHRcdFx0aWYgKHR5cGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gdHlwZXMgKyB3aW5kb3cud2dVTFMoJ+eUqOaIt+WQjScsICfkvb/nlKjogIXlkI3nqLEnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZXMubGVuZ3RoICYmIGhhc1NoYXJlZCkge1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gJ++8jCc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGhhc1NoYXJlZCkge1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gd2luZG93LndnVUxTKCfmmpfnpLror6XotKblj7flubbpnZ7nlLHkuIDkurrmi6XmnIknLCAn5pqX56S66Kmy6LOs6Jmf5Lim6Z2e55Sx5LiA5Lq65pOB5pyJJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVzLmxlbmd0aCB8fCBoYXNTaGFyZWQpIHtcblx0XHRcdFx0XHRjb21tZW50ICs9ICfjgIInO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChpbnB1dC5yZWFzb24pIHtcblx0XHRcdFx0XHRjb21tZW50ICs9IE1vcmViaXRzLnN0cmluZy50b1VwcGVyQ2FzZUZpcnN0Q2hhcihpbnB1dC5yZWFzb24pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbW1lbnQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oY29tbWVudCk7XG5cdFx0XHRcdGNvbW1lbnQgKz0gJy0tfn4nLmNvbmNhdCgnfn4nKTtcblx0XHRcdFx0Y29tbWVudCA9IGNvbW1lbnQucmVwbGFjZSgvXFxyP1xcbi9nLCAnXFxuKjonKTsgLy8gaW5kZW50IG5ld2xpbmVzXG5cdFx0XHRcdHJlYXNvbiA9IGA9PSDkuI3lvZPnlKjmiLflkI3miqXlkYrvvIgke1xuXHRcdFx0XHRcdGlucHV0LmhpZGVuYW1lID8gd2luZG93LndnVUxTKCflt7LpmpDol4/nlKjmiLflkI0nLCAn5bey6Zqx6JeP5L2/55So6ICF5ZCN56ixJykgOiB1aWRcblx0XHRcdFx0fe+8iSA9PVxcbmA7XG5cdFx0XHRcdHJlYXNvbiArPSBjb21tZW50O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdC8vIExJQjpTUElcblx0XHRcdGNhc2UgJ3NwaSc6IHtcblx0XHRcdFx0aWYgKCFpbnB1dC5yZWFzb24pIHtcblx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fovpPlhaXor4Hmja7jgIInLCAn6KuL6Ly45YWl6K2J5pOa44CCJyksIHtcblx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBzb2NrcHVwcGV0cyA9IE1vcmViaXRzLmFycmF5LnVuaXEoXG5cdFx0XHRcdFx0Wy4uLiQoJ2lucHV0OnRleHRbbmFtZT1zb2NrcHVwcGV0XScsIGZvcm0pXS5tYXAoKG8pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiAkKG8pLnZhbCgpLnRyaW0oKSB8fCBudWxsO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmICghc29ja3B1cHBldHNbMF0pIHtcblx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfmgqjmsqHmnInmjIflrprku7vkvZXlgoDlhKHjgIInLCAn5oKo5rKS5pyJ5oyH5a6a5Lu75L2V5YKA5YSh44CCJyksIHtcblx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21tZW50ICs9ICd7eycuY29uY2F0KCdzdWJzdDonLCAnU1BJIHJlcG9ydHwnKTtcblx0XHRcdFx0aWYgKCFzb2NrcHVwcGV0cy5pbmNsdWRlcyhpbnB1dC5zb2NrbWFzdGVyKSkge1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gJzE9e3snLmNvbmNhdChcblx0XHRcdFx0XHRcdCdzdWJzdDonLFxuXHRcdFx0XHRcdFx0JyNpZmV4aXN0Ont7Jyxcblx0XHRcdFx0XHRcdCdzdWJzdDonLFxuXHRcdFx0XHRcdFx0YEZVTExQQUdFTkFNRX19fHwke2lucHV0LnNvY2ttYXN0ZXJ9fX18YFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29tbWVudCArPSBgJHtzb2NrcHVwcGV0c1xuXHRcdFx0XHRcdC5tYXAoKHNvY2ssIGluZGV4KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYCR7aW5kZXggKyAyfT0ke3NvY2t9YDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKCd8Jyl9XFxufGV2aWRlbmNlPSR7TW9yZWJpdHMuc3RyaW5nLmFwcGVuZFB1bmN0dWF0aW9uKGlucHV0LnJlYXNvbil9XFxuYDtcblx0XHRcdFx0aWYgKGlucHV0LmNoZWNrdXNlcikge1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gJ3xjaGVja3VzZXI9eWVzJztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21tZW50ICs9ICd9fSc7XG5cdFx0XHRcdHJlYXNvbiA9IGNvbW1lbnQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXBvcnQgdXNlciBmb3IgdmFuZGFsaXNtXG5cdFx0XHQvKiBjYXNlICdhaXYnOiAqL1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRpZiAoIWlucHV0LmFydnR5cGUubGVuZ3RoICYmIGlucHV0LnJlYXNvbiA9PT0gJycpIHtcblx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfmgqjlv4XpobvmjIflrprnkIbnlLEnLCAn5oKo5b+F6aCI5oyH5a6a55CG55SxJyksIHtcblx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVhcnYnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZWFzb24gKz0gYD09ICR7aW5wdXQuaGlkZW5hbWUgPyB3aW5kb3cud2dVTFMoJ+W3sumakOiXj+eUqOaIt+WQjScsICflt7LpmrHol4/kvb/nlKjogIXlkI3nqLEnKSA6IHVpZH0gPT1cXG5gO1xuXHRcdFx0XHRyZWFzb24gKz0gYCogJycne3t2YW5kYWx8JHsvWz1dLy50ZXN0KHVpZCkgPyAnMT0nIDogJyd9JHt1aWR9YDtcblx0XHRcdFx0aWYgKGlucHV0LmhpZGVuYW1lKSB7XG5cdFx0XHRcdFx0cmVhc29uICs9ICd8aGlkZW5hbWU9MSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVhc29uICs9IFwifX0nJydcXG5cIjtcblx0XHRcdFx0Y29uc3QgdHlwZXMgPSBpbnB1dC5hcnZ0eXBlXG5cdFx0XHRcdFx0Lm1hcCgodikgPT4ge1xuXHRcdFx0XHRcdFx0c3dpdGNoICh2KSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2ZpbmFsJzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gJ+W3suWPkeWHuuacgOWQjuitpuWRiic7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3Bvc3RibG9jayc6XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuICflsIHnpoHov4fmnJ/lkI7pmo/ljbPnoLTlnY8nO1xuXHRcdFx0XHRcdFx0XHRjYXNlICdzcGFtYm90Jzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gJ+aYvuiAjOaYk+ingeeahHNwYW1ib3TmiJblpLHnqoPotKblj7cnO1xuXHRcdFx0XHRcdFx0XHRjYXNlICd2YW5kYWxvbmx5Jzpcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gJ+aYvuiAjOaYk+ingeeahOe6r+egtOWdj+eUqOaItyc7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3Byb21vb25seSc6XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuICfku4XnlKjmnaXmlaPlj5Hlub/lkYrlrqPkvKDnmoTnlKjmiLcnO1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAn5pyq55+l55CG55SxJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5qb2luKCfvvIwnKTtcblx0XHRcdFx0aWYgKGlucHV0LnBhZ2UgIT09ICcnKSB7XG5cdFx0XHRcdFx0cGFnZSA9IGNoZWNrVGl0bGUoaW5wdXQucGFnZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCFwYWdlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbW1lbnQgKz0gYCoge3twYWdlbGlua3N8JHtcblx0XHRcdFx0XHRcdHBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCkuaW5jbHVkZXMoJz0nKSA/ICcxPScgOiAnJ1xuXHRcdFx0XHRcdH0ke3BhZ2UuZ2V0UHJlZml4ZWRUZXh0KCl9fX1gO1xuXHRcdFx0XHRcdGlmIChpbnB1dC5iYWRpZCkge1xuXHRcdFx0XHRcdFx0Y29tbWVudCArPSBg77yIe3tkaWZmfCR7cGFnZS5nZXRQcmVmaXhlZFRleHQoKX18JHtpbnB1dC5iYWRpZH18JHtpbnB1dC5nb29kaWQgPz8gJyd9fGRpZmZ9fe+8iWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbW1lbnQgKz0gJ1xcbic7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVzKSB7XG5cdFx0XHRcdFx0Y29tbWVudCArPSBgKiAke3R5cGVzfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlucHV0LnJlYXNvbiAhPT0gJycpIHtcblx0XHRcdFx0XHRpbnB1dC5yZWFzb24gPSBpbnB1dC5yZWFzb24ucmVwbGFjZSgvXFxuXFxuKy9nLCAnXFxuJyk7XG5cdFx0XHRcdFx0aW5wdXQucmVhc29uID0gaW5wdXQucmVhc29uLnJlcGxhY2UoL1xccj9cXG4vZywgJ1xcbio6Jyk7IC8vIGluZGVudCBuZXdsaW5lc1xuXHRcdFx0XHRcdGNvbW1lbnQgKz0gKHR5cGVzID8gJ+OAgicgOiAnKiAnKSArIGlucHV0LnJlYXNvbjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb21tZW50ID0gY29tbWVudC50cmltKCk7XG5cdFx0XHRcdGNvbW1lbnQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oY29tbWVudCk7XG5cdFx0XHRcdHJlYXNvbiArPSBgJHtjb21tZW50fVxcbiog5Y+R546w5Lq677yafn5gLmNvbmNhdCgnfn5cXG4qIOWkhOeQhu+8micpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFtyZWFzb24sIGNvbW1lbnRdO1xuXHR9O1xuXHRUd2lua2xlLmFydi5jYWxsYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IGlucHV0ID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldElucHV0RGF0YShmb3JtKTtcblx0XHRjb25zdCB7dWlkfSA9IGlucHV0O1xuXHRcdGxldCByZWFzb247XG5cdFx0bGV0IHN1bW1hcnk7XG5cdFx0c3dpdGNoIChpbnB1dC5jYXRlZ29yeSkge1xuXHRcdFx0Ly8gUmVwb3J0IDNSUlxuXHRcdFx0Y2FzZSAnZXdpcCc6IHtcblx0XHRcdFx0cmVhc29uID0gVHdpbmtsZS5hcnYuY2FsbGJhY2suZ2V0UmVwb3J0V2lraXRleHQoZm9ybSk7XG5cdFx0XHRcdGlmIChyZWFzb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdW1tYXJ5ID0gYCR7d2luZG93LndnVUxTKCfmiqXlkYonLCAn5aCx5ZGKJyl9W1tTcGVjaWFsOkNvbnRyaWJzLyR7dWlkfXwke3VpZH1dXWA7XG5cdFx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9ICdMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb8nO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+aKpeWRiuWujOaIkCcsICfloLHlkYrlrozmiJAnKTtcblx0XHRcdFx0Y29uc3QgZXdpcFBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdCdMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb8nLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5aSE55CGRVdJUOivt+axgicsICfomZXnkIZFV0lQ6KuL5rGCJylcblx0XHRcdFx0KTtcblx0XHRcdFx0ZXdpcFBhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSk7XG5cdFx0XHRcdGV3aXBQYWdlLmxvYWQoKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHRleHQgPSBld2lwUGFnZS5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRcdGNvbnN0ICRld2lwTGluayA9ICc8YSByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCIvd2lraS9MSUI6RVdJUFwiPkxJQjpFV0lQPC9hPic7XG5cdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdXNlciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcblx0XHRcdFx0XHRcdFx0YD09PVxcXFxzKlxcXFx7XFxcXHtcXFxccyooPzpbVnZdYW5kYWwpXFxcXHMqXFxcXHxcXFxccyooPzoxPSk/XFxcXHMqJHtNb3JlYml0cy5zdHJpbmcuZXNjYXBlUmVnRXhwKFxuXHRcdFx0XHRcdFx0XHRcdHVpZFxuXHRcdFx0XHRcdFx0XHQpfVxcXFxzKlxcXFx9XFxcXH1cXFxccyo9PT1gXG5cdFx0XHRcdFx0XHQpLnRlc3QodGV4dClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGV3aXBQYWdlXG5cdFx0XHRcdFx0XHRcdC5nZXRTdGF0dXNFbGVtZW50KClcblx0XHRcdFx0XHRcdFx0LmVycm9yKHdpbmRvdy53Z1VMUygn5oql5ZGK5bey5a2Y5Zyo77yM5bCG5LiN5Lya5Yqg5YWl5paw55qEJywgJ+WgseWRiuW3suWtmOWcqO+8jOWwh+S4jeacg+WKoOWFpeaWsOeahCcpKTtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5wcmludFVzZXJUZXh0KFxuXHRcdFx0XHRcdFx0XHRyZWFzb25bMV0sXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5oKo6L6T5YWl55qE6K+E6K665bey5Zyo5LiL5pa55o+Q5L6b77yM5oKo5Y+v5Lul5bCG5YW25Yqg5YWl5YiwJyxcblx0XHRcdFx0XHRcdFx0XHQn5oKo6Ly45YWl55qE6KmV6KuW5bey5Zyo5LiL5pa55o+Q5L6b77yM5oKo5Y+v5Lul5bCH5YW25Yqg5YWl5YiwJ1xuXHRcdFx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdFx0XHQkZXdpcExpbmsgK1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bey5a2Y5Zyo55qE5bCP6IqC5Lit77yaJywgJ+W3suWtmOWcqOeahOWwj+evgOS4re+8micpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRld2lwUGFnZS5zZXRQYWdlU2VjdGlvbigwKTtcblx0XHRcdFx0XHRld2lwUGFnZS5nZXRTdGF0dXNFbGVtZW50KCkuc3RhdHVzKHdpbmRvdy53Z1VMUygn5Yqg5YWl5paw5oql5ZGK4oCmJywgJ+WKoOWFpeaWsOWgseWRiuKApicpKTtcblx0XHRcdFx0XHRld2lwUGFnZS5zZXRFZGl0U3VtbWFyeShzdW1tYXJ5KTtcblx0XHRcdFx0XHRld2lwUGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0ZXdpcFBhZ2Uuc2V0QXBwZW5kVGV4dChgXFxuJHtyZWFzb25bMF19YCk7XG5cdFx0XHRcdFx0ZXdpcFBhZ2UuYXBwZW5kKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdC8vIFJlcG9ydCBpbmFwcHJvcHJpYXRlIHVzZXJuYW1lXG5cdFx0XHRjYXNlICd1c2VybmFtZSc6IHtcblx0XHRcdFx0cmVhc29uID0gVHdpbmtsZS5hcnYuY2FsbGJhY2suZ2V0UmVwb3J0V2lraXRleHQoZm9ybSk7XG5cdFx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9ICdMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb8nO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+aKpeWRiuWujOaIkCcsICfloLHlkYrlrozmiJAnKTtcblx0XHRcdFx0Y29uc3QgdWFhUGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0J0xJQl90YWxrOueuoeeQhuWRmOWRiuekuuadvycsXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCflpITnkIZVQUHor7fmsYInLCAn6JmV55CGVUFB6KuL5rGCJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dWFhUGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0dWFhUGFnZS5sb2FkKCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCB0ZXh0ID0gdWFhUGFnZS5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRcdC8vIGNoZWNrIGlmIHVzZXIgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZFxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRcdGBcXFxce1xcXFx7XFxcXHMqdXNlci11YWFcXFxccypcXFxcfFxcXFxzKigxXFxcXHMqPVxcXFxzKik/JHtNb3JlYml0cy5zdHJpbmcuZXNjYXBlUmVnRXhwKFxuXHRcdFx0XHRcdFx0XHRcdHVpZFxuXHRcdFx0XHRcdFx0XHQpfVxcXFxzKihcXFxcfHxcXFxcfSlgXG5cdFx0XHRcdFx0XHQpLnRlc3QodGV4dClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHVhYVBhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLmVycm9yKHdpbmRvdy53Z1VMUygn55So5oi35bey6KKr5YiX5YWl44CCJywgJ+S9v+eUqOiAheW3suiiq+WIl+WFpeOAgicpKTtcblx0XHRcdFx0XHRcdGNvbnN0ICR1YWFMaW5rID0gJzxhIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cIi93aWtpL0xJQjpVQUFcIj5MSUI6VUFBPC9hPic7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMucHJpbnRVc2VyVGV4dChcblx0XHRcdFx0XHRcdFx0cmVhc29uWzFdLFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+aCqOi+k+WFpeeahOivhOiuuuW3suWcqOS4i+aWueaPkOS+m++8jOaCqOWPr+S7peWwhuWFtuaJi+W3peWKoOWFpScsXG5cdFx0XHRcdFx0XHRcdFx0J+aCqOi8uOWFpeeahOipleirluW3suWcqOS4i+aWueaPkOS+m++8jOaCqOWPr+S7peWwh+WFtuaJi+W3peWKoOWFpSdcblx0XHRcdFx0XHRcdFx0KSArXG5cdFx0XHRcdFx0XHRcdFx0JHVhYUxpbmsgK1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5LiK6K+l55So5oi355qE5oql5ZGK5Lit77yaJywgJ+S4iuipsuS9v+eUqOiAheeahOWgseWRiuS4re+8micpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR1YWFQYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5zdGF0dXMod2luZG93LndnVUxTKCfliqDlhaXmlrDmiqXlkYrigKYnLCAn5Yqg5YWl5paw5aCx5ZGK4oCmJykpO1xuXHRcdFx0XHRcdHVhYVBhZ2Uuc2V0RWRpdFN1bW1hcnkod2luZG93LndnVUxTKCfmlrDmj5DmiqUnLCAn5paw5o+Q5aCxJykpO1xuXHRcdFx0XHRcdHVhYVBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHVhYVBhZ2Uuc2V0QXBwZW5kVGV4dChgXFxuXFxuJHtyZWFzb25bMF19YCk7XG5cdFx0XHRcdFx0dWFhUGFnZS5hcHBlbmQoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTElCOlNQSVxuXHRcdFx0Y2FzZSAnc3BpJzoge1xuXHRcdFx0XHRyZWFzb24gPSBUd2lua2xlLmFydi5jYWxsYmFjay5nZXRSZXBvcnRXaWtpdGV4dChmb3JtKTtcblx0XHRcdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0XHRcdGNvbnN0IHJlcG9ydHBhZ2UgPSAnTElCX3RhbGs6566h55CG5ZGY5ZGK56S65p2/Jztcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSByZXBvcnRwYWdlO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+aKpeWRiuWujOaIkCcsICfloLHlkYrlrozmiJAnKTtcblx0XHRcdFx0Y29uc3Qgc3BpUGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UocmVwb3J0cGFnZSwgd2luZG93LndnVUxTKCfmipPlj5borqjorrrpobXpnaInLCAn5oqT5Y+W6KiO6KuW6aCB6Z2iJykpO1xuXHRcdFx0XHRzcGlQYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0XHRzcGlQYWdlLnNldEVkaXRTdW1tYXJ5KHdpbmRvdy53Z1VMUygn5Yqg5YWl5paw5o+Q5oqlJywgJ+WKoOWFpeaWsOaPkOWgsScpKTtcblx0XHRcdFx0c3BpUGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdHNwaVBhZ2Uuc2V0QXBwZW5kVGV4dChyZWFzb25bMF0pO1xuXHRcdFx0XHRzcGlQYWdlLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3NwaVdhdGNoUmVwb3J0JykpO1xuXHRcdFx0XHRzcGlQYWdlLmFwcGVuZCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVwb3J0IHVzZXIgZm9yIHZhbmRhbGlzbVxuXHRcdFx0LyogY2FzZSAnYWl2JzogKi9cblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0cmVhc29uID0gVHdpbmtsZS5hcnYuY2FsbGJhY2suZ2V0UmVwb3J0V2lraXRleHQoZm9ybSk7XG5cdFx0XHRcdGlmIChyZWFzb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdW1tYXJ5ID0gYCR7d2luZG93LndnVUxTKCfmiqXlkYonLCAn5aCx5ZGKJyl9W1tTcGVjaWFsOkNvbnRyaWJzLyR7dWlkfXwke3VpZH1dXWA7XG5cdFx0XHRcdGlmIChpbnB1dC5oaWRlbmFtZSkge1xuXHRcdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+aKpeWRiuS4gOWQjeeUqOaItycsICfloLHlkYrkuIDlkI3kvb/nlKjogIUnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSAnTElCX3RhbGs65oql5ZGK5b2T5YmN56C05Z2PJztcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKCfmiqXlkYrlrozmiJAnLCAn5aCx5ZGK5a6M5oiQJyk7XG5cdFx0XHRcdGNvbnN0IGFpdlBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdCdMSUJfdGFsazrmiqXlkYrlvZPliY3noLTlnY8nLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5aSE55CGVklQ6K+35rGCJywgJ+iZleeQhlZJUOiri+axgicpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFpdlBhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSk7XG5cdFx0XHRcdGFpdlBhZ2UubG9hZCgoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdGV4dCA9IGFpdlBhZ2UuZ2V0UGFnZVRleHQoKTtcblx0XHRcdFx0XHRjb25zdCAkYWl2TGluayA9ICc8YSByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCIvd2lraS9MSUI6VklQXCI+TElCOlZJUDwvYT4nO1xuXHRcdFx0XHRcdC8vIGNoZWNrIGlmIHVzZXIgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZFxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRcdGA9PT1cXFxccypcXFxce1xcXFx7XFxcXHMqKD86W1Z2XWFuZGFsKVxcXFxzKlxcXFx8XFxcXHMqKD86MT0pP1xcXFxzKiR7TW9yZWJpdHMuc3RyaW5nLmVzY2FwZVJlZ0V4cChcblx0XHRcdFx0XHRcdFx0XHR1aWRcblx0XHRcdFx0XHRcdFx0KX1cXFxccypcXFxcfVxcXFx9XFxcXHMqPT09YFxuXHRcdFx0XHRcdFx0KS50ZXN0KHRleHQpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRhaXZQYWdlXG5cdFx0XHRcdFx0XHRcdC5nZXRTdGF0dXNFbGVtZW50KClcblx0XHRcdFx0XHRcdFx0LmVycm9yKHdpbmRvdy53Z1VMUygn5oql5ZGK5bey5a2Y5Zyo77yM5bCG5LiN5Lya5Yqg5YWl5paw55qEJywgJ+WgseWRiuW3suWtmOWcqO+8jOWwh+S4jeacg+WKoOWFpeaWsOeahCcpKTtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5wcmludFVzZXJUZXh0KFxuXHRcdFx0XHRcdFx0XHRyZWFzb25bMV0sXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5oKo6L6T5YWl55qE6K+E6K665bey5Zyo5LiL5pa55o+Q5L6b77yM5oKo5Y+v5Lul5bCG5YW25Yqg5YWl5YiwJyxcblx0XHRcdFx0XHRcdFx0XHQn5oKo6Ly45YWl55qE6KmV6KuW5bey5Zyo5LiL5pa55o+Q5L6b77yM5oKo5Y+v5Lul5bCH5YW25Yqg5YWl5YiwJ1xuXHRcdFx0XHRcdFx0XHQpICtcblx0XHRcdFx0XHRcdFx0XHQkYWl2TGluayArXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflt7LlrZjlnKjnmoTlsI/oioLkuK3vvJonLCAn5bey5a2Y5Zyo55qE5bCP56+A5Lit77yaJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFpdlBhZ2Uuc2V0UGFnZVNlY3Rpb24oMCk7XG5cdFx0XHRcdFx0YWl2UGFnZS5nZXRTdGF0dXNFbGVtZW50KCkuc3RhdHVzKHdpbmRvdy53Z1VMUygn5Yqg5YWl5paw5oql5ZGK4oCmJywgJ+WKoOWFpeaWsOWgseWRiuKApicpKTtcblx0XHRcdFx0XHRhaXZQYWdlLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnkpO1xuXHRcdFx0XHRcdGFpdlBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdGFpdlBhZ2Uuc2V0QXBwZW5kVGV4dChgXFxuJHtyZWFzb25bMF19YCk7XG5cdFx0XHRcdFx0YWl2UGFnZS5hcHBlbmQoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5hcnYsICdhcnYnKTtcbn0pKGpRdWVyeSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcblxuLyohIFR3aW5rbGUuanMgLSB0d2lua2xld2Fybi5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGV3YXJuKCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdC8qKlxuXHQgKiB0d2lua2xld2Fybi5qczogV2FybiBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiV2FyblwiKVxuXHQgKiBBY3RpdmUgb246IEFueSBwYWdlIHdpdGggcmVsZXZhbnQgdXNlciBuYW1lICh1c2Vyc3BhY2UsIGNvbnRyaWJzLFxuXHQgKiBldGMuKSwgYXMgd2VsbCBhcyB0aGUgcm9sbGJhY2sgc3VjY2VzcyBwYWdlXG5cdCAqL1xuXHRjb25zdCByZWxldmFudFVzZXJOYW1lID0gbXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyk7XG5cdFR3aW5rbGUud2FybiA9ICgpID0+IHtcblx0XHRpZiAocmVsZXZhbnRVc2VyTmFtZSkge1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrLFxuXHRcdFx0XHQn6K2m5ZGKJyxcblx0XHRcdFx0J3R3LXdhcm4nLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+itpuWRiuaIluaPkOmGkueUqOaItycsICforablkYrmiJbmj5DphpLkvb/nlKjogIUnKVxuXHRcdFx0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdhdXRvTWVudUFmdGVyUm9sbGJhY2snKSAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAzICYmXG5cdFx0XHRcdG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgndmFuYXJ0aWNsZScpICYmXG5cdFx0XHRcdCFtdy51dGlsLmdldFBhcmFtVmFsdWUoJ25vYXV0b3dhcm4nKVxuXHRcdFx0KSB7XG5cdFx0XHRcdFR3aW5rbGUud2Fybi5jYWxsYmFjaygpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBNb2RpZnkgVVJMIG9mIHRhbGsgcGFnZSBvbiByb2xsYmFjayBzdWNjZXNzIHBhZ2VzLCBtYWtlcyB1c2Ugb2YgYVxuXHRcdC8vIGN1c3RvbSBtZXNzYWdlIGJveCBpbiBbW01lZGlhV2lraTpSb2xsYmFjay1zdWNjZXNzXV1cblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ3JvbGxiYWNrJykge1xuXHRcdFx0Y29uc3QgJHZhbmRhbFRhbGtMaW5rID0gJGJvZHkuZmluZCgnI213LXJvbGxiYWNrLXN1Y2Nlc3MnKS5maW5kKCcubXctdXNlcnRvb2xsaW5rcyBhJykuZmlyc3QoKTtcblx0XHRcdGlmICgkdmFuZGFsVGFsa0xpbmsubGVuZ3RoKSB7XG5cdFx0XHRcdFR3aW5rbGUud2Fybi5tYWtlVmFuZGFsVGFsa0xpbmsoJHZhbmRhbFRhbGtMaW5rLCBNb3JlYml0cy5wYWdlTmFtZU5vcm0pO1xuXHRcdFx0XHQkdmFuZGFsVGFsa0xpbmsuY3NzKCdmb250LXdlaWdodCcsICdib2xkJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lJykgPT09ICdBYnVzZUxvZycgJiZcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnQWJ1c2VGaWx0ZXJWYXJpYWJsZXMnKSAhPT0gbnVsbFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgYWZUYWxrTGluayA9ICRib2R5LmZpbmQoJy5tdy11c2VydG9vbGxpbmtzLXRhbGsnKS5maXJzdCgpO1xuXHRcdFx0aWYgKGFmVGFsa0xpbmsubGVuZ3RoKSB7XG5cdFx0XHRcdFR3aW5rbGUud2Fybi5tYWtlVmFuZGFsVGFsa0xpbmsoYWZUYWxrTGluaywgbXcuY29uZmlnLmdldCgnd2dBYnVzZUZpbHRlclZhcmlhYmxlcycpLnBhZ2VfcHJlZml4ZWR0aXRsZSk7XG5cdFx0XHRcdGFmVGFsa0xpbmsuY3NzKCdmb250LXdlaWdodCcsICdib2xkJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLndhcm4ubWFrZVZhbmRhbFRhbGtMaW5rID0gKCR2YW5kYWxUYWxrTGluaywgcGFnZW5hbWUpID0+IHtcblx0XHQkdmFuZGFsVGFsa0xpbmsud3JhcElubmVyKFxuXHRcdFx0JCgnPHNwYW4+JykuYXR0cihcblx0XHRcdFx0J3RpdGxlJyxcblx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCflpoLmnpzlkIjpgILvvIzmgqjlj6/ku6XnlKhUd2lua2xl5Zyo6K+l55So5oi36K6o6K666aG15LiK5YGa5Ye66K2m5ZGK44CCJyxcblx0XHRcdFx0XHQn5aaC5p6c5ZCI6YGp77yM5oKo5Y+v5Lul55SoVHdpbmtsZeWcqOipsuS9v+eUqOiAheiojuirlumggeS4iuWBmuWHuuitpuWRiuOAgidcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdCk7XG5cdFx0Y29uc3QgZXh0cmFQYXJhbSA9IGB2YW5hcnRpY2xlPSR7bXcudXRpbC5yYXd1cmxlbmNvZGUocGFnZW5hbWUpfWA7XG5cdFx0Y29uc3QgaHJlZiA9ICR2YW5kYWxUYWxrTGluay5hdHRyKCdocmVmJyk7XG5cdFx0aWYgKGhyZWYuaW5jbHVkZXMoJz8nKSkge1xuXHRcdFx0JHZhbmRhbFRhbGtMaW5rLmF0dHIoJ2hyZWYnLCBgJHtocmVmfSYke2V4dHJhUGFyYW19YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCR2YW5kYWxUYWxrTGluay5hdHRyKCdocmVmJywgYCR7aHJlZn0/JHtleHRyYVBhcmFtfWApO1xuXHRcdH1cblx0fTtcblx0Ly8gVXNlZCB0byBjbG9zZSB3aW5kb3cgd2hlbiBzd2l0Y2hpbmcgdG8gQVJWIGluIGF1dG9sZXZlbFxuXHRUd2lua2xlLndhcm4uZGlhbG9nID0gbnVsbDtcblx0VHdpbmtsZS53YXJuLmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdHJlbGV2YW50VXNlck5hbWUgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSAmJlxuXHRcdFx0IWNvbmZpcm0od2luZG93LndnVUxTKCfmgqjlsIbopoHorablkYroh6rlt7HvvIHmgqjnoa7lrpropoHnu6fnu63lkJfvvJ8nLCAn5oKo5bCH6KaB6K2m5ZGK6Ieq5bex77yB5oKo56K65a6a6KaB57m857qM5ZeO77yfJykpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUud2Fybi5kaWFsb2cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgNDQwKTtcblx0XHRjb25zdCB7ZGlhbG9nfSA9IFR3aW5rbGUud2Fybjtcblx0XHRkaWFsb2cuc2V0VGl0bGUod2luZG93LndnVUxTKCforablkYrjgIHmj5DphpLnlKjmiLcnLCAn6K2m5ZGK44CB5o+Q6YaS5L2/55So6ICFJykpO1xuXHRcdGRpYWxvZy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0ZGlhbG9nLmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCforablkYrorr7nva4nLCAn6K2m5ZGK6Kit5a6aJyksICdIOlRXL1BSRUYjd2FybicpO1xuXHRcdGRpYWxvZy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXL0RPQyN3YXJuJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS53YXJuLmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRjb25zdCBtYWluX3NlbGVjdCA9IGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgInmi6nopoHlj5HpgIHnmoTorablkYrmiJbmj5DphpLnsbvlnosnLCAn6YG45pOH6KaB5YKz6YCB55qE6K2m5ZGK5oiW5o+Q6YaS6aGe5YilJyksXG5cdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+mmluWFiOmAieaLqeS4gOe7hO+8jOWGjemAieaLqeWFt+S9k+eahOitpuWRiuaooeadv+OAgicsICfpppblhYjpgbjmk4fkuIDntYTvvIzlho3pgbjmk4flhbfpq5TnmoTorablkYrmqKHmnb/jgIInKSxcblx0XHR9KTtcblx0XHRjb25zdCBtYWluX2dyb3VwID0gbWFpbl9zZWxlY3QuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ21haW5fZ3JvdXAnLFxuXHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5oKo5Y+v5ZyoVHdpbmtsZeWPguaVsOiuvue9ruS4reiuvue9rum7mOiupOmAieaLqeeahOmAiemhuScsXG5cdFx0XHRcdCfmgqjlj6/lnKhUd2lua2xl5YGP5aW96Kit5a6a5Lit6Kit5a6a6aCQ6Kit6YG45pOH55qE6YG46aCFJ1xuXHRcdFx0KSxcblx0XHRcdGV2ZW50OiBUd2lua2xlLndhcm4uY2FsbGJhY2suY2hhbmdlX2NhdGVnb3J5LFxuXHRcdH0pO1xuXHRcdGNvbnN0IGRlZmF1bHRHcm91cCA9IE51bWJlci5wYXJzZUludChUd2lua2xlLmdldFByZWYoJ2RlZmF1bHRXYXJuaW5nR3JvdXAnKSwgNik7XG5cdFx0bWFpbl9ncm91cC5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rliqjpgInmi6nlsYLnuqcnLCAn6Ieq5YuV6YG45pOH5bGk57SaJyksXG5cdFx0XHR2YWx1ZTogJ2F1dG9sZXZlbCcsXG5cdFx0XHRzZWxlY3RlZDogZGVmYXVsdEdyb3VwID09PSA3LFxuXHRcdH0pO1xuXHRcdG1haW5fZ3JvdXAuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0bGFiZWw6ICcx77ya5o+Q6YaSJyxcblx0XHRcdHZhbHVlOiAnbGV2ZWwxJyxcblx0XHRcdHNlbGVjdGVkOiBkZWZhdWx0R3JvdXAgPT09IDEsXG5cdFx0fSk7XG5cdFx0bWFpbl9ncm91cC5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRsYWJlbDogJzLvvJrorablkYonLFxuXHRcdFx0dmFsdWU6ICdsZXZlbDInLFxuXHRcdFx0c2VsZWN0ZWQ6IGRlZmF1bHRHcm91cCA9PT0gMixcblx0XHR9KTtcblx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdjb21iaW5lZFNpbmdsZXRNZW51cycpKSB7XG5cdFx0XHRtYWluX2dyb3VwLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfljZXlsYLnuqfmtojmga8nLCAn5Zau5bGk57Sa6KiK5oGvJyksXG5cdFx0XHRcdHZhbHVlOiAnc2luZ2xlY29tYmluZWQnLFxuXHRcdFx0XHRzZWxlY3RlZDogZGVmYXVsdEdyb3VwID09PSAzIHx8IGRlZmF1bHRHcm91cCA9PT0gNCxcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYWluX2dyb3VwLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfljZXlsYLnuqfmj5DphpInLCAn5Zau5bGk57Sa5o+Q6YaSJyksXG5cdFx0XHRcdHZhbHVlOiAnc2luZ2xlbm90aWNlJyxcblx0XHRcdFx0c2VsZWN0ZWQ6IGRlZmF1bHRHcm91cCA9PT0gMyxcblx0XHRcdH0pO1xuXHRcdFx0bWFpbl9ncm91cC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y2V5bGC57qn6K2m5ZGKJywgJ+WWruWxpOe0muitpuWRiicpLFxuXHRcdFx0XHR2YWx1ZTogJ3NpbmdsZXdhcm4nLFxuXHRcdFx0XHRzZWxlY3RlZDogZGVmYXVsdEdyb3VwID09PSA0LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2N1c3RvbVdhcm5pbmdMaXN0JykubGVuZ3RoKSB7XG5cdFx0XHRtYWluX2dyb3VwLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnorablkYonLCAn6Ieq6KiC6K2m5ZGKJyksXG5cdFx0XHRcdHZhbHVlOiAnY3VzdG9tJyxcblx0XHRcdFx0c2VsZWN0ZWQ6IGRlZmF1bHRHcm91cCA9PT0gNSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRtYWluX2dyb3VwLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiAn5omA5pyJ6K2m5ZGK5qih5p2/Jyxcblx0XHRcdHZhbHVlOiAna2l0Y2hlbnNpbmsnLFxuXHRcdFx0c2VsZWN0ZWQ6IGRlZmF1bHRHcm91cCA9PT0gNixcblx0XHR9KTtcblx0XHRtYWluX3NlbGVjdC5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRuYW1lOiAnc3ViX2dyb3VwJyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLndhcm4uY2FsbGJhY2suY2hhbmdlX3N1YmNhdGVnb3J5LFxuXHRcdH0pOyAvLyBXaWxsIGJlIGVtcHR5IHRvIGJlZ2luIHdpdGguXG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdG5hbWU6ICdhcnRpY2xlJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mhtemdoumTvuaOpScsICfpoIHpnaLpgKPntZAnKSxcblx0XHRcdHZhbHVlOiBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ZhbmFydGljbGUnKSB8fCAnJyxcblx0XHRcdHNpemU6IDUwLFxuXHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfnu5nmqKHmnb/kuK3liqDlhaXkuIDpobXpnaLpk77mjqXvvIzlj6/nlZnnqbrjgIInLCAn57Wm5qih5p2/5Lit5Yqg5YWl5LiA6aCB6Z2i6YCj57WQ77yM5Y+v55WZ56m644CCJyksXG5cdFx0XHRwbGFjZWhvbGRlcjogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5LuF6ZmQ5LiA5Liq77yM5Yu/5L2/55So572R5Z2A44CBW1sgXV3vvIzlj6/kvb/nlKhTcGVjaWFsOkRpZmYnLFxuXHRcdFx0XHQn5YOF6ZmQ5LiA5YCL77yM5Yu/5L2/55So57ay5Z2A44CBW1sgXV3vvIzlj6/kvb/nlKhTcGVjaWFsOkRpZmYnXG5cdFx0XHQpLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0c3R5bGU6ICdjb2xvcjogI2YwMCcsXG5cdFx0XHRpZDogJ3R3aW5rbGUtd2Fybi13YXJuaW5nLW1lc3NhZ2VzJyxcblx0XHR9KTtcblx0XHRjb25zdCBtb3JlID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdG5hbWU6ICdyZWFzb25Hcm91cCcsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCforablkYrkv6Hmga8nLCAn6K2m5ZGK6LOH6KiKJyksXG5cdFx0fSk7XG5cdFx0bW9yZS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WPr+mAieS/oeaBr++8micsICflj6/pgbjos4foqIrvvJonKSxcblx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfnkIbnlLHmiJbmmK/pmYTliqDkv6Hmga8nLCAn55CG55Sx5oiW5piv6ZmE5Yqg6LOH6KiKJyksXG5cdFx0fSk7XG5cdFx0Y29uc3QgcHJldmlld2xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0JChwcmV2aWV3bGluaykub24oJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrcy5wcmV2aWV3KHJlc3VsdCk7IC8vIHxyZXN1bHR8IGlzIGRlZmluZWQgYmVsb3dcblx0XHR9KTtcblxuXHRcdHByZXZpZXdsaW5rLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcblx0XHRwcmV2aWV3bGluay50ZXh0Q29udGVudCA9IHdpbmRvdy53Z1VMUygn6aKE6KeIJywgJ+mgkOimvScpO1xuXHRcdG1vcmUuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0aWQ6ICd3YXJuaW5ncHJldmlldycsXG5cdFx0XHRsYWJlbDogW3ByZXZpZXdsaW5rXSxcblx0XHR9KTtcblx0XHRtb3JlLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdGlkOiAndHdpbmtsZXdhcm4tcHJldmlld2JveCcsXG5cdFx0XHRzdHlsZTogJ2Rpc3BsYXk6IG5vbmUnLFxuXHRcdH0pO1xuXHRcdG1vcmUuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdFx0bGFiZWw6ICfmj5DkuqQnLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0ZGlhbG9nLnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRkaWFsb2cuZGlzcGxheSgpO1xuXHRcdHJlc3VsdC5tYWluX2dyb3VwLnJvb3QgPSByZXN1bHQ7XG5cdFx0cmVzdWx0LnByZXZpZXdlciA9IG5ldyBNb3JlYml0cy53aWtpLnByZXZpZXcoJChyZXN1bHQpLmZpbmQoJ2RpdiN0d2lua2xld2Fybi1wcmV2aWV3Ym94JykubGFzdCgpWzBdKTtcblx0XHQvLyBQb3RlbnRpYWwgbm90aWNlcyBmb3Igc3RhbGVuZXNzIGFuZCBtaXNzZWQgcmV2ZXJ0c1xuXHRcdGxldCBtZXNzYWdlID0gJyc7XG5cdFx0bGV0IHF1ZXJ5ID0ge307XG5cdFx0Y29uc3QgdmFucmV2aWQgPSBtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ZhbmFydGljbGVyZXZpZCcpO1xuXHRcdGlmICh2YW5yZXZpZCkge1xuXHRcdFx0Ly8gSWYgeW91IHRyaWVkIHJldmVydGluZywgY2hlY2sgaWYgKnlvdSogYWN0dWFsbHkgcmV2ZXJ0ZWRcblx0XHRcdGlmICghbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdub2F1dG93YXJuJykgJiYgbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlJykpIHtcblx0XHRcdFx0Ly8gVmlhIGZsdWZmIGxpbmtcblx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0XHRcdHRpdGxlczogbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW5hcnRpY2xlJyksXG5cdFx0XHRcdFx0cHJvcDogJ3JldmlzaW9ucycsXG5cdFx0XHRcdFx0cnZzdGFydGlkOiB2YW5yZXZpZCxcblx0XHRcdFx0XHRydmxpbWl0OiAyLFxuXHRcdFx0XHRcdHJ2ZGlyOiAnbmV3ZXInLFxuXHRcdFx0XHRcdHJ2cHJvcDogJ3VzZXInLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmo4Dmn6XmgqjmmK/lkKbmiJDlip/lm57pgIDor6XpobXpnaInLCAn5qqi5p+l5oKo5piv5ZCm5oiQ5Yqf5Zue6YCA6Kmy6aCB6Z2iJyksXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0KGFwaW9iaikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmV2ZXJ0VXNlciA9ICQoYXBpb2JqLmdldFJlc3BvbnNlKCkpLmZpbmQoJ3JldmlzaW9ucyByZXYnKVsxXS5nZXRBdHRyaWJ1dGUoJ3VzZXInKTtcblx0XHRcdFx0XHRcdGlmIChyZXZlcnRVc2VyICYmIHJldmVydFVzZXIgIT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlICs9IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5YW25LuW5Lq65Zue6YCA5LqG6K+l6aG16Z2i77yM5bm25Y+v6IO95bey57uP6K2m5ZGK6K+l55So5oi344CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5YW25LuW5Lq65Zue6YCA5LqG6Kmy6aCB6Z2i77yM5Lim5Y+v6IO95bey57aT6K2m5ZGK6Kmy5L2/55So6ICF44CCJ1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHQkYm9keS5maW5kKCcjdHdpbmtsZS13YXJuLXdhcm5pbmctbWVzc2FnZXMnKS50ZXh0KGDorablkYrvvJoke21lc3NhZ2V9YCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpLnBvc3QoKTtcblx0XHRcdH1cblx0XHRcdC8vIENvbmZpcm0gZWRpdCB3YXNuJ3QgdG9vIG9sZCBmb3IgYSB3YXJuaW5nXG5cdFx0XHRjb25zdCBjaGVja1N0YWxlID0gKHZhbnRpbWVzdGFtcF8pID0+IHtcblx0XHRcdFx0Y29uc3QgcmV2RGF0ZSA9IG5ldyBNb3JlYml0cy5kYXRlKHZhbnRpbWVzdGFtcF8pO1xuXHRcdFx0XHRpZiAodmFudGltZXN0YW1wXyAmJiByZXZEYXRlLmlzVmFsaWQoKSAmJiByZXZEYXRlLmFkZCgyNCwgJ2hvdXJzJykuaXNCZWZvcmUobmV3IERhdGUoKSkpIHtcblx0XHRcdFx0XHRtZXNzYWdlICs9IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfov5nnrJTnvJbovpHmmK/lnKgyNOWwj+aXtuWJjeWBmuWHuueahO+8jOeOsOWcqOitpuWRiuWPr+iDveW3sui/h+aXtuOAgicsXG5cdFx0XHRcdFx0XHQn6YCZ562G57eo6Lyv5piv5ZyoMjTlsI/mmYLliY3lgZrlh7rnmoTvvIznj77lnKjorablkYrlj6/og73lt7LpgY7mmYLjgIInXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHQkYm9keS5maW5kKCcjdHdpbmtsZS13YXJuLXdhcm5pbmctbWVzc2FnZXMnKS50ZXh0KGDorablkYrvvJoke21lc3NhZ2V9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRsZXQgdmFudGltZXN0YW1wID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCd2YW50aW1lc3RhbXAnKTtcblx0XHRcdC8vIFByb3ZpZGVkIGZyb20gYSBmbHVmZiBtb2R1bGUtYmFzZWQgcmV2ZXJ0LCBubyBBUEkgbG9va3VwIG5lY2Vzc2FyeVxuXHRcdFx0aWYgKHZhbnRpbWVzdGFtcCkge1xuXHRcdFx0XHRjaGVja1N0YWxlKHZhbnRpbWVzdGFtcCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0cHJvcDogJ3JldmlzaW9ucycsXG5cdFx0XHRcdFx0cnZwcm9wOiAndGltZXN0YW1wJyxcblx0XHRcdFx0XHRyZXZpZHM6IHZhbnJldmlkLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRuZXcgTW9yZWJpdHMud2lraS5hcGkod2luZG93LndnVUxTKCfojrflj5bniYjmnKzml7bpl7TmiLMnLCAn5Y+W5b6X54mI5pys5pmC6ZaT5oizJyksIHF1ZXJ5LCAoYXBpb2JqKSA9PiB7XG5cdFx0XHRcdFx0dmFudGltZXN0YW1wID0gJChhcGlvYmouZ2V0UmVzcG9uc2UoKSkuZmluZCgncmV2aXNpb25zIHJldicpLmF0dHIoJ3RpbWVzdGFtcCcpO1xuXHRcdFx0XHRcdGNoZWNrU3RhbGUodmFudGltZXN0YW1wKTtcblx0XHRcdFx0fSkucG9zdCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBpbml0ID0gKCkgPT4ge1xuXHRcdFx0Ly8gV2UgbXVzdCBpbml0IHRoZSBmaXJzdCBjaG9pY2UgKEdlbmVyYWwgTm90ZSk7XG5cdFx0XHRjb25zdCBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRcdGV2dC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdFx0cmVzdWx0Lm1haW5fZ3JvdXAuZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdH07XG5cdFx0aW5pdCgpO1xuXHR9O1xuXHQvLyBUaGlzIGlzIGFsbCB0aGUgbWVzc2FnZXMgdGhhdCBtaWdodCBiZSBkaXNwYXRjaGVkIGJ5IHRoZSBjb2RlXG5cdC8vIEVhY2ggb2YgdGhlIGluZGl2aWR1YWwgdGVtcGxhdGVzIHJlcXVpcmUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjpcblx0Ly8gICBsYWJlbCAocmVxdWlyZWQpOiBBIHNob3J0IGRlc2NyaXB0aW9uIGRpc3BsYXllZCBpbiB0aGUgZGlhbG9nXG5cdC8vICAgc3VtbWFyeSAocmVxdWlyZWQpOiBUaGUgZWRpdCBzdW1tYXJ5IHVzZWQuIElmIGFuIGFydGljbGUgbmFtZSBpcyBlbnRlcmVkLCB0aGUgc3VtbWFyeSBpcyBwb3N0Zml4ZWQgd2l0aCBcIm9uIFtbYXJ0aWNsZV1dXCIsIGFuZCBpdCBpcyBhbHdheXMgcG9zdGZpeGVkIHdpdGggXCIuICRzdW1tYXJ5QWRcIlxuXHQvLyAgIHN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeSAob3B0aW9uYWwpOiBTZXQgdG8gdHJ1ZSB0byBzdXBwcmVzcyBzaG93aW5nIHRoZSBhcnRpY2xlIG5hbWUgaW4gdGhlIGVkaXQgc3VtbWFyeS4gVXNlZnVsIGlmIHRoZSB3YXJuaW5nIHJlbGF0ZXMgdG8gYXR0YWNrIHBhZ2VzLCBvciBzb21lIHN1Y2guXG5cdFR3aW5rbGUud2Fybi5tZXNzYWdlcyA9IHtcblx0XHRsZXZlbHM6IFtcblx0XHRcdHtcblx0XHRcdFx0Y2F0ZWdvcnk6IHdpbmRvdy53Z1VMUygn5LiN5ZCM57G75Z6L55qE6Z2e5bu66K6+57yW6L6RJywgJ+S4jeWQjOmhnuWIpeeahOmdnuW7uuioree3qOi8rycpLFxuXHRcdFx0XHRsaXN0OiB7XG5cdFx0XHRcdFx0J3V3LWNvcHlyaWdodCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkvrXniq/okZfkvZzmnYMnLCAn5L6154qv54mI5qyKJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5L6154qv6JGX5L2c5p2DJywgJ+azqOaEj++8muS+teeKr+eJiOasiicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflpJrmrKHkvrXniq/okZfkvZzmnYMnLCAn5aSa5qyh5L6154qv54mI5qyKJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5aSa5qyh5L6154qv6JGX5L2c5p2DJywgJ+itpuWRiu+8muWkmuasoeS+teeKr+eJiOasiicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1jcnlzdGFsJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeiHhua1i+aIluacquehruiupOeahOa2iOaBrycsICfliqDlhaXoh4bmuKzmiJbmnKrnorroqo3nmoToqIrmga8nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrliqDlhaXoh4bmtYvmiJbmnKrnoa7orqTnmoTmtojmga8nLCAn5rOo5oSP77ya5Yqg5YWl6IeG5ris5oiW5pyq56K66KqN55qE6KiK5oGvJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WkmuasoeWKoOWFpeiHhua1i+aIluacquehruiupOeahOa2iOaBrycsICflpJrmrKHliqDlhaXoh4bmuKzmiJbmnKrnorroqo3nmoToqIrmga8nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrlpJrmrKHliqDlhaXoh4bmtYvmiJbmnKrnoa7orqTnmoTmtojmga8nLFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrlpJrmrKHliqDlhaXoh4bmuKzmiJbmnKrnorroqo3nmoToqIrmga8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LWRlbGV0ZSc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3mgbDlvZPlnLDnp7vpmaTpobXpnaLlhoXlrrnjgIHmqKHmnb/miJbotYTmlpknLCAn5LiN5oGw55W25Zyw56e76Zmk6aCB6Z2i5YWn5a6544CB5qih5p2/5oiW6LOH5paZJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5LiN5oGw5b2T5Zyw56e76Zmk6aG16Z2i5YaF5a6544CB5qih5p2/5oiW6LWE5paZJyxcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5LiN5oGw55W25Zyw56e76Zmk6aCB6Z2i5YWn5a6544CB5qih5p2/5oiW6LOH5paZJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3mgbDlvZPlnLDnp7vpmaTpobXpnaLlhoXlrrnjgIHmqKHmnb/miJbotYTmlpknLCAn5LiN5oGw55W25Zyw56e76Zmk6aCB6Z2i5YWn5a6544CB5qih5p2/5oiW6LOH5paZJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5LiN5oGw5b2T5Zyw56e76Zmk6aG16Z2i5YaF5a6544CB5qih5p2/5oiW6LWE5paZJyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5LiN5oGw55W25Zyw56e76Zmk6aCB6Z2i5YWn5a6544CB5qih5p2/5oiW6LOH5paZJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1pbWFnZSc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjpobXpnaLkuK3liqDlhaXkuI3lvZPlm77niYcnLCAn5Zyo6aCB6Z2i5Lit5Yqg5YWl5LiN55W25ZyW54mHJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Zyo6aG16Z2i5Lit5Yqg5YWl5LiN5b2T5Zu+54mHJywgJ+azqOaEj++8muWcqOmggemdouS4reWKoOWFpeS4jeeVtuWclueJhycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjpobXpnaLkuK3liqDlhaXkuI3lvZPlm77niYcnLCAn5Zyo6aCB6Z2i5Lit5Yqg5YWl5LiN55W25ZyW54mHJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5Zyo6aG16Z2i5Lit5Yqg5YWl5LiN5b2T5Zu+54mHJywgJ+itpuWRiu+8muWcqOmggemdouS4reWKoOWFpeS4jeeVtuWclueJhycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1uZXdwYWdlJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIm+W7uuS4jeW9k+mhtemdoicsICflu7rnq4vkuI3nlbbpoIHpnaInKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrliJvlu7rkuI3lvZPpobXpnaInLCAn5rOo5oSP77ya5bu656uL5LiN55W26aCB6Z2iJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIm+W7uuS4jeW9k+mhtemdoicsICflu7rnq4vkuI3nlbbpoIHpnaInKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrliJvlu7rkuI3lvZPpobXpnaInLCAn6K2m5ZGK77ya5bu656uL5LiN55W26aCB6Z2iJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LW5vcic6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjmnaHnm67kuK3liqDlhaXljp/liJvnoJTnqbYnLCAn5Zyo5qKd55uu5Lit5Yqg5YWl5Y6f5Ym156CU56m2JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Zyo5p2h55uu5Lit5Yqg5YWl5Y6f5Yib56CU56m2JywgJ+azqOaEj++8muWcqOaineebruS4reWKoOWFpeWOn+WJteeglOepticpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjmnaHnm67kuK3liqDlhaXljp/liJvnoJTnqbYnLCAn5Zyo5qKd55uu5Lit5Yqg5YWl5Y6f5Ym156CU56m2JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5Zyo5p2h55uu5Lit5Yqg5YWl5Y6f5Yib56CU56m2JywgJ+itpuWRiu+8muWcqOaineebruS4reWKoOWFpeWOn+WJteeglOepticpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1vcG92Jzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+i/neWPjeWuouinguWOn+WImScsICfpgZXlj43lrqLop4Dljp/liYcnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrov53lj43lrqLop4Lljp/liJknLCAn5rOo5oSP77ya6YGV5Y+N5a6i6KeA5Y6f5YmHJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+i/neWPjeWuouinguWOn+WImScsICfpgZXlj43lrqLop4Dljp/liYcnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrov53lj43lrqLop4Lljp/liJknLCAn6K2m5ZGK77ya6YGV5Y+N5a6i6KeA5Y6f5YmHJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LXJlZGlyZWN0Jzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIm+W7uuegtOWdj+aAp+eahOmHjeWumuWQkScsICflu7rnq4vnoLTlo57mgKfnmoTph43lrprlkJEnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrliJvlu7rnoLTlnY/mgKfnmoTph43lrprlkJEnLCAn5rOo5oSP77ya5bu656uL56C05aOe5oCn55qE6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIm+W7uuaBtuaEj+mHjeWumuWQkScsICflu7rnq4vmg6HmhI/ph43lrprlkJEnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrliJvlu7rmgbbmhI/ph43lrprlkJEnLCAn6K2m5ZGK77ya5bu656uL5oOh5oSP6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LXVwbG9hZCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuIrkvKDkuI3lvZPlm77lg48nLCAn5LiK5YKz5LiN55W25ZyW5YOPJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5LiK5Lyg5LiN5b2T5Zu+5YOPJywgJ+azqOaEj++8muS4iuWCs+S4jeeVtuWcluWDjycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuIrkvKDkuI3lvZPlm77lg48nLCAn5LiK5YKz5LiN55W25ZyW5YOPJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5LiK5Lyg5LiN5b2T5Zu+5YOPJywgJ+itpuWRiu+8muS4iuWCs+S4jeeVtuWcluWDjycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy12YW5kYWxpc20nOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5piO5pi+55qE56C05Z2PJywgJ+aYjumhr+eahOegtOWjnicpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muaYjuaYvuegtOWdjycsICfms6jmhI/vvJrmmI7poa/noLTlo54nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5piO5pi+55qE56C05Z2PJywgJ+aYjumhr+eahOegtOWjnicpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muaYjuaYvuegtOWdjycsICforablkYrvvJrmmI7poa/noLTlo54nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctdGRlbCc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflnKjpl67popjku43mnKrop6PlhrPnmoTmg4XlhrXkuIvnp7vpmaTnu7TmiqTmgKfmqKHmnb8nLFxuXHRcdFx0XHRcdFx0XHRcdCflnKjllY/poYzku43mnKrop6PmsbrnmoTmg4Xms4HkuIvnp7vpmaTntq3orbfmgKfmqKHmnb8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya56e76Zmk57u05oqk5oCn5qih5p2/JywgJ+azqOaEj++8muenu+mZpOe2reitt+aAp+aooeadvycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflnKjpl67popjku43mnKrop6PlhrPnmoTmg4XlhrXkuIvnp7vpmaTnu7TmiqTmgKfmqKHmnb8nLFxuXHRcdFx0XHRcdFx0XHRcdCflnKjllY/poYzku43mnKrop6PmsbrnmoTmg4Xms4HkuIvnp7vpmaTntq3orbfmgKfmqKHmnb8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya56e76Zmk57u05oqk5oCn5qih5p2/JywgJ+itpuWRiu+8muenu+mZpOe2reitt+aAp+aooeadvycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Y2F0ZWdvcnk6IHdpbmRvdy53Z1VMUygn5aKe5Yqg5bm/5ZGKJywgJ+WinuWKoOW7o+WRiicpLFxuXHRcdFx0XHRsaXN0OiB7XG5cdFx0XHRcdFx0J3V3LXNwYW0nOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5aKe5Yqg5LiN5ZCI6YCC55qE5aSW6YOo6ZO+5o6lJywgJ+WinuWKoOS4jeWQiOmBqeeahOWklumDqOmAo+e1kCcpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWinuWKoOS4jeWQiOmAgueahOWklumDqOmTvuaOpScsICfms6jmhI/vvJrlop7liqDkuI3lkIjpgannmoTlpJbpg6jpgKPntZAnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5aKe5Yqg5Z6D5Zy+6ZO+5o6lJywgJ+WinuWKoOWeg+WcvumAo+e1kCcpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muWinuWKoOWeg+WcvumTvuaOpScsICforablkYrvvJrlop7liqDlnoPlnL7pgKPntZAnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctYWR2ZXJ0Jzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIqeeUqOacieWFveaho+ahiOmmhuadpeWPkeW4g+W5v+WRiuaIluaOqOW5vycsICfliKnnlKjmnInnjbjmqpTmoYjppKjkvobnmbzluIPlu6PlkYrmiJbmjqjlu6MnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrliKnnlKjmnInlhb3moaPmoYjppobmnaXlj5HluIPlub/lkYrmiJbmjqjlub8nLFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrliKnnlKjmnInnjbjmqpTmoYjppKjkvobnmbzluIPlu6PlkYrmiJbmjqjlu6MnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIqeeUqOacieWFveaho+ahiOmmhuadpeWPkeW4g+W5v+WRiuaIluaOqOW5vycsICfliKnnlKjmnInnjbjmqpTmoYjppKjkvobnmbzluIPlu6PlkYrmiJbmjqjlu6MnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrliKnnlKjmnInlhb3moaPmoYjppobmnaXlj5HluIPlub/lkYrmiJbmjqjlub8nLFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrliKnnlKjmnInnjbjmqpTmoYjppKjkvobnmbzluIPlu6PlkYrmiJbmjqjlu6MnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRjYXRlZ29yeTogd2luZG93LndnVUxTKCfliqDmj5LkuI3lrp7jgIHor73osKTmloflrZcnLCAn5Yqg5o+S5LiN5a+m44CB6Kq56KyX5paH5a2XJyksXG5cdFx0XHRcdGxpc3Q6IHtcblx0XHRcdFx0XHQndXctYmlvZyc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflnKjkurrniankvKDorrDkuK3liqDlhaXmsqHmnInlj6/pnaDmnaXmupDkvZDor4HogIzkuJTlj6/og73lvJXlj5Hkuonorq7nmoTlhoXlrrknLFxuXHRcdFx0XHRcdFx0XHRcdCflnKjkurrnianlgrPoqJjkuK3liqDlhaXmspLmnInlj6/pnaDkvobmupDkvZDorYnogIzkuJTlj6/og73lvJXnmbzniK3orbDnmoTlhaflrrknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5Zyo5Lq654mp5Lyg6K6w5Lit5Yqg5YWl5rKh5pyJ5Y+v6Z2g5p2l5rqQ5L2Q6K+B6ICM5LiU5Y+v6IO95byV5Y+R5LqJ6K6u55qE5YaF5a65Jyxcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5Zyo5Lq654mp5YKz6KiY5Lit5Yqg5YWl5rKS5pyJ5Y+v6Z2g5L6G5rqQ5L2Q6K2J6ICM5LiU5Y+v6IO95byV55m854it6K2w55qE5YWn5a65J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflnKjkurrniankvKDorrDkuK3liqDlhaXmsqHmnInlj6/pnaDmnaXmupDkvZDor4HogIzkuJTlj6/og73lvJXlj5Hkuonorq7nmoTlhoXlrrknLFxuXHRcdFx0XHRcdFx0XHRcdCflnKjkurrnianlgrPoqJjkuK3liqDlhaXmspLmnInlj6/pnaDkvobmupDkvZDorYnogIzkuJTlj6/og73lvJXnmbzniK3orbDnmoTlhaflrrknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Zyo5Lq654mp5Lyg6K6w5Lit5Yqg5YWl5rKh5pyJ5Y+v6Z2g5p2l5rqQ5L2Q6K+B6ICM5LiU5Y+v6IO95byV5Y+R5LqJ6K6u55qE5YaF5a65Jyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5Zyo5Lq654mp5YKz6KiY5Lit5Yqg5YWl5rKS5pyJ5Y+v6Z2g5L6G5rqQ5L2Q6K2J6ICM5LiU5Y+v6IO95byV55m854it6K2w55qE5YWn5a65J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1lcnJvcic6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlYXmhI/liqDlhaXkuI3lrp7lhoXlrrknLCAn5pWF5oSP5Yqg5YWl5LiN5a+m5YWn5a65JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5pWF5oSP5Yqg5YWl5LiN5a6e5YaF5a65JywgJ+azqOaEj++8muaVheaEj+WKoOWFpeS4jeWvpuWFp+WuuScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlYXmhI/liqDlhaXkuI3lrp7lhoXlrrknLCAn5pWF5oSP5Yqg5YWl5LiN5a+m5YWn5a65JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5pWF5oSP5Yqg5YWl5LiN5a6e5YaF5a65JywgJ+itpuWRiu+8muaVheaEj+WKoOWFpeS4jeWvpuWFp+WuuScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy11bnNvdXJjZWQnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5rKh5pyJ5Y+v6Z2g5p2l5rqQ5L2Q6K+B55qE5YaF5a65JywgJ+WKoOWFpeaykuacieWPr+mdoOS+hua6kOS9kOitieeahOWFp+WuuScpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muWKoOWFpeayoeacieWPr+mdoOadpea6kOS9kOivgeeahOWGheWuuScsXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muWKoOWFpeaykuacieWPr+mdoOS+hua6kOS9kOitieeahOWFp+WuuSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5rKh5pyJ5Y+v6Z2g5p2l5rqQ5L2Q6K+B55qE5YaF5a65JywgJ+WKoOWFpeaykuacieWPr+mdoOS+hua6kOS9kOitieeahOWFp+WuuScpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muWKoOWFpeayoeacieWPr+mdoOadpea6kOS9kOivgeeahOWGheWuuScsXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muWKoOWFpeaykuacieWPr+mdoOS+hua6kOS9kOitieeahOWFp+WuuSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGNhdGVnb3J5OiB3aW5kb3cud2dVTFMoJ+e/u+ivkeWTgei0qCcsICfnv7vora/lk4Hos6onKSxcblx0XHRcdFx0bGlzdDoge1xuXHRcdFx0XHRcdCd1dy1yb3VnaHRyYW5zbGF0aW9uJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aCqOe/u+ivkeeahOi0qOmHj+acieW+heaUueWWhCcsICfmgqjnv7vora/nmoTos6rph4/mnInlvoXmlLnlloQnKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrmgqjnv7vor5HnmoTotKjph4/mnInlvoXmlLnlloQnLCAn5rOo5oSP77ya5oKo57+76K2v55qE6LOq6YeP5pyJ5b6F5pS55ZaEJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eyl+WKo+e/u+ivkScsICfnspfliqPnv7vora8nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrnspfliqPnv7vor5EnLCAn6K2m5ZGK77ya57KX5Yqj57+76K2vJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRjYXRlZ29yeTogd2luZG93LndnVUxTKCfpnZ7og73mjqXlj5fkuJTov53lj43mnaHkvovnmoTljZXmlrnpnaLooYzkuLrmiJbmk43kvZwnLCAn6Z2e6IO95o6l5Y+X5LiU6YGV5Y+N5qKd5L6L55qE5Zau5pa56Z2i6KGM54K65oiW5pON5L2cJyksXG5cdFx0XHRcdGxpc3Q6IHtcblx0XHRcdFx0XHQndXctYWZkJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+enu+mZpHt7YWZkfX3vvIjpobXpnaLlrZjlup/orqjorrrvvInmqKHmnb8nLCAn56e76Zmke3thZmR9fe+8iOmggemdouWtmOW7ouiojuirlu+8ieaooeadvycpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muenu+mZpHt7YWZkfX3vvIjpobXpnaLlrZjlup/orqjorrrvvInmqKHmnb8nLFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrnp7vpmaR7e2FmZH1977yI6aCB6Z2i5a2Y5bui6KiO6KuW77yJ5qih5p2/J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vpmaR7e2FmZH1977yI6aG16Z2i5a2Y5bqf6K6o6K6677yJ5qih5p2/JywgJ+enu+mZpHt7YWZkfX3vvIjpoIHpnaLlrZjlu6LoqI7oq5bvvInmqKHmnb8nKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrnp7vpmaR7e2FmZH1977yI6aG16Z2i5a2Y5bqf6K6o6K6677yJ5qih5p2/Jyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya56e76Zmke3thZmR9fe+8iOmggemdouWtmOW7ouiojuirlu+8ieaooeadvydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndXctbW9zJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S4jeaBsOW9k+eahOadoeebruagvOW8j+OAgeaXpeacn+OAgeivreiogOetiScsICfkuI3mgbDnlbbnmoTmop3nm67moLzlvI/jgIHml6XmnJ/jgIHoqp7oqIDnrYknKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrkuI3mgbDlvZPnmoTmnaHnm67moLzlvI/jgIHml6XmnJ/jgIHor63oqIDnrYknLFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrkuI3mgbDnlbbnmoTmop3nm67moLzlvI/jgIHml6XmnJ/jgIHoqp7oqIDnrYknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S4jeaBsOW9k+eahOadoeebruagvOW8j+OAgeaXpeacn+OAgeivreiogOetiScsICfkuI3mgbDnlbbnmoTmop3nm67moLzlvI/jgIHml6XmnJ/jgIHoqp7oqIDnrYknKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrkuI3mgbDlvZPnmoTmnaHnm67moLzlvI/jgIHml6XmnJ/jgIHor63oqIDnrYknLFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrkuI3mgbDnlbbnmoTmop3nm67moLzlvI/jgIHml6XmnJ/jgIHoqp7oqIDnrYknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LW1vdmUnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5peg5pWF56e75Yqo5p2h55uuL+aWsOWQjeensOS4jeespuWQiOWRveWQjeinhOiMgycsXG5cdFx0XHRcdFx0XHRcdFx0J+eEoeaVheenu+WLleaineebri/mlrDlkI3nqLHkuI3nrKblkIjlkb3lkI3opo/nr4QnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5LiN5oGw5b2T5Zyw56e75Yqo6aG16Z2iJywgJ+azqOaEj++8muS4jeaBsOeVtuWcsOenu+WLlemggemdoicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmiorpobXpnaLnp7vliqjliLDkuI3mgbDlvZPjgIHov53lj43lkb3lkI3luLjop4TmiJbov53lj43lhbHor4bnmoTmoIfpopgnLFxuXHRcdFx0XHRcdFx0XHRcdCfmiorpoIHpnaLnp7vli5XliLDkuI3mgbDnlbbjgIHpgZXlj43lkb3lkI3luLjopo/miJbpgZXlj43lhbHorZjnmoTmqJnpoYwnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5LiN5oGw5b2T5Zyw56e75Yqo6aG16Z2iJywgJ+itpuWRiu+8muS4jeaBsOeVtuWcsOenu+WLlemggemdoicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1zcGVlZHknOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56e76Zmke3tkZWxldGV9fe+8iOW/q+mAn+WIoOmZpO+8ieaooeadvycsICfnp7vpmaR7e2RlbGV0ZX1977yI5b+r6YCf5Yiq6Zmk77yJ5qih5p2/JyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya56e76Zmke3tkZWxldGV9fe+8iOW/q+mAn+WIoOmZpO+8ieaooeadvycsXG5cdFx0XHRcdFx0XHRcdFx0J+azqOaEj++8muenu+mZpHt7ZGVsZXRlfX3vvIjlv6vpgJ/liKrpmaTvvInmqKHmnb8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+enu+mZpHt7ZGVsZXRlfX3vvIjlv6vpgJ/liKDpmaTvvInmqKHmnb8nLCAn56e76Zmke3tkZWxldGV9fe+8iOW/q+mAn+WIqumZpO+8ieaooeadvycpLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+itpuWRiu+8muenu+mZpHt7ZGVsZXRlfX3vvIjlv6vpgJ/liKDpmaTvvInmqKHmnb8nLFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrnp7vpmaR7e2RlbGV0ZX1977yI5b+r6YCf5Yiq6Zmk77yJ5qih5p2/J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy10YWxrcGFnZSc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov53lj43orqjorrrpobXop4TojIMnLCAn6YGV5Y+N6KiO6KuW6aCB6KaP56+EJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya6L+d5Y+N6K6o6K666aG16KeE6IyDJywgJ+azqOaEj++8mumBleWPjeiojuirlumggeimj+evhCcpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov53lj43orqjorrrpobXop4TojIMnLCAn6YGV5Y+N6KiO6KuW6aCB6KaP56+EJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya6L+d5Y+N6K6o6K666aG16KeE6IyDJywgJ+itpuWRiu+8mumBleWPjeiojuirlumggeimj+evhCcpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy10cHYnOiB7XG5cdFx0XHRcdFx0XHRsZXZlbDE6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICfkv67mlLnku5bkurrnlZnoqIAnLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiAn5rOo5oSP77ya5L+u5pS55LuW5Lq655WZ6KiAJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRsZXZlbDI6IHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICfkv67mlLnku5bkurrnlZnoqIAnLFxuXHRcdFx0XHRcdFx0XHRzdW1tYXJ5OiAn6K2m5ZGK77ya5L+u5pS55LuW5Lq655WZ6KiAJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGNhdGVnb3J5OiB3aW5kb3cud2dVTFMoJ+WvueWFtuS7lueUqOaIt+WSjOadoeebrueahOaAgeW6picsICflsI3lhbbku5bnlKjmiLblkozmop3nm67nmoTmhYvluqYnKSxcblx0XHRcdFx0bGlzdDoge1xuXHRcdFx0XHRcdCd1dy1pbGxlZ2FsJzoge1xuXHRcdFx0XHRcdFx0bGV2ZWwxOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeS4jeespuWQiOS4reWbveS7t+WAvOingueahOWGheWuuScsICfliqDlhaXkuI3nrKblkIjkuK3lnIvlg7nlgLzop4DnmoTlhaflrrknKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrliqDlhaXkuI3nrKblkIjkuK3lm73ku7flgLzop4LnmoTlhoXlrrknLFxuXHRcdFx0XHRcdFx0XHRcdCfms6jmhI/vvJrliqDlhaXkuI3nrKblkIjkuK3lnIvlg7nlgLzop4DnmoTlhaflrrknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bGV2ZWwyOiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeS4jeespuWQiOS4reWbveS7t+WAvOingueahOWGheWuuScsICfliqDlhaXkuI3nrKblkIjkuK3lnIvlg7nlgLzop4DnmoTlhaflrrknKSxcblx0XHRcdFx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrliqDlhaXkuI3nrKblkIjkuK3lm73ku7flgLzop4LnmoTlhoXlrrknLFxuXHRcdFx0XHRcdFx0XHRcdCforablkYrvvJrliqDlhaXkuI3nrKblkIjkuK3lnIvlg7nlgLzop4DnmoTlhaflrrknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3V3LW93bic6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuLvlvKDmnaHnm67miYDmnInmnYMnLCAn5Li75by15qKd55uu5omA5pyJ5qyKJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Li75byg5p2h55uu5omA5pyJ5p2DJywgJ+azqOaEj++8muS4u+W8teaineebruaJgOacieasiicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuLvlvKDmnaHnm67nmoTmiYDmnInmnYMnLCAn5Li75by15qKd55uu55qE5omA5pyJ5qyKJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5Li75byg5p2h55uu55qE5omA5pyJ5p2DJywgJ+itpuWRiu+8muS4u+W8teaineebrueahOaJgOacieasiicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd1dy1zb2NpYWxtZWRpYSc6IHtcblx0XHRcdFx0XHRcdGxldmVsMToge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflsIbmnInlhb3moaPmoYjppoblvZPkvZznpL7kuqTlqpLkvZPkvb/nlKgnLCAn5bCH5pyJ54245qqU5qGI6aSo55W25L2c56S+5Lqk5aqS6auU5L2/55SoJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5bCG5pyJ5YW95qGj5qGI6aaG5b2T5L2c56S+5Lqk5aqS5L2T5L2/55SoJyxcblx0XHRcdFx0XHRcdFx0XHQn5rOo5oSP77ya5bCH5pyJ54245qqU5qGI6aSo55W25L2c56S+5Lqk5aqS6auU5L2/55SoJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGxldmVsMjoge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflsIbmnInlhb3moaPmoYjppoblvZPkvZznpL7kuqTlqpLkvZPkvb/nlKgnLCAn5bCH5pyJ54245qqU5qGI6aSo55W25L2c56S+5Lqk5aqS6auU5L2/55SoJyksXG5cdFx0XHRcdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5bCG5pyJ5YW95qGj5qGI6aaG5b2T5L2c56S+5Lqk5aqS5L2T5L2/55SoJyxcblx0XHRcdFx0XHRcdFx0XHQn6K2m5ZGK77ya5bCH5pyJ54245qqU5qGI6aSo55W25L2c56S+5Lqk5aqS6auU5L2/55SoJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRdLFxuXHRcdHNpbmdsZW5vdGljZToge1xuXHRcdFx0J3V3LTJyZWRpcmVjdCc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo56e75Yqo6aG16Z2i5ZCO5bqU6K+l5L+u5aSN5Y+M6YeN6YeN5a6a5ZCRJywgJ+WcqOenu+WLlemggemdouW+jOaHieipsuS/ruW+qembmemHjemHjeWumuWQkScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWcqOenu+WKqOmhtemdouWQjuW6lOivpeS/ruWkjeWPjOmHjemHjeWumuWQkScsICfms6jmhI/vvJrlnKjnp7vli5XpoIHpnaLlvozmh4noqbLkv67lvqnpm5nph43ph43lrprlkJEnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctYWl2Jzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuL7miqXkuovpobnlubbkuI3mmK/noLTlnY/ooYzkuLonLCAn6IiJ5aCx5LqL6aCF5Lim5LiN5piv56C05aOe6KGM5Li6JyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5LiN5oGw5b2T5Zyw5Li+5oql56C05Z2PJywgJ+azqOaEj++8muS4jeaBsOeVtuWcsOiIieWgseegtOWjnicpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1hcnRpY2xlc2lnJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjmnaHnm67kuK3nrb7lkI0nLCAn5Zyo5qKd55uu5Lit57C95ZCNJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Zyo5p2h55uu5Lit562+5ZCNJywgJ+azqOaEj++8muWcqOaineebruS4reewveWQjScpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1hdXRvYmlvZ3JhcGh5Jzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliJvlu7roh6rkvKAnLCAn5bu656uL6Ieq5YKzJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Yib5bu66Ieq5LygJywgJ+azqOaEj++8muW7uueri+iHquWCsycpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1iYWRjYXQnOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpemUmeivr+eahOmhtemdouWIhuexuycsICfliqDlhaXpjK/oqqTnmoTpoIHpnaLliIbpoZ4nKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrliqDlhaXplJnor6/nmoTpobXpnaLliIbnsbsnLCAn5rOo5oSP77ya5Yqg5YWl6Yyv6Kqk55qE6aCB6Z2i5YiG6aGeJyksXG5cdFx0XHR9LFxuXHRcdFx0J3V3LWJpdGUnOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S8pOWus+aWsOaJiycsICflgrflrrPmlrDmiYsnKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrkvKTlrrPmlrDmiYsnLCAn5rOo5oSP77ya5YK35a6z5paw5omLJyksXG5cdFx0XHR9LFxuXHRcdFx0J3V3LWNoaW5lc2UnOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivt+S9v+eUqOagh+WHhuaxieivreayn+mAmicsICfoq4vkvb/nlKjmqJnmupbmvKLoqp7mup3pgJonKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJror7fkvb/nlKjmoIflh4bmsYnor63msp/pgJonLCAn5rOo5oSP77ya6KuL5L2/55So5qiZ5rqW5ryi6Kqe5rqd6YCaJyksXG5cdFx0XHR9LFxuXHRcdFx0J3V3LWNwbW92ZSc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Ymq6LS056e75YqoJywgJ+WJquiyvOenu+WLlScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muWJqui0tOenu+WKqCcsICfms6jmhI/vvJrliarosrznp7vli5UnKSxcblx0XHRcdH0sXG5cdFx0XHQndXctZGFiJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmtojmrafkuYnpobXmoLzlvI/plJnor68nLCAn5raI5q2n576p6aCB5qC85byP6Yyv6KqkJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5raI5q2n5LmJ6aG15qC85byP6ZSZ6K+vJywgJ+azqOaEj++8mua2iOatp+e+qemggeagvOW8j+mMr+iqpCcpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1uZXdwYWdlLWRyYWZ0Jzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmnIDov5HliJvlu7rnmoTpobXpnaLooqvnp7vliqjliLDojYnnqL8nLCAn5pyA6L+R5bu656uL55qE6aCB6Z2i6KKr56e75YuV5Yiw6I2J56i/JyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5pyA6L+R5Yib5bu655qE6aG16Z2i6KKr56e75Yqo5Yiw6I2J56i/JywgJ+azqOaEj++8muacgOi/keW7uueri+eahOmggemdouiiq+enu+WLleWIsOiNieeovycpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1zZWxmcmV2ZXJ0Jzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfmhJ/osKLmgqjoh6rooYzlm57pgIDoh6rlt7HnmoTmtYvor5XvvIzku6XlkI7kuI3opoHlho3ov5nmoLflgZrkuoYnLFxuXHRcdFx0XHRcdCfmhJ/orJ3mgqjoh6rooYzlm57pgIDoh6rlt7HnmoTmuKzoqabvvIzku6XlvozkuI3opoHlho3pgJnmqKPlgZrkuoYnXG5cdFx0XHRcdCksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Zue6YCA5Liq5Lq655qE5rWL6K+VJywgJ+azqOaEj++8muWbnumAgOWAi+S6uueahOa4rOippicpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1zdWJzdHViJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliJvlu7rlsI/lsI/kvZzlk4EnLCAn5bu656uL5bCP5bCP5L2c5ZOBJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya5Yib5bu65bCP5bCP5L2c5ZOBJywgJ+itpuWRiu+8muW7uueri+Wwj+Wwj+S9nOWTgScpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy10YWxraW5hcnRpY2xlJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjmnaHnm67pobXkuK3nlZnkuIvmhI/op4EnLCAn5Zyo5qKd55uu6aCB5Lit55WZ5LiL5oSP6KaLJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Zyo5p2h55uu6aG15Lit55WZ5LiL5oSP6KeBJywgJ+azqOaEj++8muWcqOaineebrumggeS4reeVmeS4i+aEj+imiycpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy11bnNpZ25lZCc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5rKh5pyJ5Zyo6K6o6K666aG15LiK562+5ZCNJywgJ+aykuacieWcqOiojuirlumggeS4iuewveWQjScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+azqOaEj++8muayoeacieWcqOiuqOiuuumhteS4iuetvuWQjScsICfms6jmhI/vvJrmspLmnInlnKjoqI7oq5bpoIHkuIrnsL3lkI0nKSxcblx0XHRcdH0sXG5cdFx0XHQndXctd3Jvbmdjc2QnOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpOeQhueUseS4jeW9kycsICflv6vpgJ/liKrpmaTnkIbnlLHkuI3nlbYnKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCfms6jmhI/vvJrlv6vpgJ/liKDpmaTnkIbnlLHkuI3lvZMnLCAn5rOo5oSP77ya5b+r6YCf5Yiq6Zmk55CG55Sx5LiN55W2JyksXG5cdFx0XHR9LFxuXHRcdFx0J3V3LXdyb25nc3VtbWFyeSc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo57yW6L6R5pGY6KaB5Yi26YCg5LiN6YCC5b2T55qE5YaF5a65JywgJ+WcqOe3qOi8r+aRmOimgeijvemAoOS4jemBqeeVtueahOWFp+WuuScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muWcqOe8lui+keaRmOimgeWItumAoOS4jemAguW9k+eahOWGheWuuScsICforablkYrvvJrlnKjnt6jovK/mkZjopoHoo73pgKDkuI3pgannlbbnmoTlhaflrrknKSxcblx0XHRcdH0sXG5cdFx0fSxcblx0XHRzaW5nbGV3YXJuOiB7XG5cdFx0XHQndXctM3JyJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnlKjmiLfmvZzlnKjov53lj43lm57pgIDkuI3ov4fkuInljp/liJnnmoTlj6/og73mgKcnLCAn55So5oi25r2b5Zyo6YGV5Y+N5Zue6YCA5LiN6YGO5LiJ5Y6f5YmH55qE5Y+v6IO95oCnJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn6K2m5ZGK77ya55So5oi35r2c5Zyo6L+d5Y+N5Zue6YCA5LiN6L+H5LiJ5Y6f5YiZ55qE5Y+v6IO95oCnJyxcblx0XHRcdFx0XHQn6K2m5ZGK77ya55So5oi25r2b5Zyo6YGV5Y+N5Zue6YCA5LiN6YGO5LiJ5Y6f5YmH55qE5Y+v6IO95oCnJ1xuXHRcdFx0XHQpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1hdHRhY2snOiB7XG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S6uui6q+aUu+WHuycsICfkurrouqvmlLvmk4onKSxcblx0XHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCforablkYrvvJrkurrouqvmlLvlh7snLCAn6K2m5ZGK77ya5Lq66Lqr5pS75pOKJyksXG5cdFx0XHRcdHN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHQndXctY29pJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKnnm4rlhrLnqoEnLCAn5Yip55uK6KGd56qBJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5rOo5oSP77ya5Yip55uK5Yay56qBJywgJ+azqOaEj++8muWIqeebiuihneeqgScpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1mYWtlc291cmNlJzoge1xuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfomZrmnoTmlbDmja7mupDmiJblvJXmlocnLCAn6Jmb5qeL6LOH5paZ5L6G5rqQ5oiW5byV5paHJyksXG5cdFx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn6K2m5ZGK77ya6Jma5p6E5pWw5o2u5rqQ5oiW5byV5paHJywgJ+itpuWRiu+8muiZm+ani+izh+aWmeS+hua6kOaIluW8leaWhycpLFxuXHRcdFx0fSxcblx0XHRcdCd1dy1waW5mbyc6IHtcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5byg6LS05LuW5Lq66ZqQ56eBJywgJ+W8teiyvOS7luS6uumaseengScpLFxuXHRcdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+itpuWRiu+8muW8oOi0tOS7luS6uumakOengScsICforablkYrvvJrlvLXosrzku5bkurrpmrHnp4EnKSxcblx0XHRcdH0sXG5cdFx0fSxcblx0fTtcblx0Ly8gVXNlZCByZXBlYXRlZGx5IGJlbG93IGFjcm9zcyBtZW51IHJlYnVpbGRzXG5cdFR3aW5rbGUud2Fybi5wcmV2X2FydGljbGUgPSBudWxsO1xuXHRUd2lua2xlLndhcm4ucHJldl9yZWFzb24gPSBudWxsO1xuXHRUd2lua2xlLndhcm4udGFsa3BhZ2VPYmogPSBudWxsO1xuXHRUd2lua2xlLndhcm4uY2FsbGJhY2suY2hhbmdlX2NhdGVnb3J5ID0gZnVuY3Rpb24gY2hhbmdlX2NhdGVnb3J5KGUpIHtcblx0XHRjb25zdCB7dmFsdWV9ID0gZS50YXJnZXQ7XG5cdFx0Y29uc3Qge3N1Yl9ncm91cH0gPSBlLnRhcmdldC5yb290O1xuXHRcdHN1Yl9ncm91cC5tYWluX2dyb3VwID0gdmFsdWU7XG5cdFx0bGV0IG9sZF9zdWJ2YWx1ZSA9IHN1Yl9ncm91cC52YWx1ZTtcblx0XHRsZXQgb2xkX3N1YnZhbHVlX3JlO1xuXHRcdGlmIChvbGRfc3VidmFsdWUpIHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gJ2tpdGNoZW5zaW5rJykge1xuXHRcdFx0XHQvLyBFeGFjdCBtYXRjaCBwb3NzaWJsZSBpbiBraXRjaGVuc2luayBtZW51XG5cdFx0XHRcdG9sZF9zdWJ2YWx1ZV9yZSA9IG5ldyBSZWdFeHAobXcudXRpbC5lc2NhcGVSZWdFeHAob2xkX3N1YnZhbHVlKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvbGRfc3VidmFsdWUgPSBvbGRfc3VidmFsdWUucmVwbGFjZSgvXFxkKihpbSk/JC8sICcnKTtcblx0XHRcdFx0b2xkX3N1YnZhbHVlX3JlID0gbmV3IFJlZ0V4cChgJHttdy51dGlsLmVzY2FwZVJlZ0V4cChvbGRfc3VidmFsdWUpfShcXFxcZCo/KSRgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKHN1Yl9ncm91cC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdHN1Yl9ncm91cC5yZW1vdmVDaGlsZChzdWJfZ3JvdXAuZmlyc3RDaGlsZCk7XG5cdFx0fVxuXHRcdGxldCBzZWxlY3RlZCA9IGZhbHNlO1xuXHRcdC8vIHdvcmtlciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGNvbWJvIGJveCBlbnRyaWVzXG5cdFx0Y29uc3QgY3JlYXRlRW50cmllcyA9IChjb250ZW50cywgY29udGFpbmVyLCB3cmFwSW5PcHRncm91cCwgdmFsID0gdmFsdWUpID0+IHtcblx0XHRcdC8vIGxldmVsMi0+Miwgc2luZ2xld2Fybi0+Jyc7IGFsc28gdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVcblx0XHRcdC8vIHNjYWxlZCBsZXZlbHMgZnJvbSBzaW5nbGVub3RpY2UsIHNpbmdsZXdhcm4sIGFuZCBjdXN0b21cblx0XHRcdGNvbnN0IGxldmVsID0gdmFsLnJlcGxhY2UoL15cXEQrL2csICcnKTtcblx0XHRcdC8vIGR1ZSB0byBhbiBhcHBhcmVudCBpT1MgYnVnLCB3ZSBoYXZlIHRvIGFkZCBhbiBvcHRpb24tZ3JvdXAgdG8gcHJldmVudCB0cnVuY2F0aW9uIG9mIHRleHRcblx0XHRcdC8vIChzZWFyY2ggV1Q6VFcgYXJjaGl2ZXMgZm9yIFwiUHJvYmxlbSBzZWxlY3Rpbmcgd2FybmluZ3Mgb24gYW4gaVBob25lXCIpXG5cdFx0XHRpZiAod3JhcEluT3B0Z3JvdXAgJiYgJC5jbGllbnQucHJvZmlsZSgpLnBsYXRmb3JtID09PSAnaXBob25lJykge1xuXHRcdFx0XHRsZXQgd3JhcHBlck9wdGdyb3VwID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnb3B0Z3JvdXAnLFxuXHRcdFx0XHRcdGxhYmVsOiAn5Y+v55So5qih5p2/Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdyYXBwZXJPcHRncm91cCA9IHdyYXBwZXJPcHRncm91cC5yZW5kZXIoKTtcblx0XHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKHdyYXBwZXJPcHRncm91cCk7XG5cdFx0XHRcdGNvbnRhaW5lciA9IHdyYXBwZXJPcHRncm91cDtcblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3QgW2l0ZW1LZXksIGl0ZW1Qcm9wZXJ0aWVzXSBvZiBPYmplY3QuZW50cmllcyhjb250ZW50cykpIHtcblx0XHRcdFx0Ly8gU2tpcCBpZiB0aGUgY3VycmVudCB0ZW1wbGF0ZSBkb2Vzbid0IGhhdmUgYSB2ZXJzaW9uIGZvciB0aGUgY3VycmVudCBsZXZlbFxuXHRcdFx0XHRpZiAoISFsZXZlbCAmJiAhaXRlbVByb3BlcnRpZXNbdmFsXSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBrZXkgPSB0eXBlb2YgaXRlbUtleSA9PT0gJ3N0cmluZycgPyBpdGVtS2V5IDogaXRlbVByb3BlcnRpZXMudmFsdWU7XG5cdFx0XHRcdGNvbnN0IHRlbXBsYXRlID0ga2V5ICsgbGV2ZWw7XG5cdFx0XHRcdGNvbnN0IGVsZW0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiBge3ske3RlbXBsYXRlfX19OiAke2xldmVsID8gaXRlbVByb3BlcnRpZXNbdmFsXS5sYWJlbCA6IGl0ZW1Qcm9wZXJ0aWVzLmxhYmVsfWAsXG5cdFx0XHRcdFx0dmFsdWU6IHRlbXBsYXRlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Ly8gU2VsZWN0IGl0ZW0gYmVzdCBjb3JyZXNwb25kaW5nIHRvIHByZXZpb3VzIHNlbGVjdGlvblxuXHRcdFx0XHRpZiAoIXNlbGVjdGVkICYmIG9sZF9zdWJ2YWx1ZSAmJiBvbGRfc3VidmFsdWVfcmUudGVzdCh0ZW1wbGF0ZSkpIHtcblx0XHRcdFx0XHRlbGVtLmRhdGEuc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBlbGVtUmVuZGVyZWQgPSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbS5yZW5kZXIoKSk7XG5cdFx0XHRcdCQoZWxlbVJlbmRlcmVkKS5kYXRhKCdtZXNzYWdlRGF0YScsIGl0ZW1Qcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdGNhc2UgJ3NpbmdsZW5vdGljZSc6XG5cdFx0XHRjYXNlICdzaW5nbGV3YXJuJzpcblx0XHRcdFx0Y3JlYXRlRW50cmllcyhUd2lua2xlLndhcm4ubWVzc2FnZXNbdmFsdWVdLCBzdWJfZ3JvdXAsIHRydWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NpbmdsZWNvbWJpbmVkJzoge1xuXHRcdFx0XHRjb25zdCB1blNvcnRlZFNpbmdsZXRzID0ge1xuXHRcdFx0XHRcdC4uLlR3aW5rbGUud2Fybi5tZXNzYWdlcy5zaW5nbGVub3RpY2UsXG5cdFx0XHRcdFx0Li4uVHdpbmtsZS53YXJuLm1lc3NhZ2VzLnNpbmdsZXdhcm4sXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IHNvcnRlZFNpbmdsZXRNZXNzYWdlcyA9IHt9O1xuXHRcdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh1blNvcnRlZFNpbmdsZXRzKS5zb3J0KCkpIHtcblx0XHRcdFx0XHRzb3J0ZWRTaW5nbGV0TWVzc2FnZXNba2V5XSA9IHVuU29ydGVkU2luZ2xldHNba2V5XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjcmVhdGVFbnRyaWVzKHNvcnRlZFNpbmdsZXRNZXNzYWdlcywgc3ViX2dyb3VwLCB0cnVlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdjdXN0b20nOlxuXHRcdFx0XHRjcmVhdGVFbnRyaWVzKFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tV2FybmluZ0xpc3QnKSwgc3ViX2dyb3VwLCB0cnVlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdraXRjaGVuc2luayc6XG5cdFx0XHRcdGZvciAoY29uc3QgbHZsIG9mIFsnbGV2ZWwxJywgJ2xldmVsMiddKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBsZXZlbEdyb3VwIG9mIFR3aW5rbGUud2Fybi5tZXNzYWdlcy5sZXZlbHMpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZUVudHJpZXMobGV2ZWxHcm91cC5saXN0LCBzdWJfZ3JvdXAsIHRydWUsIGx2bCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNyZWF0ZUVudHJpZXMoVHdpbmtsZS53YXJuLm1lc3NhZ2VzLnNpbmdsZW5vdGljZSwgc3ViX2dyb3VwLCB0cnVlKTtcblx0XHRcdFx0Y3JlYXRlRW50cmllcyhUd2lua2xlLndhcm4ubWVzc2FnZXMuc2luZ2xld2Fybiwgc3ViX2dyb3VwLCB0cnVlKTtcblx0XHRcdFx0Y3JlYXRlRW50cmllcyhUd2lua2xlLmdldFByZWYoJ2N1c3RvbVdhcm5pbmdMaXN0JyksIHN1Yl9ncm91cCwgdHJ1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbGV2ZWwxJzpcblx0XHRcdGNhc2UgJ2xldmVsMic6XG5cdFx0XHRcdC8vIENyZWF0ZXMgc3ViZ3JvdXAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIHRvIHBsYWNlIGluIGl0O1xuXHRcdFx0XHQvLyBsZWF2ZXMgXCJSZW1vdmFsIG9mIGRlbGV0aW9uIHRhZ3NcIiBlbXB0eSBmb3IgbGV2ZWwgMlxuXHRcdFx0XHRmb3IgKGNvbnN0IGxldmVsR3JvdXAgb2YgVHdpbmtsZS53YXJuLm1lc3NhZ2VzLmxldmVscykge1xuXHRcdFx0XHRcdGxldCBvcHRncm91cCA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnb3B0Z3JvdXAnLFxuXHRcdFx0XHRcdFx0bGFiZWw6IGxldmVsR3JvdXAuY2F0ZWdvcnksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b3B0Z3JvdXAgPSBvcHRncm91cC5yZW5kZXIoKTtcblx0XHRcdFx0XHRzdWJfZ3JvdXAuYXBwZW5kQ2hpbGQob3B0Z3JvdXApO1xuXHRcdFx0XHRcdC8vIGNyZWF0ZSB0aGUgb3B0aW9uc1xuXHRcdFx0XHRcdGNyZWF0ZUVudHJpZXMobGV2ZWxHcm91cC5saXN0LCBvcHRncm91cCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0b2xldmVsJzoge1xuXHRcdFx0XHQvLyBDaGVjayB1c2VyIHBhZ2UgdG8gZGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGxldmVsXG5cdFx0XHRcdGNvbnN0IGF1dG9sZXZlbFByb2MgPSAoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgd2lraXRleHQgPSBUd2lua2xlLndhcm4udGFsa3BhZ2VPYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdFx0XHQvLyBoaXN0b3J5IG5vdCBuZWVkZWQgZm9yIGF1dG9sZXZlbFxuXHRcdFx0XHRcdGNvbnN0IFtsYXRlc3RdID0gVHdpbmtsZS53YXJuLmNhbGxiYWNrcy5kYXRlUHJvY2Vzc2luZyh3aWtpdGV4dCk7XG5cdFx0XHRcdFx0Ly8gUHNldWRvLXBhcmFtcyB3aXRoIG9ubHkgd2hhdCdzIG5lZWRlZCB0byBwYXJzZSB0aGUgbGV2ZWwgaS5lLiBubyBtZXNzYWdlRGF0YVxuXHRcdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHN1Yl9ncm91cDogb2xkX3N1YnZhbHVlLFxuXHRcdFx0XHRcdFx0YXJ0aWNsZTogZS50YXJnZXQucm9vdC5hcnRpY2xlLnZhbHVlLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgbHZsID0gYGxldmVsJHtUd2lua2xlLndhcm4uY2FsbGJhY2tzLmF1dG9sZXZlbFBhcnNlV2lraXRleHQod2lraXRleHQsIHBhcmFtcywgbGF0ZXN0KVsxXX1gO1xuXHRcdFx0XHRcdC8vIElkZW50aWNhbCB0byBsZXZlbDEsIGV0Yy4gYWJvdmUgYnV0IGV4cGxpY2l0bHkgcHJvdmlkZXMgdGhlIGxldmVsXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBsZXZlbEdyb3VwIG9mIFR3aW5rbGUud2Fybi5tZXNzYWdlcy5sZXZlbHMpIHtcblx0XHRcdFx0XHRcdGxldCBvcHRncm91cCA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRncm91cCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBsZXZlbEdyb3VwLmNhdGVnb3J5LFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvcHRncm91cCA9IG9wdGdyb3VwLnJlbmRlcigpO1xuXHRcdFx0XHRcdFx0c3ViX2dyb3VwLmFwcGVuZENoaWxkKG9wdGdyb3VwKTtcblx0XHRcdFx0XHRcdC8vIGNyZWF0ZSB0aGUgb3B0aW9uc1xuXHRcdFx0XHRcdFx0Y3JlYXRlRW50cmllcyhsZXZlbEdyb3VwLmxpc3QsIG9wdGdyb3VwLCBmYWxzZSwgbHZsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gVHJpZ2dlciBzdWJjYXRlZ29yeSBjaGFuZ2UsIGFkZCBzZWxlY3QgbWVudSwgZXRjLlxuXHRcdFx0XHRcdFR3aW5rbGUud2Fybi5jYWxsYmFjay5wb3N0Q2F0ZWdvcnlDbGVhbnVwKGUpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoVHdpbmtsZS53YXJuLnRhbGtwYWdlT2JqKSB7XG5cdFx0XHRcdFx0YXV0b2xldmVsUHJvYygpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHVzZXJ0YWxrX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0YFVzZXJfdGFsazoke3JlbGV2YW50VXNlck5hbWV9YCxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg6L295LiK5qyh6K2m5ZGKJywgJ+i8ieWFpeS4iuasoeitpuWRiicpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR1c2VydGFsa19wYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0XHR1c2VydGFsa19wYWdlLmxvYWQoXG5cdFx0XHRcdFx0XHQocGFnZW9iaikgPT4ge1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLndhcm4udGFsa3BhZ2VPYmogPSBwYWdlb2JqOyAvLyBVcGRhdGUgdGFsa3BhZ2VPYmpcblx0XHRcdFx0XHRcdFx0YXV0b2xldmVsUHJvYygpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gQ2F0Y2ggYW5kIHdhcm4gaWYgdGhlIHRhbGtwYWdlIGNhbid0IGxvYWQsXG5cdFx0XHRcdFx0XHRcdC8vIG1vc3QgbGlrZWx5IGJlY2F1c2UgaXQncyBhIGNyb3NzLW5hbWVzcGFjZSByZWRpcmVjdFxuXHRcdFx0XHRcdFx0XHQvLyBTdXBlcnNlZGVzIHRoZSB0eXBpY2FsICRhdXRvbGV2ZWxNZXNzYWdlIGFkZGVkIGluIGF1dG9sZXZlbFBhcnNlV2lraXRleHRcblx0XHRcdFx0XHRcdFx0Y29uc3QgJG5vVGFsa1BhZ2VOb2RlID0gJCgnPHN0cm9uZz4nKVxuXHRcdFx0XHRcdFx0XHRcdC5hdHRyKCdpZCcsICd0d2lua2xlLXdhcm4tYXV0b2xldmVsLW1lc3NhZ2UnKVxuXHRcdFx0XHRcdFx0XHRcdC5jc3MoJ2NvbG9yJywgJyNmMDAnKVxuXHRcdFx0XHRcdFx0XHRcdC50ZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQn5peg5rOV5Yqg6L2955So5oi36K6o6K666aG177yM6L+Z5Y+v6IO95piv5Zug5Li65a6D5piv6Leo5ZG95ZCN56m66Ze06YeN5a6a5ZCR77yM6Ieq5Yqo6YCJ5oup6K2m5ZGK57qn5Yir5bCG5LiN5Lya6L+Q5L2c44CCJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0J+eEoeazlei8ieWFpeS9v+eUqOiAheiojuirlumgge+8jOmAmeWPr+iDveaYr+WboOeCuuWug+aYr+i3qOWRveWQjeepuumWk+mHjeaWsOWwjuWQke+8jOiHquWLlemBuOaTh+itpuWRiue0muWIpeWwh+S4jeacg+mBi+S9nOOAgidcblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHQkbm9UYWxrUGFnZU5vZGUuaW5zZXJ0QmVmb3JlKCRib2R5LmZpbmQoJyN0d2lua2xlLXdhcm4td2FybmluZy1tZXNzYWdlcycpKTtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgYSBwcmV2aWV3IHdhcyBvcGVuZWQgd2hpbGUgaW4gYSBkaWZmZXJlbnQgbW9kZSwgY2xvc2UgaXRcblx0XHRcdFx0XHRcdFx0Ly8gU2hvdWxkIG51bGxpZnkgdGhlIG5lZWQgdG8gY2F0Y2ggdGhlIGVycm9yIGluIHByZXZpZXcgY2FsbGJhY2tcblx0XHRcdFx0XHRcdFx0ZS50YXJnZXQucm9vdC5wcmV2aWV3ZXIuY2xvc2VQcmV2aWV3KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ3R3aW5rbGV3YXJu77ya5pyq55+l55qE6K2m5ZGK57uEJywgJ3R3aW5rbGV3YXJu77ya5pyq55+l55qE6K2m5ZGK57WEJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZXdhcm4nLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIFRyaWdnZXIgc3ViY2F0ZWdvcnkgY2hhbmdlLCBhZGQgc2VsZWN0IG1lbnUsIGV0Yy5cblx0XHQvLyBIZXJlIGJlY2F1c2Ugb2YgdGhlIGFzeW5jIGxvYWQgZm9yIGF1dG9sZXZlbFxuXHRcdGlmICh2YWx1ZSAhPT0gJ2F1dG9sZXZlbCcpIHtcblx0XHRcdC8vIHJlc2V0IGFueSBhdXRvbGV2ZWwtc3BlY2lmaWMgbWVzc2FnZXMgd2hpbGUgd2UncmUgaGVyZVxuXHRcdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtd2Fybi1hdXRvbGV2ZWwtbWVzc2FnZScpLnJlbW92ZSgpO1xuXHRcdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrLnBvc3RDYXRlZ29yeUNsZWFudXAoZSk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLndhcm4uY2FsbGJhY2sucG9zdENhdGVnb3J5Q2xlYW51cCA9IChlKSA9PiB7XG5cdFx0Ly8gY2xlYXIgb3ZlcnJpZGRlbiBsYWJlbCBvbiBhcnRpY2xlIHRleHRib3hcblx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFRvb2x0aXBWaXNpYmlsaXR5KGUudGFyZ2V0LnJvb3QuYXJ0aWNsZSwgdHJ1ZSk7XG5cdFx0TW9yZWJpdHMucXVpY2tGb3JtLnJlc2V0RWxlbWVudExhYmVsKGUudGFyZ2V0LnJvb3QuYXJ0aWNsZSk7XG5cdFx0Ly8gVHJpZ2dlciBjdXN0b20gbGFiZWwvY2hhbmdlIG9uIG1haW4gY2F0ZWdvcnkgY2hhbmdlXG5cdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrLmNoYW5nZV9zdWJjYXRlZ29yeShlKTtcblx0XHQvLyBVc2Ugc2VsZWN0MiB0byBtYWtlIHRoZSBzZWxlY3QgbWVudSBzZWFyY2hhYmxlXG5cdFx0aWYgKCFUd2lua2xlLmdldFByZWYoJ29sZFNlbGVjdCcpKSB7XG5cdFx0XHQkYm9keVxuXHRcdFx0XHQuZmluZCgnc2VsZWN0W25hbWU9c3ViX2dyb3VwXScpXG5cdFx0XHRcdC5zZWxlY3QyKHtcblx0XHRcdFx0XHR3aWR0aDogJzEwMCUnLFxuXHRcdFx0XHRcdG1hdGNoZXI6IE1vcmViaXRzLnNlbGVjdDIubWF0Y2hlcnMub3B0Z3JvdXBGdWxsLFxuXHRcdFx0XHRcdHRlbXBsYXRlUmVzdWx0OiBNb3JlYml0cy5zZWxlY3QyLmhpZ2hsaWdodFNlYXJjaE1hdGNoZXMsXG5cdFx0XHRcdFx0bGFuZ3VhZ2U6IHtcblx0XHRcdFx0XHRcdHNlYXJjaGluZzogTW9yZWJpdHMuc2VsZWN0Mi5xdWVyeUludGVyY2VwdG9yLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jaGFuZ2UoVHdpbmtsZS53YXJuLmNhbGxiYWNrLmNoYW5nZV9zdWJjYXRlZ29yeSk7XG5cdFx0XHQkYm9keS5maW5kKCcuc2VsZWN0Mi1zZWxlY3Rpb24nKS5vbigna2V5ZG93bicsIE1vcmViaXRzLnNlbGVjdDIuYXV0b1N0YXJ0KS50cmlnZ2VyKCdmb2N1cycpO1xuXHRcdFx0bXcudXRpbC5hZGRDU1MoXG5cdFx0XHRcdC8qIEluY3JlYXNlIGhlaWdodDtcblx0XHRcdFx0ICogUmVkdWNlIHBhZGRpbmc7XG5cdFx0XHRcdCAqIEFkanVzdCBmb250IHNpemUuXG5cdFx0XHRcdCAqICovXG5cdFx0XHRcdCcuc2VsZWN0Mi1jb250YWluZXIgLnNlbGVjdDItZHJvcGRvd24gLnNlbGVjdDItcmVzdWx0cz4uc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25ze21heC1oZWlnaHQ6MzUwcHh9LnNlbGVjdDItcmVzdWx0cyAuc2VsZWN0Mi1yZXN1bHRzX19ncm91cCwuc2VsZWN0Mi1yZXN1bHRzIC5zZWxlY3QyLXJlc3VsdHNfX29wdGlvbntwYWRkaW5nLXRvcDoxcHg7cGFkZGluZy1ib3R0b206MXB4fS5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0Mi1kcm9wZG93biAuc2VsZWN0Mi1yZXN1bHRzLC5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0aW9uIC5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWR7Zm9udC1zaXplOjEzcHh9J1xuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUud2Fybi5jYWxsYmFjay5jaGFuZ2Vfc3ViY2F0ZWdvcnkgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IG1haW5fZ3JvdXAgPSBlLnRhcmdldC5mb3JtLm1haW5fZ3JvdXAudmFsdWU7XG5cdFx0Y29uc3Qge3ZhbHVlfSA9IGUudGFyZ2V0LmZvcm0uc3ViX2dyb3VwO1xuXHRcdC8vIFRhZ3MgdGhhdCBkb24ndCB0YWtlIGEgbGlua2VkIGFydGljbGUsIGJ1dCBzb21ldGhpbmcgZWxzZSAob2Z0ZW4gYSB1c2VybmFtZSkuXG5cdFx0Ly8gVGhlIHZhbHVlIG9mIGVhY2ggdGFnIGlzIHRoZSBsYWJlbCBuZXh0IHRvIHRoZSBpbnB1dCBmaWVsZFxuXHRcdGNvbnN0IG5vdExpbmtlZEFydGljbGUgPSB7XG5cdFx0XHQndXctYml0ZSc6IHdpbmRvdy53Z1VMUygn6KKr4oCc5ZKs5Yiw4oCd55qE55So5oi377yI5LiN5ZCrVXNlcjrvvIkgJywgJ+iiq+OAjOWSrOWIsOOAjeeahOS9v+eUqOiAhe+8iOS4jeWQq1VzZXI677yJICcpLFxuXHRcdFx0J3V3LWFpdic6IHdpbmRvdy53Z1VMUygn5Y+v6YCJ6L6T5YWl6KKr6K2m5ZGK55qE55So5oi35ZCN77yI5LiN5ZCrVXNlcjrvvIkgJywgJ+WPr+mBuOi8uOWFpeiiq+itpuWRiueahOS9v+eUqOiAheWQjeeose+8iOS4jeWQq1VzZXI677yJICcpLFxuXHRcdH07XG5cdFx0aWYgKFsnc2luZ2xlbm90aWNlJywgJ3NpbmdsZXdhcm4nLCAnc2luZ2xlY29tYmluZWQnLCAna2l0Y2hlbnNpbmsnXS5pbmNsdWRlcyhtYWluX2dyb3VwKSkge1xuXHRcdFx0aWYgKG5vdExpbmtlZEFydGljbGVbdmFsdWVdKSB7XG5cdFx0XHRcdGlmIChUd2lua2xlLndhcm4ucHJldl9hcnRpY2xlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS53YXJuLnByZXZfYXJ0aWNsZSA9IGUudGFyZ2V0LmZvcm0uYXJ0aWNsZS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlLnRhcmdldC5mb3JtLmFydGljbGUubm90QXJ0aWNsZSA9IHRydWU7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uYXJ0aWNsZS52YWx1ZSA9ICcnO1xuXHRcdFx0XHQvLyBjaGFuZ2UgZm9ybSBsYWJlbHMgYWNjb3JkaW5nIHRvIHRoZSB3YXJuaW5nIHNlbGVjdGVkXG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VG9vbHRpcFZpc2liaWxpdHkoZS50YXJnZXQuZm9ybS5hcnRpY2xlLCBmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5vdmVycmlkZUVsZW1lbnRMYWJlbChlLnRhcmdldC5mb3JtLmFydGljbGUsIG5vdExpbmtlZEFydGljbGVbdmFsdWVdKTtcblx0XHRcdH0gZWxzZSBpZiAoZS50YXJnZXQuZm9ybS5hcnRpY2xlLm5vdEFydGljbGUpIHtcblx0XHRcdFx0aWYgKFR3aW5rbGUud2Fybi5wcmV2X2FydGljbGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRlLnRhcmdldC5mb3JtLmFydGljbGUudmFsdWUgPSBUd2lua2xlLndhcm4ucHJldl9hcnRpY2xlO1xuXHRcdFx0XHRcdFR3aW5rbGUud2Fybi5wcmV2X2FydGljbGUgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uYXJ0aWNsZS5ub3RBcnRpY2xlID0gZmFsc2U7XG5cdFx0XHRcdE1vcmViaXRzLnF1aWNrRm9ybS5zZXRFbGVtZW50VG9vbHRpcFZpc2liaWxpdHkoZS50YXJnZXQuZm9ybS5hcnRpY2xlLCB0cnVlKTtcblx0XHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnJlc2V0RWxlbWVudExhYmVsKGUudGFyZ2V0LmZvcm0uYXJ0aWNsZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGFkZCBiaWcgcmVkIG5vdGljZSwgd2FybmluZyB1c2VycyBhYm91dCBob3cgdG8gdXNlIHt7dXctW2NvaS1ddXNlcm5hbWV9fSBhcHByb3ByaWF0ZWx5XG5cdFx0JGJvZHkuZmluZCgnI3R3LXdhcm4tcmVkLW5vdGljZScpLnJlbW92ZSgpO1xuXHR9O1xuXHRUd2lua2xlLndhcm4uY2FsbGJhY2tzID0ge1xuXHRcdGdldFdhcm5pbmdXaWtpdGV4dDogKHRlbXBsYXRlTmFtZSwgYXJ0aWNsZSwgcmVhc29uLCBpc0N1c3RvbSwgbm9TaWduKSA9PiB7XG5cdFx0XHRsZXQgdGV4dCA9ICd7eycuY29uY2F0KCdzdWJzdDonLCB0ZW1wbGF0ZU5hbWUpO1xuXHRcdFx0Ly8gYWRkIGxpbmtlZCBhcnRpY2xlIGZvciB1c2VyIHdhcm5pbmdzXG5cdFx0XHRpZiAoYXJ0aWNsZSkge1xuXHRcdFx0XHR0ZXh0ICs9IGB8MT0ke2FydGljbGV9YDtcblx0XHRcdH1cblx0XHRcdGlmIChyZWFzb24pIHtcblx0XHRcdFx0Ly8gYWRkIGV4dHJhIG1lc3NhZ2Vcblx0XHRcdFx0dGV4dCArPSBgfDI9JHtyZWFzb259YDtcblx0XHRcdH1cblx0XHRcdHRleHQgKz0gJ3xzdWJzdD0nLmNvbmNhdCgnc3Vic3Q6Jyk7XG5cdFx0XHRpZiAoIW5vU2lnbikge1xuXHRcdFx0XHR0ZXh0ICs9ICd8c2lnPX5+Jy5jb25jYXQoJ35+Jyk7XG5cdFx0XHR9XG5cdFx0XHR0ZXh0ICs9ICd9fSc7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9LFxuXHRcdHNob3dQcmV2aWV3OiAoZm9ybSwgdGVtcGxhdGVuYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBpbnB1dCA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZm9ybSk7XG5cdFx0XHQvLyBQcm92aWRlZCBvbiBhdXRvbGV2ZWwsIG5vdCBvdGhlcndpc2Vcblx0XHRcdHRlbXBsYXRlbmFtZSB8fD0gaW5wdXQuc3ViX2dyb3VwO1xuXHRcdFx0Y29uc3QgbGlua2VkYXJ0aWNsZSA9IGlucHV0LmFydGljbGU7XG5cdFx0XHRjb25zdCB0ZW1wbGF0ZXRleHQgPSBUd2lua2xlLndhcm4uY2FsbGJhY2tzLmdldFdhcm5pbmdXaWtpdGV4dChcblx0XHRcdFx0dGVtcGxhdGVuYW1lLFxuXHRcdFx0XHRsaW5rZWRhcnRpY2xlLFxuXHRcdFx0XHRpbnB1dC5yZWFzb24sXG5cdFx0XHRcdGlucHV0Lm1haW5fZ3JvdXAgPT09ICdjdXN0b20nXG5cdFx0XHQpO1xuXHRcdFx0Zm9ybS5wcmV2aWV3ZXIuYmVnaW5SZW5kZXIodGVtcGxhdGV0ZXh0LCBgVXNlcl90YWxrOiR7cmVsZXZhbnRVc2VyTmFtZX1gKTsgLy8gRm9yY2Ugd2lraXRleHQvY29ycmVjdCB1c2VybmFtZVxuXHRcdH0sXG5cblx0XHQvLyBKdXN0IGEgcGFzcy10aHJvdWdoIHVubGVzcyB0aGUgYXV0b2xldmVsIG9wdGlvbiB3YXMgc2VsZWN0ZWRcblx0XHRwcmV2aWV3OiAoZm9ybSkgPT4ge1xuXHRcdFx0aWYgKGZvcm0ubWFpbl9ncm91cC52YWx1ZSA9PT0gJ2F1dG9sZXZlbCcpIHtcblx0XHRcdFx0Ly8gQWx3YXlzIGdldCBhIG5ldywgdXBkYXRlZCB0YWxrcGFnZSBmb3IgYXV0b2xldmVsIHByb2Nlc3Npbmdcblx0XHRcdFx0Y29uc3QgdXNlcnRhbGtfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0YFVzZXJfdGFsazoke3JlbGV2YW50VXNlck5hbWV9YCxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOi9veS4iuasoeitpuWRiicsICfovInlhaXkuIrmrKHorablkYonKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR1c2VydGFsa19wYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0Ly8gV2lsbCBmYWlsIHNpbGVudGx5IGlmIHRoZSB0YWxrIHBhZ2UgaXMgYSBjcm9zcy1ucyByZWRpcmVjdCxcblx0XHRcdFx0Ly8gcmVtb3ZhbCBvZiB0aGUgcHJldmlldyBib3ggaGFuZGxlZCB3aGVuIGxvYWRpbmcgdGhlIG1lbnVcblx0XHRcdFx0dXNlcnRhbGtfcGFnZS5sb2FkKChwYWdlb2JqKSA9PiB7XG5cdFx0XHRcdFx0VHdpbmtsZS53YXJuLnRhbGtwYWdlT2JqID0gcGFnZW9iajsgLy8gVXBkYXRlIHRhbGtwYWdlT2JqXG5cdFx0XHRcdFx0Y29uc3Qgd2lraXRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdFx0Ly8gaGlzdG9yeSBub3QgbmVlZGVkIGZvciBhdXRvbGV2ZWxcblx0XHRcdFx0XHRjb25zdCBbbGF0ZXN0XSA9IFR3aW5rbGUud2Fybi5jYWxsYmFja3MuZGF0ZVByb2Nlc3Npbmcod2lraXRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHN1Yl9ncm91cDogZm9ybS5zdWJfZ3JvdXAudmFsdWUsXG5cdFx0XHRcdFx0XHRhcnRpY2xlOiBmb3JtLmFydGljbGUudmFsdWUsXG5cdFx0XHRcdFx0XHRtZXNzYWdlRGF0YTogJChmb3JtLnN1Yl9ncm91cClcblx0XHRcdFx0XHRcdFx0LmZpbmQoYG9wdGlvblt2YWx1ZT1cIiR7JChmb3JtLnN1Yl9ncm91cCkudmFsKCl9XCJdYClcblx0XHRcdFx0XHRcdFx0LmRhdGEoJ21lc3NhZ2VEYXRhJyksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBbdGVtcGxhdGVdID0gVHdpbmtsZS53YXJuLmNhbGxiYWNrcy5hdXRvbGV2ZWxQYXJzZVdpa2l0ZXh0KHdpa2l0ZXh0LCBwYXJhbXMsIGxhdGVzdCk7XG5cdFx0XHRcdFx0VHdpbmtsZS53YXJuLmNhbGxiYWNrcy5zaG93UHJldmlldyhmb3JtLCB0ZW1wbGF0ZSk7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHRlbXBsYXRlcyBoYXZlIGRpdmVyZ2VkLCBmYWtlIGEgY2hhbmdlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gdG8gcmVsb2FkIHRoZSBtZW51IHdpdGggdGhlIHVwZGF0ZWQgcGFnZW9ialxuXHRcdFx0XHRcdGlmIChmb3JtLnN1Yl9ncm91cC52YWx1ZSAhPT0gdGVtcGxhdGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXHRcdFx0XHRcdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRmb3JtLm1haW5fZ3JvdXAuZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRUd2lua2xlLndhcm4uY2FsbGJhY2tzLnNob3dQcmV2aWV3KGZvcm0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogVXNlZCBpbiB0aGUgbWFpbiBhbmQgYXV0b2xldmVsIGxvb3BzIHRvIGRldGVybWluZSB3aGVuIHRvIHdhcm5cblx0XHQgKiBhYm91dCBleGNlc3NpdmVseSByZWNlbnQsIHN0YWxlLCBvciBpZGVudGljYWwgd2FybmluZ3MuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gd2lraXRleHQgIFRoZSB0ZXh0IG9mIGEgdXNlcidzIHRhbGsgcGFnZSwgZnJvbSBnZXRQYWdlVGV4dCgpXG5cdFx0ICogQHJldHVybnMge09iamVjdFtdfSAtIEFycmF5IG9mIG9iamVjdHM6IGxhdGVzdCBjb250YWlucyBtb3N0IHJlY2VudFxuXHRcdCAqIHdhcm5pbmcgYW5kIGRhdGU7IGhpc3RvcnkgbGlzdHMgYWxsIHByaW9yIHdhcm5pbmdzXG5cdFx0ICovXG5cdFx0ZGF0ZVByb2Nlc3Npbmc6ICh3aWtpdGV4dCkgPT4ge1xuXHRcdFx0Y29uc3QgaGlzdG9yeV9yZSA9XG5cdFx0XHRcdC88IS0tXFxzP1RlbXBsYXRlOihbdVVddy0uKj8pXFxzPy0tPi4qPyhcXGR7NH0p5bm0KFxcZHsxLDJ9KeaciChcXGR7MSwyfSnml6UgXFwoW+aXpeS4gOS6jOS4ieWbm+S6lOWFrV1cXCkgKFxcZHsxLDJ9KTooXFxkezEsMn0pIFxcKENTVFxcKS9nO1xuXHRcdFx0Y29uc3QgaGlzdG9yeSA9IHt9O1xuXHRcdFx0Y29uc3QgbGF0ZXN0ID0ge1xuXHRcdFx0XHRkYXRlOiBuZXcgTW9yZWJpdHMuZGF0ZSgwKSxcblx0XHRcdFx0dHlwZTogJycsXG5cdFx0XHR9O1xuXHRcdFx0bGV0IGN1cnJlbnQ7XG5cdFx0XHR3aGlsZSAoKGN1cnJlbnQgPSBoaXN0b3J5X3JlLmV4ZWMod2lraXRleHQpKSAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb25zdCBbLCB0ZW1wbGF0ZV0gPSBjdXJyZW50O1xuXHRcdFx0XHRjb25zdCBjdXJyZW50X2RhdGUgPSBuZXcgTW9yZWJpdHMuZGF0ZShcblx0XHRcdFx0XHRgJHtjdXJyZW50WzJdfS0ke2N1cnJlbnRbM119LSR7Y3VycmVudFs0XX0gJHtjdXJyZW50WzVdfToke2N1cnJlbnRbNl19IChDU1QpYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoISh0ZW1wbGF0ZSBpbiBoaXN0b3J5KSB8fCBoaXN0b3J5W3RlbXBsYXRlXS5pc0JlZm9yZShjdXJyZW50X2RhdGUpKSB7XG5cdFx0XHRcdFx0aGlzdG9yeVt0ZW1wbGF0ZV0gPSBjdXJyZW50X2RhdGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFsYXRlc3QuZGF0ZS5pc0FmdGVyKGN1cnJlbnRfZGF0ZSkpIHtcblx0XHRcdFx0XHRsYXRlc3QuZGF0ZSA9IGN1cnJlbnRfZGF0ZTtcblx0XHRcdFx0XHRsYXRlc3QudHlwZSA9IHRlbXBsYXRlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2xhdGVzdCwgaGlzdG9yeV07XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBNYWluIGxvb3AgZm9yIGRlY2lkaW5nIHdoYXQgdGhlIGxldmVsIHNob3VsZCBpbmNyZW1lbnQgdG8uIE1vc3Qgb2Zcblx0XHQgKiB0aGlzIGlzIHJlYWxseSBqdXN0IGVycm9yIGNhdGNoaW5nIGFuZCB1cGRhdGluZyB0aGUgc3Vic2VxdWVudCBkYXRhLlxuXHRcdCAqIE1heSBwcm9kdWNlIHVwIHRvIHR3byBub3RpY2VzIGluIGEgdHdpbmtsZS13YXJuLWF1dG9sZXZlbC1tZXNzYWdlcyBkaXZcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB3aWtpdGV4dCAgVGhlIHRleHQgb2YgYSB1c2VyJ3MgdGFsayBwYWdlLCBmcm9tIGdldFBhZ2VUZXh0KCkgKHJlcXVpcmVkKVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgIFBhcmFtcyBvYmplY3Q6IHN1Yl9ncm91cCBpcyB0aGUgdGVtcGxhdGUgKHJlcXVpcmVkKTtcblx0XHQgKiBhcnRpY2xlIGlzIHRoZSB1c2VyLXByb3ZpZGVkIGFydGljbGUgKGZvcm0uYXJ0aWNsZSkgdXNlZCB0byBsaW5rIEFSViBvbiByZWNlbnQgbGV2ZWwyIHdhcm5pbmdzO1xuXHRcdCAqIG1lc3NhZ2VEYXRhIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIGdldHRpbmcgdGhlIGZ1bGwgdGVtcGxhdGUsIGFzIGl0J3Ncblx0XHQgKiB1c2VkIHRvIGVuc3VyZSBhIHZhbGlkIHRlbXBsYXRlIG9mIHRoYXQgbGV2ZWwgZXhpc3RzXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxhdGVzdCAgRmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgZnJvbVxuXHRcdCAqIGRhdGVQcm9jZXNzaW5nLiBQcm92aWRlZCBoZXJlIHJhdGhlciB0aGFuIHByb2Nlc3NlZCB3aXRoaW4gdG8gYXZvaWRcblx0XHQgKiByZXBlYXRlZCBjYWxsIHRvIGRhdGVQcm9jZXNzaW5nXG5cdFx0ICogQHBhcmFtIHsoRGF0ZXxNb3JlYml0cy5kYXRlKX0gZGF0ZSAgRGF0ZSBmcm9tIHdoaWNoIHN0YWxlbmVzcyBpcyBkZXRlcm1pbmVkXG5cdFx0ICogQHBhcmFtIHtNb3JlYml0cy5zdGF0dXN9IHN0YXRlbGVtICBTdGF0dXMgZWxlbWVudCwgb25seSB1c2VkIGZvciBoYW5kbGluZyBlcnJvciBpbiBmaW5hbCBleGVjdXRpb25cblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtBcnJheX0gLSBBcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmdWxsIHRlbXBsYXRlIGFuZCBqdXN0IHRoZSB3YXJuaW5nIGxldmVsXG5cdFx0ICovXG5cdFx0YXV0b2xldmVsUGFyc2VXaWtpdGV4dDogKHdpa2l0ZXh0LCBwYXJhbXMsIGxhdGVzdCwgZGF0ZSwgc3RhdGVsZW0pID0+IHtcblx0XHRcdGxldCBsZXZlbDsgLy8gdW5kZWZpbmVkIHJhdGhlciB0aGFuICcnIG1lYW5zIHRoZSBpc05hTiBiZWxvdyB3aWxsIHJldHVybiB0cnVlXG5cdFx0XHRpZiAoL1xcZD8kLy50ZXN0KGxhdGVzdC50eXBlKSkge1xuXHRcdFx0XHQvLyBsZXZlbDEtMlxuXHRcdFx0XHRsZXZlbCA9IE51bWJlci5wYXJzZUludChsYXRlc3QudHlwZS5yZXBsYWNlKC8uKihcXGQpPyQvLCAnJDEnKSwgMTApO1xuXHRcdFx0fSBlbHNlIGlmIChsYXRlc3QudHlwZSkge1xuXHRcdFx0XHRsZXZlbCA9IDE7IC8vIHNpbmdsZW5vdGljZSBvciBub3QgZm91bmRcblx0XHRcdH1cblx0XHRcdGNvbnN0ICRhdXRvbGV2ZWxNZXNzYWdlID0gJCgnPGRpdj4nKS5hdHRyKCdpZCcsICd0d2lua2xlLXdhcm4tYXV0b2xldmVsLW1lc3NhZ2UnKTtcblx0XHRcdGlmIChOdW1iZXIuaXNOYU4obGV2ZWwpKSB7XG5cdFx0XHRcdC8vIE5vIHByaW9yIHdhcm5pbmdzIGZvdW5kLCB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdFx0XHRsZXZlbCA9IDE7XG5cdFx0XHR9IGVsc2UgaWYgKGxldmVsID4gMiB8fCBsZXZlbCA8IDEpIHtcblx0XHRcdFx0Ly8gU2hvdWxkbid0IGhhcHBlblxuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfml6Dms5Xop6PmnpDkuIrmrKHnmoTorablkYrlsYLnuqfvvIzor7fmiYvliqjpgInmi6nkuIDkuKrorablkYrlsYLnuqfjgIInLFxuXHRcdFx0XHRcdCfnhKHms5Xop6PmnpDkuIrmrKHnmoTorablkYrlsaTntJrvvIzoq4vmiYvli5Xpgbjmk4fkuIDlgIvorablkYrlsaTntJrjgIInXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChzdGF0ZWxlbSkge1xuXHRcdFx0XHRcdHN0YXRlbGVtLmVycm9yKG1lc3NhZ2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG13Lm5vdGlmeShtZXNzYWdlLCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xld2FybicsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0ZSB8fD0gbmV3IERhdGUoKTtcblx0XHRcdFx0Y29uc3QgYXV0b1RpbWVvdXQgPSBuZXcgTW9yZWJpdHMuZGF0ZShsYXRlc3QuZGF0ZS5nZXRUaW1lKCkpLmFkZChcblx0XHRcdFx0XHROdW1iZXIucGFyc2VJbnQoVHdpbmtsZS5nZXRQcmVmKCdhdXRvbGV2ZWxTdGFsZURheXMnKSwgMTApLFxuXHRcdFx0XHRcdCdkYXknXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChhdXRvVGltZW91dC5pc0FmdGVyKGRhdGUpKSB7XG5cdFx0XHRcdFx0aWYgKGxldmVsID09PSAyKSB7XG5cdFx0XHRcdFx0XHRsZXZlbCA9IDI7XG5cdFx0XHRcdFx0XHQvLyBCYXNpY2FsbHkgaW5kaWNhdGVzIHdoZXRoZXIgd2UncmUgaW4gdGhlIGZpbmFsIE1haW4gZXZhbHVhdGlvbiBvciBub3QsXG5cdFx0XHRcdFx0XHQvLyBhbmQgdGh1cyB3aGV0aGVyIHdlIGNhbiBjb250aW51ZSBvciBuZWVkIHRvIGRpc3BsYXkgdGhlIHdhcm5pbmcgYW5kIGxpbmtcblx0XHRcdFx0XHRcdGlmICghc3RhdGVsZW0pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgJGxpbmsgPSAkKCc8YT4nKVxuXHRcdFx0XHRcdFx0XHRcdC5hdHRyKCdocmVmJywgJyMnKVxuXHRcdFx0XHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn5Y2V5Ye75q2k5aSE5omT5byA5ZGK54q25bel5YW3JywgJ+m7nuaTiuatpOiZleaJk+mWi+WRiueLgOW3peWFtycpKVxuXHRcdFx0XHRcdFx0XHRcdC5jc3MoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxuXHRcdFx0XHRcdFx0XHRcdC5vbignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdFx0XHRUd2lua2xlLndhcm4uZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRUd2lua2xlLmFydi5jYWxsYmFjayhyZWxldmFudFVzZXJOYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdCRib2R5LmZpbmQoJ2lucHV0W25hbWU9cGFnZV0nKS52YWwocGFyYW1zLmFydGljbGUpOyAvLyBUYXJnZXQgcGFnZVxuXHRcdFx0XHRcdFx0XHRcdFx0JGJvZHkuZmluZCgnaW5wdXRbdmFsdWU9ZmluYWxdJykucHJvcCgnY2hlY2tlZCcsIHRydWUpOyAvLyBWYW5kYWxpc20gYWZ0ZXIgZmluYWxcblx0XHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBzdGF0dXNOb2RlID0gJCgnPGRpdj4nKVxuXHRcdFx0XHRcdFx0XHRcdC5jc3MoJ2NvbG9yJywgJyNmMDAnKVxuXHRcdFx0XHRcdFx0XHRcdC50ZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVsZXZhbnRVc2VyTmFtZSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyA5ZCO5pS25Yiw5LqG5LiA5Liq5bGC57qnMuitpuWRiu+8iCcsICfmnIDlvozmlLbliLDkuobkuIDlgIvlsaTntJoy6K2m5ZGK77yIJykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYXRlc3QudHlwZSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQn77yJ77yM5omA5Lul5bCG5YW25oql5ZGK57uZ566h55CG5Lq65ZGY5Lya5q+U6L6D5aW977ybJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQn77yJ77yM5omA5Lul5bCH5YW25aCx5ZGK57Wm566h55CG5Lq65ZOh5pyD5q+U6LyD5aW977ybJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0c3RhdHVzTm9kZS5hcHBlbmQoJGxpbmtbMF0pO1xuXHRcdFx0XHRcdFx0XHQkYXV0b2xldmVsTWVzc2FnZS5hcHBlbmQoc3RhdHVzTm9kZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEF1dG9tYXRpY2FsbHkgaW5jcmVhc2Ugc2V2ZXJpdHlcblx0XHRcdFx0XHRcdGxldmVsICs9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFJlc2V0IHdhcm5pbmcgbGV2ZWwgaWYgbW9zdC1yZWNlbnQgd2FybmluZyBpcyB0b28gb2xkXG5cdFx0XHRcdFx0bGV2ZWwgPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQkYXV0b2xldmVsTWVzc2FnZS5wcmVwZW5kKFxuXHRcdFx0XHQkKFxuXHRcdFx0XHRcdGA8ZGl2PiR7d2luZG93LndnVUxTKCflsIblj5HpgIEnLCAn5bCH55m86YCBJyl9PHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDtcIj4ke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflsYLnuqcnLFxuXHRcdFx0XHRcdFx0J+WxpOe0midcblx0XHRcdFx0XHQpfSR7bGV2ZWx9PC9zcGFuPuitpuWRiuaooeadv+OAgjwvZGl2PmBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdC8vIFBsYWNlIGFmdGVyIHRoZSBzdGFsZSBhbmQgb3RoZXItdXNlci1yZXZlcnRlZCAodGV4dC1vbmx5KSBtZXNzYWdlc1xuXHRcdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtd2Fybi1hdXRvbGV2ZWwtbWVzc2FnZScpLnJlbW92ZSgpOyAvLyBjbGVhbiBzbGF0ZVxuXHRcdFx0JGF1dG9sZXZlbE1lc3NhZ2UuaW5zZXJ0QWZ0ZXIoJGJvZHkuZmluZCgnI3R3aW5rbGUtd2Fybi13YXJuaW5nLW1lc3NhZ2VzJykpO1xuXHRcdFx0bGV0IHRlbXBsYXRlID0gcGFyYW1zLnN1Yl9ncm91cC5yZXBsYWNlKC8oLiopXFxkJC8sICckMScpO1xuXHRcdFx0Ly8gVmFsaWRhdGUgd2FybmluZyBsZXZlbCwgZmFsbGluZyBiYWNrIHRvIHRoZSB1dy1nZW5lcmljIHNlcmllcy5cblx0XHRcdC8vIE9ubHkgYSBmZXcgaXRlbXMgYXJlIG1pc3NpbmcgYSBsZXZlbCwgYW5kIGluIGFsbCBidXQgYSBoYW5kZnVsXG5cdFx0XHQvLyBvZiBjYXNlcywgdGhlIHV3LWdlbmVyaWMgc2VyaWVzIGlzIGV4cGxpY2l0bHkgdXNlZCBlbHNld2hlcmUuXG5cdFx0XHRpZiAocGFyYW1zLm1lc3NhZ2VEYXRhICYmICFwYXJhbXMubWVzc2FnZURhdGFbYGxldmVsJHtsZXZlbH1gXSkge1xuXHRcdFx0XHR0ZW1wbGF0ZSA9ICd1dy1nZW5lcmljJztcblx0XHRcdH1cblx0XHRcdHRlbXBsYXRlICs9IGxldmVsO1xuXHRcdFx0cmV0dXJuIFt0ZW1wbGF0ZSwgbGV2ZWxdO1xuXHRcdH0sXG5cdFx0bWFpbjogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGxldCB7bWVzc2FnZURhdGF9ID0gcGFyYW1zO1xuXHRcdFx0Y29uc3Qgd2FybmluZ0hpc3RvcnkgPSBUd2lua2xlLndhcm4uY2FsbGJhY2tzLmRhdGVQcm9jZXNzaW5nKHRleHQpO1xuXHRcdFx0Y29uc3QgW2xhdGVzdCwgaGlzdG9yeV0gPSB3YXJuaW5nSGlzdG9yeTtcblx0XHRcdGNvbnN0IG5vdyA9IG5ldyBNb3JlYml0cy5kYXRlKHBhZ2VvYmouZ2V0TG9hZFRpbWUoKSk7XG5cdFx0XHRUd2lua2xlLndhcm4udGFsa3BhZ2VPYmogPSBwYWdlb2JqOyAvLyBVcGRhdGUgdGFsa3BhZ2VPYmosIGp1c3QgaW4gY2FzZVxuXHRcdFx0aWYgKHBhcmFtcy5tYWluX2dyb3VwID09PSAnYXV0b2xldmVsJykge1xuXHRcdFx0XHQvLyBbdGVtcGxhdGUsIGxldmVsXVxuXHRcdFx0XHRjb25zdCB0ZW1wbGF0ZUFuZExldmVsID0gVHdpbmtsZS53YXJuLmNhbGxiYWNrcy5hdXRvbGV2ZWxQYXJzZVdpa2l0ZXh0KFxuXHRcdFx0XHRcdHRleHQsXG5cdFx0XHRcdFx0cGFyYW1zLFxuXHRcdFx0XHRcdGxhdGVzdCxcblx0XHRcdFx0XHRub3csXG5cdFx0XHRcdFx0c3RhdGVsZW1cblx0XHRcdFx0KTtcblx0XHRcdFx0Ly8gT25seSBpZiB0aGVyZSdzIGEgY2hhbmdlIGZyb20gdGhlIHByaW9yIGRpc3BsYXkvbG9hZFxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cGFyYW1zLnN1Yl9ncm91cCAhPT0gdGVtcGxhdGVBbmRMZXZlbFswXSAmJlxuXHRcdFx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflsIblj5HpgIHnu5nnlKjmiLd7eycsICflsIfnmbzpgIHntabkvb/nlKjogIV7eycpICtcblx0XHRcdFx0XHRcdFx0dGVtcGxhdGVBbmRMZXZlbFswXSArXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnfX3mqKHmnb/vvIzlpb3lkJfvvJ8nLCAnfX3mqKHmnb/vvIzlpb3ll47vvJ8nKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfnlKjmiLflj5bmtognLCAn5L2/55So6ICF5Y+W5raIJykpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBVcGRhdGUgcGFyYW1zIG5vdyB0aGF0IHdlJ3ZlIHNlbGVjdGVkIGEgd2FybmluZ1xuXHRcdFx0XHRbcGFyYW1zLnN1Yl9ncm91cF0gPSB0ZW1wbGF0ZUFuZExldmVsO1xuXHRcdFx0XHRtZXNzYWdlRGF0YSA9IHBhcmFtcy5tZXNzYWdlRGF0YVtgbGV2ZWwke3RlbXBsYXRlQW5kTGV2ZWxbMV19YF07XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRwYXJhbXMuc3ViX2dyb3VwIGluIGhpc3RvcnkgJiZcblx0XHRcdFx0bmV3IE1vcmViaXRzLmRhdGUoaGlzdG9yeVtwYXJhbXMuc3ViX2dyb3VwXSkuYWRkKDEsICdkYXknKS5pc0FmdGVyKG5vdykgJiZcblx0XHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfov5EyNOWwj+aXtuWGheS4gOS4quWQjOagt+eahCAnLCAn6L+RMjTlsI/mmYLlhafkuIDlgIvlkIzmqKPnmoQgJykgK1xuXHRcdFx0XHRcdFx0cGFyYW1zLnN1Yl9ncm91cCArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJyDmqKHmnb/lt7Looqvlj5Hlh7rjgIJcXG7mmK/lkKbnu6fnu63vvJ8nLCAnIOaooeadv+W3suiiq+eZvOWHuuOAglxcbuaYr+WQpue5vOe6jO+8nycpXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iCcsICfkvb/nlKjogIXlj5bmtognKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxhdGVzdC5kYXRlLmFkZCgxLCAnbWludXRlJyk7IC8vIGFmdGVyIGxvbmcgZGViYXRlLCBvbmUgbWludXRlIGlzIG1heFxuXHRcdFx0aWYgKFxuXHRcdFx0XHRsYXRlc3QuZGF0ZS5pc0FmdGVyKG5vdykgJiZcblx0XHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfov5Ex5YiG6ZKf5YaFICcsICfov5Ex5YiG6ZCY5YWnICcpICtcblx0XHRcdFx0XHRcdGxhdGVzdC50eXBlICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOaooeadv+W3suiiq+WPkeWHuuOAglxcbuaYr+WQpue7p+e7re+8nycsICcg5qih5p2/5bey6KKr55m85Ye644CCXFxu5piv5ZCm57m857qM77yfJylcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHN0YXRlbGVtLmVycm9yKHdpbmRvdy53Z1VMUygn55So5oi35Y+W5raIJywgJ+S9v+eUqOiAheWPlua2iCcpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Ly8gYnVpbGQgdGhlIGVkaXQgc3VtbWFyeVxuXHRcdFx0Ly8gRnVuY3Rpb24gdG8gaGFuZGxlIGdlbmVyYXRpb24gb2Ygc3VtbWFyeSBwcmVmaXggZm9yIGN1c3RvbSB0ZW1wbGF0ZXNcblx0XHRcdGNvbnN0IGN1c3RvbVByb2Nlc3MgPSAodGVtcGxhdGUpID0+IHtcblx0XHRcdFx0W3RlbXBsYXRlXSA9IHRlbXBsYXRlLnNwbGl0KCd8Jyk7XG5cdFx0XHRcdGxldCBwcmVmaXg7XG5cdFx0XHRcdHN3aXRjaCAodGVtcGxhdGUuc2xpY2UoLTEpKSB7XG5cdFx0XHRcdFx0Y2FzZSAnMSc6XG5cdFx0XHRcdFx0XHRwcmVmaXggPSAn5rOo5oSPJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJzInOlxuXHRcdFx0XHRcdFx0cHJlZml4ID0gJ+itpuWRiic7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHQvLyBmYWxscyB0aHJvdWdoXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHByZWZpeCA9ICfmj5DphpInO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGAke3ByZWZpeH3vvJoke01vcmViaXRzLnN0cmluZy50b1VwcGVyQ2FzZUZpcnN0Q2hhcihtZXNzYWdlRGF0YS5sYWJlbCl9YDtcblx0XHRcdH07XG5cdFx0XHRsZXQgc3VtbWFyeTtcblx0XHRcdGlmIChwYXJhbXMubWFpbl9ncm91cCA9PT0gJ2N1c3RvbScpIHtcblx0XHRcdFx0c3VtbWFyeSA9IGN1c3RvbVByb2Nlc3MocGFyYW1zLnN1Yl9ncm91cCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBOb3JtYWxpemUga2l0Y2hlbnNpbmsgdG8gdGhlIDEtMiBzdHlsZVxuXHRcdFx0XHRpZiAocGFyYW1zLm1haW5fZ3JvdXAgPT09ICdraXRjaGVuc2luaycgJiYgIS9eRCskLy50ZXN0KHBhcmFtcy5zdWJfZ3JvdXApKSB7XG5cdFx0XHRcdFx0bGV0IHN1YiA9IHBhcmFtcy5zdWJfZ3JvdXAuc2xpY2UoLTEpO1xuXHRcdFx0XHRcdGlmIChzdWIgPT09ICdtJykge1xuXHRcdFx0XHRcdFx0c3ViID0gcGFyYW1zLnN1Yl9ncm91cC5zbGljZSgtMyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIERvbid0IG92ZXJ3cml0ZSB1dy0zcnIsIHRlY2huaWNhbGx5IHVubmVjZXNzYXJ5XG5cdFx0XHRcdFx0aWYgKC9cXGQvLnRlc3Qoc3ViKSkge1xuXHRcdFx0XHRcdFx0cGFyYW1zLm1haW5fZ3JvdXAgPSBgbGV2ZWwke3N1Yn1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBzaW5nbGV0IHx8IGxldmVsMS0yLCBubyBuZWVkIHRvIC9eXFxEKyQvLnRlc3QocGFyYW1zLm1haW5fZ3JvdXApXG5cdFx0XHRcdHN1bW1hcnkgPVxuXHRcdFx0XHRcdG1lc3NhZ2VEYXRhLnN1bW1hcnkgfHwgKG1lc3NhZ2VEYXRhW3BhcmFtcy5tYWluX2dyb3VwXSAmJiBtZXNzYWdlRGF0YVtwYXJhbXMubWFpbl9ncm91cF0uc3VtbWFyeSk7XG5cdFx0XHRcdC8vIE5vdCBpbiBUd2lua2xlLndhcm4ubWVzc2FnZXMsIGFzc3VtZSBjdXN0b20gdGVtcGxhdGVcblx0XHRcdFx0aWYgKCFzdW1tYXJ5KSB7XG5cdFx0XHRcdFx0c3VtbWFyeSA9IGN1c3RvbVByb2Nlc3MocGFyYW1zLnN1Yl9ncm91cCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG1lc3NhZ2VEYXRhLnN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeSAhPT0gdHJ1ZSAmJiBwYXJhbXMuYXJ0aWNsZSkge1xuXHRcdFx0XHRcdGlmIChwYXJhbXMuc3ViX2dyb3VwID09PSAndXctYWl2Jykge1xuXHRcdFx0XHRcdFx0Ly8gdGhlc2UgdGVtcGxhdGVzIHJlcXVpcmUgYSB1c2VybmFtZVxuXHRcdFx0XHRcdFx0c3VtbWFyeSArPSBg77yIJHt3aW5kb3cud2dVTFMoJ+WvueS6jicsICflsI3mlrwnKX1bW1VzZXI6JHtwYXJhbXMuYXJ0aWNsZX1dXe+8iWA7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMuc3ViX2dyb3VwID09PSAndXctYml0ZScpIHtcblx0XHRcdFx0XHRcdC8vIHRoaXMgdGVtcGxhdGUgcmVxdWlyZXMgYSB1c2VybmFtZVxuXHRcdFx0XHRcdFx0c3VtbWFyeSArPSBg77yMJHt3aW5kb3cud2dVTFMoJ+S6jicsICfmlrwnKX1bW1VzZXIgdGFsazoke3BhcmFtcy5hcnRpY2xlfV1dYDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3VtbWFyeSArPSBgJHt3aW5kb3cud2dVTFMoJ++8jOS6jltbJywgJ++8jOaWvFtbJykgKyBwYXJhbXMuYXJ0aWNsZX1dXWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnkpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoV2FybmluZ3MnKSk7XG5cdFx0XHQvLyBHZXQgYWN0dWFsIHdhcm5pbmcgdGV4dFxuXHRcdFx0Y29uc3Qgd2FybmluZ1RleHQgPSBUd2lua2xlLndhcm4uY2FsbGJhY2tzLmdldFdhcm5pbmdXaWtpdGV4dChcblx0XHRcdFx0cGFyYW1zLnN1Yl9ncm91cCxcblx0XHRcdFx0cGFyYW1zLmFydGljbGUsXG5cdFx0XHRcdHBhcmFtcy5yZWFzb24sXG5cdFx0XHRcdHBhcmFtcy5tYWluX2dyb3VwID09PSAnY3VzdG9tJ1xuXHRcdFx0KTtcblx0XHRcdGxldCBzZWN0aW9uRXhpc3RzID0gZmFsc2U7XG5cdFx0XHRsZXQgc2VjdGlvbk51bWJlciA9IDA7XG5cdFx0XHQvLyBPbmx5IGNoZWNrIHNlY3Rpb25zIGlmIHRoZXJlIGFyZSBzZWN0aW9ucyBvciB0aGVyZSdzIGEgY2hhbmNlIHdlIHdvbid0IGNyZWF0ZSBvdXIgb3duXG5cdFx0XHRpZiAoIW1lc3NhZ2VEYXRhLmhlYWRpbmcgJiYgdGV4dC5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gR2V0IGFsbCBzZWN0aW9uc1xuXHRcdFx0XHRjb25zdCBzZWN0aW9ucyA9IHRleHQubWF0Y2goL14oPT0qKS4rXFwxL2dtKTtcblx0XHRcdFx0aWYgKHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0XHRcdC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBzZWN0aW9uIGhlYWRlciBpbiBxdWVzdGlvblxuXHRcdFx0XHRcdGNvbnN0IGRhdGVIZWFkZXJSZWdleCA9IG5vdy5tb250aEhlYWRlclJlZ2V4KCk7XG5cdFx0XHRcdFx0c2VjdGlvbk51bWJlciA9IDA7XG5cdFx0XHRcdFx0Ly8gRmluZCB0aGlzIG1vbnRoJ3Mgc2VjdGlvbiBhbW9uZyBMMiBzZWN0aW9ucywgcHJlZmVycmluZyB0aGUgYm90dG9tLW1vc3Rcblx0XHRcdFx0XHRzZWN0aW9uRXhpc3RzID0gc2VjdGlvbnMucmV2ZXJzZSgpLnNvbWUoKHNlYywgaWR4KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQvXig9PSlbXj1dLitcXDEvbS50ZXN0KHNlYykgJiZcblx0XHRcdFx0XHRcdFx0ZGF0ZUhlYWRlclJlZ2V4LnRlc3Qoc2VjKSAmJlxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgKHNlY3Rpb25OdW1iZXIgPSBzZWN0aW9ucy5sZW5ndGggLSAxIC0gaWR4KSA9PT0gJ251bWJlcidcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzZWN0aW9uRXhpc3RzKSB7XG5cdFx0XHRcdC8vIGFwcGVuZCB0byBleGlzdGluZyBzZWN0aW9uXG5cdFx0XHRcdHBhZ2VvYmouc2V0UGFnZVNlY3Rpb24oc2VjdGlvbk51bWJlciArIDEpO1xuXHRcdFx0XHRwYWdlb2JqLnNldEFwcGVuZFRleHQoYFxcblxcbiR7d2FybmluZ1RleHR9YCk7XG5cdFx0XHRcdHBhZ2VvYmouYXBwZW5kKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAobWVzc2FnZURhdGEuaGVhZGluZykge1xuXHRcdFx0XHRcdC8vIGNyZWF0ZSBuZXcgc2VjdGlvblxuXHRcdFx0XHRcdHBhZ2VvYmouc2V0TmV3U2VjdGlvblRpdGxlKG1lc3NhZ2VEYXRhLmhlYWRpbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+acquaJvuWIsOW9k+aciOeahOS6jOe6p+agh+mimO+8jOWwhuWIm+W7uuaWsOeahCcsICfmnKrmib7liLDnlbbmnIjnmoTkuozntJrmqJnpoYzvvIzlsIflu7rnq4vmlrDnmoQnKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cGFnZW9iai5zZXROZXdTZWN0aW9uVGl0bGUobm93Lm1vbnRoSGVhZGVyKDApKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYWdlb2JqLnNldE5ld1NlY3Rpb25UZXh0KHdhcm5pbmdUZXh0KTtcblx0XHRcdFx0cGFnZW9iai5uZXdTZWN0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS53YXJuLmNhbGxiYWNrLmV2YWx1YXRlID0gKGUpID0+IHtcblx0XHRjb25zdCB1c2VyVGFsa1BhZ2UgPSBgVXNlcl90YWxrOiR7cmVsZXZhbnRVc2VyTmFtZX1gO1xuXHRcdC8vIHJlYXNvbiwgbWFpbl9ncm91cCwgc3ViX2dyb3VwLCBhcnRpY2xlXG5cdFx0Y29uc3QgcGFyYW1zID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldElucHV0RGF0YShlLnRhcmdldCk7XG5cdFx0aWYgKHBhcmFtcy5hcnRpY2xlKSB7XG5cdFx0XHRpZiAoL2h0dHBzPzpcXC9cXC8vLnRlc3QocGFyYW1zLmFydGljbGUpKSB7XG5cdFx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+KAnOmhtemdoumTvuaOpeKAneS4jeiDveS9v+eUqOe9keWdgOOAgicsICfjgIzpoIHpnaLpgKPntZDjgI3kuI3og73kvb/nlKjntrLlnYDjgIInKSwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd3YXJuJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGFydGljbGUgPSBuZXcgbXcuVGl0bGUocGFyYW1zLmFydGljbGUpO1xuXHRcdFx0XHRwYXJhbXMuYXJ0aWNsZSA9IGFydGljbGUuZ2V0UHJlZml4ZWRUZXh0KCk7XG5cdFx0XHRcdGlmIChhcnRpY2xlLmdldEZyYWdtZW50KCkpIHtcblx0XHRcdFx0XHRwYXJhbXMuYXJ0aWNsZSArPSBgIyR7YXJ0aWNsZS5nZXRGcmFnbWVudCgpfWA7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRhbGVydChcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn4oCc6aG16Z2i6ZO+5o6l4oCd5LiN5ZCI5rOV77yM5LuF6IO96L6T5YWl5LiA5Liq6aG16Z2i5ZCN56ew77yM5Yu/5L2/55So572R5Z2A44CBW1sgXV3vvIzlj6/kvb/nlKhTcGVjaWFsOkRpZmbjgIInLFxuXHRcdFx0XHRcdFx0J+OAjOmggemdoumAo+e1kOOAjeS4jeWQiOazle+8jOWDheiDvei8uOWFpeS4gOWAi+mggemdouWQjeeose+8jOWLv+S9v+eUqOe2suWdgOOAgVtbIF1d77yM5Y+v5L2/55SoU3BlY2lhbDpEaWZm44CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBUaGUgYXV0b2xldmVsIG9wdGlvbiB3aWxsIGFscmVhZHkga25vdyBieSBub3cgaWYgYSB1c2VyIHRhbGsgcGFnZVxuXHRcdC8vIGlzIGEgY3Jvc3MtbmFtZXNwYWNlIHJlZGlyZWN0ICh2aWEgISFUd2lua2xlLndhcm4udGFsa3BhZ2VPYmopLCBzb1xuXHRcdC8vIHRlY2huaWNhbGx5IHdlIGNvdWxkIGFsZXJ0IGFuIGVycm9yIGhlcmUsIGJ1dCB0aGUgdXNlciB3aWxsIGhhdmVcblx0XHQvLyBhbHJlYWR5IGlnbm9yZWQgdGhlIGJvbGQgcmVkIGVycm9yIGFib3ZlLiBNb3Jlb3ZlciwgdGhleSBwcm9iYWJseVxuXHRcdC8vICpkb24ndCogd2FudCB0byBhY3R1YWxseSBpc3N1ZSBhIHdhcm5pbmcsIHNvIHRoZSBlcnJvciBoYW5kbGluZ1xuXHRcdC8vIGFmdGVyIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCBpcyBwcm9iYWJseSBwcmVmZXJhYmxlXG5cdFx0Ly8gRmluZCB0aGUgc2VsZWN0ZWQgPG9wdGlvbj4gZWxlbWVudCBzbyB3ZSBjYW4gZmV0Y2ggdGhlIGRhdGEgc3RydWN0dXJlXG5cdFx0Y29uc3QgJHNlbGVjdGVkRWwgPSAkKGUudGFyZ2V0LnN1Yl9ncm91cCkuZmluZChgb3B0aW9uW3ZhbHVlPVwiJHskKGUudGFyZ2V0LnN1Yl9ncm91cCkudmFsKCl9XCJdYCk7XG5cdFx0cGFyYW1zLm1lc3NhZ2VEYXRhID0gJHNlbGVjdGVkRWwuZGF0YSgnbWVzc2FnZURhdGEnKTtcblx0XHRpZiAocGFyYW1zLm1lc3NhZ2VEYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+mAieaLqeitpuWRiuaooeadv+OAgicsICfoq4vpgbjmk4forablkYrmqKHmnb/jgIInKSwge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3dhcm4nLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZS50YXJnZXQpO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gdXNlclRhbGtQYWdlO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn6K2m5ZGK5a6M5oiQ77yM5bCG5Zyo5Yeg56eS5ZCO5Yi35pawJywgJ+itpuWRiuWujOaIkO+8jOWwh+WcqOW5vuenkuW+jOmHjeaWsOaVtOeQhicpO1xuXHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHR1c2VyVGFsa1BhZ2UsXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+eUqOaIt+iuqOiuuumhteS/ruaUuScsICfkvb/nlKjogIXoqI7oq5bpoIHkv67mlLknKVxuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS53YXJuLmNhbGxiYWNrcy5tYWluKTtcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS53YXJuLCAnd2FybicpO1xufSkoalF1ZXJ5KTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBuby1qcXVlcnkvbm8tbWFwLXV0aWwgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQge2luaXRNd0FwaX0gZnJvbSAnZXh0LmdhZGdldC5VdGlsJztcblxuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlYmxvY2suanMgKi9cbihmdW5jdGlvbiB0d2lua2xlYmxvY2soJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0Y29uc3QgYXBpID0gaW5pdE13QXBpKCdtb3JlYml0cy5qczsgVHdpbmtsZS8xLjEnKTtcblx0bGV0IHJlbGV2YW50VXNlck5hbWU7XG5cdGxldCBibG9ja2VkVXNlck5hbWU7XG5cdGNvbnN0IG1lbnVGb3JtYXR0ZWROYW1lc3BhY2VzID0ge1xuXHRcdC4uLm13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpLFxuXHR9O1xuXHRtZW51Rm9ybWF0dGVkTmFtZXNwYWNlc1swXSA9IHdpbmRvdy53Z1VMUygn77yI5p2h55uu77yJJywgJ++8iOaineebru+8iScpO1xuXHRjb25zdCBibG9ja0FjdGlvblRleHQgPSB7XG5cdFx0YmxvY2s6IHdpbmRvdy53Z1VMUygn5bCB56aBJywgJ+WwgemOlicpLFxuXHRcdHJlYmxvY2s6IHdpbmRvdy53Z1VMUygn6YeN5paw5bCB56aBJywgJ+mHjeaWsOWwgemOlicpLFxuXHRcdHVuYmxvY2s6IHdpbmRvdy53Z1VMUygn6Kej6Zmk5bCB56aBJywgJ+ino+mZpOWwgemOlicpLFxuXHR9O1xuXHQvKipcblx0ICogdHdpbmtsZWJsb2NrLmpzOiBCbG9jayBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiQmxvY2tcIilcblx0ICogQWN0aXZlIG9uOiBBbnkgcGFnZSB3aXRoIHJlbGV2YW50IHVzZXIgbmFtZSAodXNlcnNwYWNlLCBjb250cmlicywgZXRjLilcblx0ICovXG5cdFR3aW5rbGUuYmxvY2sgPSAoKSA9PiB7XG5cdFx0cmVsZXZhbnRVc2VyTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpO1xuXHRcdC8vIHNob3VsZCBzaG93IG9uIENvbnRyaWJ1dGlvbnMgb3IgQmxvY2sgcGFnZXMsIGFueXdoZXJlIHRoZXJlJ3MgYSByZWxldmFudCB1c2VyXG5cdFx0Ly8gSWdub3JlIHJhbmdlcyB3aWRlciB0aGFuIHRoZSBDSURSIGxpbWl0XG5cdFx0Ly8gRW5hYmxlIGZvciBub24tYWRtaW5zXG5cdFx0aWYgKFxuXHRcdFx0KE1vcmViaXRzLnVzZXJJc1N5c29wIHx8ICFtdy51dGlsLmlzSVBBZGRyZXNzKHJlbGV2YW50VXNlck5hbWUsIHRydWUpKSAmJlxuXHRcdFx0cmVsZXZhbnRVc2VyTmFtZSAmJlxuXHRcdFx0KCFNb3JlYml0cy5pcC5pc1JhbmdlKHJlbGV2YW50VXNlck5hbWUpIHx8IE1vcmViaXRzLmlwLnZhbGlkQ0lEUihyZWxldmFudFVzZXJOYW1lKSlcblx0XHQpIHtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2ssXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCB56aBJywgJ+WwgemOlicpLFxuXHRcdFx0XHQndHctYmxvY2snLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WwgeemgeebuOWFs+eUqOaItycsICflsIHpjpbnm7jpl5zkvb/nlKjogIUnKVxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0cmVsZXZhbnRVc2VyTmFtZSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpICYmXG5cdFx0XHQhY29uZmlybShcblx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfmgqjljbPlsIblr7noh6rlt7HmiafooYzlsIHnpoHnm7jlhbPmk43kvZzvvIHnoa7orqTopoHnu6fnu63lkJfvvJ8nLFxuXHRcdFx0XHRcdCfmgqjljbPlsIflsI3oh6rlt7Hln7fooYzlsIHpjpbnm7jpl5zmk43kvZzvvIHnorroqo3opoHnubznuozll47vvJ8nXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0VHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvID0gdW5kZWZpbmVkO1xuXHRcdFR3aW5rbGUuYmxvY2suZmllbGRfYmxvY2tfb3B0aW9ucyA9IHt9O1xuXHRcdFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucyA9IHt9O1xuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjUwLCA1MzApO1xuXHRcdC8vIG5lZWQgdG8gYmUgdmVyYm9zZSBhYm91dCB3aG8gd2UncmUgYmxvY2tpbmdcblx0XHRXaW5kb3cuc2V0VGl0bGUoXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WwgeemgeaIluWQkScsICflsIHpjpbmiJblkJEnKSArIHJlbGV2YW50VXNlck5hbWUgKyB3aW5kb3cud2dVTFMoJ+WPkeWHuuWwgeemgeaooeadvycsICfnmbzlh7rlsIHpjpbmqKHmnb8nKVxuXHRcdCk7XG5cdFx0V2luZG93LnNldFNjcmlwdE5hbWUoJ1R3aW5rbGUnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+WwgeemgeadoeS+iycsICflsIHpjpbmop3kvosnKSwgJ0xJQjpCTE9DSycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5bCB56aB6K6+572uJywgJ+WwgemOluioreWumicpLCAnSDpUVy9QUkVGI2Jsb2NrJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2Jsb2NrJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS5ibG9jay5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Y29uc3QgYWN0aW9uZmllbGQgPSBmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pON5L2c57G75Z6LJywgJ+aTjeS9nOmhnuWIpScpLFxuXHRcdH0pO1xuXHRcdGFjdGlvbmZpZWxkLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0bmFtZTogJ2FjdGlvbnR5cGUnLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2FjdGlvbixcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwgeemgeeUqOaItycsICflsIHpjpbkvb/nlKjogIUnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ2Jsb2NrJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn55So6YCJ5oup55qE6YCJ6aG55YWo56uZ5bCB56aB55u45YWz55So5oi377yM6Iul5pyq5Yu+6YCJ6YOo5YiG5bCB56aB5YiZ5Li65YWo56uZ5bCB56aB44CCJyxcblx0XHRcdFx0XHRcdCfnlKjpgbjmk4fnmoTpgbjpoIXlhajnq5nlsIHpjpbnm7jpl5zkvb/nlKjogIXvvIzoi6XmnKrli77pgbjpg6jliIblsIHpjpbliYfngrrlhajnq5nlsIHpjpbjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRoaWRkZW46ICFNb3JlYml0cy51c2VySXNTeXNvcCxcblx0XHRcdFx0XHRjaGVja2VkOiBNb3JlYml0cy51c2VySXNTeXNvcCxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mDqOWIhuWwgeemgScsICfpg6jliIblsIHpjpYnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BhcnRpYWwnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5ZCv55So6YOo5YiG5bCB56aB5Y+K6YOo5YiG5bCB56aB5qih5p2/44CCJywgJ+WVn+eUqOmDqOWIhuWwgemOluWPiumDqOWIhuWwgemOluaooeadv+OAgicpLFxuXHRcdFx0XHRcdGhpZGRlbjogIU1vcmViaXRzLnVzZXJJc1N5c29wLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuZ2V0UHJlZignZGVmYXVsdFRvUGFydGlhbEJsb2NrcycpLCAvLyBPdmVycmlkZGVuIGlmIGFscmVhZHkgYmxvY2tlZFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5bCB56aB5qih5p2/5Yiw55So5oi36K6o6K666aG1JywgJ+WKoOWFpeWwgemOluaooeadv+WIsOS9v+eUqOiAheiojuirlumggScpLFxuXHRcdFx0XHRcdHZhbHVlOiAndGVtcGxhdGUnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfoi6XmiafooYzlsIHnpoHnmoTnrqHnkIblkZjlv5jorrDlj5Hlh7rlsIHnpoHmqKHmnb/vvIzmiJbkvaDlsIHnpoHkuobnlKjmiLfogIzmsqHmnInnu5nlhbblj5Hlh7rmqKHmnb/vvIzliJnkvaDlj6/ku6XnlKjmraTmnaXlj5Hlh7rlkIjpgILnmoTmqKHmnb/jgILli77pgInpg6jliIblsIHnpoHku6Xkvb/nlKjpg6jliIblsIHnpoHmqKHmnb/jgIInLFxuXHRcdFx0XHRcdFx0J+iLpeWft+ihjOWwgemOlueahOeuoeeQhuWToeW/mOiomOeZvOWHuuWwgemOluaooeadv++8jOaIluS9oOWwgemOluS6huS9v+eUqOiAheiAjOaykuaciee1puWFtueZvOWHuuaooeadv++8jOWJh+S9oOWPr+S7peeUqOatpOS+hueZvOWHuuWQiOmBqeeahOaooeadv+OAguWLvumBuOmDqOWIhuWwgemOluS7peS9v+eUqOmDqOWIhuWwgemOluaooeadv+OAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdC8vIERpc2FsbG93IHdoZW4gdmlld2luZyB0aGUgYmxvY2sgZGlhbG9nIG9uIGFuIElQIHJhbmdlXG5cdFx0XHRcdFx0aGlkZGVuOiAhTW9yZWJpdHMudXNlcklzU3lzb3AsXG5cdFx0XHRcdFx0Y2hlY2tlZDogTW9yZWJpdHMudXNlcklzU3lzb3AgJiYgIU1vcmViaXRzLmlwLmlzUmFuZ2UocmVsZXZhbnRVc2VyTmFtZSksXG5cdFx0XHRcdFx0ZGlzYWJsZWQ6IE1vcmViaXRzLmlwLmlzUmFuZ2UocmVsZXZhbnRVc2VyTmFtZSksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDnlKjmiLfpobUnLCAn5qiZ6KiY5L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd0YWcnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflsIbnlKjmiLfpobXmm7/mjaLmiJDnm7jlhbPnmoTmoIforrDmqKHmnb/vvIzku4XpmZDmsLjkuYXlsIHnpoHkvb/nlKjjgIInLFxuXHRcdFx0XHRcdFx0J+Wwh+S9v+eUqOiAhemggemdouabv+aPm+aIkOebuOmXnOeahOaomeiomOaooeadv++8jOWDhemZkOawuOS5heWwgemOluS9v+eUqOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGhpZGRlbjogdHJ1ZSxcblx0XHRcdFx0XHRjaGVja2VkOiAhTW9yZWJpdHMudXNlcklzU3lzb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkv53miqTnlKjmiLfpobUnLCAn5L+d6K235L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcm90ZWN0Jyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WFqOS/neaKpOeUqOaIt+mhte+8jOS7hemZkOawuOS5heWwgeemgeS9v+eUqOOAgicsICflhajkv53orbfkvb/nlKjogIXpoIHpnaLvvIzlg4XpmZDmsLjkuYXlsIHpjpbkvb/nlKjjgIInKSxcblx0XHRcdFx0XHRoaWRkZW46IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfop6PpmaTlsIHnpoHnlKjmiLcnLCAn6Kej6Zmk5bCB6Y6W5L2/55So6ICFJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1bmJsb2NrJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+ino+mZpOWwgeemgeebuOWFs+eUqOaIt+OAgicsICfop6PpmaTlsIHpjpbnm7jpl5zkvb/nlKjogIXjgIInKSxcblx0XHRcdFx0XHRoaWRkZW46ICFNb3JlYml0cy51c2VySXNTeXNvcCxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0LyoqXG5cdFx0ICogQWRkIG9wdGlvbiBmb3IgSVB2NiByYW5nZXMgc21hbGxlciB0aGFuIC82NCB0byB1cGdyYWRlIHRvIHRoZSA2NFxuXHRcdCAqIENJRFIuIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdoZXJlIHdlIHdhbnRcblx0XHQgKiB3Z1JlbGV2YW50VXNlck5hbWUgc2luY2UgdGhpcyBkZXBlbmRzIGVudGlyZWx5IG9uIHRoZSBvcmlnaW5hbCB1c2VyLlxuXHRcdCAqIEluIHRoZW9yeSwgd2Ugc2hvdWxkbid0IHVzZSBNb3JlYml0cy5pcC5nZXQ2NCBoZXJlIHNpbmNlIHNpbmNlIHdlIHdhbnRcblx0XHQgKiB0byBleGNsdWRlIGZ1bmN0aW9uYWxseS1lcXVpdmFsZW50IC82NHMuICBUaGF0J2QgYmU6XG5cdFx0ICogLy8gaWYgKG13LnV0aWwuaXNJUHY2QWRkcmVzcyhtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSwgdHJ1ZSkgJiZcblx0XHQgKiAvLyAobXcudXRpbC5pc0lQdjZBZGRyZXNzKG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpKSB8fCBwYXJzZUludChtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKS5yZXBsYWNlKC9eKC4rPylcXC8/KFxcZHsxLDN9KT8kLywgJyQyJyksIDEwKSA+IDY0KSkge1xuXHRcdCAqIEluIHByYWN0aWNlLCB0aG91Z2gsIHNpbmNlIGZ1bmN0aW9uYWxseS1lcXVpdmFsZW50IHJhbmdlcyBhcmVcblx0XHQgKiAobWlzKXRyZWF0ZWQgYXMgc2VwYXJhdGUgYnkgTWVkaWFXaWtpJ3MgbG9nZ2luZyxcblx0XHQgKiB1c2luZyBNb3JlYml0cy5pcC5nZXQ2NCBwcm92aWRlcyBhIG1vZGljdW0gb2YgcmVsaWVmIGluIHRoaXNlIGNhc2UuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc2l4dHlGb3VyID0gTW9yZWJpdHMuaXAuZ2V0NjQobXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJykpO1xuXHRcdGlmIChzaXh0eUZvdXIgJiYgc2l4dHlGb3VyICE9PSBtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSkge1xuXHRcdFx0Y29uc3QgYmxvY2s2NGZpZWxkID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfovazmjaLkuLovNjTmrrXlsIHnpoEnLCAn6L2J5o+b54K6LzY05q615bCB6Y6WJyksXG5cdFx0XHRcdG5hbWU6ICdmaWVsZF82NCcsXG5cdFx0XHR9KTtcblx0XHRcdGJsb2NrNjRmaWVsZC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0c3R5bGU6ICdtYXJnaW4tYm90dG9tOiAwLjVlbScsXG5cdFx0XHRcdGxhYmVsOiBbd2dVTFMoJ+ebtOaOpeWwgeemgS82NOauteacieebiuaXoOWus+OAgicsICfnm7TmjqXlsIHpjpYvNjTmrrXmnInnm4rnhKHlrrPjgIInKV0sXG5cdFx0XHR9KTtcblx0XHRcdGJsb2NrNjRmaWVsZC5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRuYW1lOiAnYmxvY2s2NCcsXG5cdFx0XHRcdGV2ZW50OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV9ibG9jazY0LFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdkZWZhdWx0VG9CbG9jazY0JyksXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlLnmiJDlsIHnpoEvNjQnLCAn5pS55oiQ5bCB6Y6WLzY0JyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ2Jsb2NrNjQnLFxuXHRcdFx0XHRcdFx0dG9vbHRpcDogTW9yZWJpdHMuaXAuaXNSYW5nZShtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSlcblx0XHRcdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoJ+WwhuS4jeS8muWPkemAgeaooeadv+mAmuefpeOAgicsICflsIfkuI3mnIPnmbzpgIHmqKHmnb/pgJrnn6XjgIInKVxuXHRcdFx0XHRcdFx0XHQ6IHdpbmRvdy53Z1VMUygn5Lu75L2V5qih5p2/5bCG5Lya5Y+R6YCB57uZ5Y6f5aeLSVDvvJonLCAn5Lu75L2V5qih5p2/5bCH5pyD55m86YCB57Wm5Y6f5aeLSVDvvJonKSArXG5cdFx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6kJywgJ+mgkOiorScpLFxuXHRcdFx0bmFtZTogJ2ZpZWxkX3ByZXNldCcsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aooeadv+mAiemhuScsICfmqKHmnb/pgbjpoIUnKSxcblx0XHRcdG5hbWU6ICdmaWVsZF90ZW1wbGF0ZV9vcHRpb25zJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCJ6aG5JywgJ+WwgemOlumBuOmghScpLFxuXHRcdFx0bmFtZTogJ2ZpZWxkX2Jsb2NrX29wdGlvbnMnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDnlKjmiLfpobUnLCAn5qiZ6KiY5L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRuYW1lOiAnZmllbGRfdGFnX29wdGlvbnMnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfop6PpmaTlsIHnpoHpgInpobknLCAn6Kej6Zmk5bCB6Y6W6YG46aCFJyksXG5cdFx0XHRuYW1lOiAnZmllbGRfdW5ibG9ja19vcHRpb25zJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHRcdGxhYmVsOiAn5o+Q5LqkJyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0XHRyZXN1bHQucm9vdCA9IHJlc3VsdDtcblx0XHRUd2lua2xlLmJsb2NrLmZldGNoVXNlckluZm8oKCkgPT4ge1xuXHRcdFx0aWYgKFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkKSB7XG5cdFx0XHRcdGNvbnN0ICRmb3JtID0gJChyZXN1bHQpO1xuXHRcdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9dGFnXScpLnBhcmVudCgpLCB0cnVlKTtcblx0XHRcdFx0aWYgKE1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KFxuXHRcdFx0XHRcdFx0JGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cHJvdGVjdF0nKS5wYXJlbnQoKSxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBUb2dnbGUgaW5pdGlhbCBwYXJ0aWFsIHN0YXRlIGRlcGVuZGluZyBvbiBwcmlvciBibG9jayB0eXBlLFxuXHRcdFx0Ly8gd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdFRvUGFydGlhbEJsb2NrcyBwcmVmXG5cdFx0XHRpZiAoYmxvY2tlZFVzZXJOYW1lID09PSByZWxldmFudFVzZXJOYW1lKSB7XG5cdFx0XHRcdCQocmVzdWx0KVxuXHRcdFx0XHRcdC5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1wYXJ0aWFsXScpXG5cdFx0XHRcdFx0LnByb3AoJ2NoZWNrZWQnLCBUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8ucGFydGlhbCA9PT0gJycpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gY2xlYW4gdXAgcHJlc2V0IGRhdGEgKGRlZmF1bHRzLCBldGMuKSwgZG9uZSBleGFjdGx5IG9uY2UsIG11c3QgYmUgYmVmb3JlIFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2FjdGlvbiBpcyBjYWxsZWRcblx0XHRcdFR3aW5rbGUuYmxvY2sudHJhbnNmb3JtQmxvY2tQcmVzZXRzKCk7XG5cdFx0XHQvLyBpbml0IHRoZSBjb250cm9scyBhZnRlciB1c2VyIGFuZCBibG9jayBpbmZvIGhhdmUgYmVlbiBmZXRjaGVkXG5cdFx0XHRjb25zdCBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRcdGV2dC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdFx0aWYgKHJlc3VsdC5ibG9jazY0ICYmIHJlc3VsdC5ibG9jazY0LmNoZWNrZWQpIHtcblx0XHRcdFx0Ly8gQ2FsbHMgdGhlIHNhbWUgY2hhbmdlX2FjdGlvbiBldmVudCBvbmNlIGZpbmlzaGVkXG5cdFx0XHRcdHJlc3VsdC5ibG9jazY0LmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5hY3Rpb250eXBlWzBdLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblx0Ly8gU3RvcmUgZmV0Y2hlZCB1c2VyIGRhdGEsIG9ubHkgcmVsZXZhbnQgaWYgc3dpdGNoaW5nIElQdjYgdG8gYSAvNjRcblx0VHdpbmtsZS5ibG9jay5mZXRjaGVkRGF0YSA9IHt9O1xuXHQvLyBQcm9jZXNzZXMgdGhlIGRhdGEgZnJvbSBhIGEgcXVlcnkgcmVzcG9uc2UsIHNlcGFyYXRlZCBmcm9tXG5cdC8vIFR3aW5rbGUuYmxvY2suZmV0Y2hVc2VySW5mbyB0byBhbGxvdyByZXByb2Nlc3Npbmcgb2YgYWxyZWFkeS1mZXRjaGVkIGRhdGFcblx0VHdpbmtsZS5ibG9jay5wcm9jZXNzVXNlckluZm8gPSAoZGF0YSwgZm4pID0+IHtcblx0XHRsZXQgW2Jsb2NraW5mb10gPSBkYXRhLnF1ZXJ5LmJsb2Nrcztcblx0XHRjb25zdCBbdXNlcmluZm9dID0gZGF0YS5xdWVyeS51c2Vycztcblx0XHQvLyBJZiBhbiBJUCBpcyBibG9ja2VkICphbmQqIHJhbmdlYmxvY2tlZCwgdGhlIGFib3ZlIGZpbmRzXG5cdFx0Ly8gd2hpY2hldmVyIGJsb2NrIGlzIG1vcmUgcmVjZW50LCBub3QgbmVjZXNzYXJpbHkgY29ycmVjdC5cblx0XHQvLyBUaHJlZSBzZWVtcy4uLiB1bmxpa2VseVxuXHRcdGlmIChkYXRhLnF1ZXJ5LmJsb2Nrcy5sZW5ndGggPiAxICYmIGJsb2NraW5mby51c2VyICE9PSByZWxldmFudFVzZXJOYW1lKSB7XG5cdFx0XHRbLCBibG9ja2luZm9dID0gZGF0YS5xdWVyeS5ibG9ja3M7XG5cdFx0fVxuXHRcdC8vIENhY2hlIHJlc3BvbnNlLCB1c2VkIHdoZW4gdG9nZ2xpbmcgLzY0IGJsb2Nrc1xuXHRcdFR3aW5rbGUuYmxvY2suZmV0Y2hlZERhdGFbdXNlcmluZm8ubmFtZV0gPSBkYXRhO1xuXHRcdFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkID0gISF1c2VyaW5mby51c2VyaWQ7XG5cdFx0aWYgKFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkKSB7XG5cdFx0XHRUd2lua2xlLmJsb2NrLnVzZXJJc0JvdCA9XG5cdFx0XHRcdCEhdXNlcmluZm8uZ3JvdXBtZW1iZXJzaGlwcyAmJlxuXHRcdFx0XHR1c2VyaW5mby5ncm91cG1lbWJlcnNoaXBzXG5cdFx0XHRcdFx0Lm1hcCgoZSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGUuZ3JvdXA7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuaW5jbHVkZXMoJ2JvdCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2lua2xlLmJsb2NrLnVzZXJJc0JvdCA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoYmxvY2tpbmZvKSB7XG5cdFx0XHQvLyBoYW5kbGUgZnJ1c3RyYXRpbmcgc3lzdGVtIG9mIGludmVydGVkIGJvb2xlYW4gdmFsdWVzXG5cdFx0XHRibG9ja2luZm8uZGlzYWJsZXRhbGsgPSBibG9ja2luZm8uYWxsb3d1c2VydGFsayA9PT0gdW5kZWZpbmVkO1xuXHRcdFx0YmxvY2tpbmZvLmhhcmRibG9jayA9IGJsb2NraW5mby5hbm9ub25seSA9PT0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHQvLyB3aWxsIHVuZGVmaW5lIGlmIG5vIGJsb2NrcyBwcmVzZW50XG5cdFx0VHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvID0gYmxvY2tpbmZvO1xuXHRcdGJsb2NrZWRVc2VyTmFtZSA9IFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbyAmJiBUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8udXNlcjtcblx0XHQvLyBTZW1pLWJ1c3RlZCBvbiByYW5nZXMuXG5cdFx0Ly8gQmFzaWNhbGx5LCBsb2dldmVudHMgZG9lc24ndCB0cmVhdCBmdW5jdGlvbmFsbHktZXF1aXZhbGVudCByYW5nZXNcblx0XHQvLyBhcyBlcXVpdmFsZW50LCBtZWFuaW5nIGFueSBmdW5jdGlvbmFsbHktZXF1aXZhbGVudCBJUCByYW5nZSBpc1xuXHRcdC8vIG1pc2ludGVycHJldGVkIGJ5IHRoZSBsb2cgdGhyb3VnaG91dC4gIFdpdGhvdXQgbG9nZXZlbnRzXG5cdFx0Ly8gcmVkaXJlY3RpbmcgKGxpa2UgU3BlY2lhbDpCbG9jayBkb2VzKSB3ZSB3b3VsZCBuZWVkIGEgZnVuY3Rpb24gdG9cblx0XHQvLyBwYXJzZSByYW5nZXMsIHdoaWNoIGlzIGEgcGFpbi4gIElQVXRpbHMgaGFzIHRoZSBjb2RlLCBidXQgaXQnZCBiZSBhXG5cdFx0Ly8gbG90IG9mIGNydWZ0IGZvciBvbmUgcHVycG9zZS5cblx0XHRUd2lua2xlLmJsb2NrLmhhc0Jsb2NrTG9nID0gISFkYXRhLnF1ZXJ5LmxvZ2V2ZW50cy5sZW5ndGg7XG5cdFx0VHdpbmtsZS5ibG9jay5ibG9ja0xvZyA9IFR3aW5rbGUuYmxvY2suaGFzQmxvY2tMb2cgJiYgZGF0YS5xdWVyeS5sb2dldmVudHM7XG5cdFx0Ly8gVXNlZCBsYXRlciB0byBjaGVjayBpZiBibG9jayBzdGF0dXMgY2hhbmdlZCB3aGlsZSBmaWxsaW5nIG91dCB0aGUgZm9ybVxuXHRcdFR3aW5rbGUuYmxvY2suYmxvY2tMb2dJZCA9IFR3aW5rbGUuYmxvY2suaGFzQmxvY2tMb2cgPyBkYXRhLnF1ZXJ5LmxvZ2V2ZW50c1swXS5sb2dpZCA6IGZhbHNlO1xuXHRcdGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiBmbigpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5mZXRjaFVzZXJJbmZvID0gKGZuKSA9PiB7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdGxpc3Q6ICdibG9ja3N8dXNlcnN8bG9nZXZlbnRzJyxcblx0XHRcdGxldHlwZTogJ2Jsb2NrJyxcblx0XHRcdGxlbGltaXQ6IDIsXG5cdFx0XHRsZXRpdGxlOiBgVXNlcjoke3JlbGV2YW50VXNlck5hbWV9YCxcblx0XHRcdGJrcHJvcDogJ2V4cGlyeXxyZWFzb258ZmxhZ3N8cmVzdHJpY3Rpb25zfHJhbmdlfHVzZXInLFxuXHRcdFx0dXN1c2VyczogcmVsZXZhbnRVc2VyTmFtZSxcblx0XHR9O1xuXHRcdC8vIGJrdXNlcnMgZG9lc24ndCBjYXRjaCBzaW5nbGUgSVBzIGJsb2NrZWQgYXMgcGFydCBvZiBhIHJhbmdlIGJsb2NrXG5cdFx0aWYgKG13LnV0aWwuaXNJUEFkZHJlc3MocmVsZXZhbnRVc2VyTmFtZSwgdHJ1ZSkpIHtcblx0XHRcdHF1ZXJ5LmJraXAgPSByZWxldmFudFVzZXJOYW1lO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRxdWVyeS5ia3VzZXJzID0gcmVsZXZhbnRVc2VyTmFtZTtcblx0XHRcdC8vIGdyb3VwbWVtYmVyc2hpcHMgb25seSByZWxldmFudCBmb3IgcmVnaXN0ZXJlZCB1c2Vyc1xuXHRcdFx0cXVlcnkudXNwcm9wID0gJ2dyb3VwbWVtYmVyc2hpcHMnO1xuXHRcdH1cblx0XHRhcGkuZ2V0KHF1ZXJ5KS50aGVuKFxuXHRcdFx0KGRhdGEpID0+IHtcblx0XHRcdFx0VHdpbmtsZS5ibG9jay5wcm9jZXNzVXNlckluZm8oZGF0YSwgZm4pO1xuXHRcdFx0fSxcblx0XHRcdChlcnJvcikgPT4ge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdCgkYm9keS5maW5kKCdkaXZbbmFtZT1cImN1cnJlbnRibG9ja1wiXSBzcGFuJykubGFzdCgpWzBdKTtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4od2luZG93LndnVUxTKCfmipPlj5bnlKjmiLfkv6Hmga/lh7rplJknLCAn5oqT5Y+W5L2/55So6ICF6LOH6KiK5Ye66YyvJyksIGVycm9yKTtcblx0XHRcdH1cblx0XHQpO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnNhdmVGaWVsZHNldCA9IChmaWVsZHNldCkgPT4ge1xuXHRcdFR3aW5rbGUuYmxvY2tbJChmaWVsZHNldCkucHJvcCgnbmFtZScpXSA9IHt9O1xuXHRcdGZvciAoY29uc3QgZWwgb2YgJChmaWVsZHNldCkuc2VyaWFsaXplQXJyYXkoKSkge1xuXHRcdFx0Ly8gbmFtZXNwYWNlcyBhbmQgcGFnZXMgZm9yIHBhcnRpYWwgYmxvY2tzIGFyZSBvdmVyd3JpdHRlblxuXHRcdFx0Ly8gaGVyZSwgYnV0IHdlJ3JlIGhhbmRsaW5nIHRoZW0gZWxzZXdoZXJlIHNvIHRoYXQncyBmaW5lXG5cdFx0XHRUd2lua2xlLmJsb2NrWyQoZmllbGRzZXQpLnByb3AoJ25hbWUnKV1bZWwubmFtZV0gPSBlbC52YWx1ZTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2Jsb2NrNjQgPSAoZSkgPT4ge1xuXHRcdGNvbnN0ICRmb3JtID0gJChlLnRhcmdldC5mb3JtKTtcblx0XHRjb25zdCAkYmxvY2s2NCA9ICRmb3JtLmZpbmQoJ1tuYW1lPWJsb2NrNjRdJyk7XG5cdFx0Ly8gU2hvdy9oaWRlIGJsb2NrNjQgYnV0dG9uXG5cdFx0Ly8gU2luZ2xlIElQdjYsIG9yIElQdjYgcmFuZ2Ugc21hbGxlciB0aGFuIGEgLzY0XG5cdFx0Y29uc3QgcHJpb3JOYW1lID0gcmVsZXZhbnRVc2VyTmFtZTtcblx0XHRpZiAoJGJsb2NrNjQuaXMoJzpjaGVja2VkJykpIHtcblx0XHRcdHJlbGV2YW50VXNlck5hbWUgPSBNb3JlYml0cy5pcC5nZXQ2NChtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbGV2YW50VXNlck5hbWUgPSBtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKTtcblx0XHR9XG5cdFx0Ly8gTm8gdGVtcGxhdGVzIGZvciByYW5nZXMsIGJ1dCBpZiB0aGUgb3JpZ2luYWwgdXNlciBpcyBhIHNpbmdsZSBJUCwgb2ZmZXIgdGhlIG9wdGlvblxuXHRcdC8vIChkb25lIHNlcGFyYXRlbHkgaW4gVHdpbmtsZS5ibG9jay5jYWxsYmFjay5pc3N1ZV90ZW1wbGF0ZSlcblx0XHRjb25zdCBvcmlnaW5hbElzUmFuZ2UgPSBNb3JlYml0cy5pcC5pc1JhbmdlKG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpKTtcblx0XHQkZm9ybVxuXHRcdFx0LmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXRlbXBsYXRlXScpXG5cdFx0XHQucHJvcCgnZGlzYWJsZWQnLCBvcmlnaW5hbElzUmFuZ2UpXG5cdFx0XHQucHJvcCgnY2hlY2tlZCcsICFvcmlnaW5hbElzUmFuZ2UpO1xuXHRcdC8vIFJlZmV0Y2gvcmVwcm9jZXNzIHVzZXIgaW5mbyB0aGVuIHJlZ2VuZXJhdGUgdGhlIG1haW4gY29udGVudFxuXHRcdGNvbnN0IHJlZ2VuZXJhdGVGb3JtID0gKCkgPT4ge1xuXHRcdFx0Ly8gVHdlYWsgdGl0bGViYXIgdGV4dC4gIEluIHRoZW9yeSwgd2UgY291bGQgc2F2ZSB0aGUgZGlhbG9nXG5cdFx0XHQvLyBhdCBpbml0aWFsaXphdGlvbiBhbmQgdGhlbiB1c2UgYC5zZXRUaXRsZWAgb3Jcblx0XHRcdC8vIGBkaWFsb2coJ29wdGlvbicsICd0aXRsZScpYCwgYnV0IGluIHByYWN0aWNlIHRoYXQgc3dhbGxvd3Ncblx0XHRcdC8vIHRoZSBzY3JpcHROYW1lIGFuZCByZXF1aXJlcyBgLmRpc3BsYXlgaW5nLCB3aGljaCBqdW1wcyB0aGVcblx0XHRcdC8vIHdpbmRvdy4gIEl0J3MganVzdCBhIGxpbmUgb2YgdGV4dCwgc28gdGhpcyBpcyBmaW5lLlxuXHRcdFx0Y29uc3QgdGl0bGVCYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudWktZGlhbG9nLXRpdGxlJykuZmlyc3RDaGlsZC5uZXh0U2libGluZztcblx0XHRcdHRpdGxlQmFyLm5vZGVWYWx1ZSA9IHRpdGxlQmFyLm5vZGVWYWx1ZS5yZXBsYWNlKHByaW9yTmFtZSwgcmVsZXZhbnRVc2VyTmFtZSk7XG5cdFx0XHQvLyBDb3JyZWN0IHBhcnRpYWwgc3RhdGVcblx0XHRcdCRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXBhcnRpYWxdJykucHJvcCgnY2hlY2tlZCcsIFR3aW5rbGUuZ2V0UHJlZignZGVmYXVsdFRvUGFydGlhbEJsb2NrcycpKTtcblx0XHRcdGlmIChibG9ja2VkVXNlck5hbWUgPT09IHJlbGV2YW50VXNlck5hbWUpIHtcblx0XHRcdFx0JGZvcm1cblx0XHRcdFx0XHQuZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cGFydGlhbF0nKVxuXHRcdFx0XHRcdC5wcm9wKCdjaGVja2VkJywgVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLnBhcnRpYWwgPT09ICcnKTtcblx0XHRcdH1cblx0XHRcdC8vIFNldCBjb250ZW50IGFwcHJvcHJpYXRlbHlcblx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2FjdGlvbihlKTtcblx0XHR9O1xuXHRcdGlmIChUd2lua2xlLmJsb2NrLmZldGNoZWREYXRhW3JlbGV2YW50VXNlck5hbWVdKSB7XG5cdFx0XHRUd2lua2xlLmJsb2NrLnByb2Nlc3NVc2VySW5mbyhUd2lua2xlLmJsb2NrLmZldGNoZWREYXRhW3JlbGV2YW50VXNlck5hbWVdLCByZWdlbmVyYXRlRm9ybSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3aW5rbGUuYmxvY2suZmV0Y2hVc2VySW5mbyhyZWdlbmVyYXRlRm9ybSk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV9hY3Rpb24gPSAoZSkgPT4ge1xuXHRcdGxldCBmaWVsZF9wcmVzZXQ7XG5cdFx0bGV0IGZpZWxkX3RlbXBsYXRlX29wdGlvbnM7XG5cdFx0bGV0IGZpZWxkX2Jsb2NrX29wdGlvbnM7XG5cdFx0bGV0IGZpZWxkX3RhZ19vcHRpb25zO1xuXHRcdGxldCBmaWVsZF91bmJsb2NrX29wdGlvbnM7XG5cdFx0Y29uc3QgJGZvcm0gPSAkKGUudGFyZ2V0LmZvcm0pO1xuXHRcdC8vIE1ha2UgaWZzIHNob3J0ZXJcblx0XHRjb25zdCAkYmxvY2sgPSAkZm9ybS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1ibG9ja10nKTtcblx0XHRsZXQgYmxvY2tCb3ggPSAkYmxvY2suaXMoJzpjaGVja2VkJyk7XG5cdFx0Y29uc3QgJHRlbXBsYXRlID0gJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9dGVtcGxhdGVdJyk7XG5cdFx0bGV0IHRlbXBsYXRlQm94ID0gJHRlbXBsYXRlLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGNvbnN0ICR0YWcgPSAkZm9ybS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT10YWddJyk7XG5cdFx0Y29uc3QgdGFnQm94ID0gJHRhZy5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCAkcHJvdGVjdCA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXByb3RlY3RdJyk7XG5cdFx0Y29uc3QgJHBhcnRpYWwgPSAkZm9ybS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1wYXJ0aWFsXScpO1xuXHRcdGNvbnN0IHBhcnRpYWxCb3ggPSAkcGFydGlhbC5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCAkdW5ibG9jayA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXVuYmxvY2tdJyk7XG5cdFx0Y29uc3QgdW5ibG9ja0JveCA9ICR1bmJsb2NrLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGxldCBibG9ja0dyb3VwID0gcGFydGlhbEJveCA/IFR3aW5rbGUuYmxvY2suYmxvY2tHcm91cHNQYXJ0aWFsIDogVHdpbmtsZS5ibG9jay5ibG9ja0dyb3Vwcztcblx0XHRpZiAoZS50YXJnZXQudmFsdWUgPT09ICd1bmJsb2NrJykge1xuXHRcdFx0aWYgKCFUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8pIHtcblx0XHRcdFx0JHVuYmxvY2sucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn55So5oi35rKh5pyJ6KKr5bCB56aBJywgJ+S9v+eUqOiAheaykuacieiiq+WwgemOlicpLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVibG9jaycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQkYmxvY2sucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHRcdGJsb2NrQm94ID0gZmFsc2U7XG5cdFx0XHQkdGVtcGxhdGUucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHRcdHRlbXBsYXRlQm94ID0gZmFsc2U7XG5cdFx0XHQkdGFnLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHQkcHJvdGVjdC5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuXHRcdFx0JHBhcnRpYWwucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JHVuYmxvY2sucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHR9XG5cdFx0JHBhcnRpYWwucHJvcCgnZGlzYWJsZWQnLCAhYmxvY2tCb3ggJiYgIXRlbXBsYXRlQm94KTtcblx0XHQvLyBBZGQgY3VycmVudCBibG9jayBwYXJhbWV0ZXJzIGFzIGRlZmF1bHQgcHJlc2V0XG5cdFx0Y29uc3QgcHJpb3IgPSB7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflvZPliY3lsIHnpoEnLCAn55uu5YmN5bCB6Y6WJyksXG5cdFx0fTtcblx0XHRpZiAoYmxvY2tlZFVzZXJOYW1lID09PSByZWxldmFudFVzZXJOYW1lKSB7XG5cdFx0XHRUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm8ucHJpb3IgPSBUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm87XG5cdFx0XHQvLyB2YWx1ZSBub3QgYSB2YWxpZCB0ZW1wbGF0ZSBzZWxlY3Rpb24sIGNob3NlbiBiZWxvdyBieSBzZXR0aW5nIHRlbXBsYXRlTmFtZVxuXHRcdFx0cHJpb3IubGlzdCA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W9k+WJjeWwgeemgeiuvue9ricsICfnm67liY3lsIHpjpboqK3lrponKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3ByaW9yJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF07XG5cdFx0XHQvLyBBcnJheXMgb2Ygb2JqZWN0cyBhcmUgYW5ub3lpbmcgdG8gY2hlY2tcblx0XHRcdGlmIChcblx0XHRcdFx0IWJsb2NrR3JvdXAuc29tZSgoYmcpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gYmcubGFiZWwgPT09IHByaW9yLmxhYmVsO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGJsb2NrR3JvdXAucHVzaChwcmlvcik7XG5cdFx0XHR9XG5cdFx0XHQvLyBBbHdheXMgZW5zdXJlIHByb3BlciB0ZW1wbGF0ZSBleGlzdHMvaXMgc2VsZWN0ZWQgd2hlbiBzd2l0Y2hpbmcgbW9kZXNcblx0XHRcdGlmIChwYXJ0aWFsQm94KSB7XG5cdFx0XHRcdFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mby5wcmlvci50ZW1wbGF0ZU5hbWUgPSBNb3JlYml0cy5zdHJpbmcuaXNJbmZpbml0eShcblx0XHRcdFx0XHRUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8uZXhwaXJ5XG5cdFx0XHRcdClcblx0XHRcdFx0XHQ/ICd1dy1wYmxvY2tpbmRlZidcblx0XHRcdFx0XHQ6ICd1dy1wYmxvY2snO1xuXHRcdFx0fSBlbHNlIGlmIChUd2lua2xlLmJsb2NrLmlzUmVnaXN0ZXJlZCkge1xuXHRcdFx0XHRUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm8ucHJpb3IudGVtcGxhdGVOYW1lID0gTW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkoXG5cdFx0XHRcdFx0VHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLmV4cGlyeVxuXHRcdFx0XHQpXG5cdFx0XHRcdFx0PyAndXctYmxvY2tpbmRlZidcblx0XHRcdFx0XHQ6ICd1dy1ibG9jayc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm8ucHJpb3IudGVtcGxhdGVOYW1lID0gJ3V3LWFibG9jayc7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEJ1dCBmaXJzdCByZW1vdmUgYW55IHByaW9yIHByaW9yXG5cdFx0XHRibG9ja0dyb3VwID0gYmxvY2tHcm91cC5maWx0ZXIoKGJnKSA9PiB7XG5cdFx0XHRcdHJldHVybiBiZy5sYWJlbCAhPT0gcHJpb3IubGFiZWw7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5zYXZlRmllbGRzZXQoJGJvZHkuZmluZCgnW25hbWU9ZmllbGRfYmxvY2tfb3B0aW9uc10nKSk7XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5zYXZlRmllbGRzZXQoJGJvZHkuZmluZCgnW25hbWU9ZmllbGRfdGVtcGxhdGVfb3B0aW9uc10nKSk7XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5zYXZlRmllbGRzZXQoJGJvZHkuZmluZCgnW25hbWU9ZmllbGRfdGFnX29wdGlvbnNdJykpO1xuXHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suc2F2ZUZpZWxkc2V0KCRib2R5LmZpbmQoJ1tuYW1lPWZpZWxkX3VuYmxvY2tfb3B0aW9uc10nKSk7XG5cdFx0aWYgKGJsb2NrQm94KSB7XG5cdFx0XHRmaWVsZF9wcmVzZXQgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqQnLCAn6aCQ6KitJyksXG5cdFx0XHRcdG5hbWU6ICdmaWVsZF9wcmVzZXQnLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9wcmVzZXQuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdG5hbWU6ICdwcmVzZXQnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgInmi6npu5jorqTvvJonLCAn6YG45pOH6aCQ6Kit77yaJyksXG5cdFx0XHRcdGV2ZW50OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV9wcmVzZXQsXG5cdFx0XHRcdGxpc3Q6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2suZmlsdGVyZWRfYmxvY2tfZ3JvdXBzKGJsb2NrR3JvdXApLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCJ6aG5JywgJ+WwgemOlumBuOmghScpLFxuXHRcdFx0XHRuYW1lOiAnZmllbGRfYmxvY2tfb3B0aW9ucycsXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdG5hbWU6ICdjdXJyZW50YmxvY2snLFxuXHRcdFx0XHRsYWJlbDogJyAnLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRuYW1lOiAnaGFzYmxvY2tsb2cnLFxuXHRcdFx0XHRsYWJlbDogJyAnLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRuYW1lOiAnZXhwaXJ5X3ByZXNldCcsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+i/h+acn+aXtumXtO+8micsICfpgY7mnJ/mmYLplpPvvJonKSxcblx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX2V4cGlyeSxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5iScsICfoh6roqIInKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnY3VzdG9tJyxcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5peg6ZmQ5pyfJywgJ+eEoemZkOacnycpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdpbmZpbml0eScsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcz5bCP5pe2JywgJzPlsI/mmYInKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMyBob3VycycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcxMuWwj+aXticsICcxMuWwj+aZgicpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICcxMiBob3VycycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJzHlpKknLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICcxIGRheScsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCczMeWwj+aXticsICczMeWwj+aZgicpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICczMSBob3VycycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJzLlpKknLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICcyIGRheXMnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6ICcz5aSpJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMyBkYXlzJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJzHlkagnLCAnMemAsScpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICcxIHdlZWsnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnMuWRqCcsICcy6YCxJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJzIgd2Vla3MnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnMeS4quaciCcsICcx5YCL5pyIJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJzEgbW9udGgnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnM+S4quaciCcsICcz5YCL5pyIJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJzMgbW9udGhzJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJzbkuKrmnIgnLCAnNuWAi+aciCcpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICc2IG1vbnRocycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJzHlubQnLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICcxIHllYXInLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6ICcy5bm0Jyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnMiB5ZWFycycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogJzPlubQnLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICczIHllYXJzJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdG5hbWU6ICdleHBpcnknLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnov4fmnJ/ml7bpl7QnLCAn6Ieq6KiC6YGO5pyf5pmC6ZaTJyksXG5cdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5oKo5Y+v5Lul5L2/55So55u45a+55pe26Ze077yM5aaC4oCcMSBtaW51dGXigJ3miJbigJwxOSBkYXlz4oCd77yb5oiW57ud5a+55pe26Ze077yM4oCceXl5eW1tZGRoaG1t4oCd77yI5aaC4oCcMjAwNjAyMDExNDA14oCd5pivMjAwNuW5tDLmnIgx5pelMTQ6MDUgVVRD44CC77yJJyxcblx0XHRcdFx0XHQn5oKo5Y+v5Lul5L2/55So55u45bCN5pmC6ZaT77yM5aaC44CMMSBtaW51dGXjgI3miJbjgIwxOSBkYXlz44CN77yb5oiW57WV5bCN5pmC6ZaT77yM44CMeXl5eW1tZGRoaG1t44CN77yI5aaC44CMMjAwNjAyMDExNDA144CN5pivMjAwNuW5tDLmnIgx5pelMTQ6MDUgVVRD44CC77yJJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHR2YWx1ZTogVHdpbmtsZS5ibG9jay5maWVsZF9ibG9ja19vcHRpb25zLmV4cGlyeSB8fCBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMudGVtcGxhdGVfZXhwaXJ5LFxuXHRcdFx0fSk7XG5cdFx0XHRpZiAocGFydGlhbEJveCkge1xuXHRcdFx0XHQvLyBQYXJ0aWFsIGJsb2NrXG5cdFx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0XHRuYW1lOiAncGFnZXJlc3RyaWN0aW9ucycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6aG16Z2i5bCB56aBJywgJ+mggemdouWwgemOlicpLFxuXHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+acgOWkmjEw5Liq6aG16Z2i44CCJywgJ+acgOWkmjEw5YCL6aCB6Z2i44CCJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBucyA9IGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0XHRuYW1lOiAnbmFtZXNwYWNlcmVzdHJpY3Rpb25zJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflkb3lkI3nqbrpl7TlsIHnpoEnLCAn5ZG95ZCN56m66ZaT5bCB6Y6WJyksXG5cdFx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5oyH5a6a5bCB56aB55qE5ZG95ZCN56m66Ze044CCJywgJ+aMh+WumuWwgemOlueahOWRveWQjeepuumWk+OAgicpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Zm9yIChjb25zdCBbbnVtYmVyLCBuYW1lXSBvZiBPYmplY3QuZW50cmllcyhtZW51Rm9ybWF0dGVkTmFtZXNwYWNlcykpIHtcblx0XHRcdFx0XHQvLyBJZ25vcmUgLTE6IFNwZWNpYWw7IC0yOiBNZWRpYTsgYW5kIDIzMDAtMjMwMzogR2FkZ2V0ICh0YWxrKSBhbmQgR2FkZ2V0IGRlZmluaXRpb24gKHRhbGspXG5cdFx0XHRcdFx0aWYgKG51bWJlciA+PSAwICYmIG51bWJlciA8IDgzMCkge1xuXHRcdFx0XHRcdFx0bnMuYXBwZW5kKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBuYW1lLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogbnVtYmVyLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBibG9ja29wdGlvbnMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMubm9jcmVhdGUsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56aB5q2i5Yib5bu66LSm5Y+3JywgJ+emgeatouW7uueri+izrOiZnycpLFxuXHRcdFx0XHRcdG5hbWU6ICdub2NyZWF0ZScsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuYmxvY2suZmllbGRfYmxvY2tfb3B0aW9ucy5ub2VtYWlsLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUteWtkOmCruS7tuWBnOeUqCcsICfpm7vlrZDpg7Xku7blgZznlKgnKSxcblx0XHRcdFx0XHRuYW1lOiAnbm9lbWFpbCcsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuYmxvY2suZmllbGRfYmxvY2tfb3B0aW9ucy5kaXNhYmxldGFsayxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3og73nvJbovpHoh6rlt7HnmoTorqjorrrpobUnLCAn5LiN6IO957eo6Lyv6Ieq5bex55qE6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0bmFtZTogJ2Rpc2FibGV0YWxrJyxcblx0XHRcdFx0XHR2YWx1ZTogJzEnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHBhcnRpYWxCb3hcblx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfoi6Xkvb/nlKjpg6jliIblsIHnpoHvvIzkuI3lupTpgInmi6nmraTpobnvvIzpmaTpnZ7mgqjkuZ/mg7PopoHnpoHmraLnvJbovpHnlKjmiLforqjorrrpobXjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfoi6Xkvb/nlKjpg6jliIblsIHpjpbvvIzkuI3mh4npgbjmk4fmraTpoIXvvIzpmaTpnZ7mgqjkuZ/mg7PopoHnpoHmraLnt6jovK/kvb/nlKjogIXoqI7oq5bpoIHjgIInXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogJycsXG5cdFx0XHRcdH0sXG5cdFx0XHRdO1xuXHRcdFx0aWYgKFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkKSB7XG5cdFx0XHRcdGJsb2Nrb3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMuYXV0b2Jsb2NrLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWKqOWwgeemgScsICfoh6rli5XlsIHpjpYnKSxcblx0XHRcdFx0XHRuYW1lOiAnYXV0b2Jsb2NrJyxcblx0XHRcdFx0XHR2YWx1ZTogJzEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJsb2Nrb3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMuaGFyZGJsb2NrLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mYu+atoueZu+W9leeUqOaIt+S9v+eUqOivpUlQ5Zyw5Z2A57yW6L6RJywgJ+mYu+atoueZu+WFpeS9v+eUqOiAheS9v+eUqOipsklQ5L2N5Z2A57eo6LyvJyksXG5cdFx0XHRcdFx0bmFtZTogJ2hhcmRibG9jaycsXG5cdFx0XHRcdFx0dmFsdWU6ICcxJyxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRibG9ja29wdGlvbnMucHVzaChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuYmxvY2suZmllbGRfYmxvY2tfb3B0aW9ucy53YXRjaHVzZXIsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55uR6KeG6K+l55So5oi355qE55So5oi36aG15ZKM6K6o6K666aG1JywgJ+ebo+imluipsuS9v+eUqOiAheeahOS9v+eUqOiAhemggemdouWSjOiojuirlumggScpLFxuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaHVzZXInLFxuXHRcdFx0XHRcdHZhbHVlOiAnMScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOW9k+WJjeeahOegtOWdj+S4reeahOivt+axgicsICfmqJnoqJjnlbbliY3nmoTnoLTlo57kuK3nmoToq4vmsYInKSxcblx0XHRcdFx0XHRuYW1lOiAnY2xvc2V2aXAnLFxuXHRcdFx0XHRcdHZhbHVlOiAnMScsXG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICdibG9ja29wdGlvbnMnLFxuXHRcdFx0XHRsaXN0OiBibG9ja29wdGlvbnMsXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55CG55Sx77yI55So5LqO5bCB56aB5pel5b+X77yJ77yaJywgJ+eQhueUse+8iOeUqOaWvOWwgemOluaXpeiqjO+8ie+8micpLFxuXHRcdFx0XHRuYW1lOiAncmVhc29uJyxcblx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfor7fogIPomZHlnKjpu5jorqTnmoTmtojmga/kuK3liqDlhaXmnInnlKjnmoTor6bnu4bkv6Hmga/jgIInLFxuXHRcdFx0XHRcdCfoq4vogIPmha7lnKjpoJDoqK3nmoToqIrmga/kuK3liqDlhaXmnInnlKjnmoToqbPntLDos4foqIrjgIInXG5cdFx0XHRcdCksXG5cdFx0XHRcdHZhbHVlOiBUd2lua2xlLmJsb2NrLmZpZWxkX2Jsb2NrX29wdGlvbnMucmVhc29uLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRuYW1lOiAnZmlsZXJsb2dfbGFiZWwnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj4Lop4HvvJonLCAn5Y+D6KaL77yaJyksXG5cdFx0XHRcdHN0eWxlOiAnZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zdHlsZTpub3JtYWwgIWltcG9ydGFudCcsXG5cdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5Zyo5bCB56aB55CG55Sx5Lit5qCH5riF54m55q6K5oOF5Ya15Lul5L6b5YW25LuW566h55CG5ZGY5Y+C6ICDJyxcblx0XHRcdFx0XHQn5Zyo5bCB6Y6W55CG55Sx5Lit5qiZ5riF54m55q6K5oOF5rOB5Lul5L6b5YW25LuW566h55CG5ZOh5Y+D6ICDJ1xuXHRcdFx0XHQpLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF9ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICdmaWx0ZXJfc2VlX2Fsc28nLFxuXHRcdFx0XHRldmVudDogVHdpbmtsZS5ibG9jay5jYWxsYmFjay50b2dnbGVfc2VlX2Fsc29zLFxuXHRcdFx0XHRzdHlsZTogJ2Rpc3BsYXk6aW5saW5lLWJsb2NrOyBtYXJnaW4tcmlnaHQ6NXB4Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+i/h+a7pOWZqOaXpeW/lycsICfpgY7mv77lmajml6XoqownKSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUygn6L+H5ruk5Zmo5pel5b+XJywgJ+mBjua/vuWZqOaXpeiqjCcpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ2RlbGV0ZWRfc2VlX2Fsc28nLFxuXHRcdFx0XHRldmVudDogVHdpbmtsZS5ibG9jay5jYWxsYmFjay50b2dnbGVfc2VlX2Fsc29zLFxuXHRcdFx0XHRzdHlsZTogJ2Rpc3BsYXk6aW5saW5lLWJsb2NrOyBtYXJnaW4tcmlnaHQ6NXB4Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W3suWIoOmZpOeahOe8lui+kScsICflt7LliKrpmaTnmoTnt6jovK8nKSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUygn5bey5Yig6Zmk55qE57yW6L6RJywgJ+W3suWIqumZpOeahOe3qOi8rycpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX2Jsb2NrX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ2ZpbHRlcl9zZWVfYWxzbycsXG5cdFx0XHRcdGV2ZW50OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnRvZ2dsZV9zZWVfYWxzb3MsXG5cdFx0XHRcdHN0eWxlOiAnZGlzcGxheTppbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDo1cHgnLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5oi36K6o6K666aG1JywgJ+S9v+eUqOiAheiojuirlumggScpLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKCfnlKjmiLforqjorrrpobUnLCAn5L2/55So6ICF6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRuYW1lOiAnZmlsdGVyX3NlZV9hbHNvJyxcblx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2sudG9nZ2xlX3NlZV9hbHNvcyxcblx0XHRcdFx0c3R5bGU6ICdkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OjVweCcsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov4fljrvnmoTlsIHnpoHorrDlvZUnLCAn6YGO5Y6755qE5bCB6Y6W6KiY6YyEJyksXG5cdFx0XHRcdFx0XHRjaGVja2VkOiBmYWxzZSxcblx0XHRcdFx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ+i/h+WOu+eahOWwgeemgeiusOW9lScsICfpgY7ljrvnmoTlsIHpjpboqJjpjIQnKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0XHQvLyBZZXQtYW5vdGhlci1sb2dldmVudHMtZG9lc24ndC1oYW5kbGUtcmFuZ2VzLXdlbGxcblx0XHRcdGlmIChibG9ja2VkVXNlck5hbWUgPT09IHJlbGV2YW50VXNlck5hbWUpIHtcblx0XHRcdFx0ZmllbGRfYmxvY2tfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoaWRkZW4nLFxuXHRcdFx0XHRcdG5hbWU6ICdyZWJsb2NrJyxcblx0XHRcdFx0XHR2YWx1ZTogJzEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRlbXBsYXRlQm94KSB7XG5cdFx0XHRmaWVsZF90ZW1wbGF0ZV9vcHRpb25zID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qih5p2/6YCJ6aG5JywgJ+aooeadv+mBuOmghScpLFxuXHRcdFx0XHRuYW1lOiAnZmllbGRfdGVtcGxhdGVfb3B0aW9ucycsXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdG5hbWU6ICd0ZW1wbGF0ZScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAieaLqeiuqOiuuumhteaooeadv++8micsICfpgbjmk4foqI7oq5bpoIHmqKHmnb/vvJonKSxcblx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX3RlbXBsYXRlLFxuXHRcdFx0XHRsaXN0OiBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmZpbHRlcmVkX2Jsb2NrX2dyb3VwcyhibG9ja0dyb3VwLCB0cnVlKSxcblx0XHRcdFx0dmFsdWU6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy50ZW1wbGF0ZSxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRuYW1lOiAnYXJ0aWNsZScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mTvuaOpemhtemdoicsICfpgKPntZDpoIHpnaInKSxcblx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+WPr+S7pemaj+mAmuefpemTvuaOpemhtemdou+8jOS+i+WmguegtOWdj+eahOebruagh+OAguayoeacieadoeebrumcgOimgemTvuaOpeWImeivt+eVmeepuuOAgicsXG5cdFx0XHRcdFx0J+WPr+S7pemaqOmAmuefpemAo+e1kOmggemdou+8jOS+i+WmguegtOWjnueahOebruaomeOAguaykuacieaineebrumcgOimgemAo+e1kOWJh+iri+eVmeepuuOAgidcblx0XHRcdFx0KSxcblx0XHRcdH0pO1xuXHRcdFx0Ly8gT25seSB2aXNpYmxlIGlmIHBhcnRpYWwgYW5kIG5vdCBibG9ja2luZ1xuXHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRuYW1lOiAnYXJlYScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwgeemgeiMg+WbtCcsICflsIHpjpbnr4TlnI0nKSxcblx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+mYu+atoueUqOaIt+e8lui+keeahOmhtemdouaIluWRveWQjeepuumXtOeahOWPr+mAieivtOaYjuOAgicsXG5cdFx0XHRcdFx0J+mYu+atouS9v+eUqOiAhee3qOi8r+eahOmggemdouaIluWRveWQjeepuumWk+eahOWPr+mBuOiqquaYjuOAgidcblx0XHRcdFx0KSxcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFibG9ja0JveCkge1xuXHRcdFx0XHRmaWVsZF90ZW1wbGF0ZV9vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAndGVtcGxhdGVfZXhwaXJ5Jyxcblx0XHRcdFx0XHRsYWJlbDogJ+Wwgeemgeacn+mZkO+8micsXG5cdFx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5bCB56aB5pe26ZW/77yM5aaCMjTlsI/ml7bjgIEy5ZGo44CB5peg6ZmQ5pyf562J44CCJywgJ+WwgemOluaZgumVt++8jOWmgjI05bCP5pmC44CBMumAseOAgeeEoemZkOacn+etieOAgicpLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0bmFtZTogJ2Jsb2NrX3JlYXNvbicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+KAnOeUseS6juKApuKApuaCqOW3suiiq+WwgeemgeKAnScsICfjgIznlLHmlrzigKbigKbmgqjlt7LooqvlsIHpjpbjgI0nKSxcblx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCflj6/pgInnmoTnkIbnlLHvvIznlKjkuo7mm7/mjaLpu5jorqTnkIbnlLHjgILlj6rlnKjluLjop4TlsIHnpoHmqKHmnb/kuK3mnInmlYjjgIInLFxuXHRcdFx0XHRcdCflj6/pgbjnmoTnkIbnlLHvvIznlKjmlrzmm7/mj5vpoJDoqK3nkIbnlLHjgILlj6rlnKjluLjopo/lsIHpjpbmqKHmnb/kuK3mnInmlYjjgIInXG5cdFx0XHRcdCksXG5cdFx0XHRcdHZhbHVlOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYmxvY2tfcmVhc29uLFxuXHRcdFx0XHRzaXplOiA2MCxcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGJsb2NrQm94KSB7XG5cdFx0XHRcdGZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdG5hbWU6ICdibGFua19kdXJhdGlvbicsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3lnKjmqKHmnb/kuK3ljIXlkKvlsIHnpoHmnJ/pmZAnLCAn5LiN5Zyo5qih5p2/5Lit5YyF5ZCr5bCB6Y6W5pyf6ZmQJyksXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ibGFua19kdXJhdGlvbixcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmqKHmnb/lsIbkvJrmmL7npLrigJzkuIDmrrXml7bpl7TigJ3ogIzkuI3mmK/lhbfkvZPml7bplb8nLFxuXHRcdFx0XHRcdFx0XHRcdCfmqKHmnb/lsIfmnIPpoa/npLrjgIzkuIDmrrXmmYLplpPjgI3ogIzkuI3mmK/lhbfpq5TmmYLplbcnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3og73nvJbovpHoh6rlt7HnmoTorqjorrrpobUnLCAn5LiN6IO957eo6Lyv6Ieq5bex55qE6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdub3RhbGsnLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMubm90YWxrLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+eUqOatpOWcqOWwgeemgeaooeadv+S4reaMh+aYjuivpeeUqOaIt+e8lui+keiuqOiuuumhteeahOadg+mZkOW3suiiq+enu+mZpCcsXG5cdFx0XHRcdFx0XHRcdFx0J+eUqOatpOWcqOWwgemOluaooeadv+S4reaMh+aYjuipsuS9v+eUqOiAhee3qOi8r+iojuirlumggeeahOasiumZkOW3suiiq+enu+mZpCdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S4jeiDveWPkemAgeeUteWtkOmCruS7ticsICfkuI3og73lgrPpgIHpm7vlrZDpg7Xku7YnKSxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ25vZW1haWxfdGVtcGxhdGUnLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMubm9lbWFpbF90ZW1wbGF0ZSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHnpoHmqKHmnb/kuK3mjIfmmI7or6XnlKjmiLflj5HpgIHnlLXlrZDpgq7ku7bnmoTmnYPpmZDlt7Looqvnp7vpmaQnLFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHpjpbmqKHmnb/kuK3mjIfmmI7oqbLkvb/nlKjogIXlgrPpgIHpm7vlrZDpg7Xku7bnmoTmrIrpmZDlt7Looqvnp7vpmaQnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkuI3og73liJvlu7rotKblj7cnLCAn5LiN6IO95bu656uL6LOs6JmfJyksXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdub2NyZWF0ZV90ZW1wbGF0ZScsXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ub2NyZWF0ZV90ZW1wbGF0ZSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHnpoHmqKHmnb/kuK3mjIfmmI7or6XnlKjmiLfliJvlu7rotKblj7fnmoTmnYPpmZDlt7Looqvnp7vpmaQnLFxuXHRcdFx0XHRcdFx0XHRcdCfnlKjmraTlnKjlsIHpjpbmqKHmnb/kuK3mjIfmmI7oqbLkvb/nlKjogIXlu7rnq4vos6zomZ/nmoTmrIrpmZDlt7Looqvnp7vpmaQnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgJHByZXZpZXdsaW5rID0gJChgPGEgaWQ9XCJ0d2lua2xlYmxvY2stcHJldmlldy1saW5rXCI+JHt3aW5kb3cud2dVTFMoJ+mihOiniCcsICfpoJDopr0nKX08L2E+YCk7XG5cdFx0XHQkcHJldmlld2xpbmsub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5wcmV2aWV3KCRmb3JtWzBdKTtcblx0XHRcdH0pO1xuXHRcdFx0JHByZXZpZXdsaW5rLmNzcyh7XG5cdFx0XHRcdGN1cnNvcjogJ3BvaW50ZXInLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWVsZF90ZW1wbGF0ZV9vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRpZDogJ2Jsb2NrcHJldmlldycsXG5cdFx0XHRcdGxhYmVsOiBbJHByZXZpZXdsaW5rWzBdXSxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0aWQ6ICd0d2lua2xlYmxvY2stcHJldmlld2JveCcsXG5cdFx0XHRcdHN0eWxlOiAnZGlzcGxheTogbm9uZScsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKHRhZ0JveCkge1xuXHRcdFx0ZmllbGRfdGFnX29wdGlvbnMgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDnlKjmiLfpobUnLCAn5qiZ6KiY5L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRcdG5hbWU6ICdmaWVsZF90YWdfb3B0aW9ucycsXG5cdFx0XHR9KTtcblx0XHRcdGZpZWxkX3RhZ19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICd0YWcnLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgInmi6nnlKjmiLfpobXmqKHmnb/vvJonLCAn6YG45pOH5L2/55So6ICF6aCB6Z2i5qih5p2/77yaJyksXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogYHt7QmxvY2tlZCB1c2VyfX3vvJoke3dpbmRvdy53Z1VMUygn5LiA6Iis5rC45LmF5bCB56aBJywgJ+S4gOiIrOawuOS5heWwgemOlicpfWAsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ0Jsb2NrZWQgdXNlcicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogYHt7U29ja3B1cHBldH1977yaJHt3aW5kb3cud2dVTFMoJ+WCgOWEoei0puWPtycsICflgoDlhKHos6zomZ8nKX1gLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdTb2NrcHVwcGV0Jyxcblx0XHRcdFx0XHRcdHN1Ymdyb3VwOiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnc3BwVXNlcm5hbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Li76LSm5Y+355So5oi35ZCN77yaJywgJ+S4u+izrOiZn+S9v+eUqOiAheWQjeeose+8micpLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogJ3NwcFR5cGUnLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eKtuaAge+8micsICfni4DmhYvvvJonKSxcblx0XHRcdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2Jsb2NrZWQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYGJsb2NrZWQgLSAke3dpbmRvdy53Z1VMUygn5LuF5L6d6KGM5Li66K+B5o2u6K6k5a6aJywgJ+WDheS+neihjOeCuuitieaTmuiqjeWumicpfWAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAncHJvdmVuJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGBwcm92ZW4gLSAke3dpbmRvdy53Z1VMUygn57uP5YKA5YSh6LCD5p+l56Gu6K6kJywgJ+e2k+WCgOWEoeiqv+afpeeiuuiqjScpfWAsXG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdjb25maXJtZWQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYGNvbmZpcm1lZCAtICR7d2luZG93LndnVUxTKCfnu4/mn6XmoLjnoa7orqQnLCAn57aT5p+l5qC456K66KqNJyl9YCxcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdzcHBFdmlkZW5jZScsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoLnmja7igKbigKbnoa7lrprvvJonLCAn5qC55pOa4oCm4oCm56K65a6a77yaJyksXG5cdFx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+e6r+aWh+Wtl+aIluaYr+W4pltbXV3nmoTpk77mjqXvvIzkvovlpoLvvJpbW1NwZWNpYWw65Zu65a6a6ZO+5o6lL3h4eHh4eHh4fOeUqOaIt+afpeaguF1dJyxcblx0XHRcdFx0XHRcdFx0XHRcdCfntJTmloflrZfmiJbmmK/luLZbW11d55qE6YCj57WQ77yM5L6L5aaC77yaW1tTcGVjaWFsOuWbuuWumumTvuaOpS94eHh4eHh4eHznlKjmiLbmn6XmoLhdXSdcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiBge3tTb2NrcHVwcGV0ZWVyfGJsb2NrZWR9fe+8miR7d2luZG93LndnVUxTKCflgoDlhKHkuLvotKblj7cnLCAn5YKA5YSh5Li76LOs6JmfJyl9YCxcblx0XHRcdFx0XHRcdHZhbHVlOiAnU29ja3B1cHBldGVlcicsXG5cdFx0XHRcdFx0XHRzdWJncm91cDogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdzcG1DaGVja2VkJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdzcG1DaGVja2VkJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn57uP55So5oi35p+l5qC456Gu6K6kJywgJ+e2k+S9v+eUqOiAheafpeaguOeiuuiqjScpLFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogJ3NwbUV2aWRlbmNlJyxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mineWklueQhueUse+8micsICfpoY3lpJbnkIbnlLHvvJonKSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAodW5ibG9ja0JveCkge1xuXHRcdFx0ZmllbGRfdW5ibG9ja19vcHRpb25zID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Kej6Zmk5bCB56aB6YCJ6aG5JywgJ+ino+mZpOWwgemOlumBuOmghScpLFxuXHRcdFx0XHRuYW1lOiAnZmllbGRfdW5ibG9ja19vcHRpb25zJyxcblx0XHRcdH0pO1xuXHRcdFx0ZmllbGRfdW5ibG9ja19vcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eQhueUse+8iOeUqOS6juWwgeemgeaXpeW/l++8ie+8micsICfnkIbnlLHvvIjnlKjmlrzlsIHpjpbml6XoqozvvInvvJonKSxcblx0XHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHRcdHZhbHVlOiBUd2lua2xlLmJsb2NrLmZpZWxkX3VuYmxvY2tfb3B0aW9ucy5yZWFzb24sXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0bGV0IG9sZGZpZWxkO1xuXHRcdGlmIChmaWVsZF9wcmVzZXQpIHtcblx0XHRcdFtvbGRmaWVsZF0gPSAkZm9ybS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfcHJlc2V0XCJdJyk7XG5cdFx0XHRvbGRmaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmaWVsZF9wcmVzZXQucmVuZGVyKCksIG9sZGZpZWxkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3ByZXNldFwiXScpLmhpZGUoKTtcblx0XHR9XG5cdFx0aWYgKGZpZWxkX2Jsb2NrX29wdGlvbnMpIHtcblx0XHRcdFtvbGRmaWVsZF0gPSAkZm9ybS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfYmxvY2tfb3B0aW9uc1wiXScpO1xuXHRcdFx0b2xkZmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZmllbGRfYmxvY2tfb3B0aW9ucy5yZW5kZXIoKSwgb2xkZmllbGQpO1xuXHRcdFx0JGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkXzY0XCJdJykuc2hvdygpO1xuXHRcdFx0JGZvcm0uZmluZCgnW25hbWU9cGFnZXJlc3RyaWN0aW9uc10nKS5zZWxlY3QyKHtcblx0XHRcdFx0d2lkdGg6ICcxMDAlJyxcblx0XHRcdFx0cGxhY2Vob2xkZXI6IHdpbmRvdy53Z1VMUygn6L6T5YWl6KaB6Zi75q2i55So5oi357yW6L6R55qE6aG16Z2iJywgJ+i8uOWFpeimgemYu+atouS9v+eUqOiAhee3qOi8r+eahOmggemdoicpLFxuXHRcdFx0XHRsYW5ndWFnZToge1xuXHRcdFx0XHRcdGVycm9yTG9hZGluZzogKCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHdpbmRvdy53Z1VMUygn5pCc57Si6K+N5rGH5LiN5a6M5pW05oiW5peg5pWIJywgJ+aQnOWwi+ipnuW9meS4jeWujOaVtOaIlueEoeaViCcpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG1heGltdW1TZWxlY3Rpb25MZW5ndGg6IDEwLFxuXHRcdFx0XHRtaW5pbXVtSW5wdXRMZW5ndGg6IDEsXG5cdFx0XHRcdGFqYXg6IHtcblx0XHRcdFx0XHR1cmw6IG13LnV0aWwud2lraVNjcmlwdCgnYXBpJyksXG5cdFx0XHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcblx0XHRcdFx0XHRkZWxheTogMTAwLFxuXHRcdFx0XHRcdGRhdGE6IChwYXJhbXMpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFyYW1zLnRlcm0pO1xuXHRcdFx0XHRcdFx0aWYgKCF0aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdFx0XHRcdFx0XHRsaXN0OiAnYWxscGFnZXMnLFxuXHRcdFx0XHRcdFx0XHRhcGZyb206IHRpdGxlLnRpdGxlLFxuXHRcdFx0XHRcdFx0XHRhcG5hbWVzcGFjZTogdGl0bGUubmFtZXNwYWNlLFxuXHRcdFx0XHRcdFx0XHRhcGxpbWl0OiAnMTAnLFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHByb2Nlc3NSZXN1bHRzOiAoZGF0YSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0czogZGF0YS5xdWVyeS5hbGxwYWdlcy5tYXAoKHBhZ2UpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0aXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhZ2UudGl0bGUsIHBhZ2UubnMpLnRvVGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZDogdGl0bGUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiB0aXRsZSxcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dGVtcGxhdGVTZWxlY3Rpb246IChjaG9pY2UpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gJCgnPGE+Jylcblx0XHRcdFx0XHRcdC50ZXh0KGNob2ljZS50ZXh0KVxuXHRcdFx0XHRcdFx0LmF0dHIoe1xuXHRcdFx0XHRcdFx0XHRocmVmOiBtdy51dGlsLmdldFVybChjaG9pY2UudGV4dCksXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogJ19ibGFuaycsXG5cdFx0XHRcdFx0XHRcdHJlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXInLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHRcdCRmb3JtLmZpbmQoJ1tuYW1lPW5hbWVzcGFjZXJlc3RyaWN0aW9uc10nKS5zZWxlY3QyKHtcblx0XHRcdFx0d2lkdGg6ICcxMDAlJyxcblx0XHRcdFx0bWF0Y2hlcjogTW9yZWJpdHMuc2VsZWN0Mi5tYXRjaGVycy53b3JkQmVnaW5uaW5nLFxuXHRcdFx0XHRsYW5ndWFnZToge1xuXHRcdFx0XHRcdHNlYXJjaGluZzogTW9yZWJpdHMuc2VsZWN0Mi5xdWVyeUludGVyY2VwdG9yLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0ZW1wbGF0ZVJlc3VsdDogTW9yZWJpdHMuc2VsZWN0Mi5oaWdobGlnaHRTZWFyY2hNYXRjaGVzLFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogd2luZG93LndnVUxTKCfpgInmi6nopoHnpoHmraLnlKjmiLfnvJbovpHnmoTlkb3lkI3nqbrpl7QnLCAn6YG45pOH6KaB56aB5q2i5L2/55So6ICF57eo6Lyv55qE5ZG95ZCN56m66ZaTJyksXG5cdFx0XHR9KTtcblx0XHRcdG13LnV0aWwuYWRkQ1NTKFxuXHRcdFx0XHQvKiBSZWR1Y2UgcGFkZGluZztcblx0XHRcdFx0ICogQWRqdXN0IGZvbnQgc2l6ZTtcblx0XHRcdFx0ICogUmVtb3ZlIGJsYWNrIGJvcmRlcjtcblx0XHRcdFx0ICogTWFrZSB0aGUgdGlueSBjcm9zcyBsYXJnZXJcblx0XHRcdFx0ICovXG5cdFx0XHRcdCcuc2VsZWN0Mi1yZXN1bHRzIC5zZWxlY3QyLXJlc3VsdHNfX29wdGlvbntwYWRkaW5nLXRvcDoxcHg7cGFkZGluZy1ib3R0b206MXB4fS5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0Mi1kcm9wZG93biAuc2VsZWN0Mi1yZXN1bHRzLC5zZWxlY3QyLWNvbnRhaW5lciAuc2VsZWN0aW9uIC5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWR7Zm9udC1zaXplOjEzcHh9LnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0LnNlbGVjdDItY29udGFpbmVyLS1mb2N1cyAuc2VsZWN0Mi1zZWxlY3Rpb24tLW11bHRpcGxle2JvcmRlcjoxcHggc29saWQgI2FhYX0uc2VsZWN0Mi1zZWxlY3Rpb25fX2Nob2ljZV9fcmVtb3Zle2ZvbnQtc2l6ZToxMjUlfSdcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRmb3JtLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZF9ibG9ja19vcHRpb25zXCJdJykuaGlkZSgpO1xuXHRcdFx0JGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkXzY0XCJdJykuaGlkZSgpO1xuXHRcdFx0Ly8gQ2xlYXIgc2VsZWN0MiBvcHRpb25zXG5cdFx0XHQkZm9ybS5maW5kKCdbbmFtZT1wYWdlcmVzdHJpY3Rpb25zXScpLnZhbChudWxsKS50cmlnZ2VyKCdjaGFuZ2UnKTtcblx0XHRcdCRmb3JtLmZpbmQoJ1tuYW1lPW5hbWVzcGFjZXJlc3RyaWN0aW9uc10nKS52YWwobnVsbCkudHJpZ2dlcignY2hhbmdlJyk7XG5cdFx0fVxuXHRcdGlmIChmaWVsZF90ZW1wbGF0ZV9vcHRpb25zKSB7XG5cdFx0XHRbb2xkZmllbGRdID0gJGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3RlbXBsYXRlX29wdGlvbnNcIl0nKTtcblx0XHRcdG9sZGZpZWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGZpZWxkX3RlbXBsYXRlX29wdGlvbnMucmVuZGVyKCksIG9sZGZpZWxkKTtcblx0XHRcdGUudGFyZ2V0LmZvcm0ucm9vdC5wcmV2aWV3ZXIgPSBuZXcgTW9yZWJpdHMud2lraS5wcmV2aWV3KFxuXHRcdFx0XHQkKGUudGFyZ2V0LmZvcm0ucm9vdCkuZmluZCgnI3R3aW5rbGVibG9jay1wcmV2aWV3Ym94JykubGFzdCgpWzBdXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkZm9ybS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfdGVtcGxhdGVfb3B0aW9uc1wiXScpLmhpZGUoKTtcblx0XHR9XG5cdFx0aWYgKGZpZWxkX3RhZ19vcHRpb25zKSB7XG5cdFx0XHRbb2xkZmllbGRdID0gJGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3RhZ19vcHRpb25zXCJdJyk7XG5cdFx0XHRvbGRmaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmaWVsZF90YWdfb3B0aW9ucy5yZW5kZXIoKSwgb2xkZmllbGQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkZm9ybS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfdGFnX29wdGlvbnNcIl0nKS5oaWRlKCk7XG5cdFx0fVxuXHRcdGlmIChmaWVsZF91bmJsb2NrX29wdGlvbnMpIHtcblx0XHRcdFtvbGRmaWVsZF0gPSAkZm9ybS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfdW5ibG9ja19vcHRpb25zXCJdJyk7XG5cdFx0XHRvbGRmaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmaWVsZF91bmJsb2NrX29wdGlvbnMucmVuZGVyKCksIG9sZGZpZWxkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JGZvcm0uZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkX3VuYmxvY2tfb3B0aW9uc1wiXScpLmhpZGUoKTtcblx0XHR9XG5cdFx0Ly8gQW55IGJsb2NrLCBpbmNsdWRpbmcgcmFuZ2VzXG5cdFx0aWYgKFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbykge1xuXHRcdFx0Ly8gZmFsc2UgZm9yIGFuIGlwIGNvdmVyZWQgYnkgYSByYW5nZSBvciBhIHNtYWxsZXIgcmFuZ2Ugd2l0aGluIGEgbGFyZ2VyIHJhbmdlO1xuXHRcdFx0Ly8gdHJ1ZSBmb3IgYSB1c2VyLCBzaW5nbGUgaXAgYmxvY2ssIG9yIHRoZSBleGFjdCByYW5nZSBmb3IgYSByYW5nZSBibG9ja1xuXHRcdFx0Y29uc3Qgc2FtZVVzZXIgPSBibG9ja2VkVXNlck5hbWUgPT09IHJlbGV2YW50VXNlck5hbWU7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdCgkYm9keS5maW5kKCdkaXZbbmFtZT1cImN1cnJlbnRibG9ja1wiXSBzcGFuJykubGFzdCgpWzBdKTtcblx0XHRcdGxldCBzdGF0dXNTdHIgPSBgJHtyZWxldmFudFVzZXJOYW1lfeW3suiiqyR7XG5cdFx0XHRcdFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mby5wYXJ0aWFsID09PSAnJ1xuXHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCfpg6jliIblsIHnpoEnLCAn6YOo5YiG5bCB6Y6WJylcblx0XHRcdFx0XHQ6IHdpbmRvdy53Z1VMUygn5YWo56uZ5bCB56aBJywgJ+WFqOermeWwgemOlicpXG5cdFx0XHR9YDtcblx0XHRcdC8vIFJhbmdlIGJsb2NrZWRcblx0XHRcdGlmIChUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8ucmFuZ2VzdGFydCAhPT0gVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLnJhbmdlZW5kKSB7XG5cdFx0XHRcdGlmIChzYW1lVXNlcikge1xuXHRcdFx0XHRcdHN0YXR1c1N0ciArPSB3aW5kb3cud2dVTFMoJ++8iOauteWwgeemge+8iScsICfvvIjmrrXlsIHpjpbvvIknKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDaGFuZ2Ugb3JkZXJcblx0XHRcdFx0XHQvLyBMaW5rIHRvIHRoZSBmdWxsIHJhbmdlXG5cdFx0XHRcdFx0Y29uc3QgJHJhbmdlYmxvY2tsb2dsaW5rID0gJCgnPHNwYW4+JykuYXBwZW5kKFxuXHRcdFx0XHRcdFx0JChcblx0XHRcdFx0XHRcdFx0YDxhIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoJ1NwZWNpYWw6TG9nJywge1xuXHRcdFx0XHRcdFx0XHRcdGFjdGlvbjogJ3ZpZXcnLFxuXHRcdFx0XHRcdFx0XHRcdHBhZ2U6IGJsb2NrZWRVc2VyTmFtZSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnYmxvY2snLFxuXHRcdFx0XHRcdFx0XHR9KX1cIj4ke1xuXHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLmlwLmdldDY0KHJlbGV2YW50VXNlck5hbWUpID09PSBibG9ja2VkVXNlck5hbWUgPyAnLzY0JyA6IGJsb2NrZWRVc2VyTmFtZVxuXHRcdFx0XHRcdFx0XHR9PC9hPilgXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRzdGF0dXNTdHIgKz1cblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn77yI5L2N5LqOJywgJ++8iOS9jeaWvCcpICtcblx0XHRcdFx0XHRcdCRyYW5nZWJsb2NrbG9nbGluay5odG1sKCkgK1xuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmrrXlsIHnpoHlhoXvvIknLCAn5q615bCB6Y6W5YWn77yJJyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8uZXhwaXJ5ID09PSAnaW5maW5pdHknKSB7XG5cdFx0XHRcdHN0YXR1c1N0ciArPSB3aW5kb3cud2dVTFMoJ++8iOaXoOmZkOacn++8iScsICfvvIjnhKHpmZDmnJ/vvIknKTtcblx0XHRcdH0gZWxzZSBpZiAobmV3IE1vcmViaXRzLmRhdGUoVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLmV4cGlyeSkuaXNWYWxpZCgpKSB7XG5cdFx0XHRcdHN0YXR1c1N0ciArPSBgJHtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ++8iOe7iOatouS6jicsICfvvIjntYLmraLmlrwnKSArXG5cdFx0XHRcdFx0bmV3IE1vcmViaXRzLmRhdGUoVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLmV4cGlyeSkuY2FsZW5kYXIoJ3V0YycpXG5cdFx0XHRcdH3vvIlgO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGluZm9TdHIgPSB3aW5kb3cud2dVTFMoJ+atpOihqOWNleWwhicsICfmraTooajllq7lsIcnKTtcblx0XHRcdGlmIChzYW1lVXNlcikge1xuXHRcdFx0XHRpbmZvU3RyICs9IHdpbmRvdy53Z1VMUygn5pu05pS55bCB56aBJywgJ+iuiuabtOWwgemOlicpO1xuXHRcdFx0XHRpZiAoVHdpbmtsZS5ibG9jay5jdXJyZW50QmxvY2tJbmZvLnBhcnRpYWwgPT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFsQm94KSB7XG5cdFx0XHRcdFx0aW5mb1N0ciArPSB3aW5kb3cud2dVTFMoJ+S4uumDqOWIhuWwgeemgScsICfngrrpg6jliIblsIHpjpYnKTtcblx0XHRcdFx0fSBlbHNlIGlmIChUd2lua2xlLmJsb2NrLmN1cnJlbnRCbG9ja0luZm8ucGFydGlhbCA9PT0gJycgJiYgIXBhcnRpYWxCb3gpIHtcblx0XHRcdFx0XHRpbmZvU3RyICs9IHdpbmRvdy53Z1VMUygn5Li65YWo56uZ5bCB56aBJywgJ+eCuuWFqOermeWwgemOlicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZm9TdHIgKz0gJ+OAgic7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbmZvU3RyICs9XG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfliqDkuIrpop3lpJbnmoQnLCAn5Yqg5LiK6aGN5aSW55qEJykgK1xuXHRcdFx0XHRcdChwYXJ0aWFsQm94ID8gJ+mDqOWIhicgOiAnJykgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCB56aB44CCJywgJ+WwgemOluOAgicpO1xuXHRcdFx0fVxuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oc3RhdHVzU3RyLCBpbmZvU3RyKTtcblx0XHRcdC8vIERlZmF1bHQgdG8gdGhlIGN1cnJlbnQgYmxvY2sgY29uZGl0aW9ucyBvbiBpbnRpYWwgZm9ybSBnZW5lcmF0aW9uXG5cdFx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnVwZGF0ZV9mb3JtKGUsIFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbyk7XG5cdFx0fVxuXHRcdC8vIFRoaXMgaXMgd2hlcmUgVDE0NjYyOCByZWFsbHkgY29tZXMgaW50byBwbGF5OiBhIHJhbmdlYmxvY2sgd2lsbFxuXHRcdC8vIG9ubHkgcmV0dXJuIHRoZSBjb3JyZWN0IGJsb2NrIGxvZyBpZiB3Z1JlbGV2YW50VXNlck5hbWUgaXMgdGhlXG5cdFx0Ly8gZXhhY3QgcmFuZ2UsIG5vdCBtZXJlbHkgYSBmdW50aW9uYWwgZXF1aXZhbGVudFxuXHRcdGlmIChUd2lua2xlLmJsb2NrLmhhc0Jsb2NrTG9nKSB7XG5cdFx0XHQvLyBBZGQgbW9yZSBkZXRhaWxzXG5cdFx0XHRjb25zdCBibG9ja2xvZ2luZm8gPSBbXTtcblx0XHRcdGNvbnN0ICRibG9ja2xvZ2xpbmsgPSAkKCc8c3Bhbj4nKS5hcHBlbmQoXG5cdFx0XHRcdCQoXG5cdFx0XHRcdFx0YDxhIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoJ1NwZWNpYWw6TG9nJywge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiAndmlldycsXG5cdFx0XHRcdFx0XHRwYWdlOiByZWxldmFudFVzZXJOYW1lLFxuXHRcdFx0XHRcdFx0dHlwZTogJ2Jsb2NrJyxcblx0XHRcdFx0XHR9KX1cIj4ke3dpbmRvdy53Z1VMUygn5bCB56aB5pel5b+XJywgJ+WwgemOluaXpeiqjCcpfTwvYT4pYFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKFR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbykge1xuXHRcdFx0XHRibG9ja2xvZ2luZm8ucHVzaCh3aW5kb3cud2dVTFMoJ+WwgeemgeivpuaDhScsICflsIHpjpboqbPmg4UnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBbbGFzdEJsb2NrQWN0aW9uXSA9IFR3aW5rbGUuYmxvY2suYmxvY2tMb2c7XG5cdFx0XHRcdGNvbnN0IGJsb2NrQWN0aW9uID0gbGFzdEJsb2NrQWN0aW9uLmFjdGlvbiA9PT0gJ3VuYmxvY2snID8gVHdpbmtsZS5ibG9jay5ibG9ja0xvZ1sxXSA6IGxhc3RCbG9ja0FjdGlvbjtcblx0XHRcdFx0YmxvY2tsb2dpbmZvLnB1c2goXG5cdFx0XHRcdFx0YOatpCR7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5pcC5pc1JhbmdlKHJlbGV2YW50VXNlck5hbWUpXG5cdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCdJUOiMg+WbtCcsICdJUOevhOWcjScpXG5cdFx0XHRcdFx0XHRcdDogd2luZG93LndnVUxTKCfnlKjmiLcnLCAn5L2/55So6ICFJylcblx0XHRcdFx0XHR95pu+5ZyoYCxcblx0XHRcdFx0XHQkKGA8Yj4ke25ldyBNb3JlYml0cy5kYXRlKGJsb2NrQWN0aW9uLnRpbWVzdGFtcCkuY2FsZW5kYXIoJ3V0YycpfTwvYj5gKVswXSxcblx0XHRcdFx0XHRg6KKrJHtibG9ja0FjdGlvbi51c2VyfSR7d2luZG93LndnVUxTKCflsIHnpoEnLCAn5bCB6Y6WJyl9YCxcblx0XHRcdFx0XHQkKGA8Yj4ke01vcmViaXRzLnN0cmluZy5mb3JtYXRUaW1lKGJsb2NrQWN0aW9uLnBhcmFtcy5kdXJhdGlvbil9PC9iPmApWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChsYXN0QmxvY2tBY3Rpb24uYWN0aW9uID09PSAndW5ibG9jaycpIHtcblx0XHRcdFx0XHRibG9ja2xvZ2luZm8ucHVzaChg77yMJHtuZXcgTW9yZWJpdHMuZGF0ZShsYXN0QmxvY2tBY3Rpb24udGltZXN0YW1wKS5jYWxlbmRhcigndXRjJyl96Kej5bCBYCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYmxvY2sgb3IgcmVibG9ja1xuXHRcdFx0XHRcdGJsb2NrbG9naW5mby5wdXNoKFxuXHRcdFx0XHRcdFx0YO+8jCR7bmV3IE1vcmViaXRzLmRhdGUoYmxvY2tBY3Rpb24ucGFyYW1zLmV4cGlyeSkuY2FsZW5kYXIoJ3V0YycpfSR7d2luZG93LndnVUxTKCfov4fmnJ8nLCAn6YGO5pyfJyl9YFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KCRib2R5LmZpbmQoJ2RpdltuYW1lPVwiaGFzYmxvY2tsb2dcIl0gc3BhbicpLmxhc3QoKVswXSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMud2FybihibG9ja2xvZ2luZm8sICRibG9ja2xvZ2xpbmtbMF0pO1xuXHRcdH1cblx0XHQvLyBNYWtlIHN1cmUgYWxsIHRoZSBmaWVsZHMgYXJlIGNvcnJlY3QgYmFzZWQgb24gaW5pdGlhbCBkZWZhdWx0c1xuXHRcdGlmIChibG9ja0JveCkge1xuXHRcdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfcHJlc2V0KGUpO1xuXHRcdH0gZWxzZSBpZiAodGVtcGxhdGVCb3gpIHtcblx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX3RlbXBsYXRlKGUpO1xuXHRcdH1cblx0fTtcblx0LyoqXG5cdCAqIEtlZXAgYWxwaGFiZXRpemVkIGJ5IGtleSBuYW1lLCBUd2lua2xlLmJsb2NrLmJsb2NrR3JvdXBzIGVzdGFibGlzaGVzXG5cdCAqICAgIHRoZSBvcmRlciB0aGV5IHdpbGwgYXBwZWFyIGluIHRoZSBpbnRlcmZhY2Vcblx0ICpcblx0ICogQmxvY2sgcHJlc2V0IGZvcm1hdCwgYWxsIGtleXMgYWNjZXB0IG9ubHkgJ3RydWUnIChvbWl0IGZvciBmYWxzZSkgZXhjZXB0IHdoZXJlIG5vdGVkOlxuXHQgKiA8dGl0bGUgb2YgYmxvY2sgdGVtcGxhdGU+IDoge1xuXHQgKiAgIGF1dG9ibG9jazogPGF1dG9ibG9jayBhbnkgSVAgYWRkcmVzc2VzIHVzZWQgKGZvciByZWdpc3RlcmVkIHVzZXJzIG9ubHkpPlxuXHQgKiAgIGRpc2FibGV0YWxrOiA8ZGlzYWJsZSB1c2VyIGZyb20gZWRpdGluZyB0aGVpciBvd24gdGFsayBwYWdlIHdoaWxlIGJsb2NrZWQ+XG5cdCAqICAgZXhwaXJ5OiA8c3RyaW5nIC0gZXhwaXJ5IHRpbWVzdGFtcCwgY2FuIGluY2x1ZGUgcmVsYXRpdmUgdGltZXMgbGlrZSBcIjUgbW9udGhzXCIsIFwiMiB3ZWVrc1wiIGV0Yz5cblx0ICogICBmb3JBbm9uT25seTogPHNob3cgYmxvY2sgb3B0aW9uIGluIHRoZSBpbnRlcmZhY2Ugb25seSBpZiB0aGUgcmVsZXZhbnQgdXNlciBpcyBhbiBJUD5cblx0ICogICBmb3JSZWdpc3RlcmVkT25seTogPHNob3cgYmxvY2sgb3B0aW9uIGluIHRoZSBpbnRlcmZhY2Ugb25seSBpZiB0aGUgcmVsZXZhbnQgdXNlciBpcyByZWdpc3RlcmVkPlxuXHQgKiAgIGxhYmVsOiA8c3RyaW5nIC0gbGFiZWwgZm9yIHRoZSBvcHRpb24gb2YgdGhlIGRyb3Bkb3duIGluIHRoZSBpbnRlcmZhY2UgKGtlZXAgYnJpZWYpPlxuXHQgKiAgIG5vZW1haWw6IHByZXZlbnQgdGhlIHVzZXIgZnJvbSBzZW5kaW5nIGVtYWlsIHRocm91Z2ggU3BlY2lhbDpFbWFpbHVzZXJcblx0ICogICBwYWdlUGFyYW06IDxzZXQgaWYgdGhlIGFzc29jaWF0ZWQgYmxvY2sgdGVtcGxhdGUgYWNjZXB0cyBhIHBhZ2UgcGFyYW1ldGVyPlxuXHQgKiAgIHByZXBlbmRSZWFzb246IDxzdHJpbmcgLSBwcmVwZW5kcyB0aGUgdmFsdWUgb2YgJ3JlYXNvbicgdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgcmVhc29uLCBuYW1lbHkgZm9yIHdoZW4gcmV2b2tpbmcgdGFsayBwYWdlIGFjY2Vzcz5cblx0ICogICBub2NyZWF0ZTogPGJsb2NrIGFjY291bnQgY3JlYXRpb24gZnJvbSB0aGUgdXNlcidzIElQIChmb3IgYW5vbnltb3VzIHVzZXJzIG9ubHkpPlxuXHQgKiAgIG5vbnN0YW5kYXJkOiA8dGVtcGxhdGUgZG9lcyBub3QgY29uZm9ybSB0byBzdGV3YXJkc2hpcCBvZiBbW2Vud2lraTpXaWtpUHJvamVjdCBVc2VyIFdhcm5pbmdzXV0gYW5kIG1heSBub3QgYWNjZXB0IHN0YW5kYXJkIHBhcmFtZXRlcnM+XG5cdCAqICAgcmVhc29uOiA8c3RyaW5nIC0gYmxvY2sgcmF0aW9uYWxlLCBhcyB3b3VsZCBhcHBlYXIgaW4gdGhlIGJsb2NrIGxvZyxcblx0ICogICAgICAgICAgICBhbmQgdGhlIGVkaXQgc3VtbWFyeSBmb3Igd2hlbiBhZGRpbmcgYmxvY2sgdGVtcGxhdGUsIHVubGVzcyAnc3VtbWFyeScgaXMgc2V0PlxuXHQgKiAgIHJlYXNvblBhcmFtOiA8c2V0IGlmIHRoZSBhc3NvY2lhdGVkIGJsb2NrIHRlbXBsYXRlIGFjY2VwdHMgYSByZWFzb24gcGFyYW1ldGVyPlxuXHQgKiAgIHNpZzogPHN0cmluZyAtIHNldCB0byB+fn5+IGlmIGJsb2NrIHRlbXBsYXRlIGRvZXMgbm90IGFjY2VwdCBcInRydWVcIiBhcyB0aGUgdmFsdWUsIG9yIHNldCBudWxsIHRvIG9taXQgc2lnIHBhcmFtIGFsdG9nZXRoZXI+XG5cdCAqICAgc3VtbWFyeTogPHN0cmluZyAtIGVkaXQgc3VtbWFyeSBmb3Igd2hlbiBhZGRpbmcgYmxvY2sgdGVtcGxhdGUgdG8gdXNlcidzIHRhbGsgcGFnZSwgaWYgbm90IHNldCwgJ3JlYXNvbicgaXMgdXNlZD5cblx0ICogICBzdXBwcmVzc0FydGljbGVJblN1bW1hcnk6IDxzZXQgdG8gc3VwcHJlc3Mgc2hvd2luZyB0aGUgYXJ0aWNsZSBuYW1lIGluIHRoZSBlZGl0IHN1bW1hcnksIGFzIHdpdGggYXR0YWNrIHBhZ2VzPlxuXHQgKiAgIHRlbXBsYXRlTmFtZTogPHN0cmluZyAtIG5hbWUgb2YgdGVtcGxhdGUgdG8gdXNlIChpbnN0ZWFkIG9mIGtleSBuYW1lKSwgZW50cnkgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIFRlbXBsYXRlcyBsaXN0LlxuXHQgKiAgICAgICAgICAgICAgICAgIChlLmcuIHVzZSBhbm90aGVyIHRlbXBsYXRlIGJ1dCB3aXRoIGRpZmZlcmVudCBibG9jayBvcHRpb25zKT5cblx0ICogICB1c2VJbml0aWFsT3B0aW9uczogPHdoZW4gcHJlc2V0IGlzIGNob3Nlbiwgb25seSBjaGFuZ2UgZ2l2ZW4gYmxvY2sgb3B0aW9ucywgbGVhdmUgb3RoZXJzIGFzIHRoZXkgd2VyZT5cblx0ICpcblx0ICogV0FSTklORzogJ2Fub25vbmx5JyBhbmQgJ2FsbG93dXNlcnRhbGsnIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuXG5cdCAqICAgVG8gZGlzYWJsZSwgc2V0ICdoYXJkYmxvY2snIGFuZCAnZGlzYWJsZXRhbGsnLCByZXNwZWN0aXZlbHlcblx0ICovXG5cdFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mbyA9IHtcblx0XHQvLyB1dy1wcmVmaXhlZFxuXHRcdCd1dy1ibG9jayc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJzEgZGF5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCa55+lJywgJ+WwgemOlumAmuefpScpLFxuXHRcdFx0c3VwcHJlc3NBcnRpY2xlSW5TdW1tYXJ5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J3V3LWJsb2NraW5kZWYnOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICdpbmZpbml0eScsXG5cdFx0XHRmb3JSZWdpc3RlcmVkT25seTogdHJ1ZSxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cGFnZVBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uUGFyYW06IHRydWUsXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpScsICflsIHpjpbpgJrnn6UnKSxcblx0XHRcdHN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCd1dy1ibG9ja25vdGFsayc6IHtcblx0XHRcdGRpc2FibGV0YWxrOiB0cnVlLFxuXHRcdFx0cGFnZVBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uUGFyYW06IHRydWUsXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8muemgeatoue8lui+keiuqOiuuumhtScsICflsIHpjpbpgJrnn6XvvJrnpoHmraLnt6jovK/oqI7oq5bpoIEnKSxcblx0XHRcdHN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCd1dy0zYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIGRheScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfov53lj41bW0xJQjozUlJ85Zue6YCA5LiN6L+H5LiJ5Y6f5YiZXV0nLCAn6YGV5Y+NW1tMSUI6M1JSfOWbnumAgOS4jemBjuS4ieWOn+WJh11dJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrov53lj41bW0xJQjozUlJ85Zue6YCA5LiN6L+H5LiJ5Y6f5YiZXV0nLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya6YGV5Y+NW1tMSUI6M1JSfOWbnumAgOS4jemBjuS4ieWOn+WJh11dJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdCd1dy1hZGJsb2NrJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5pWj5Y+RW1tMSUI6U09BUHzmlaPlj5Hlub/lkYrmiJblrqPkvKBdXScsICfmlaPnmbxbW0xJQjpTT0FQfOaVo+eZvOW7o+WRiuaIluWuo+WCs11dJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrmlaPlj5FbW0xJQjpTT0FQfOaVo+WPkeW5v+WRiuaIluWuo+S8oF1dJyxcblx0XHRcdFx0J+WwgemOlumAmuefpe+8muaVo+eZvFtbTElCOlNPQVB85pWj55m85buj5ZGK5oiW5a6j5YKzXV0nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0J3V3LWF0dGFja2Jsb2NrJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J1tbTElCOkNJVnzooYzkuLrml6DnpLxdXeaIlltbTElCOk5QQXzkurrouqvmlLvlh7tdXScsXG5cdFx0XHRcdCdbW0xJQjpDSVZ86KGM54K654Sh56auXV3miJZbW0xJQjpOUEF85Lq66Lqr5pS75pOKXV0nXG5cdFx0XHQpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5bCB56aB6YCa55+l77yaW1tMSUI6Q0lWfOihjOS4uuaXoOekvF1d5oiWW1tMSUI6TlBBfOS6uui6q+aUu+WHu11dJyxcblx0XHRcdFx0J+WwgemOlumAmuefpe+8mltbTElCOkNJVnzooYzngrrnhKHnpq5dXeaIlltbTElCOk5QQXzkurrouqvmlLvmk4pdXSdcblx0XHRcdCksXG5cdFx0fSxcblx0XHQndXctY29weXJpZ2h0YmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICdpbmZpbml0eScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmjIHnu61bW0xJQjpDT1BZVklPfOS+teeKr+iRl+S9nOadg11dJywgJ+aMgee6jFtbTElCOkNPUFlWSU985L6154qv6JGX5L2c5qyKXV0nKSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaMgee7rVtbTElCOkNPUFlWSU985L6154qv6JGX5L2c5p2DXV0nLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya5oyB57qMW1tMSUI6Q09QWVZJT3zkvrXniq/okZfkvZzmrIpdXSdcblx0XHRcdCksXG5cdFx0XHR0ZW1wbGF0ZU5hbWU6ICd1dy1ibG9ja2luZGVmJyxcblx0XHR9LFxuXHRcdCd1dy1kYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmjIHnu61bW0xJQjpWQU585Yig6Zmk5YaF5a65XV0nLCAn5oyB57qMW1tMSUI6VkFOfOWIqumZpOWFp+WuuV1dJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8muaMgee7rVtbTElCOlZBTnzliKDpmaTlhoXlrrldXScsICflsIHpjpbpgJrnn6XvvJrmjIHnuoxbW0xJQjpWQU585Yiq6Zmk5YWn5a65XV0nKSxcblx0XHR9LFxuXHRcdCd1dy1oYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCdbW0xJQjrpqprmibB86aqa5omwXV3lhbbku5bnlKjmiLcnLCAnW1tMSUI66ai35pO+fOmot+aTvl1d5YW25LuW5L2/55So6ICFJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8mltbTElCOumqmuaJsHzpqprmibBdXeWFtuS7lueUqOaItycsICflsIHpjpbpgJrnn6XvvJpbW0xJQjrpqLfmk7586ai35pO+XV3lhbbku5bkvb/nlKjogIUnKSxcblx0XHR9LFxuXHRcdCd1dy12YmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIGRheScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCdbW0xJQjpWQU5856C05Z2PXV0nLCAnW1tMSUI6VkFOfOegtOWjnl1dJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8mltbTElCOlZBTnznoLTlnY9dXScsICflsIHpjpbpgJrnn6XvvJpbW0xJQjpWQU5856C05aOeXV0nKSxcblx0XHR9LFxuXHRcdCd1dy1pbGxlZ2FsYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIGRheScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmjIHnu63liqDlhaXkuI3nrKblkIjkuK3lm73ku7flgLzop4LnmoTpnZ7ms5XlhoXlrrknLCAn5oyB57qM5Yqg5YWl5LiN56ym5ZCI5Lit5ZyL5YO55YC86KeA55qE6Z2e5rOV5YWn5a65JyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrmjIHnu63liqDlhaXkuI3nrKblkIjkuK3lm73ku7flgLzop4LnmoTpnZ7ms5XlhoXlrrknLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya5oyB57qM5Yqg5YWl5LiN56ym5ZCI5Lit5ZyL5YO55YC86KeA55qE6Z2e5rOV5YWn5a65J1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdCd1dy1zb2NrYmxvY2snOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIHdlZWsnLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmu6XnlKhbW0xJQjpTT0NLfOWkmuS4qui0puWPt11dJywgJ+a/q+eUqFtbTElCOlNPQ0t85aSa5YCL6LOs6JmfXV0nKSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCa55+l77ya5rul55SoW1tMSUI6U09DS3zlpJrkuKrotKblj7ddXScsICflsIHpjpbpgJrnn6XvvJrmv6vnlKhbW0xJQjpTT0NLfOWkmuWAi+izrOiZn11dJyksXG5cdFx0XHR0ZW1wbGF0ZU5hbWU6ICd1dy1ibG9jaycsXG5cdFx0fSxcblx0XHQvLyB1dy11LXByZWZpeGVkXG5cdFx0J3V3LXVibG9jayc6IHtcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0cmVhc29uOiBge3t1dy11YmxvY2t9fTwhLS0gJHt3aW5kb3cud2dVTFMoJ+S4jeW9k+eUqOaIt+WQjeOAgei9r+WwgeemgScsICfkuI3nlbbkvb/nlKjogIXlkI3nqLEnKX0gLS0+YCxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOeahOeUqOaIt+WQjei/neWPjVtbTElCOlV855So5oi35ZCN5p2h5L6LXV0nLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya5oKo55qE5L2/55So6ICF5ZCN56ix6YGV5Y+NW1tMSUI6VXzkvb/nlKjogIXlkI3nqLHmop3kvotdXSdcblx0XHRcdCksXG5cdFx0fSxcblx0XHQndXctdWJsb2NrLWlsbGVnYWwnOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICdpbmZpbml0eScsXG5cdFx0XHRmb3JSZWdpc3RlcmVkT25seTogdHJ1ZSxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cmVhc29uOiBge3t1dy11YmxvY2staWxsZWdhbH19PCEtLSAke3dpbmRvdy53Z1VMUygn5LiN5ZCI6KeE55qE55So5oi35ZCNJywgJ+S4jeWQiOimj+eahOS9v+eUqOiAheWQjeeosScpfSAtLT5gLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5bCB56aB6YCa55+l77ya5oKo55qE55So5oi35ZCN6L+d5Y+NW1tMSUI6VXznlKjmiLflkI3mnaHkvotdXScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrmgqjnmoTkvb/nlKjogIXlkI3nqLHpgZXlj41bW0xJQjpVfOS9v+eUqOiAheWQjeeoseaineS+i11dJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdCd1dy11YmxvY2stc3VnZ2VzdGl2ZSc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRyZWFzb246IGB7e3V3LXVibG9jay1zdWdnZXN0aXZlfX08IS0tICR7d2luZG93LndnVUxTKCfor6/lr7zjgIHmt7fmt4bmgKfnlKjmiLflkI0nLCAn6Kqk5bCO44CB5re35reG5oCn5L2/55So6ICF5ZCN56ixJyl9IC0tPmAsXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrmgqjnmoTnlKjmiLflkI3ov53lj41bW0xJQjpVfOeUqOaIt+WQjeadoeS+i11dJyxcblx0XHRcdFx0J+WwgemOlumAmuefpe+8muaCqOeahOS9v+eUqOiAheWQjeeosemBleWPjVtbTElCOlV85L2/55So6ICF5ZCN56ix5qKd5L6LXV0nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0J3V3LXVibG9jay1zcGFtJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogYHt7dXctdWJsb2NrLXNwYW19fTwhLS0gJHt3aW5kb3cud2dVTFMoJ+Wuo+S8oOaAp+eUqOaIt+WQjeaIluWuo+S8oOaAp+e8lui+kScsICflrqPlgrPmgKfkvb/nlKjogIXlkI3nqLHmiJblrqPlgrPmgKfnt6jovK8nKX0gLS0+YCxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOeahOeUqOaIt+WQjei/neWPjVtbTElCOlV855So5oi35ZCN5p2h5L6LXV0nLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya5oKo55qE5L2/55So6ICF5ZCN56ix6YGV5Y+NW1tMSUI6VXzkvb/nlKjogIXlkI3nqLHmop3kvotdXSdcblx0XHRcdCksXG5cdFx0fSxcblx0XHQvLyBvdGhlciBibG9jayB0ZW1wbGF0ZXNcblx0XHQncmFuZ2UgYmxvY2snOiB7XG5cdFx0XHRleHBpcnk6ICcxIHdlZWsnLFxuXHRcdFx0cmVhc29uOiAne3tyYW5nZSBibG9ja319Jyxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0bm9uc3RhbmRhcmQ6IHRydWUsXG5cdFx0XHRmb3JBbm9uT25seTogdHJ1ZSxcblx0XHRcdHNpZzogJ35+Jy5jb25jYXQoJ35+JyksXG5cdFx0fSxcblx0XHQnYmxvY2tlZCBwcm94eSc6IHtcblx0XHRcdGV4cGlyeTogJzIgeWVhcnMnLFxuXHRcdFx0Zm9yQW5vbk9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdG5vbnN0YW5kYXJkOiB0cnVlLFxuXHRcdFx0aGFyZGJsb2NrOiB0cnVlLFxuXHRcdFx0cmVhc29uOiAne3tibG9ja2VkIHByb3h5fX0nLFxuXHRcdFx0c2lnOiBudWxsLFxuXHRcdH0sXG5cdFx0Y2hlY2t1c2VyYmxvY2s6IHtcblx0XHRcdGV4cGlyeTogJzEgd2VlaycsXG5cdFx0XHRmb3JBbm9uT25seTogdHJ1ZSxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0bm9uc3RhbmRhcmQ6IHRydWUsXG5cdFx0XHRyZWFzb246ICd7e2NoZWNrdXNlcmJsb2NrfX0nLFxuXHRcdFx0c2lnOiAnfn4nLmNvbmNhdCgnfn4nKSxcblx0XHR9LFxuXHRcdCdjaGVja3VzZXJibG9jay1hY2NvdW50Jzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdG5vbnN0YW5kYXJkOiB0cnVlLFxuXHRcdFx0cmVhc29uOiAne3tjaGVja3VzZXJibG9jay1hY2NvdW50fX0nLFxuXHRcdFx0c2lnOiAnfn4nLmNvbmNhdCgnfn4nKSxcblx0XHR9LFxuXHRcdCdzY2hvb2wgYmxvY2snOiB7XG5cdFx0XHRleHBpcnk6ICcxIHdlZWsnLFxuXHRcdFx0Zm9yQW5vbk9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdG5vbnN0YW5kYXJkOiB0cnVlLFxuXHRcdFx0cmVhc29uOiAne3tzY2hvb2wgYmxvY2t9fScsXG5cdFx0XHRzaWc6ICd+ficuY29uY2F0KCd+ficpLFxuXHRcdH0sXG5cdFx0J0JvdCBibG9jayBtZXNzYWdlJzoge1xuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5py65Zmo5Lq65pWF6ZqcJywgJ+apn+WZqOS6uuaVhemanCcpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCflsIHnpoHpgJrnn6XvvJrmnLrlmajkurrmlYXpmpwnLCAn5bCB6Y6W6YCa55+l77ya5qmf5Zmo5Lq65pWF6ZqcJyksXG5cdFx0XHRzaWc6ICd+ficuY29uY2F0KCd+ficpLFxuXHRcdH0sXG5cdFx0Ly8gb3RoZXIgYmxvY2sgcmVhc29uc1xuXHRcdGJpb2Jsb2NrOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIGRheScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfov53lj43nlJ/ogIXkvKDorrDmnaHkvosnLCAn6YGV5Y+N55Sf6ICF5YKz6KiY5qKd5L6LJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8mui/neWPjeeUn+iAheS8oOiusOadoeS+iycsICflsIHpjpbpgJrnn6XvvJrpgZXlj43nlJ/ogIXlgrPoqJjmop3kvosnKSxcblx0XHRcdHRlbXBsYXRlTmFtZTogJ3V3LXZibG9jaycsXG5cdFx0fSxcblx0XHR1Y2Jsb2NrOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICcxIGRheScsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHBhZ2VQYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCflsaHmrKHlop7liqDmsqHmnIlbW0xJQjpSU3zlj6/pnaDmnaXmupBdXeeahOi1hOaWmScsICflsaLmrKHlop7liqDmspLmnIlbW0xJQjpSU3zlj6/pnaDkvobmupBdXeeahOizh+aWmScpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5bCB56aB6YCa55+l77ya5bGh5qyh5aKe5Yqg5rKh5pyJW1tMSUI6UlN85Y+v6Z2g5p2l5rqQXV3nmoTotYTmlpknLFxuXHRcdFx0XHQn5bCB6Y6W6YCa55+l77ya5bGi5qyh5aKe5Yqg5rKS5pyJW1tMSUI6UlN85Y+v6Z2g5L6G5rqQXV3nmoTos4fmlpknXG5cdFx0XHQpLFxuXHRcdFx0dGVtcGxhdGVOYW1lOiAndXctYmxvY2snLFxuXHRcdH0sXG5cdFx0bnBibG9jazoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5Zyo5p2h55uu5Lit5aKe5Yqg5peg5oSP5LmJ5paH5a2XJywgJ+WcqOaineebruS4reWinuWKoOeEoeaEj+e+qeaWh+WtlycpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKCflsIHnpoHpgJrnn6XvvJrlnKjmnaHnm67kuK3lop7liqDml6DmhI/kuYnmloflrZcnLCAn5bCB6Y6W6YCa55+l77ya5Zyo5qKd55uu5Lit5aKe5Yqg54Sh5oSP576p5paH5a2XJyksXG5cdFx0XHR0ZW1wbGF0ZU5hbWU6ICd1dy12YmxvY2snLFxuXHRcdH0sXG5cdFx0J3BvaW50LWJsb2NrJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnMSBkYXknLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRwYWdlUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmjIHnu63miZPliLbluqbmk6bovrnnkIMnLCAn5oyB57qM5omT5Yi25bqm5pOm6YKK55CDJyksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoJ+WwgeemgemAmuefpe+8muaMgee7reaJk+WItuW6puaTpui+ueeQgycsICflsIHpjpbpgJrnn6XvvJrmjIHnuozmiZPliLbluqbmk6bpgornkIMnKSxcblx0XHRcdHRlbXBsYXRlTmFtZTogJ3V3LWJsb2NrJyxcblx0XHR9LFxuXHRcdCdzb2NrLWNvbnRyaWJzJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRub2NyZWF0ZTogdHJ1ZSxcblx0XHRcdHJlYXNvblBhcmFtOiB0cnVlLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCfnoa7orqTkuLpbW0xJQjpTT0NLfOWCgOWEoV1d5oiW55yf5Lq65YKA5YShIC0g5qC55o2u55So5oi36LSh54yu56Gu5a6aJyxcblx0XHRcdFx0J+eiuuiqjeeCultbTElCOlNPQ0t85YKA5YShXV3miJbnnJ/kurrlgoDlhKEgLSDmoLnmk5rkvb/nlKjogIXosqLnjbvnorrlrponXG5cdFx0XHQpLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5bCB56aB6YCa55+l77ya56Gu6K6k5Li6W1tMSUI6U09DS3zlgoDlhKFdXeaIluecn+S6uuWCgOWEoScsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrnorroqo3ngrpbW0xJQjpTT0NLfOWCgOWEoV1d5oiW55yf5Lq65YKA5YShJ1xuXHRcdFx0KSxcblx0XHRcdHRlbXBsYXRlTmFtZTogJ3V3LWJsb2NraW5kZWYnLFxuXHRcdH0sXG5cdFx0J3NvY2stY3UnOiB7XG5cdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRleHBpcnk6ICdpbmZpbml0eScsXG5cdFx0XHRmb3JSZWdpc3RlcmVkT25seTogdHJ1ZSxcblx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0cmVhc29uUGFyYW06IHRydWUsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+ehruiupOS4ultbTElCOlNPQ0t85YKA5YShXV3miJbnnJ/kurrlgoDlhKEgLSDnlKjmiLfmn6XmoLjnoa7orqQnLFxuXHRcdFx0XHQn56K66KqN54K6W1tMSUI6U09DS3zlgoDlhKFdXeaIluecn+S6uuWCgOWEoSAtIOS9v+eUqOiAheafpeaguOeiuuiqjSdcblx0XHRcdCksXG5cdFx0XHRzdW1tYXJ5OiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCflsIHnpoHpgJrnn6XvvJrnoa7orqTkuLpbW0xJQjpTT0NLfOWCgOWEoV1d5oiW55yf5Lq65YKA5YShJyxcblx0XHRcdFx0J+WwgemOlumAmuefpe+8mueiuuiqjeeCultbTElCOlNPQ0t85YKA5YShXV3miJbnnJ/kurrlgoDlhKEnXG5cdFx0XHQpLFxuXHRcdFx0dGVtcGxhdGVOYW1lOiAndXctYmxvY2tpbmRlZicsXG5cdFx0fSxcblx0XHQndXctdWJsb2NrLWF0dGFjayc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdGZvclJlZ2lzdGVyZWRPbmx5OiB0cnVlLFxuXHRcdFx0bm9jcmVhdGU6IHRydWUsXG5cdFx0XHRyZWFzb246IGB7e3V3LXVibG9jay1hdHRhY2t9fTwhLS0gJHt3aW5kb3cud2dVTFMoJ+aUu+WHu+aAp+eUqOaIt+WQjScsICfmlLvmk4rmgKfkvb/nlKjogIXlkI3nqLEnKX0gLS0+YCxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUygn5bCB56aB6YCa55+l77ya5pS75Ye75oCn55So5oi35ZCNJywgJ+WwgemOlumAmuefpe+8muaUu+aTiuaAp+S9v+eUqOiAheWQjeeosScpLFxuXHRcdH0sXG5cdFx0Ly8gQmVnaW4gcGFydGlhbCBibG9jayB0ZW1wbGF0ZXMsIGFjY2Vzc2VkIGluIFR3aW5rbGUuYmxvY2suYmxvY2tHcm91cHNQYXJ0aWFsXG5cdFx0J3V3LXBibG9jayc6IHtcblx0XHRcdGF1dG9ibG9jazogdHJ1ZSxcblx0XHRcdGV4cGlyeTogJzEgZGF5Jyxcblx0XHRcdG5vY3JlYXRlOiBmYWxzZSxcblx0XHRcdHBhZ2VQYXJhbTogZmFsc2UsXG5cdFx0XHRyZWFzb25QYXJhbTogdHJ1ZSxcblx0XHRcdHN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+WwgeemgemAmuefpe+8muaCqOW3suiiq+emgeatoue8lui+keacieWFveaho+ahiOmmhueahOmDqOWIhuWMuuWfnycsXG5cdFx0XHRcdCflsIHpjpbpgJrnn6XvvJrmgqjlt7LooqvnpoHmraLnt6jovK/mnInnjbjmqpTmoYjppKjnmoTpg6jliIbljYDln58nXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0J3V3LXBibG9ja2luZGVmJzoge1xuXHRcdFx0YXV0b2Jsb2NrOiB0cnVlLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0bm9jcmVhdGU6IGZhbHNlLFxuXHRcdFx0cGFnZVBhcmFtOiBmYWxzZSxcblx0XHRcdHJlYXNvblBhcmFtOiB0cnVlLFxuXHRcdFx0c3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5bCB56aB6YCa55+l77ya5oKo5bey6KKr5rC45LmF56aB5q2i57yW6L6R5pyJ5YW95qGj5qGI6aaG55qE6YOo5YiG5Yy65Z+fJyxcblx0XHRcdFx0J+WwgemOlumAmuefpe+8muaCqOW3suiiq+awuOS5heemgeatoue3qOi8r+acieeNuOaqlOahiOmkqOeahOmDqOWIhuWNgOWfnydcblx0XHRcdCksXG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5ibG9jay50cmFuc2Zvcm1CbG9ja1ByZXNldHMgPSAoKSA9PiB7XG5cdFx0Ly8gTWVyZ2UgY3VzdG9tIHJlYXNvblxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiBUd2lua2xlLmdldFByZWYoJ2N1c3RvbUJsb2NrUmVhc29uTGlzdCcpKSB7XG5cdFx0XHRjb25zdCBuZXdLZXkgPSBgJHtpdGVtLnZhbHVlfXwke2l0ZW0ubGFiZWx9YDtcblx0XHRcdFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mb1tuZXdLZXldID0ge1xuXHRcdFx0XHRhdXRvYmxvY2s6IHRydWUsXG5cdFx0XHRcdG5vY3JlYXRlOiB0cnVlLFxuXHRcdFx0XHQuLi5Ud2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9baXRlbS52YWx1ZV0sXG5cdFx0XHRcdHJlYXNvbjogaXRlbS5sYWJlbCxcblx0XHRcdFx0dGVtcGxhdGVOYW1lOiBpdGVtLnZhbHVlLFxuXHRcdFx0fTtcblx0XHRcdGlmIChUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9baXRlbS52YWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9baXRlbS52YWx1ZV0gPSB7XG5cdFx0XHRcdFx0cGFnZVBhcmFtOiB0cnVlLFxuXHRcdFx0XHRcdHJlYXNvblBhcmFtOiB0cnVlLFxuXHRcdFx0XHRcdGN1c3RvbTogdHJ1ZSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gc3VwcGx5IHNlbnNpYmxlIGRlZmF1bHRzXG5cdFx0Zm9yIChjb25zdCBbcHJlc2V0LCBzZXR0aW5nc10gb2YgT2JqZWN0LmVudHJpZXMoVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvKSkge1xuXHRcdFx0c2V0dGluZ3Muc3VtbWFyeSB8fD0gc2V0dGluZ3MucmVhc29uO1xuXHRcdFx0c2V0dGluZ3Muc2lnID0gc2V0dGluZ3Muc2lnID09PSB1bmRlZmluZWQgPyAneWVzJyA6IHNldHRpbmdzLnNpZztcblx0XHRcdHNldHRpbmdzLmluZGVmaW5pdGUgfHw9IE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHNldHRpbmdzLmV4cGlyeSk7XG5cdFx0XHRpZiAoIVR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkICYmIHNldHRpbmdzLmluZGVmaW5pdGUpIHtcblx0XHRcdFx0c2V0dGluZ3MuZXhwaXJ5ID0gJzEgZGF5Jztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNldHRpbmdzLmV4cGlyeSB8fD0gJzEgZGF5Jztcblx0XHRcdH1cblx0XHRcdFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mb1twcmVzZXRdID0gc2V0dGluZ3M7XG5cdFx0fVxuXHR9O1xuXHQvLyBUaGVzZSBhcmUgdGhlIGdyb3VwcyBvZiBwcmVzZXRzIGFuZCBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhci4gRm9yIGVhY2ggbGlzdCBpdGVtOlxuXHQvLyAgIGxhYmVsOiA8c3RyaW5nLCB0aGUgZGVzY3JpcHRpb24gdGhhdCB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGRyb3Bkb3duPlxuXHQvLyAgIHZhbHVlOiA8c3RyaW5nLCB0aGUga2V5IG9mIGEgcHJlc2V0IGluIGJsb2NrUHJlc2V0c0luZm8+XG5cdC8vICAgbWV0YTogPGJvb2xlYW4sIHNob3cgaW4gdGVtcGxhdGVzIG9ubHk+XG5cdFR3aW5rbGUuYmxvY2suYmxvY2tHcm91cHMgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pmu6YCa5bCB56aBJywgJ+aZrumAmuWwgemOlicpLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCa55So5bCB56aB77yI6Ieq5a6a5LmJ55CG55Sx77yJJywgJ+mAmueUqOWwgemOlu+8iOiHquiogueQhueUse+8iScpLCB2YWx1ZTogJ3V3LWJsb2NrJ30sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfml6DpmZDmnJ/lsIHnpoHvvIjoh6rlrprkuYnnkIbnlLHvvIknLCAn54Sh6ZmQ5pyf5bCB6Y6W77yI6Ieq6KiC55CG55Sx77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1dy1ibG9ja2luZGVmJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+emgeatoue8lui+keiuqOiuuumhtScsICfnpoHmraLnt6jovK/oqI7oq5bpoIEnKSwgdmFsdWU6ICd1dy1ibG9ja25vdGFsaycsIG1ldGE6IHRydWV9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn6L+d5Y+N5Zue6YCA5LiN6L+H5LiJ5Y6f5YiZJywgJ+mBleWPjeWbnumAgOS4jemBjuS4ieWOn+WJhycpLCB2YWx1ZTogJ3V3LTNibG9jayd9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn5pWj5Y+R5bm/5ZGK5oiW5a6j5LygJywgJ+aVo+eZvOW7o+WRiuaIluWuo+WCsycpLCB2YWx1ZTogJ3V3LWFkYmxvY2snfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+ihjOS4uuaXoOekvOaIluS6uui6q+aUu+WHuycsICfooYzngrrnhKHnpq7miJbkurrouqvmlLvmk4onKSwgdmFsdWU6ICd1dy1hdHRhY2tibG9jayd9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5aSa5qyh5Yqg5YWl5L6154qv6JGX5L2c5p2D55qE5YaF5a65JywgJ+WkmuasoeWKoOWFpeS+teeKr+iRl+S9nOasiueahOWFp+WuuScpLFxuXHRcdFx0XHRcdHZhbHVlOiAndXctY29weXJpZ2h0YmxvY2snLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn5peg5pWF5Yig6Zmk5YaF5a65JywgJ+eEoeaVheWIqumZpOWFp+WuuScpLCB2YWx1ZTogJ3V3LWRibG9jayd9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn6aqa5omw55So5oi3JywgJ+mot+aTvuS9v+eUqOiAhScpLCB2YWx1ZTogJ3V3LWhibG9jayd9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn56C05Z2PJywgJ+egtOWjnicpLCB2YWx1ZTogJ3V3LXZibG9jaycsIHNlbGVjdGVkOiB0cnVlfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aMgee7reWKoOWFpeS4jeespuWQiOS4reWbveS7t+WAvOingueahOmdnuazleWGheWuuScsICfmjIHnuozliqDlhaXkuI3nrKblkIjkuK3lnIvlg7nlgLzop4DnmoTpnZ7ms5XlhaflrrknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3V3LWlsbGVnYWxibG9jaycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCfmu6XnlKjlpJrkuKrotKblj7cnLCAn5r+r55So5aSa5YCL6LOs6JmfJyksIHZhbHVlOiAndXctc29ja2Jsb2NrJ30sXG5cdFx0XHRcdC8vIG90aGVyIGJsb2NrIHJlYXNvbnNcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+i/neWPjeeUn+iAheS8oOiusOadoeS+iycsICfpgZXlj43nlJ/ogIXlgrPoqJjmop3kvosnKSwgdmFsdWU6ICdiaW9ibG9jayd9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn5bGh5qyh5aKe5Yqg5rKh5pyJ5Y+v6Z2g5p2l5rqQ55qE6LWE5paZJywgJ+WxouasoeWinuWKoOaykuacieWPr+mdoOS+hua6kOeahOizh+aWmScpLCB2YWx1ZTogJ3VjYmxvY2snfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOadoeebruS4reWinuWKoOaXoOaEj+S5ieaWh+WtlycsICflnKjmop3nm67kuK3lop7liqDnhKHmhI/nvqnmloflrZcnKSwgdmFsdWU6ICducGJsb2NrJ30sXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCfmjIHnu63miZPliLbluqbmk6bovrnnkIMnLCAn5oyB57qM5omT5Yi25bqm5pOm6YKK55CDJyksIHZhbHVlOiAncG9pbnQtYmxvY2snfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn56Gu6K6k5Li65YKA5YSh5oiW55yf5Lq65YKA5YSh77yI5qC55o2u55So5oi36LSh54yu56Gu5a6a77yJJyxcblx0XHRcdFx0XHRcdCfnorroqo3ngrrlgoDlhKHmiJbnnJ/kurrlgoDlhKHvvIjmoLnmk5rkvb/nlKjogIXosqLnjbvnorrlrprvvIknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogJ3NvY2stY29udHJpYnMnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfnoa7orqTkuLrlgoDlhKHmiJbnnJ/kurrlgoDlhKHvvIjnlKjmiLfmn6XmoLjnoa7orqTvvIknLFxuXHRcdFx0XHRcdFx0J+eiuuiqjeeCuuWCgOWEoeaIluecn+S6uuWCgOWEoe+8iOS9v+eUqOiAheafpeaguOeiuuiqje+8iSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiAnc29jay1jdScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmnLrlmajkurrlj5HnlJ/mlYXpmpzlubblv4XpobvntKfmgKXlgZzmraInLCAn5qmf5Zmo5Lq655m855Sf5pWF6Zqc5Lim5b+F6aCI57eK5oCl5YGc5q2iJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdCb3QgYmxvY2sgbWVzc2FnZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y3VzdG9tOiB0cnVlLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5bCB56aB55CG55SxJywgJ+iHquioguWwgemOlueQhueUsScpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5oi35ZCN5bCB56aBJywgJ+S9v+eUqOiAheWQjeeoseWwgemOlicpLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn6L+d5Y+N55So5oi35ZCN5p2h5L6LJywgJ+mBleWPjeS9v+eUqOiAheWQjeeoseaineS+iycpLCB2YWx1ZTogJ3V3LXVibG9jayd9LFxuXHRcdFx0XHR7bGFiZWw6IHdpbmRvdy53Z1VMUygn5LiN5ZCI6KeE55qE55So5oi35ZCNJywgJ+S4jeWQiOimj+eahOS9v+eUqOiAheWQjeeosScpLCB2YWx1ZTogJ3V3LXVibG9jay1pbGxlZ2FsJ30sXG5cdFx0XHRcdHtsYWJlbDogd2luZG93LndnVUxTKCflrqPkvKDmgKfnlKjmiLflkI0nLCAn5a6j5YKz5oCn5L2/55So6ICF5ZCN56ixJyksIHZhbHVlOiAndXctdWJsb2NrLXNwYW0nfSxcblx0XHRcdFx0e2xhYmVsOiB3aW5kb3cud2dVTFMoJ+aUu+WHu+aAp+eUqOaIt+WQjScsICfmlLvmk4rmgKfkvb/nlKjogIXlkI3nqLEnKSwgdmFsdWU6ICd1dy11YmxvY2stYXR0YWNrJ30sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmt7fmt4bmgKfmiJbor6/lr7zmgKfnlKjmiLflkI0nLCAn5re35reG5oCn5oiW6Kqk5bCO5oCn5L2/55So6ICF5ZCN56ixJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1dy11YmxvY2stc3VnZ2VzdGl2ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICflhbbku5bmqKHmnb8nLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7bGFiZWw6ICdyYW5nZSBibG9jaycsIHZhbHVlOiAncmFuZ2UgYmxvY2snLCBmb3JBbm9uT25seTogdHJ1ZX0sXG5cdFx0XHRcdHtsYWJlbDogJ3NjaG9vbCBibG9jaycsIHZhbHVlOiAnc2Nob29sIGJsb2NrJywgZm9yQW5vbk9ubHk6IHRydWV9LFxuXHRcdFx0XHR7bGFiZWw6ICdibG9ja2VkIHByb3h5JywgdmFsdWU6ICdibG9ja2VkIHByb3h5JywgZm9yQW5vbk9ubHk6IHRydWV9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5oi35p+l5qC45bCB56aB77yI5Li755So5oi377yJJywgJ+S9v+eUqOiAheafpeaguOWwgemOlu+8iOS4u+S9v+eUqOiAhe+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnY2hlY2t1c2VyYmxvY2snLFxuXHRcdFx0XHRcdGZvckFub25Pbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5oi35p+l5qC45bCB56aB77yI5a2Q55So5oi377yJJywgJ+S9v+eUqOiAheafpeaguOWwgemOlu+8iOWtkOS9v+eUqOiAhe+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnY2hlY2t1c2VyYmxvY2stYWNjb3VudCcsXG5cdFx0XHRcdFx0Zm9yUmVnaXN0ZXJlZE9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuYmxvY2suYmxvY2tHcm91cHNQYXJ0aWFsID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W4uOingemDqOWIhuWwgeemgeeQhueUsScsICfluLjopovpg6jliIblsIHpjpbnkIbnlLEnKSxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAmueUqOmDqOWIhuWwgeemge+8iOiHquWumuS5ieeQhueUse+8iScsICfpgJrnlKjpg6jliIblsIHpjpbvvIjoh6roqILnkIbnlLHvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3V3LXBibG9jaycsXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfml6DpmZDmnJ/pg6jliIblsIHnpoHvvIjoh6rlrprkuYnnkIbnlLHvvIknLCAn54Sh6ZmQ5pyf6YOo5YiG5bCB6Y6W77yI6Ieq6KiC55CG55Sx77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1dy1wYmxvY2tpbmRlZicsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suZmlsdGVyZWRfYmxvY2tfZ3JvdXBzID0gKGdyb3VwLCBzaG93X3RlbXBsYXRlKSA9PiB7XG5cdFx0cmV0dXJuICQubWFwKGdyb3VwLCAoYmxvY2tHcm91cCkgPT4ge1xuXHRcdFx0Ly8gQWRkIGN1c3RvbSByZWFzb25cblx0XHRcdGlmIChibG9ja0dyb3VwLmN1c3RvbSkge1xuXHRcdFx0XHRpZiAoc2hvd190ZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGxldCB0ZW1wbGF0ZXMgPSAkLm1hcChUd2lua2xlLmdldFByZWYoJ2N1c3RvbUJsb2NrUmVhc29uTGlzdCcpLCAoaXRlbSkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mb1tpdGVtLnZhbHVlXS5jdXN0b20pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0udmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGVtcGxhdGVzID0gTW9yZWJpdHMuYXJyYXkudW5pcSh0ZW1wbGF0ZXMpO1xuXHRcdFx0XHRcdGJsb2NrR3JvdXAubGlzdCA9ICQubWFwKHRlbXBsYXRlcywgKHRlbXBsYXRlKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnmqKHmnb8nLCAn6Ieq6KiC5qih5p2/JyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB0ZW1wbGF0ZSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YmxvY2tHcm91cC5saXN0ID0gJC5tYXAoVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21CbG9ja1JlYXNvbkxpc3QnKSwgKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBpdGVtLmxhYmVsLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogYCR7aXRlbS52YWx1ZX18JHtpdGVtLmxhYmVsfWAsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBsaXN0ID0gJC5tYXAoYmxvY2tHcm91cC5saXN0LCAoYmxvY2tQcmVzZXQpID0+IHtcblx0XHRcdFx0aWYgKCFzaG93X3RlbXBsYXRlICYmIGJsb2NrUHJlc2V0Lm1ldGEpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c3dpdGNoIChibG9ja1ByZXNldC52YWx1ZSkge1xuXHRcdFx0XHRcdGNhc2UgJ3JhbmdlIGJsb2NrJzpcblx0XHRcdFx0XHRcdGlmICghTW9yZWJpdHMuaXAuaXNSYW5nZShyZWxldmFudFVzZXJOYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRibG9ja1ByZXNldC5zZWxlY3RlZCA9ICFNb3JlYml0cy5pcC5nZXQ2NChyZWxldmFudFVzZXJOYW1lKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBibG9ja1NldHRpbmdzID0gVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2Jsb2NrUHJlc2V0LnZhbHVlXTtcblx0XHRcdFx0bGV0IHJlZ2lzdHJhdGlvblJlc3RyaWN0O1xuXHRcdFx0XHRpZiAoYmxvY2tTZXR0aW5ncy5mb3JSZWdpc3RlcmVkT25seSkge1xuXHRcdFx0XHRcdHJlZ2lzdHJhdGlvblJlc3RyaWN0ID0gVHdpbmtsZS5ibG9jay5pc1JlZ2lzdGVyZWQ7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2tTZXR0aW5ncy5mb3JBbm9uT25seSkge1xuXHRcdFx0XHRcdHJlZ2lzdHJhdGlvblJlc3RyaWN0ID0gIVR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlZ2lzdHJhdGlvblJlc3RyaWN0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIShibG9ja1NldHRpbmdzLnRlbXBsYXRlTmFtZSAmJiBzaG93X3RlbXBsYXRlKSAmJiByZWdpc3RyYXRpb25SZXN0cmljdCkge1xuXHRcdFx0XHRcdGNvbnN0IHRlbXBsYXRlTmFtZSA9IGJsb2NrU2V0dGluZ3MudGVtcGxhdGVOYW1lIHx8IGJsb2NrUHJlc2V0LnZhbHVlO1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRsYWJlbDogKHNob3dfdGVtcGxhdGUgPyBge3ske3RlbXBsYXRlTmFtZX19fTogYCA6ICcnKSArIGJsb2NrUHJlc2V0LmxhYmVsLFxuXHRcdFx0XHRcdFx0dmFsdWU6IGJsb2NrUHJlc2V0LnZhbHVlLFxuXHRcdFx0XHRcdFx0ZGF0YTogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogJ3RlbXBsYXRlLW5hbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB0ZW1wbGF0ZU5hbWUsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWQ6ICEhYmxvY2tQcmVzZXQuc2VsZWN0ZWQsXG5cdFx0XHRcdFx0XHRkaXNhYmxlZDogISFibG9ja1ByZXNldC5kaXNhYmxlZCxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChsaXN0Lmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGxhYmVsOiBibG9ja0dyb3VwLmxhYmVsLFxuXHRcdFx0XHRcdGxpc3QsXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suY2hhbmdlX3ByZXNldCA9IChlKSA9PiB7XG5cdFx0Y29uc3Qge2Zvcm19ID0gZS50YXJnZXQ7XG5cdFx0Y29uc3Qga2V5ID0gZm9ybS5wcmVzZXQudmFsdWU7XG5cdFx0aWYgKCFrZXkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay51cGRhdGVfZm9ybShlLCBUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9ba2V5XSk7XG5cdFx0aWYgKGZvcm0udGVtcGxhdGUpIHtcblx0XHRcdGZvcm0udGVtcGxhdGUudmFsdWUgPSBUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9ba2V5XS50ZW1wbGF0ZU5hbWUgfHwga2V5O1xuXHRcdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfdGVtcGxhdGUoZSk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNoYW5nZV9leHBpcnkgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHtleHBpcnl9ID0gZS50YXJnZXQuZm9ybTtcblx0XHRpZiAoZS50YXJnZXQudmFsdWUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZXhwaXJ5LnBhcmVudE5vZGUsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZXhwaXJ5LnBhcmVudE5vZGUsIGZhbHNlKTtcblx0XHRcdGV4cGlyeS52YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5zZWVBbHNvcyA9IFtdO1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLnRvZ2dsZV9zZWVfYWxzb3MgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgcmVhc29uID0gdGhpcy5mb3JtLnJlYXNvbi52YWx1ZS5yZXBsYWNlKFxuXHRcdFx0bmV3IFJlZ0V4cChgKDwhLS0gKSjlj4Lop4F85Y+D6KaLKSR7VHdpbmtsZS5ibG9jay5zZWVBbHNvcy5qb2luKCfjgIEnKX0oIC0tPilgKSxcblx0XHRcdCcnXG5cdFx0KTtcblx0XHRUd2lua2xlLmJsb2NrLnNlZUFsc29zID0gVHdpbmtsZS5ibG9jay5zZWVBbHNvcy5maWx0ZXIoKGVsKSA9PiB7XG5cdFx0XHRyZXR1cm4gZWwgIT09IHRoaXMudmFsdWU7XG5cdFx0fSk7XG5cdFx0aWYgKHRoaXMuY2hlY2tlZCkge1xuXHRcdFx0VHdpbmtsZS5ibG9jay5zZWVBbHNvcy5wdXNoKHRoaXMudmFsdWUpO1xuXHRcdH1cblx0XHRjb25zdCBzZWVBbHNvTWVzc2FnZSA9IFR3aW5rbGUuYmxvY2suc2VlQWxzb3Muam9pbign44CBJyk7XG5cdFx0aWYgKFR3aW5rbGUuYmxvY2suc2VlQWxzb3MubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmZvcm0ucmVhc29uLnZhbHVlID0gYCR7cmVhc29ufTwhLS0gJHt3aW5kb3cud2dVTFMoJ+WPguingScsICflj4PoposnKX0ke3NlZUFsc29NZXNzYWdlfSAtLT5gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmZvcm0ucmVhc29uLnZhbHVlID0gcmVhc29uO1xuXHRcdH1cblx0fTtcblx0Ly8gTm8gZHNcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay51cGRhdGVfZm9ybSA9IChlLCBkYXRhKSA9PiB7XG5cdFx0Y29uc3Qge2Zvcm19ID0gZS50YXJnZXQ7XG5cdFx0bGV0IHtleHBpcnl9ID0gZGF0YTtcblx0XHQvLyBkb24ndCBvdmVycmlkZSBvcmlnaW5hbCBleHBpcnkgaWYgdXNlSW5pdGlhbE9wdGlvbnMgaXMgc2V0XG5cdFx0aWYgKCFkYXRhLnVzZUluaXRpYWxPcHRpb25zKSB7XG5cdFx0XHRpZiAoRGF0ZS5wYXJzZShleHBpcnkpKSB7XG5cdFx0XHRcdGV4cGlyeSA9IG5ldyBEYXRlKGV4cGlyeSkudG9HTVRTdHJpbmcoKTtcblx0XHRcdFx0Zm9ybS5leHBpcnlfcHJlc2V0LnZhbHVlID0gJ2N1c3RvbSc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3JtLmV4cGlyeV9wcmVzZXQudmFsdWUgPSBkYXRhLmV4cGlyeSB8fCAnY3VzdG9tJztcblx0XHRcdH1cblx0XHRcdGZvcm0uZXhwaXJ5LnZhbHVlID0gZXhwaXJ5O1xuXHRcdFx0aWYgKGZvcm0uZXhwaXJ5X3ByZXNldC52YWx1ZSA9PT0gJ2N1c3RvbScpIHtcblx0XHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGZvcm0uZXhwaXJ5LnBhcmVudE5vZGUsIHRydWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGZvcm0uZXhwaXJ5LnBhcmVudE5vZGUsIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gYm9vbGVhbi1mbGlwcGVkIG9wdGlvbnMsIG1vcmUgYXQgW1ttdzpBUEk6QmxvY2tdXVxuXHRcdGRhdGEuZGlzYWJsZXRhbGsgPSBkYXRhLmRpc2FibGV0YWxrID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGRhdGEuZGlzYWJsZXRhbGs7XG5cdFx0ZGF0YS5oYXJkYmxvY2sgPSBkYXRhLmhhcmRibG9jayA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBkYXRhLmhhcmRibG9jaztcblx0XHQvLyBkaXNhYmxlIGF1dG9ibG9jayBpZiBibG9ja2luZyBhIGJvdFxuXHRcdGlmIChUd2lua2xlLmJsb2NrLnVzZXJJc0JvdCB8fCAvYm90XFxiL2kudGVzdChyZWxldmFudFVzZXJOYW1lKSkge1xuXHRcdFx0ZGF0YS5hdXRvYmxvY2sgPSBmYWxzZTtcblx0XHR9XG5cdFx0JChmb3JtKVxuXHRcdFx0LmZpbmQoJ1tuYW1lPWZpZWxkX2Jsb2NrX29wdGlvbnNdJylcblx0XHRcdC5maW5kKCc6Y2hlY2tib3gnKVxuXHRcdFx0LmVhY2goKF9pLCBlbCkgPT4ge1xuXHRcdFx0XHQvLyBkb24ndCBvdmVycmlkZSBvcmlnaW5hbCBvcHRpb25zIGlmIHVzZUluaXRpYWxPcHRpb25zIGlzIHNldFxuXHRcdFx0XHRpZiAoZGF0YS51c2VJbml0aWFsT3B0aW9ucyAmJiBkYXRhW2VsLm5hbWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVsLm5hbWUgPT09ICdjbG9zZXZpcCcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgY2hlY2sgPSBkYXRhW2VsLm5hbWVdID09PSAnJyB8fCAhIWRhdGFbZWwubmFtZV07XG5cdFx0XHRcdCQoZWwpLnByb3AoJ2NoZWNrZWQnLCBjaGVjayk7XG5cdFx0XHR9KTtcblx0XHRpZiAoZGF0YS5wcmVwZW5kUmVhc29uICYmIGRhdGEucmVhc29uKSB7XG5cdFx0XHRmb3JtLnJlYXNvbi52YWx1ZSA9IGAke2RhdGEucmVhc29ufe+8myR7Zm9ybS5yZWFzb24udmFsdWV9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9ybS5yZWFzb24udmFsdWUgPSBkYXRhLnJlYXNvbiB8fCAnJztcblx0XHR9XG5cdFx0Ly8gQ2xlYXIgYW5kL29yIHNldCBhbnkgcGFydGlhbCBwYWdlIG9yIG5hbWVzcGFjZSByZXN0cmljdGlvbnNcblx0XHRpZiAoZm9ybS5wYWdlcmVzdHJpY3Rpb25zKSB7XG5cdFx0XHRjb25zdCAkcGFnZVNlbGVjdCA9ICQoZm9ybSkuZmluZCgnW25hbWU9cGFnZXJlc3RyaWN0aW9uc10nKTtcblx0XHRcdGNvbnN0ICRuYW1lc3BhY2VTZWxlY3QgPSAkKGZvcm0pLmZpbmQoJ1tuYW1lPW5hbWVzcGFjZXJlc3RyaWN0aW9uc10nKTtcblx0XHRcdC8vIFJlc3BlY3QgdXNlSW5pdGlhbE9wdGlvbnMgYnkgY2xlYXJpbmcgZGF0YSB3aGVuIHN3aXRjaGluZyBwcmVzZXRzXG5cdFx0XHQvLyBJbiBwcmFjdGljZSwgdGhpcyB3aWxsIGFsd2F5cyBjbGVhciwgc2luY2Ugbm8gcGFydGlhbCBwcmVzZXRzIHVzZSBpdFxuXHRcdFx0aWYgKCFkYXRhLnVzZUluaXRpYWxPcHRpb25zKSB7XG5cdFx0XHRcdCRwYWdlU2VsZWN0LnZhbChudWxsKS50cmlnZ2VyKCdjaGFuZ2UnKTtcblx0XHRcdFx0JG5hbWVzcGFjZVNlbGVjdC52YWwobnVsbCkudHJpZ2dlcignY2hhbmdlJyk7XG5cdFx0XHR9XG5cdFx0XHQvLyBBZGQgYW55IHByZXNldCBvcHRpb25zOyBpbiBwcmFjdGljZSwganVzdCB1c2VkIGZvciBwcmlvciBibG9jayBzZXR0aW5nc1xuXHRcdFx0aWYgKGRhdGEucmVzdHJpY3Rpb25zKSB7XG5cdFx0XHRcdGlmIChkYXRhLnJlc3RyaWN0aW9ucy5wYWdlcyAmJiAhJHBhZ2VTZWxlY3QudmFsKCkubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFnZXMgPSBkYXRhLnJlc3RyaWN0aW9ucy5wYWdlcy5tYXAoKHByKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcHIudGl0bGU7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Ly8gc2luY2UgcGFnZSByZXN0cmljdGlvbnMgdXNlIGFuIGFqYXggc291cmNlLCB3ZVxuXHRcdFx0XHRcdC8vIHNob3J0LWNpcmN1aXQgdGhhdCBhbmQganVzdCBhZGQgYSBuZXcgb3B0aW9uXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG5cdFx0XHRcdFx0XHRpZiAoISRwYWdlU2VsZWN0LmZpbmQoYG9wdGlvblt2YWx1ZT0nJHskLmVzY2FwZVNlbGVjdG9yKHBhZ2UpfSddYCkubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld09wdGlvbiA9IG5ldyBPcHRpb24ocGFnZSwgcGFnZSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdCRwYWdlU2VsZWN0LmFwcGVuZChuZXdPcHRpb24pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkcGFnZVNlbGVjdFxuXHRcdFx0XHRcdFx0LnZhbChbLi4uJHBhZ2VTZWxlY3QudmFsKCksIC4uLihBcnJheS5pc0FycmF5KHBhZ2VzKSA/IHBhZ2VzIDogW3BhZ2VzXSldKVxuXHRcdFx0XHRcdFx0LnRyaWdnZXIoJ2NoYW5nZScpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkYXRhLnJlc3RyaWN0aW9ucy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0JG5hbWVzcGFjZVNlbGVjdFxuXHRcdFx0XHRcdFx0LnZhbChbXG5cdFx0XHRcdFx0XHRcdC4uLiRuYW1lc3BhY2VTZWxlY3QudmFsKCksXG5cdFx0XHRcdFx0XHRcdC4uLihBcnJheS5pc0FycmF5KGRhdGEucmVzdHJpY3Rpb25zLm5hbWVzcGFjZXMpXG5cdFx0XHRcdFx0XHRcdFx0PyBkYXRhLnJlc3RyaWN0aW9ucy5uYW1lc3BhY2VzXG5cdFx0XHRcdFx0XHRcdFx0OiBbZGF0YS5yZXN0cmljdGlvbnMubmFtZXNwYWNlc10pLFxuXHRcdFx0XHRcdFx0XSlcblx0XHRcdFx0XHRcdC50cmlnZ2VyKCdjaGFuZ2UnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5jaGFuZ2VfdGVtcGxhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHtmb3JtfSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHt2YWx1ZX0gPSBmb3JtLnRlbXBsYXRlO1xuXHRcdGNvbnN0IHNldHRpbmdzID0gVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW3ZhbHVlXTtcblx0XHRjb25zdCBibG9ja0JveCA9ICQoZm9ybSkuZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9YmxvY2tdJykuaXMoJzpjaGVja2VkJyk7XG5cdFx0Y29uc3QgcGFydGlhbEJveCA9ICQoZm9ybSkuZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cGFydGlhbF0nKS5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCB0ZW1wbGF0ZUJveCA9ICQoZm9ybSkuZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9dGVtcGxhdGVdJykuaXMoJzpjaGVja2VkJyk7XG5cdFx0Ly8gQmxvY2sgZm9ybSBpcyBub3QgcHJlc2VudFxuXHRcdGlmICghYmxvY2tCb3gpIHtcblx0XHRcdGlmIChzZXR0aW5ncy5pbmRlZmluaXRlIHx8IHNldHRpbmdzLm5vbnN0YW5kYXJkKSB7XG5cdFx0XHRcdGlmIChUd2lua2xlLmJsb2NrLnByZXZfdGVtcGxhdGVfZXhwaXJ5ID09PSBudWxsKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS5ibG9jay5wcmV2X3RlbXBsYXRlX2V4cGlyeSA9IGZvcm0udGVtcGxhdGVfZXhwaXJ5LnZhbHVlIHx8ICcnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcm0udGVtcGxhdGVfZXhwaXJ5LnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0Zm9ybS50ZW1wbGF0ZV9leHBpcnkudmFsdWUgPSAnaW5maW5pdHknO1xuXHRcdFx0fSBlbHNlIGlmIChmb3JtLnRlbXBsYXRlX2V4cGlyeS5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuXHRcdFx0XHRpZiAoVHdpbmtsZS5ibG9jay5wcmV2X3RlbXBsYXRlX2V4cGlyeSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGZvcm0udGVtcGxhdGVfZXhwaXJ5LnZhbHVlID0gVHdpbmtsZS5ibG9jay5wcmV2X3RlbXBsYXRlX2V4cGlyeTtcblx0XHRcdFx0XHRUd2lua2xlLmJsb2NrLnByZXZfdGVtcGxhdGVfZXhwaXJ5ID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLnRlbXBsYXRlX2V4cGlyeS5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFR3aW5rbGUuYmxvY2sucHJldl90ZW1wbGF0ZV9leHBpcnkpIHtcblx0XHRcdFx0Zm9ybS5leHBpcnkudmFsdWUgPSBUd2lua2xlLmJsb2NrLnByZXZfdGVtcGxhdGVfZXhwaXJ5O1xuXHRcdFx0fVxuXHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGZvcm0ubm90YWxrLnBhcmVudE5vZGUsICFzZXR0aW5ncy5ub25zdGFuZGFyZCk7XG5cdFx0XHQvLyBQYXJ0aWFsXG5cdFx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZm9ybS5ub2VtYWlsX3RlbXBsYXRlLnBhcmVudE5vZGUsIHBhcnRpYWxCb3gpO1xuXHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGZvcm0ubm9jcmVhdGVfdGVtcGxhdGUucGFyZW50Tm9kZSwgcGFydGlhbEJveCk7XG5cdFx0fSBlbHNlIGlmICh0ZW1wbGF0ZUJveCkge1xuXHRcdFx0Ly8gT25seSBwcmVzZW50IGlmIGJsb2NrICYmIHRlbXBsYXRlIGZvcm1zIGJvdGggdmlzaWJsZVxuXHRcdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KFxuXHRcdFx0XHRmb3JtLmJsYW5rX2R1cmF0aW9uLnBhcmVudE5vZGUsXG5cdFx0XHRcdCFzZXR0aW5ncy5pbmRlZmluaXRlICYmICFzZXR0aW5ncy5ub25zdGFuZGFyZFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Ly8gT25seSBwYXJ0aWN1bGFybHkgcmVsZXZhbnQgaWYgdGVtcGxhdGUgZm9ybSBpcyBwcmVzZW50XG5cdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGZvcm0uYXJ0aWNsZS5wYXJlbnROb2RlLCBzZXR0aW5ncyAmJiAhIXNldHRpbmdzLnBhZ2VQYXJhbSk7XG5cdFx0TW9yZWJpdHMucXVpY2tGb3JtLnNldEVsZW1lbnRWaXNpYmlsaXR5KGZvcm0uYmxvY2tfcmVhc29uLnBhcmVudE5vZGUsIHNldHRpbmdzICYmICEhc2V0dGluZ3MucmVhc29uUGFyYW0pO1xuXHRcdC8vIEFwcGx5IHJlYXNvbiBmcm9tIGJsb2NrUHJlc2V0c0luZm9cblx0XHRpZiAoc2V0dGluZ3MucmVhc29uUGFyYW0pIHtcblx0XHRcdGZvcm0uYmxvY2tfcmVhc29uLnZhbHVlID0gVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW2Zvcm0ucHJlc2V0LnZhbHVlXS5yZWFzb24gfHwgJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvcm0uYmxvY2tfcmVhc29uLnZhbHVlID0gJyc7XG5cdFx0fVxuXHRcdC8vIFBhcnRpYWwgYmxvY2tcblx0XHRNb3JlYml0cy5xdWlja0Zvcm0uc2V0RWxlbWVudFZpc2liaWxpdHkoZm9ybS5hcmVhLnBhcmVudE5vZGUsIHBhcnRpYWxCb3ggJiYgIWJsb2NrQm94KTtcblx0XHRmb3JtLnJvb3QucHJldmlld2VyLmNsb3NlUHJldmlldygpO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLnByZXZfdGVtcGxhdGVfZXhwaXJ5ID0gbnVsbDtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5wcmV2aWV3ID0gKGZvcm0pID0+IHtcblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRhcnRpY2xlOiBmb3JtLmFydGljbGUudmFsdWUsXG5cdFx0XHRibGFua19kdXJhdGlvbjogZm9ybS5ibGFua19kdXJhdGlvbiA/IGZvcm0uYmxhbmtfZHVyYXRpb24uY2hlY2tlZCA6IGZhbHNlLFxuXHRcdFx0ZGlzYWJsZXRhbGs6IGZvcm0uZGlzYWJsZXRhbGsuY2hlY2tlZCB8fCAoZm9ybS5ub3RhbGsgPyBmb3JtLm5vdGFsay5jaGVja2VkIDogZmFsc2UpLFxuXHRcdFx0ZXhwaXJ5OiBmb3JtLnRlbXBsYXRlX2V4cGlyeSA/IGZvcm0udGVtcGxhdGVfZXhwaXJ5LnZhbHVlIDogZm9ybS5leHBpcnkudmFsdWUsXG5cdFx0XHRoYXJkYmxvY2s6IFR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkID8gZm9ybS5hdXRvYmxvY2suY2hlY2tlZCA6IGZvcm0uaGFyZGJsb2NrLmNoZWNrZWQsXG5cdFx0XHRpbmRlZmluaXRlOiBNb3JlYml0cy5zdHJpbmcuaXNJbmZpbml0eShcblx0XHRcdFx0Zm9ybS50ZW1wbGF0ZV9leHBpcnkgPyBmb3JtLnRlbXBsYXRlX2V4cGlyeS52YWx1ZSA6IGZvcm0uZXhwaXJ5LnZhbHVlXG5cdFx0XHQpLFxuXHRcdFx0cmVhc29uOiBmb3JtLmJsb2NrX3JlYXNvbi52YWx1ZSxcblx0XHRcdHRlbXBsYXRlOiBmb3JtLnRlbXBsYXRlLnZhbHVlLFxuXHRcdFx0cGFydGlhbDogJChmb3JtKS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT1wYXJ0aWFsXScpLmlzKCc6Y2hlY2tlZCcpLFxuXHRcdFx0cGFnZXJlc3RyaWN0aW9uczogJChmb3JtLnBhZ2VyZXN0cmljdGlvbnMpLnZhbCgpIHx8IFtdLFxuXHRcdFx0bmFtZXNwYWNlcmVzdHJpY3Rpb25zOiAkKGZvcm0ubmFtZXNwYWNlcmVzdHJpY3Rpb25zKS52YWwoKSB8fCBbXSxcblx0XHRcdG5vZW1haWw6IGZvcm0ubm9lbWFpbC5jaGVja2VkIHx8IChmb3JtLm5vZW1haWxfdGVtcGxhdGUgPyBmb3JtLm5vZW1haWxfdGVtcGxhdGUuY2hlY2tlZCA6IGZhbHNlKSxcblx0XHRcdG5vY3JlYXRlOiBmb3JtLm5vY3JlYXRlLmNoZWNrZWQgfHwgKGZvcm0ubm9jcmVhdGVfdGVtcGxhdGUgPyBmb3JtLm5vY3JlYXRlX3RlbXBsYXRlLmNoZWNrZWQgOiBmYWxzZSksXG5cdFx0XHRhcmVhOiBmb3JtLmFyZWEudmFsdWUsXG5cdFx0fTtcblx0XHRjb25zdCB0ZW1wbGF0ZVRleHQgPSBUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmdldEJsb2NrTm90aWNlV2lraXRleHQocGFyYW1zKTtcblx0XHRmb3JtLnByZXZpZXdlci5iZWdpblJlbmRlcih0ZW1wbGF0ZVRleHQsIGBVc2VyX3RhbGs6JHtyZWxldmFudFVzZXJOYW1lfS9XaWtpdGV4dGApOyAvLyBGb3JjZSB3aWtpdGV4dC9jb3JyZWN0IHVzZXJuYW1lXG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZS50YXJnZXQpO1xuXHRcdGNvbnN0ICRmb3JtID0gJChlLnRhcmdldCk7XG5cdFx0Y29uc3QgdG9CbG9jayA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPWJsb2NrXScpLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGNvbnN0IHRvV2FybiA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXRlbXBsYXRlXScpLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGNvbnN0IHRvUGFydGlhbCA9ICRmb3JtLmZpbmQoJ1tuYW1lPWFjdGlvbnR5cGVdW3ZhbHVlPXBhcnRpYWxdJykuaXMoJzpjaGVja2VkJyk7XG5cdFx0Y29uc3QgdG9UYWcgPSAkZm9ybS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT10YWddJykuaXMoJzpjaGVja2VkJyk7XG5cdFx0Y29uc3QgdG9Qcm90ZWN0ID0gJGZvcm0uZmluZCgnW25hbWU9YWN0aW9udHlwZV1bdmFsdWU9cHJvdGVjdF0nKS5pcygnOmNoZWNrZWQnKTtcblx0XHRjb25zdCB0b1VuYmxvY2sgPSAkZm9ybS5maW5kKCdbbmFtZT1hY3Rpb250eXBlXVt2YWx1ZT11bmJsb2NrXScpLmlzKCc6Y2hlY2tlZCcpO1xuXHRcdGxldCBibG9ja29wdGlvbnMgPSB7fTtcblx0XHRsZXQgdGVtcGxhdGVvcHRpb25zID0ge307XG5cdFx0bGV0IHVuYmxvY2tvcHRpb25zID0ge307XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5zYXZlRmllbGRzZXQoJGZvcm0uZmluZCgnW25hbWU9ZmllbGRfYmxvY2tfb3B0aW9uc10nKSk7XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5zYXZlRmllbGRzZXQoJGZvcm0uZmluZCgnW25hbWU9ZmllbGRfdGVtcGxhdGVfb3B0aW9uc10nKSk7XG5cdFx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5zYXZlRmllbGRzZXQoJGZvcm0uZmluZCgnW25hbWU9ZmllbGRfdGFnX29wdGlvbnNdJykpO1xuXHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suc2F2ZUZpZWxkc2V0KCRmb3JtLmZpbmQoJ1tuYW1lPWZpZWxkX3VuYmxvY2tfb3B0aW9uc10nKSk7XG5cdFx0YmxvY2tvcHRpb25zID0gVHdpbmtsZS5ibG9jay5maWVsZF9ibG9ja19vcHRpb25zO1xuXHRcdHVuYmxvY2tvcHRpb25zID0gVHdpbmtsZS5ibG9jay5maWVsZF91bmJsb2NrX29wdGlvbnM7XG5cdFx0Y29uc3QgdG9DbG9zZXZpcCA9ICEhYmxvY2tvcHRpb25zLmNsb3NldmlwO1xuXHRcdHRlbXBsYXRlb3B0aW9ucyA9IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucztcblx0XHR0ZW1wbGF0ZW9wdGlvbnMuZGlzYWJsZXRhbGsgPSAhISh0ZW1wbGF0ZW9wdGlvbnMuZGlzYWJsZXRhbGsgfHwgYmxvY2tvcHRpb25zLmRpc2FibGV0YWxrKTtcblx0XHR0ZW1wbGF0ZW9wdGlvbnMuaGFyZGJsb2NrID0gISFibG9ja29wdGlvbnMuaGFyZGJsb2NrO1xuXHRcdC8vIHJlbW92ZSBleHRyYW5lb3VzXG5cdFx0ZGVsZXRlIGJsb2Nrb3B0aW9ucy5leHBpcnlfcHJlc2V0O1xuXHRcdGRlbGV0ZSBibG9ja29wdGlvbnMuY2xvc2V2aXA7XG5cdFx0Ly8gUGFydGlhbCBBUEkgcmVxdWlyZXMgdGhpcyB0byBiZSBnb25lLCBub3QgZmFsc2Ugb3IgMFxuXHRcdGlmICh0b1BhcnRpYWwpIHtcblx0XHRcdGJsb2Nrb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcblx0XHRcdHRlbXBsYXRlb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcblx0XHR9XG5cdFx0dGVtcGxhdGVvcHRpb25zLnBhZ2VyZXN0cmljdGlvbnMgPSAkZm9ybS5maW5kKCdbbmFtZT1wYWdlcmVzdHJpY3Rpb25zXScpLnZhbCgpIHx8IFtdO1xuXHRcdHRlbXBsYXRlb3B0aW9ucy5uYW1lc3BhY2VyZXN0cmljdGlvbnMgPSAkZm9ybS5maW5kKCdbbmFtZT1uYW1lc3BhY2VyZXN0cmljdGlvbnNdJykudmFsKCkgfHwgW107XG5cdFx0Ly8gRm9ybWF0IGZvciBBUEkgaGVyZSByYXRoZXIgdGhhbiBpbiBzYXZlRmllbGRzZXRcblx0XHRibG9ja29wdGlvbnMucGFnZXJlc3RyaWN0aW9ucyA9IHRlbXBsYXRlb3B0aW9ucy5wYWdlcmVzdHJpY3Rpb25zLmpvaW4oJ3wnKTtcblx0XHRibG9ja29wdGlvbnMubmFtZXNwYWNlcmVzdHJpY3Rpb25zID0gdGVtcGxhdGVvcHRpb25zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucy5qb2luKCd8Jyk7XG5cdFx0Ly8gdXNlIGJsb2NrIHNldHRpbmdzIGFzIHdhcm4gb3B0aW9ucyB3aGVyZSBub3Qgc3VwcGxpZWRcblx0XHR0ZW1wbGF0ZW9wdGlvbnMuc3VtbWFyeSB8fD0gYmxvY2tvcHRpb25zLnJlYXNvbjtcblx0XHR0ZW1wbGF0ZW9wdGlvbnMuZXhwaXJ5ID0gdGVtcGxhdGVvcHRpb25zLnRlbXBsYXRlX2V4cGlyeSB8fCBibG9ja29wdGlvbnMuZXhwaXJ5O1xuXHRcdHRlbXBsYXRlb3B0aW9ucy5wcmVzZXQgPSB0b0Jsb2NrID8gcGFyYW1zLnByZXNldCA6IG51bGw7XG5cdFx0Ly8gQ2hlY2sgdGFnc1xuXHRcdC8vIEdpdmVuIGFuIGFycmF5IG9mIGluY29tcGF0aWJsZSB0YWdzLCBjaGVjayBpZiB3ZSBoYXZlIHR3byBvciBtb3JlIHNlbGVjdGVkXG5cdFx0Y29uc3QgY2hlY2tJbmNvbXBhdGlibGUgPSAoY29uZmxpY3RzLCBleHRyYSkgPT4ge1xuXHRcdFx0Y29uc3QgY291bnQgPSBjb25mbGljdHMucmVkdWNlKChzdW0sIHRhZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gKHN1bSArPSBwYXJhbXMudGFnLmluY2x1ZGVzKHRhZykpO1xuXHRcdFx0fSwgMCk7XG5cdFx0XHRpZiAoY291bnQgPiAxKSB7XG5cdFx0XHRcdGxldCBtZXNzYWdlID0gYCR7d2luZG93LndnVUxTKCfor7flnKjku6XkuIvmoIfnrb7kuK3mi6nkuIDkvb/nlKgnLCAn6KuL5Zyo5Lul5LiL5qiZ57Gk5Lit5pOH5LiA5L2/55SoJyl977yae3ske2NvbmZsaWN0cy5qb2luKFxuXHRcdFx0XHRcdCd9feOAgXt7J1xuXHRcdFx0XHQpfX1944CCYDtcblx0XHRcdFx0bWVzc2FnZSArPSBleHRyYSB8fCAnJztcblx0XHRcdFx0bXcubm90aWZ5KG1lc3NhZ2UsIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKHRvVGFnKSB7XG5cdFx0XHRpZiAocGFyYW1zLnRhZy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6K+36Iez5bCR6YCJ5oup5LiA5Liq55So5oi36aG15qCH6K6w77yBJywgJ+iri+iHs+WwkemBuOaTh+S4gOWAi+S9v+eUqOiAhemggemdouaomeiomO+8gScpLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVibG9jaycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNoZWNrSW5jb21wYXRpYmxlKFxuXHRcdFx0XHRcdFsnQmxvY2tlZCB1c2VyJywgJ1NvY2twdXBwZXQnXSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQne3tTb2NrcHVwcGV0fX3lt7LmtrXnm5Z7e0Jsb2NrZWQgdXNlcn1955qE5Yqf6IO944CCJyxcblx0XHRcdFx0XHRcdCd7e1NvY2twdXBwZXR9feW3sua2teiTi3t7QmxvY2tlZCB1c2VyfX3nmoTlip/og73jgIInXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGVja0luY29tcGF0aWJsZShcblx0XHRcdFx0XHRbJ0Jsb2NrZWQgdXNlcicsICdTb2NrcHVwcGV0ZWVyJ10sXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J3t7U29ja3B1cHBldGVlcn195bey5ra155uWe3tCbG9ja2VkIHVzZXJ9feeahOWKn+iDveOAgicsXG5cdFx0XHRcdFx0XHQne3tTb2NrcHVwcGV0ZWVyfX3lt7LmtrXok4t7e0Jsb2NrZWQgdXNlcn1955qE5Yqf6IO944CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0Y2hlY2tJbmNvbXBhdGlibGUoXG5cdFx0XHRcdFx0WydTb2NrcHVwcGV0JywgJ1NvY2twdXBwZXRlZXInXSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivt+S7juS4u+i0puWPt+WSjOWIhui6q+i0puWPt+S4remAieaLqeS4gOS4quOAgicsICfoq4vlvp7kuLvos6zomZ/lkozliIbouqvos6zomZ/kuK3pgbjmk4fkuIDlgIvjgIInKVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy50YWcuaW5jbHVkZXMoJ1NvY2twdXBwZXQnKSAmJiBwYXJhbXMuc3BwVXNlcm5hbWUudHJpbSgpID09PSAnJykge1xuXHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fmj5DkvpvlgoDlhKHotKblj7fnmoTkuLvotKblj7fnlKjmiLflkI3vvIEnLCAn6KuL5o+Q5L6b5YKA5YSh6LOs6Jmf55qE5Li76LOs6Jmf5L2/55So6ICF5ZCN56ix77yBJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRvQmxvY2spIHtcblx0XHRcdGlmIChibG9ja29wdGlvbnMucGFydGlhbCkge1xuXHRcdFx0XHRpZiAoYmxvY2tvcHRpb25zLmRpc2FibGV0YWxrICYmICFibG9ja29wdGlvbnMubmFtZXNwYWNlcmVzdHJpY3Rpb25zLmluY2x1ZGVzKCczJykpIHtcblx0XHRcdFx0XHRtdy5ub3RpZnkoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCfpg6jliIblsIHnpoHml6Dms5XpmLvmraLnvJbovpHoh6rlt7HnmoTorqjorrrpobXvvIzpmaTpnZ7kuZ/lsIHnpoHkuoZVc2VyIHRhbGvlkb3lkI3nqbrpl7TvvIEnLFxuXHRcdFx0XHRcdFx0XHQn6YOo5YiG5bCB6Y6W54Sh5rOV6Zi75q2i57eo6Lyv6Ieq5bex55qE6KiO6KuW6aCB77yM6Zmk6Z2e5Lmf5bCB6Y6W5LqGVXNlciB0YWxr5ZG95ZCN56m66ZaT77yBJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYmxvY2snLFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghYmxvY2tvcHRpb25zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucyAmJiAhYmxvY2tvcHRpb25zLnBhZ2VyZXN0cmljdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAoIWJsb2Nrb3B0aW9ucy5ub2VtYWlsICYmICFibG9ja29wdGlvbnMubm9jcmVhdGUpIHtcblx0XHRcdFx0XHRcdC8vIEJsYW5rIGVudHJpZXMgdGVjaG5pY2FsbHkgYWxsb3dlZFxuXHRcdFx0XHRcdFx0bXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+ayoeaciemAieaLqemhtemdouaIluWRveWQjeepuumXtO+8jOS5n+ayoeacieWBnOeUqOeUteWtkOmCruS7tuaIluemgeatouWIm+W7uui0puWPt++8m+ivt+mAieaLqeiHs+WwkeS4gOS4qumAiemhueS7peW6lOeUqOmDqOWIhuWwgeemge+8gScsXG5cdFx0XHRcdFx0XHRcdFx0J+aykuaciemBuOaTh+mggemdouaIluWRveWQjeepuumWk++8jOS5n+aykuacieWBnOeUqOmbu+WtkOmDteS7tuaIluemgeatouW7uueri+izrOiZn++8m+iri+mBuOaTh+iHs+WwkeS4gOWAi+mBuOmgheS7peaHieeUqOmDqOWIhuWwgemOlu+8gSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYmxvY2snLFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlsIbopoHov5vooYzlsIHnpoHvvIzkvYbmsqHmnInpmLvmraLku7vkvZXpobXpnaLmiJblkb3lkI3nqbrpl7TnmoTnvJbovpHvvIznoa7lrpropoHnu6fnu63vvJ8nLFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlsIfopoHpgLLooYzlsIHpjpbvvIzkvYbmspLmnInpmLvmraLku7vkvZXpoIHpnaLmiJblkb3lkI3nqbrplpPnmoTnt6jovK/vvIznorrlrpropoHnubznuozvvJ8nXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghYmxvY2tvcHRpb25zLmV4cGlyeSkge1xuXHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fmj5Dkvpvov4fmnJ/ml7bpl7TvvIEnLCAn6KuL5o+Q5L6b6YGO5pyf5pmC6ZaT77yBJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSBpZiAoTW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkoYmxvY2tvcHRpb25zLmV4cGlyeSkgJiYgIVR3aW5rbGUuYmxvY2suaXNSZWdpc3RlcmVkKSB7XG5cdFx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+emgeatouaXoOmZkOacn+WwgeemgUlQ5Zyw5Z2A77yBJywgJ+emgeatoueEoemZkOacn+WwgemOlklQ5L2N5Z2A77yBJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICghYmxvY2tvcHRpb25zLnJlYXNvbikge1xuXHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fmj5DkvpvlsIHnpoHnkIbnlLHvvIEnLCAn6KuL5o+Q5L6b5bCB6Y6W55CG55Sx77yBJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChlLnRhcmdldCk7XG5cdFx0XHRjb25zdCBzdGF0dXNFbGVtZW50ID0gbmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+aJp+ihjOWwgeemgScsICfln7fooYzlsIHpjpYnKSk7XG5cdFx0XHRibG9ja29wdGlvbnMuYWN0aW9uID0gJ2Jsb2NrJztcblx0XHRcdGJsb2Nrb3B0aW9ucy51c2VyID0gcmVsZXZhbnRVc2VyTmFtZTtcblx0XHRcdC8vIGJvb2xlYW4tZmxpcHBlZCBvcHRpb25zXG5cdFx0XHRibG9ja29wdGlvbnMuYW5vbm9ubHkgPSBibG9ja29wdGlvbnMuaGFyZGJsb2NrID8gdW5kZWZpbmVkIDogdHJ1ZTtcblx0XHRcdGJsb2Nrb3B0aW9ucy5hbGxvd3VzZXJ0YWxrID0gYmxvY2tvcHRpb25zLmRpc2FibGV0YWxrID8gdW5kZWZpbmVkIDogdHJ1ZTtcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2hlY2sgaWYgYmxvY2sgc3RhdHVzIGNoYW5nZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZm9ybS5cblx0XHRcdCAqIFRoZXJlJ3MgYSBsb3QgdG8gY29uc2lkZXIgaGVyZS4gbGlzdD1ibG9ja3MgcHJvdmlkZXMgdGhlXG5cdFx0XHQgKiBjdXJyZW50IGJsb2NrIHN0YXR1cywgYnV0IHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gaXNzdWVzIHdpdGhcblx0XHRcdCAqIHJlbHlpbmcgb24gaXQuIEZpcnN0LCB0aGUgaWQgZG9lc24ndCB1cGRhdGUgb24gYSByZWJsb2NrLFxuXHRcdFx0ICogbWVhbmluZyB0aGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgY29tcGFyZWQuIFRoaXNcblx0XHRcdCAqIGNhbiBiZSBkb25lIHJvdWdobHkgd2l0aCBKU09OLnN0cmluZ2lmeSAtIHdlIGNhbiB0aGFua2Z1bGx5XG5cdFx0XHQgKiByZWx5IG9uIG9yZGVyIGZyb20gdGhlIHNlcnZlciwgYWx0aG91Z2ggc29ydGluZyB3b3VsZCBiZVxuXHRcdFx0ICogZmluZSBpZiBub3QgLSBidXQgZmFsc2V5IHZhbHVlcyBhcmUgcHJvYmxlbWF0aWMgYW5kIGlzXG5cdFx0XHQgKiBub24taWRlYWwuIE1vcmUgaW1wb3J0YW50bHksIGxpc3Q9YmxvY2tzIHdvbid0IGluZGljYXRlIGlmIGFcblx0XHRcdCAqIG5vbi1ibG9ja2VkIHVzZXIgaXMgYmxvY2tlZCB0aGVuIHVuYmxvY2tlZC4gVGhpcyBzaG91bGQgYmVcblx0XHRcdCAqIGV4Y2VlZGluZ3kgcmFyZSwgYnV0IHJlZ2FyZGxlc3MsIHdlIHRodXMgbmVlZCB0byBjaGVja1xuXHRcdFx0ICogbGlzdD1sb2dldmVudHMsIHdoaWNoIGhhcyBhIG5pY2VseSB1cGRhdGluZyBsb2dpZFxuXHRcdFx0ICogcGFyYW1ldGVyLiBXZSBjYW4ndCByZWx5IGp1c3Qgb24gdGhhdCwgdGhvdWdoLCBzaW5jZSBpdFxuXHRcdFx0ICogZG9lc24ndCBhY2NvdW50IGZvciBibG9ja3MgdGhhdCBoYXZlIGV4cGlyZWQgb24gdGhlaXIgb3duLlxuXHRcdFx0ICogQXMgc3VjaCwgd2UgdXNlIGJvdGguIFVzaW5nIHNvbWUgdGVybmFyaWVzLCB0aGUgbG9naWRcblx0XHRcdCAqIHZhcmlhYmxlcyBhcmUgZmFsc2UgaWYgdGhlcmUncyBubyBsb2dldmVudHMsIHNvIGlmIHRoZXlcblx0XHRcdCAqIGFyZW4ndCBlcXVhbCB3ZSBkZWZpbnRlbHkgaGF2ZSBhIGNoYW5nZWQgZW50cnkgKHNlbmRcblx0XHRcdCAqIGNvbmZpcm1hdGlvbikuIElmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIGVpdGhlciB0aGUgdXNlciB3YXNcblx0XHRcdCAqIG5ldmVyIGJsb2NrZWQgKHRoZSBibG9jayBzdGF0dXNlcyB3aWxsIGJlIGVxdWFsLCBub1xuXHRcdFx0ICogY29uZmlybWF0aW9uKSBvciB0aGVyZSdzIG5vIG5ldyBibG9jaywgaW4gd2hpY2ggY2FzZSBlaXRoZXJcblx0XHRcdCAqIGEgYmxvY2sgZXhwaXJlZCAoZGlmZmVyZW50IHN0YXR1c2VzLCBjb25maXJtYXRpb24pIG9yIHRoZVxuXHRcdFx0ICogc2FtZSBibG9jayBpcyBzdGlsbCBhY3RpdmUgKHNhbWUgc3RhdHVzLCBubyBjb25maXJtYXRpb24pLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdFx0Zm9ybWF0OiAnanNvbicsXG5cdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0bGlzdDogJ2Jsb2Nrc3xsb2dldmVudHMnLFxuXHRcdFx0XHRsZXR5cGU6ICdibG9jaycsXG5cdFx0XHRcdGxlbGltaXQ6IDEsXG5cdFx0XHRcdGxldGl0bGU6IGBVc2VyOiR7YmxvY2tvcHRpb25zLnVzZXJ9YCxcblx0XHRcdH07XG5cdFx0XHQvLyBia3VzZXJzIGRvZXNuJ3QgY2F0Y2ggc2luZ2xlIElQcyBibG9ja2VkIGFzIHBhcnQgb2YgYSByYW5nZSBibG9ja1xuXHRcdFx0aWYgKG13LnV0aWwuaXNJUEFkZHJlc3MoYmxvY2tvcHRpb25zLnVzZXIsIHRydWUpKSB7XG5cdFx0XHRcdHF1ZXJ5LmJraXAgPSBibG9ja29wdGlvbnMudXNlcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHF1ZXJ5LmJrdXNlcnMgPSBibG9ja29wdGlvbnMudXNlcjtcblx0XHRcdFx0cXVlcnkubGlzdCArPSAnfHVzZXJzJztcblx0XHRcdFx0cXVlcnkudXNwcm9wID0gJ2dyb3Vwcyc7XG5cdFx0XHRcdHF1ZXJ5LnVzdXNlcnMgPSBibG9ja29wdGlvbnMudXNlcjtcblx0XHRcdFx0cXVlcnkubWV0YSA9ICd0b2tlbnMnO1xuXHRcdFx0XHRxdWVyeS50eXBlID0gJ3VzZXJyaWdodHMnO1xuXHRcdFx0fVxuXHRcdFx0YXBpLmdldChxdWVyeSkudGhlbigoZGF0YSkgPT4ge1xuXHRcdFx0XHRsZXQgW2Jsb2NrXSA9IGRhdGEucXVlcnkuYmxvY2tzO1xuXHRcdFx0XHQvLyBBcyB3aXRoIHRoZSBpbml0aWFsIGRhdGEgZmV0Y2gsIGlmIGFuIElQIGlzIGJsb2NrZWRcblx0XHRcdFx0Ly8gKmFuZCogcmFuZ2VibG9ja2VkLCB0aGlzIHdvdWxkIG9ubHkgZ3JhYiB3aGljaGV2ZXJcblx0XHRcdFx0Ly8gYmxvY2sgaXMgbW9yZSByZWNlbnQsIHdoaWNoIHdvdWxkIGxpa2VseSBtZWFuIGFcblx0XHRcdFx0Ly8gbWlzbWF0Y2guICBIb3dldmVyLCBpZiB0aGUgcmFuZ2VibG9jayBpcyB1cGRhdGVkXG5cdFx0XHRcdC8vIHdoaWxlIGZpbGxpbmcgb3V0IHRoZSBmb3JtLCB0aGlzIHdvbid0IGRldGVjdCB0aGF0LFxuXHRcdFx0XHQvLyBidXQgdGhhdCdzIHByb2JhYmx5IGZpbmUuXG5cdFx0XHRcdGlmIChkYXRhLnF1ZXJ5LmJsb2Nrcy5sZW5ndGggPiAxICYmIGJsb2NrLnVzZXIgIT09IHJlbGV2YW50VXNlck5hbWUpIHtcblx0XHRcdFx0XHRbLCBibG9ja10gPSBkYXRhLnF1ZXJ5LmJsb2Nrcztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBbbG9nZXZlbnRzXSA9IGRhdGEucXVlcnkubG9nZXZlbnRzO1xuXHRcdFx0XHRjb25zdCB1c2VyID0gZGF0YS5xdWVyeS51c2VycyA/IGRhdGEucXVlcnkudXNlcnNbMF0gOiBudWxsO1xuXHRcdFx0XHRjb25zdCBsb2dpZCA9IGRhdGEucXVlcnkubG9nZXZlbnRzLmxlbmd0aCA/IGxvZ2V2ZW50cy5sb2dpZCA6IGZhbHNlO1xuXHRcdFx0XHRpZiAobG9naWQgIT09IFR3aW5rbGUuYmxvY2suYmxvY2tMb2dJZCB8fCAhIWJsb2NrICE9PSAhIVR3aW5rbGUuYmxvY2suY3VycmVudEJsb2NrSW5mbykge1xuXHRcdFx0XHRcdGxldCBtZXNzYWdlID0gYmxvY2tvcHRpb25zLnVzZXIgKyB3aW5kb3cud2dVTFMoJ+eahOWwgeemgeeKtuaAgeW3suiiq+S/ruaUueOAgicsICfnmoTlsIHpjpbni4DmhYvlt7Looqvkv67mlLnjgIInKTtcblx0XHRcdFx0XHRpZiAoYmxvY2spIHtcblx0XHRcdFx0XHRcdG1lc3NhZ2UgKz0gd2luZG93LndnVUxTKCfmlrDnirbmgIHvvJonLCAn5paw54uA5oWL77yaJyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG1lc3NhZ2UgKz0gd2luZG93LndnVUxTKCfmnIDmlrDml6Xlv5fvvJonLCAn5pyA5paw5pel6KqM77yaJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxldCBsb2dFeHBpcnkgPSAnJztcblx0XHRcdFx0XHRpZiAobG9nZXZlbnRzLnBhcmFtcy5kdXJhdGlvbikge1xuXHRcdFx0XHRcdFx0aWYgKGxvZ2V2ZW50cy5wYXJhbXMuZHVyYXRpb24gPT09ICdpbmZpbml0eScpIHtcblx0XHRcdFx0XHRcdFx0bG9nRXhwaXJ5ID0gd2luZG93LndnVUxTKCfml6DpmZDmnJ8nLCAn54Sh6ZmQ5pyfJyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBleHBpcnlEYXRlID0gbmV3IE1vcmViaXRzLmRhdGUobG9nZXZlbnRzLnBhcmFtcy5leHBpcnkpO1xuXHRcdFx0XHRcdFx0XHRsb2dFeHBpcnkgKz1cblx0XHRcdFx0XHRcdFx0XHQoZXhwaXJ5RGF0ZS5pc0JlZm9yZShuZXcgRGF0ZSgpKSA/IHdpbmRvdy53Z1VMUygn6L+H5pyf5LqOJywgJ+mBjuacn+aWvCcpIDogJ+ebtOWIsCcpICtcblx0XHRcdFx0XHRcdFx0XHRleHBpcnlEYXRlLmNhbGVuZGFyKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIG5vIGR1cmF0aW9uLCBhY3Rpb249dW5ibG9jaywganVzdCBzaG93IHRpbWVzdGFtcFxuXHRcdFx0XHRcdFx0bG9nRXhwaXJ5ID0gYOaWvCR7bmV3IE1vcmViaXRzLmRhdGUobG9nZXZlbnRzLnRpbWVzdGFtcCkuY2FsZW5kYXIoKX1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtZXNzYWdlICs9IGDnlLEke2xvZ2V2ZW50cy51c2VyfSR7d2luZG93LndnVUxTKCfku6XigJwnLCAn5Lul44CMJyl9JHtsb2dldmVudHMuY29tbWVudH0ke3dpbmRvdy53Z1VMUygn4oCdJywgJ+OAjScpfSR7XG5cdFx0XHRcdFx0XHRibG9ja0FjdGlvblRleHRbbG9nZXZlbnRzLmFjdGlvbl1cblx0XHRcdFx0XHR9JHtsb2dFeHBpcnl9JHt3aW5kb3cud2dVTFMoJ++8jOS9oOaDs+imgeS7peS9oOeahOiuvue9ruabtOaUueWwgeemgeWQl++8nycsICfvvIzkvaDmg7PopoHku6XkvaDnmoToqK3lrprorormm7TlsIHpjpbll47vvJ8nKX1gO1xuXHRcdFx0XHRcdGlmICghY29uZmlybShtZXNzYWdlKSkge1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5omn6KGM5bCB56aBJywgJ+Wft+ihjOWwgemOlicpLFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nCcsICfkvb/nlKjogIXlj5bmtojmk43kvZwnKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YmxvY2tvcHRpb25zLnJlYmxvY2sgPSAxOyAvLyBXcml0aW5nIG92ZXIgYSBibG9jayB3aWxsIGZhaWwgb3RoZXJ3aXNlXG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgZ3JvdXBzQ2FuQmVSZW1vdmVkID0gW1xuXHRcdFx0XHRcdCdhdXRvcGF0cm9sbGVkJyxcblx0XHRcdFx0XHQnY29uZmlybWVkJyxcblx0XHRcdFx0XHQncm5yc3ZlcmlmeS1leGVtcHQnLFxuXHRcdFx0XHRcdCdtYXNzbWVzc2FnZS1zZW5kZXInLFxuXHRcdFx0XHRcdCdwYXRyb2xsZXInLFxuXHRcdFx0XHRcdCd0ZW1wbGF0ZWVkaXRvcicsXG5cdFx0XHRcdFx0J2ltcG9ydGVyJyxcblx0XHRcdFx0XTtcblx0XHRcdFx0bGV0IGdyb3Vwc1RvQmVSZW1vdmVkID0gW107XG5cdFx0XHRcdGlmICh1c2VyICYmIE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KGJsb2Nrb3B0aW9ucy5leHBpcnkpKSB7XG5cdFx0XHRcdFx0Z3JvdXBzVG9CZVJlbW92ZWQgPSB1c2VyLmdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZ3JvdXBzQ2FuQmVSZW1vdmVkLmluY2x1ZGVzKGdyb3VwKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBleGVjdXRlIGJsb2NrXG5cdFx0XHRcdGJsb2Nrb3B0aW9ucy50YWdzID0gVHdpbmtsZS5jaGFuZ2VUYWdzO1xuXHRcdFx0XHRibG9ja29wdGlvbnMudG9rZW4gPSBtdy51c2VyLnRva2Vucy5nZXQoJ2NzcmZUb2tlbicpO1xuXHRcdFx0XHRjb25zdCBtYkFwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaSh3aW5kb3cud2dVTFMoJ+aJp+ihjOWwgeemgScsICfln7fooYzlsIHpjpYnKSwgYmxvY2tvcHRpb25zLCAoKSA9PiB7XG5cdFx0XHRcdFx0c3RhdHVzRWxlbWVudC5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0XHRpZiAodG9XYXJuKSB7XG5cdFx0XHRcdFx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmlzc3VlX3RlbXBsYXRlKHRlbXBsYXRlb3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0b0Nsb3NldmlwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB2aXBQYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdFx0J0xJQl90YWxrOuaKpeWRiuW9k+WJjeegtOWdjycsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5YWz6Zet6K+35rGCJywgJ+mXnOmWieiri+axgicpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0dmlwUGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0XHRcdHZpcFBhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKGJsb2Nrb3B0aW9ucyk7XG5cdFx0XHRcdFx0XHR2aXBQYWdlLmxvYWQoVHdpbmtsZS5ibG9jay5jYWxsYmFjay5jbG9zZVJlcXVlc3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZ3JvdXBzVG9CZVJlbW92ZWQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmlnaHRTdGF0dXNFbGVtZW50ID0gbmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+enu+mZpOadg+mZkCcsICfnp7vpmaTmrIrpmZAnKSk7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGNvbmZpcm0oXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfor6XnlKjmiLfmnInku6XkuIvmnYPpmZDvvJonLCAn6Kmy5L2/55So6ICF5pyJ5Lul5LiL5qyK6ZmQ77yaJykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0Z3JvdXBzVG9CZVJlbW92ZWQuam9pbign44CBJykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfvvIzmgqjmmK/lkKbmg7PopoHlkIzml7bnp7vpmaTov5nkupvmnYPpmZDvvJ8nLCAn77yM5oKo5piv5ZCm5oOz6KaB5ZCM5pmC56e76Zmk6YCZ5Lqb5qyK6ZmQ77yfJylcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJldm9rZU9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uOiAndXNlcnJpZ2h0cycsXG5cdFx0XHRcdFx0XHRcdFx0dXNlcjogYmxvY2tvcHRpb25zLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0cmVtb3ZlOiBncm91cHNUb0JlUmVtb3ZlZC5qb2luKCd8JyksXG5cdFx0XHRcdFx0XHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+W3suiiq+aXoOmZkOacn+WwgeemgScsICfkvb/nlKjogIXlt7LooqvnhKHpmZDmnJ/lsIHpjpYnKSxcblx0XHRcdFx0XHRcdFx0XHR0b2tlbjogZGF0YS5xdWVyeS50b2tlbnMudXNlcnJpZ2h0c3Rva2VuLFxuXHRcdFx0XHRcdFx0XHRcdHRhZ3M6IFR3aW5rbGUuY2hhbmdlVGFncyxcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbXJBcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfnp7vpmaTmnYPpmZAnLCAn56e76Zmk5qyK6ZmQJyksXG5cdFx0XHRcdFx0XHRcdFx0cmV2b2tlT3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyaWdodFN0YXR1c0VsZW1lbnQuaW5mbyhg5bey56e76ZmkJHtncm91cHNUb0JlUmVtb3ZlZC5qb2luKCfjgIEnKX1gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdG1yQXBpLnBvc3QoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJpZ2h0U3RhdHVzRWxlbWVudC5lcnJvcih3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nOOAgicsICfkvb/nlKjogIXlj5bmtojmk43kvZzjgIInKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0bWJBcGkucG9zdCgpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICh0b1dhcm4pIHtcblx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChlLnRhcmdldCk7XG5cdFx0XHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmlzc3VlX3RlbXBsYXRlKHRlbXBsYXRlb3B0aW9ucyk7XG5cdFx0fVxuXHRcdGlmICh0b1RhZyB8fCB0b1Byb3RlY3QpIHtcblx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChlLnRhcmdldCk7XG5cdFx0XHRjb25zdCB1c2VyUGFnZSA9IGBVc2VyOiR7bXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyl9YDtcblx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdHVzZXJQYWdlLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+agh+iusOaIluS/neaKpOeUqOaIt+mhtScsICfmqJnoqJjmiJbkv53orbfkvb/nlKjogIXpoIHpnaInKVxuXHRcdFx0KTtcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5sb2FkKFR3aW5rbGUuYmxvY2suY2FsbGJhY2sudGFndXNlcnBhZ2UpO1xuXHRcdH1cblx0XHRpZiAodG9VbmJsb2NrKSB7XG5cdFx0XHRpZiAoIXVuYmxvY2tvcHRpb25zLnJlYXNvbikge1xuXHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfor7fmj5Dkvpvop6PpmaTlsIHnpoHnkIbnlLHvvIEnLCAn6KuL5o+Q5L6b6Kej6Zmk5bCB6Y6W55CG55Sx77yBJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChlLnRhcmdldCk7XG5cdFx0XHRjb25zdCB1bmJsb2NrU3RhdHVzRWxlbWVudCA9IG5ldyBNb3JlYml0cy5zdGF0dXMod2luZG93LndnVUxTKCfmiafooYzop6PpmaTlsIHnpoEnLCAn5Z+36KGM6Kej6Zmk5bCB6Y6WJykpO1xuXHRcdFx0dW5ibG9ja29wdGlvbnMuYWN0aW9uID0gJ3VuYmxvY2snO1xuXHRcdFx0dW5ibG9ja29wdGlvbnMudXNlciA9IG13LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpO1xuXHRcdFx0Ly8gZXhlY3V0ZSB1bmJsb2NrXG5cdFx0XHR1bmJsb2Nrb3B0aW9ucy50YWdzID0gVHdpbmtsZS5jaGFuZ2VUYWdzO1xuXHRcdFx0dW5ibG9ja29wdGlvbnMudG9rZW4gPSBtdy51c2VyLnRva2Vucy5nZXQoJ2NzcmZUb2tlbicpO1xuXHRcdFx0Y29uc3QgdW5ibG9ja01iQXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aJp+ihjOino+mZpOWwgeemgScsICfln7fooYzop6PpmaTlsIHpjpYnKSxcblx0XHRcdFx0dW5ibG9ja29wdGlvbnMsXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR1bmJsb2NrU3RhdHVzRWxlbWVudC5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdHVuYmxvY2tNYkFwaS5wb3N0KCk7XG5cdFx0fVxuXHRcdGlmICghdG9CbG9jayAmJiAhdG9XYXJuICYmICF0b1RhZyAmJiAhdG9Qcm90ZWN0ICYmICF0b1VuYmxvY2spIHtcblx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+e7mVR3aW5rbGXngrnkuovlgZrvvIEnLCAn6KuL57WmVHdpbmtsZem7nuS6i+WBmu+8gScpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZWJsb2NrJyxcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay50YWd1c2VycGFnZSA9IChwYWdlb2JqKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdGlmIChwYXJhbXMuYWN0aW9udHlwZS5pbmNsdWRlcygndGFnJykpIHtcblx0XHRcdGNvbnN0IHRhZ3MgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHBhcmFtcy50YWcpIHtcblx0XHRcdFx0bGV0IHRhZ3RleHQgPSBge3ske3RhZ31gO1xuXHRcdFx0XHRzd2l0Y2ggKHRhZykge1xuXHRcdFx0XHRcdGNhc2UgJ0Jsb2NrZWQgdXNlcic6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdTb2NrcHVwcGV0Jzpcblx0XHRcdFx0XHRcdHRhZ3RleHQgKz0gYFxcbnwgMSA9ICR7cGFyYW1zLnNwcFVzZXJuYW1lLnRyaW0oKX1gO1xuXHRcdFx0XHRcdFx0dGFndGV4dCArPSBgXFxufCAyID0gJHtwYXJhbXMuc3BwVHlwZS50cmltKCl9YDtcblx0XHRcdFx0XHRcdGlmIChwYXJhbXMuc3BwRXZpZGVuY2UudHJpbSgpKSB7XG5cdFx0XHRcdFx0XHRcdHRhZ3RleHQgKz0gYFxcbnwgZXZpZGVuY2UgPSAke3BhcmFtcy5zcHBFdmlkZW5jZS50cmltKCl9YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRhZ3RleHQgKz0gJ1xcbnwgbG9ja2VkID0gbm8nO1xuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxufCBub3RibG9ja2VkID0gbm8nO1xuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxuJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ1NvY2twdXBwZXRlZXInOlxuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxufCAxID0gYmxvY2tlZCc7XG5cdFx0XHRcdFx0XHR0YWd0ZXh0ICs9IGBcXG58IGNoZWNrZWQgPSAke3BhcmFtcy5zcG1DaGVja2VkID8gJ3llcycgOiAnJ31gO1xuXHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5zcG1FdmlkZW5jZS50cmltKCkpIHtcblx0XHRcdFx0XHRcdFx0dGFndGV4dCArPSBgXFxufCBldmlkZW5jZSA9ICR7cGFyYW1zLnNwbUV2aWRlbmNlLnRyaW0oKX1gO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGFndGV4dCArPSAnXFxuJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfmnKrnn6XnmoTnlKjmiLfpobXmqKHmnb/vvIEnLCAn5pyq55+l55qE5L2/55So6ICF6aCB6Z2i5qih5p2/77yBJyksIHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlYmxvY2snLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YWd0ZXh0ICs9ICd9fSc7XG5cdFx0XHRcdHRhZ3MucHVzaCh0YWd0ZXh0KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHRleHQgPSB0YWdzLmpvaW4oJ1xcbicpO1xuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkod2luZG93LndnVUxTKCfmoIforrDooqvmsLjkuYXlsIHnpoHnmoTnlKjmiLfpobUnLCAn5qiZ6KiY6KKr5rC45LmF5bCB6Y6W55qE5L2/55So6ICF6aCB6Z2iJykpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNhdmUoKCkgPT4ge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyh3aW5kb3cud2dVTFMoJ+agh+iusOeUqOaIt+mhtScsICfmqJnoqJjkvb/nlKjogIXpoIHpnaInKSwgJ+WujOaIkCcpO1xuXHRcdFx0XHRzdGF0ZWxlbS5zdGF0dXMod2luZG93LndnVUxTKCfmraPlnKjkv53miqTpobXpnaInLCAn5q2j5Zyo5L+d6K236aCB6Z2iJykpO1xuXHRcdFx0XHRwYWdlb2JqLmxvYWQoVHdpbmtsZS5ibG9jay5jYWxsYmFjay5wcm90ZWN0dXNlcnBhZ2UpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3aW5rbGUuYmxvY2suY2FsbGJhY2sucHJvdGVjdHVzZXJwYWdlKHBhZ2VvYmopO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5ibG9jay5jYWxsYmFjay5wcm90ZWN0dXNlcnBhZ2UgPSAocGFnZW9iaikgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0Y29uc3Qgc3RhdGVsZW0gPSBwYWdlb2JqLmdldFN0YXR1c0VsZW1lbnQoKTtcblx0XHRpZiAocGFyYW1zLmFjdGlvbnR5cGUuaW5jbHVkZXMoJ3Byb3RlY3QnKSkge1xuXHRcdFx0aWYgKHBhZ2VvYmouZXhpc3RzKCkpIHtcblx0XHRcdFx0cGFnZW9iai5zZXRFZGl0UHJvdGVjdGlvbignc3lzb3AnLCAnaW5kZWZpbml0ZScpO1xuXHRcdFx0XHRwYWdlb2JqLnNldE1vdmVQcm90ZWN0aW9uKCdzeXNvcCcsICdpbmRlZmluaXRlJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwYWdlb2JqLnNldENyZWF0ZVByb3RlY3Rpb24oJ3N5c29wJywgJ2luZGVmaW5pdGUnKTtcblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkod2luZG93LndnVUxTKCfooqvmsLjkuYXlsIHnpoHnmoTnlKjmiLfpobUnLCAn6KKr5rC45LmF5bCB6Y6W55qE5L2/55So6ICF6aCB6Z2iJykpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnByb3RlY3QoKCkgPT4ge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/neaKpOeUqOaIt+mhtScsICfkv53orbfkvb/nlKjogIXpoIHpnaInKSxcblx0XHRcdFx0XHRwYWdlb2JqLmV4aXN0cygpID8gd2luZG93LndnVUxTKCflt7Llhajkv53miqQnLCAn5bey5YWo5L+d6K23JykgOiB3aW5kb3cud2dVTFMoJ+W3sueZvee6uOS/neaKpCcsICflt7Lnmb3ntJnkv53orbcnKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRzdGF0ZWxlbS5pbmZvKCflhajpg6jlrozmiJAnKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdGF0ZWxlbS5pbmZvKCflhajpg6jlrozmiJAnKTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmxvY2suY2FsbGJhY2suaXNzdWVfdGVtcGxhdGUgPSAoZm9ybURhdGEpID0+IHtcblx0XHQvLyBVc2Ugd2dSZWxldmFudFVzZXJOYW1lIHRvIGVuc3VyZSB0aGUgYmxvY2sgdGVtcGxhdGUgZ29lcyB0byBhIHNpbmdsZSBJUCBhbmQgbm90IHRvIHRoZVxuXHRcdC8vIFwidGFsayBwYWdlXCIgb2YgYW4gSVAgcmFuZ2UgKHdoaWNoIGRvZXMgbm90IGV4aXN0KVxuXHRcdGNvbnN0IHVzZXJUYWxrUGFnZSA9IGBVc2VyX3RhbGs6JHttdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKX1gO1xuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdC4uLmZvcm1EYXRhLFxuXHRcdFx0bWVzc2FnZURhdGE6IFR3aW5rbGUuYmxvY2suYmxvY2tQcmVzZXRzSW5mb1tmb3JtRGF0YS50ZW1wbGF0ZV0sXG5cdFx0XHR1c2VydGFsa19zdW1tYXJ5OiBUd2lua2xlLmJsb2NrLmJsb2NrUHJlc2V0c0luZm9bZm9ybURhdGEucHJlc2V0IHx8IGZvcm1EYXRhLnRlbXBsYXRlXS5zdW1tYXJ5LFxuXHRcdFx0cmVhc29uOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMuYmxvY2tfcmVhc29uLFxuXHRcdFx0ZGlzYWJsZXRhbGs6IFR3aW5rbGUuYmxvY2suZmllbGRfdGVtcGxhdGVfb3B0aW9ucy5ub3RhbGssXG5cdFx0XHRub2VtYWlsOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMubm9lbWFpbF90ZW1wbGF0ZSxcblx0XHRcdG5vY3JlYXRlOiBUd2lua2xlLmJsb2NrLmZpZWxkX3RlbXBsYXRlX29wdGlvbnMubm9jcmVhdGVfdGVtcGxhdGUsXG5cdFx0fTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IHVzZXJUYWxrUGFnZTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoXG5cdFx0XHQn5a6M5oiQ77yM5bCG5Zyo5Yeg56eS5ZCO5Yqg6L2955So5oi36K6o6K666aG1Jyxcblx0XHRcdCflrozmiJDvvIzlsIflnKjlub7np5LlvozovInlhaXkvb/nlKjogIXoqI7oq5bpoIEnXG5cdFx0KTtcblx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0dXNlclRhbGtQYWdlLFxuXHRcdFx0d2luZG93LndnVUxTKCfnlKjmiLforqjorrrpobXkv67mlLknLCAn5L2/55So6ICF6KiO6KuW6aCB5L+u5pS5Jylcblx0XHQpO1xuXHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHR5c2FyY2hpdmVzX3BhZ2UubG9hZChUd2lua2xlLmJsb2NrLmNhbGxiYWNrLm1haW4pO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmNsb3NlUmVxdWVzdCA9ICh2aXBQYWdlKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gdmlwUGFnZS5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRsZXQgdGV4dCA9IHZpcFBhZ2UuZ2V0UGFnZVRleHQoKTtcblx0XHRjb25zdCBzdGF0dXNFbGVtZW50ID0gdmlwUGFnZS5nZXRTdGF0dXNFbGVtZW50KCk7XG5cdFx0Y29uc3QgdXNlck5hbWUgPSBtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKTtcblx0XHRjb25zdCBleHBpcnlUZXh0ID0gTW9yZWJpdHMuc3RyaW5nLmZvcm1hdFRpbWUocGFyYW1zLmV4cGlyeSk7XG5cdFx0Y29uc3QgY29tbWVudCA9IGB7e0Jsb2NrZWR8JHtNb3JlYml0cy5zdHJpbmcuaXNJbmZpbml0eShwYXJhbXMuZXhwaXJ5KSA/ICdpbmRlZicgOiBleHBpcnlUZXh0fX1944CCYDtcblx0XHRjb25zdCByZXF1ZXN0TGlzdCA9IHRleHQuc3BsaXQoLyg/PVxcbj09PS4rPT09XFxzKlxcbikvKTtcblx0XHRsZXQgZm91bmQgPSBmYWxzZTtcblx0XHRsZXQgaGlkZW5hbWUgPSBmYWxzZTtcblx0XHRjb25zdCB2aXBSZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRge3tcXFxccypbVnZdYW5kYWxcXFxccypcXFxcfFxcXFxzKigxXFxcXHMqPVxcXFxzKik/JHtNb3JlYml0cy5wYWdlTmFtZVJlZ2V4KFxuXHRcdFx0XHR1c2VyTmFtZVxuXHRcdFx0KX1cXFxccyooXFxcXHxcXFxccypoaWRlbmFtZVxcXFxzKj1bXnxdKyk/fX1gLFxuXHRcdFx0J20nXG5cdFx0KTtcblx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHJlcXVlc3RMaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodmlwUmUuZXhlYyhyZXF1ZXN0TGlzdFtpXSkpIHtcblx0XHRcdFx0aGlkZW5hbWUgPSAvXFx8XFxzKmhpZGVuYW1lXFxzKj1bXnxdKy8udGVzdChyZXF1ZXN0TGlzdFtpXSk7XG5cdFx0XHRcdHJlcXVlc3RMaXN0W2ldID0gcmVxdWVzdExpc3RbaV0udHJpbUVuZCgpO1xuXHRcdFx0XHRsZXQgbmV3VGV4dCA9IHJlcXVlc3RMaXN0W2ldLnJlcGxhY2UoXG5cdFx0XHRcdFx0L14oXFwqXFxzKuWkhOeQhu+8milbIFxcdF0qKDwhLS0g6Z2e566h55CG5ZOh5YOF5Y+v5qiZ6KiY5bey5Z+36KGM55qE5bCB56aB77yM6Yed5bCN5o+Q5aCx55qE5oSP6KaL6KuL5pS+5Zyo5LiL5LiA6KGMIC0tPik/WyBcXHRdKiQvbSxcblx0XHRcdFx0XHRgJDEke2NvbW1lbnR9LS1+fmAuY29uY2F0KCd+ficpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChyZXF1ZXN0TGlzdFtpXSA9PT0gbmV3VGV4dCkge1xuXHRcdFx0XHRcdG5ld1RleHQgPSBgJHtyZXF1ZXN0TGlzdFtpXX1cXG4qIOWkhOeQhu+8miR7Y29tbWVudH0tLX5+YC5jb25jYXQoJ35+Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVxdWVzdExpc3RbaV0gPSBgJHtuZXdUZXh0fVxcbmA7XG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghZm91bmQpIHtcblx0XHRcdHN0YXR1c0VsZW1lbnQud2Fybih3aW5kb3cud2dVTFMoJ+ayoeacieaJvuWIsOebuOWFs+eahOivt+axgicsICfmspLmnInmib7liLDnm7jpl5znmoToq4vmsYInKSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRleHQgPSByZXF1ZXN0TGlzdC5qb2luKCcnKTtcblx0XHRsZXQgc3VtbWFyeTtcblx0XHRpZiAoaGlkZW5hbWUpIHtcblx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+agh+iusOS4uuW3suWkhOeQhicsICfmqJnoqJjngrrlt7LomZXnkIYnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3VtbWFyeSA9IGAvKiAke3VzZXJOYW1lfSAqLyBgO1xuXHRcdFx0aWYgKE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHBhcmFtcy5leHBpcnkpKSB7XG5cdFx0XHRcdHN1bW1hcnkgKz0gd2luZG93LndnVUxTKCfkuI3pmZDmnJ/lsIHnpoEnLCAn5LiN6ZmQ5pyf5bCB6Y6WJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdW1tYXJ5ICs9IHdpbmRvdy53Z1VMUygn5bCB56aBJywgJ+WwgemOlicpICsgZXhwaXJ5VGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0dmlwUGFnZS5zZXRFZGl0U3VtbWFyeShzdW1tYXJ5KTtcblx0XHR2aXBQYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHR2aXBQYWdlLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdHZpcFBhZ2Uuc2F2ZSgpO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLmdldEJsb2NrTm90aWNlV2lraXRleHQgPSAocGFyYW1zKSA9PiB7XG5cdFx0bGV0IHRleHQgPSAne3snO1xuXHRcdGNvbnN0IHNldHRpbmdzID0gVHdpbmtsZS5ibG9jay5ibG9ja1ByZXNldHNJbmZvW3BhcmFtcy50ZW1wbGF0ZV07XG5cdFx0aWYgKHNldHRpbmdzLm5vbnN0YW5kYXJkKSB7XG5cdFx0XHR0ZXh0ICs9IHBhcmFtcy50ZW1wbGF0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGV4dCArPSAnc3Vic3Q6Jy5jb25jYXQocGFyYW1zLnRlbXBsYXRlKTtcblx0XHRcdGlmIChwYXJhbXMuYXJ0aWNsZSAmJiBzZXR0aW5ncy5wYWdlUGFyYW0pIHtcblx0XHRcdFx0dGV4dCArPSBgfHBhZ2U9JHtwYXJhbXMuYXJ0aWNsZX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCEvdGU/bXB8XlxccyokfG1pbi8uZXhlYyhwYXJhbXMuZXhwaXJ5KSkge1xuXHRcdFx0XHRpZiAocGFyYW1zLmluZGVmaW5pdGUpIHtcblx0XHRcdFx0XHR0ZXh0ICs9ICd8aW5kZWY9eWVzJztcblx0XHRcdFx0fSBlbHNlIGlmICghcGFyYW1zLmJsYW5rX2R1cmF0aW9uKSB7XG5cdFx0XHRcdFx0Ly8gTm8gZXhwaXJ5IGNoZWNrc1xuXHRcdFx0XHRcdC8vIEJsb2NrIHRlbXBsYXRlIHdhbnRzIGEgZHVyYXRpb24sIG5vdCBkYXRlXG5cdFx0XHRcdFx0dGV4dCArPSBgfHRpbWU9JHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0VGltZShwYXJhbXMuZXhwaXJ5KX1gOyAvLyBmb3JtYXRUaW1lXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghVHdpbmtsZS5ibG9jay5pc1JlZ2lzdGVyZWQgJiYgIXBhcmFtcy5oYXJkYmxvY2spIHtcblx0XHRcdFx0dGV4dCArPSAnfGFub249eWVzJztcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMucmVhc29uKSB7XG5cdFx0XHRcdHRleHQgKz0gYHxyZWFzb249JHtwYXJhbXMucmVhc29ufWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLmRpc2FibGV0YWxrKSB7XG5cdFx0XHRcdHRleHQgKz0gJ3xub3RhbGs9eWVzJztcblx0XHRcdH1cblx0XHRcdC8vIEN1cnJlbnRseSwgYWxsIHBhcnRpYWwgYmxvY2sgdGVtcGxhdGVzIGFyZSBcInN0YW5kYXJkXCJcblx0XHRcdC8vIEJ1aWxkaW5nIHRoZSB0ZW1wbGF0ZSwgaG93ZXZlciwgdGFrZXMgYSBmYWlyIGJpdCBvZiBsb2dpY1xuXHRcdFx0aWYgKHBhcmFtcy5wYXJ0aWFsKSB7XG5cdFx0XHRcdGlmIChwYXJhbXMucGFnZXJlc3RyaWN0aW9ucy5sZW5ndGggfHwgcGFyYW1zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBtYWtlU2VudGVuY2UgPSAoYXJyYXkpID0+IHtcblx0XHRcdFx0XHRcdGlmIChhcnJheS5sZW5ndGggPCAzKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhcnJheS5qb2luKCflkownKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IGxhc3QgPSBhcnJheS5wb3AoKTtcblx0XHRcdFx0XHRcdHJldHVybiBgJHthcnJheS5qb2luKCfjgIEnKX3lkowke2xhc3R9YDtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHRleHQgKz0gJ3xhcmVhPeafkOS6myc7XG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5wYWdlcmVzdHJpY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGV4dCArPSBg6aCB6Z2i77yIJHttYWtlU2VudGVuY2UoXG5cdFx0XHRcdFx0XHRcdHBhcmFtcy5wYWdlcmVzdHJpY3Rpb25zLm1hcCgocCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBgW1s6JHtwfV1dYDtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCl9YDtcblx0XHRcdFx0XHRcdHRleHQgKz0gcGFyYW1zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucy5sZW5ndGggPyAn77yJ5ZKM5p+Q5LqbJyA6ICfvvIknO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGFyYW1zLm5hbWVzcGFjZXJlc3RyaWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIDEgPT4gVGFsaywgMiA9PiBVc2VyLCBldGMuXG5cdFx0XHRcdFx0XHRjb25zdCBuYW1lc3BhY2VOYW1lcyA9IHBhcmFtcy5uYW1lc3BhY2VyZXN0cmljdGlvbnMubWFwKChpZCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbWVudUZvcm1hdHRlZE5hbWVzcGFjZXNbaWRdO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ZXh0ICs9IGAke1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ1tbSGVscDrlkb3lkI3nqbrpl7R85ZG95ZCN56m66Ze0XV3vvIgnLCAnW1tIZWxwOuWRveWQjeepuumWk3zlkb3lkI3nqbrplpNdXe+8iCcpICtcblx0XHRcdFx0XHRcdFx0bWFrZVNlbnRlbmNlKG5hbWVzcGFjZU5hbWVzKVxuXHRcdFx0XHRcdFx0fe+8iWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5hcmVhKSB7XG5cdFx0XHRcdFx0dGV4dCArPSBgfGFyZWE9JHtwYXJhbXMuYXJlYX1gO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChwYXJhbXMubm9lbWFpbCkge1xuXHRcdFx0XHRcdFx0dGV4dCArPSAnfGVtYWlsPXllcyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwYXJhbXMubm9jcmVhdGUpIHtcblx0XHRcdFx0XHRcdHRleHQgKz0gJ3xhY2NvdW50Y3JlYXRlPXllcyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzZXR0aW5ncy5zaWcpIHtcblx0XHRcdHRleHQgKz0gYHxzaWc9JHtzZXR0aW5ncy5zaWd9YDtcblx0XHR9XG5cdFx0cmV0dXJuIGAke3RleHR9fX1gO1xuXHR9O1xuXHRUd2lua2xlLmJsb2NrLmNhbGxiYWNrLm1haW4gPSAocGFnZW9iaikgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0Y29uc3QgZGF0ZSA9IG5ldyBNb3JlYml0cy5kYXRlKHBhZ2VvYmouZ2V0TG9hZFRpbWUoKSk7XG5cdFx0Y29uc3Qge21lc3NhZ2VEYXRhfSA9IHBhcmFtcztcblx0XHRsZXQgdGV4dDtcblx0XHRwYXJhbXMuaW5kZWZpbml0ZSA9IE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHBhcmFtcy5leHBpcnkpO1xuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2JsYW5rVGFsa3BhZ2VPbkluZGVmQmxvY2snKSAmJiBwYXJhbXMudGVtcGxhdGUgIT09ICd1dy1sYmxvY2snICYmIHBhcmFtcy5pbmRlZmluaXRlKSB7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5qC55o2u5Y+C5pWw6K6+572u5riF56m66K6o6K666aG15bm25Li65pel5pyf5Yib5bu65pawMue6p+agh+mimCcsXG5cdFx0XHRcdFx0J+agueaTmuWBj+WlveioreWumua4heepuuiojuirlumggeS4pueCuuaXpeacn+W7uueri+aWsDLntJrmqJnpoYwnXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0XHR0ZXh0ID0gYCR7ZGF0ZS5tb250aEhlYWRlcigpfVxcbmA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBkYXRlSGVhZGVyUmVnZXggPSBkYXRlLm1vbnRoSGVhZGVyUmVnZXgoKTtcblx0XHRcdGxldCBkYXRlSGVhZGVyUmVnZXhMYXN0O1xuXHRcdFx0bGV0IGRhdGVIZWFkZXJSZWdleFJlc3VsdDtcblx0XHRcdHdoaWxlICgoZGF0ZUhlYWRlclJlZ2V4TGFzdCA9IGRhdGVIZWFkZXJSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuXHRcdFx0XHRkYXRlSGVhZGVyUmVnZXhSZXN1bHQgPSBkYXRlSGVhZGVyUmVnZXhMYXN0O1xuXHRcdFx0fVxuXHRcdFx0Ly8gSWYgZGF0ZUhlYWRlclJlZ2V4UmVzdWx0IGlzIG51bGwgdGhlbiBsYXN0SGVhZGVySW5kZXggaXMgbmV2ZXIgY2hlY2tlZC4gSWYgaXQgaXMgbm90IG51bGwgYnV0XG5cdFx0XHQvLyBcXG49PSBpcyBub3QgZm91bmQsIHRoZW4gdGhlIGRhdGUgaGVhZGVyIG11c3QgYmUgYXQgdGhlIHZlcnkgc3RhcnQgb2YgdGhlIHBhZ2UuIGxhc3RJbmRleE9mXG5cdFx0XHQvLyByZXR1cm5zIC0xIGluIHRoaXMgY2FzZSwgc28gbGFzdEhlYWRlckluZGV4IGdldHMgc2V0IHRvIDAgYXMgZGVzaXJlZC5cblx0XHRcdGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IHRleHQubGFzdEluZGV4T2YoJ1xcbj09JykgKyAxO1xuXHRcdFx0aWYgKHRleHQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0ZXh0ICs9ICdcXG5cXG4nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFkYXRlSGVhZGVyUmVnZXhSZXN1bHQgfHwgZGF0ZUhlYWRlclJlZ2V4UmVzdWx0LmluZGV4ICE9PSBsYXN0SGVhZGVySW5kZXgpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmnKrmib7liLDlvZPmnIjnmoTkuoznuqfmoIfpopjvvIzlsIbliJvlu7rmlrDnmoQnLCAn5pyq5om+5Yiw55W25pyI55qE5LqM57Sa5qiZ6aGM77yM5bCH5bu656uL5paw55qEJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dGV4dCArPSBgJHtkYXRlLm1vbnRoSGVhZGVyKCl9XFxuYDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cGFyYW1zLmV4cGlyeSA9IHBhcmFtcy50ZW1wbGF0ZV9leHBpcnkgPT09IHVuZGVmaW5lZCA/IHBhcmFtcy5leHBpcnkgOiBwYXJhbXMudGVtcGxhdGVfZXhwaXJ5O1xuXHRcdHRleHQgKz0gVHdpbmtsZS5ibG9jay5jYWxsYmFjay5nZXRCbG9ja05vdGljZVdpa2l0ZXh0KHBhcmFtcyk7XG5cdFx0Ly8gYnVpbGQgdGhlIGVkaXQgc3VtbWFyeVxuXHRcdGxldCBzdW1tYXJ5ID0gcGFyYW1zLnVzZXJ0YWxrX3N1bW1hcnk7XG5cdFx0aWYgKG1lc3NhZ2VEYXRhLnN1cHByZXNzQXJ0aWNsZUluU3VtbWFyeSAhPT0gdHJ1ZSAmJiBwYXJhbXMuYXJ0aWNsZSkge1xuXHRcdFx0c3VtbWFyeSArPSBgJHt3aW5kb3cud2dVTFMoJ++8jOS6jicsICfvvIzmlrwnKX1bWzoke3BhcmFtcy5hcnRpY2xlfV1dYDtcblx0XHR9XG5cdFx0cGFnZW9iai5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnkpO1xuXHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hCbG9ja05vdGljZXMnKSk7XG5cdFx0cGFnZW9iai5zYXZlKCk7XG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuYmxvY2ssICdibG9jaycpO1xufSkoalF1ZXJ5KTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuXG4vKiEgVHdpbmtsZS5qcyAtIGZyaWVuZGx5dGFsa2JhY2suanMgKi9cbihmdW5jdGlvbiBmcmllbmRseXRhbGtiYWNrKCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdC8qKlxuXHQgKiBmcmllbmRseXRhbGtiYWNrLmpzOiBUYWxrYmFjayBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiVEJcIilcblx0ICogQWN0aXZlIG9uOiBBbnkgcGFnZSB3aXRoIHJlbGV2YW50IHVzZXIgbmFtZSAodXNlcnNwYWNlLCBjb250cmlicywgZXRjLikgZXhjZXB0IElQIHJhbmdlc1xuXHQgKiBDb25maWcgZGlyZWN0aXZlcyBpbjogRnJpZW5kbHlDb25maWdcblx0ICovXG5cdFR3aW5rbGUudGFsa2JhY2sgPSAoKSA9PiB7XG5cdFx0aWYgKCFtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0VHdpbmtsZS50YWxrYmFjay5jYWxsYmFjayxcblx0XHRcdCfpgJrlkYonLFxuXHRcdFx0J2ZyaWVuZGx5LXRhbGtiYWNrJyxcblx0XHRcdHdpbmRvdy53Z1VMUygn5Zue5aSN6YCa5ZGKJywgJ+WbnuimhumAmuWRiicpXG5cdFx0KTtcblx0fTtcblx0VHdpbmtsZS50YWxrYmFjay5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpICYmXG5cdFx0XHQhY29uZmlybSh3aW5kb3cud2dVTFMoJ+aCqOWvguWvnuWIsOS6huimgeiHquW3seWbnuWkjeiHquW3seeahOeoi+W6puS5iO+8nycsICfmgqjlr4Llr57liLDkuobopoHoh6rlt7Hlm57opoboh6rlt7HnmoTnqIvluqbpurzvvJ8nKSlcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgV2luZG93ID0gbmV3IE1vcmViaXRzLnNpbXBsZVdpbmRvdyg2MDAsIDM1MCk7XG5cdFx0V2luZG93LnNldFRpdGxlKHdpbmRvdy53Z1VMUygn5Zue5aSN6YCa5ZGKJywgJ+WbnuimhumAmuWRiicpKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5YWz5LqOe3t0YWxrYmFja319JywgJ+mXnOaWvHt7dGFsa2JhY2t9fScpLCAnVGVtcGxhdGU6VGFsa2JhY2snKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+mAmuWRiuiuvue9ricsICfpgJrlkYroqK3lrponKSwgJ0g6VFcvUFJFRiN0YWxrYmFjaycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXL0RPQyN0YWxrYmFjaycpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUudGFsa2JhY2suZXZhbHVhdGUpO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdyYWRpbycsXG5cdFx0XHRuYW1lOiAndGJ0YXJnZXQnLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zue5aSN77ya5oiR55qE6K6o6K666aG1JywgJ+Wbnuimhu+8muaIkeeahOiojuirlumggScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbXl0YWxrJyxcblx0XHRcdFx0XHRjaGVja2VkOiAndHJ1ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflm57lpI3vvJrlhbbku5bnlKjmiLfnmoTorqjorrrpobUnLCAn5Zue6KaG77ya5YW25LuW5L2/55So6ICF55qE6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0dmFsdWU6ICd1c2VydGFsaycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflm57lpI3vvJrlhbblroPpobXpnaInLCAn5Zue6KaG77ya5YW25a6D6aCB6Z2iJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdvdGhlcicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgoDor7forqjorronLCAn6YKA6KuL6KiO6KuWJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdzZWUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICfpgJrlkYrmnb/pgJrnn6UnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm90aWNlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+KAnOacieaWsOmCruS7tuKAnScsICfjgIzmnInmlrDpg7Xku7bjgI0nKSxcblx0XHRcdFx0XHR2YWx1ZTogJ21haWwnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnRhbGtiYWNrLmNoYW5nZVRhcmdldCxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6ICflt6XkvZzljLonLFxuXHRcdFx0bmFtZTogJ3dvcmtfYXJlYScsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcHJldmlld2xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0JChwcmV2aWV3bGluaykub24oJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0VHdpbmtsZS50YWxrYmFjay5wcmV2aWV3KHJlc3VsdCk7IC8vIHxyZXN1bHR8IGlzIGRlZmluZWQgYmVsb3dcblx0XHR9KTtcblxuXHRcdHByZXZpZXdsaW5rLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcblx0XHRwcmV2aWV3bGluay50ZXh0Q29udGVudCA9IHdpbmRvdy53Z1VMUygn6aKE6KeIJywgJ+mgkOimvScpO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0aWQ6ICd0YWxrYmFja3ByZXZpZXcnLFxuXHRcdFx0bGFiZWw6IFtwcmV2aWV3bGlua10sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRpZDogJ2ZyaWVuZGx5dGFsa2JhY2stcHJldmlld2JveCcsXG5cdFx0XHRzdHlsZTogJ2Rpc3BsYXk6IG5vbmUnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0V2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdHJlc3VsdC5wcmV2aWV3ZXIgPSBuZXcgTW9yZWJpdHMud2lraS5wcmV2aWV3KCQocmVzdWx0KS5maW5kKCdkaXYjZnJpZW5kbHl0YWxrYmFjay1wcmV2aWV3Ym94JykubGFzdCgpWzBdKTtcblx0XHQvLyBXZSBtdXN0IGluaXQgdGhlXG5cdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0cmVzdWx0LnRidGFyZ2V0WzBdLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSB1c2VyIGhhcyBvcHRlZCBvdXQgZnJvbSB0YWxrYmFja1xuXHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0cHJvcDogJ2V4dGxpbmtzJyxcblx0XHRcdHRpdGxlczogYFVzZXIgdGFsazoke213LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpfWAsXG5cdFx0XHRlbHF1ZXJ5OiAndXNlcmpzLmludmFsaWQvbm9UYWxrYmFjaycsXG5cdFx0XHRlbGxpbWl0OiAnMScsXG5cdFx0fTtcblx0XHRjb25zdCB5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdHdpbmRvdy53Z1VMUygn5oqT5Y+W6YCA5Ye66YCa5ZGK5L+h5oGvJywgJ+aKk+WPlumAgOWHuumAmuWRiuizh+ioiicpLFxuXHRcdFx0cXVlcnksXG5cdFx0XHRUd2lua2xlLnRhbGtiYWNrLmNhbGxiYWNrLm9wdG91dFN0YXR1c1xuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19hcGkucG9zdCgpO1xuXHR9O1xuXHRUd2lua2xlLnRhbGtiYWNrLm9wdG91dCA9ICcnO1xuXHRUd2lua2xlLnRhbGtiYWNrLmNhbGxiYWNrLm9wdG91dFN0YXR1cyA9IChhcGlvYmopID0+IHtcblx0XHRjb25zdCAkZWwgPSAkKGFwaW9iai5nZXRYTUwoKSkuZmluZCgnZWwnKTtcblx0XHRpZiAoJGVsLmxlbmd0aCkge1xuXHRcdFx0VHdpbmtsZS50YWxrYmFjay5vcHRvdXQgPVxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKSArIHdpbmRvdy53Z1VMUygn5LiN5biM5pyb5pS25Yiw5Zue5aSN6YCa5ZGKJywgJ+S4jeW4jOacm+aUtuWIsOWbnuimhumAmuWRiicpO1xuXHRcdFx0Y29uc3QgdXJsID0gJGVsLnRleHQoKTtcblx0XHRcdGNvbnN0IHJlYXNvbiA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgncmVhc29uJywgdXJsKTtcblx0XHRcdFR3aW5rbGUudGFsa2JhY2sub3B0b3V0ICs9IHJlYXNvbiA/IGDvvJoke01vcmViaXRzLnN0cmluZy5hcHBlbmRQdW5jdHVhdGlvbihyZWFzb24pfWAgOiAn44CCJztcblx0XHR9XG5cdFx0JGJvZHkuZmluZCgnI3R3aW5rbGUtdGFsa2JhY2stb3B0b3V0LW1lc3NhZ2UnKS50ZXh0KFR3aW5rbGUudGFsa2JhY2sub3B0b3V0KTtcblx0fTtcblx0bGV0IHByZXZfcGFnZSA9ICcnO1xuXHRsZXQgcHJldl9zZWN0aW9uID0gJyc7XG5cdGxldCBwcmV2X21lc3NhZ2UgPSAnJztcblx0VHdpbmtsZS50YWxrYmFjay5jaGFuZ2VUYXJnZXQgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWVzO1xuXHRcdGNvbnN0IHJvb3QgPSBlLnRhcmdldC5mb3JtO1xuXHRcdGNvbnN0IFtvbGRfYXJlYV0gPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocm9vdCwgJ3dvcmtfYXJlYScpO1xuXHRcdGlmIChyb290LnNlY3Rpb24pIHtcblx0XHRcdHByZXZfc2VjdGlvbiA9IHJvb3Quc2VjdGlvbi52YWx1ZTtcblx0XHR9XG5cdFx0aWYgKHJvb3QubWVzc2FnZSkge1xuXHRcdFx0cHJldl9tZXNzYWdlID0gcm9vdC5tZXNzYWdlLnZhbHVlO1xuXHRcdH1cblx0XHRpZiAocm9vdC5wYWdlKSB7XG5cdFx0XHRwcmV2X3BhZ2UgPSByb290LnBhZ2UudmFsdWU7XG5cdFx0fVxuXHRcdGxldCB3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WbnuWkjemAmuWRiuS/oeaBrycsICflm57opobpgJrlkYros4foqIonKSxcblx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdH0pO1xuXHRcdHJvb3QucHJldmlld2VyLmNsb3NlUHJldmlldygpO1xuXHRcdHN3aXRjaCAodmFsdWUpIHtcblx0XHRcdGNhc2UgJ3VzZXJ0YWxrJzpcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0XHRcdHN0eWxlOiAnY29sb3I6ICNmMDAnLFxuXHRcdFx0XHRcdGlkOiAndHdpbmtsZS10YWxrYmFjay1vcHRvdXQtbWVzc2FnZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdwYWdlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnlKjmiLfvvIjlv4XloavvvIknLCAn5L2/55So6ICF77yI5b+F5aGr77yJJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfmgqjnlZnoqIDpobXpnaLnmoTnlKjmiLflkI3vvIzlv4XloavjgIInLCAn5oKo55WZ6KiA6aCB6Z2i55qE5L2/55So6ICF5ZCN56ix77yM5b+F5aGr44CCJyksXG5cdFx0XHRcdFx0dmFsdWU6IHByZXZfcGFnZSxcblx0XHRcdFx0XHRyZXF1aXJlZDogdHJ1ZSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NlY3Rpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eroOiKgu+8iOWPr+mAie+8iScsICfnq6Dnr4DvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5oKo55WZ6KiA55qE56ug6IqC5qCH6aKY77yM55WZ56m65YiZ5LiN5Lya5Lqn55Sf56ug6IqC6ZO+5o6l44CCJyxcblx0XHRcdFx0XHRcdCfmgqjnlZnoqIDnmoTnq6Dnr4DmqJnpoYzvvIznlZnnqbrliYfkuI3mnIPnlKLnlJ/nq6Dnr4DpgKPntZDjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogcHJldl9zZWN0aW9uLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdub3RpY2UnOiB7XG5cdFx0XHRcdGNvbnN0IG5vdGljZWJvYXJkID0gd29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bmFtZTogJ25vdGljZWJvYXJkJyxcblx0XHRcdFx0XHRsYWJlbDogJ+mAmuWRiuadv++8micsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtuYm5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKFR3aW5rbGUudGFsa2JhY2subm90aWNlYm9hcmRzKSkge1xuXHRcdFx0XHRcdG5vdGljZWJvYXJkLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdGxhYmVsOiBkYXRhLmxhYmVsLFxuXHRcdFx0XHRcdFx0dmFsdWU6IG5ibmFtZSxcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiAhIWRhdGEuZGVmYXVsdFNlbGVjdGVkLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NlY3Rpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eroOiKgu+8iOWPr+mAie+8iScsICfnq6Dnr4DvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+eroOiKguagh+mimO+8jOeVmeepuuWImeS4jeS8muS6p+eUn+eroOiKgumTvuaOpeOAgicsICfnq6Dnr4DmqJnpoYzvvIznlZnnqbrliYfkuI3mnIPnlKLnlJ/nq6Dnr4DpgKPntZDjgIInKSxcblx0XHRcdFx0XHR2YWx1ZTogcHJldl9zZWN0aW9uLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdvdGhlcic6XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGxhYmVsOiAnJyxcblx0XHRcdFx0XHRzdHlsZTogJ2NvbG9yOiAjZjAwJyxcblx0XHRcdFx0XHRpZDogJ3R3aW5rbGUtdGFsa2JhY2stb3B0b3V0LW1lc3NhZ2UnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAncGFnZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5a6M5pW06aG16Z2i5ZCNJywgJ+WujOaVtOmggemdouWQjScpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjnlZnkuIvmtojmga/nmoTlrozmlbTpobXpnaLlkI3vvIzkvovlpoLigJxMSUJfdGFsazrpppbpobXigJ3jgIInLFxuXHRcdFx0XHRcdFx0J+aCqOeVmeS4i+ioiuaBr+eahOWujOaVtOmggemdouWQje+8jOS+i+WmguOAjExJQl90YWxrOummlumggeOAjeOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcmV2X3BhZ2UsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdzZWN0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnq6DoioLvvIjlj6/pgInvvIknLCAn56ug56+A77yI5Y+v6YG477yJJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aCqOeVmeiogOeahOeroOiKguagh+mimO+8jOeVmeepuuWImeS4jeS8muS6p+eUn+eroOiKgumTvuaOpeOAgicsXG5cdFx0XHRcdFx0XHQn5oKo55WZ6KiA55qE56ug56+A5qiZ6aGM77yM55WZ56m65YmH5LiN5pyD55Si55Sf56ug56+A6YCj57WQ44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dmFsdWU6IHByZXZfc2VjdGlvbixcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWFpbCc6XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NlY3Rpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUteWtkOmCruS7tuS4u+mimO+8iOWPr+mAie+8iScsICfpm7vlrZDpg7Xku7bkuLvpoYzvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+aCqOWPkeWHuueahOeUteWtkOmCruS7tueahOS4u+mimOOAgicsICfmgqjnmbzlh7rnmoTpm7vlrZDpg7Xku7bnmoTkuLvpoYzjgIInKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2VlJzpcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAncGFnZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5a6M5pW06aG16Z2i5ZCNJywgJ+WujOaVtOmggemdouWQjScpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjnlZnkuIvmtojmga/nmoTlrozmlbTpobXpnaLlkI3vvIzkvovlpoLigJxMSUJfdGFsazrpppbpobXigJ3jgIInLFxuXHRcdFx0XHRcdFx0J+aCqOeVmeS4i+ioiuaBr+eahOWujOaVtOmggemdouWQje+8jOS+i+WmguOAjExJQl90YWxrOummlumggeOAjeOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcmV2X3BhZ2UsXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdG5hbWU6ICdzZWN0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnq6DoioLvvIjlj6/pgInvvIknLCAn56ug56+A77yI5Y+v6YG477yJJyksXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aCqOeVmeiogOeahOeroOiKguagh+mimO+8jOeVmeepuuWImeS4jeS8muS6p+eUn+eroOiKgumTvuaOpeOAgicsXG5cdFx0XHRcdFx0XHQn5oKo55WZ6KiA55qE56ug56+A5qiZ6aGM77yM55WZ56m65YmH5LiN5pyD55Si55Sf56ug56+A6YCj57WQ44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dmFsdWU6IHByZXZfc2VjdGlvbixcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0LyogY2FzZSAnbXl0YWxrJzogKi9cblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdGxhYmVsOiAnJyxcblx0XHRcdFx0XHRzdHlsZTogJ2NvbG9yOiAjZjAwJyxcblx0XHRcdFx0XHRpZDogJ3R3aW5rbGUtdGFsa2JhY2stb3B0b3V0LW1lc3NhZ2UnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAnc2VjdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56ug6IqC77yI5Y+v6YCJ77yJJywgJ+eroOevgO+8iOWPr+mBuO+8iScpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjnlZnoqIDnmoTnq6DoioLmoIfpopjvvIznlZnnqbrliJnkuI3kvJrkuqfnlJ/nq6DoioLpk77mjqXjgIInLFxuXHRcdFx0XHRcdFx0J+aCqOeVmeiogOeahOeroOevgOaomemhjO+8jOeVmeepuuWJh+S4jeacg+eUoueUn+eroOevgOmAo+e1kOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcmV2X3NlY3Rpb24sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWYgKHZhbHVlICE9PSAnbm90aWNlJykge1xuXHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mZhOWKoOS/oeaBr++8iOWPr+mAie+8ie+8micsICfpmYTliqDos4foqIrvvIjlj6/pgbjvvInvvJonKSxcblx0XHRcdFx0bmFtZTogJ21lc3NhZ2UnLFxuXHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+S8muWcqOWbnuWkjemAmuWRiuaooeadv+S4i+WHuueOsOeahOa2iOaBr++8jOaCqOeahOetvuWQjeS8muiiq+WKoOWcqOacgOWQjuOAgicsXG5cdFx0XHRcdFx0J+acg+WcqOWbnuimhumAmuWRiuaooeadv+S4i+WHuuePvueahOioiuaBr++8jOaCqOeahOewveWQjeacg+iiq+WKoOWcqOacgOW+jOOAgidcblx0XHRcdFx0KSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR3b3JrX2FyZWEgPSB3b3JrX2FyZWEucmVuZGVyKCk7XG5cdFx0cm9vdC5yZXBsYWNlQ2hpbGQod29ya19hcmVhLCBvbGRfYXJlYSk7XG5cdFx0aWYgKHJvb3QubWVzc2FnZSkge1xuXHRcdFx0cm9vdC5tZXNzYWdlLnZhbHVlID0gcHJldl9tZXNzYWdlO1xuXHRcdH1cblx0XHQkYm9keS5maW5kKCcjdHdpbmtsZS10YWxrYmFjay1vcHRvdXQtbWVzc2FnZScpLnRleHQoVHdpbmtsZS50YWxrYmFjay5vcHRvdXQpO1xuXHR9O1xuXHRUd2lua2xlLnRhbGtiYWNrLm5vdGljZWJvYXJkcyA9IHtcblx0XHRhZmZwOiB7XG5cdFx0XHRsYWJlbDogYExJQjpBRi9GUO+8iCR7d2luZG93LndnVUxTKCfov4fmu6TlmajlpITnkIYv5oql5ZGKJywgJ+mBjua/vuWZqOiZleeQhi/loLHlkYonKX3vvIlgLFxuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn6L+H5ruk5Zmo6ZSZ6K+v5oql5ZGK5pyJ5paw5Zue5bqUJywgJ+mBjua/vuWZqOmMr+iqpOWgseWRiuacieaWsOWbnuaHiScpLFxuXHRcdFx0Y29udGVudDogYCR7d2luZG93LndnVUxTKFxuXHRcdFx0XHQn5oKo55qEW1tMSUJfdGFsazrov4fmu6TlmajlpITnkIYv5oql5ZGKfOi/h+a7pOWZqOmUmeivr+aKpeWRil1d5bey5pyJ5Zue5bqU77yM6K+35YmN5b6A5p+l55yL44CCJyxcblx0XHRcdFx0J+aCqOeahFtbTElCX3RhbGs66L+H5ruk5Zmo5aSE55CGL+aKpeWRinzpgY7mv77lmajpjK/oqqTloLHlkYpdXeW3suacieWbnuaHie+8jOiri+WJjeW+gOafpeeci+OAgidcblx0XHRcdCl9LS1+fmAuY29uY2F0KCd+ficpLFxuXHRcdFx0ZWRpdFN1bW1hcnk6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+acieWFs1tbTElCX3RhbGs66L+H5ruk5Zmo5aSE55CGL+aKpeWRinzov4fmu6TlmajplJnor6/miqXlkYpdXeeahOmAmuefpScsXG5cdFx0XHRcdCfmnInpl5xbW0xJQl90YWxrOui/h+a7pOWZqOWkhOeQhi/miqXlkYp86YGO5r++5Zmo6Yyv6Kqk5aCx5ZGKXV3nmoTpgJrnn6UnXG5cdFx0XHQpLFxuXHRcdFx0ZGVmYXVsdFNlbGVjdGVkOiB0cnVlLFxuXHRcdH0sXG5cdFx0c2JsOiB7XG5cdFx0XHRsYWJlbDogJ1NwYW0tYmxhY2tsaXN0Jyxcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+Weg+WcvumTvuaOpem7keWQjeWNleivt+axguacieaWsOWbnuW6lCcsICflnoPlnL7pgKPntZDpu5HlkI3llq7oq4vmsYLmnInmlrDlm57mh4knKSxcblx0XHRcdGNvbnRlbnQ6IGAke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+aCqOeahFtbTElCX3RhbGs6566h55CG5ZGY5ZGK56S65p2/fOWeg+WcvumTvuaOpem7keWQjeWNleivt+axgl1d5bey5pyJ5Zue5bqU77yM6K+35YmN5b6A5p+l55yL44CCJyxcblx0XHRcdFx0J+aCqOeahFtbTElCX3RhbGs6566h55CG5ZGY5ZGK56S65p2/fOWeg+WcvumAo+e1kOm7keWQjeWWruiri+axgl1d5bey5pyJ5Zue5oeJ77yM6KuL5YmN5b6A5p+l55yL44CCJ1xuXHRcdFx0KX0tLX5+YC5jb25jYXQoJ35+JyksXG5cdFx0XHRlZGl0U3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5pyJ5YWzW1tMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6ZO+5o6l6buR5ZCN5Y2V6K+35rGCXV3nmoTpgJrnn6UnLFxuXHRcdFx0XHQn5pyJ6ZecW1tMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6YCj57WQ6buR5ZCN5Zau6KuL5rGCXV3nmoTpgJrnn6UnXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0c2hsOiB7XG5cdFx0XHRsYWJlbDogJ1NwYW0td2hpdGVsaXN0Jyxcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+Weg+WcvumTvuaOpeeZveWQjeWNleivt+axguacieaWsOWbnuW6lCcsICflnoPlnL7pgKPntZDnmb3lkI3llq7oq4vmsYLmnInmlrDlm57mh4knKSxcblx0XHRcdGNvbnRlbnQ6IGAke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0J+aCqOeahFtbTElCX3RhbGs6566h55CG5ZGY5ZGK56S65p2/fOWeg+WcvumTvuaOpeeZveWQjeWNleivt+axgl1d5bey5pyJ5Zue5bqU77yM6K+35YmN5b6A5p+l55yL44CCJyxcblx0XHRcdFx0J+aCqOeahFtbTElCX3RhbGs6566h55CG5ZGY5ZGK56S65p2/fOWeg+WcvumAo+e1kOeZveWQjeWWruiri+axgl1d5bey5pyJ5Zue5oeJ77yM6KuL5YmN5b6A5p+l55yL44CCJ1xuXHRcdFx0KX0tLX5+YC5jb25jYXQoJ35+JyksXG5cdFx0XHRlZGl0U3VtbWFyeTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQn5pyJ5YWzW1tMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6ZO+5o6l55m95ZCN5Y2V6K+35rGCXV3nmoTpgJrnn6UnLFxuXHRcdFx0XHQn5pyJ6ZecW1tMSUJfdGFsazrnrqHnkIblkZjlkYrnpLrmnb985Z6D5Zy+6YCj57WQ55m95ZCN5Zau6KuL5rGCXV3nmoTpgJrnn6UnXG5cdFx0XHQpLFxuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUudGFsa2JhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IGZvcm0gPSBlLnRhcmdldDtcblx0XHRjb25zdCBbdGJ0YXJnZXRdID0gZm9ybS5nZXRDaGVja2VkKCd0YnRhcmdldCcpO1xuXHRcdGxldCBwYWdlO1xuXHRcdGxldCBtZXNzYWdlO1xuXHRcdGNvbnN0IHNlY3Rpb24gPSBmb3JtLnNlY3Rpb24udmFsdWU7XG5cdFx0bGV0IGVkaXRTdW1tYXJ5O1xuXHRcdGlmICh0YnRhcmdldCA9PT0gJ25vdGljZScpIHtcblx0XHRcdHBhZ2UgPSBmb3JtLm5vdGljZWJvYXJkLnZhbHVlO1xuXHRcdFx0KHtlZGl0U3VtbWFyeX0gPSBUd2lua2xlLnRhbGtiYWNrLm5vdGljZWJvYXJkc1twYWdlXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHVzZXJ0YWxrLCBvdGhlciwgc2VlXG5cdFx0XHRwYWdlID0gZm9ybS5wYWdlID8gZm9ybS5wYWdlLnZhbHVlIDogbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpO1xuXHRcdFx0aWYgKGZvcm0ubWVzc2FnZSkge1xuXHRcdFx0XHRtZXNzYWdlID0gZm9ybS5tZXNzYWdlLnZhbHVlLnRyaW0oKTtcblx0XHRcdH1cblx0XHRcdGlmICh0YnRhcmdldCA9PT0gJ21haWwnKSB7XG5cdFx0XHRcdGVkaXRTdW1tYXJ5ID0gd2luZG93LndnVUxTKCfpgJrnn6XvvJrmnInmlrDpgq7ku7YnLCAn6YCa55+l77ya5pyJ5paw6YO15Lu2Jyk7XG5cdFx0XHR9IGVsc2UgaWYgKHRidGFyZ2V0ID09PSAnc2VlJykge1xuXHRcdFx0XHRlZGl0U3VtbWFyeSA9IGAke3dpbmRvdy53Z1VMUygn6K+355yL55yLJywgJ+iri+eci+eciycpfVtbOiR7cGFnZX0ke3NlY3Rpb24gPyBgIyR7c2VjdGlvbn1gIDogJyd9XV0ke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5LiK55qE6K6o6K66Jyxcblx0XHRcdFx0XHQn5LiK55qE6KiO6KuWJ1xuXHRcdFx0XHQpfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0YnRhcmdldCBvbmUgb2YgbXl0YWxrLCB1c2VydGFsaywgb3RoZXJcblx0XHRcdFx0ZWRpdFN1bW1hcnkgPSBgJHt3aW5kb3cud2dVTFMoJ+WbnuWkjemAmuWRiicsICflm57opobpgJrlkYonKX3vvIhbWzpgO1xuXHRcdFx0XHRpZiAodGJ0YXJnZXQgIT09ICdvdGhlcicgJiYgIW5ldyBSZWdFeHAoYF5cXFxccyoke01vcmViaXRzLm5hbWVzcGFjZVJlZ2V4KDMpfTpgLCAnaScpLnRlc3QocGFnZSkpIHtcblx0XHRcdFx0XHRlZGl0U3VtbWFyeSArPSAnVXNlciB0YWxrOic7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWRpdFN1bW1hcnkgKz0gYCR7cGFnZSArIChzZWN0aW9uID8gYCMke3NlY3Rpb259YCA6ICcnKX1dXSlgO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdGNvbnN0IGZ1bGxVc2VyVGFsa1BhZ2VOYW1lID0gYCR7XG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVttdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpLnVzZXJfdGFsa11cblx0XHR9OiR7bXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJyl9YDtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IGZ1bGxVc2VyVGFsa1BhZ2VOYW1lO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUyhcblx0XHRcdCflm57lpI3pgJrlkYrlrozmiJDvvIzlsIblnKjlh6Dnp5LlhoXliLfmlrDpobXpnaInLFxuXHRcdFx0J+WbnuimhumAmuWRiuWujOaIkO+8jOWwh+WcqOW5vuenkuWFp+mHjeaWsOaVtOeQhumggemdoidcblx0XHQpO1xuXHRcdGNvbnN0IHRleHQgPSBgXFxuXFxuJHtUd2lua2xlLnRhbGtiYWNrLmdldE5vdGljZVdpa2l0ZXh0KHRidGFyZ2V0LCBwYWdlLCBzZWN0aW9uLCBtZXNzYWdlKVswXX1gO1xuXHRcdGNvbnN0IHRhbGtwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShmdWxsVXNlclRhbGtQYWdlTmFtZSwgd2luZG93LndnVUxTKCfliqDlhaXlm57lpI3pgJrlkYonLCAn5Yqg5YWl5Zue6KaG6YCa5ZGKJykpO1xuXHRcdHRhbGtwYWdlLnNldEVkaXRTdW1tYXJ5KGVkaXRTdW1tYXJ5KTtcblx0XHR0YWxrcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0dGFsa3BhZ2Uuc2V0QXBwZW5kVGV4dCh0ZXh0KTtcblx0XHR0YWxrcGFnZS5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0dGFsa3BhZ2Uuc2V0TWlub3JFZGl0KFR3aW5rbGUuZ2V0UHJlZignbWFya1RhbGtiYWNrQXNNaW5vcicpKTtcblx0XHR0YWxrcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHR0YWxrcGFnZS5hcHBlbmQoKTtcblx0fTtcblx0VHdpbmtsZS50YWxrYmFjay5wcmV2aWV3ID0gKGZvcm0pID0+IHtcblx0XHRjb25zdCBbdGJ0YXJnZXRdID0gZm9ybS5nZXRDaGVja2VkKCd0YnRhcmdldCcpO1xuXHRcdGNvbnN0IHNlY3Rpb24gPSBmb3JtLnNlY3Rpb24udmFsdWU7XG5cdFx0bGV0IHBhZ2U7XG5cdFx0bGV0IG1lc3NhZ2U7XG5cdFx0aWYgKHRidGFyZ2V0ID09PSAnbm90aWNlJykge1xuXHRcdFx0cGFnZSA9IGZvcm0ubm90aWNlYm9hcmQudmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHVzZXJ0YWxrLCBvdGhlciwgc2VlXG5cdFx0XHRwYWdlID0gZm9ybS5wYWdlID8gZm9ybS5wYWdlLnZhbHVlIDogbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpO1xuXHRcdFx0aWYgKGZvcm0ubWVzc2FnZSkge1xuXHRcdFx0XHRtZXNzYWdlID0gZm9ybS5tZXNzYWdlLnZhbHVlLnRyaW0oKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgW25vdGljZXRleHRdID0gVHdpbmtsZS50YWxrYmFjay5nZXROb3RpY2VXaWtpdGV4dCh0YnRhcmdldCwgcGFnZSwgc2VjdGlvbiwgbWVzc2FnZSk7XG5cdFx0Zm9ybS5wcmV2aWV3ZXIuYmVnaW5SZW5kZXIobm90aWNldGV4dCwgYFVzZXJfdGFsazoke213LmNvbmZpZy5nZXQoJ3dnUmVsZXZhbnRVc2VyTmFtZScpfWApOyAvLyBGb3JjZSB3aWtpdGV4dC9jb3JyZWN0IHVzZXJuYW1lXG5cdH07XG5cblx0VHdpbmtsZS50YWxrYmFjay5nZXROb3RpY2VXaWtpdGV4dCA9ICh0YnRhcmdldCwgcGFnZSwgc2VjdGlvbiwgbWVzc2FnZSkgPT4ge1xuXHRcdGxldCB0ZXh0O1xuXHRcdGxldCB0aXRsZTtcblx0XHRsZXQgY29udGVudDtcblx0XHRpZiAodGJ0YXJnZXQgPT09ICdub3RpY2UnKSB7XG5cdFx0XHQoe3RpdGxlfSA9IFR3aW5rbGUudGFsa2JhY2subm90aWNlYm9hcmRzW3BhZ2VdKTtcblx0XHRcdGNvbnRlbnQgPSBNb3JlYml0cy5zdHJpbmcuc2FmZVJlcGxhY2UoVHdpbmtsZS50YWxrYmFjay5ub3RpY2Vib2FyZHNbcGFnZV0uY29udGVudCwgJyRTRUNUSU9OJywgc2VjdGlvbik7XG5cdFx0XHR0ZXh0ID0gYD09ICR7dGl0bGV9ID09XFxuJHtjb250ZW50fWA7XG5cdFx0fSBlbHNlIGlmICh0YnRhcmdldCA9PT0gJ3NlZScpIHtcblx0XHRcdHRpdGxlID0gcGFnZSArIHdpbmRvdy53Z1VMUygn55qE55u45YWz6K6o6K66JywgJ+eahOebuOmXnOiojuirlicpO1xuXHRcdFx0Y29udGVudCA9ICd7eycuY29uY2F0KFxuXHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0YFBsZWFzZSBzZWV8bG9jYXRpb249JHtwYWdlfSR7c2VjdGlvbiA/IGAjJHtzZWN0aW9ufWAgOiAnJ318bW9yZT0ke21lc3NhZ2UudHJpbSgpfX19YFxuXHRcdFx0KTtcblx0XHRcdHRleHQgPSAne3snLmNvbmNhdChcblx0XHRcdFx0J3N1YnN0OicsXG5cdFx0XHRcdGBQbGVhc2Ugc2VlfGxvY2F0aW9uPSR7cGFnZX0ke3NlY3Rpb24gPyBgIyR7c2VjdGlvbn1gIDogJyd9fG1vcmU9JHttZXNzYWdlLnRyaW0oKX19fWBcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRleHQgPSAnPT0nO1xuXHRcdFx0aWYgKHRidGFyZ2V0ID09PSAnbWFpbCcpIHtcblx0XHRcdFx0dGl0bGUgPSBUd2lua2xlLmdldFByZWYoJ21haWxIZWFkaW5nJyk7XG5cdFx0XHRcdGNvbnRlbnQgPSBge3tZb3UndmUgZ290IG1haWx8c3ViamVjdD0ke3NlY3Rpb259fHRzPX5+YC5jb25jYXQoJ34nLCAnfn59fScpO1xuXHRcdFx0XHR0ZXh0ICs9IGAke1R3aW5rbGUuZ2V0UHJlZignbWFpbEhlYWRpbmcnKX09PVxcbnt7WW91J3ZlIGdvdCBtYWlsfHN1YmplY3Q9JHtzZWN0aW9ufWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0YnRhcmdldCBvbmUgb2YgbXl0YWxrLCB1c2VydGFsaywgb3RoZXJcblx0XHRcdFx0Ly8gY2xlYW4gdGFsa2JhY2sgaGVhZGluZzogc3RyaXAgc2VjdGlvbiBoZWFkZXIgbWFya2VycyB0aGF0IHdlcmUgZXJyb25lb3VzbHkgc3VnZ2VzdGVkIGluIHRoZSBkb2N1bWVudGF0aW9uXG5cdFx0XHRcdHRpdGxlID0gVHdpbmtsZS5nZXRQcmVmKCd0YWxrYmFja0hlYWRpbmcnKS5yZXBsYWNlKC9eXFxzKj0rXFxzKiguKj8pXFxzKj0rJFxccyovLCAnJDEnKTtcblx0XHRcdFx0Y29udGVudCA9IGB7e3RhbGtiYWNrfCR7cGFnZX0ke3NlY3Rpb24gPyBgfCR7c2VjdGlvbn1gIDogJyd9YDtcblx0XHRcdFx0dGV4dCArPSBgJHtUd2lua2xlLmdldFByZWYoJ3RhbGtiYWNrSGVhZGluZycpLnJlcGxhY2UoXG5cdFx0XHRcdFx0L15cXHMqPStcXHMqKC4qPylcXHMqPSskXFxzKi8sXG5cdFx0XHRcdFx0JyQxJ1xuXHRcdFx0XHQpfT09XFxue3t0YWxrYmFja3wke3BhZ2V9JHtzZWN0aW9uID8gYHwke3NlY3Rpb259YCA6ICcnfWA7XG5cdFx0XHR9XG5cdFx0XHRjb250ZW50ICs9ICd8dHM9fn4nLmNvbmNhdCgnficsICd+fn19Jyk7XG5cdFx0XHR0ZXh0ICs9ICd8dHM9fn4nLmNvbmNhdCgnficsICd+fn19Jyk7XG5cdFx0XHRpZiAobWVzc2FnZSkge1xuXHRcdFx0XHRjb250ZW50ICs9IGBcXG4ke21lc3NhZ2V9YDtcblx0XHRcdFx0dGV4dCArPSBgXFxuJHttZXNzYWdlfSAgfn5gLmNvbmNhdCgnfn4nKTtcblx0XHRcdH0gZWxzZSBpZiAoVHdpbmtsZS5nZXRQcmVmKCdpbnNlcnRUYWxrYmFja1NpZ25hdHVyZScpKSB7XG5cdFx0XHRcdHRleHQgKz0gJ1xcbn5+Jy5jb25jYXQoJ35+Jyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBbdGV4dCwgdGl0bGUsIGNvbnRlbnRdO1xuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLnRhbGtiYWNrLCAndGFsa2JhY2snKTtcbn0pKGpRdWVyeSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZXNwZWVkeS5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVzcGVlZHkoJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0LyoqXG5cdCAqIHR3aW5rbGVzcGVlZHkuanM6IENTRCBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiQ1NEXCIpXG5cdCAqIEFjdGl2ZSBvbjogTm9uLXNwZWNpYWwsIGV4aXN0aW5nIHBhZ2VzXG5cdCAqXG5cdCAqIE5PVEUgRk9SIERFVkVMT1BFUlM6XG5cdCAqICBJZiBhZGRpbmcgYSBuZXcgY3JpdGVyaW9uLCBhZGQgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIHBsYWNlcyBhdCB0aGUgdG9wIG9mXG5cdCAqICB0d2lua2xlY29uZmlnLmpzLlxuXHQgKiAgQWxzbywgY2hlY2sgb3V0IHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgQ1NEIHByZWZlcmVuY2VzIGluIHR3aW5rbGUuanMsXG5cdCAqICBhbmQgYWRkIHlvdXIgbmV3IGNyaXRlcmlvbiB0byB0aG9zZSBpZiB5b3UgdGhpbmsgaXQgd291bGQgYmUgZ29vZC5cblx0ICovXG5cdFR3aW5rbGUuc3BlZWR5ID0gKCkgPT4ge1xuXHRcdC8vIERpc2FibGUgb246XG5cdFx0Ly8gKiBzcGVjaWFsIHBhZ2VzXG5cdFx0Ly8gKiBub24tZXhpc3RlbnQgcGFnZXNcblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA8IDAgfHwgIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLFxuXHRcdFx0d2luZG93LndnVUxTKCfpgJ/liKAnLCAn6YCf5YiqJyksXG5cdFx0XHQndHctY3NkJyxcblx0XHRcdE1vcmViaXRzLnVzZXJJc1N5c29wID8gd2luZG93LndnVUxTKCflv6vpgJ/liKDpmaQnLCAn5b+r6YCf5Yiq6ZmkJykgOiB3aW5kb3cud2dVTFMoJ+ivt+axguW/q+mAn+WIoOmZpCcsICfoq4vmsYLlv6vpgJ/liKrpmaQnKVxuXHRcdCk7XG5cdH07XG5cdC8vIFRoaXMgZnVuY3Rpb24gaXMgcnVuIHdoZW4gdGhlIENTRCB0YWIvaGVhZGVyIGxpbmsgaXMgY2xpY2tlZFxuXHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRUd2lua2xlLnNwZWVkeS5pbml0RGlhbG9nKFxuXHRcdFx0TW9yZWJpdHMudXNlcklzU3lzb3AgPyBUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5ldmFsdWF0ZVN5c29wIDogVHdpbmtsZS5zcGVlZHkuY2FsbGJhY2suZXZhbHVhdGVVc2VyLFxuXHRcdFx0dHJ1ZVxuXHRcdCk7XG5cdH07XG5cdC8vIFVzZWQgYnkgdW5saW5rIGZlYXR1cmVcblx0VHdpbmtsZS5zcGVlZHkuZGlhbG9nID0gbnVsbDtcblx0Ly8gVXNlZCB0aHJvdWdob3V0XG5cdFR3aW5rbGUuc3BlZWR5Lmhhc0NTRCA9ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlbGV0ZS1yZWFzb24nKTtcblx0Ly8gVGhlIHNwZWVkeSBjcml0ZXJpYSBsaXN0IGNhbiBiZSBpbiBvbmUgb2Ygc2V2ZXJhbCBtb2Rlc1xuXHRUd2lua2xlLnNwZWVkeS5tb2RlID0ge1xuXHRcdHN5c29wU2luZ2xlU3VibWl0OiAxLFxuXHRcdC8vIHJhZGlvIGJ1dHRvbnMsIG5vIHN1Ymdyb3Vwcywgc3VibWl0IHdoZW4gXCJTdWJtaXRcIiBidXR0b24gaXMgY2xpY2tlZFxuXHRcdHN5c29wUmFkaW9DbGljazogMixcblx0XHQvLyByYWRpbyBidXR0b25zLCBubyBzdWJncm91cHMsIHN1Ym1pdCB3aGVuIGEgcmFkaW8gYnV0dG9uIGlzIGNsaWNrZWRcblx0XHRzeXNvcE11bHRpcGxlU3VibWl0OiAzLFxuXHRcdC8vIGNoZWNrIGJveGVzLCBzdWJncm91cHMsIFwiU3VibWl0XCIgYnV0dG9uIGFscmVhZHkgcHJlc2VudFxuXHRcdHN5c29wTXVsdGlwbGVSYWRpb0NsaWNrOiA0LFxuXHRcdC8vIGNoZWNrIGJveGVzLCBzdWJncm91cHMsIG5lZWQgdG8gYWRkIGEgXCJTdWJtaXRcIiBidXR0b25cblx0XHR1c2VyTXVsdGlwbGVTdWJtaXQ6IDUsXG5cdFx0Ly8gY2hlY2sgYm94ZXMsIHN1Ymdyb3VwcywgXCJTdWJtaXRcIiBidXR0b24gYWxyZWFkeSBwcmVzc2VudFxuXHRcdHVzZXJNdWx0aXBsZVJhZGlvQ2xpY2s6IDYsXG5cdFx0Ly8gY2hlY2sgYm94ZXMsIHN1Ymdyb3VwcywgbmVlZCB0byBhZGQgYSBcIlN1Ym1pdFwiIGJ1dHRvblxuXHRcdHVzZXJTaW5nbGVTdWJtaXQ6IDcsXG5cdFx0Ly8gcmFkaW8gYnV0dG9ucywgc3ViZ3JvdXBzLCBzdWJtaXQgd2hlbiBcIlN1Ym1pdFwiIGJ1dHRvbiBpcyBjbGlja2VkXG5cdFx0dXNlclNpbmdsZVJhZGlvQ2xpY2s6IDgsXG5cdFx0Ly8gcmFkaW8gYnV0dG9ucywgc3ViZ3JvdXBzLCBzdWJtaXQgd2hlbiBhIHJhZGlvIGJ1dHRvbiBpcyBjbGlja2VkXG5cdFx0Ly8gYXJlIHdlIGluIFwiZGVsZXRlIHBhZ2VcIiBtb2RlP1xuXHRcdC8vIChzeXNvcHMgY2FuIGFjY2VzcyBib3RoIFwiZGVsZXRlIHBhZ2VcIiBbc3lzb3BdIGFuZCBcInRhZyBwYWdlIG9ubHlcIiBbdXNlcl0gbW9kZXMpXG5cdFx0aXNTeXNvcDogKG1vZGUpID0+IHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BTaW5nbGVTdWJtaXQgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlU3VibWl0IHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BSYWRpb0NsaWNrIHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BNdWx0aXBsZVJhZGlvQ2xpY2tcblx0XHRcdCk7XG5cdFx0fSxcblx0XHQvLyBkbyB3ZSBoYXZlIGEgXCJTdWJtaXRcIiBidXR0b24gb25jZSB0aGUgZm9ybSBpcyBjcmVhdGVkP1xuXHRcdGhhc1N1Ym1pdEJ1dHRvbjogKG1vZGUpID0+IHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BTaW5nbGVTdWJtaXQgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlU3VibWl0IHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BNdWx0aXBsZVJhZGlvQ2xpY2sgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS51c2VyTXVsdGlwbGVTdWJtaXQgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS51c2VyTXVsdGlwbGVSYWRpb0NsaWNrIHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUudXNlclNpbmdsZVN1Ym1pdFxuXHRcdFx0KTtcblx0XHR9LFxuXHRcdC8vIGlzIGRiLW11bHRpcGxlIHRoZSBvdXRjb21lIGhlcmU/XG5cdFx0aXNNdWx0aXBsZTogKG1vZGUpID0+IHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUudXNlck11bHRpcGxlU3VibWl0IHx8XG5cdFx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BNdWx0aXBsZVN1Ym1pdCB8fFxuXHRcdFx0XHRtb2RlID09PSBUd2lua2xlLnNwZWVkeS5tb2RlLnVzZXJNdWx0aXBsZVJhZGlvQ2xpY2sgfHxcblx0XHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlUmFkaW9DbGlja1xuXHRcdFx0KTtcblx0XHR9LFxuXHR9O1xuXHQvLyBQcmVwYXJlcyB0aGUgc3BlZWR5IGRlbGV0aW9uIGRpYWxvZyBhbmQgZGlzcGxheXMgaXRcblx0VHdpbmtsZS5zcGVlZHkuaW5pdERpYWxvZyA9IChjYWxsYmFja2Z1bmMpID0+IHtcblx0XHRUd2lua2xlLnNwZWVkeS5kaWFsb2cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KFxuXHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzcGVlZHlXaW5kb3dXaWR0aCcpLFxuXHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzcGVlZHlXaW5kb3dIZWlnaHQnKVxuXHRcdCk7XG5cdFx0Y29uc3Qge2RpYWxvZ30gPSBUd2lua2xlLnNwZWVkeTtcblx0XHRkaWFsb2cuc2V0VGl0bGUod2luZG93LndnVUxTKCfpgInmi6nlv6vpgJ/liKDpmaTnkIbnlLEnLCAn6YG45pOH5b+r6YCf5Yiq6Zmk55CG55SxJykpO1xuXHRcdGRpYWxvZy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0ZGlhbG9nLmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCflv6vpgJ/liKDpmaTmnaHkvosnLCAn5b+r6YCf5Yiq6Zmk5qKd5L6LJyksICdMSUI6Q1NEJyk7XG5cdFx0ZGlhbG9nLmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCfpgJ/liKDorr7nva4nLCAn6YCf5Yiq6Kit5a6aJyksICdIOlRXL1BSRUYjc3BlZWR5Jyk7XG5cdFx0ZGlhbG9nLmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI3NwZWVkeScpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFxuXHRcdFx0Y2FsbGJhY2tmdW5jLFxuXHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzcGVlZHlTZWxlY3Rpb25TdHlsZScpID09PSAncmFkaW9DbGljaycgPyAnY2hhbmdlJyA6IG51bGxcblx0XHQpO1xuXHRcdGlmIChNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y+q5qCH6K6w77yM5LiN5Yig6ZmkJywgJ+WPquaomeiomO+8jOS4jeWIqumZpCcpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICd0YWdfb25seScsXG5cdFx0XHRcdFx0XHRuYW1lOiAndGFnX29ubHknLFxuXHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfoi6Xmgqjlj6rmg7PmoIforrDmraTpobXpnaLogIzkuI3mmK/lsIblhbbliKDpmaQnLCAn6Iul5oKo5Y+q5oOz5qiZ6KiY5q2k6aCB6Z2i6ICM5LiN5piv5bCH5YW25Yiq6ZmkJyksXG5cdFx0XHRcdFx0XHRjaGVja2VkOiAhKFR3aW5rbGUuc3BlZWR5Lmhhc0NTRCB8fCBUd2lua2xlLmdldFByZWYoJ2RlbGV0ZVN5c29wRGVmYXVsdFRvRGVsZXRlJykpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjRm9ybSA9IGV2ZW50LnRhcmdldC5mb3JtO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuXHRcdFx0XHRcdFx0XHQvLyBlbmFibGUvZGlzYWJsZSB0YWxrIHBhZ2UgY2hlY2tib3hcblx0XHRcdFx0XHRcdFx0aWYgKGNGb3JtLnRhbGtwYWdlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y0Zvcm0udGFsa3BhZ2UuZGlzYWJsZWQgPSBjQ2hlY2tlZDtcblx0XHRcdFx0XHRcdFx0XHRjRm9ybS50YWxrcGFnZS5jaGVja2VkID0gIWNDaGVja2VkICYmIFR3aW5rbGUuZ2V0UHJlZignZGVsZXRlVGFsa1BhZ2VPbkRlbGV0ZScpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdC8vIGVuYWJsZS9kaXNhYmxlIHJlZGlyZWN0cyBjaGVja2JveFxuXHRcdFx0XHRcdFx0XHRjRm9ybS5yZWRpcmVjdHMuZGlzYWJsZWQgPSBjQ2hlY2tlZDtcblx0XHRcdFx0XHRcdFx0Y0Zvcm0ucmVkaXJlY3RzLmNoZWNrZWQgPSAhY0NoZWNrZWQ7XG5cdFx0XHRcdFx0XHRcdC8vIGVuYWJsZS9kaXNhYmxlIGRlbGV0ZSBtdWx0aXBsZVxuXHRcdFx0XHRcdFx0XHRjRm9ybS5kZWxtdWx0aXBsZS5kaXNhYmxlZCA9IGNDaGVja2VkO1xuXHRcdFx0XHRcdFx0XHRjRm9ybS5kZWxtdWx0aXBsZS5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdC8vIGVuYWJsZS9kaXNhYmxlIG9wZW4gdGFsayBwYWdlIGNoZWNrYm94XG5cdFx0XHRcdFx0XHRcdGNGb3JtLm9wZW51c2VydGFsay5kaXNhYmxlZCA9IGNDaGVja2VkO1xuXHRcdFx0XHRcdFx0XHRjRm9ybS5vcGVudXNlcnRhbGsuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHQvLyBlbmFibGUvZGlzYWJsZSBub3RpZnkgY2hlY2tib3hcblx0XHRcdFx0XHRcdFx0Y0Zvcm0ubm90aWZ5LmRpc2FibGVkID0gIWNDaGVja2VkO1xuXHRcdFx0XHRcdFx0XHRjRm9ybS5ub3RpZnkuY2hlY2tlZCA9IGNDaGVja2VkO1xuXHRcdFx0XHRcdFx0XHQvLyBlbmFibGUvZGlzYWJsZSBtdWx0aXBsZVxuXHRcdFx0XHRcdFx0XHRjRm9ybS5tdWx0aXBsZS5kaXNhYmxlZCA9ICFjQ2hlY2tlZDtcblx0XHRcdFx0XHRcdFx0Y0Zvcm0ubXVsdGlwbGUuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHQvLyBlbmFibGUgcmVxdWVzdGluZyBjcmVhdGlvbiBwcm90ZWN0aW9uXG5cdFx0XHRcdFx0XHRcdGNGb3JtLnNhbHRpbmcuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5tb2RlQ2hhbmdlZChjRm9ybSk7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBkZWxldGVPcHRpb25zID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0bmFtZTogJ2RlbGV0ZV9vcHRpb25zJyxcblx0XHRcdH0pO1xuXHRcdFx0ZGVsZXRlT3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yig6Zmk55u45YWz6YCJ6aG5JywgJ+WIqumZpOebuOmXnOmBuOmghScpLFxuXHRcdFx0fSk7XG5cdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAlIDIgPT09IDAgJiYgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMikge1xuXHRcdFx0XHQvLyBoaWRlIG9wdGlvbiBmb3IgdXNlciBwYWdlcywgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGRlbGV0aW5nIHVzZXIgdGFsayBwYWdlXG5cdFx0XHRcdGRlbGV0ZU9wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yig6Zmk6K6o6K666aG1JywgJ+WIqumZpOiojuirlumggScpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3RhbGtwYWdlJyxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3RhbGtwYWdlJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCfliKDpmaTml7bpmYTluKbliKDpmaTmraTpobXpnaLnmoTorqjorrrpobXjgIInLCAn5Yiq6Zmk5pmC6ZmE5bi25Yiq6Zmk5q2k6aCB6Z2i55qE6KiO6KuW6aCB44CCJyksXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuZ2V0UHJlZignZGVsZXRlVGFsa1BhZ2VPbkRlbGV0ZScpLFxuXHRcdFx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlT3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yig6Zmk6YeN5a6a5ZCRJywgJ+WIqumZpOmHjeaWsOWwjuWQkScpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdyZWRpcmVjdHMnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOWIsOatpOmhteeahOmHjeWumuWQkeOAgicsICfliKrpmaTliLDmraTpoIHnmoTph43mlrDlsI7lkJHjgIInKSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IFR3aW5rbGUuZ2V0UHJlZignZGVsZXRlUmVkaXJlY3RzT25EZWxldGUnKSxcblx0XHRcdFx0XHRcdGV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHRcdGRlbGV0ZU9wdGlvbnMuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W6lOeUqOWkmuS4queQhueUseWIoOmZpCcsICfmh4nnlKjlpJrlgIvnkIbnlLHliKrpmaQnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAnZGVsbXVsdGlwbGUnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ2RlbG11bHRpcGxlJyxcblx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5oKo5Y+v6YCJ5oup5bqU55So5LqO6K+l6aG155qE5aSa5Liq55CG55Sx44CCJywgJ+aCqOWPr+mBuOaTh+aHieeUqOaWvOipsumggeeahOWkmuWAi+eQhueUseOAgicpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5tb2RlQ2hhbmdlZChldmVudC50YXJnZXQuZm9ybSk7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0XHRkZWxldGVPcHRpb25zLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflvIDlkK/nlKjmiLforqjorrrpobUnLCAn6ZaL5ZWf5L2/55So6ICF6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ29wZW51c2VydGFsaycsXG5cdFx0XHRcdFx0XHRuYW1lOiAnb3BlbnVzZXJ0YWxrJyxcblx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+atpOmhueeahOm7mOiupOWAvOS4uuaCqOeahOW8gOWQr+iuqOiuuumhteiuvue9ruOAguWcqOaCqOmAieaLqeW6lOeUqOWkmuadoeeQhueUseWIoOmZpOaXtuatpOmhueWwhuS/neaMgeS4jeWPmOOAgicsXG5cdFx0XHRcdFx0XHRcdCfmraTpoIXnmoTpoJDoqK3lgLzngrrmgqjnmoTplovllZ/oqI7oq5bpoIHoqK3lrprjgILlnKjmgqjpgbjmk4fmh4nnlKjlpJrmop3nkIbnlLHliKrpmaTmmYLmraTpoIXlsIfkv53mjIHkuI3ororjgIInXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogZmFsc2UsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCB0YWdPcHRpb25zID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRuYW1lOiAndGFnX29wdGlvbnMnLFxuXHRcdH0pO1xuXHRcdGlmIChNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0dGFnT3B0aW9ucy5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w55u45YWz6YCJ6aG5JywgJ+aomeiomOebuOmXnOmBuOmghScpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRhZ09wdGlvbnMuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflpoLlj6/og73vvIzpgJrnn6XliJvlu7rogIUnLCAn5aaC5Y+v6IO977yM6YCa55+l5bu656uL6ICFJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdub3RpZnknLFxuXHRcdFx0XHRcdG5hbWU6ICdub3RpZnknLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfkuIDkuKrpgJrnn6XmqKHmnb/lsIbkvJrooqvliqDlhaXliJvlu7rogIXnmoTorqjorrrpobXvvIzoi6XmgqjlkK/nlKjkuobor6XnkIbmja7nmoTpgJrnn6XjgIInLFxuXHRcdFx0XHRcdFx0J+S4gOWAi+mAmuefpeaooeadv+Wwh+acg+iiq+WKoOWFpeW7uueri+iAheeahOiojuirlumgge+8jOiLpeaCqOWVn+eUqOS6huipsueQhuaTmueahOmAmuefpeOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGNoZWNrZWQ6XG5cdFx0XHRcdFx0XHQhTW9yZWJpdHMudXNlcklzU3lzb3AgfHxcblx0XHRcdFx0XHRcdCEoVHdpbmtsZS5zcGVlZHkuaGFzQ1NEIHx8IFR3aW5rbGUuZ2V0UHJlZignZGVsZXRlU3lzb3BEZWZhdWx0VG9EZWxldGUnKSksXG5cdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+a4heepuumhtemdoicsICfmuIXnqbrpoIHpnaInKSxcblx0XHRcdFx0XHR2YWx1ZTogJ2JsYW5rJyxcblx0XHRcdFx0XHRuYW1lOiAnYmxhbmsnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflnKjmoIforrDmqKHmnb/liY3vvIzlhYjmuIXnqbrpobXpnaLvvIzpgILnlKjkuo7kuKXph43noLTlnY/miJbotJ/pnaLnlJ/ogIXkvKDorrDnrYnjgIInLFxuXHRcdFx0XHRcdFx0J+WcqOaomeiomOaooeadv+WJje+8jOWFiOa4heepuumggemdou+8jOmBqeeUqOaWvOWatOmHjeegtOWjnuaIluiyoOmdoueUn+iAheWCs+iomOetieOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5ZCM5pe25qCH6K6w5Lul6K+35rGC55m957q45L+d5oqkJywgJ+WQjOaZguaomeiomOS7peiri+axgueZvee0meS/neittycpLFxuXHRcdFx0XHRcdHZhbHVlOiAnc2FsdGluZycsXG5cdFx0XHRcdFx0bmFtZTogJ3NhbHRpbmcnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfpgInlj5blkI7vvIzlv6vpgJ/liKDpmaTmqKHmnb/lkI7lsIbpmYTluKYge3tzYWx0fX0g5qCH562+77yM5Lul6K+35rGC5omn6KGM5Yig6Zmk55qE566h55CG5ZGY6L+b6KGM55m957q45L+d5oqk77yM5LuF5Zyo6aG16Z2i5Yib5bu6M+asoeS7peS4iuaJjemAieaLqeatpOmhueOAgicsXG5cdFx0XHRcdFx0XHQn6YG45Y+W5b6M77yM5b+r6YCf5Yiq6Zmk5qih5p2/5b6M5bCH6ZmE5bi2IHt7c2FsdH19IOaomeexpO+8jOS7peiri+axguWft+ihjOWIqumZpOeahOeuoeeQhuWToemAsuihjOeZvee0meS/neitt++8jOWDheWcqOmggemdouW7uuerizPmrKHku6XkuIrmiY3pgbjmk4fmraTpoIXjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W6lOeUqOWkmuS4queQhueUsScsICfmh4nnlKjlpJrlgIvnkIbnlLEnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ211bHRpcGxlJyxcblx0XHRcdFx0XHRuYW1lOiAnbXVsdGlwbGUnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5oKo5Y+v6YCJ5oup5bqU55So5LqO6K+l6aG155qE5aSa5Liq55CG55Sx44CCJywgJ+aCqOWPr+mBuOaTh+aHieeUqOaWvOipsumggeeahOWkmuWAi+eQhueUseOAgicpLFxuXHRcdFx0XHRcdGV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLm1vZGVDaGFuZ2VkKGV2ZW50LnRhcmdldC5mb3JtKTtcblx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0aWQ6ICdwcmlvci1kZWxldGlvbi1jb3VudCcsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRuYW1lOiAnd29ya19hcmVhJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCfliJ3lp4vljJZDU0TmqKHlnZflpLHotKXvvIzor7fph43or5XvvIzmiJblsIbov5nmiqXlkYrnu5lUd2lua2xl5byA5Y+R6ICF44CCJyxcblx0XHRcdFx0J+WIneWni+WMlkNTROaooee1hOWkseaVl++8jOiri+mHjeippu+8jOaIluWwh+mAmeWgseWRiue1plR3aW5rbGXplovnmbzogIXjgIInXG5cdFx0XHQpLFxuXHRcdH0pO1xuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ3NwZWVkeVNlbGVjdGlvblN0eWxlJykgIT09ICdyYWRpb0NsaWNrJykge1xuXHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHRcdFx0Y2xhc3NOYW1lOiAndHctc3BlZWR5LXN1Ym1pdCcsXG5cdFx0XHR9KTsgLy8gUmVuYW1lZCBpbiBtb2RlQ2hhbmdlZFxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0ZGlhbG9nLnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRkaWFsb2cuZGlzcGxheSgpO1xuXHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLm1vZGVDaGFuZ2VkKHJlc3VsdCk7XG5cdFx0Ly8gQ2hlY2sgZm9yIHByaW9yIGRlbGV0aW9ucy4gIEp1c3Qgb25jZSwgdXBvbiBpbml0XG5cdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2sucHJpb3JEZWxldGlvbkNvdW50KCk7XG5cdH07XG5cdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrLmdldE1vZGUgPSAoZm9ybSkgPT4ge1xuXHRcdGxldCBtb2RlID0gVHdpbmtsZS5zcGVlZHkubW9kZS51c2VyU2luZ2xlU3VibWl0O1xuXHRcdGlmIChmb3JtLnRhZ19vbmx5ICYmICFmb3JtLnRhZ19vbmx5LmNoZWNrZWQpIHtcblx0XHRcdGlmIChmb3JtLmRlbG11bHRpcGxlLmNoZWNrZWQpIHtcblx0XHRcdFx0bW9kZSA9IFR3aW5rbGUuc3BlZWR5Lm1vZGUuc3lzb3BNdWx0aXBsZVN1Ym1pdDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1vZGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLnN5c29wU2luZ2xlU3VibWl0O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZm9ybS5tdWx0aXBsZS5jaGVja2VkKSB7XG5cdFx0XHRtb2RlID0gVHdpbmtsZS5zcGVlZHkubW9kZS51c2VyTXVsdGlwbGVTdWJtaXQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLnVzZXJTaW5nbGVTdWJtaXQ7XG5cdFx0fVxuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ3NwZWVkeVNlbGVjdGlvblN0eWxlJykgPT09ICdyYWRpb0NsaWNrJykge1xuXHRcdFx0bW9kZSsrO1xuXHRcdH1cblx0XHRyZXR1cm4gbW9kZTtcblx0fTtcblx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2subW9kZUNoYW5nZWQgPSAoZm9ybSkgPT4ge1xuXHRcdGNvbnN0IG5hbWVzcGFjZSA9IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJyk7XG5cdFx0Ly8gZmlyc3QgZmlndXJlIG91dCB3aGF0IG1vZGUgd2UncmUgaW5cblx0XHRjb25zdCBtb2RlID0gVHdpbmtsZS5zcGVlZHkuY2FsbGJhY2suZ2V0TW9kZShmb3JtKTtcblx0XHRjb25zdCBpc1N5c29wTW9kZSA9IFR3aW5rbGUuc3BlZWR5Lm1vZGUuaXNTeXNvcChtb2RlKTtcblx0XHRpZiAoaXNTeXNvcE1vZGUpIHtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPWRlbGV0ZV9vcHRpb25zXScpLnNob3coKTtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPXRhZ19vcHRpb25zXScpLmhpZGUoKTtcblx0XHRcdCRib2R5LmZpbmQoJ2J1dHRvbi50dy1zcGVlZHktc3VibWl0JykudGV4dCh3aW5kb3cud2dVTFMoJ+WIoOmZpOmhtemdoicsICfliKrpmaTpoIHpnaInKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPWRlbGV0ZV9vcHRpb25zXScpLmhpZGUoKTtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPXRhZ19vcHRpb25zXScpLnNob3coKTtcblx0XHRcdCRib2R5LmZpbmQoJ2J1dHRvbi50dy1zcGVlZHktc3VibWl0JykudGV4dCh3aW5kb3cud2dVTFMoJ+agh+iusOmhtemdoicsICfmqJnoqJjpoIHpnaInKSk7XG5cdFx0fVxuXHRcdGNvbnN0IHdvcmtfYXJlYSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdH0pO1xuXHRcdGlmIChcblx0XHRcdG1vZGUgPT09IFR3aW5rbGUuc3BlZWR5Lm1vZGUudXNlck11bHRpcGxlUmFkaW9DbGljayB8fFxuXHRcdFx0bW9kZSA9PT0gVHdpbmtsZS5zcGVlZHkubW9kZS5zeXNvcE11bHRpcGxlUmFkaW9DbGlja1xuXHRcdCkge1xuXHRcdFx0Y29uc3QgZXZhbHVhdGVUeXBlID0gVHdpbmtsZS5zcGVlZHkubW9kZS5pc1N5c29wKG1vZGUpID8gJ2V2YWx1YXRlU3lzb3AnIDogJ2V2YWx1YXRlVXNlcic7XG5cdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W9k+mAieaLqeWujOaIkOWQju+8jOWNleWHu++8micsICfnlbbpgbjmk4flrozmiJDlvozvvIzpu57mk4rvvJonKSxcblx0XHRcdH0pO1xuXHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRuYW1lOiAnc3VibWl0LW11bHRpcGxlJyxcblx0XHRcdFx0bGFiZWw6IGlzU3lzb3BNb2RlID8gd2luZG93LndnVUxTKCfliKDpmaTpobXpnaInLCAn5Yiq6Zmk6aCB6Z2iJykgOiB3aW5kb3cud2dVTFMoJ+agh+iusOmhtemdoicsICfmqJnoqJjpoIHpnaInKSxcblx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrW2V2YWx1YXRlVHlwZV0oZXZlbnQpO1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNvbnN0IHJhZGlvT3JDaGVja2JveCA9IFR3aW5rbGUuc3BlZWR5Lm1vZGUuaXNNdWx0aXBsZShtb2RlKSA/ICdjaGVja2JveCcgOiAncmFkaW8nO1xuXHRcdGlmIChpc1N5c29wTW9kZSAmJiAhVHdpbmtsZS5zcGVlZHkubW9kZS5pc011bHRpcGxlKG1vZGUpKSB7XG5cdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieeQhueUsScsICfoh6roqILnkIbnlLEnKSxcblx0XHRcdH0pO1xuXHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6IHJhZGlvT3JDaGVja2JveCxcblx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChUd2lua2xlLnNwZWVkeS5jdXN0b21SYXRpb25hbGUsIG1vZGUpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHN3aXRjaCAobmFtZXNwYWNlKSB7XG5cdFx0XHRjYXNlIDA6XG5cdFx0XHRcdC8vIGFydGljbGUgYW5kIHBzZXVkbyBuYW1lc3BhY2Vcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5p2h55uuJywgJ+aineebricpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogcmFkaW9PckNoZWNrYm94LFxuXHRcdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChUd2lua2xlLnNwZWVkeS5hcnRpY2xlTGlzdCwgbW9kZSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0Ly8gdXNlclxuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnlKjmiLfpobUnLCAn5L2/55So6ICF6aCB6Z2iJyksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdFx0bmFtZTogJ2NzZCcsXG5cdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LnVzZXJMaXN0LCBtb2RlKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHQvLyB1c2VyIHRhbGtcblx0XHRcdFx0aWYgKG13LnV0aWwuaXNJUEFkZHJlc3MobXcuY29uZmlnLmdldCgnd2dSZWxldmFudFVzZXJOYW1lJykpKSB7XG5cdFx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eUqOaIt+iuqOiuuumhtScsICfkvb/nlKjogIXoqI7oq5bpoIEnKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6IHJhZGlvT3JDaGVja2JveCxcblx0XHRcdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5zcGVlZHkuZ2VuZXJhdGVDc2RMaXN0KFR3aW5rbGUuc3BlZWR5LnVzZXJ0YWxrTGlzdCwgbW9kZSksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDY6XG5cdFx0XHRcdC8vIGZpbGVcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5paH5Lu2JywgJ+aqlOahiCcpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogcmFkaW9PckNoZWNrYm94LFxuXHRcdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChUd2lua2xlLnNwZWVkeS5maWxlTGlzdCwgbW9kZSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIVR3aW5rbGUuc3BlZWR5Lm1vZGUuaXNTeXNvcChtb2RlKSkge1xuXHRcdFx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn5qCH6K6wQ1NEIEYx44CBRjPjgIFGNe+8jOivt+S9v+eUqFR3aW5rbGXnmoTigJzlm77mnYPigJ3lip/og73jgIInLFxuXHRcdFx0XHRcdFx0XHQn5qiZ6KiYQ1NEIEYx44CBRjPjgIFGNe+8jOiri+S9v+eUqFR3aW5rbGXnmoTjgIzlnJbmrIrjgI3lip/og73jgIInXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAxNDpcblx0XHRcdFx0Ly8gY2F0ZWdvcnlcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YiG57G7JywgJ+WIhumhnicpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogcmFkaW9PckNoZWNrYm94LFxuXHRcdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChUd2lua2xlLnNwZWVkeS5jYXRlZ29yeUxpc3QsIG1vZGUpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDMwMjpcblx0XHRcdFx0Ly8gZHJhZnRcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6ICfojYnnqL8nLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogcmFkaW9PckNoZWNrYm94LFxuXHRcdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChUd2lua2xlLnNwZWVkeS5kcmFmdExpc3QsIG1vZGUpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIG5hbWVzcGFjZSAlIDIgPT09IDEgJiYgbmFtZXNwYWNlICE9PSAzOlxuXHRcdFx0XHQvLyBzaG93IGRiLXRhbGsgb24gdGFsayBwYWdlcywgYnV0IG5vdCB1c2VyIHRhbGsgcGFnZXNcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K6o6K666aG1JywgJ+iojuirlumggScpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogcmFkaW9PckNoZWNrYm94LFxuXHRcdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChUd2lua2xlLnNwZWVkeS50YWxrTGlzdCwgbW9kZSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvLyBjdXN0b20gcmF0aW9uYWxlIGxpdmVzIHVuZGVyIGdlbmVyYWwgY3JpdGVyaWEgd2hlbiB0YWdnaW5nXG5cdFx0bGV0IGdlbmVyYWxDcml0ZXJpYSA9IFR3aW5rbGUuc3BlZWR5LmdlbmVyYWxMaXN0O1xuXHRcdGlmICghVHdpbmtsZS5zcGVlZHkubW9kZS5pc1N5c29wKG1vZGUpKSB7XG5cdFx0XHRnZW5lcmFsQ3JpdGVyaWEgPSBbXG5cdFx0XHRcdC4uLlR3aW5rbGUuc3BlZWR5LmN1c3RvbVJhdGlvbmFsZSxcblx0XHRcdFx0Li4uKEFycmF5LmlzQXJyYXkoZ2VuZXJhbENyaXRlcmlhKSA/IGdlbmVyYWxDcml0ZXJpYSA6IFtnZW5lcmFsQ3JpdGVyaWFdKSxcblx0XHRcdF07XG5cdFx0fVxuXHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfluLjop4QnLCAn5bi46KaPJyksXG5cdFx0fSk7XG5cdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRuYW1lOiAnY3NkJyxcblx0XHRcdGxpc3Q6IFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdChnZW5lcmFsQ3JpdGVyaWEsIG1vZGUpLFxuXHRcdH0pO1xuXHRcdGlmICghVHdpbmtsZS5zcGVlZHkubW9kZS5pc1N5c29wKG1vZGUpKSB7XG5cdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+aPkOaKpeS+teadg+mhtemdou+8jOivt+S9v+eUqFR3aW5rbGXnmoTigJzkvrXmnYPigJ3lip/og73jgIInLFxuXHRcdFx0XHRcdCfmj5DloLHkvrXmrIrpoIHpnaLvvIzoq4vkvb/nlKhUd2lua2xl55qE44CM5L615qyK44CN5Yqf6IO944CCJ1xuXHRcdFx0XHQpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0lzUmVkaXJlY3QnKSB8fCBNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRsYWJlbDogJ+mHjeWumuWQkScsXG5cdFx0XHR9KTtcblx0XHRcdHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiByYWRpb09yQ2hlY2tib3gsXG5cdFx0XHRcdG5hbWU6ICdjc2QnLFxuXHRcdFx0XHRsaXN0OiBUd2lua2xlLnNwZWVkeS5nZW5lcmF0ZUNzZExpc3QoVHdpbmtsZS5zcGVlZHkucmVkaXJlY3RMaXN0LCBtb2RlKSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCBbb2xkX2FyZWFdID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGZvcm0sICd3b3JrX2FyZWEnKTtcblx0XHRmb3JtLnJlcGxhY2VDaGlsZCh3b3JrX2FyZWEucmVuZGVyKCksIG9sZF9hcmVhKTtcblx0XHQvLyBpZiBzeXNvcCwgY2hlY2sgaWYgQ1NEIGlzIGFscmVhZHkgb24gdGhlIHBhZ2UgYW5kIGZpbGwgaW4gY3VzdG9tIHJhdGlvbmFsZVxuXHRcdGlmIChpc1N5c29wTW9kZSAmJiBUd2lua2xlLnNwZWVkeS5oYXNDU0QpIHtcblx0XHRcdGNvbnN0IFtjdXN0b21PcHRpb25dID0gJGJvZHkuZmluZCgnaW5wdXRbbmFtZT1jc2RdW3ZhbHVlPXJlYXNvbl0nKTtcblx0XHRcdGlmIChjdXN0b21PcHRpb24pIHtcblx0XHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignc3BlZWR5U2VsZWN0aW9uU3R5bGUnKSAhPT0gJ3JhZGlvQ2xpY2snKSB7XG5cdFx0XHRcdFx0Ly8gZm9yY2UgbGlzdGVuZXJzIHRvIHJlLWluaXRcblx0XHRcdFx0XHRjdXN0b21PcHRpb24uY2xpY2soKTtcblx0XHRcdFx0XHRjdXN0b21PcHRpb24ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjdXN0b21PcHRpb24uc3ViZ3JvdXApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGN1c3RvbU9wdGlvbi5zdWJncm91cC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLnZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KFxuXHRcdFx0XHRcdCRib2R5LmZpbmQoJyNkZWxldGUtcmVhc29uJykudGV4dCgpXG5cdFx0XHRcdCkucmVwbGFjZSgvXFwrL2csICcgJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGVubGFyZ2UgRzcgcmFkaW8vY2hlY2tib3ggYW5kIGl0cyBsYWJlbFxuXHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt2YWx1ZT1cImc3XCJdJykgJiYgVHdpbmtsZS5nZXRQcmVmKCdlbmxhcmdlRzdJbnB1dCcpKSB7XG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt2YWx1ZT1cImc3XCJdJykuc3R5bGUgPVxuXHRcdFx0XHQnaGVpZ2h0OiAyZW07IHdpZHRoOiAyZW07IGhlaWdodDogLW1vei1pbml0aWFsOyB3aWR0aDogLW1vei1pbml0aWFsOyAtbW96LXRyYW5zZm9ybTogc2NhbGUoMik7IC1vLXRyYW5zZm9ybTogc2NhbGUoMik7Jztcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3ZhbHVlPVwiZzdcIl0nKS5sYWJlbHNbMF0uc3R5bGUgPSAnZm9udC1zaXplOiAxLjVlbTsgbGluZS1oZWlnaHQ6IDEuNWVtOyc7XG5cdFx0fVxuXHRcdGlmICghaXNTeXNvcE1vZGUgJiYgbXcuY29uZmlnLmdldCgnd2dQYWdlQ29udGVudE1vZGVsJykgIT09ICd3aWtpdGV4dCcpIHtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPXRhZ19vcHRpb25zXScpLmhpZGUoKTtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPXdvcmtfYXJlYV0nKS5lbXB0eSgpO1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IFtcblx0XHRcdFx0d2luZG93LndnVUxTKCdUd2lua2xl5LiN5pSv5oyB5Zyo6aG16Z2i5YaF5a655qih5Z6L5Li6JywgJ1R3aW5rbGXkuI3mlK/mj7TlnKjpoIHpnaLlhaflrrnmqKHlnovngronKSxcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlQ29udGVudE1vZGVsJyksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn55qE6aG16Z2i5LiK5oyC5LiK5b+r6YCf5Yig6Zmk5qih5p2/77yM6K+35Y+C6KeBJywgJ+eahOmggemdouS4iuaOm+S4iuW/q+mAn+WIqumZpOaooeadv++8jOiri+WPg+imiycpLFxuXHRcdFx0XHQkKCc8YT4nKVxuXHRcdFx0XHRcdC5hdHRyKHtcblx0XHRcdFx0XHRcdHRhcmdldDogJ19ibGFuaycsXG5cdFx0XHRcdFx0XHRyZWw6ICdub29wZW5lciBub3JlZmVycmVyJyxcblx0XHRcdFx0XHRcdGhyZWY6IG13LnV0aWwuZ2V0VXJsKCdMSUI6U1BFQ0lBTFNEJyksXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQudGV4dCh3aW5kb3cud2dVTFMoJ+aJi+WKqOaUvue9ruaooeadv+aXtueahOazqOaEj+S6i+mhuScsICfmiYvli5XmlL7nva7mqKHmnb/mmYLnmoTms6jmhI/kuovpoIUnKSlbMF0sXG5cdFx0XHRcdCfjgIInLFxuXHRcdFx0XTtcblx0XHRcdCRib2R5LmZpbmQoJ1tuYW1lPXdvcmtfYXJlYV0nKS5hcHBlbmQobWVzc2FnZSk7XG5cdFx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQodHJ1ZSk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5wcmlvckRlbGV0aW9uQ291bnQgPSAoKSA9PiB7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdGxpc3Q6ICdsb2dldmVudHMnLFxuXHRcdFx0bGV0eXBlOiAnZGVsZXRlJyxcblx0XHRcdGxlYWN0aW9uOiAnZGVsZXRlL2RlbGV0ZScsXG5cdFx0XHQvLyBKdXN0IHB1cmUgcGFnZSBkZWxldGlvbiwgbm8gcmVkaXJlY3Qgb3ZlcndyaXRlcyBvciByZXZkZWxcblx0XHRcdGxldGl0bGU6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdGxlcHJvcDogJycsXG5cdFx0XHQvLyBXZSdyZSBqdXN0IGNvdW50aW5nIHdlIGRvbid0IGFjdHVhbGx5IGNhcmUgYWJvdXQgdGhlIGVudHJpZXNcblx0XHRcdGxlbGltaXQ6IDUsXG5cdFx0XHQvLyBBIGxpdHRsZSBiaXQgZ29lcyBhIGxvbmcgd2F5XG5cdFx0fTtcblxuXHRcdG5ldyBNb3JlYml0cy53aWtpLmFwaSh3aW5kb3cud2dVTFMoJ+ajgOafpeS5i+WJjeeahOWIoOmZpCcsICfmqqLmn6XkuYvliY3nmoTliKrpmaQnKSwgcXVlcnksIChhcGlvYmopID0+IHtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXBpb2JqLmdldFJlc3BvbnNlKCk7XG5cdFx0XHRjb25zdCBkZWxDb3VudCA9IHJlc3BvbnNlLnF1ZXJ5LmxvZ2V2ZW50cy5sZW5ndGg7XG5cdFx0XHRpZiAoZGVsQ291bnQpIHtcblx0XHRcdFx0bGV0IG1lc3NhZ2UgPSB3aW5kb3cud2dVTFMoJ+iiq+WIoOmZpCcsICfooqvliKrpmaQnKTtcblx0XHRcdFx0aWYgKHJlc3BvbnNlLmNvbnRpbnVlKSB7XG5cdFx0XHRcdFx0bWVzc2FnZSArPSB3aW5kb3cud2dVTFMoJ+i2hei/hycsICfotoXpgY4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtZXNzYWdlICs9IGAke2RlbENvdW50feasoWA7XG5cdFx0XHRcdC8vIDMrIHNlZW1zIHByb2JsZW1hdGljXG5cdFx0XHRcdGlmIChkZWxDb3VudCA+PSAzKSB7XG5cdFx0XHRcdFx0JGJvZHkuZmluZCgnI3ByaW9yLWRlbGV0aW9uLWNvdW50JykuY3NzKCdjb2xvcicsICcjZmYwMDAwJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUHJvdmlkZSBhIGxpbmsgdG8gcGFnZSBsb2dzIChDU0QgdGVtcGxhdGVzIGhhdmUgb25lIGZvciBzeXNvcHMpXG5cdFx0XHRcdGNvbnN0IGxpbmsgPSBNb3JlYml0cy5odG1sTm9kZSgnYScsIHdpbmRvdy53Z1VMUygn77yI5pel5b+X77yJJywgJ++8iOaXpeiqjO+8iScpKTtcblx0XHRcdFx0bGluay5zZXRBdHRyaWJ1dGUoXG5cdFx0XHRcdFx0J2hyZWYnLFxuXHRcdFx0XHRcdG13LnV0aWwuZ2V0VXJsKCdTcGVjaWFsOkxvZycsIHtcblx0XHRcdFx0XHRcdHBhZ2U6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuXHRcdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgncmVsJywgJ25vb3BlbmVyIG5vcmVmZXJyZXInKTtcblx0XHRcdFx0JGJvZHkuZmluZCgnI3ByaW9yLWRlbGV0aW9uLWNvdW50JykudGV4dChtZXNzYWdlKTsgLy8gU3BhY2UgYmVmb3JlIGxvZyBsaW5rXG5cdFx0XHRcdCRib2R5LmZpbmQoJyNwcmlvci1kZWxldGlvbi1jb3VudCcpLmFwcGVuZChsaW5rKTtcblx0XHRcdH1cblx0XHR9KS5wb3N0KCk7XG5cdH07XG5cdFR3aW5rbGUuc3BlZWR5LmdlbmVyYXRlQ3NkTGlzdCA9IChsaXN0LCBtb2RlKSA9PiB7XG5cdFx0Ly8gbW9kZSBzd2l0Y2hlc1xuXHRcdGNvbnN0IGlzU3lzb3BNb2RlID0gVHdpbmtsZS5zcGVlZHkubW9kZS5pc1N5c29wKG1vZGUpO1xuXHRcdGNvbnN0IG11bHRpcGxlID0gVHdpbmtsZS5zcGVlZHkubW9kZS5pc011bHRpcGxlKG1vZGUpO1xuXHRcdGNvbnN0IGhhc1N1Ym1pdEJ1dHRvbiA9IFR3aW5rbGUuc3BlZWR5Lm1vZGUuaGFzU3VibWl0QnV0dG9uKG1vZGUpO1xuXHRcdGNvbnN0IG9wZW5TdWJncm91cEhhbmRsZXIgPSAoZSkgPT4ge1xuXHRcdFx0JChlLnRhcmdldC5mb3JtKS5maW5kKCdpbnB1dCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0XHQkKGUudGFyZ2V0LmZvcm0pLmNoaWxkcmVuKCkuY3NzKCdjb2xvcicsICdncmF5Jyk7XG5cdFx0XHQkKGUudGFyZ2V0KS5wYXJlbnQoKS5jc3MoJ2NvbG9yJywgJ2JsYWNrJykuZmluZCgnaW5wdXQnKS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcblx0XHRcdCQoZS50YXJnZXQpLnBhcmVudCgpLmZpbmQoJ2lucHV0OnRleHQnKVswXS5mb2N1cygpO1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9O1xuXHRcdGNvbnN0IHN1Ym1pdFN1Ymdyb3VwSGFuZGxlciA9IChlKSA9PiB7XG5cdFx0XHRjb25zdCBldmFsdWF0ZVR5cGUgPSBUd2lua2xlLnNwZWVkeS5tb2RlLmlzU3lzb3AobW9kZSkgPyAnZXZhbHVhdGVTeXNvcCcgOiAnZXZhbHVhdGVVc2VyJztcblx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrW2V2YWx1YXRlVHlwZV0oZSk7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH07XG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChsaXN0LCAoY3JpdEVsZW1lbnQpID0+IHtcblx0XHRcdGNvbnN0IGNyaXRlcmlvbiA9IHtcblx0XHRcdFx0Li4uY3JpdEVsZW1lbnQsXG5cdFx0XHR9O1xuXHRcdFx0aWYgKG11bHRpcGxlKSB7XG5cdFx0XHRcdGlmIChjcml0ZXJpb24uaGlkZVdoZW5NdWx0aXBsZSkge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjcml0ZXJpb24uaGlkZVN1Ymdyb3VwV2hlbk11bHRpcGxlKSB7XG5cdFx0XHRcdFx0Y3JpdGVyaW9uLnN1Ymdyb3VwID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGNyaXRlcmlvbi5oaWRlV2hlblNpbmdsZSkge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjcml0ZXJpb24uaGlkZVN1Ymdyb3VwV2hlblNpbmdsZSkge1xuXHRcdFx0XHRcdGNyaXRlcmlvbi5zdWJncm91cCA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChpc1N5c29wTW9kZSkge1xuXHRcdFx0XHRpZiAoY3JpdGVyaW9uLmhpZGVXaGVuU3lzb3ApIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY3JpdGVyaW9uLmhpZGVTdWJncm91cFdoZW5TeXNvcCkge1xuXHRcdFx0XHRcdGNyaXRlcmlvbi5zdWJncm91cCA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChjcml0ZXJpb24uaGlkZVdoZW5Vc2VyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNyaXRlcmlvbi5oaWRlU3ViZ3JvdXBXaGVuVXNlcikge1xuXHRcdFx0XHRcdGNyaXRlcmlvbi5zdWJncm91cCA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0lzUmVkaXJlY3QnKSAmJiBjcml0ZXJpb24uaGlkZVdoZW5SZWRpcmVjdCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0Y3JpdGVyaW9uLnNob3dJbk5hbWVzcGFjZXMgJiZcblx0XHRcdFx0IWNyaXRlcmlvbi5zaG93SW5OYW1lc3BhY2VzLmluY2x1ZGVzKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRjcml0ZXJpb24uaGlkZUluTmFtZXNwYWNlcyAmJlxuXHRcdFx0XHRjcml0ZXJpb24uaGlkZUluTmFtZXNwYWNlcy5pbmNsdWRlcyhtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNyaXRlcmlvbi5zdWJncm91cCAmJiAhaGFzU3VibWl0QnV0dG9uKSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNyaXRlcmlvbi5zdWJncm91cCkpIHtcblx0XHRcdFx0XHRjcml0ZXJpb24uc3ViZ3JvdXAucHVzaCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnYnV0dG9uJyxcblx0XHRcdFx0XHRcdG5hbWU6ICdzdWJtaXQnLFxuXHRcdFx0XHRcdFx0bGFiZWw6IGlzU3lzb3BNb2RlXG5cdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCfliKDpmaTpobXpnaInLCAn5Yiq6Zmk6aCB6Z2iJylcblx0XHRcdFx0XHRcdFx0OiB3aW5kb3cud2dVTFMoJ+agh+iusOmhtemdoicsICfmqJnoqJjpoIHpnaInKSxcblx0XHRcdFx0XHRcdGV2ZW50OiBzdWJtaXRTdWJncm91cEhhbmRsZXIsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3JpdGVyaW9uLnN1Ymdyb3VwID0gW1xuXHRcdFx0XHRcdFx0Y3JpdGVyaW9uLnN1Ymdyb3VwLFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnYnV0dG9uJyxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3N1Ym1pdCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBpc1N5c29wTW9kZVxuXHRcdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCfliKDpmaTpobXpnaInLCAn5Yiq6Zmk6aCB6Z2iJylcblx0XHRcdFx0XHRcdFx0XHQ6IHdpbmRvdy53Z1VMUygn5qCH6K6w6aG16Z2iJywgJ+aomeiomOmggemdoicpLFxuXHRcdFx0XHRcdFx0XHRldmVudDogc3VibWl0U3ViZ3JvdXBIYW5kbGVyLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIEZJWE1FOiBkb2VzIHRoaXMgZG8gYW55dGhpbmc/XG5cdFx0XHRcdGNyaXRlcmlvbi5ldmVudCA9IG9wZW5TdWJncm91cEhhbmRsZXI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTeXNvcE1vZGUpIHtcblx0XHRcdFx0Y29uc3Qgb3JpZ2luYWxFdmVudCA9IGNyaXRlcmlvbi5ldmVudDtcblx0XHRcdFx0Y3JpdGVyaW9uLmV2ZW50ID0gKGUpID0+IHtcblx0XHRcdFx0XHRpZiAobXVsdGlwbGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEV2ZW50KGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBub3JtYWxpemVkQ3JpdGVyaW9uID0gVHdpbmtsZS5zcGVlZHkubm9ybWFsaXplSGFzaFtlLnRhcmdldC52YWx1ZV07XG5cdFx0XHRcdFx0JGJvZHlcblx0XHRcdFx0XHRcdC5maW5kKCdbbmFtZT1vcGVudXNlcnRhbGtdJylcblx0XHRcdFx0XHRcdC5wcm9wKFxuXHRcdFx0XHRcdFx0XHQnY2hlY2tlZCcsXG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignb3BlblVzZXJUYWxrUGFnZU9uU3BlZWR5RGVsZXRlJykuaW5jbHVkZXMobm9ybWFsaXplZENyaXRlcmlvbilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0aWYgKG9yaWdpbmFsRXZlbnQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEV2ZW50KGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjcml0ZXJpb247XG5cdFx0fSk7XG5cdH07XG5cdFR3aW5rbGUuc3BlZWR5LmN1c3RvbVJhdGlvbmFsZSA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogYOiHquWumuS5ieeQhueUsSR7TW9yZWJpdHMudXNlcklzU3lzb3AgPyAn77yI6Ieq5a6a5LmJ5Yig6Zmk55CG55Sx77yJJyA6ICcnfWAsXG5cdFx0XHR2YWx1ZTogJ3JlYXNvbicsXG5cdFx0XHR0b29sdGlwOiAn6K+l6aG16Iez5bCR5bqU6K+l56ym5ZCI5LiA5p2h5b+r6YCf5Yig6Zmk55qE5qCH5YeG77yM5bm25LiU5oKo5b+F6aG75Zyo55CG55Sx5Lit5o+Q5Yiw44CCJyxcblx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdG5hbWU6ICdyZWFzb25fMScsXG5cdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdGxhYmVsOiAn55CG55Sx77yaJyxcblx0XHRcdFx0c2l6ZTogNjAsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuc3BlZWR5LmZpbGVMaXN0ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiAnRjHvvJrmmI7mmL7kuI3nrKblkIjmnKznq5nokZfkvZzmnYPmnaHkvovnmoTmlofku7YnLFxuXHRcdFx0dmFsdWU6ICdmMScsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5YyF5ous5Lul5LiL5oOF5Ya177yaMS7kuIrkvKDlkI4z5aSp5YaF5LuN54S25p2l5rqQ5LiN5piO44CB6JGX5L2c5p2D5LiN5piO55qE5paH5Lu244CCMi7kuIrkvKDogIXlrqPnp7Dmi6XmnInvvIzogIzlnKjlhbbku5bmnaXmupDmib7liLDnmoTmlofku7bjgIIzLuaWh+S7tuWuo+ensOeUseafkOS9nOiAheS+neaNruafkOiHqueUseiRl+S9nOadg+WNj+iuruWPkeW4g++8jOS9huaJvuS4jeWIsOivpeiHqueUseWNj+iurueahOWjsOaYjuOAgjQu5YW25LuW5piO5pi+5L615p2D55qE5paH5Lu277yM5Y+v6ZmE5Yqg5L615p2D55CG55Sx44CCJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRjLvvJrph43lpI3kuJTkuI3lho3ooqvkvb/nlKjnmoTmlofku7YnLFxuXHRcdFx0dmFsdWU6ICdmMicsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5YyF5ous5Lul5LiL5oOF5Ya177ya5LiO546w5pyJ5paH5Lu25a6M5YWo55u45ZCM77yI5oiW5LiO546w5pyJ5paH5Lu25YaF5a655LiA6Ie05L2G5bC65a+46L6D5bCP77yJ77yM5LiU5rKh5pyJ5a6i6KeC6ZyA6KaB77yI5aaC5p+Q5Lqb5Zy65ZCI6ZyA5L2/55So5bCP5bC65a+45Zu+54mH77yJ55qE5paH5Lu244CC5oiW5piv6KKr5pu05Yqg5riF5pmw55qE5paH5Lu244CBU1ZH5qC85byP5paH5Lu25omA5Y+W5Luj55qE5paH5Lu244CC6K+35o+Q5oql6ICF56Gu5a6a5paH5Lu25rKh5pyJ5Lu75L2V6aG16Z2i5L2/55So5ZCO5YaN5o+Q5oql5Yig6Zmk77yM5bm26ZmE5rOo5a+55bqU6LSo6YeP5pu05aW955qE5paH5Lu25ZCN44CCJyxcblx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdG5hbWU6ICdmMl9maWxlbmFtZScsXG5cdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdGxhYmVsOiAn5paw5paH5Lu25ZCN77yaJyxcblx0XHRcdFx0dG9vbHRpcDogJ+WPr+S4jeWQq+KAnEZpbGU64oCd5YmN57yA44CCJyxcblx0XHRcdH0sXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5zcGVlZHkuYXJ0aWNsZUxpc3QgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdBMe+8muWGheWuueepuuazm+aIluWujOWFqOayoeacieWGheWuueOAgicsXG5cdFx0XHR2YWx1ZTogJ2ExJyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfmnaHnm67nmoTlhoXlrrnnrLznu5/vvIzmiJbnlJroh7PmoLnmnKzmsqHmnInmj5Dlj4rmnaHnm67kuLvkvZPvvIzkvb/mnaHnm67kuI3og73nlKjku6XljLrliIblhbbku5bkuovnianvvJvmiJbmnaHnm67lj6rljIXmi6zlpJbpg6jpk77mjqXjgIHlj4Lop4HjgIHlj4LogIPmnaXmupDjgIHliIbnsbvjgIHmqKHmnb/vvIzogIzmsqHmnInmloflrZfmj4/ov7DjgILmtojmrafkuYnpobXjgIHph43lrprlkJHpobXkuI3pgILnlKjmraTmnaHjgILor7fms6jmhI/mnInkupvnlKjmiLflj6/og73kvJrlpJrmrKHkv53lrZjvvIzoi6XmraTnsbvpobXpnaLnmoTmnIDlkI7kuIDmrKHnvJbovpHml7bpl7TotoXov4cyNOWwj+aXtu+8jOWImeWPr+aPkOivt+W/q+mAn+WIoOmZpOOAgicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogJ0Ey77ya5LiO5YW25LuW5p2h55uu5oiW5YW25Y6G5Y+y54mI5pys6YeN5aSN77yM5LiU5LiN6YCC5ZCI5L2c5Li65YW26YeN5a6a5ZCR44CCJyxcblx0XHRcdHZhbHVlOiAnYTInLFxuXHRcdFx0dG9vbHRpcDpcblx0XHRcdFx0J+adoeebruWIm+W7uuaXtueahOWGheWuue+8jOS4juWFtuS7lueOsOacieadoeebru+8iOaIluWFtuWOhuWPsueJiOacrO+8ieWGheWuueWujOWFqOebuOWQjOaIlumdnuW4uOebuOS8vO+8jOS4lOWQjeensOS4jemAguWQiOS9nOS4uuWQjuiAheeahOmHjeWumuWQkeOAguS4jeWMheaLrOaLhuWIhuOAgeWQiOW5tuOAgemHjee7hOWQjuS6p+eUn+eahOadoeebruOAguWmguacieeWkeiZke+8jOWPr+i9rOS6pOWIoOmZpOiuqOiuuuOAguiLpeWQjuWIm+W7uueahOadoeebruWQjeensOWPr+S9nOS4uumHjeWumuWQke+8jOWPr+ebtOaOpeaUueS4uumHjeWumuWQke+8m+iLpeWFiOWIm+W7uueahOadoeebruWunOS9nOS4uuWQjuWIm+W7uuadoeebrueahOmHjeWumuWQke+8jOivt+aPkOivt+enu+WKqOivt+axguOAgicsXG5cdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRuYW1lOiAnYTJfcGFnZW5hbWUnLFxuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRsYWJlbDogJ+eOsOacieadoeebruWQje+8micsXG5cdFx0XHRcdHRvb2x0aXA6ICfkuI3oh6rliqjliqDkuIrpk77mjqXvvIzoi6XpnIDopoHor7foh6rooYzliqDkuIpbW11d44CCJyxcblx0XHRcdFx0c2l6ZTogNjAsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdBM++8mumdnueOsOS7o+axieivreaIlue/u+ivkeaLmeWKo+eahOadoeebricsXG5cdFx0XHR2YWx1ZTogJ2EzJyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfmnaHnm67lhoXlrrnnu53lpKfpg6jliIbpnZ7njrDku6PmsYnor63vvIzljIXmi6zmnKrnv7vor5HnmoTlpJbor63jgIHmlrnoqIDlj4rmlofoqIDmlofvvJvmiJbnv7vor5HotKjph4/kvY7kuIvvvIzku6Xoh7Pkuo7pmr7ku6XnkIbop6PmiJblh7rnjrDovoPlpJrplJnor6/jgIInLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUuc3BlZWR5LmNhdGVnb3J5TGlzdCA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogJ08y77ya56m65YiG57G744CCJyxcblx0XHRcdHZhbHVlOiAnbzInLFxuXHRcdFx0dG9vbHRpcDogJ+ayoeacieaUtuW9leS7u+S9lemhtemdouOAgeaWh+S7tuOAgeWtkOWIhuexu+eahOWIhuexu+OAgkNhdGVnb3J5Ouivt+WLv+WIoOmZpOeahOWIhuexu+S4reeahOWIhuexu+S4jemAgueUqOOAgicsXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5zcGVlZHkuZHJhZnRMaXN0ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiAnTzPvvJrlup/lvIPojYnnqL/jgIInLFxuXHRcdFx0dmFsdWU6ICdvMycsXG5cdFx0XHR0b29sdGlwOiAn6I2J56i/5ZCN5a2X56m66Ze05YaF5YWt5Liq5pyI5YaF5peg57yW6L6R55qE6aG16Z2i44CCJyxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLnNwZWVkeS51c2VyTGlzdCA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogJ08x77ya55So5oi36K+35rGC5Yig6Zmk6Ieq5bex55qE55So5oi36aG144CCJyxcblx0XHRcdHZhbHVlOiAnbzEnLFxuXHRcdFx0dG9vbHRpcDogJ+euoeeQhuWRmOmcgOafpeeci+e8lui+keWOhuWPsu+8jOehruiupOivpemhtemdouS4jeaYr+S7juWFtuS7luWQjeWtl+epuumXtOenu+WKqOiAjOadpeOAgicsXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5zcGVlZHkuZ2VuZXJhbExpc3QgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHMe+8muaYjuaYvui/neWPjeazleW+i+azleinhOaIlui/neiDjOWFrOW6j+iJr+S/l+eahOmhtemdoicsXG5cdFx0XHR2YWx1ZTogJ2cxJyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfmmI7mmL7ov53lj43mnI3liqHlmajmiYDlnKjlnLDnmoTms5Xlvovms5Xop4Tlj4rmnInlhbPop4TlrprvvIzmiJbnqoHnoLTnpL7kvJrlhazluo/oia/kv5flupXnur/vvIzmjInnhafkuK3ljY7kurrmsJHlhbHlkozlm73kupLogZTnvZHnrqHnkIbop4TlrprlupTkuojliKDpmaTnmoTpobXpnaLjgIInLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHMu+8muayoeacieWunumZheWGheWuueeahOmhtemdoicsXG5cdFx0XHR2YWx1ZTogJ2cyJyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfku4XljIXmi6zml6DmhI/kuYnlrZfnrKbkuLLogIzmsqHmnInlrp7pmYXlhoXlrrnnmoTpobXpnaLjgILnlLHnlKjmiLfmnKzkurrliJvlu7rnmoTnlKjmiLfpobXjgIHnlKjmiLforqjorrrpobXvvIzlj4rkuJPkuLrmtYvor5Xmj5DkvpvnmoTmspnnm5LvvIzkuI3pgILnlKjmraTlh4bliJnjgIInLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHM++8mue6r+eyueegtOWdjycsXG5cdFx0XHR2YWx1ZTogJ2czJyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfljIXmi6zkvYbkuI3pmZDkuo7mmI7mmL7nmoTmgbbkvZzliafjgIHplJnor6/kv6Hmga/jgIHkurrouqvmlLvlh7vnrYnvvIzku6Xlj4rmuIXnkIbnp7vliqjnoLTlnY/ml7bnlZnkuIvnmoTph43lrprlkJHjgILoi6XmlLbliLDmiJblj5HnjrDkuKXph43nmoTkurrouqvmlLvlh7vkuI7or4vmr4HvvIznrqHnkIblkZjlj4rlhbbku5bnlKjmiLflupTpgJrnn6Xnm5HnnaPlkZjov5vooYznm5HnnaPpmpDol4/jgIInLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHNO+8mumHjeaWsOWIm+W7uuW3suiiq+WIoOmZpOeahOmhtemdoicsXG5cdFx0XHR2YWx1ZTogJ2c0Jyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfoi6XnjrDmnInpobXpnaLkuI7mm77lnKjliKDpmaTorqjorrrvvIjlkKvpobXpnaLlrZjlup/orqjorrrjgIHmlofku7blrZjlup/orqjorrrlkozkvrXmnYPlrqHmoLjvvIzkuI3lkKvlv6vpgJ/liKDpmaTvvInkuK3ooqvliKDpmaTlhoXlrrnnm7jlkIzmiJbpnZ7luLjnm7jkvLzvvIzkuJTnjrDmnInlhoXlrrnku43nhLbpgILnlKjliKDpmaTorqjorrrkuK3nmoTnu5PorrrvvIzml6DorrrmoIfpopjmmK/lkKbnm7jlkIzvvIzpg73pgILnlKjmnKzmoIflh4bjgILoi6XnjrDmnInpobXpnaLmoIfpopjkuI7lt7LliKDniYjmnKzkuI3kuIDoh7TvvIzliJnmj5Dor7fpgJ/liKDogIXlupTkuIDlubbms6jmmI7lt7LliKDniYjmnKznmoTpobXpnaLlkI3vvJvoi6Xor6XpobXpnaLkuYvliY3ooqvlv6vpgJ/liKDpmaTvvIzor7fku6Xnm7jlkIznkIbnlLHph43mlrDmj5Dor7fpgJ/liKDjgILoi6XnjrDmnInlhoXlrrnkuI3pgILnlKjliKDpmaTorqjorrrkuK3nmoTnu5PorrrvvIzlupTph43mlrDmj5Dlh7rliKDpmaTorqjorrrjgIInLFxuXHRcdFx0c3ViZ3JvdXA6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdnNF9wYWdlbmFtZScsXG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRsYWJlbDogJ+W3suWIoOeJiOatpOmhtemdouWQje+8micsXG5cdFx0XHRcdFx0c2l6ZTogNjAsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdFx0aGlkZVN1Ymdyb3VwV2hlbk11bHRpcGxlOiB0cnVlLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHNe+8muWboOaKgOacr+WOn+WboOWIoOmZpOmhtemdoicsXG5cdFx0XHR2YWx1ZTogJ2c1Jyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfljIXmi6zku6XkuIvmg4XlvaLvvJrlm6Dnp7vliqjor7fmsYLogIzliKDpmaTpobXpnaLvvJvku6Xopobnm5bliKDpmaTph43lrprlkJHvvJvliKDpmaTml6DnlKjnmoRNZWRpYVdpa2npobXpnaLvvIzlj4rlhbbku5bmioDmnK/lm6LpmJ/miJbnlYzpnaLnrqHnkIblkZjorqTkuLrmnInlv4XopoHmiafooYznmoTlv6vpgJ/liKDpmaTmg4XlvaLjgIInLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHNu+8muWOn+S9nOiAheaPkOivt+WIoOmZpOaIlua4heepuumhtemdou+8jOS4lOmhtemdouWOn+S9nOiAheS7heacieS4gOS6uicsXG5cdFx0XHR2YWx1ZTogJ2c2Jyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfpobXpnaLljp/kvZzogIXmjIHlkIjnkIbnkIbnlLHmj5Dlh7rnmoTlv6vpgJ/liKDpmaTvvJvmiJbpobXpnaLljp/kvZzogIXvvIjlrp7pmYXotKHnjK7ogIXvvInmuIXnqbrpobXpnaLvvIzlhbbku5bnlKjmiLfmj5DkuqTnmoTlv6vpgJ/liKDpmaTjgILpobXpnaLljp/kvZzogIXvvIjlrp7pmYXotKHnjK7ogIXvvInku4XkuIDkurrml7bmu6HotrPmnKzlh4bliJnjgILoi6XpobXpnaLlrp7pmYXotKHnjK7ogIXlpJrkuo7kuIDkurrvvIzor7fmjIHlkIjnkIbnkIbnlLHmj5DkuqTliKDpmaTorqjorrrjgILlkI7kuIDmg4XlvaLkuI3ljIXmi6znlKjmiLfpobXjgIHnlKjmiLforqjorrrpobXvvIzkuJTlupTlnKjpobXpnaLmnIDlkI7kuIDmrKHnvJbovpE25bCP5pe25ZCO5o+Q5Ye644CC6KKr5a+85YWl55qE6aG16Z2i77yM5a+85YWl6ICF6KeG5Li65Y6f5L2c6ICF44CCJyxcblx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdG5hbWU6ICdnNl9yYXRpb25hbGUnLFxuXHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRsYWJlbDogJ+WIoOmZpOWOn+WboO+8micsXG5cdFx0XHRcdHNpemU6IDYwLFxuXHRcdFx0fSxcblx0XHRcdGhpZGVTdWJncm91cFdoZW5TeXNvcDogdHJ1ZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnRzfvvJrmmI7mmL7nmoTlub/lkYrlrqPkvKAnLFxuXHRcdFx0dmFsdWU6ICdnNycsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5bqU55So5LqO5piO5pi+55qE5bm/5ZGK5a6j5Lyg77yM5oiW5Y+q5pyJ55u45YWz5Lq654mp44CB57uE57uH562J5LqL54mp6IGU57O75pa55rOV77yI5YyF5ous5L2G5LiN6ZmQ5LqO55S16K+d44CB5Zyw5Z2A44CB55S15a2Q6YKu566x44CB5Y2z5pe26YCa6K6v6L2v5Lu26IGU57O75pa55byP77yI5aaCUVHlj7fjgIHlvq7kv6Hlj7fvvInjgIHnpL7kuqTlqpLkvZPpk77mjqXvvInjgILoi6XlrqPkvKDor63msJTkuI3mmI7mmL7vvIzlu7rorq7ovazkuqTliKDpmaTorqjorrrjgIInLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHOO+8muacquWIl+aYjuWPr+mdoOadpea6kOS4lOivreiwg+i0n+mdoueahOeUn+iAheS8oOiusCcsXG5cdFx0XHR2YWx1ZTogJ2c4Jyxcblx0XHRcdHRvb2x0aXA6ICfmnKzmg4XlhrXkuIvmnInnmoTpobXpnaLkuKXph43kvrXniq/ku5bkurrlkI3oqonmnYPvvIzmnInml7blj6/og73kvrXniq/pmpDnp4HmnYPvvIzlj6/og73pnIDopoHmj5Dor7fnm5HnnaPjgIInLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICdHOe+8muWtpOeri+mhtemdoicsXG5cdFx0XHR2YWx1ZTogJ2c5Jyxcblx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdCfljIXmi6zku6XkuIvlh6Dnp43nsbvlnovvvJoxLuayoeacieWvueW6lOaWh+S7tueahOaWh+S7tumhtemdou+8mzIu5rKh5pyJ5a+55bqU5q+N6aG16Z2i55qE5a2Q6aG16Z2i77yI55So5oi36aG15a2Q6aG16Z2i6Zmk5aSW77yJ77ybMy7mjIflkJHkuI3lrZjlnKjpobXpnaLnmoTph43lrprlkJHvvJs0LuayoeacieWvueW6lOWGheWuuemhtemdoueahOiuqOiuuumhte+8iOiuqOiuuumhteWtmOaho+OAgeeUqOaIt+iuqOiuuumhte+8jOS7peWPiuWcqOS4u+mhtemdouaMguaciXt7Q1NEIFBsYWNlaG9sZGVyfX3mqKHmnb/nmoTorqjorrrpobXpmaTlpJbvvInvvJs1LuS4jeWtmOWcqOazqOWGjOeUqOaIt+eahOeUqOaIt+mhteWPiueUqOaIt+mhteWtkOmhtemdou+8iOmaj+eUqOaIt+abtOWQjeS6p+eUn+eahOeUqOaIt+mhtemHjeWumuWQkemZpOWklu+8ieOAguivt+WcqOWIoOmZpOaXtuazqOaEj+acieaXoOWwhuWGheWuueenu+iHs+S7luWkhOeahOW/heimgeOAgicsXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5zcGVlZHkucmVkaXJlY3RMaXN0ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiAnUjHvvJrkuI3og73lj5HmjKXlrp7pmYXkvZznlKjnmoTph43lrprlkJHjgIInLFxuXHRcdFx0dmFsdWU6ICdyMScsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5YyF5ous5Lul5LiL5oOF5Ya177yaMS7mjIflkJHmnKzouqvmiJblvqrnjq/nmoTph43lrprlkJHvvIzlpoJB4oaSQuKGkkPihpLigKbigKbihpJB5oiWQeKGkkHvvIjnuYHnroDph43lrprlkJHkuI3pgILnlKjmraTpobnvvInvvJsyLuagvOW8j+mUmeivr+eahOmHjeWumuWQke+8jOWMheaLrOagh+mimOS7heS4uue5geS9k+OAgee5geeugOa3t+eUqOOAgea2iOatp+S5ieS9v+eUqOeahOaLrOW8p+aIluepuuagvOmUmeivr+OAgemXtOmalOWPt+S9v+eUqOmUmeivr++8iOWboOexu+aOqOeugOWMluWtl+acquaUtuW9leiHs+OAiumAmueUqOinhOiMg+axieWtl+ihqOOAi+WvvOiHtOeahOe5geeugOa3t+adguaDheW9ou+8jOaIluezu+e7n+aXoOazleiHquWKqOi/m+ihjOe5geeugOWkhOeQhueahOaDheW9ou+8jOWImeS4jemAgueUqO+8ieOAguiLpemHjeWumuWQkemhtemdouagh+mimO+8jOS4juWQiOS5juWRveWQjeW4uOinhOeahOebruagh+mhtemdouagh+mimOS5i+mXtO+8jOS7heWtmOWcqOe5geeugOWtl+S9k+eahOWMuuWIq++8jOiAjOS4jeWtmOWcqOivjeivreeUqOazleWMuuWIq++8jOWImeS4jeS/neeVmeivpemHjeWumuWQkeOAguWboOezu+e7n+aXoOazleiHquWKqOe5geeugOi9rOaNouiAjOW/hemhu+S/neeVmeeahOmHjeWumuWQkemhtemdoumZpOWkluOAguWvueS6juWFtuS7luacquWIl+WHuueahOaDheWGte+8jOiLpeeUqOaIt+iupOS4uuivpemHjeWumuWQkeaXoOazleWPkeaMpeWunumZheS9nOeUqO+8jOS4lOS+neaNruW4uOivhuayoeacieS7u+S9leS6ieiuru+8jOWPr+WHreWQiOeQhueQhueUseaPkOivt+mAn+WIoO+8jOeUseeuoeeQhuWRmOWIpOaWreOAguaMh+WQkeS4jeWtmOWcqOmhtemdoueahOmHjeWumuWQke+8jOmAgueUqEc15YeG5YiZ44CCJyxcblx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdG5hbWU6ICdyMV90eXBlJyxcblx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdGxhYmVsOiAn6YCC55So57G75Z6L77yaJyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn6K+36YCJ5oupJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5oyH5ZCR5pys6Lqr5oiW5b6q546v55qE6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn5oyH5ZCR5pys6Lqr5oiW5b6q546v55qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5qCH6aKY57mB566A5re355SoJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn5qCH6aKY57mB566A5re355So44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5raI5q2n5LmJ5L2/55So55qE5ous5Y+35oiW56m65qC86ZSZ6K+vJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn5raI5q2n5LmJ5L2/55So55qE5ous5Y+35oiW56m65qC86ZSZ6K+v44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn6Ze06ZqU5Y+35L2/55So6ZSZ6K+vJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn6Ze06ZqU5Y+35L2/55So6ZSZ6K+v44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5YW25LuW55CG55Sx77yI6K+35Yu+6YCJ5LiK5pa54oCc5bqU55So5aSa5Liq55CG55Sx4oCd77yM5bm25aGr5YaZ6Ieq5a6a5LmJ55CG55Sx77yJJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnUjLvvJrlkI3np7DkuI7lr7zlkJHnm67moIfku6PooajkuovniankuI3kuIDoh7TmiJbkuI3lrozlhajkuIDoh7TnmoTph43lrprlkJHjgIInLFxuXHRcdFx0dmFsdWU6ICdyMicsXG5cdFx0XHR0b29sdGlwOlxuXHRcdFx0XHQn5YyF5ous5L2G5LiN6ZmQ5LqO5Lul5LiL5oOF5Ya177yaMS7nlLHku7vkvZXpnZ7mnaHnm67pobXpnaLvvIjpmaTnlKjmiLfpobXvvInlr7zlkJHmnaHnm67pobXnmoTph43lrprlkJHvvIzku6Xlj4rnlLHmnaHnm67pobXlr7zlkJHku7vkvZXpnZ7mnaHnm67pobXpnaLnmoTph43lrprlkJHjgIIyLuaYjuaYvueslOivr+eahOmHjeWumuWQke+8jOWmguWHuueOsOS4jeW4uOingeeahOmUmeWIq+Wtl+etieOAgu+8iOWIq+ensOmHjeWumuWQkeS4jemAgueUqOatpOmhueOAguiLpeWQq+mUmeWIq+Wtl+aIluacieeslOivr+eahOmHjeWumuWQkeS9v+eUqOmikeeOh+mrmO+8jOatpOexu+mHjeWumuWQkeacieWKqeS6juW4ruWKqeeUqOaIt+Wvu+aJvuWIsOato+ehrueahOmhtemdou+8jOS4jemAgueUqOatpOagh+WHhuOAguacieS6ieiurueahOatpOexu+mHjeWumuWQkeWunOaPkOS6pOWIoOmZpOiuqOiuuuOAgu+8iTMu5piO5pi+5LiO5a+85ZCR55uu5qCH5omA5ra155uW55qE5Li76aKY5peg5YWz77yM5oiW5q+U5a+85ZCR55uu5qCH5omA5ra155uW55qE5Li76aKY5pu05bm/5rOb55qE6YeN5a6a5ZCR44CC77yI6Iul5LiN5piO5pi+77yM5Y+v5pS55Li65o+Q5Lqk5Yig6Zmk6K6o6K6644CC77yJJyxcblx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdG5hbWU6ICdyMl90eXBlJyxcblx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdGxhYmVsOiAn6YCC55So57G75Z6L77yaJyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn6K+36YCJ5oupJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn55Sx6Z2e5p2h55uu6aG16Z2i77yI6Zmk55So5oi36aG177yJ5a+85ZCR5p2h55uu6aG155qE6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn55Sx6Z2e5p2h55uu6aG16Z2i77yI6Zmk55So5oi36aG177yJ5a+85ZCR5p2h55uu6aG155qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn55Sx5p2h55uu6aG15a+85ZCR6Z2e5p2h55uu6aG16Z2i55qE6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn55Sx5p2h55uu6aG15a+85ZCR5Lu75L2V6Z2e5p2h55uu6aG16Z2i55qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5piO5pi+56yU6K+v55qE6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn5piO5pi+56yU6K+v55qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5LiO5a+85ZCR55uu5qCH5peg5YWz5oiW5q+U5YW26IyD5Zu05pu05bm/5rOb55qE6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAn5LiO5a+85ZCR55uu5qCH5peg5YWz5oiW5q+U5YW26IyD5Zu05pu05bm/5rOb55qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5YW25LuW55CG55Sx77yI6K+35Yu+6YCJ5LiK5pa54oCc5bqU55So5aSa5Liq55CG55Sx4oCd77yM5bm25aGr5YaZ6Ieq5a6a5LmJ55CG55Sx77yJJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLnNwZWVkeS5ub3JtYWxpemVIYXNoID0ge1xuXHRcdHJlYXNvbjogJ2RiJyxcblx0XHRtdWx0aXBsZTogJ211bHRpcGxlJyxcblx0XHQnbXVsdGlwbGUtZmluaXNoJzogJ211bHRpcGxlLWZpbmlzaCcsXG5cdFx0ZzE6ICdnMScsXG5cdFx0ZzI6ICdnMicsXG5cdFx0ZzM6ICdnMycsXG5cdFx0ZzQ6ICdnNCcsXG5cdFx0ZzU6ICdnNScsXG5cdFx0ZzY6ICdnNicsXG5cdFx0Zzc6ICdnNycsXG5cdFx0Zzg6ICdnOCcsXG5cdFx0Zzk6ICdnOScsXG5cdFx0YTE6ICdhMScsXG5cdFx0YTI6ICdhMicsXG5cdFx0YTM6ICdhMycsXG5cdFx0cjE6ICdyMScsXG5cdFx0cjI6ICdyMicsXG5cdFx0ZjE6ICdmMScsXG5cdFx0ZjI6ICdmMicsXG5cdFx0ZjM6ICdmMycsXG5cdFx0ZjQ6ICdmNCcsXG5cdFx0ZjU6ICdmNScsXG5cdFx0bzE6ICdvMScsXG5cdFx0bzI6ICdvMicsXG5cdFx0bzM6ICdvMycsXG5cdH07XG5cdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcyA9IHtcblx0XHRnZXRUZW1wbGF0ZUNvZGVBbmRQYXJhbXM6IChwYXJhbXMpID0+IHtcblx0XHRcdGxldCBjb2RlO1xuXHRcdFx0bGV0IHBhcmFtZXRlcnM7XG5cdFx0XHRsZXQgaTtcblx0XHRcdGlmIChwYXJhbXMubm9ybWFsaXplZHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRjb2RlID0gJ3t7ZGVsZXRlJztcblx0XHRcdFx0cGFyYW1zLnV0cGFyYW1zID0ge307XG5cdFx0XHRcdGZvciAoY29uc3QgW2luZGV4LCBub3JtXSBvZiBwYXJhbXMubm9ybWFsaXplZHMuZW50cmllcygpKSB7XG5cdFx0XHRcdFx0aWYgKG5vcm0gIT09ICdkYicpIHtcblx0XHRcdFx0XHRcdGNvZGUgKz0gYHwke25vcm0udG9VcHBlckNhc2UoKX1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYXJhbWV0ZXJzID0gcGFyYW1zLnRlbXBsYXRlUGFyYW1zW2luZGV4XSB8fCBbXTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGlfIGluIHBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgcGFyYW1ldGVyc1tpX10gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRcdGNvZGUgKz0gYHwke3BhcmFtZXRlcnNbaV9dfWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBhcmFtcy51dHBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdC4uLnBhcmFtcy51dHBhcmFtcyxcblx0XHRcdFx0XHRcdC4uLlR3aW5rbGUuc3BlZWR5LmdldFVzZXJUYWxrUGFyYW1ldGVycyhub3JtLCBwYXJhbWV0ZXJzKSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGUgKz0gJ319Jztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhcmFtZXRlcnMgPSBwYXJhbXMudGVtcGxhdGVQYXJhbXNbMF0gfHwgW107XG5cdFx0XHRcdGNvZGUgPSAne3tkZWxldGUnO1xuXHRcdFx0XHRpZiAocGFyYW1zLnZhbHVlc1swXSAhPT0gJ3JlYXNvbicpIHtcblx0XHRcdFx0XHRjb2RlICs9IGB8JHtwYXJhbXMudmFsdWVzWzBdfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChpIGluIHBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHBhcmFtZXRlcnNbaV0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRjb2RlICs9IGB8JHtwYXJhbWV0ZXJzW2ldfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGUgKz0gJ319Jztcblx0XHRcdFx0cGFyYW1zLnV0cGFyYW1zID0gVHdpbmtsZS5zcGVlZHkuZ2V0VXNlclRhbGtQYXJhbWV0ZXJzKHBhcmFtcy5ub3JtYWxpemVkc1swXSwgcGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2NvZGUsIHBhcmFtcy51dHBhcmFtc107XG5cdFx0fSxcblx0XHRwYXJzZVdpa2l0ZXh0OiAodGl0bGUsIHdpa2l0ZXh0LCBjYWxsYmFjaykgPT4ge1xuXHRcdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRcdGFjdGlvbjogJ3BhcnNlJyxcblx0XHRcdFx0cHJvcDogJ3RleHQnLFxuXHRcdFx0XHRwc3Q6ICd0cnVlJyxcblx0XHRcdFx0dGV4dDogd2lraXRleHQsXG5cdFx0XHRcdGNvbnRlbnRtb2RlbDogJ3dpa2l0ZXh0Jyxcblx0XHRcdFx0dGl0bGUsXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgc3RhdHVzSW5kaWNhdG9yID0gbmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+aehOmAoOWIoOmZpOeQhueUsScsICfmp4vpgKDliKrpmaTnkIbnlLEnKSk7XG5cdFx0XHRjb25zdCBhcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn6Kej5p6Q5Yig6Zmk5qih5p2/JywgJ+ino+aekOWIqumZpOaooeadvycpLFxuXHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0KGFwaU9iaikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJlYXNvbiA9IGRlY29kZVVSSUNvbXBvbmVudChcblx0XHRcdFx0XHRcdCQoYXBpT2JqLmdldFhNTCgpLnF1ZXJ5U2VsZWN0b3IoJ3RleHQnKS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZSlcblx0XHRcdFx0XHRcdFx0LmZpbmQoJyNkZWxldGUtcmVhc29uJylcblx0XHRcdFx0XHRcdFx0LnRleHQoKVxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXFwrL2csICcgJylcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGlmIChyZWFzb24pIHtcblx0XHRcdFx0XHRcdHN0YXR1c0luZGljYXRvci5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3RhdHVzSW5kaWNhdG9yLndhcm4od2luZG93LndnVUxTKCfmnKrog73ku47liKDpmaTmqKHmnb/nlJ/miJDliKDpmaTnkIbnlLEnLCAn5pyq6IO95b6e5Yiq6Zmk5qih5p2/55Sf5oiQ5Yiq6Zmk55CG55SxJykpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjYWxsYmFjayhyZWFzb24pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzdGF0dXNJbmRpY2F0b3Jcblx0XHRcdCk7XG5cdFx0XHRhcGkucG9zdCgpO1xuXHRcdH0sXG5cdFx0c3lzb3A6IHtcblx0XHRcdG1haW46IChwYXJhbXMpID0+IHtcblx0XHRcdFx0bGV0IHJlYXNvbjtcblx0XHRcdFx0aWYgKCFwYXJhbXMubm9ybWFsaXplZHMubGVuZ3RoICYmIHBhcmFtcy5ub3JtYWxpemVkc1swXSA9PT0gJ2RiJykge1xuXHRcdFx0XHRcdHJlYXNvbiA9IHByb21wdCh3aW5kb3cud2dVTFMoJ+i+k+WFpeWIoOmZpOeQhueUse+8micsICfovLjlhaXliKrpmaTnkIbnlLHvvJonKSwgJycpO1xuXHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5zeXNvcC5kZWxldGVQYWdlKHJlYXNvbiwgcGFyYW1zKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBbY29kZV0gPSBUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MuZ2V0VGVtcGxhdGVDb2RlQW5kUGFyYW1zKHBhcmFtcyk7XG5cdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnBhcnNlV2lraXRleHQobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLCBjb2RlLCAoZGVsZXRlUmVhc29uKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAocGFyYW1zLnByb21wdEZvclN1bW1hcnkpIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlUmVhc29uID0gcHJvbXB0KFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfovpPlhaXliKDpmaTnkIbnlLHvvIzmiJbljZXlh7vnoa7lrprku6XmjqXlj5foh6rliqjnlJ/miJDnmoTvvJonLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+i8uOWFpeWIqumZpOeQhueUse+8jOaIlum7nuaTiueiuuWumuS7peaOpeWPl+iHquWLleeUn+aIkOeahO+8midcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZVJlYXNvblxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnN5c29wLmRlbGV0ZVBhZ2UoZGVsZXRlUmVhc29uLCBwYXJhbXMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZXRlUGFnZTogKHJlYXNvbiwgcGFyYW1zKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRoaXNwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfliKDpmaTpobXpnaInLCAn5Yiq6Zmk6aCB6Z2iJylcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKHJlYXNvbiA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBNb3JlYml0cy5zdGF0dXMuZXJyb3IoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivoumXrueQhueUsScsICfoqaLllY/nkIbnlLEnKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn55So5oi35Y+W5raI5pON5L2c44CCJywgJ+S9v+eUqOiAheWPlua2iOaTjeS9nOOAgicpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIGlmICghcmVhc29uIHx8ICFyZWFzb24udHJpbSgpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIE1vcmViaXRzLnN0YXR1cy5lcnJvcihcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6K+i6Zeu55CG55SxJywgJ+ipouWVj+eQhueUsScpLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkvaDkuI3nu5nmiJHnkIbnlLHigKbmiJHlsLHigKbkuI3nrqHkuobigKYnLCAn5L2g5LiN57Wm5oiR55CG55Sx4oCm5oiR5bCx4oCm5LiN566h5LqG4oCmJylcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGRlbGV0ZU1haW4gPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0RWRpdFN1bW1hcnkocmVhc29uKTtcblx0XHRcdFx0XHR0aGlzcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0V2F0Y2hsaXN0KHBhcmFtcy53YXRjaCk7XG5cdFx0XHRcdFx0dGhpc3BhZ2UuZGVsZXRlUGFnZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzcGFnZS5nZXRTdGF0dXNFbGVtZW50KCkuaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3Muc3lzb3AuZGVsZXRlVGFsayhwYXJhbXMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBsb29rIHVwIGluaXRpYWwgY29udHJpYnV0b3IuIElmIHByb21wdGluZyB1c2VyIGZvciBkZWxldGlvbiByZWFzb24sIGp1c3QgZGlzcGxheSBhIGxpbmsuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBvcGVuIHRoZSB0YWxrIHBhZ2UgZGlyZWN0bHlcblx0XHRcdFx0aWYgKHBhcmFtcy5vcGVuVXNlclRhbGspIHtcblx0XHRcdFx0XHR0aGlzcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0XHR0aGlzcGFnZS5sb29rdXBDcmVhdGlvbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3Muc3lzb3Aub3BlblVzZXJUYWxrUGFnZSh0aGlzcGFnZSk7XG5cdFx0XHRcdFx0XHRkZWxldGVNYWluKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVsZXRlTWFpbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZXRlVGFsazogKHBhcmFtcykgPT4ge1xuXHRcdFx0XHQvLyBkZWxldGUgdGFsayBwYWdlXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRwYXJhbXMuZGVsZXRlVGFsa1BhZ2UgJiZcblx0XHRcdFx0XHRwYXJhbXMubm9ybWFsaXplZCAhPT0gJ28xJyAmJlxuXHRcdFx0XHRcdCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2EtdGFsaycpLmNsYXNzTGlzdC5jb250YWlucygnbmV3Jylcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29uc3QgdGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0YCR7XG5cdFx0XHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW213LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgKyAxXVxuXHRcdFx0XHRcdFx0fToke213LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKX1gLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfliKDpmaTorqjorrrpobUnLCAn5Yiq6Zmk6KiO6KuW6aCBJylcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHRhbGtwYWdlLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRcdFx0YFtbTElCOkNTRCNHOXxHOV1dOiDlraTnq4vpobXpnaLvvJrlt7LliKDpmaTpobXpnaLigJwke01vcmViaXRzLnBhZ2VOYW1lTm9ybX3igJ3nmoTorqjorrrpobVgXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR0YWxrcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0dGFsa3BhZ2UuZGVsZXRlUGFnZSgpO1xuXHRcdFx0XHRcdC8vIHRoaXMgaXMgdWdseSwgYnV0IGJlY2F1c2Ugb2YgdGhlIGFyY2hpdGVjdHVyZSBvZiB3aWtpLmFwaSwgaXQgaXMgbmVlZGVkXG5cdFx0XHRcdFx0Ly8gKG90aGVyd2lzZSBzdWNjZXNzL2ZhaWx1cmUgbWVzc2FnZXMgZm9yIHRoZSBwcmV2aW91cyBhY3Rpb24gd291bGQgYmUgc3VwcHJlc3NlZClcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5zeXNvcC5kZWxldGVSZWRpcmVjdHMocGFyYW1zKTtcblx0XHRcdFx0XHR9LCAxODAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3Muc3lzb3AuZGVsZXRlUmVkaXJlY3RzKHBhcmFtcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxldGVSZWRpcmVjdHM6IChwYXJhbXMpID0+IHtcblx0XHRcdFx0Ly8gZGVsZXRlIHJlZGlyZWN0c1xuXHRcdFx0XHRpZiAocGFyYW1zLmRlbGV0ZVJlZGlyZWN0cykge1xuXHRcdFx0XHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0dGl0bGVzOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0XHRwcm9wOiAncmVkaXJlY3RzJyxcblx0XHRcdFx0XHRcdHJkbGltaXQ6IDUwMDAsIC8vIDUwMCBpcyBtYXggZm9yIG5vcm1hbCB1c2VycywgNTAwMCBmb3IgYm90cyBhbmQgc3lzb3BzXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfojrflj5bph43lrprlkJHliJfooajigKYnLCAn5Y+W5b6X6YeN5paw5bCO5ZCR5YiX6KGo4oCmJyksXG5cdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5zeXNvcC5kZWxldGVSZWRpcmVjdHNNYWluLFxuXHRcdFx0XHRcdFx0bmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+WIoOmZpOmHjeWumuWQkScsICfliKrpmaTph43mlrDlsI7lkJEnKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcyA9IHBhcmFtcztcblx0XHRcdFx0XHR5c2FyY2hpdmVzX2FwaS5wb3N0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcHJvbXB0IGZvciBwcm90ZWN0IG9uIEc3XG5cdFx0XHRcdGxldCAkbGluaztcblx0XHRcdFx0bGV0ICRiaWd0ZXh0O1xuXHRcdFx0XHRpZiAocGFyYW1zLm5vcm1hbGl6ZWQgPT09ICdnNycpIHtcblx0XHRcdFx0XHQkbGluayA9ICQoJzxhPicpXG5cdFx0XHRcdFx0XHQuYXR0cignaHJlZicsICcjJylcblx0XHRcdFx0XHRcdC50ZXh0KHdpbmRvdy53Z1VMUygn5Y2V5Ye76L+Z6YeM5pa96KGM5L+d5oqkJywgJ+m7nuaTiumAmeijoeaWveihjOS/neittycpKVxuXHRcdFx0XHRcdFx0LmNzcyh7XG5cdFx0XHRcdFx0XHRcdCdmb250LXNpemUnOiAnMTI1JScsXG5cdFx0XHRcdFx0XHRcdCdmb250LXdlaWdodCc6ICdib2xkJyxcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQub24oJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRtdy5jb25maWcuc2V0KCd3Z0FydGljbGVJZCcsIDApO1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuY2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdCRiaWd0ZXh0ID0gJCgnPHNwYW4+Jylcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHQnZm9udC1zaXplJzogJzEyNSUnLFxuXHRcdFx0XHRcdFx0XHQnZm9udC13ZWlnaHQnOiAnYm9sZCcsXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCfnmb3nurjkv53miqTor6XpobUnLCAn55m957SZ5L+d6K236Kmy6aCBJykpO1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKCRiaWd0ZXh0WzBdLCAkbGlua1swXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcHJvbW90ZSBVbmxpbmsgdG9vbFxuXHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gNikge1xuXHRcdFx0XHRcdCRsaW5rID0gJCgnPGE+Jylcblx0XHRcdFx0XHRcdC5hdHRyKCdocmVmJywgJyMnKVxuXHRcdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCfljZXlh7vov5nph4zliY3lvoDlj5bmtojpk77lhaXlt6XlhbcnLCAn6bue5pOK6YCZ6KOh5YmN5b6A5Y+W5raI6YCj5YWl5bel5YW3JykpXG5cdFx0XHRcdFx0XHQuY3NzKHtcblx0XHRcdFx0XHRcdFx0J2ZvbnQtd2VpZ2h0JzogJ2JvbGQnLFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5vbignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUudW5saW5rLmNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn5Y+W5raI5a+55bey5Yig6Zmk5paH5Lu2ICcsICflj5bmtojlsI3lt7LliKrpmaTmqpTmoYggJykgKyBNb3JlYml0cy5wYWdlTmFtZU5vcm19IOeahOS9v+eUqGBcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdCRiaWd0ZXh0ID0gJCgnPHNwYW4+Jylcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHQnZm9udC13ZWlnaHQnOiAnYm9sZCcsXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCflj5bmtojlr7nlt7LliKDpmaTmlofku7bnmoTkvb/nlKgnLCAn5Y+W5raI5bCN5bey5Yiq6Zmk5qqU5qGI55qE5L2/55SoJykpO1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKCRiaWd0ZXh0WzBdLCAkbGlua1swXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JGxpbmsgPSAkKCc8YT4nKVxuXHRcdFx0XHRcdFx0LmF0dHIoJ2hyZWYnLCAnIycpXG5cdFx0XHRcdFx0XHQudGV4dCh3aW5kb3cud2dVTFMoJ+WNleWHu+i/memHjOWJjeW+gOWPlua2iOmTvuWFpeW3peWFtycsICfpu57mk4rpgJnoo6HliY3lvoDlj5bmtojpgKPlhaXlt6XlhbcnKSlcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHQnZm9udC13ZWlnaHQnOiAnYm9sZCcsXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0Lm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRUd2lua2xlLnNwZWVkeS5kaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS51bmxpbmsuY2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflj5bmtojlr7nlt7LliKDpmaTpobXpnaIgJywgJ+WPlua2iOWwjeW3suWIqumZpOmggemdoiAnKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5wYWdlTmFtZU5vcm0gK1xuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCcg55qE6ZO+5o6lJywgJyDnmoTpgKPntZAnKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0JGJpZ3RleHQgPSAkKCc8c3Bhbj4nKS50ZXh0KHdpbmRvdy53Z1VMUygn5Y+W5raI5a+55bey5Yig6Zmk6aG16Z2i55qE6ZO+5o6lJywgJ+WPlua2iOWwjeW3suWIqumZpOmggemdoueahOmAo+e1kCcpKS5jc3Moe1xuXHRcdFx0XHRcdFx0J2ZvbnQtd2VpZ2h0JzogJ2JvbGQnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKCRiaWd0ZXh0WzBdLCAkbGlua1swXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JGxpbmsgPSAkKCc8YT4nKVxuXHRcdFx0XHRcdC5hdHRyKCdocmVmJywgbXcudXRpbC5nZXRVcmwoJ1NwZWNpYWw6UmFuZG9tSW5DYXRlZ29yeS/lv6vpgJ/liKDpmaTlgJnpgIknKSlcblx0XHRcdFx0XHQudGV4dCh3aW5kb3cud2dVTFMoJ+WNleWHu+WJjeW+gOS4i+S4gOS4quW/q+mAn+WIoOmZpOWAmemAiScsICfpu57mk4rliY3lvoDkuIvkuIDlgIvlv6vpgJ/liKrpmaTlgJnpgbgnKSk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKCflt6XlhbcnLCAkbGlua1swXSk7XG5cdFx0XHR9LFxuXHRcdFx0b3BlblVzZXJUYWxrUGFnZTogKHBhZ2VvYmopID0+IHtcblx0XHRcdFx0cGFnZW9iai5nZXRTdGF0dXNFbGVtZW50KCkudW5saW5rKCk7IC8vIGRvbid0IG5lZWQgaXQgYW55bW9yZVxuXHRcdFx0XHRjb25zdCB1c2VyID0gcGFnZW9iai5nZXRDcmVhdG9yKCk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0XHRcdGFjdGlvbjogJ2VkaXQnLFxuXHRcdFx0XHRcdHByZXZpZXc6ICd5ZXMnLFxuXHRcdFx0XHRcdHZhbmFydGljbGU6IE1vcmViaXRzLnBhZ2VOYW1lTm9ybSxcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgdGl0bGUgPSBgVXNlciB0YWxrOiR7dXNlcn1gO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cGFyYW1zLm5vcm1hbGl6ZWQgPT09ICdkYicgfHxcblx0XHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3Byb21wdEZvclNwZWVkeURlbGV0aW9uU3VtbWFyeScpLmluY2x1ZGVzKHBhcmFtcy5ub3JtYWxpemVkKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBwcm92aWRlIGEgbGluayB0byB0aGUgdXNlciB0YWxrIHBhZ2Vcblx0XHRcdFx0XHRjb25zdCAkbGluayA9ICQoJzxhPicpXG5cdFx0XHRcdFx0XHQuYXR0cih7XG5cdFx0XHRcdFx0XHRcdGhyZWY6IG13LnV0aWwuZ2V0VXJsKHRpdGxlLCBxdWVyeSksXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogJ19ibGFuaycsXG5cdFx0XHRcdFx0XHRcdHJlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXInLFxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHQnZm9udC1zaXplJzogJzEyNSUnLFxuXHRcdFx0XHRcdFx0XHQnZm9udC13ZWlnaHQnOiAnYm9sZCcsXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCfngrnmraTmiZPlvIBVc2VyIHRhbGs6JywgJ+m7nuatpOaJk+mWi1VzZXIgdGFsazonKSArIHVzZXIpO1xuXHRcdFx0XHRcdGNvbnN0ICRiaWd0ZXh0ID0gJCgnPHNwYW4+Jylcblx0XHRcdFx0XHRcdC5jc3Moe1xuXHRcdFx0XHRcdFx0XHQnZm9udC1zaXplJzogJzEyNSUnLFxuXHRcdFx0XHRcdFx0XHQnZm9udC13ZWlnaHQnOiAnYm9sZCcsXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LnRleHQod2luZG93LndnVUxTKCfpgJrnn6XpobXpnaLliJvlu7rogIUnLCAn6YCa55+l6aCB6Z2i5bu656uL6ICFJykpO1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKCRiaWd0ZXh0WzBdLCAkbGlua1swXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gb3BlbiB0aGUgaW5pdGlhbCBjb250cmlidXRvcidzIHRhbGsgcGFnZVxuXHRcdFx0XHRcdGNvbnN0IHN0YXR1c0luZGljYXRvciA9IG5ldyBNb3JlYml0cy5zdGF0dXMoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aJk+W8gOeUqOaItycsICfmiZPplovkvb/nlKjogIUnKSArXG5cdFx0XHRcdFx0XHRcdHVzZXIgK1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+eahOiuqOiuuumhtee8lui+keeql+WPoycsICfnmoToqI7oq5bpoIHnt6jovK/oppbnqpcnKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5omT5byA5Lit4oCmJywgJ+aJk+mWi+S4reKApicpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRzd2l0Y2ggKFR3aW5rbGUuZ2V0UHJlZigndXNlclRhbGtQYWdlTW9kZScpKSB7XG5cdFx0XHRcdFx0XHRjYXNlICd0YWInOlxuXHRcdFx0XHRcdFx0XHR3aW5kb3cub3Blbihtdy51dGlsLmdldFVybCh0aXRsZSwgcXVlcnkpLCAnX2JsYW5rJywgJ25vb3BlbmVyLG5vcmVmZXJyZXInKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdibGFuayc6XG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5vcGVuKFxuXHRcdFx0XHRcdFx0XHRcdG13LnV0aWwuZ2V0VXJsKHRpdGxlLCBxdWVyeSksXG5cdFx0XHRcdFx0XHRcdFx0J19ibGFuaycsXG5cdFx0XHRcdFx0XHRcdFx0J25vb3BlbmVyLG5vcmVmZXJyZXIsbG9jYXRpb249bm8sdG9vbGJhcj1ubyxzdGF0dXM9bm8sZGlyZWN0b3JpZXM9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MTIwMCxoZWlnaHQ9ODAwJ1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdC8qIGNhc2UgJ3dpbmRvdyc6ICovXG5cdFx0XHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR3aW5kb3cub3Blbihcblx0XHRcdFx0XHRcdFx0XHRtdy51dGlsLmdldFVybCh0aXRsZSwgcXVlcnkpLFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5uYW1lID09PSAndHdpbmtsZXdhcm53aW5kb3cnID8gJ19ibGFuaycgOiAndHdpbmtsZXdhcm53aW5kb3cnLFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5uYW1lID09PSAndHdpbmtsZXdhcm53aW5kb3cnXG5cdFx0XHRcdFx0XHRcdFx0XHQ/ICdub29wZW5lcixub3JlZmVycmVyLCdcblx0XHRcdFx0XHRcdFx0XHRcdDogJycgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHN0YXR1cz1ubyxkaXJlY3Rvcmllcz1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0xMjAwLGhlaWdodD04MDAnXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdGF0dXNJbmRpY2F0b3IuaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxldGVSZWRpcmVjdHNNYWluOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHhtbERvYyA9IGFwaW9iai5nZXRYTUwoKTtcblx0XHRcdFx0Y29uc3QgJHNuYXBzaG90ID0gJCh4bWxEb2MpLmZpbmQoJ3JlZGlyZWN0cyByZCcpO1xuXHRcdFx0XHRjb25zdCB0b3RhbCA9ICRzbmFwc2hvdC5sZW5ndGg7XG5cdFx0XHRcdGNvbnN0IHN0YXR1c0luZGljYXRvciA9IGFwaW9iai5zdGF0ZWxlbTtcblx0XHRcdFx0aWYgKCF0b3RhbCkge1xuXHRcdFx0XHRcdHN0YXR1c0luZGljYXRvci5pbmZvKHdpbmRvdy53Z1VMUygn5pyq5Y+R546w6YeN5a6a5ZCRJywgJ+acqueZvOePvumHjeaWsOWwjuWQkScpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhdHVzSW5kaWNhdG9yLnN0YXR1cygnMCUnKTtcblx0XHRcdFx0bGV0IGN1cnJlbnQgPSAwO1xuXHRcdFx0XHRjb25zdCBvbnN1Y2Nlc3MgPSAoYXBpb2JqSW5uZXIpID0+IHtcblx0XHRcdFx0XHRjb25zdCBub3cgPSBgJHtOdW1iZXIucGFyc2VJbnQoKDEwMCAqICsrY3VycmVudCkgLyB0b3RhbCwgMTApfSVgO1xuXHRcdFx0XHRcdHN0YXR1c0luZGljYXRvci51cGRhdGUobm93KTtcblx0XHRcdFx0XHRhcGlvYmpJbm5lci5zdGF0ZWxlbS51bmxpbmsoKTtcblx0XHRcdFx0XHRpZiAoY3VycmVudCA+PSB0b3RhbCkge1xuXHRcdFx0XHRcdFx0c3RhdHVzSW5kaWNhdG9yLmluZm8oYCR7bm93fe+8iOWujOaIkO+8iWApO1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMud2lraS5yZW1vdmVDaGVja3BvaW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFkZENoZWNrcG9pbnQoKTtcblx0XHRcdFx0JHNuYXBzaG90LmVhY2goKF9rZXksIHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdGl0bGUgPSAkKHZhbHVlKS5hdHRyKCd0aXRsZScpO1xuXHRcdFx0XHRcdGNvbnN0IHBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0dGl0bGUsXG5cdFx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ+WIoOmZpOmHjeWumuWQkSBcIicsICfliKrpmaTph43mlrDlsI7lkJEgXCInKSArIHRpdGxlfVwiYFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cGFnZS5zZXRFZGl0U3VtbWFyeShgW1tMSUI6Q1NEI0c5fEc5XV06IOWtpOeri+mhtemdou+8mumHjeWumuWQkeWIsOW3suWIoOmZpOmhtemdouKAnCR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfeKAnWApO1xuXHRcdFx0XHRcdHBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHBhZ2UuZGVsZXRlUGFnZShvbnN1Y2Nlc3MpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0fSxcblx0XHR1c2VyOiB7XG5cdFx0XHRtYWluOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0XHRpZiAoIXBhZ2VvYmouZXhpc3RzKCkpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouS4jeWtmOWcqO+8jOWPr+iDveW3suiiq+WIoOmZpCcsICfpoIHpnaLkuI3lrZjlnKjvvIzlj6/og73lt7LooqvliKrpmaQnKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRzdGF0ZWxlbS5zdGF0dXMod2luZG93LndnVUxTKCfmo4Dmn6XpobXpnaLlt7LmnInmoIforrDigKYnLCAn5qqi5p+l6aCB6Z2i5bey5pyJ5qiZ6KiY4oCmJykpO1xuXHRcdFx0XHQvLyBjaGVjayBmb3IgZXhpc3RpbmcgZGVsZXRpb24gdGFnc1xuXHRcdFx0XHRjb25zdCB0ZXh0Tm9TZCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHQvXFx7XFx7XFxzKihkYigtXFx3Kik/fGR8ZGVsZXRlfGRlbGV0ZWJlY2F1c2V8c3BlZWR5fGNzZHzpgJ/liKp86YCf5YigfOW/q+WIoHzlv6vliKopXFxzKihcXHwoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pKik/XFx9XFx9XFxzKi9naSxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGV4dCAhPT0gdGV4dE5vU2QgJiZcblx0XHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0J+WcqOmhtemdouS4iuaJvuWIsOW/q+mAn+WIoOmZpOaooeadv++8jOimgeenu+mZpOW5tuWKoOWFpeaWsOeahOWQl++8nycsXG5cdFx0XHRcdFx0XHRcdCflnKjpoIHpnaLkuIrmib7liLDlv6vpgJ/liKrpmaTmqKHmnb/vvIzopoHnp7vpmaTkuKbliqDlhaXmlrDnmoTll47vvJ8nXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpOaooeadv+W3suiiq+e9ruS6jumhtemdouS4reOAgicsICflv6vpgJ/liKrpmaTmqKHmnb/lt7Looqvnva7mlrzpoIHpnaLkuK3jgIInKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHQgPSB0ZXh0Tm9TZDtcblx0XHRcdFx0Y29uc3QgY29weXZpbyA9IC8oPzpcXHtcXHtcXHMqKGNvcHl2aW985L615p2DfOS+teasiilbXnt9XSo/XFx9XFx9KS9pLmV4ZWModGV4dCk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRjb3B5dmlvICYmXG5cdFx0XHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdCfokZfkvZzmnYPpqozor4HmqKHmnb/lt7Looqvnva7kuo7pobXpnaLkuK3vvIzmgqjmmK/lkKbku43mg7PliqDlhaXkuIDkuKrlv6vpgJ/liKDpmaTmqKHmnb/vvJ8nLFxuXHRcdFx0XHRcdFx0XHQn6JGX5L2c5qyK6amX6K2J5qih5p2/5bey6KKr572u5pa86aCB6Z2i5Lit77yM5oKo5piv5ZCm5LuN5oOz5Yqg5YWl5LiA5YCL5b+r6YCf5Yiq6Zmk5qih5p2/77yfJ1xuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfpobXpnaLkuK3lt7LmnInokZfkvZzmnYPpqozor4HmqKHmnb/jgIInLCAn6aCB6Z2i5Lit5bey5pyJ6JGX5L2c5qyK6amX6K2J5qih5p2/44CCJykpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB4ZmQgPSAvKD86XFx7XFx7KFtyc2FpZnRjbXZdZmR8bWQxfHByb3Bvc2VkIGRlbGV0aW9uKVtee31dKj9cXH1cXH0pL2kuZXhlYyh0ZXh0KTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHhmZCAmJlxuXHRcdFx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfliKDpmaTnm7jlhbPmqKHmnb97eycsICfliKrpmaTnm7jpl5zmqKHmnb97eycpICtcblx0XHRcdFx0XHRcdFx0eGZkWzFdICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCd9feW3suiiq+e9ruS6jumhtemdouS4re+8jOaCqOaYr+WQpuS7jeaDs+WKoOWFpeS4gOS4quW/q+mAn+WIoOmZpOaooeadv++8nycsXG5cdFx0XHRcdFx0XHRcdFx0J3195bey6KKr572u5pa86aCB6Z2i5Lit77yM5oKo5piv5ZCm5LuN5oOz5Yqg5YWl5LiA5YCL5b+r6YCf5Yiq6Zmk5qih5p2/77yfJ1xuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouW3suiiq+aPkOS6pOiHs+WtmOW6n+iuqOiuuuOAgicsICfpoIHpnaLlt7Looqvmj5DkuqToh7PlrZjlu6LoqI7oq5bjgIInKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGdpdmVuIHRoZSBwYXJhbXMsIGJ1aWxkcyB0aGUgdGVtcGxhdGUgYW5kIGFsc28gYWRkcyB0aGUgdXNlciB0YWxrIHBhZ2UgcGFyYW1ldGVycyB0byB0aGUgcGFyYW1zIHRoYXQgd2VyZSBwYXNzZWQgaW5cblx0XHRcdFx0Ly8gcmV0dXJucyA9PiBbPHN0cmluZz4gd2lraXRleHQsIDxvYmplY3Q+IHV0cGFyYW1zXVxuXHRcdFx0XHRjb25zdCBidWlsZERhdGEgPSBUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MuZ2V0VGVtcGxhdGVDb2RlQW5kUGFyYW1zKHBhcmFtcyk7XG5cdFx0XHRcdGxldCBbY29kZV0gPSBidWlsZERhdGE7XG5cdFx0XHRcdFssIHBhcmFtcy51dHBhcmFtc10gPSBidWlsZERhdGE7XG5cdFx0XHRcdGNvbnN0IHRoaXNwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykpO1xuXHRcdFx0XHQvLyBwYXRyb2wgdGhlIHBhZ2UsIGlmIHJlYWNoZWQgZnJvbSBTcGVjaWFsOk5ld1BhZ2VzXG5cdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ21hcmtTcGVlZHlQYWdlc0FzUGF0cm9sbGVkJykpIHtcblx0XHRcdFx0XHR0aGlzcGFnZS5wYXRyb2woKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBXcmFwIFNEIHRlbXBsYXRlIGluIG5vaW5jbHVkZSB0YWdzIGlmIHdlIGFyZSBpbiB0ZW1wbGF0ZSBzcGFjZS5cblx0XHRcdFx0Ly8gV29uJ3Qgd29yayB3aXRoIHVzZXJib3hlcyBpbiB1c2Vyc3BhY2UsIG9yIGFueSBvdGhlciB0cmFuc2NsdWRlZCBwYWdlIG91dHNpZGUgdGVtcGxhdGUgc3BhY2Vcblx0XHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDEwKSB7XG5cdFx0XHRcdFx0Ly8gVGVtcGxhdGU6XG5cdFx0XHRcdFx0Y29kZSA9IGA8bm9pbmNsdWRlPiR7Y29kZX08L25vaW5jbHVkZT5gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFJlbW92ZSB0YWdzIHRoYXQgYmVjb21lIHN1cGVyZmx1b3VzIHdpdGggdGhpcyBhY3Rpb25cblx0XHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHQvXFx7XFx7XFxzKihbTm5dZXcgdW5yZXZpZXdlZCBhcnRpY2xlfFtVdV1ucmV2aWV3ZWR8W1V1XXNlcnNwYWNlIGRyYWZ0KVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfVxccyovZyxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gNikge1xuXHRcdFx0XHRcdC8vIHJlbW92ZSBcIm1vdmUgdG8gQ29tbW9uc1wiIHRhZyAtIGRlbGV0aW9uLXRhZ2dlZCBmaWxlcyBjYW5ub3QgYmUgbW92ZWQgdG8gQ29tbW9uc1xuXHRcdFx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdFx0XHQvXFx7XFx7KG10Y3woY29weSB8bW92ZSApP3RvID8oc2hhcmV8Y29tbW9ucyl8bW92ZSB0byAoeXNhcmNoaXZlcyBzaGFyZXx3aWtpbWVkaWEgY29tbW9ucyl8Y29weSB0byAoeXNhcmNoaXZlcyBzaGFyZXx3aWtpbWVkaWEgY29tbW9ucykpW159XSpcXH1cXH0vZ2ksXG5cdFx0XHRcdFx0XHQnJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBhcmFtcy5yZXF1ZXN0c2FsdCkge1xuXHRcdFx0XHRcdGNvZGUgPSBge3tzYWx0fX1cXG4ke2NvZGV9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBHZW5lcmF0ZSBlZGl0IHN1bW1hcnkgZm9yIGVkaXRcblx0XHRcdFx0bGV0IGVkaXRzdW1tYXJ5O1xuXHRcdFx0XHRpZiAocGFyYW1zLm5vcm1hbGl6ZWRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRlZGl0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn6K+35rGC5b+r6YCf5Yig6Zmk77yIJywgJ+iri+axguW/q+mAn+WIqumZpO+8iCcpO1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgbm9ybSBvZiBwYXJhbXMubm9ybWFsaXplZHMpIHtcblx0XHRcdFx0XHRcdGlmIChub3JtICE9PSAnZGInKSB7XG5cdFx0XHRcdFx0XHRcdGVkaXRzdW1tYXJ5ICs9IGBbW0xJQjpDU0QjJHtub3JtLnRvVXBwZXJDYXNlKCl9fENTRCAke25vcm0udG9VcHBlckNhc2UoKX1dXeOAgWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVkaXRzdW1tYXJ5ID0gZWRpdHN1bW1hcnkuc2xpY2UoMCwgTWF0aC5tYXgoMCwgZWRpdHN1bW1hcnkubGVuZ3RoIC0gMSkpOyAvLyByZW1vdmUgdHJhaWxpbmcgY29tbWFcblx0XHRcdFx0XHRlZGl0c3VtbWFyeSArPSAn77yJJztcblx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMubm9ybWFsaXplZHNbMF0gPT09ICdkYicpIHtcblx0XHRcdFx0XHRlZGl0c3VtbWFyeSA9XG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivt+axgltbTElCOkNTRHzlv6vpgJ/liKDpmaRdXe+8micsICfoq4vmsYJbW0xJQjpDU0R85b+r6YCf5Yiq6ZmkXV3vvJonKSArXG5cdFx0XHRcdFx0XHRwYXJhbXMudGVtcGxhdGVQYXJhbXNbMF1bJzEnXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlZGl0c3VtbWFyeSA9IGAke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfor7fmsYLlv6vpgJ/liKDpmaQnLFxuXHRcdFx0XHRcdFx0J+iri+axguW/q+mAn+WIqumZpCdcblx0XHRcdFx0XHQpfe+8iFtbTElCOkNTRCMke3BhcmFtcy5ub3JtYWxpemVkc1swXS50b1VwcGVyQ2FzZSgpfXxDU0QgJHtwYXJhbXMubm9ybWFsaXplZHNbMF0udG9VcHBlckNhc2UoKX1dXe+8iWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQmxhbmsgYXR0YWNrIHBhZ2VzXG5cdFx0XHRcdGlmIChwYXJhbXMuYmxhbmspIHtcblx0XHRcdFx0XHR0ZXh0ID0gY29kZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBJbnNlcnQgdGFnIGFmdGVyIHNob3J0IGRlc2NyaXB0aW9uIG9yIGFueSBoYXRub3Rlc1xuXHRcdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpdGV4dC5wYWdlKHRleHQpO1xuXHRcdFx0XHRcdHRleHQgPSB5c2FyY2hpdmVzX3BhZ2UuaW5zZXJ0QWZ0ZXJUZW1wbGF0ZXMoYCR7Y29kZX1cXG5gLCBUd2lua2xlLmhhdG5vdGVSZWdleCkuZ2V0VGV4dCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoZWRpdHN1bW1hcnkpO1xuXHRcdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QocGFyYW1zLndhdGNoKTtcblx0XHRcdFx0cGFnZW9iai5zYXZlKFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy51c2VyLnRhZ0NvbXBsZXRlKTtcblx0XHRcdH0sXG5cdFx0XHR0YWdDb21wbGV0ZTogKHBhZ2VvYmopID0+IHtcblx0XHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdFx0Ly8gTm90aWZpY2F0aW9uIHRvIGZpcnN0IGNvbnRyaWJ1dG9yXG5cdFx0XHRcdGlmIChwYXJhbXMudXNlcnRhbGspIHtcblx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IChwYWdlT2JqKSA9PiB7XG5cdFx0XHRcdFx0XHRsZXQgaW5pdGlhbENvbnRyaWIgPSBwYWdlT2JqLmdldENyZWF0b3IoKTtcblx0XHRcdFx0XHRcdC8vIGRpc2FsbG93IHdhcm5pbmcgeW91cnNlbGZcblx0XHRcdFx0XHRcdGlmIChpbml0aWFsQ29udHJpYiA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSB7XG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdGDmgqjvvIgke2luaXRpYWxDb250cmlifSR7d2luZG93LndnVUxTKCfvvInliJvlu7rkuobor6XpobXvvIzot7Pov4fpgJrnn6UnLCAn77yJ5bu656uL5LqG6Kmy6aCB77yM6Lez6YGO6YCa55+lJyl9YFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRpbml0aWFsQ29udHJpYiA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdC8vIGRvbid0IG5vdGlmeSB1c2VycyB3aGVuIHRoZWlyIHVzZXIgdGFsayBwYWdlIGlzIG5vbWluYXRlZFxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0aW5pdGlhbENvbnRyaWIgPT09IG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKSAmJlxuXHRcdFx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAzXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+mAmuefpemhtemdouWIm+W7uuiAhe+8mueUqOaIt+WIm+W7uuS6huiHquW3seeahOiuqOiuuumhtScsXG5cdFx0XHRcdFx0XHRcdFx0XHQn6YCa55+l6aCB6Z2i5bu656uL6ICF77ya5L2/55So6ICF5bu656uL5LqG6Ieq5bex55qE6KiO6KuW6aCBJ1xuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aW5pdGlhbENvbnRyaWIgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHQvLyBxdWljayBoYWNrIHRvIHByZXZlbnQgZXhjZXNzaXZlIHVud2FudGVkIG5vdGlmaWNhdGlvbnMuIFNob3VsZCBhY3R1YWxseSBiZSBjb25maWd1cmFibGUgb24gcmVjaXBpZW50IHBhZ2UuLi5cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5pdGlhbENvbnRyaWIgPT09ICdBMjA5MzA2NC1ib3QnICYmIHBhcmFtcy5ub3JtYWxpemVkc1swXSA9PT0gJ2cxNScpIHtcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+mAmuefpemhtemdouWIm+W7uuiAhe+8mueUseacuuWZqOS6uuWIm+W7uu+8jOi3s+i/h+mAmuefpScsXG5cdFx0XHRcdFx0XHRcdFx0XHQn6YCa55+l6aCB6Z2i5bu656uL6ICF77ya55Sx5qmf5Zmo5Lq65bu656uL77yM6Lez6YGO6YCa55+lJ1xuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aW5pdGlhbENvbnRyaWIgPSBudWxsO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGFsa1BhZ2VOYW1lID0gYFVzZXIgdGFsazoke2luaXRpYWxDb250cmlifWA7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHVzZXJ0YWxrcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0dGFsa1BhZ2VOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn6YCa55+l6aG16Z2i5Yib5bu66ICF77yIJywgJ+mAmuefpemggemdouW7uueri+iAhe+8iCcpICsgaW5pdGlhbENvbnRyaWJ977yJYFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRsZXQgbm90aWZ5dGV4dDtcblx0XHRcdFx0XHRcdFx0bm90aWZ5dGV4dCA9ICdcXG57eycuY29uY2F0KCdzdWJzdDonLCBgZGItbm90aWNlfHRhcmdldD0ke01vcmViaXRzLnBhZ2VOYW1lTm9ybX1gKTtcblx0XHRcdFx0XHRcdFx0bm90aWZ5dGV4dCArPSBcInxub3dlbGNvbWU9eWVzJ319LS1+flwiLmNvbmNhdCgnfn4nKTtcblx0XHRcdFx0XHRcdFx0bGV0IGVkaXRzdW1tYXJ5ID0gJ+mAmuefpe+8mic7XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJhbXMubm9ybWFsaXplZHMuaW5jbHVkZXMoJ2czJykpIHtcblx0XHRcdFx0XHRcdFx0XHRlZGl0c3VtbWFyeSArPSAn5LiA5pS75Ye75oCn6aG16Z2iJztcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBubyBhcnRpY2xlIG5hbWUgaW4gc3VtbWFyeSBmb3IgRzEwIGRlbGV0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdGVkaXRzdW1tYXJ5ICs9IGDpobXpnaJbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dYDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlZGl0c3VtbWFyeSArPSAn5b+r6YCf5Yig6Zmk5o+Q5ZCNJztcblx0XHRcdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEFwcGVuZFRleHQobm90aWZ5dGV4dCk7XG5cdFx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRFZGl0U3VtbWFyeShlZGl0c3VtbWFyeSk7XG5cdFx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5hcHBlbmQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIGFkZCB0aGlzIG5vbWluYXRpb24gdG8gdGhlIHVzZXIncyB1c2Vyc3BhY2UgbG9nLCBpZiB0aGUgdXNlciBoYXMgZW5hYmxlZCBpdFxuXHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5sb2dub21pbmF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy51c2VyLmFkZFRvTG9nKHBhcmFtcywgaW5pdGlhbENvbnRyaWIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgdGhpc3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKE1vcmViaXRzLnBhZ2VOYW1lTm9ybSk7XG5cdFx0XHRcdFx0dGhpc3BhZ2UubG9va3VwQ3JlYXRpb24oY2FsbGJhY2spO1xuXHRcdFx0XHRcdC8vIG9yLCBpZiBub3Qgbm90aWZ5aW5nLCBhZGQgdGhpcyBub21pbmF0aW9uIHRvIHRoZSB1c2VyJ3MgdXNlcnNwYWNlIGxvZyB3aXRob3V0IHRoZSBpbml0aWFsIGNvbnRyaWJ1dG9yJ3MgbmFtZVxuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5sb2dub21pbmF0aW9uKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2tzLnVzZXIuYWRkVG9Mb2cocGFyYW1zLCBudWxsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIG5vdGU6IHRoaXMgY29kZSBpcyBhbHNvIGludm9rZWQgZnJvbSB0d2lua2xlaW1hZ2Vcblx0XHRcdC8vIHRoZSBwYXJhbXMgdXNlZCBhcmU6XG5cdFx0XHQvLyAgIGZvciBDU0Q6IHBhcmFtcy52YWx1ZXMsIHBhcmFtcy5ub3JtYWxpemVkcyAgKG5vdGU6IG5vcm1hbGl6ZWRzIGlzIGFuIGFycmF5KVxuXHRcdFx0Ly8gICBmb3IgREk6IHBhcmFtcy5mcm9tREkgPSB0cnVlLCBwYXJhbXMudGVtcGxhdGVuYW1lLCBwYXJhbXMubm9ybWFsaXplZCAgKG5vdGU6IG5vcm1hbGl6ZWQgaXMgYSBzdHJpbmcpXG5cdFx0XHRhZGRUb0xvZzogKHBhcmFtcywgaW5pdGlhbENvbnRyaWIpID0+IHtcblx0XHRcdFx0Y29uc3QgdXNsID0gbmV3IE1vcmViaXRzLnVzZXJzcGFjZUxvZ2dlcihUd2lua2xlLmdldFByZWYoJ3NwZWVkeUxvZ1BhZ2VOYW1lJykpO1xuXHRcdFx0XHR1c2wuaW5pdGlhbFRleHQgPSBg6L+Z5piv6K+l55So5oi35L2/55SoW1tIOlRXfFR3aW5rbGVdXeeahOmAn+WIoOaooeWdl+WBmuWHuueahFtbTElCOkNTRHzlv6vpgJ/liKDpmaRdXeaPkOWQjeWIl+ihqOOAglxcblxcbuiLpeaCqOS4jeWGjeaDs+S/neeVmeatpOaXpeW/l++8jOivt+WcqFtbJHtUd2lua2xlLmdldFByZWYoXG5cdFx0XHRcdFx0J2NvbmZpZ1BhZ2UnXG5cdFx0XHRcdCl9fOWPguaVsOiuvue9rl1d5Lit5YWz5o6J77yM5bm25L2/55SoW1tMSUI6Q1NEI08xfENTRCBPMV1d5o+Q5Lqk5b+r6YCf5Yig6Zmk44CCJHtcblx0XHRcdFx0XHRNb3JlYml0cy51c2VySXNTeXNvcCA/ICdcXG5cXG7mraTml6Xlv5flubbkuI3orrDlvZXnlKhUd2lua2xl55u05o6l5omn6KGM55qE5Yig6Zmk44CCJyA6ICcnXG5cdFx0XHRcdH1gO1xuXHRcdFx0XHRsZXQgYXBwZW5kVGV4dCA9IGAjIFtbOiR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1d77yaYDtcblx0XHRcdFx0aWYgKHBhcmFtcy5mcm9tREkpIHtcblx0XHRcdFx0XHRhcHBlbmRUZXh0ICs9IGDlm77niYhbW0xJQjpDU0QjJHtwYXJhbXMubm9ybWFsaXplZC50b1VwcGVyQ2FzZSgpfXxDU0QgJHtwYXJhbXMubm9ybWFsaXplZC50b1VwcGVyQ2FzZSgpfV1d77yIe3t0bHwke1xuXHRcdFx0XHRcdFx0cGFyYW1zLnRlbXBsYXRlbmFtZVxuXHRcdFx0XHRcdH19fe+8iWA7XG5cdFx0XHRcdH0gZWxzZSBpZiAocGFyYW1zLm5vcm1hbGl6ZWRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRhcHBlbmRUZXh0ICs9ICflpJrkuKrnkIbnlLHvvIgnO1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgbm9ybSBvZiBwYXJhbXMubm9ybWFsaXplZHMpIHtcblx0XHRcdFx0XHRcdGFwcGVuZFRleHQgKz0gYFtbTElCOkNTRCMke25vcm0udG9VcHBlckNhc2UoKX18JHtub3JtLnRvVXBwZXJDYXNlKCl9XV3jgIFgO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhcHBlbmRUZXh0ID0gYXBwZW5kVGV4dC5zbGljZSgwLCBNYXRoLm1heCgwLCBhcHBlbmRUZXh0Lmxlbmd0aCAtIDEpKTsgLy8gcmVtb3ZlIHRyYWlsaW5nIGNvbW1hXG5cdFx0XHRcdFx0YXBwZW5kVGV4dCArPSAn77yJJztcblx0XHRcdFx0fSBlbHNlIGlmIChwYXJhbXMubm9ybWFsaXplZHNbMF0gPT09ICdkYicpIHtcblx0XHRcdFx0XHRhcHBlbmRUZXh0ICs9ICfoh6rlrprkuYnnkIbnlLEnO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFwcGVuZFRleHQgKz0gYFtbTElCOkNTRCMke3BhcmFtcy5ub3JtYWxpemVkc1swXS50b1VwcGVyQ2FzZSgpfXxDU0QgJHtwYXJhbXMubm9ybWFsaXplZHNbMF0udG9VcHBlckNhc2UoKX1dXWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBhcmFtcy5yZXF1ZXN0c2FsdCkge1xuXHRcdFx0XHRcdGFwcGVuZFRleHQgKz0gd2luZG93LndnVUxTKCfvvJvor7fmsYLnmb3nurjkv53miqQnLCAn77yb6KuL5rGC55m957SZ5L+d6K23Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGluaXRpYWxDb250cmliKSB7XG5cdFx0XHRcdFx0YXBwZW5kVGV4dCArPSBg77yb6YCa55+le3t1c2VyfCR7aW5pdGlhbENvbnRyaWJ9fX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFwcGVuZFRleHQgKz0gJyB+ficuY29uY2F0KCd+JywgJ35+XFxuJyk7XG5cdFx0XHRcdHVzbC5jaGFuZ2VUYWdzID0gVHdpbmtsZS5jaGFuZ2VUYWdzO1xuXHRcdFx0XHR1c2wubG9nKFxuXHRcdFx0XHRcdGFwcGVuZFRleHQsXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCforrDlvZXlr7lbWycsICfoqJjpjITlsI1bWycpICtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ11d55qE5b+r6YCf5Yig6Zmk5o+Q5ZCNJywgJ11d55qE5b+r6YCf5Yiq6Zmk5o+Q5ZCNJylcblx0XHRcdFx0KTtcblx0XHRcdH0sXG5cdFx0fSxcblx0fTtcblx0Ly8gdmFsaWRhdGUgc3ViZ3JvdXBzIGluIHRoZSBmb3JtIHBhc3NlZCBpbnRvIHRoZSBzcGVlZHkgZGVsZXRpb24gdGFnXG5cdFR3aW5rbGUuc3BlZWR5LmdldFBhcmFtZXRlcnMgPSAoZm9ybSwgdmFsdWVzKSA9PiB7XG5cdFx0bGV0IHBhcmFtZXRlcnMgPSBbXTtcblx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuXHRcdFx0Y29uc3QgY3VycmVudFBhcmFtcyA9IFtdO1xuXHRcdFx0bGV0IHJlZGltYWdlO1xuXHRcdFx0c3dpdGNoICh2YWx1ZSkge1xuXHRcdFx0XHRjYXNlICdyZWFzb24nOlxuXHRcdFx0XHRcdGlmIChmb3JtWydjc2QucmVhc29uXzEnXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGJyYXRpb25hbGUgPSBmb3JtWydjc2QucmVhc29uXzEnXS52YWx1ZTtcblx0XHRcdFx0XHRcdGlmICghZGJyYXRpb25hbGUgfHwgIWRicmF0aW9uYWxlLnRyaW0oKSkge1xuXHRcdFx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfoh6rlrprkuYnnkIbnlLHvvJror7fmjIflrprnkIbnlLHjgIInLCAn6Ieq6KiC55CG55Sx77ya6KuL5oyH5a6a55CG55Sx44CCJyksIHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZXNwZWVkeScsXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y3VycmVudFBhcmFtc1snMSddID0gZGJyYXRpb25hbGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdhMic6XG5cdFx0XHRcdFx0aWYgKGZvcm1bJ2NzZC5hMl9wYWdlbmFtZSddKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdGhlcnBhZ2UgPSBmb3JtWydjc2QuYTJfcGFnZW5hbWUnXS52YWx1ZTtcblx0XHRcdFx0XHRcdGlmICghb3RoZXJwYWdlIHx8ICFvdGhlcnBhZ2UudHJpbSgpKSB7XG5cdFx0XHRcdFx0XHRcdG13Lm5vdGlmeShcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ0NTRCBBMu+8muivt+aPkOS+m+eOsOacieadoeebrueahOWQjeensOOAgicsICdDU0QgQTLvvJroq4vmj5Dkvpvnj77mnInmop3nm67nmoTlkI3nqLHjgIInKSxcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3BlZWR5Jyxcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFyYW1zLnBhZ2VuYW1lID0gb3RoZXJwYWdlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZzQnOlxuXHRcdFx0XHRcdGlmIChmb3JtWydjc2QuZzRfcGFnZW5hbWUnXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFnZW5hbWUgPSBmb3JtWydjc2QuZzRfcGFnZW5hbWUnXS52YWx1ZTtcblx0XHRcdFx0XHRcdGlmICghcGFnZW5hbWUgfHwgIXBhZ2VuYW1lLnRyaW0oKSkge1xuXHRcdFx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCdDU0QgRzTvvJror7fmj5DkvpvpobXpnaLlkI3np7DjgIInLCAnQ1NEIEc077ya6KuL5o+Q5L6b6aCB6Z2i5ZCN56ix44CCJyksIHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZXNwZWVkeScsXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y3VycmVudFBhcmFtcy5wYWdlbmFtZSA9IHBhZ2VuYW1lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZjInOlxuXHRcdFx0XHRcdGlmIChmb3JtWydjc2QuZjJfZmlsZW5hbWUnXSkge1xuXHRcdFx0XHRcdFx0cmVkaW1hZ2UgPSBmb3JtWydjc2QuZjJfZmlsZW5hbWUnXS52YWx1ZTtcblx0XHRcdFx0XHRcdGlmICghcmVkaW1hZ2UgfHwgIXJlZGltYWdlLnRyaW0oKSkge1xuXHRcdFx0XHRcdFx0XHRtdy5ub3RpZnkoXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCdDU0QgRjLvvJror7fmj5Dkvpvlj6bkuIDmlofku7bnmoTlkI3np7DjgIInLCAnQ1NEIEYy77ya6KuL5o+Q5L6b5Y+m5LiA5qqU5qGI55qE5ZCN56ix44CCJyksXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZXNwZWVkeScsXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y3VycmVudFBhcmFtcy5maWxlbmFtZSA9IHJlZGltYWdlLnJlcGxhY2UoXG5cdFx0XHRcdFx0XHRcdG5ldyBSZWdFeHAoYF5cXFxccyoke01vcmViaXRzLm5hbWVzcGFjZVJlZ2V4KDYpfTpgLCAnaScpLFxuXHRcdFx0XHRcdFx0XHQnJ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3IxJzpcblx0XHRcdFx0XHRpZiAoZm9ybVsnY3NkLnIxX3R5cGUnXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmVkaXJ0eXBlID0gZm9ybVsnY3NkLnIxX3R5cGUnXS52YWx1ZTtcblx0XHRcdFx0XHRcdGlmICghcmVkaXJ0eXBlKSB7XG5cdFx0XHRcdFx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ0NTRCBSMe+8muivt+mAieaLqemAgueUqOexu+Wei+OAgicsICdDU0QgUjHvvJroq4vpgbjmk4fpgannlKjpoZ7liKXjgIInKSwge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3BlZWR5Jyxcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFyYW1zWycxJ10gPSByZWRpcnR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyMic6XG5cdFx0XHRcdFx0aWYgKGZvcm1bJ2NzZC5yMl90eXBlJ10pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlZGlydHlwZSA9IGZvcm1bJ2NzZC5yMl90eXBlJ10udmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAoIXJlZGlydHlwZSkge1xuXHRcdFx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCdDU0QgUjLvvJror7fpgInmi6npgILnlKjnsbvlnovjgIInLCAnQ1NEIFIy77ya6KuL6YG45pOH6YGp55So6aGe5Yil44CCJyksIHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZXNwZWVkeScsXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y3VycmVudFBhcmFtc1snMSddID0gcmVkaXJ0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHBhcmFtZXRlcnMucHVzaChjdXJyZW50UGFyYW1zKTtcblx0XHR9XG5cdFx0cmV0dXJuIHBhcmFtZXRlcnM7XG5cdH07XG5cdC8vIEZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIHRhbGsgcGFnZSBub3RpZmljYXRpb24gdGVtcGxhdGUgcGFyYW1ldGVyc1xuXHRUd2lua2xlLnNwZWVkeS5nZXRVc2VyVGFsa1BhcmFtZXRlcnMgPSAobm9ybWFsaXplZCkgPT4ge1xuXHRcdGNvbnN0IHV0cGFyYW1zID0gW107XG5cdFx0c3dpdGNoIChub3JtYWxpemVkKSB7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIHV0cGFyYW1zO1xuXHR9O1xuXHRUd2lua2xlLnNwZWVkeS5yZXNvbHZlQ3NkVmFsdWVzID0gKGUpID0+IHtcblx0XHRjb25zdCB2YWx1ZXMgPSAoZS50YXJnZXQuZm9ybSA/PyBlLnRhcmdldCkuZ2V0Q2hlY2tlZCgnY3NkJyk7XG5cdFx0aWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+mAieaLqeS4gOS4queQhuaNru+8gScsICfoq4vpgbjmk4fkuIDlgIvnkIbmk5rvvIEnKSwge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3R3aW5rbGVzcGVlZHknLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbHVlcztcblx0fTtcblx0VHdpbmtsZS5zcGVlZHkuY2FsbGJhY2suZXZhbHVhdGVTeXNvcCA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0LmZvcm0gPz8gZS50YXJnZXQ7XG5cdFx0aWYgKGUudGFyZ2V0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZS50YXJnZXQudHlwZSA9PT0gJ3RleHQnIHx8IGUudGFyZ2V0LnR5cGUgPT09ICdzZWxlY3QnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHt0YWdfb25seX0gPSBmb3JtO1xuXHRcdGlmICh0YWdfb25seSAmJiB0YWdfb25seS5jaGVja2VkKSB7XG5cdFx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5ldmFsdWF0ZVVzZXIoZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHZhbHVlcyA9IFR3aW5rbGUuc3BlZWR5LnJlc29sdmVDc2RWYWx1ZXMoZSk7XG5cdFx0aWYgKCF2YWx1ZXMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgbm9ybWFsaXplZHMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuXHRcdFx0cmV0dXJuIFR3aW5rbGUuc3BlZWR5Lm5vcm1hbGl6ZUhhc2hbdmFsdWVdO1xuXHRcdH0pO1xuXHRcdC8vIGFuYWx5c2UgZWFjaCBjcml0ZXJpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gd2F0Y2ggdGhlIHBhZ2UsIHByb21wdCBmb3Igc3VtbWFyeSwgb3Igb3BlbiB1c2VyIHRhbGsgcGFnZVxuXHRcdGxldCB3YXRjaFBhZ2U7XG5cdFx0bGV0IHByb21wdEZvclN1bW1hcnk7XG5cdFx0Zm9yIChjb25zdCBub3JtIG9mIG5vcm1hbGl6ZWRzKSB7XG5cdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFNwZWVkeVBhZ2VzJykuaW5jbHVkZXMobm9ybSkpIHtcblx0XHRcdFx0d2F0Y2hQYWdlID0gVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFNwZWVkeUV4cGlyeScpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZigncHJvbXB0Rm9yU3BlZWR5RGVsZXRpb25TdW1tYXJ5JykuaW5jbHVkZXMobm9ybSkpIHtcblx0XHRcdFx0cHJvbXB0Rm9yU3VtbWFyeSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdHZhbHVlcyxcblx0XHRcdG5vcm1hbGl6ZWRzLFxuXHRcdFx0d2F0Y2g6IHdhdGNoUGFnZSxcblx0XHRcdGRlbGV0ZVRhbGtQYWdlOiBmb3JtLnRhbGtwYWdlICYmIGZvcm0udGFsa3BhZ2UuY2hlY2tlZCxcblx0XHRcdGRlbGV0ZVJlZGlyZWN0czogZm9ybS5yZWRpcmVjdHMuY2hlY2tlZCxcblx0XHRcdG9wZW5Vc2VyVGFsazogZm9ybS5vcGVudXNlcnRhbGsuY2hlY2tlZCxcblx0XHRcdHByb21wdEZvclN1bW1hcnksXG5cdFx0XHR0ZW1wbGF0ZVBhcmFtczogVHdpbmtsZS5zcGVlZHkuZ2V0UGFyYW1ldGVycyhmb3JtLCB2YWx1ZXMpLFxuXHRcdH07XG5cdFx0aWYgKCFwYXJhbXMudGVtcGxhdGVQYXJhbXMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRUd2lua2xlLnNwZWVkeS5jYWxsYmFja3Muc3lzb3AubWFpbihwYXJhbXMpO1xuXHR9O1xuXHRUd2lua2xlLnNwZWVkeS5jYWxsYmFjay5ldmFsdWF0ZVVzZXIgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IGZvcm0gPSBlLnRhcmdldC5mb3JtID8/IGUudGFyZ2V0O1xuXHRcdGlmIChlLnRhcmdldC50eXBlID09PSAnY2hlY2tib3gnIHx8IGUudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyB8fCBlLnRhcmdldC50eXBlID09PSAnc2VsZWN0Jykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB2YWx1ZXMgPSBUd2lua2xlLnNwZWVkeS5yZXNvbHZlQ3NkVmFsdWVzKGUpO1xuXHRcdGlmICghdmFsdWVzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIGNvbnN0IG11bHRpcGxlID0gZm9ybS5tdWx0aXBsZS5jaGVja2VkO1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWRzID0gW107XG5cdFx0Zm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcblx0XHRcdGNvbnN0IG5vcm0gPSBUd2lua2xlLnNwZWVkeS5ub3JtYWxpemVIYXNoW3ZhbHVlXTtcblx0XHRcdG5vcm1hbGl6ZWRzLnB1c2gobm9ybSk7XG5cdFx0fVxuXHRcdC8vIGFuYWx5c2UgZWFjaCBjcml0ZXJpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gd2F0Y2ggdGhlIHBhZ2Uvbm90aWZ5IHRoZSBjcmVhdG9yXG5cdFx0bGV0IHdhdGNoUGFnZSA9IGZhbHNlO1xuXHRcdGZvciAoY29uc3Qgbm9ybSBvZiBub3JtYWxpemVkcykge1xuXHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hTcGVlZHlQYWdlcycpLmluY2x1ZGVzKG5vcm0pKSB7XG5cdFx0XHRcdHdhdGNoUGFnZSA9IFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hTcGVlZHlFeHBpcnknKTtcblx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdGNvbnRpbnVlOyAvLyBicmVha1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBub3RpZnl1c2VyID0gZmFsc2U7XG5cdFx0aWYgKGZvcm0ubm90aWZ5LmNoZWNrZWQpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9ybSBvZiBub3JtYWxpemVkcykge1xuXHRcdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdub3RpZnlVc2VyT25TcGVlZHlEZWxldGlvbk5vbWluYXRpb24nKS5pbmNsdWRlcyhub3JtKSkge1xuXHRcdFx0XHRcdG5vdGlmeXVzZXIgPSB0cnVlO1xuXHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0XHRcdGNvbnRpbnVlOyAvLyBicmVha1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IGNzZGxvZyA9IGZhbHNlO1xuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2xvZ1NwZWVkeU5vbWluYXRpb25zJykpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9ybSBvZiBub3JtYWxpemVkcykge1xuXHRcdFx0XHRpZiAoIVR3aW5rbGUuZ2V0UHJlZignbm9Mb2dPblNwZWVkeU5vbWluYXRpb24nKS5pbmNsdWRlcyhub3JtKSkge1xuXHRcdFx0XHRcdGNzZGxvZyA9IHRydWU7XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdFx0Y29udGludWU7IC8vIGJyZWFrXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHR2YWx1ZXMsXG5cdFx0XHRub3JtYWxpemVkcyxcblx0XHRcdHdhdGNoOiB3YXRjaFBhZ2UsXG5cdFx0XHR1c2VydGFsazogbm90aWZ5dXNlcixcblx0XHRcdGxvZ25vbWluYXRpb246IGNzZGxvZyxcblx0XHRcdGJsYW5rOiBmb3JtLmJsYW5rLmNoZWNrZWQsXG5cdFx0XHRyZXF1ZXN0c2FsdDogZm9ybS5zYWx0aW5nLmNoZWNrZWQsXG5cdFx0XHR0ZW1wbGF0ZVBhcmFtczogVHdpbmtsZS5zcGVlZHkuZ2V0UGFyYW1ldGVycyhmb3JtLCB2YWx1ZXMpLFxuXHRcdH07XG5cdFx0aWYgKCFwYXJhbXMudGVtcGxhdGVQYXJhbXMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+agh+iusOWujOaIkCcsICfmqJnoqJjlrozmiJAnKTtcblx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0d2luZG93LndnVUxTKCfmoIforrDpobXpnaInLCAn5qiZ6KiY6aCB6Z2iJylcblx0XHQpO1xuXHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHR5c2FyY2hpdmVzX3BhZ2UubG9hZChUd2lua2xlLnNwZWVkeS5jYWxsYmFja3MudXNlci5tYWluKTtcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5zcGVlZHksICdzcGVlZHknKTtcbn0pKGpRdWVyeSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWNvcHl2aW8uanMgKi9cbihmdW5jdGlvbiB0d2lua2xlY29weXZpbygpIHtcblx0LyoqXG5cdCAqIHR3aW5rbGVjb3B5dmlvLmpzOiBDb3B5dmlvIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246XHRUYWIgKFwiQ29weXZpb1wiKVxuXHQgKiBBY3RpdmUgb246IEV4aXN0aW5nLCBub24tc3BlY2lhbCBwYWdlcywgZXhjZXB0IGZvciBmaWxlIHBhZ2VzXG5cdCAqIHdpdGggbm8gbG9jYWwgZmlsZSB3aGljaCBhcmUgbm90IHJlZGlyZWN0c1xuXHQgKiBDb25maWcgZGlyZWN0aXZlcyBpbjogIFR3aW5rbGVDb25maWdcblx0ICovXG5cdFR3aW5rbGUuY29weXZpbyA9ICgpID0+IHtcblx0XHQvLyBEaXNhYmxlIG9uOlxuXHRcdC8vICogc3BlY2lhbCBwYWdlc1xuXHRcdC8vICogbm9uLWV4aXN0ZW50IHBhZ2VzXG5cdFx0Ly8gKiBub24tbG9jYWwgZmlsZXMsIHdoZXRoZXIgdGhlcmUgaXMgYSBsb2NhbCBwYWdlIG9yIG5vdCAodW5uZWVkZWQgbG9jYWwgcGFnZXMgb2Ygbm9uLWxvY2FsIGZpbGVzIGFyZSBlbGlnaWJsZSBmb3IgQ1NEIEYyKVxuXHRcdC8vICogZmlsZSBwYWdlcyB3aXRob3V0IGFjdHVhbCBmaWxlcyAodGhlc2UgYXJlIGVsaWdpYmxlIGZvciBDU0QgRzgpXG5cdFx0aWYgKFxuXHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA8IDAgfHxcblx0XHRcdCFtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpIHx8XG5cdFx0XHQobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gNiAmJlxuXHRcdFx0XHQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LXNoYXJlZHVwbG9hZCcpIHx8XG5cdFx0XHRcdFx0KCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctaW1hZ2VwYWdlLXNlY3Rpb24tZmlsZWhpc3RvcnknKSAmJiAhTW9yZWJpdHMuaXNQYWdlUmVkaXJlY3QoKSkpKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0VHdpbmtsZS5jb3B5dmlvLmNhbGxiYWNrLFxuXHRcdFx0d2luZG93LndnVUxTKCfkvrXmnYMnLCAn5L615qyKJyksXG5cdFx0XHQndHctY29weXZpbycsXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+aPkOaKpeS+teadg+mhtemdoicsICfmj5DloLHkvrXmrIrpoIHpnaInKSxcblx0XHRcdCcnXG5cdFx0KTtcblx0fTtcblx0VHdpbmtsZS5jb3B5dmlvLmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjAwLCAzNTApO1xuXHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+aPkOaKpeS+teadg+mhtemdoicsICfmj5DloLHkvrXmrIrpoIHpnaInKSk7XG5cdFx0V2luZG93LnNldFNjcmlwdE5hbWUoJ1R3aW5rbGUnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ+S+teadg+iuvue9ricsICfkvrXmrIroqK3lrponKSwgJ0g6VFcvUFJFRiNjb3B5dmlvJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2NvcHl2aW8nKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLmNvcHl2aW8uY2FsbGJhY2suZXZhbHVhdGUpO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkvrXmnYPmnaXmupDvvJonLCAn5L615qyK5L6G5rqQ77yaJyksXG5cdFx0XHRuYW1lOiAnc291cmNlJyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCdDU0QgRzQ6IOabvue7j+agueaNruS+teadg+WuoeaguOWIoOmZpOWQjuWPiOmHjeaWsOWIm+W7uueahOWGheWuuScsXG5cdFx0XHRcdFx0XHQnQ1NEIEc0OiDmm77ntpPmoLnmk5rkvrXmrIrlr6nmoLjliKrpmaTlvozlj4jph43mlrDlu7rnq4vnmoTlhaflrrknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR2YWx1ZTogJ2c0Jyxcblx0XHRcdFx0XHRuYW1lOiAnZzQnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5ZCM5pe25LulRzTlh4bliJnmj5DmiqXlv6vpgJ/liKDpmaQnLCAn5ZCM5pmC5LulRzTmupbliYfmj5DloLHlv6vpgJ/liKrpmaQnKSxcblx0XHRcdFx0XHRzdWJncm91cDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnZzRfcGFnZW5hbWUnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliY3mrKHliKDpmaTnmoTpobXpnaLlkI3np7AnLCAn5YmN5qyh5Yiq6Zmk55qE6aCB6Z2i5ZCN56ixJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6YCJ5aGr77yM6Iul5YmN5qyh5Yig6Zmk55qE6aG16Z2i5ZCN56ew5LiN5ZCM77yM6K+35o+Q5L6bJyxcblx0XHRcdFx0XHRcdFx0XHQn6YG45aGr77yM6Iul5YmN5qyh5Yiq6Zmk55qE6aCB6Z2i5ZCN56ix5LiN5ZCM77yM6KuL5o+Q5L6bJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCa55+l6aG16Z2i5Yib5bu66ICFJywgJ+mAmuefpemggemdouW7uueri+iAhScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm90aWZ5Jyxcblx0XHRcdFx0XHRuYW1lOiAnbm90aWZ5Jyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5Zyo6aG16Z2i5Yib5bu66ICF6K6o6K666aG15LiK5pS+572u5LiA6YCa55+l5qih5p2/44CCJyxcblx0XHRcdFx0XHRcdCflnKjpoIHpnaLlu7rnq4vogIXoqI7oq5bpoIHkuIrmlL7nva7kuIDpgJrnn6XmqKHmnb/jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0fTtcblx0VHdpbmtsZS5jb3B5dmlvLmNhbGxiYWNrcyA9IHtcblx0XHR0cnlUYWdnaW5nOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Ly8g5YWI5bCd6K+V5qCH6K6w6aG16Z2i77yM6Iul5Y+R546w5bey57uP5qCH6K6w5YiZ5YGc5q2i5o+Q5oqlXG5cdFx0XHRjb25zdCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0aWYgKHRleHQuaW5jbHVkZXMoJ3t7Q29weXZpb3wnKSkge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuZXJyb3IoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfplJnor68nLCAn6Yyv6KqkJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+mhtemdouW3sue7j+agh+iusOS+teadg++8jOivt+S6uuW3peehruiupOaYr+WQpuW3sue7j+aPkOaKpeOAgicsXG5cdFx0XHRcdFx0XHQn6aCB6Z2i5bey57aT5qiZ6KiY5L615qyK77yM6KuL5Lq65bel56K66KqN5piv5ZCm5bey57aT5o+Q5aCx44CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFR3aW5rbGUuY29weXZpby5jYWxsYmFja3MudGFnZ2luZ0FydGljbGUocGFnZW9iaik7XG5cdFx0XHRcdC8vIENvbnRyaWJ1dG9yIHNwZWNpZmljIGVkaXRzXG5cdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpKTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpKTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLmxvb2t1cENyZWF0aW9uKFR3aW5rbGUuY29weXZpby5jYWxsYmFja3MubWFpbik7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRtYWluOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Ly8gdGhpcyBpcyBjb21pbmcgaW4gZnJvbSBsb29rdXBDcmVhdGlvbi4uLiFcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRjb25zdCBpbml0aWFsQ29udHJpYiA9IHBhZ2VvYmouZ2V0Q3JlYXRvcigpO1xuXHRcdFx0Ly8gQWRkaW5nIGRpc2N1c3Npb25cblx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdHBhcmFtcy5sb2dwYWdlLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeS+teadg+iusOW9lemhuScsICfliqDlhaXkvrXmrIroqJjpjITpoIUnKVxuXHRcdFx0KTtcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5sb2FkKFR3aW5rbGUuY29weXZpby5jYWxsYmFja3MuY29weXZpb0xpc3QpO1xuXHRcdFx0Ly8gTm90aWZpY2F0aW9uIHRvIGZpcnN0IGNvbnRyaWJ1dG9yXG5cdFx0XHRpZiAocGFyYW1zLm5vdGlmeSkge1xuXHRcdFx0XHRjb25zdCB1c2VydGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdGBVc2VyIHRhbGs6JHtpbml0aWFsQ29udHJpYn1gLFxuXHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn6YCa55+l6aG16Z2i5Yib5bu66ICF77yIJywgJ+mAmuefpemggemdouW7uueri+iAhe+8iCcpICsgaW5pdGlhbENvbnRyaWJ977yJYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBub3RpZnl0ZXh0ID0gJ1xcbnt7Jy5jb25jYXQoJ3N1YnN0OicsIGBDb3B5dmlvTm90aWNlfCR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfX19YCk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRBcHBlbmRUZXh0KG5vdGlmeXRleHQpO1xuXHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfpgJrnn6XvvJrpobXpnaJbWycsICfpgJrnn6XvvJrpoIHpnaJbWycpICtcblx0XHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ11d55aR5Ly85L6154qv6JGX5L2c5p2DJywgJ11d55aR5Ly85L6154qv54mI5qyKJylcblx0XHRcdFx0KTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ2NvcHl2aW9XYXRjaFVzZXInKSk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5hcHBlbmQoKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHRhZ2dpbmdBcnRpY2xlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGNvbnN0IHJldmlzaW9uSWQgPVxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSB8fCBtdy5jb25maWcuZ2V0KCd3Z0RpZmZOZXdJZCcpIHx8IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpO1xuXHRcdFx0bGV0IHRhZyA9ICd7eycuY29uY2F0KFxuXHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0YENvcHl2aW8vYXV0b3x1cmw9JHtwYXJhbXMuc291cmNlXG5cdFx0XHRcdFx0LnJlcGxhY2UoL2h0dHAvZywgJyYjMTA0O3R0cCcpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL1xcbisvZywgJ1xcbicpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL15cXHMqKFteKl0pL2dtLCAnKiAkMScpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL15cXCogJC9tLCAnJyl9fE9sZFJldmlzaW9uPSR7cmV2aXNpb25JZH19fWBcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0Y29uc3Qgb2xkY3NkID0gdGV4dC5tYXRjaCgvXFx7XFx7XFxzKihkYigtXFx3Kik/fGR8ZGVsZXRlKVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfS9pKTtcblx0XHRcdGlmIChcblx0XHRcdFx0b2xkY3NkICYmXG5cdFx0XHRcdGNvbmZpcm0oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOmhtemdouS4iuaJvuWIsOW/q+mAn+WIoOmZpOaooeadv++8jOimgeS/neeVmeWQl++8n1xcblxcbuW9k+mhtemdouWQjOaXtuS+teeKr+iRl+S9nOadg+WPiOespuWQiOW/q+mAn+WIoOmZpOagh+WHhuaXtu+8jOW6lOivpeS8mOWFiOi1sOW/q+mAn+WIoOmZpOeoi+W6j+OAglxcbuWNleWHu+KAnOehruiupOKAneS7peS/neeVmeW/q+mAn+WIoOmZpOaooeadv++8jOiLpeaCqOiupOS4uuW/q+mAn+WIoOmZpOeQhueUseS4jeWQiO+8jOWNleWHu+KAnOWPlua2iOKAneS7peenu+mZpOW/q+mAn+WIoOmZpOaooeadv+OAgicsXG5cdFx0XHRcdFx0XHQn5Zyo6aCB6Z2i5LiK5om+5Yiw5b+r6YCf5Yiq6Zmk5qih5p2/77yM6KaB5L+d55WZ5ZeO77yfXFxuXFxu55W26aCB6Z2i5ZCM5pmC5L6154qv54mI5qyK5Y+I56ym5ZCI5b+r6YCf5Yiq6Zmk5qiZ5rqW5pmC77yM5oeJ6Kmy5YSq5YWI6LWw5b+r6YCf5Yiq6Zmk56iL5bqP44CCXFxu6bue5pOK44CM56K66KqN44CN5Lul5L+d55WZ5b+r6YCf5Yiq6Zmk5qih5p2/77yM6Iul5oKo6KqN54K65b+r6YCf5Yiq6Zmk55CG55Sx5LiN5ZCI77yM6bue5pOK44CM5Y+W5raI44CN5Lul56e76Zmk5b+r6YCf5Yiq6Zmk5qih5p2/44CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRhZyA9IGAke29sZGNzZFswXX1cXG4ke3RhZ31gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy5nNCkge1xuXHRcdFx0XHRsZXQgc3BlZWR5VGFnID0gJ3t7ZGVsZXRlJztcblx0XHRcdFx0c3BlZWR5VGFnICs9ICd8ZzQnO1xuXHRcdFx0XHRpZiAocGFyYW1zLmc0X3BhZ2VuYW1lKSB7XG5cdFx0XHRcdFx0c3BlZWR5VGFnICs9IGB8JHtwYXJhbXMuZzRfcGFnZW5hbWV9fGMxPVtbU3BlY2lhbDpVbmRlbGV0ZS8ke3BhcmFtcy5nNF9wYWdlbmFtZX1dXWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3BlZWR5VGFnICs9IGB8YzE9W1tTcGVjaWFsOlVuZGVsZXRlLyR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfV1dYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRzcGVlZHlUYWcgKz0gJ319Jztcblx0XHRcdFx0dGFnID0gYCR7c3BlZWR5VGFnfVxcbiR7dGFnfWA7XG5cdFx0XHR9XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRhZyk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHdpbmRvdy53Z1VMUygn5q2k6aG16Z2i55aR5Ly85L6154qv6JGX5L2c5p2DJywgJ+atpOmggemdoueWkeS8vOS+teeKr+eJiOasiicpKTtcblx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCdjb3B5dmlvV2F0Y2hQYWdlJykpO1xuXHRcdFx0Ly8gcGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRwYWdlb2JqLnNhdmUoKTtcblx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ21hcmtDb3B5dmlvUGFnZXNBc1BhdHJvbGxlZCcpKSB7XG5cdFx0XHRcdHBhZ2VvYmoucGF0cm9sKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjb3B5dmlvTGlzdDogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRsZXQgb3V0cHV0ID0gJyc7XG5cdFx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdGNvbnN0IGRhdGVIZWFkZXJSZWdleCA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdGBePT0rXFxcXHMqJHtkYXRlLmdldFVUQ01vbnRoKCkgKyAxfeaciCR7ZGF0ZS5nZXRVVENEYXRlKCl95pelXFxcXHMqPT0rYCxcblx0XHRcdFx0J21nJ1xuXHRcdFx0KTtcblx0XHRcdGlmICghZGF0ZUhlYWRlclJlZ2V4LmV4ZWModGV4dCkpIHtcblx0XHRcdFx0b3V0cHV0ID0gYFxcblxcbj09JHtkYXRlLmdldFVUQ01vbnRoKCkgKyAxfeaciCR7ZGF0ZS5nZXRVVENEYXRlKCl95pelPT1gO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9ICdcXG57eycuY29uY2F0KCdzdWJzdDonLCBgQ29weXZpb1ZGRFJlY29yZHwke213LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKX19fWApO1xuXHRcdFx0cGFnZW9iai5zZXRBcHBlbmRUZXh0KG91dHB1dCk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KGDliqDlhaVbWyR7bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpfV1dYCk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5hcHBlbmQoKTtcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLmNvcHl2aW8uY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZS50YXJnZXQpO1xuXHRcdGlmICghcGFyYW1zLnNvdXJjZS50cmltKCkpIHtcblx0XHRcdG13Lm5vdGlmeSh3aW5kb3cud2dVTFMoJ+ivt+aMh+WumuS+teadg+adpea6kCcsICfoq4vmjIflrprkvrXmrIrkvobmupAnKSwge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3R3aW5rbGVjb3B5dmlvJyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGUudGFyZ2V0KTtcblx0XHRwYXJhbXMubG9ncGFnZSA9ICdMSUJfdGFsazrkvrXmnYPmj5DmiqUnO1xuXHRcdE1vcmViaXRzLndpa2kuYWRkQ2hlY2twb2ludCgpO1xuXHRcdC8vIFVwZGF0aW5nIGRhdGEgZm9yIHRoZSBhY3Rpb24gY29tcGxldGVkIGV2ZW50XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0J+aPkOaKpeWujOaIkO+8jOWwhuWcqOWHoOenkuWGheWIt+aWsOmhtemdoicsXG5cdFx0XHQn5o+Q5aCx5a6M5oiQ77yM5bCH5Zyo5bm+56eS5YWn6YeN5paw5pW055CG6aCB6Z2iJ1xuXHRcdCk7XG5cdFx0Ly8gVGFnZ2luZyBmaWxlXG5cdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg5YWl5L615p2D5qih5p2/5Yiw6aG16Z2iJywgJ+WKoOWFpeS+teasiuaooeadv+WIsOmggemdoicpXG5cdFx0KTtcblx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS5jb3B5dmlvLmNhbGxiYWNrcy50cnlUYWdnaW5nKTtcblx0XHRNb3JlYml0cy53aWtpLnJlbW92ZUNoZWNrcG9pbnQoKTtcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5jb3B5dmlvLCAnY29weXZpbycpO1xufSkoKTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuLyohIFR3aW5rbGUuanMgLSB0d2lua2xleGZkLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZXhmZCgpIHtcblx0LyoqXG5cdCAqIHR3aW5rbGV4ZmQuanM6IFhGRCBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiWEZEXCIpXG5cdCAqIEFjdGl2ZSBvbjogRXhpc3RpbmcsIG5vbi1zcGVjaWFsIHBhZ2VzLFxuXHQgKiBleGNlcHQgZm9yIGZpbGUgcGFnZXMgd2l0aCBubyBsb2NhbCBmaWxlXG5cdCAqIHdoaWNoIGFyZSBub3QgcmVkaXJlY3RzXG5cdCAqL1xuXHRUd2lua2xlLnhmZCA9ICgpID0+IHtcblx0XHQvLyBEaXNhYmxlIG9uOlxuXHRcdC8vICogc3BlY2lhbCBwYWdlc1xuXHRcdC8vICogbm9uLWV4aXN0ZW50IHBhZ2VzXG5cdFx0Ly8gKiBub24tbG9jYWwgZmlsZXMsIHdoZXRoZXIgdGhlcmUgaXMgYSBsb2NhbCBwYWdlIG9yIG5vdCAodW5uZWVkZWQgbG9jYWwgcGFnZXMgb2YgZmlsZXMgb24gU2hhcmUgYXJlIGVsaWdpYmxlIGZvciBDU0QgRjIpXG5cdFx0Ly8gKiBmaWxlIHBhZ2VzIHdpdGhvdXQgYWN0dWFsIGZpbGVzXG5cdFx0aWYgKFxuXHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA8IDAgfHxcblx0XHRcdCFtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpIHx8XG5cdFx0XHQobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gNiAmJlxuXHRcdFx0XHQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LXNoYXJlZHVwbG9hZCcpIHx8XG5cdFx0XHRcdFx0KCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctaW1hZ2VwYWdlLXNlY3Rpb24tZmlsZWhpc3RvcnknKSAmJiAhTW9yZWJpdHMuaXNQYWdlUmVkaXJlY3QoKSkpKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0VHdpbmtsZS54ZmQuY2FsbGJhY2ssXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+aPkOWIoCcsICfmj5DliKonKSxcblx0XHRcdCd0dy14ZmQnLFxuXHRcdFx0d2luZG93LndnVUxTKCfmj5DkuqTliKDpmaTorqjorronLCAn5o+Q5Lqk5Yiq6Zmk6KiO6KuWJylcblx0XHQpO1xuXHR9O1xuXHRUd2lua2xlLnhmZC5jdXJyZW50UmF0aW9uYWxlID0gbnVsbDtcblx0Ly8gZXJyb3IgY2FsbGJhY2sgb24gTW9yZWJpdHMuc3RhdHVzLm9iamVjdFxuXHRUd2lua2xlLnhmZC5wcmludFJhdGlvbmFsZSA9ICgpID0+IHtcblx0XHRpZiAoVHdpbmtsZS54ZmQuY3VycmVudFJhdGlvbmFsZSkge1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLnByaW50VXNlclRleHQoXG5cdFx0XHRcdFR3aW5rbGUueGZkLmN1cnJlbnRSYXRpb25hbGUsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5oKo55qE55CG55Sx5bey5Zyo5LiL5pa55o+Q5L6b77yM6Iul5oKo5oOz6YeN5paw5o+Q5Lqk77yM6K+35bCG5YW25aSN5Yi25Yiw5LiA5paw56qX5Y+j5Lit77yaJyxcblx0XHRcdFx0XHQn5oKo55qE55CG55Sx5bey5Zyo5LiL5pa55o+Q5L6b77yM6Iul5oKo5oOz6YeN5paw5o+Q5Lqk77yM6KuL5bCH5YW26KSH6KO95Yiw5LiA5paw6KaW56qX5Lit77yaJ1xuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdFx0Ly8gb25seSBuZWVkIHRvIHByaW50IHRoZSByYXRpb25hbGUgb25jZVxuXHRcdFx0VHdpbmtsZS54ZmQuY3VycmVudFJhdGlvbmFsZSA9IG51bGw7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLnhmZC5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgMzUwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmj5DkuqTlrZjlup/orqjorronLCAn5o+Q5Lqk5a2Y5bui6KiO6KuWJykpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCfmj5DliKDorr7nva4nLCAn5o+Q5Yiq6Kit5a6aJyksICdIOlRXL1BSRUYjeGZkJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI3hmZCcpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUueGZkLmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRjb25zdCBjYXRlZ29yaWVzID0gZm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRuYW1lOiAnY2F0ZWdvcnknLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5o+Q5Lqk57G75Z6L77yaJywgJ+aPkOS6pOmhnuWIpe+8micpLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUueGZkLmNhbGxiYWNrLmNoYW5nZV9jYXRlZ29yeSxcblx0XHR9KTtcblx0XHRjYXRlZ29yaWVzLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mhtemdouWtmOW6n+iuqOiuuicsICfpoIHpnaLlrZjlu6LoqI7oq5YnKSxcblx0XHRcdHNlbGVjdGVkOiBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAwLFxuXHRcdFx0dmFsdWU6ICdhZmQnLFxuXHRcdH0pO1xuXHRcdGNhdGVnb3JpZXMuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5paH5Lu25a2Y5bqf6K6o6K66JywgJ+aqlOahiOWtmOW7ouiojuirlicpLFxuXHRcdFx0c2VsZWN0ZWQ6IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDYsXG5cdFx0XHR2YWx1ZTogJ2ZmZCcsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WmguWPr+iDve+8jOmAmuefpemhtemdouWIm+W7uuiAhScsICflpoLlj6/og73vvIzpgJrnn6XpoIHpnaLlu7rnq4vogIUnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0bmFtZTogJ25vdGlmeScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOmhtemdouWIm+W7uuiAheiuqOiuuumhteS4iuaUvue9ruS4gOmAmuefpeaooeadv+OAgicsXG5cdFx0XHRcdFx0XHQn5Zyo6aCB6Z2i5bu656uL6ICF6KiO6KuW6aCB5LiK5pS+572u5LiA6YCa55+l5qih5p2/44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdGxhYmVsOiAn5bel5L2c5Yy6Jyxcblx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0V2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdC8vIFdlIG11c3QgaW5pdCB0aGUgY29udHJvbHNcblx0XHRjb25zdCBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRyZXN1bHQuY2F0ZWdvcnkuZGlzcGF0Y2hFdmVudChldnQpO1xuXHR9O1xuXHRUd2lua2xlLnhmZC5jYWxsYmFjay5jaGFuZ2VfY2F0ZWdvcnkgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHt2YWx1ZX0gPSBlLnRhcmdldDtcblx0XHRjb25zdCB7Zm9ybX0gPSBlLnRhcmdldDtcblx0XHRjb25zdCBbb2xkX2FyZWFdID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICd3b3JrX2FyZWEnKTtcblx0XHRsZXQgd29ya19hcmVhID0gbnVsbDtcblx0XHRjb25zdCBvbGRyZWFzb250ZXh0Ym94ID0gZm9ybS5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuXHRcdGxldCBvbGRyZWFzb24gPSBvbGRyZWFzb250ZXh0Ym94ID8gb2xkcmVhc29udGV4dGJveC52YWx1ZSA6ICcnO1xuXHRcdGNvbnN0IGFwcGVuZFJlYXNvbkJveCA9ICh4ZmRfY2F0KSA9PiB7XG5cdFx0XHRzd2l0Y2ggKHhmZF9jYXQpIHtcblx0XHRcdFx0Y2FzZSAnZndkY3NkJzpcblx0XHRcdFx0XHRvbGRyZWFzb24gPSBkZWNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlbGV0ZS1yZWFzb24nKS50ZXh0Q29udGVudCkucmVwbGFjZShcblx0XHRcdFx0XHRcdC9cXCsvZyxcblx0XHRcdFx0XHRcdCcgJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2ZhbWUnOlxuXHRcdFx0XHRcdG9sZHJlYXNvbiA9IFR3aW5rbGUuZ2V0UHJlZignYWZkRmFtZURlZmF1bHRSZWFzb24nKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnc3Vic3R1Yic6XG5cdFx0XHRcdFx0b2xkcmVhc29uID0gVHdpbmtsZS5nZXRQcmVmKCdhZmRTdWJzdHViRGVmYXVsdFJlYXNvbicpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdG5hbWU6ICd4ZmRyZWFzb24nLFxuXHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmj5DliKDnkIbnlLHvvJonLCAn5o+Q5Yiq55CG55Sx77yaJyksXG5cdFx0XHRcdHZhbHVlOiBvbGRyZWFzb24sXG5cdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5oKo5Y+v5Lul5L2/55Sod2lraXRleHTvvIxUd2lua2xl5bCG6Ieq5Yqo5Li65oKo5Yqg5YWl562+5ZCN44CC6Iul5oKo5L2/55So5om56YeP5o+Q5Yig5Yqf6IO977yM5a2Y5bqf6K6o6K666aG15Y+q5Lya5L2/55So56ys5LiA5qyh5o+Q5Lqk55qE55CG55Sx77yM5L2G5LmL5ZCO5oKo5LuN6ZyA5o+Q5L6b5Lul55So5LqO5Yig6Zmk6YCa5ZGK5qih5p2/55qE5Y+C5pWw44CCJyxcblx0XHRcdFx0XHQn5oKo5Y+v5Lul5L2/55Sod2lraXRleHTvvIxUd2lua2xl5bCH6Ieq5YuV54K65oKo5Yqg5YWl57C95ZCN44CC6Iul5oKo5L2/55So5om55qyh5o+Q5Yiq5Yqf6IO977yM5a2Y5bui6KiO6KuW6aCB5Y+q5pyD5L2/55So56ys5LiA5qyh5o+Q5Lqk55qE55CG55Sx77yM5L2G5LmL5b6M5oKo5LuN6ZyA5o+Q5L6b5Lul55So5pa85Yiq6Zmk6YCa5ZGK5qih5p2/55qE5Y+D5pW444CCJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfmraTlgLzkuqbmmL7npLrkuo7pobXpnaLnmoTliKDpmaTpgJrlkYrmqKHmnb/lhoXvvIzmlYXliqHlv4Xmj5DkvpvmraTlgLzvvIzpgb/lhY3kvb/nlKjigJzlkIzkuIrigJ3nrYnnlKjor63jgIInLFxuXHRcdFx0XHRcdCfmraTlgLzkuqbpoa/npLrmlrzpoIHpnaLnmoTliKrpmaTpgJrlkYrmqKHmnb/lhafvvIzmlYXli5nlv4Xmj5DkvpvmraTlgLzvvIzpgb/lhY3kvb/nlKjjgIzlkIzkuIrjgI3nrYnnlKjoqp7jgIInXG5cdFx0XHRcdCksXG5cdFx0XHR9KTtcblx0XHRcdC8vIFRPRE8gcG9zc2libGUgZnV0dXJlIFwicHJldmlld1wiIGxpbmsgaGVyZVxuXHRcdH07XG5cblx0XHRzd2l0Y2ggKHZhbHVlKSB7XG5cdFx0XHRjYXNlICdhZmQnOiB7XG5cdFx0XHRcdHdvcmtfYXJlYSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpobXpnaLlrZjlup/orqjorronLCAn6aCB6Z2i5a2Y5bui6KiO6KuWJyksXG5cdFx0XHRcdFx0bmFtZTogJ3dvcmtfYXJlYScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICfkvb/nlKgmbHQ7bm9pbmNsdWRlJmd0O+WMheijueaooeadvycsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnbm9pbmNsdWRlJyxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ25vaW5jbHVkZScsXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6XG5cdFx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMTAgJiZcblx0XHRcdFx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VDb250ZW50TW9kZWwnKSAhPT0gJ1NjcmlidW50bycsXG5cdFx0XHRcdFx0XHRcdC8vIFRlbXBsYXRlIG5hbWVzcGFjZVxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+S9v+WFtuS4jeS8muWcqOiiq+WMheWQq+aXtuWHuueOsOOAgicsICfkvb/lhbbkuI3mnIPlnKjooqvljIXlkKvmmYLlh7rnj77jgIInKSxcblx0XHRcdFx0XHRcdFx0ZGlzYWJsZWQ6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZUNvbnRlbnRNb2RlbCcpID09PSAnU2NyaWJ1bnRvJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IGFmZF9jYXRlZ29yeSA9IHdvcmtfYXJlYS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdG5hbWU6ICd4ZmRjYXQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAieaLqeaPkOWIoOexu+Wei++8micsICfpgbjmk4fmj5DliKrpoZ7liKXvvJonKSxcblx0XHRcdFx0XHRldmVudDogVHdpbmtsZS54ZmQuY2FsbGJhY2suY2hhbmdlX2FmZF9jYXRlZ29yeSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGxldCBhZmRfY2F0ID0gJ2RlbGV0ZSc7XG5cdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2FmZERlZmF1bHRDYXRlZ29yeScpID09PSAnc2FtZScpIHtcblx0XHRcdFx0XHRpZiAobG9jYWxTdG9yYWdlLlR3aW5rbGVfYWZkQ2F0ZWdvcnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0bG9jYWxTdG9yYWdlLlR3aW5rbGVfYWZkQ2F0ZWdvcnkgPSAnZGVsZXRlJztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YWZkX2NhdCA9IGxvY2FsU3RvcmFnZS5Ud2lua2xlX2FmZENhdGVnb3J5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRhZmRfY2F0ZWdvcnkuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKDpmaQnLCAn5Yiq6ZmkJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdkZWxldGUnLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiBhZmRfY2F0ID09PSAnZGVsZXRlJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFmZF9jYXRlZ29yeS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WQiOW5ticsICflkIjkvbUnKSxcblx0XHRcdFx0XHR2YWx1ZTogJ21lcmdlJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogYWZkX2NhdCA9PT0gJ21lcmdlJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ0Z3ZENzZFRvWGZkJykpIHtcblx0XHRcdFx0XHRhZmRfY2F0ZWdvcnkuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6L2s5Lqk6Ieq5b+r6YCf5Yig6Zmk5YCZ6YCJJywgJ+i9ieS6pOiHquW/q+mAn+WIqumZpOWAmemBuCcpLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdmd2Rjc2QnLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IGFmZF9jYXQgPT09ICdmd2Rjc2QnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFmZF9jYXRlZ29yeS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aJuemHj+WFs+azqOW6puaPkOWIoCcsICfmibnmrKHpl5zms6jluqbmj5DliKonKSxcblx0XHRcdFx0XHR2YWx1ZTogJ2ZhbWUnLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiBhZmRfY2F0ID09PSAnZmFtZScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhZmRfY2F0ZWdvcnkuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmibnph4/lsI/lsI/kvZzlk4Hmj5DliKAnLCAn5om55qyh5bCP5bCP5L2c5ZOB5o+Q5YiqJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdzdWJzdHViJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogYWZkX2NhdCA9PT0gJ3N1YnN0dWInLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YWZkX2NhdGVnb3J5LmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5om56YeP5YW25LuW5o+Q5YigJywgJ+aJueasoeWFtuS7luaPkOWIqicpLFxuXHRcdFx0XHRcdHZhbHVlOiAnYmF0Y2gnLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiBhZmRfY2F0ID09PSAnYmF0Y2gnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRuYW1lOiAnbWVyZ2VpbnRvJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflkIjlubbliLDvvJonLCAn5ZCI5L215Yiw77yaJyksXG5cdFx0XHRcdFx0aGlkZGVuOiB0cnVlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YXBwZW5kUmVhc29uQm94KGFmZF9jYXQpO1xuXHRcdFx0XHR3b3JrX2FyZWEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAndGV4dGFyZWEnLFxuXHRcdFx0XHRcdG5hbWU6ICdmd2Rjc2RyZWFzb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+i9rOS6pOeQhueUse+8micsICfovYnkuqTnkIbnlLHvvJonKSxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5oKo5Y+v5Lul5L2/55Sod2lraXRleHTvvIxUd2lua2xl5bCG6Ieq5Yqo5Li65oKo5Yqg5YWl562+5ZCN44CCJyxcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6Xkvb/nlKh3aWtpdGV4dO+8jFR3aW5rbGXlsIfoh6rli5XngrrmgqjliqDlhaXnsL3lkI3jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRoaWRkZW46IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3b3JrX2FyZWEgPSB3b3JrX2FyZWEucmVuZGVyKCk7XG5cdFx0XHRcdG9sZF9hcmVhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdvcmtfYXJlYSwgb2xkX2FyZWEpO1xuXHRcdFx0XHRjb25zdCBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblx0XHRcdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdGZvcm0ueGZkY2F0LmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdmZmQnOlxuXHRcdFx0XHR3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5paH5Lu25a2Y5bqf6K6o6K66JywgJ+aqlOahiOWtmOW7ouiojuirlicpLFxuXHRcdFx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YXBwZW5kUmVhc29uQm94KCdmZmQnKTtcblx0XHRcdFx0d29ya19hcmVhID0gd29ya19hcmVhLnJlbmRlcigpO1xuXHRcdFx0XHRvbGRfYXJlYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3b3JrX2FyZWEsIG9sZF9hcmVhKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR3b3JrX2FyZWEgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pyq5a6a5LmJJywgJ+acquWumue+qScpLFxuXHRcdFx0XHRcdG5hbWU6ICd3b3JrX2FyZWEnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d29ya19hcmVhID0gd29ya19hcmVhLnJlbmRlcigpO1xuXHRcdFx0XHRvbGRfYXJlYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3b3JrX2FyZWEsIG9sZF9hcmVhKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vIFJldHVybiB0byBjaGVja2VkIHN0YXRlIHdoZW4gc3dpdGNoaW5nXG5cdFx0Zm9ybS5ub3RpZnkuY2hlY2tlZCA9IHRydWU7XG5cdFx0Zm9ybS5ub3RpZnkuZGlzYWJsZWQgPSBmYWxzZTtcblx0fTtcblx0VHdpbmtsZS54ZmQuY2FsbGJhY2suY2hhbmdlX2FmZF9jYXRlZ29yeSA9IChlKSA9PiB7XG5cdFx0c3dpdGNoIChlLnRhcmdldC52YWx1ZSkge1xuXHRcdFx0Y2FzZSAnbWVyZ2UnOlxuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1lcmdlaW50by5wYXJlbnRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uZndkY3NkcmVhc29uLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubWVyZ2VpbnRvLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaW5uZXJIVE1MID0gd2luZG93LndnVUxTKCflkIjlubbliLDvvJonLCAn5ZCI5L215Yiw77yaJyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZndkY3NkJzpcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5tZXJnZWludG8ucGFyZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLmZ3ZGNzZHJlYXNvbi5wYXJlbnRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubWVyZ2VpbnRvLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaW5uZXJIVE1MID0gJ+aPkOS6pOS6uu+8mic7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ueGZkcmVhc29uLnZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KFxuXHRcdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWxldGUtcmVhc29uJykudGV4dENvbnRlbnRcblx0XHRcdFx0KS5yZXBsYWNlKC9cXCsvZywgJyAnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdmYW1lJzpcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5tZXJnZWludG8ucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICcnKTtcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5md2Rjc2RyZWFzb24ucGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICcnKTtcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS54ZmRyZWFzb24udmFsdWUgPSBUd2lua2xlLmdldFByZWYoJ2FmZEZhbWVEZWZhdWx0UmVhc29uJyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc3Vic3R1Yic6XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubWVyZ2VpbnRvLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uZndkY3NkcmVhc29uLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ueGZkcmVhc29uLnZhbHVlID0gVHdpbmtsZS5nZXRQcmVmKCdhZmRTdWJzdHViRGVmYXVsdFJlYXNvbicpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubWVyZ2VpbnRvLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0uZndkY3NkcmVhc29uLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0fVxuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2FmZERlZmF1bHRDYXRlZ29yeScpID09PSAnc2FtZScpIHtcblx0XHRcdGxvY2FsU3RvcmFnZS5Ud2lua2xlX2FmZENhdGVnb3J5ID0gZS50YXJnZXQudmFsdWU7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLnhmZC5jYWxsYmFja3MgPSB7XG5cdFx0YWZkOiB7XG5cdFx0XHRtYWluOiAodGFnZ2luZ19wYWdlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHRhZ2dpbmdfcGFnZS5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdFx0VHdpbmtsZS54ZmQuY2FsbGJhY2tzLmFmZC50YWdnaW5nQXJ0aWNsZSh0YWdnaW5nX3BhZ2UpO1xuXHRcdFx0XHQvLyBBZGRpbmcgZGlzY3Vzc2lvblxuXHRcdFx0XHRjb25zdCBkaXNjdXNzaW9uX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdHBhcmFtcy5sb2dwYWdlLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg5YWl6K6o6K665Yiw5b2T5pel5YiX6KGoJywgJ+WKoOWFpeiojuirluWIsOeVtuaXpeWIl+ihqCcpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGRpc2N1c3Npb25fcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0ZGlzY3Vzc2lvbl9wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHRkaXNjdXNzaW9uX3BhZ2UubG9hZChUd2lua2xlLnhmZC5jYWxsYmFja3MuYWZkLnRvZGF5c0xpc3QpO1xuXHRcdFx0XHQvLyBOb3RpZmljYXRpb24gdG8gZmlyc3QgY29udHJpYnV0b3Jcblx0XHRcdFx0aWYgKHBhcmFtcy5ub3RpZnkpIHtcblx0XHRcdFx0XHQvLyBEaXNhbGxvdyB3YXJuaW5nIHlvdXJzZWxmXG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5jcmVhdG9yID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ+mAmuefpemhtemdouWIm+W7uuiAhe+8iCcsICfpgJrnn6XpoIHpnaLlu7rnq4vogIXvvIgnKSArIHBhcmFtcy5jcmVhdG9yfe+8iWAsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5oKo5Yib5bu65LqG6K+l6aG177yM6Lez6L+H6YCa55+lJywgJ+aCqOW7uueri+S6huipsumgge+8jOi3s+mBjumAmuefpScpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cGFyYW1zLmNyZWF0b3IgPSBudWxsO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YWxrUGFnZU5hbWUgPSBgVXNlciB0YWxrOiR7cGFyYW1zLmNyZWF0b3J9YDtcblx0XHRcdFx0XHRcdGNvbnN0IHVzZXJ0YWxrcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0XHRcdHRhbGtQYWdlTmFtZSxcblx0XHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfpgJrnn6XpobXpnaLliJvlu7rogIXvvIgnLCAn6YCa55+l6aCB6Z2i5bu656uL6ICF77yIJykgKyBwYXJhbXMuY3JlYXRvcn3vvIlgXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgbm90aWZ5dGV4dCA9ICdcXG57eydcblx0XHRcdFx0XHRcdFx0LmNvbmNhdCgnc3Vic3Q6Jylcblx0XHRcdFx0XHRcdFx0LmNvbmNhdChgQUZETm90ZXwke01vcmViaXRzLnBhZ2VOYW1lTm9ybX19fS0tfn5gLCAnfn4nKTtcblx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRBcHBlbmRUZXh0KG5vdGlmeXRleHQpO1xuXHRcdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEVkaXRTdW1tYXJ5KGDpgJrnn6XvvJrpobXpnaJbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1d5a2Y5bqf6K6o6K665o+Q5ZCNYCk7XG5cdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd4ZmRXYXRjaFVzZXInKSk7XG5cdFx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0dXNlcnRhbGtwYWdlLmFwcGVuZCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBhZGQgdGhpcyBub21pbmF0aW9uIHRvIHRoZSB1c2VyJ3MgdXNlcnNwYWNlIGxvZywgaWYgdGhlIHVzZXIgaGFzIGVuYWJsZWQgaXRcblx0XHRcdFx0XHRpZiAocGFyYW1zLmxvZ25vbWluYXRpb24pIHtcblx0XHRcdFx0XHRcdFR3aW5rbGUueGZkLmNhbGxiYWNrcy5hZGRUb0xvZyhwYXJhbXMsIHBhcmFtcy5jcmVhdG9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gb3IsIGlmIG5vdCBub3RpZnlpbmcsIGFkZCB0aGlzIG5vbWluYXRpb24gdG8gdGhlIHVzZXIncyB1c2Vyc3BhY2UgbG9nIHdpdGhvdXQgdGhlIGluaXRpYWwgY29udHJpYnV0b3IncyBuYW1lXG5cdFx0XHRcdH0gZWxzZSBpZiAocGFyYW1zLmxvZ25vbWluYXRpb24pIHtcblx0XHRcdFx0XHRUd2lua2xlLnhmZC5jYWxsYmFja3MuYWRkVG9Mb2cocGFyYW1zLCBudWxsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHRhZ2dpbmdBcnRpY2xlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0XHRsZXQgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdFx0bGV0IHRhZyA9IGB7e3ZmZHwke01vcmViaXRzLnN0cmluZy5mb3JtYXRSZWFzb25UZXh0KHBhcmFtcy54ZmRyZWFzb24pfWA7XG5cdFx0XHRcdGlmIChNb3JlYml0cy5pc1BhZ2VSZWRpcmVjdCgpKSB7XG5cdFx0XHRcdFx0dGFnICs9ICd8cic7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGFnICs9ICd8ZGF0ZT17eycuY29uY2F0KCdzdWJzdDonLCAnI3RpbWU6WS9tL2R9fX19Jyk7XG5cdFx0XHRcdGlmIChwYXJhbXMubm9pbmNsdWRlKSB7XG5cdFx0XHRcdFx0dGFnID0gYDxub2luY2x1ZGU+JHt0YWd9PC9ub2luY2x1ZGU+YDtcblx0XHRcdFx0XHQvLyDlj6rmnInooajmoLzpnIDopoHljZXni6zliqDlm57ovabvvIzlhbbku5bmg4XlhrXliqDlm57ovabkvJrnoLTlnY/mqKHmnb/jgIJcblx0XHRcdFx0XHRpZiAodGV4dC5pbmRleE9mKCd7fCcpID09PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWcgKz0gJ1xcbic7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRhZyArPSAnXFxuJztcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBUaGVuLCB0ZXN0IGlmIHRoZXJlIGFyZSBzcGVlZHkgZGVsZXRpb24tcmVsYXRlZCB0ZW1wbGF0ZXMgb24gdGhlIGFydGljbGUuXG5cdFx0XHRcdGNvbnN0IHRleHROb1NkID0gdGV4dC5yZXBsYWNlKFxuXHRcdFx0XHRcdC9cXHtcXHtcXHMqKGRiKC1cXHcqKT98ZHxkZWxldGV8KD86aGFuZ3xob2xkKVstIF0/b24pXFxzKihcXHwoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pKik/XFx9XFx9XFxzKi9naSxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGV4dCAhPT0gdGV4dE5vU2QgJiZcblx0XHRcdFx0XHRjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflnKjpobXpnaLkuIrmib7liLDlv6vpgJ/liKDpmaTmqKHmnb/vvIzopoHnp7vpmaTlkJfvvJ8nLCAn5Zyo6aCB6Z2i5LiK5om+5Yiw5b+r6YCf5Yiq6Zmk5qih5p2/77yM6KaB56e76Zmk5ZeO77yfJylcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRleHQgPSB0ZXh0Tm9TZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB0ZXh0Tm9Ob3RNYW5kYXJpbiA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHQvXFx7XFx7XFxzKihOb3RNYW5kYXJpbnxOb3RjaGluZXNlfOmdnuS4reaWh3zpnZ7nj77ku6PmvKLoqp586Z2e546w5Luj5rGJ6K+tfOmdnuePvuS7o+aomea6lua8ouiqnnzpnZ7njrDku6PmoIflh4bmsYnor60pXFxzKihcXHwoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pKik/XFx9XFx9XFxzKi9naSxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGV4dCAhPT0gdGV4dE5vTm90TWFuZGFyaW4gJiZcblx0XHRcdFx0XHRjb25maXJtKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn5Zyo6aG16Z2i5LiK5om+5Yiw6Z2e546w5Luj5qCH5YeG5rGJ6K+t5qih5p2/77yM6KaB56e76Zmk5ZCX77yfJyxcblx0XHRcdFx0XHRcdFx0J+WcqOmggemdouS4iuaJvuWIsOmdnuePvuS7o+aomea6lua8ouiqnuaooeadv++8jOimgeenu+mZpOWXju+8nydcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRleHQgPSB0ZXh0Tm9Ob3RNYW5kYXJpbjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB0ZXh0Tm9BZmMgPSB0ZXh0LnJlcGxhY2UoL3t7XFxzKkFGQyBzdWJtaXNzaW9uXFxzKlxcfFxccypcXHxbXn1dKj99fVxccyovZ2ksICcnKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRleHQgIT09IHRleHROb0FmYyAmJlxuXHRcdFx0XHRcdGNvbmZpcm0od2luZG93LndnVUxTKCflnKjpobXpnaLkuIrmib7liLBBRkPmj5DkuqTmqKHmnb/vvIzopoHnp7vpmaTlkJfvvJ8nLCAn5Zyo6aCB6Z2i5LiK5om+5YiwQUZD5o+Q5Lqk5qih5p2/77yM6KaB56e76Zmk5ZeO77yfJykpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRleHQgPSB0ZXh0Tm9BZmM7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gTWFyayB0aGUgcGFnZSBhcyBwYXRyb2xsZWQsIGlmIHdhbnRlZFxuXHRcdFx0XHRpZiAoVHdpbmtsZS5nZXRQcmVmKCdtYXJrWGZkUGFnZXNBc1BhdHJvbGxlZCcpKSB7XG5cdFx0XHRcdFx0cGFnZW9iai5wYXRyb2woKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBJbnNlcnQgdGFnIGFmdGVyIHNob3J0IGRlc2NyaXB0aW9uIG9yIGFueSBoYXRub3Rlc1xuXHRcdFx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraXRleHQucGFnZSh0ZXh0KTtcblx0XHRcdFx0dGV4dCA9IHlzYXJjaGl2ZXNfcGFnZS5pbnNlcnRBZnRlclRlbXBsYXRlcyh0YWcsIFR3aW5rbGUuaGF0bm90ZVJlZ2V4KS5nZXRUZXh0KCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfpobXpnaLlrZjlup/orqjorrrvvJpbWycsICfpoIHpnaLlrZjlu6LoqI7oq5bvvJpbWycpICsgcGFyYW1zLmxvZ3BhZ2V9IyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd4ZmRXYXRjaFBhZ2UnKSk7XG5cdFx0XHRcdHBhZ2VvYmouc2F2ZSgpO1xuXHRcdFx0fSxcblx0XHRcdHRvZGF5c0xpc3Q6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRcdGxldCB0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRsZXQgdHlwZSA9ICcnO1xuXHRcdFx0XHRsZXQgdG8gPSAnJztcblx0XHRcdFx0c3dpdGNoIChwYXJhbXMueGZkY2F0KSB7XG5cdFx0XHRcdFx0Y2FzZSAnZndkY3NkJzpcblx0XHRcdFx0XHRjYXNlICdtZXJnZSc6XG5cdFx0XHRcdFx0XHR0byA9IHBhcmFtcy5tZXJnZWludG87XG5cdFx0XHRcdFx0LyogRmFsbCB0aHJvdWdoICovXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHR5cGUgPSBwYXJhbXMueGZkY2F0O1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IGFwcGVuZCA9IHRydWU7XG5cdFx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRcdGNhc2UgJ2ZhbWUnOlxuXHRcdFx0XHRcdGNhc2UgJ3N1YnN0dWInOlxuXHRcdFx0XHRcdGNhc2UgJ2JhdGNoJzoge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29tbWVudFRleHQgPSBgPCEtLSBUd2lua2xlOiBVc2VyOiR7bXcuY29uZmlnLmdldChcblx0XHRcdFx0XHRcdFx0J3dnVXNlck5hbWUnXG5cdFx0XHRcdFx0XHQpfSDnmoQgJHt0eXBlfSDmj5DliKDmj5LlhaXngrnvvIzor7fli7/mm7TmlLnmiJbnp7vpmaTmraTooYzvvIzpmaTpnZ7kuI3lho3kuo7mraTpobXpnaLmj5DliKAgLS0+YDtcblx0XHRcdFx0XHRcdGxldCBuZXdUZXh0ID0gYD09PVtbOiR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dPT09YDtcblx0XHRcdFx0XHRcdGlmICh0eXBlID09PSAnZmFtZScpIHtcblx0XHRcdFx0XHRcdFx0bmV3VGV4dCArPSBgXFxue3tGaW5kc291cmNlc3wke01vcmViaXRzLnBhZ2VOYW1lTm9ybX19fWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGV4dC5pbmNsdWRlcyhjb21tZW50VGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZShjb21tZW50VGV4dCwgYCR7bmV3VGV4dH1cXG5cXG4ke2NvbW1lbnRUZXh0fWApO1xuXHRcdFx0XHRcdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdFx0XHRcdFx0XHRhcHBlbmQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNhZmVzdWJzdCA9ICdzYWZlc3Vic3QnO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhcHBlbmRUZXh0ID0gYFxcbnt7JHtzYWZlc3Vic3R9JHtgOlNhZmVBZmRIZWFkfX1cXG4ke1xuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGZhbWU6ICc9PSAzMOWkqeWQjuS7jeaMguaciXt7dGx8bm90YWJpbGl0eX195qih5p2/55qE5p2h55uuID09XFxuPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IHNtYWxsZXI7XCI+77yI5bey5oyCW1tUZW1wbGF0ZTpub3RhYmlsaXR5fOS4jeespuaUtuW9leagh+WHhuaooeadv11dMzDlpKnvvIk8L3NwYW4+Jyxcblx0XHRcdFx0XHRcdFx0XHRcdHN1YnN0dWI6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCc9PSAzMOWkqeWQjuS7jeaMguaciXt7dGx8c3Vic3R1Yn195qih5p2/55qE5p2h55uuID09XFxuPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IHNtYWxsZXI7XCI+77yI5bey5oyCW1tUZW1wbGF0ZTpzdWJzdHVifOWwj+Wwj+adoeebruaooeadv11dMzDlpKnvvIk8L3NwYW4+Jyxcblx0XHRcdFx0XHRcdFx0XHRcdGJhdGNoOiAnPT0g5om56YeP5o+Q5YigID09Jyxcblx0XHRcdFx0XHRcdFx0XHR9W3R5cGVdXG5cdFx0XHRcdFx0XHRcdH1cXG4ke25ld1RleHR9XFxuXFxuJHtjb21tZW50VGV4dH1cXG4tLS0tXFxuOuW7uuiuru+8muWIoOmZpOWJjei/sOmhtemdou+8m+eQhueUse+8miR7TW9yZWJpdHMuc3RyaW5nLmZvcm1hdFJlYXNvblRleHQoXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW1zLnhmZHJlYXNvblxuXHRcdFx0XHRcdFx0XHQpfVxcbuaPkOaKpeS7peS4iiR7XG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmFtZTogJzx1PuS4jeespuWQiOaUtuW9leagh+WHhjwvdT7mnaHnm64nLFxuXHRcdFx0XHRcdFx0XHRcdFx0c3Vic3R1YjogJzx1PumVv+W6pui/h+efrTwvdT7mnaHnm64nLFxuXHRcdFx0XHRcdFx0XHRcdFx0YmF0Y2g6ICfpobXpnaInLFxuXHRcdFx0XHRcdFx0XHRcdH1bdHlwZV1cblx0XHRcdFx0XHRcdFx0feeahOaxgumXu+e8luiAheWPiuaXtumXtO+8mjxiciBpZD1cIm5vLW5ldy10aXRsZVwiPn5+YC5jb25jYXQoJ35+Jyl9YDtcblx0XHRcdFx0XHRcdFx0cGFnZW9iai5zZXRBcHBlbmRUZXh0KGFwcGVuZFRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRwYWdlb2JqLnNldEFwcGVuZFRleHQoXG5cdFx0XHRcdFx0XHRcdCdcXG57eycuY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRcdCdzdWJzdDonLFxuXHRcdFx0XHRcdFx0XHRcdGBEUkl0ZW18VHlwZT0ke3R5cGV9fERSYXJ0aWNsZXM9JHtcblx0XHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybVxuXHRcdFx0XHRcdFx0XHRcdH18UmVhc29uPSR7TW9yZWJpdHMuc3RyaW5nLmZvcm1hdFJlYXNvblRleHQocGFyYW1zLnhmZHJlYXNvbil9JHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5md2Rjc2RyZWFzb24udHJpbSgpID09PSAnJyA/ICcnIDogYDxicj5cXG7ovazkuqTnkIbnlLHvvJoke3BhcmFtcy5md2Rjc2RyZWFzb259YFxuXHRcdFx0XHRcdFx0XHRcdH18VG89JHt0b319fX5+YC5jb25jYXQoJ35+Jylcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoYOWKoOWFpVtbJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV1gKTtcblx0XHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZigneGZkV2F0Y2hEaXNjdXNzaW9uJykpO1xuXHRcdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0aWYgKGFwcGVuZCkge1xuXHRcdFx0XHRcdHBhZ2VvYmouYXBwZW5kKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFnZW9iai5zYXZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0VHdpbmtsZS54ZmQuY3VycmVudFJhdGlvbmFsZSA9IG51bGw7XG5cdFx0XHR9LFxuXHRcdFx0bG9va3VwQ3JlYXRpb246ICh0YXJnZXRfcGFnZSkgPT4ge1xuXHRcdFx0XHR0YXJnZXRfcGFnZS5nZXRTdGF0dXNFbGVtZW50KCkuaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHRhcmdldF9wYWdlLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRwYXJhbXMuY3JlYXRvciA9IHRhcmdldF9wYWdlLmdldENyZWF0b3IoKTtcblx0XHRcdFx0Ly8gVGFnZ2luZyBwYWdlXG5cdFx0XHRcdGNvbnN0IHRhZ2dpbmdfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg5YWl5a2Y5bqf6K6o6K665qih5p2/5Yiw6aG16Z2iJywgJ+WKoOWFpeWtmOW7ouiojuirluaooeadv+WIsOmggemdoicpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRhZ2dpbmdfcGFnZS5zZXRGb2xsb3dSZWRpcmVjdChmYWxzZSk7XG5cdFx0XHRcdHRhZ2dpbmdfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0dGFnZ2luZ19wYWdlLmxvYWQoVHdpbmtsZS54ZmQuY2FsbGJhY2tzLmFmZC50cnlUYWdnaW5nKTtcblx0XHRcdH0sXG5cdFx0XHR0cnlUYWdnaW5nOiAodGFnZ2luZ19wYWdlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0YXRlbGVtID0gdGFnZ2luZ19wYWdlLmdldFN0YXR1c0VsZW1lbnQoKTtcblx0XHRcdFx0Ly8gZGVmYXVsdHMgdG8gL2RvYyBmb3IgbHVhIG1vZHVsZXMsIHdoaWNoIG1heSBub3QgZXhpc3Rcblx0XHRcdFx0aWYgKCF0YWdnaW5nX3BhZ2UuZXhpc3RzKCkpIHtcblx0XHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+mhtemdouS4jeWtmOWcqO+8jOWPr+iDveW3suiiq+WIoOmZpCcsICfpoIHpnaLkuI3lrZjlnKjvvIzlj6/og73lt7LooqvliKrpmaQnKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHRleHQgPSB0YWdnaW5nX3BhZ2UuZ2V0UGFnZVRleHQoKTtcblx0XHRcdFx0Y29uc3QgeGZkID0gLyg/Olxce1xceyhbcnNhaWZ0Y212XWZkfG1kMXxwcm9wb3NlZCBkZWxldGlvbilbXnt9XSo/XFx9XFx9KS9pLmV4ZWModGV4dCk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR4ZmQgJiZcblx0XHRcdFx0XHQhY29uZmlybShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yig6Zmk55u45YWz5qih5p2/e3snLCAn5Yiq6Zmk55u46Zec5qih5p2/e3snKSArXG5cdFx0XHRcdFx0XHRcdHhmZFsxXSArXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQnfX3lt7Looqvnva7kuo7pobXpnaLkuK3vvIzmgqjmmK/lkKbku43mg7Pnu6fnu63mj5DmiqXvvJ8nLFxuXHRcdFx0XHRcdFx0XHRcdCd9feW3suiiq+e9ruaWvOmggemdouS4re+8jOaCqOaYr+WQpuS7jeaDs+e5vOe6jOaPkOWgse+8nydcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfpobXpnaLlt7Looqvmj5DkuqToh7PlrZjlup/orqjorrrjgIInLCAn6aCB6Z2i5bey6KKr5o+Q5Lqk6Iez5a2Y5bui6KiO6KuW44CCJykpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBjb3B5dmlvID0gLyg/Olxce1xce1xccyooY29weXZpbylbXnt9XSo/XFx9XFx9KS9pLmV4ZWModGV4dCk7XG5cdFx0XHRcdGlmIChjb3B5dmlvKSB7XG5cdFx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfpobXpnaLkuK3lt7LmnInokZfkvZzmnYPpqozor4HmqKHmnb/jgIInLCAn6aCB6Z2i5Lit5bey5pyJ6JGX5L2c5qyK6amX6K2J5qih5p2/44CCJykpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRUd2lua2xlLnhmZC5jYWxsYmFja3MuYWZkLm1haW4odGFnZ2luZ19wYWdlKTtcblx0XHRcdH0sXG5cdFx0fSxcblx0XHRmZmQ6IHtcblx0XHRcdG1haW46ICh0YWdnaW5nX3BhZ2UpID0+IHtcblx0XHRcdFx0Y29uc3QgcGFyYW1zID0gdGFnZ2luZ19wYWdlLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0XHRUd2lua2xlLnhmZC5jYWxsYmFja3MuZmZkLnRhZ2dpbmdJbWFnZSh0YWdnaW5nX3BhZ2UpO1xuXHRcdFx0XHQvLyBBZGRpbmcgZGlzY3Vzc2lvblxuXHRcdFx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdHBhcmFtcy5sb2dwYWdlLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg5YWl6K6o6K665Yiw5b2T5pel5YiX6KGoJywgJ+WKoOWFpeiojuirluWIsOeVtuaXpeWIl+ihqCcpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2UubG9hZChUd2lua2xlLnhmZC5jYWxsYmFja3MuZmZkLnRvZGF5c0xpc3QpO1xuXHRcdFx0XHQvLyBOb3RpZmljYXRpb24gdG8gZmlyc3QgY29udHJpYnV0b3Jcblx0XHRcdFx0aWYgKHBhcmFtcy5ub3RpZnkpIHtcblx0XHRcdFx0XHQvLyBEaXNhbGxvdyB3YXJuaW5nIHlvdXJzZWxmXG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5jcmVhdG9yID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ+mAmuefpemhtemdouWIm+W7uuiAhe+8iCcsICfpgJrnn6XpoIHpnaLlu7rnq4vogIXvvIgnKSArIHBhcmFtcy5jcmVhdG9yfe+8iWAsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5oKo5Yib5bu65LqG6K+l6aG177yM6Lez6L+H6YCa55+lJywgJ+aCqOW7uueri+S6huipsumgge+8jOi3s+mBjumAmuefpScpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCB0YWxrUGFnZU5hbWUgPSBgVXNlciB0YWxrOiR7cGFyYW1zLmNyZWF0b3J9YDtcblx0XHRcdFx0XHRjb25zdCB1c2VydGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0dGFsa1BhZ2VOYW1lLFxuXHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfpgJrnn6XpobXpnaLliJvlu7rogIXvvIgnLCAn6YCa55+l6aCB6Z2i5bu656uL6ICF77yIJykgKyBwYXJhbXMuY3JlYXRvcn3vvIlgXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBub3RpZnl0ZXh0ID0gJ1xcbnt7Jy5jb25jYXQoJ3N1YnN0OicsIGBpZHd8RmlsZToke213LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKX19fWAsICctLX5+JywgJ35+Jyk7XG5cdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEFwcGVuZFRleHQobm90aWZ5dGV4dCk7XG5cdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEVkaXRTdW1tYXJ5KGDpgJrnn6XvvJrmlofku7ZbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1d5a2Y5bqf6K6o6K665o+Q5ZCNYCk7XG5cdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd4ZmRXYXRjaFVzZXInKSk7XG5cdFx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0XHR1c2VydGFsa3BhZ2UuYXBwZW5kKCk7XG5cdFx0XHRcdFx0Ly8gYWRkIHRoaXMgbm9taW5hdGlvbiB0byB0aGUgdXNlcidzIHVzZXJzcGFjZSBsb2csIGlmIHRoZSB1c2VyIGhhcyBlbmFibGVkIGl0XG5cdFx0XHRcdFx0aWYgKHBhcmFtcy5sb2dub21pbmF0aW9uKSB7XG5cdFx0XHRcdFx0XHRUd2lua2xlLnhmZC5jYWxsYmFja3MuYWRkVG9Mb2cocGFyYW1zLCBwYXJhbXMuY3JlYXRvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIG9yLCBpZiBub3Qgbm90aWZ5aW5nLCBhZGQgdGhpcyBub21pbmF0aW9uIHRvIHRoZSB1c2VyJ3MgdXNlcnNwYWNlIGxvZyB3aXRob3V0IHRoZSBpbml0aWFsIGNvbnRyaWJ1dG9yJ3MgbmFtZVxuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5sb2dub21pbmF0aW9uKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS54ZmQuY2FsbGJhY2tzLmFkZFRvTG9nKHBhcmFtcywgbnVsbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR0YWdnaW5nSW1hZ2U6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQoXG5cdFx0XHRcdFx0YHt7aWZkfCR7TW9yZWJpdHMuc3RyaW5nLmZvcm1hdFJlYXNvblRleHQocGFyYW1zLnhmZHJlYXNvbil9fGRhdGU9e3tgLmNvbmNhdChcblx0XHRcdFx0XHRcdCdzdWJzdDonLFxuXHRcdFx0XHRcdFx0YCN0aW1lOmN9fX19XFxuJHt0ZXh0fWBcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfmlofku7blrZjlup/orqjorrrvvJpbWycsICfmqpTmoYjlrZjlu6LoqI7oq5bvvJpbWycpICsgcGFyYW1zLmxvZ3BhZ2V9IyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dYFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdFx0cGFnZW9iai5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd4ZmRXYXRjaFBhZ2UnKSk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpOyAvLyBpdCBtaWdodCBiZSBwb3NzaWJsZSBmb3IgYSBmaWxlIHRvIGV4aXN0IHdpdGhvdXQgYSBkZXNjcmlwdGlvbiBwYWdlXG5cdFx0XHRcdHBhZ2VvYmouc2F2ZSgpO1xuXHRcdFx0fSxcblx0XHRcdHRvZGF5c0xpc3Q6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRcdC8vIGNvbnN0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0QXBwZW5kVGV4dChcblx0XHRcdFx0XHQnXFxue3snLmNvbmNhdChcblx0XHRcdFx0XHRcdCdzdWJzdDonLFxuXHRcdFx0XHRcdFx0YElmZEl0ZW18RmlsZW5hbWU9JHttdy5jb25maWcuZ2V0KCd3Z1RpdGxlJyl9fFVwbG9hZGVyPSR7XG5cdFx0XHRcdFx0XHRcdHBhcmFtcy5jcmVhdG9yXG5cdFx0XHRcdFx0XHR9fFJlYXNvbj0ke01vcmViaXRzLnN0cmluZy5mb3JtYXRSZWFzb25UZXh0KHBhcmFtcy54ZmRyZWFzb24pfX19LS1+fmAuY29uY2F0KCd+ficpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KGDliqDlhaVbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dYCk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3hmZFdhdGNoRGlzY3Vzc2lvbicpKTtcblx0XHRcdFx0cGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRcdHBhZ2VvYmouYXBwZW5kKCgpID0+IHtcblx0XHRcdFx0XHRUd2lua2xlLnhmZC5jdXJyZW50UmF0aW9uYWxlID0gbnVsbDsgLy8gYW55IGVycm9ycyBmcm9tIG5vdyBvbiBkbyBub3QgbmVlZCB0byBwcmludCB0aGUgcmF0aW9uYWxlLCBhcyBpdCBpcyBzYWZlbHkgc2F2ZWQgb24td2lraVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cblx0XHRcdGxvb2t1cENyZWF0aW9uOiAodGFyZ2V0X3BhZ2UpID0+IHtcblx0XHRcdFx0dGFyZ2V0X3BhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLmluZm8oJ+WujOaIkCcpO1xuXHRcdFx0XHRjb25zdCBwYXJhbXMgPSB0YXJnZXRfcGFnZS5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdFx0cGFyYW1zLmNyZWF0b3IgPSB0YXJnZXRfcGFnZS5nZXRDcmVhdG9yKCk7XG5cdFx0XHRcdC8vIFRhZ2dpbmcgZmlsZVxuXHRcdFx0XHRjb25zdCB0YWdnaW5nX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOWFpeWtmOW6n+iuqOiuuuaooeadv+WIsOaWh+S7tuaPj+i/sOmhtScsICfliqDlhaXlrZjlu6LoqI7oq5bmqKHmnb/liLDmqpTmoYjmj4/ov7DpoIEnKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR0YWdnaW5nX3BhZ2Uuc2V0Rm9sbG93UmVkaXJlY3QoZmFsc2UpO1xuXHRcdFx0XHR0YWdnaW5nX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRcdHRhZ2dpbmdfcGFnZS5sb2FkKFR3aW5rbGUueGZkLmNhbGxiYWNrcy5mZmQudHJ5VGFnZ2luZyk7XG5cdFx0XHR9LFxuXHRcdFx0dHJ5VGFnZ2luZzogKHRhZ2dpbmdfcGFnZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzdGF0ZWxlbSA9IHRhZ2dpbmdfcGFnZS5nZXRTdGF0dXNFbGVtZW50KCk7XG5cdFx0XHRcdGlmICghdGFnZ2luZ19wYWdlLmV4aXN0cygpKSB7XG5cdFx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfpobXpnaLkuI3lrZjlnKjvvIzlj6/og73lt7LooqvliKDpmaQnLCAn6aCB6Z2i5LiN5a2Y5Zyo77yM5Y+v6IO95bey6KKr5Yiq6ZmkJykpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB0ZXh0ID0gdGFnZ2luZ19wYWdlLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHhmZCA9IC8oPzpcXHtcXHsoW3JzYWlmdGNtdl1mZHxtZDF8cHJvcG9zZWQgZGVsZXRpb24pW157fV0qP1xcfVxcfSkvaS5leGVjKHRleHQpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0eGZkICYmXG5cdFx0XHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WIoOmZpOebuOWFs+aooeadv3t7JywgJ+WIqumZpOebuOmXnOaooeadv3t7JykgK1xuXHRcdFx0XHRcdFx0XHR4ZmRbMV0gK1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J3195bey6KKr572u5LqO6aG16Z2i5Lit77yM5oKo5piv5ZCm5LuN5oOz57un57ut5o+Q5oql77yfJyxcblx0XHRcdFx0XHRcdFx0XHQnfX3lt7Looqvnva7mlrzpoIHpnaLkuK3vvIzmgqjmmK/lkKbku43mg7Pnubznuozmj5DloLHvvJ8nXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHN0YXRlbGVtLmVycm9yKHdpbmRvdy53Z1VMUygn6aG16Z2i5bey6KKr5o+Q5Lqk6Iez5a2Y5bqf6K6o6K6644CCJywgJ+mggemdouW3suiiq+aPkOS6pOiHs+WtmOW7ouiojuirluOAgicpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0VHdpbmtsZS54ZmQuY2FsbGJhY2tzLmZmZC5tYWluKHRhZ2dpbmdfcGFnZSk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0YWRkVG9Mb2c6IChwYXJhbXMsIGluaXRpYWxDb250cmliKSA9PiB7XG5cdFx0XHRjb25zdCBlZGl0c3VtbWFyeSA9XG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn6K6w5b2V5a+5W1snLCAn6KiY6YyE5bCNW1snKSArXG5cdFx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSArXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygnXV3nmoTlrZjlup/orqjorrrmj5DlkI0nLCAnXV3nmoTlrZjlu6LoqI7oq5bmj5DlkI0nKTtcblx0XHRcdGNvbnN0IHVzbCA9IG5ldyBNb3JlYml0cy51c2Vyc3BhY2VMb2dnZXIoVHdpbmtsZS5nZXRQcmVmKCd4ZmRMb2dQYWdlTmFtZScpKTtcblx0XHRcdHVzbC5pbml0aWFsVGV4dCA9IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0YOi/meaYr+ivpeeUqOaIt+S9v+eUqFtbSDpUV3xUd2lua2xlXV3nmoTmj5DliKDmqKHlnZflgZrlh7rnmoRbW0xJQjpYRkR85a2Y5bqf6K6o6K66XV3mj5DlkI3liJfooajjgIJcXG5cXG7oi6XmgqjkuI3lho3mg7Pkv53nlZnmraTml6Xlv5fvvIzor7flnKhbWyR7VHdpbmtsZS5nZXRQcmVmKFxuXHRcdFx0XHRcdCdjb25maWdQYWdlJ1xuXHRcdFx0XHQpfXzlj4LmlbDorr7nva5dXeS4reWFs+aOie+8jOW5tuS9v+eUqFtbTElCOkNTRCNPMXxDU0QgTzFdXeaPkOS6pOW/q+mAn+WIoOmZpOOAgmAsXG5cdFx0XHRcdGDpgJnmmK/oqbLkvb/nlKjogIXkvb/nlKhbW0g6VFd8VHdpbmtsZV1d55qE5o+Q5Yiq5qih5aGK5YGa5Ye655qEW1tMSUI6WEZEfOWtmOW7ouiojuirll1d5o+Q5ZCN5YiX6KGo44CCXFxuXFxu6Iul5oKo5LiN5YaN5oOz5L+d55WZ5q2k5pel6KqM77yM6KuL5ZyoW1ske1R3aW5rbGUuZ2V0UHJlZihcblx0XHRcdFx0XHQnY29uZmlnUGFnZSdcblx0XHRcdFx0KX185YGP5aW96Kit5a6aXV3kuK3pl5zmjonvvIzkuKbkvb/nlKhbW0xJQjpDU0QjTzF8Q1NEIE8xXV3mj5DkuqTlv6vpgJ/liKrpmaTjgIJgXG5cdFx0XHQpO1xuXHRcdFx0bGV0IHhmZENhdE5hbWU7XG5cdFx0XHRzd2l0Y2ggKHBhcmFtcy54ZmRjYXQpIHtcblx0XHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCfliKDpmaQnLCAn5Yiq6ZmkJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ21lcmdlJzpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCflkIjlubbliLAnLCAn5ZCI5L215YiwJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2Z3ZGNzZCc6XG5cdFx0XHRcdFx0eGZkQ2F0TmFtZSA9IHdpbmRvdy53Z1VMUygn6L2s5Lqk6Ieq5b+r6YCf5Yig6Zmk5YCZ6YCJJywgJ+i9ieS6pOiHquW/q+mAn+WIqumZpOWAmemBuCcpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdmYW1lJzpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCfmibnph4/lhbPms6jluqbmj5DliKAnLCAn5om55qyh6Zec5rOo5bqm5o+Q5YiqJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3N1YnN0dWInOlxuXHRcdFx0XHRcdHhmZENhdE5hbWUgPSB3aW5kb3cud2dVTFMoJ+aJuemHj+Wwj+Wwj+S9nOWTgeaPkOWIoCcsICfmibnmrKHlsI/lsI/kvZzlk4Hmj5DliKonKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnYmF0Y2gnOlxuXHRcdFx0XHRcdHhmZENhdE5hbWUgPSB3aW5kb3cud2dVTFMoJ+aJuemHj+WFtuS7luaPkOWIoCcsICfmibnmrKHlhbbku5bmj5DliKonKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR4ZmRDYXROYW1lID0gd2luZG93LndnVUxTKCfmlofku7blrZjlup/orqjorronLCAn5qqU5qGI5a2Y5bui6KiO6KuWJyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyBJZiBhIGxvZ2dlZCBmaWxlIGlzIGRlbGV0ZWQgYnV0IGV4aXN0cyBvbiByZW1vdGUgcmVwbywgdGhlIHdpa2lsaW5rIHdpbGwgYmUgYmx1ZSwgc28gcHJvdmlkZSBhIGxpbmsgdG8gdGhlIGxvZ1xuXHRcdFx0bGV0IGFwcGVuZFRleHQgPSBgIyBbWzoke01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXWA7XG5cdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gNikge1xuXHRcdFx0XHRhcHBlbmRUZXh0ICs9IGDvvIhbe3tmdWxsdXJsOlNwZWNpYWw6TG9nfHBhZ2U9JHttdy51dGlsLndpa2lVcmxlbmNvZGUoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpXG5cdFx0XHRcdCl9fX0gJHt3aW5kb3cud2dVTFMoJ+aXpeW/lycsICfml6XoqownKX1d77yJYDtcblx0XHRcdH1cblx0XHRcdGFwcGVuZFRleHQgKz0gYO+8miR7eGZkQ2F0TmFtZX1gO1xuXHRcdFx0aWYgKHBhcmFtcy54ZmRjYXQgPT09ICdtZXJnZScpIHtcblx0XHRcdFx0YXBwZW5kVGV4dCArPSBgW1s6JHtwYXJhbXMubWVyZ2VpbnRvfV1dYDtcblx0XHRcdH1cblx0XHRcdGFwcGVuZFRleHQgKz0gJ+OAgic7XG5cdFx0XHRpZiAocGFyYW1zLnhmZHJlYXNvbikge1xuXHRcdFx0XHRhcHBlbmRUZXh0ICs9IGAnJycke1xuXHRcdFx0XHRcdHBhcmFtcy54ZmRjYXQgPT09ICdmd2Rjc2QnID8gd2luZG93LndnVUxTKCfljp/liKDpmaTnkIbmja4nLCAn5Y6f5Yiq6Zmk55CG5pOaJykgOiB3aW5kb3cud2dVTFMoJ+eQhuaNricsICfnkIbmk5onKVxuXHRcdFx0XHR9Jycn77yaJHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uRm9yTG9nKHBhcmFtcy54ZmRyZWFzb24pfWA7XG5cdFx0XHRcdGFwcGVuZFRleHQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oYXBwZW5kVGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLmZ3ZGNzZHJlYXNvbikge1xuXHRcdFx0XHRhcHBlbmRUZXh0ICs9IGAnJycke1xuXHRcdFx0XHRcdHBhcmFtcy54ZmRjYXQgPT09ICdmd2Rjc2QnID8gd2luZG93LndnVUxTKCfovazkuqTnkIbmja4nLCAn6L2J5Lqk55CG5pOaJykgOiB3aW5kb3cud2dVTFMoJ+eQhuaNricsICfnkIbmk5onKVxuXHRcdFx0XHR9Jycn77yaJHtNb3JlYml0cy5zdHJpbmcuZm9ybWF0UmVhc29uRm9yTG9nKHBhcmFtcy5md2Rjc2RyZWFzb24pfWA7XG5cdFx0XHRcdGFwcGVuZFRleHQgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oYXBwZW5kVGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5pdGlhbENvbnRyaWIpIHtcblx0XHRcdFx0YXBwZW5kVGV4dCArPSBg77yb6YCa55+le3t1c2VyfCR7aW5pdGlhbENvbnRyaWJ9fX1gO1xuXHRcdFx0fVxuXHRcdFx0YXBwZW5kVGV4dCArPSAnIH5+Jy5jb25jYXQoJ35+JywgJ35cXG4nKTtcblx0XHRcdHVzbC5jaGFuZ2VUYWdzID0gVHdpbmtsZS5jaGFuZ2VUYWdzO1xuXHRcdFx0dXNsLmxvZyhhcHBlbmRUZXh0LCBlZGl0c3VtbWFyeSk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS54ZmQuY2FsbGJhY2suZXZhbHVhdGUgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZS50YXJnZXQpO1xuXHRcdGlmIChwYXJhbXMueGZkY2F0ID09PSAnbWVyZ2UnICYmIHBhcmFtcy5tZXJnZWludG8udHJpbSgpID09PSAnJykge1xuXHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn6K+35o+Q5L6b5ZCI5bm255uu5qCH77yBJywgJ+iri+aPkOS+m+WQiOS9teebruaome+8gScpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZXhmZCcsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChlLnRhcmdldCk7XG5cdFx0VHdpbmtsZS54ZmQuY3VycmVudFJhdGlvbmFsZSA9IHBhcmFtcy54ZmRyZWFzb247XG5cdFx0TW9yZWJpdHMuc3RhdHVzLm9uRXJyb3IoVHdpbmtsZS54ZmQucHJpbnRSYXRpb25hbGUpO1xuXHRcdGlmICghcGFyYW1zLmNhdGVnb3J5KSB7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuZXJyb3IoJ+mUmeivrycsICfmnKrlrprkuYnnmoTliqjkvZwnKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHRhcmdldF9wYWdlO1xuXHRcdGNvbnN0IGRhdGUgPSBuZXcgTW9yZWJpdHMuZGF0ZSgpOyAvLyBYWFg6IGF2b2lkIHVzZSBvZiBjbGllbnQgY2xvY2ssIHN0aWxsIHVzZWQgYnkgVGZELCBGZkQgYW5kIENmRFxuXHRcdHN3aXRjaCAocGFyYW1zLmNhdGVnb3J5KSB7XG5cdFx0XHRjYXNlICdhZmQnOlxuXHRcdFx0XHQvLyBBRkRcblx0XHRcdFx0cGFyYW1zLmxvZ3BhZ2UgPSBgTElCX3RhbGs65a2Y5bqf6K6o6K66L+iusOW9lS8ke2RhdGUuZm9ybWF0KCdZWVlZL01NL0REJywgJ3V0YycpfWA7XG5cdFx0XHRcdHBhcmFtcy5sb2dub21pbmF0aW9uID1cblx0XHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ2xvZ1hmZE5vbWluYXRpb25zJykgJiZcblx0XHRcdFx0XHQhVHdpbmtsZS5nZXRQcmVmKCdub0xvZ09uWGZkTm9taW5hdGlvbicpLmluY2x1ZGVzKHBhcmFtcy54ZmRjYXQpO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFkZENoZWNrcG9pbnQoKTtcblx0XHRcdFx0Ly8gVXBkYXRpbmcgZGF0YSBmb3IgdGhlIGFjdGlvbiBjb21wbGV0ZWQgZXZlbnRcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBwYXJhbXMubG9ncGFnZTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfmj5DlkI3lrozmiJDvvIzph43lrprlkJHliLDorqjorrrpobUnLFxuXHRcdFx0XHRcdCfmj5DlkI3lrozmiJDvvIzph43mlrDlsI7lkJHliLDoqI7oq5bpoIEnXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIExvb2t1cCBjcmVhdGlvblxuXHRcdFx0XHR0YXJnZXRfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6I635Y+W6aG16Z2i5Yib5bu65L+h5oGvJywgJ+WPluW+l+mggemdouW7uueri+izh+ioiicpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRhcmdldF9wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dQYWdlQ29udGVudE1vZGVsJykgPT09ICd3aWtpdGV4dCcpIHtcblx0XHRcdFx0XHR0YXJnZXRfcGFnZS5zZXRMb29rdXBOb25SZWRpcmVjdENyZWF0b3IodHJ1ZSk7IC8vIExvb2sgZm9yIGF1dGhvciBvZiBmaXJzdCBub24tcmVkaXJlY3QgcmV2aXNpb25cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhcmdldF9wYWdlLmxvb2t1cENyZWF0aW9uKFR3aW5rbGUueGZkLmNhbGxiYWNrcy5hZmQubG9va3VwQ3JlYXRpb24pO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLnJlbW92ZUNoZWNrcG9pbnQoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdmZmQnOiB7XG5cdFx0XHRcdC8vIEZGRFxuXHRcdFx0XHRwYXJhbXMubG9ncGFnZSA9IGBMSUJfdGFsazrlrZjlup/orqjorrov6K6w5b2VLyR7ZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQnLCAndXRjJyl9YDtcblx0XHRcdFx0cGFyYW1zLmxvZ25vbWluYXRpb24gPVxuXHRcdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignbG9nWGZkTm9taW5hdGlvbnMnKSAmJiAhVHdpbmtsZS5nZXRQcmVmKCdub0xvZ09uWGZkTm9taW5hdGlvbicpLmluY2x1ZGVzKCdmZmQnKTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hZGRDaGVja3BvaW50KCk7XG5cdFx0XHRcdC8vIFVwZGF0aW5nIGRhdGEgZm9yIHRoZSBhY3Rpb24gY29tcGxldGVkIGV2ZW50XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gcGFyYW1zLmxvZ3BhZ2U7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHQn5o+Q5ZCN5a6M5oiQ77yM6YeN5a6a5ZCR5Yiw6K6o6K666aG1Jyxcblx0XHRcdFx0XHQn5o+Q5ZCN5a6M5oiQ77yM6YeN5paw5bCO5ZCR5Yiw6KiO6KuW6aCBJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBMb29rdXAgY3JlYXRpb25cblx0XHRcdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfojrflj5bpobXpnaLliJvlu7rkv6Hmga8nLCAn5Y+W5b6X6aCB6Z2i5bu656uL6LOH6KiKJylcblx0XHRcdFx0KTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0TG9va3VwTm9uUmVkaXJlY3RDcmVhdG9yKHRydWUpOyAvLyBMb29rIGZvciBhdXRob3Igb2YgZmlyc3Qgbm9uLXJlZGlyZWN0IHJldmlzaW9uXG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5sb29rdXBDcmVhdGlvbihUd2lua2xlLnhmZC5jYWxsYmFja3MuZmZkLmxvb2t1cENyZWF0aW9uKTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5yZW1vdmVDaGVja3BvaW50KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0bXcubm90aWZ5KCd0d2lua2xleGZk77ya5pyq5a6a5LmJ55qE57G75YirJywge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xleGZkJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS54ZmQsICd4ZmQnKTtcbn0pKCk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWltYWdlLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWltYWdlKCkge1xuXHQvKipcblx0ICogdHdpbmtsZWltYWdlLmpzOiBJbWFnZSBDU0QgbW9kdWxlXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogVGFiIChcIkRJXCIpXG5cdCAqIEFjdGl2ZSBvbjogTG9jYWwgbm9ucmVkaXJlY3QgZmlsZSBwYWdlcyAobm90IG9uIFNoYXJlKVxuXHQgKi9cblx0VHdpbmtsZS5pbWFnZSA9ICgpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSA2ICYmXG5cdFx0XHQhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LXNoYXJlZHVwbG9hZCcpICYmXG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctaW1hZ2VwYWdlLXNlY3Rpb24tZmlsZWhpc3RvcnknKVxuXHRcdCkge1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFx0VHdpbmtsZS5pbWFnZS5jYWxsYmFjayxcblx0XHRcdFx0d2luZG93LndnVUxTKCflm77mnYMnLCAn5ZyW5qyKJyksXG5cdFx0XHRcdCd0dy1kaScsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5o+Q5Lqk5paH5Lu25b+r6YCf5Yig6ZmkJywgJ+aPkOS6pOaqlOahiOW/q+mAn+WIqumZpCcpXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5pbWFnZS5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgMzMwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmlofku7blv6vpgJ/liKDpmaTlgJnpgIknLCAn5qqU5qGI5b+r6YCf5Yiq6Zmk5YCZ6YG4JykpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCflv6vpgJ/liKDpmaTmnaHkvosnLCAn5b+r6YCf5Yiq6Zmk5qKd5L6LJyksICdMSUI6Q1NEJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCflm77mnYPorr7nva4nLCAn5ZyW5qyK6Kit5a6aJyksICdIOlRXL1BSRUYjaW1hZ2UnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ1R3aW5rbGXluK7liqknLCAnVHdpbmtsZeiqquaYjicpLCAnSDpUVy9ET0MjaW1hZ2UnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLmltYWdlLmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCa55+l5LiK5Lyg6ICFJywgJ+mAmuefpeS4iuWCs+iAhScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm90aWZ5Jyxcblx0XHRcdFx0XHRuYW1lOiAnbm90aWZ5Jyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6Iul5oKo5Zyo5qCH6K6w5ZCM5LiA55So5oi355qE5b6I5aSa5paH5Lu277yM6K+35Y+W5raI5q2k5aSN6YCJ5qGG5Lul6YG/5YWN5Y+R6YCB6L+H5aSa5raI5oGv44CCQ1NEIEY15rC46L+c5LiN5Lya6YCa55+l44CCJyxcblx0XHRcdFx0XHRcdCfoi6XmgqjlnKjmqJnoqJjlkIzkuIDkvb/nlKjogIXnmoTlvojlpJrmqpTmoYjvvIzoq4vlj5bmtojmraTmoLjlj5bmlrnloYrku6Xpgb/lhY3nmbzpgIHpgY7lpJroqIrmga/jgIJDU0QgRjXmsLjpgaDkuI3mnIPpgJrnn6XjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmdldFByZWYoJ25vdGlmeVVzZXJPbkRlbGknKSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Y29uc3QgZmllbGQgPSBmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6ZyA6KaB55qE5Yqo5L2cJywgJ+mcgOimgeeahOWLleS9nCcpLFxuXHRcdH0pO1xuXHRcdGZpZWxkLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAncmFkaW8nLFxuXHRcdFx0bmFtZTogJ3R5cGUnLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5piO5pi+5L615p2D5LmL5paH5Lu277yIQ1NEIEYx77yJJywgJ+aYjumhr+S+teasiuS5i+aqlOahiO+8iENTRCBGMe+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm8gcGVybWlzc2lvbicsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+S4iuS8oOiAheWuo+ensOaLpeacie+8jOiAjOWcqOWFtuS7luadpea6kOaJvuWIsOeahOaWh+S7tu+8jOaIluS7juS+teadg+eahOadpea6kOiOt+WPlueahOaWh+S7tuOAgicsXG5cdFx0XHRcdFx0XHQn5LiK5YKz6ICF5a6j56ix5pOB5pyJ77yM6ICM5Zyo5YW25LuW5L6G5rqQ5om+5Yiw55qE5qqU5qGI77yM5oiW5b6e5L615qyK55qE5L6G5rqQ5Y+W5b6X55qE5qqU5qGI44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0c3ViZ3JvdXA6IHtcblx0XHRcdFx0XHRcdG5hbWU6ICdmMV9zb3VyY2UnLFxuXHRcdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S+teadg+adpea6kO+8micsICfkvrXmrIrkvobmupDvvJonKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5p2l5rqQ5LiN5piO77yIQ1NEIEYz77yJJywgJ+S+hua6kOS4jeaYju+8iENTRCBGM++8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm8gc291cmNlJyxcblx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5pys5paH5Lu25bm25pyq5rOo5piO5Y6f5aeL5Ye65aSEJywgJ+acrOaqlOahiOS4puacquiou+aYjuWOn+Wni+WHuuiZlScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmnKrnn6XokZfkvZzmnYPmiJbokZfkvZzmnYPml6Dms5Xooqvmn6Xor4HvvIhDU0QgRjPvvIknLFxuXHRcdFx0XHRcdFx0J+acquefpeiRl+S9nOasiuaIluiRl+S9nOasiueEoeazleiiq+afpeitie+8iENTRCBGM++8iSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm8gbGljZW5zZScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+acrOaWh+S7tue8uuWwkeiRl+S9nOadg+S/oeaBr++8jOaIluWjsOensOeahOiRl+S9nOadg+S/oeaBr+aXoOazleiiq+afpeivgScsXG5cdFx0XHRcdFx0XHQn5pys5qqU5qGI57y65bCR6JGX5L2c5qyK6LOH6KiK77yM5oiW6IGy56ix55qE6JGX5L2c5qyK6LOH6KiK54Sh5rOV6KKr5p+l6K2JJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+adpea6kOS4jeaYjuS4lOacquefpeiRl+S9nOadg+aIluiRl+S9nOadg+aXoOazleiiq+afpeivge+8iENTRCBGM++8iScsXG5cdFx0XHRcdFx0XHQn5L6G5rqQ5LiN5piO5LiU5pyq55+l6JGX5L2c5qyK5oiW6JGX5L2c5qyK54Sh5rOV6KKr5p+l6K2J77yIQ1NEIEYz77yJJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dmFsdWU6ICdubyBzb3VyY2Ugbm8gbGljZW5zZScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+acrOaWh+S7tuW5tuacquazqOaYjuWOn+Wni+WHuuWkhO+8jOS4lOacrOaWh+S7tue8uuWwkeiRl+S9nOadg+S/oeaBr+aIluWjsOensOeahOiRl+S9nOadg+S/oeaBr+aXoOazleiiq+afpeivgScsXG5cdFx0XHRcdFx0XHQn5pys5qqU5qGI5Lim5pyq6Ki75piO5Y6f5aeL5Ye66JmV77yM5LiU5pys5qqU5qGI57y65bCR6JGX5L2c5qyK6LOH6KiK5oiW6IGy56ix55qE6JGX5L2c5qyK6LOH6KiK54Sh5rOV6KKr5p+l6K2JJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj6/ooqvmm7/ku6PnmoTpnZ7oh6rnlLHokZfkvZzmnYPmlofku7bvvIhDU0QgRjTvvIknLCAn5Y+v6KKr5pu/5Luj55qE6Z2e6Ieq55Sx6JGX5L2c5qyK5qqU5qGI77yIQ1NEIEY077yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdyZXBsYWNlYWJsZSBmYWlyIHVzZScsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aWh+S7tuS7heeUqOS6juaPj+i/sOOAgeivhuWIq+aIluivhOiuuuaWh+S7tuS4reWxleekuueahOS6i+eJqe+8jOaIluS7heeUqOS9nOaPkuWbvu+8jOS4lOa7oei2s+S7peS4i+Wbm+S4quadoeS7tuS5i+S4gOOAguiLpee7meWHuuS6huWFtuS7luWQiOeQhuS9v+eUqOS+neaNru+8jOS4jemAgueUqOacrOadoeOAguWmguWvueaWh+S7tueahOWPr+abv+S7o+aAp+WtmOWcqOS6ieiuru+8jOW6lOS6pOaWh+S7tuWtmOW6n+iuqOiuuuWkhOeQhuOAguacrOadoeS5n+S4jemAgueUqOS6juato+WcqOaIluabvue7j+eUseaWh+S7tuWtmOW6n+iuqOiuuuWkhOeQhui/h+eahOaWh+S7tuOAgicsXG5cdFx0XHRcdFx0XHQn5qqU5qGI5YOF55So5pa85o+P6L+w44CB6L6o6K2Y5oiW6KmV6KuW5qqU5qGI5Lit5bGV56S655qE5LqL54mp77yM5oiW5YOF55So5L2c5o+S5ZyW77yM5LiU5ru/6Laz5Lul5LiL5Zub5YCL5qKd5Lu25LmL5LiA44CC6Iul57Wm5Ye65LqG5YW25LuW5ZCI55CG5L2/55So5L6d5pOa77yM5LiN6YGp55So5pys5qKd44CC5aaC5bCN5qqU5qGI55qE5Y+v5pu/5Luj5oCn5a2Y5Zyo54it6K2w77yM5oeJ5Lqk5qqU5qGI5a2Y5bui6KiO6KuW6JmV55CG44CC5pys5qKd5Lmf5LiN6YGp55So5pa85q2j5Zyo5oiW5pu+57aT55Sx5qqU5qGI5a2Y5bui6KiO6KuW6JmV55CG6YGO55qE5qqU5qGI44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0c3ViZ3JvdXA6IHtcblx0XHRcdFx0XHRcdG5hbWU6ICdmNF90eXBlJyxcblx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCC55So57G75Z6L77yaJywgJ+mBqeeUqOmhnuWIpe+8micpLFxuXHRcdFx0XHRcdFx0c3R5bGU6ICd3aWR0aDogODUlOycsXG5cdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fpgInmi6knLCAn6KuL6YG45pOHJyksXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfmnInlhbbku5boh6rnlLHokZfkvZzmnYPmlofku7blsZXnpLrnm7jlkIznmoTkuovniaknLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+acieWFtuS7luiHqueUseiRl+S9nOasiuaqlOahiOWxleekuuebuOWQjOeahOS6i+eJqSdcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnMScsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+aWh+S7tuaPj+i/sOeahOaYr+WcqOS4luaIluWBh+WumuWcqOS4luS6uueJqeOAgeS7jeeEtuWtmOWcqOeahOW7uuetkeOAgeWupOWklumbleWhkeaIluS7jeeEtuWcqOWUrueahOWVhuWTge+8jOS4lOmihOiuoeiHquihjOaLjeaRhOeahOeFp+eJh+S4jeWPl+S7luS6uuiRl+S9nOadg+S/neaKpCcsXG5cdFx0XHRcdFx0XHRcdFx0XHQn5qqU5qGI5o+P6L+w55qE5piv5Zyo5LiW5oiW5YGH5a6a5Zyo5LiW5Lq654mp44CB5LuN54S25a2Y5Zyo55qE5bu656+J44CB5a6k5aSW6ZuV5aGR5oiW5LuN54S25Zyo5ZSu55qE5ZWG5ZOB77yM5LiU6aCQ6KiI6Ieq6KGM5ouN5pSd55qE55u454mH5LiN5Y+X5LuW5Lq66JGX5L2c5qyK5L+d6K23J1xuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICcyJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aWh+S7tuS4uuWPr+iHquihjOe7mOWItueahOWcsOWbvuaIluWbvuihqCcsICfmqpTmoYjngrrlj6/oh6rooYznuaroo73nmoTlnLDlnJbmiJblnJbooagnKSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJzMnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfmlofku7bmnaXoh6rllYbkuJrlm77niYfmnLrmnoTvvIjlpoJHZXR0ee+8iScsXG5cdFx0XHRcdFx0XHRcdFx0XHQn5qqU5qGI5L6G6Ieq5ZWG5qWt5ZyW54mH5qmf5qeL77yI5aaCR2V0dHnvvIknXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJzQnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmsqHmnInooqvmnaHnm67kvb/nlKjnmoTpnZ7oh6rnlLHokZfkvZzmnYPmlofku7bvvIhDU0QgRjXvvIknLFxuXHRcdFx0XHRcdFx0J+aykuacieiiq+aineebruS9v+eUqOeahOmdnuiHqueUseiRl+S9nOasiuaqlOahiO+8iENTRCBGNe+8iSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiAnb3JwaGFuZWQgZmFpciB1c2UnLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmnKzmlofku7bkuLrpnZ7oh6rnlLHokZfkvZzmnYPkuJTmsqHmnInooqvmnaHnm67kvb/nlKgnLFxuXHRcdFx0XHRcdFx0J+acrOaqlOahiOeCuumdnuiHqueUseiRl+S9nOasiuS4lOaykuacieiiq+aineebruS9v+eUqCdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmsqHmnInloavlhpnku7vkvZXlkIjnkIbkvb/nlKjkvp3mja7nmoTpnZ7oh6rnlLHokZfkvZzmnYPmlofku7bvvIhDU0QgRjXvvIknLFxuXHRcdFx0XHRcdFx0J+aykuacieWhq+Wvq+S7u+S9leWQiOeQhuS9v+eUqOS+neaTmueahOmdnuiHqueUseiRl+S9nOasiuaqlOahiO+8iENTRCBGNe+8iSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm8gZmFpciB1c2UgcmF0aW9uYWxlJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5LiN6YCC55So5LqO5pyJ5LqJ6K6u5L2G5a6M5pW055qE5ZCI55CG5L2/55So5L6d5o2u44CC6Iul6Z2e6Ieq55Sx6JGX5L2c5p2D5paH5Lu25Y+q5pyJ6YOo5YiG5p2h55uu55qE5L2/55So5L6d5o2u77yM5L2G5ZCM5pe26KKr5L2/55So5LqO5pyq5o+Q5L6b5ZCI55CG5L2/55So5L6d5o2u55qE5p2h55uu77yM5YiZ5pys5p2h5L6L5Lmf5LiN6YCC55So44CCJyxcblx0XHRcdFx0XHRcdCfkuI3pgannlKjmlrzmnInniK3orbDkvYblrozmlbTnmoTlkIjnkIbkvb/nlKjkvp3mk5rjgILoi6XpnZ7oh6rnlLHokZfkvZzmrIrmqpTmoYjlj6rmnInpg6jliIbmop3nm67nmoTkvb/nlKjkvp3mk5rvvIzkvYblkIzmmYLooqvkvb/nlKjmlrzmnKrmj5DkvpvlkIjnkIbkvb/nlKjkvp3mk5rnmoTmop3nm67vvIzliYfmnKzmop3kvovkuZ/kuI3pgannlKjjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0Ly8gV2UgbXVzdCBpbml0IHRoZSBwYXJhbWV0ZXJzXG5cdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0cmVzdWx0LnR5cGVbMF0uZGlzcGF0Y2hFdmVudChldnQpO1xuXHR9O1xuXHRUd2lua2xlLmltYWdlLmNhbGxiYWNrLmV2YWx1YXRlID0gKGV2ZW50KSA9PiB7XG5cdFx0bGV0IHR5cGU7XG5cdFx0bGV0IG5vdGlmeSA9IGV2ZW50LnRhcmdldC5ub3RpZnkuY2hlY2tlZDtcblx0XHRjb25zdCB0eXBlcyA9IGV2ZW50LnRhcmdldC50eXBlO1xuXHRcdGZvciAoY29uc3QgdHlwZV8gb2YgdHlwZXMpIHtcblx0XHRcdGlmICh0eXBlXy5jaGVja2VkKSB7XG5cdFx0XHRcdHR5cGUgPSB0eXBlXy52YWx1ZXM7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsZXQgY3NkY3JpdDtcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgJ25vIHNvdXJjZSc6XG5cdFx0XHRcdGNzZGNyaXQgPSAnZjMnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ25vIGxpY2Vuc2UnOlxuXHRcdFx0XHRjc2Rjcml0ID0gJ2YzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdubyBzb3VyY2Ugbm8gbGljZW5zZSc6XG5cdFx0XHRcdGNzZGNyaXQgPSAnZjMnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ29ycGhhbmVkIGZhaXIgdXNlJzpcblx0XHRcdFx0Y3NkY3JpdCA9ICdmNSc7XG5cdFx0XHRcdG5vdGlmeSA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ25vIHBlcm1pc3Npb24nOlxuXHRcdFx0XHRjc2Rjcml0ID0gJ2YxJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdubyBmYWlyIHVzZSByYXRpb25hbGUnOlxuXHRcdFx0XHRjc2Rjcml0ID0gJ2Y1Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyZXBsYWNlYWJsZSBmYWlyIHVzZSc6XG5cdFx0XHRcdGNzZGNyaXQgPSAnZjQnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVHdpbmtsZS5pbWFnZS5jYWxsYmFjay5ldmFsdWF0Ze+8muacquefpeadoeasvicpO1xuXHRcdH1cblx0XHRjb25zdCBsb2dub21pbmF0aW9uID1cblx0XHRcdFR3aW5rbGUuZ2V0UHJlZignbG9nU3BlZWR5Tm9taW5hdGlvbnMnKSAmJlxuXHRcdFx0IVR3aW5rbGUuZ2V0UHJlZignbm9Mb2dPblNwZWVkeU5vbWluYXRpb24nKS5pbmNsdWRlcyhjc2Rjcml0LnRvTG93ZXJDYXNlKCkpO1xuXHRcdGNvbnN0IHRlbXBsYXRlbmFtZSA9IHR5cGU7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0dHlwZSxcblx0XHRcdHRlbXBsYXRlbmFtZSxcblx0XHRcdG5vcm1hbGl6ZWQ6IGNzZGNyaXQsXG5cdFx0XHRsb2dub21pbmF0aW9uLFxuXHRcdH07XG5cdFx0aWYgKGNzZGNyaXQgPT09ICdmMScpIHtcblx0XHRcdHBhcmFtcy5mMV9zb3VyY2UgPSBldmVudC50YXJnZXRbJ3R5cGUuZjFfc291cmNlJ10udmFsdWU7XG5cdFx0fVxuXHRcdGlmIChjc2Rjcml0ID09PSAnZjQnKSB7XG5cdFx0XHRjb25zdCBmNF90eXBlID0gZXZlbnQudGFyZ2V0Wyd0eXBlLmY0X3R5cGUnXS52YWx1ZTtcblx0XHRcdGlmICghZjRfdHlwZSkge1xuXHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCdDU0QgRjTvvJror7fpgInmi6npgILnlKjnsbvlnovjgIInLCAnQ1NEIEY077ya6KuL6YG45pOH6YGp55So6aGe5Yil44CCJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWltYWdlJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHBhcmFtcy5mNF90eXBlID0gZjRfdHlwZTtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChldmVudC50YXJnZXQpO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5qCH6K6w5a6M5oiQJywgJ+aomeiomOWujOaIkCcpO1xuXHRcdC8vIFRhZ2dpbmcgaW1hZ2Vcblx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0d2luZG93LndnVUxTKCfliqDlhaXliKDpmaTmoIforrAnLCAn5Yqg5YWl5Yiq6Zmk5qiZ6KiYJylcblx0XHQpO1xuXHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHR5c2FyY2hpdmVzX3BhZ2UubG9hZChUd2lua2xlLmltYWdlLmNhbGxiYWNrcy50YWdnaW5nSW1hZ2UpO1xuXHRcdC8vIE5vdGlmeWluZyB1cGxvYWRlclxuXHRcdGlmIChub3RpZnkpIHtcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5sb29rdXBDcmVhdGlvbihUd2lua2xlLmltYWdlLmNhbGxiYWNrcy51c2VyTm90aWZpY2F0aW9uKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYWRkIHRvIENTRCBsb2cgaWYgZGVzaXJlZFxuXHRcdFx0aWYgKGxvZ25vbWluYXRpb24pIHtcblx0XHRcdFx0cGFyYW1zLmZyb21ESSA9IHRydWU7XG5cdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy51c2VyLmFkZFRvTG9nKHBhcmFtcywgbnVsbCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBObyBhdXRvLW5vdGlmaWNhdGlvbiwgZGlzcGxheSB3aGF0IHdhcyBnb2luZyB0byBiZSBhZGRlZC5cblx0XHRcdGlmICh0eXBlICE9PSAnb3JwaGFuZWQgZmFpciB1c2UnKSB7XG5cdFx0XHRcdGNvbnN0IG5vdGVEYXRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG5cdFx0XHRcdG5vdGVEYXRhLmFwcGVuZENoaWxkKFxuXHRcdFx0XHRcdGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuXHRcdFx0XHRcdFx0J3t7Jy5jb25jYXQoJ3N1YnN0OicsIGBVcGxvYWR2aW9ub3RpY2V8JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19fX0tLX5+YCwgJ35+Jylcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKFxuXHRcdFx0XHRcdCfmj5DnpLonLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFsn6L+Z5Lqb5YaF5a655bqU6LS06L+b5LiK5Lyg6ICF5a+56K+d6aG177yaJywgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSwgbm90ZURhdGFdLFxuXHRcdFx0XHRcdFx0WyfpgJnkupvlhaflrrnmh4nosrzpgLLkuIrlgrPogIXoqI7oq5bpoIHvvJonLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpLCBub3RlRGF0YV1cblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmltYWdlLmNhbGxiYWNrcyA9IHtcblx0XHR0YWdnaW5nSW1hZ2U6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRsZXQgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHQvLyByZW1vdmUgdGFnIC0gZGVsZXRpb24tdGFnZ2VkIGZpbGVzIGNhbm5vdCBiZSBtb3ZlZFxuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0L1xce1xceyhtdGN8KGNvcHkgfG1vdmUgKT90byA/KHNoYXJlfGNvbW1vbnMpfG1vdmUgdG8gKHlzYXJjaGl2ZXMgc2hhcmV8d2lraW1lZGlhIGNvbW1vbnMpfGNvcHkgdG8gKHlzYXJjaGl2ZXMgc2hhcmV8d2lraW1lZGlhIGNvbW1vbnMpKVtefV0qXFx9XFx9L2dpLFxuXHRcdFx0XHQnJ1xuXHRcdFx0KTtcblx0XHRcdC8vIEFkZGluZyBkaXNjdXNzaW9uXG5cdFx0XHRpZiAocGFyYW1zLnR5cGUgIT09ICdvcnBoYW5lZCBmYWlyIHVzZScpIHtcblx0XHRcdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHQnTElCX3RhbGs65a2Y5bqf6K6o6K66L+aWh+S7tuW/q+mAn+WIoOmZpOaPkOaKpScsXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfliqDlhaXlv6vpgJ/liKDpmaTorrDlvZXpobknLCAn5Yqg5YWl5b+r6YCf5Yiq6Zmk6KiY6YyE6aCFJylcblx0XHRcdFx0KTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5sb2FkKFR3aW5rbGUuaW1hZ2UuY2FsbGJhY2tzLmltYWdlTGlzdCk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgdGFnID0gJyc7XG5cdFx0XHRzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ29ycGhhbmVkIGZhaXIgdXNlJzpcblx0XHRcdFx0XHR0YWcgPSAne3snLmNvbmNhdCgnc3Vic3Q6JywgJ29ycGhhbmVkIGZhaXIgdXNlfX1cXG4nKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbm8gcGVybWlzc2lvbic6XG5cdFx0XHRcdFx0dGFnID0gJ3t7Jy5jb25jYXQoXG5cdFx0XHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0XHRcdGAke3BhcmFtcy50ZW1wbGF0ZW5hbWV9L2F1dG98MT0ke3BhcmFtcy5mMV9zb3VyY2Vcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL2h0dHAvZywgJyYjMTA0O3R0cCcpXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXG4rL2csICdcXG4nKVxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXlxccyooW14qXSkvZ20sICcqICQxJylcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL15cXCogJC9tLCAnJyl9fX1cXG5gXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncmVwbGFjZWFibGUgZmFpciB1c2UnOlxuXHRcdFx0XHRcdHRhZyA9ICd7eycuY29uY2F0KCdzdWJzdDonLCBgJHtwYXJhbXMudGVtcGxhdGVuYW1lfS9hdXRvfDE9JHtwYXJhbXMuZjRfdHlwZX19fVxcbmApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRhZyA9ICd7eycuY29uY2F0KCdzdWJzdDonLCBgJHtwYXJhbXMudGVtcGxhdGVuYW1lfS9hdXRvfX1cXG5gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNvbnN0IHRleHROb1NkID0gdGV4dC5yZXBsYWNlKFxuXHRcdFx0XHQvXFx7XFx7XFxzKihkYigtXFx3Kik/fGR8ZGVsZXRlfCg/Omhhbmd8aG9sZClbLSBdP29uKVxccyooXFx8KD86XFx7XFx7W157fV0qXFx9XFx9fFtee31dKSopP1xcfVxcfVxccyovZ2ksXG5cdFx0XHRcdCcnXG5cdFx0XHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0ZXh0ICE9PSB0ZXh0Tm9TZCAmJlxuXHRcdFx0XHRjb25maXJtKHdpbmRvdy53Z1VMUygn5Zyo6aG16Z2i5LiK5om+5Yiw5b+r6YCf5Yig6Zmk5qih5p2/77yM6KaB56e76Zmk5ZCX77yfJywgJ+WcqOmggemdouS4iuaJvuWIsOW/q+mAn+WIqumZpOaooeadv++8jOimgeenu+mZpOWXju+8nycpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRleHQgPSB0ZXh0Tm9TZDtcblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGFnICsgdGV4dCk7XG5cdFx0XHRsZXQgZWRpdFN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+ivt+axguW/q+mAn+WIoOmZpO+8iCcsICfoq4vmsYLlv6vpgJ/liKrpmaTvvIgnKTtcblx0XHRcdGVkaXRTdW1tYXJ5ICs9IGBbW0xJQjpDU0QjJHtwYXJhbXMubm9ybWFsaXplZC50b1VwcGVyQ2FzZSgpfXxDU0QgJHtwYXJhbXMubm9ybWFsaXplZC50b1VwcGVyQ2FzZSgpfV1dYDtcblx0XHRcdGVkaXRTdW1tYXJ5ICs9ICfvvIknO1xuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShlZGl0U3VtbWFyeSk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignZGVsaVdhdGNoUGFnZScpKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdub2NyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5zYXZlKCk7XG5cdFx0fSxcblx0XHR1c2VyTm90aWZpY2F0aW9uOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGNvbnN0IGluaXRpYWxDb250cmliID0gcGFnZW9iai5nZXRDcmVhdG9yKCk7XG5cdFx0XHQvLyBkaXNhbGxvdyB3YXJuaW5nIHlvdXJzZWxmXG5cdFx0XHRpZiAoaW5pdGlhbENvbnRyaWIgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkge1xuXHRcdFx0XHRwYWdlb2JqXG5cdFx0XHRcdFx0LmdldFN0YXR1c0VsZW1lbnQoKVxuXHRcdFx0XHRcdC53YXJuKGDmgqjvvIgke2luaXRpYWxDb250cmlife+8iSR7d2luZG93LndnVUxTKCfliJvlu7rkuobor6XpobXvvIzot7Pov4fpgJrnn6UnLCAn5bu656uL5LqG6Kmy6aCB77yM6Lez6YGO6YCa55+lJyl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB0YWxrUGFnZU5hbWUgPSBgVXNlciB0YWxrOiR7aW5pdGlhbENvbnRyaWJ9YDtcblx0XHRcdFx0Y29uc3QgdXNlcnRhbGtwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHR0YWxrUGFnZU5hbWUsXG5cdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfpgJrnn6XkuIrkvKDogIUnLCAn6YCa55+l5LiK5YKz6ICFJyl977yIJHtpbml0aWFsQ29udHJpYn3vvIlgXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IG5vdGlmeXRleHQgPSAnXFxue3snLmNvbmNhdChcblx0XHRcdFx0XHQnc3Vic3Q6Jyxcblx0XHRcdFx0XHRgRGktJHtwYXJhbXMudGVtcGxhdGVuYW1lfS1ub3RpY2V8MT0ke01vcmViaXRzLnBhZ2VOYW1lTm9ybX19fS0tfn5gLFxuXHRcdFx0XHRcdCd+fidcblx0XHRcdFx0KTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEFwcGVuZFRleHQobm90aWZ5dGV4dCk7XG5cdFx0XHRcdHVzZXJ0YWxrcGFnZS5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+mAmuefpe+8muaWh+S7tltbJywgJ+mAmuefpe+8muaqlOahiFtbJykgK1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMucGFnZU5hbWVOb3JtICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnXV3lv6vpgJ/liKDpmaTmj5DlkI0nLCAnXV3lv6vpgJ/liKrpmaTmj5DlkI0nKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0XHR1c2VydGFsa3BhZ2Uuc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignZGVsaVdhdGNoVXNlcicpKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0dXNlcnRhbGtwYWdlLmFwcGVuZCgpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gYWRkIHRoaXMgbm9taW5hdGlvbiB0byB0aGUgdXNlcidzIHVzZXJzcGFjZSBsb2csIGlmIHRoZSB1c2VyIGhhcyBlbmFibGVkIGl0XG5cdFx0XHRpZiAocGFyYW1zLmxvZ25vbWluYXRpb24pIHtcblx0XHRcdFx0cGFyYW1zLmZyb21ESSA9IHRydWU7XG5cdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy51c2VyLmFkZFRvTG9nKHBhcmFtcywgaW5pdGlhbENvbnRyaWIpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aW1hZ2VMaXN0OiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdC8vIGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KGAke3RleHR9XFxuKiBbWzoke01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXS0tfn5gLmNvbmNhdCgnfn4nKSk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KGDliqDlhaVbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dYCk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5zYXZlKCk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5pbWFnZSwgJ2ltYWdlJyk7XG59KSgpO1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQge2luaXRNd0FwaX0gZnJvbSAnZXh0LmdhZGdldC5VdGlsJztcblxuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlcHJvdGVjdC5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVwcm90ZWN0KCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdC8qKlxuXHQgKiB0d2lua2xlcHJvdGVjdC5qczogUHJvdGVjdC9SUFAgbW9kdWxlXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogVGFiIChcIlBQXCIvXCJSUFBcIilcblx0ICogQWN0aXZlIG9uOiBOb24tc3BlY2lhbCwgbm9uLU1lZGlhV2lraSBwYWdlc1xuXHQgKi9cblx0Ly8gTm90ZTogYSBsb3Qgb2YgY29kZSBpbiB0aGlzIG1vZHVsZSBpcyByZS11c2VkL2NhbGxlZCBieSBiYXRjaHByb3RlY3QuXG5cdFR3aW5rbGUucHJvdGVjdCA9ICgpID0+IHtcblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA8IDAgfHwgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gOCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLFxuXHRcdFx0d2luZG93LndnVUxTKCfkv53miqQnLCAn5L+d6K23JyksXG5cdFx0XHQndHctcnBwJyxcblx0XHRcdE1vcmViaXRzLnVzZXJJc1N5c29wID8gd2luZG93LndnVUxTKCfkv53miqTpobXpnaInLCAn5L+d6K236aCB6Z2iJykgOiB3aW5kb3cud2dVTFMoJ+ivt+axguS/neaKpOmhtemdoicsICfoq4vmsYLkv53orbfpoIHpnaInKVxuXHRcdCk7XG5cdH07XG5cdFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYyMCwgNTMwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUoXG5cdFx0XHRNb3JlYml0cy51c2VySXNTeXNvcFxuXHRcdFx0XHQ/IHdpbmRvdy53Z1VMUygn5pa96KGM5oiW6K+35rGC5L+d5oqk6aG16Z2iJywgJ+aWveihjOaIluiri+axguS/neitt+mggemdoicpXG5cdFx0XHRcdDogd2luZG93LndnVUxTKCfor7fmsYLkv53miqTpobXpnaInLCAn6KuL5rGC5L+d6K236aCB6Z2iJylcblx0XHQpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCfkv53miqTmnaHkvosnLCAn5L+d6K235qKd5L6LJyksICdMSUI6UFJPVCcpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5L+d5oqk6K6+572uJywgJ+S/neitt+ioreWumicpLCAnSDpUVy9QUkVGI3Byb3RlY3QnKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ1R3aW5rbGXluK7liqknLCAnVHdpbmtsZeiqquaYjicpLCAnSDpUVy9ET0MjcHJvdGVjdCcpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Y29uc3QgYWN0aW9uZmllbGQgPSBmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pON5L2c57G75Z6LJywgJ+aTjeS9nOmhnuWIpScpLFxuXHRcdH0pO1xuXHRcdGlmIChNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0YWN0aW9uZmllbGQuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ3JhZGlvJyxcblx0XHRcdFx0bmFtZTogJ2FjdGlvbnR5cGUnLFxuXHRcdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmNoYW5nZUFjdGlvbixcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S/neaKpOmhtemdoicsICfkv53orbfpoIHpnaInKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAncHJvdGVjdCcsXG5cdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YWN0aW9uZmllbGQuYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdyYWRpbycsXG5cdFx0XHRuYW1lOiAnYWN0aW9udHlwZScsXG5cdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmNoYW5nZUFjdGlvbixcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+ivt+axguS/neaKpOmhtemdoicsICfoq4vmsYLkv53orbfpoIHpnaInKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3JlcXVlc3QnLFxuXHRcdFx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+iLpeaCqOaDs+WcqExJQjpSRlBQ6K+35rGC5L+d5oqk5q2k6aG1JywgJ+iLpeaCqOaDs+WcqExJQjpSRlBQ6KuL5rGC5L+d6K235q2k6aCBJykgK1xuXHRcdFx0XHRcdFx0KE1vcmViaXRzLnVzZXJJc1N5c29wID8gJ+iAjOS4jeaYr+iHquihjOWujOaIkOOAgicgOiAn44CCJyksXG5cdFx0XHRcdFx0Y2hlY2tlZDogIU1vcmViaXRzLnVzZXJJc1N5c29wLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn55So5L+d5oqk5qih5p2/5qCH6K6w5q2k6aG1JywgJ+eUqOS/neitt+aooeadv+aomeiomOatpOmggScpLFxuXHRcdFx0XHRcdHZhbHVlOiAndGFnJyxcblx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WPr+S7peeUqOatpOS4uumhtemdouWKoOS4iuWQiOmAgueahOS/neaKpOaooeadv+OAgicsICflj6/ku6XnlKjmraTngrrpoIHpnaLliqDkuIrlkIjpgannmoTkv53orbfmqKHmnb/jgIInKSxcblx0XHRcdFx0XHRkaXNhYmxlZDogbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSA9PT0gMCB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VDb250ZW50TW9kZWwnKSA9PT0gJ1NjcmlidW50bycsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqQnLCAn6aCQ6KitJyksXG5cdFx0XHRuYW1lOiAnZmllbGRfcHJlc2V0Jyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0bGFiZWw6ICcxJyxcblx0XHRcdG5hbWU6ICdmaWVsZDEnLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdmaWVsZCcsXG5cdFx0XHRsYWJlbDogJzInLFxuXHRcdFx0bmFtZTogJ2ZpZWxkMicsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0Ly8gV2UgbXVzdCBpbml0IHRoZSBjb250cm9sc1xuXHRcdGNvbnN0IGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXHRcdGV2dC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xuXHRcdHJlc3VsdC5hY3Rpb250eXBlWzBdLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHQvLyBnZXQgY3VycmVudCBwcm90ZWN0aW9uIGxldmVsIGFzeW5jaHJvbm91c2x5XG5cdFx0VHdpbmtsZS5wcm90ZWN0LmZldGNoUHJvdGVjdGlvbkxldmVsKCk7XG5cdH07XG5cdC8vIEN1c3RvbWl6YWJsZSBuYW1lc3BhY2UgYW5kIEZsYWdnZWRSZXZzIHNldHRpbmdzXG5cdC8vIEluIHRoZW9yeSBpdCdkIGJlIG5pY2UgdG8gaGF2ZSByZXN0cmljdGlvbmxldmVscyBkZWZpbmVkIGhlcmUsXG5cdC8vIGJ1dCB0aG9zZSBhcmUgb25seSBhdmFpbGFibGUgdmlhIGEgc2l0ZWluZm8gcXVlcnlcblx0Ly8gTGltaXQgdGVtcGxhdGUgZWRpdG9yOyBhIFR3aW5rbGUgcmVzdHJpY3Rpb24sIG5vdCBhIHNpdGUgc2V0dGluZ1xuXHRjb25zdCBpc1RlbXBsYXRlID0gbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMTAgfHwgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gODI4O1xuXHQvLyBDb250YWlucyB0aGUgY3VycmVudCBwcm90ZWN0aW9uIGxldmVsIGluIGFuIG9iamVjdFxuXHQvLyBPbmNlIGZpbGxlZCwgaXQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlOlxuXHQvLyB7IGVkaXQ6IHsgbGV2ZWw6IFwic3lzb3BcIiwgZXhwaXJ5OiA8c29tZSBkYXRlPiwgY2FzY2FkZTogdHJ1ZSB9LCAuLi4gfVxuXHRUd2lua2xlLnByb3RlY3QuY3VycmVudFByb3RlY3Rpb25MZXZlbHMgPSB7fTtcblx0VHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxldmVscyA9IHt9O1xuXHRUd2lua2xlLnByb3RlY3QuZmV0Y2hQcm90ZWN0aW9uTGV2ZWwgPSBhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgYXBpID0gaW5pdE13QXBpKCdtb3JlYml0cy5qczsgVHdpbmtsZS8xLjEnKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0XHRmb3JtYXQ6ICdqc29uJyxcblx0XHRcdFx0aW5kZXhwYWdlaWRzOiB0cnVlLFxuXHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdGxpc3Q6ICdsb2dldmVudHMnLFxuXHRcdFx0XHRsZXR5cGU6ICdwcm90ZWN0Jyxcblx0XHRcdFx0bGV0aXRsZTogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRwcm9wOiAnaW5mbycsXG5cdFx0XHRcdGlucHJvcDogJ3Byb3RlY3Rpb258d2F0Y2hlZCcsXG5cdFx0XHRcdHRpdGxlczogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHByb3RlY3REYXRhID0gYXdhaXQgYXBpLmdldChwYXJhbXMpO1xuXHRcdFx0Y29uc3QgW3BhZ2VpZF0gPSBwcm90ZWN0RGF0YS5xdWVyeS5wYWdlaWRzO1xuXHRcdFx0Y29uc3QgcGFnZSA9IHByb3RlY3REYXRhLnF1ZXJ5LnBhZ2VzW3BhZ2VpZF07XG5cdFx0XHRjb25zdCBjdXJyZW50ID0ge307XG5cdFx0XHRjb25zdCBwcmV2aW91cyA9IHt9O1xuXHRcdFx0Ly8gU2F2ZSByZXF1ZXN0ZWQgcGFnZSdzIHdhdGNoZWQgc3RhdHVzIGZvciBsYXRlciBpbiBjYXNlIG5lZWRlZCB3aGVuIGZpbGluZyByZXF1ZXN0XG5cdFx0XHRUd2lua2xlLnByb3RlY3Qud2F0Y2hlZCA9IHBhZ2Uud2F0Y2hsaXN0ZXhwaXJ5IHx8IHBhZ2Uud2F0Y2hlZCA9PT0gJyc7XG5cdFx0XHRmb3IgKGNvbnN0IHByb3RlY3Rpb24gb2YgcGFnZS5wcm90ZWN0aW9uKSB7XG5cdFx0XHRcdGlmIChwcm90ZWN0aW9uLnR5cGUgIT09ICdhZnQnKSB7XG5cdFx0XHRcdFx0Y3VycmVudFtwcm90ZWN0aW9uLnR5cGVdID0ge1xuXHRcdFx0XHRcdFx0bGV2ZWw6IHByb3RlY3Rpb24ubGV2ZWwsXG5cdFx0XHRcdFx0XHRleHBpcnk6IHByb3RlY3Rpb24uZXhwaXJ5LFxuXHRcdFx0XHRcdFx0Y2FzY2FkZTogcHJvdGVjdGlvbi5jYXNjYWRlID09PSAnJyxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBPbmx5IHVzZSB0aGUgbG9nIGV4Y2VwdCB1bnByb3RlY3Rcblx0XHRcdGlmIChwcm90ZWN0RGF0YS5xdWVyeS5sb2dldmVudHMubGVuZ3RoID49IDEgJiYgcHJvdGVjdERhdGEucXVlcnkubG9nZXZlbnRzWzBdLmFjdGlvbiAhPT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0W1R3aW5rbGUucHJvdGVjdC5wcmV2aW91c1Byb3RlY3Rpb25Mb2ddID0gcHJvdGVjdERhdGEucXVlcnkubG9nZXZlbnRzO1xuXHRcdFx0fSBlbHNlIGlmIChwcm90ZWN0RGF0YS5xdWVyeS5sb2dldmVudHMubGVuZ3RoID49IDIpIHtcblx0XHRcdFx0WywgVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZ10gPSBwcm90ZWN0RGF0YS5xdWVyeS5sb2dldmVudHM7XG5cdFx0XHR9XG5cdFx0XHRpZiAoVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZykge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3RlY3Rpb24gb2YgVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZy5wYXJhbXMuZGV0YWlscykge1xuXHRcdFx0XHRcdGlmIChwcm90ZWN0aW9uLnR5cGUgIT09ICdhZnQnKSB7XG5cdFx0XHRcdFx0XHRwcmV2aW91c1twcm90ZWN0aW9uLnR5cGVdID0ge1xuXHRcdFx0XHRcdFx0XHRsZXZlbDogcHJvdGVjdGlvbi5sZXZlbCxcblx0XHRcdFx0XHRcdFx0ZXhwaXJ5OiBwcm90ZWN0aW9uLmV4cGlyeSxcblx0XHRcdFx0XHRcdFx0Y2FzY2FkZTogcHJvdGVjdGlvbi5jYXNjYWRlID09PSAnJyxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBzaG93IHRoZSBwcm90ZWN0aW9uIGxldmVsIGFuZCBsb2cgaW5mb1xuXHRcdFx0VHdpbmtsZS5wcm90ZWN0Lmhhc1Byb3RlY3RMb2cgPSAhIXByb3RlY3REYXRhLnF1ZXJ5LmxvZ2V2ZW50cy5sZW5ndGg7XG5cdFx0XHRUd2lua2xlLnByb3RlY3QuY3VycmVudFByb3RlY3Rpb25MZXZlbHMgPSBjdXJyZW50O1xuXHRcdFx0VHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxldmVscyA9IHByZXZpb3VzO1xuXHRcdFx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLnNob3dMb2dBbmRDdXJyZW50UHJvdGVjdEluZm8oKTtcblx0XHR9IGNhdGNoIHt9XG5cdH07XG5cdFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5zaG93TG9nQW5kQ3VycmVudFByb3RlY3RJbmZvID0gKCkgPT4ge1xuXHRcdGNvbnN0IGN1cnJlbnRseVByb3RlY3RlZCA9IE9iamVjdC5rZXlzKFR3aW5rbGUucHJvdGVjdC5jdXJyZW50UHJvdGVjdGlvbkxldmVscykubGVuZ3RoICE9PSAwO1xuXHRcdGlmIChUd2lua2xlLnByb3RlY3QuaGFzUHJvdGVjdExvZyB8fCBUd2lua2xlLnByb3RlY3QuaGFzU3RhYmxlTG9nKSB7XG5cdFx0XHRjb25zdCAkbGlua01hcmt1cCA9ICQoJzxzcGFuPicpO1xuXHRcdFx0aWYgKFR3aW5rbGUucHJvdGVjdC5oYXNQcm90ZWN0TG9nKSB7XG5cdFx0XHRcdCRsaW5rTWFya3VwLmFwcGVuZChcblx0XHRcdFx0XHQkKFxuXHRcdFx0XHRcdFx0YDxhIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoJ1NwZWNpYWw6TG9nJywge1xuXHRcdFx0XHRcdFx0XHRhY3Rpb246ICd2aWV3Jyxcblx0XHRcdFx0XHRcdFx0cGFnZTogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAncHJvdGVjdCcsXG5cdFx0XHRcdFx0XHR9KX1cIj4ke3dpbmRvdy53Z1VMUygn5L+d5oqk5pel5b+XJywgJ+S/neitt+aXpeiqjCcpfTwvYT5gXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuaGFzU3RhYmxlTG9nID8gJCgnPHNwYW4+JykuaHRtbCgnICZidWxsOyAnKSA6IG51bGxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KCRib2R5LmZpbmQoJ2RpdltuYW1lPVwiaGFzcHJvdGVjdGxvZ1wiXSBzcGFuJylbMF0pO1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdGN1cnJlbnRseVByb3RlY3RlZFxuXHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCflhYjliY3kv53miqQnLCAn5YWI5YmN5L+d6K23Jylcblx0XHRcdFx0XHQ6IFtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmraTpobXpnaLmm77lnKgnLCAn5q2k6aCB6Z2i5pu+5ZyoJyksXG5cdFx0XHRcdFx0XHRcdCQoXG5cdFx0XHRcdFx0XHRcdFx0YDxiPiR7bmV3IE1vcmViaXRzLmRhdGUoVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxvZy50aW1lc3RhbXApLmNhbGVuZGFyKFxuXHRcdFx0XHRcdFx0XHRcdFx0J3V0Yydcblx0XHRcdFx0XHRcdFx0XHQpfTwvYj5gXG5cdFx0XHRcdFx0XHRcdClbMF0sXG5cdFx0XHRcdFx0XHRcdGDooqske1R3aW5rbGUucHJvdGVjdC5wcmV2aW91c1Byb3RlY3Rpb25Mb2cudXNlcn0ke3dpbmRvdy53Z1VMUygn5L+d5oqkJywgJ+S/neittycpfe+8mmAsXG5cdFx0XHRcdFx0XHRcdC4uLlR3aW5rbGUucHJvdGVjdC5mb3JtYXRQcm90ZWN0aW9uRGVzY3JpcHRpb24oVHdpbmtsZS5wcm90ZWN0LnByZXZpb3VzUHJvdGVjdGlvbkxldmVscyksXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHQkbGlua01hcmt1cFswXVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoJGJvZHkuZmluZCgnZGl2W25hbWU9XCJjdXJyZW50cHJvdFwiXSBzcGFuJylbMF0pO1xuXHRcdGxldCBwcm90ZWN0aW9uTm9kZSA9IFtdO1xuXHRcdGxldCBzdGF0dXNMZXZlbCA9ICdpbmZvJztcblx0XHRwcm90ZWN0aW9uTm9kZSA9IFR3aW5rbGUucHJvdGVjdC5mb3JtYXRQcm90ZWN0aW9uRGVzY3JpcHRpb24oVHdpbmtsZS5wcm90ZWN0LmN1cnJlbnRQcm90ZWN0aW9uTGV2ZWxzKTtcblx0XHRpZiAoY3VycmVudGx5UHJvdGVjdGVkKSB7XG5cdFx0XHRzdGF0dXNMZXZlbCA9ICd3YXJuJztcblx0XHR9XG5cdFx0TW9yZWJpdHMuc3RhdHVzW3N0YXR1c0xldmVsXSh3aW5kb3cud2dVTFMoJ+W9k+WJjeS/neaKpOetiee6pycsICfnm67liY3kv53orbfnrYnntJonKSwgcHJvdGVjdGlvbk5vZGUpO1xuXHR9O1xuXHRUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suY2hhbmdlQWN0aW9uID0gKGUpID0+IHtcblx0XHRsZXQgZmllbGRfcHJlc2V0O1xuXHRcdGxldCBmaWVsZDE7XG5cdFx0bGV0IGZpZWxkMjtcblx0XHRzd2l0Y2ggKGUudGFyZ2V0LnZhbHVlcykge1xuXHRcdFx0Y2FzZSAncHJvdGVjdCc6XG5cdFx0XHRcdGZpZWxkX3ByZXNldCA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqQnLCAn6aCQ6KitJyksXG5cdFx0XHRcdFx0bmFtZTogJ2ZpZWxkX3ByZXNldCcsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmaWVsZF9wcmVzZXQuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRuYW1lOiAnY2F0ZWdvcnknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAieaLqem7mOiupO+8micsICfpgbjmk4fpoJDoqK3vvJonKSxcblx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmNoYW5nZVByZXNldCxcblx0XHRcdFx0XHRsaXN0OiBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpXG5cdFx0XHRcdFx0XHQ/IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVHlwZXNBZG1pblxuXHRcdFx0XHRcdFx0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvblR5cGVzQ3JlYXRlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQyID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdFx0XHR0eXBlOiAnZmllbGQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S/neaKpOmAiemhuScsICfkv53orbfpgbjpoIUnKSxcblx0XHRcdFx0XHRuYW1lOiAnZmllbGQyJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMi5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdG5hbWU6ICdjdXJyZW50cHJvdCcsXG5cdFx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdFx0fSk7IC8vIGhvbGRzIHRoZSBjdXJyZW50IHByb3RlY3Rpb24gbGV2ZWwsIGFzIGZpbGxlZCBvdXQgYnkgdGhlIGFzeW5jIGNhbGxiYWNrXG5cdFx0XHRcdGZpZWxkMi5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdG5hbWU6ICdoYXNwcm90ZWN0bG9nJyxcblx0XHRcdFx0XHRsYWJlbDogJyAnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Ly8gZm9yIGV4aXN0aW5nIHBhZ2VzXG5cdFx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSB7XG5cdFx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLmVkaXRtb2RpZnksXG5cdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkv67mlLnnvJbovpHmnYPpmZAnLCAn5L+u5pS557eo6Lyv5qyK6ZmQJyksXG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogJ2VkaXRtb2RpZnknLFxuXHRcdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfoi6XmraTpobnlhbPpl63vvIznvJbovpHmnYPpmZDlsIbkuI3kvJrkv67mlLnjgIInLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+iLpeatpOmghemXnOmWie+8jOe3qOi8r+asiumZkOWwh+S4jeacg+S/ruaUueOAgidcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGZpZWxkMi5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0XHRuYW1lOiAnZWRpdGxldmVsJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+e8lui+keadg+mZkO+8micsICfnt6jovK/mrIrpmZDvvJonKSxcblx0XHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5lZGl0bGV2ZWwsXG5cdFx0XHRcdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvbkxldmVscy5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdC8vIEZpbHRlciBURSBvdXRzaWRlIG9mIHRlbXBsYXRlcyBhbmQgbW9kdWxlc1xuXHRcdFx0XHRcdFx0XHQobGV2ZWwpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gaXNUZW1wbGF0ZSB8fCBsZXZlbC52YWx1ZSAhPT0gJ3RlbXBsYXRlZWRpdG9yJztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ2VkaXRleHBpcnknLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn57uI5q2i5pe26Ze077yaJywgJ+e1guatouaZgumWk++8micpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoZXZlbnQudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tJykge1xuXHRcdFx0XHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5kb0N1c3RvbUV4cGlyeShldmVudC50YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCQoJ2lucHV0W25hbWU9c21hbGxdJywgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJ2Zvcm0nKSlbMF0uY2hlY2tlZCA9XG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQudGFyZ2V0LnNlbGVjdGVkSW5kZXggPj0gNDsgLy8gMSBtb250aFxuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0Ly8gZGVmYXVsdCBleHBpcnkgc2VsZWN0aW9uICgyIGRheXMpIGlzIGNvbmRpdGlvbmFsbHkgc2V0IGluIFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5jaGFuZ2VQcmVzZXRcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGVuZ3Rocyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMubW92ZW1vZGlmeSxcblx0XHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S/ruaUueenu+WKqOadg+mZkCcsICfkv67mlLnnp7vli5XmrIrpmZAnKSxcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnbW92ZW1vZGlmeScsXG5cdFx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0J+iLpeatpOmhueiiq+WFs+mXre+8jOenu+WKqOadg+mZkOWwhuS4jeiiq+S/ruaUueOAgicsXG5cdFx0XHRcdFx0XHRcdFx0XHQn6Iul5q2k6aCF6KKr6Zec6ZaJ77yM56e75YuV5qyK6ZmQ5bCH5LiN6KKr5L+u5pS544CCJ1xuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICdtb3ZlbGV2ZWwnLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56e75Yqo5p2D6ZmQ77yaJywgJ+enu+WLleasiumZkO+8micpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLm1vdmVsZXZlbCxcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGV2ZWxzLmZpbHRlcihcblx0XHRcdFx0XHRcdFx0Ly8gQXV0b2NvbmZpcm1lZCBpcyByZXF1aXJlZCBmb3IgYSBtb3ZlLCByZWR1bmRhbnRcblx0XHRcdFx0XHRcdFx0KGxldmVsKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0XHRcdGxldmVsLnZhbHVlICE9PSAnYXV0b2NvbmZpcm1lZCcgJiYgKGlzVGVtcGxhdGUgfHwgbGV2ZWwudmFsdWUgIT09ICd0ZW1wbGF0ZWVkaXRvcicpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmaWVsZDIuYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ21vdmVleHBpcnknLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn57uI5q2i5pe26Ze077yaJywgJ+e1guatouaZgumWk++8micpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoZXZlbnQudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tJykge1xuXHRcdFx0XHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5kb0N1c3RvbUV4cGlyeShldmVudC50YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Ly8gZGVmYXVsdCBleHBpcnkgc2VsZWN0aW9uICgyIGRheXMpIGlzIGNvbmRpdGlvbmFsbHkgc2V0IGluIFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5jaGFuZ2VQcmVzZXRcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGVuZ3Rocyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBmb3Igbm9uLWV4aXN0aW5nIHBhZ2VzXG5cdFx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICdjcmVhdGVsZXZlbCcsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliJvlu7rmnYPpmZDvvJonLCAn5bu656uL5qyK6ZmQ77yaJyksXG5cdFx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMuY3JlYXRlbGV2ZWwsXG5cdFx0XHRcdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvbkxldmVscy5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdC8vIEZpbHRlciBURSBhbHdheXMsIGFuZCBhdXRvY29uZmlybWVkIGluIG1haW5zcGFjZVxuXHRcdFx0XHRcdFx0XHQobGV2ZWwpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbGV2ZWwudmFsdWUgIT09ICd0ZW1wbGF0ZWVkaXRvcic7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICdjcmVhdGVleHBpcnknLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn57uI5q2i5pe26Ze077yaJywgJ+e1guatouaZgumWk++8micpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoZXZlbnQudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tJykge1xuXHRcdFx0XHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5kb0N1c3RvbUV4cGlyeShldmVudC50YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Ly8gZGVmYXVsdCBleHBpcnkgc2VsZWN0aW9uIChpbmRlZmluaXRlKSBpcyBjb25kaXRpb25hbGx5IHNldCBpbiBUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suY2hhbmdlUHJlc2V0XG5cdFx0XHRcdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvbkxlbmd0aHMsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZmllbGQyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdjbG9zZScsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOivt+axguS/neaKpOmhtemdouS4reeahOivt+axgicsICfmqJnoqJjoq4vmsYLkv53orbfpoIHpnaLkuK3nmoToq4vmsYInKSxcblx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMi5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdFx0bmFtZTogJ3Byb3RlY3RSZWFzb24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eQhueUse+8iOS/neaKpOaXpeW/l++8ie+8micsICfnkIbnlLHvvIjkv53orbfml6XoqozvvInvvJonKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VDb250ZW50TW9kZWwnKSA9PT0gJ1NjcmlidW50bycpIHtcblx0XHRcdFx0XHQvLyB0YWdnaW5nIGlzbid0IHJlbGV2YW50IGZvciBub24tZXhpc3Rpbmcgb3IgbW9kdWxlIHBhZ2VzXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGNhc2UgJ3RhZyc6XG5cdFx0XHRcdGZpZWxkMSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDpgInpobknLCAn5qiZ6KiY6YG46aCFJyksXG5cdFx0XHRcdFx0bmFtZTogJ2ZpZWxkMScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmaWVsZDEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRuYW1lOiAnY3VycmVudHByb3QnLFxuXHRcdFx0XHRcdGxhYmVsOiAnICcsXG5cdFx0XHRcdH0pOyAvLyBob2xkcyB0aGUgY3VycmVudCBwcm90ZWN0aW9uIGxldmVsLCBhcyBmaWxsZWQgb3V0IGJ5IHRoZSBhc3luYyBjYWxsYmFja1xuXHRcdFx0XHRmaWVsZDEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRuYW1lOiAnaGFzcHJvdGVjdGxvZycsXG5cdFx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdG5hbWU6ICd0YWd0eXBlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgInmi6nkv53miqTmqKHmnb/vvJonLCAn6YG45pOH5L+d6K235qih5p2/77yaJyksXG5cdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UYWdzLFxuXHRcdFx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy50YWd0eXBlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZmllbGQxLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdzbWFsbCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S9v+eUqOWbvuagh++8iHNtYWxsPXllc++8iScsICfkvb/nlKjlnJbnpLrvvIhzbWFsbD15ZXPvvIknKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflsIbnu5nmqKHmnb/liqDkuIp8c21hbGw9eWVz5Y+C5pWw77yM5pi+56S65oiQ5Y+z5LiK6KeS55qE5LiA5oqK5oyC6ZSB44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5bCH57Wm5qih5p2/5Yqg5LiKfHNtYWxsPXllc+WPg+aVuO+8jOmhr+ekuuaIkOWPs+S4iuinkueahOS4gOaKiuaOm+mOluOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdub2luY2x1ZGUnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnlKgmbHQ7bm9pbmNsdWRlJmd0O+WMheijueS/neaKpOaooeadvycsICfnlKgmbHQ7bm9pbmNsdWRlJmd0O+WMheijueS/neitt+aooeadvycpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WwhuS/neaKpOaooeadv+WMheijueWcqCZsdDtub2luY2x1ZGUmZ3Q75LitJyxcblx0XHRcdFx0XHRcdFx0XHQn5bCH5L+d6K235qih5p2/5YyF6KO55ZyoJmx0O25vaW5jbHVkZSZndDvkuK0nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDEwLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3Nob3dleHBpcnknLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKjmqKHmnb/mmL7npLrliLDmnJ/ml7bpl7QnLCAn5Zyo5qih5p2/6aGv56S65Yiw5pyf5pmC6ZaTJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5bCG57uZ5qih5p2/5Yqg5LiKfGV4cGlyeeWPguaVsCcsICflsIfntabmqKHmnb/liqDkuIp8ZXhwaXJ55Y+D5pW4JyksXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGhpZGRlbjogZS50YXJnZXQudmFsdWVzID09PSAndGFnJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVxdWVzdCc6XG5cdFx0XHRcdGZpZWxkX3ByZXNldCA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkv53miqTnsbvlnosnLCAn5L+d6K236aGe5YilJyksXG5cdFx0XHRcdFx0bmFtZTogJ2ZpZWxkX3ByZXNldCcsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmaWVsZF9wcmVzZXQuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRuYW1lOiAnY2F0ZWdvcnknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+exu+Wei+WSjOeQhueUse+8micsICfpoZ7liKXlkoznkIbnlLHvvJonKSxcblx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmNoYW5nZVByZXNldCxcblx0XHRcdFx0XHRsaXN0OiBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpXG5cdFx0XHRcdFx0XHQ/IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVHlwZXNcblx0XHRcdFx0XHRcdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlc0NyZWF0ZSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpZWxkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgInpobknLCAn6YG46aCFJyksXG5cdFx0XHRcdFx0bmFtZTogJ2ZpZWxkMScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmaWVsZDEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRuYW1lOiAnY3VycmVudHByb3QnLFxuXHRcdFx0XHRcdGxhYmVsOiAnICcsXG5cdFx0XHRcdH0pOyAvLyBob2xkcyB0aGUgY3VycmVudCBwcm90ZWN0aW9uIGxldmVsLCBhcyBmaWxsZWQgb3V0IGJ5IHRoZSBhc3luYyBjYWxsYmFja1xuXHRcdFx0XHRmaWVsZDEuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRuYW1lOiAnaGFzcHJvdGVjdGxvZycsXG5cdFx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdG5hbWU6ICdleHBpcnknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aXtumVv++8micsICfmmYLplbfvvJonKSxcblx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAnJyxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S4tOaXticsICfoh6jmmYInKSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICd0ZW1wb3JhcnknLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICfmsLjkuYUnLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2luZmluaXR5Jyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZpZWxkMS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHRcdFx0bGFiZWw6ICfnkIbnlLHvvJonLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfov5nnjqnmhI/lhL/ooqvmtbfosZrlkIPmjonkuobvvIEnLCAn6YCZ546p5oSP5YWS6KKr5rW36LGa5ZCD5o6J5LqG77yBJyksIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZXByb3RlY3QnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGxldCBvbGRmaWVsZDtcblx0XHRpZiAoZmllbGRfcHJlc2V0KSB7XG5cdFx0XHRbb2xkZmllbGRdID0gJChlLnRhcmdldC5mb3JtKS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfcHJlc2V0XCJdJyk7XG5cdFx0XHRvbGRmaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmaWVsZF9wcmVzZXQucmVuZGVyKCksIG9sZGZpZWxkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JChlLnRhcmdldC5mb3JtKS5maW5kKCdmaWVsZHNldFtuYW1lPVwiZmllbGRfcHJlc2V0XCJdJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblx0XHR9XG5cdFx0aWYgKGZpZWxkMSkge1xuXHRcdFx0W29sZGZpZWxkXSA9ICQoZS50YXJnZXQuZm9ybSkuZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkMVwiXScpO1xuXHRcdFx0b2xkZmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZmllbGQxLnJlbmRlcigpLCBvbGRmaWVsZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoZS50YXJnZXQuZm9ybSkuZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkMVwiXScpLmNzcygnZGlzcGxheScsICdub25lJyk7XG5cdFx0fVxuXHRcdGlmIChmaWVsZDIpIHtcblx0XHRcdFtvbGRmaWVsZF0gPSAkKGUudGFyZ2V0LmZvcm0pLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZDJcIl0nKTtcblx0XHRcdG9sZGZpZWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGZpZWxkMi5yZW5kZXIoKSwgb2xkZmllbGQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkKGUudGFyZ2V0LmZvcm0pLmZpbmQoJ2ZpZWxkc2V0W25hbWU9XCJmaWVsZDJcIl0nKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXHRcdH1cblx0XHRpZiAoZS50YXJnZXQudmFsdWVzID09PSAncHJvdGVjdCcpIHtcblx0XHRcdC8vIGZha2UgYSBjaGFuZ2UgZXZlbnQgb24gdGhlIHByZXNldCBkcm9wZG93blxuXHRcdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRcdGUudGFyZ2V0LmZvcm0uY2F0ZWdvcnkuZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdFx0Ly8gcmVkdWNlIHZlcnRpY2FsIGhlaWdodCBvZiBkaWFsb2dcblx0XHRcdCQoZS50YXJnZXQuZm9ybSkuZmluZCgnZmllbGRzZXRbbmFtZT1cImZpZWxkMlwiXSBzZWxlY3QnKS5wYXJlbnQoKS5jc3Moe1xuXHRcdFx0XHRkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcblx0XHRcdFx0bWFyZ2luUmlnaHQ6ICcwLjVlbScsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gcmUtYWRkIHByb3RlY3Rpb24gbGV2ZWwgYW5kIGxvZyBpbmZvLCBpZiBpdCdzIGF2YWlsYWJsZVxuXHRcdFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5zaG93TG9nQW5kQ3VycmVudFByb3RlY3RJbmZvKCk7XG5cdH07XG5cdC8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBiYXRjaHByb3RlY3QgYXMgd2VsbFxuXHRUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cyA9IHtcblx0XHRlZGl0bW9kaWZ5OiAoZSkgPT4ge1xuXHRcdFx0ZS50YXJnZXQuZm9ybS5lZGl0bGV2ZWwuZGlzYWJsZWQgPSAhZS50YXJnZXQuY2hlY2tlZDtcblx0XHRcdGUudGFyZ2V0LmZvcm0uZWRpdGV4cGlyeS5kaXNhYmxlZCA9ICFlLnRhcmdldC5jaGVja2VkIHx8IGUudGFyZ2V0LmZvcm0uZWRpdGxldmVsLnZhbHVlID09PSAnYWxsJztcblx0XHRcdGUudGFyZ2V0LmZvcm0uZWRpdGxldmVsLnN0eWxlLmNvbG9yID0gZS50YXJnZXQuY2hlY2tlZCA/ICcnIDogJ3RyYW5zcGFyZW50Jztcblx0XHRcdGUudGFyZ2V0LmZvcm0uZWRpdGV4cGlyeS5zdHlsZS5jb2xvciA9IGUudGFyZ2V0LmNoZWNrZWQgPyAnJyA6ICd0cmFuc3BhcmVudCc7XG5cdFx0fSxcblx0XHRlZGl0bGV2ZWw6IChlKSA9PiB7XG5cdFx0XHRlLnRhcmdldC5mb3JtLmVkaXRleHBpcnkuZGlzYWJsZWQgPSBlLnRhcmdldC52YWx1ZSA9PT0gJ2FsbCc7XG5cdFx0fSxcblx0XHRtb3ZlbW9kaWZ5OiAoZSkgPT4ge1xuXHRcdFx0Ly8gc3luYyBtb3ZlIHNldHRpbmdzIHdpdGggZWRpdCBzZXR0aW5ncyBpZiBhcHBsaWNhYmxlXG5cdFx0XHRpZiAoZS50YXJnZXQuZm9ybS5tb3ZlbGV2ZWwuZGlzYWJsZWQgJiYgIWUudGFyZ2V0LmZvcm0uZWRpdGxldmVsLmRpc2FibGVkKSB7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubW92ZWxldmVsLnZhbHVlID0gZS50YXJnZXQuZm9ybS5lZGl0bGV2ZWwudmFsdWU7XG5cdFx0XHRcdGUudGFyZ2V0LmZvcm0ubW92ZWV4cGlyeS52YWx1ZSA9IGUudGFyZ2V0LmZvcm0uZWRpdGV4cGlyeS52YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoZS50YXJnZXQuZm9ybS5lZGl0bGV2ZWwuZGlzYWJsZWQpIHtcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5tb3ZlbGV2ZWwudmFsdWUgPSAnc3lzb3AnO1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLm1vdmVleHBpcnkudmFsdWUgPSAnaW5maW5pdHknO1xuXHRcdFx0fVxuXHRcdFx0ZS50YXJnZXQuZm9ybS5tb3ZlbGV2ZWwuZGlzYWJsZWQgPSAhZS50YXJnZXQuY2hlY2tlZDtcblx0XHRcdGUudGFyZ2V0LmZvcm0ubW92ZWV4cGlyeS5kaXNhYmxlZCA9ICFlLnRhcmdldC5jaGVja2VkIHx8IGUudGFyZ2V0LmZvcm0ubW92ZWxldmVsLnZhbHVlID09PSAnYWxsJztcblx0XHRcdGUudGFyZ2V0LmZvcm0ubW92ZWxldmVsLnN0eWxlLmNvbG9yID0gZS50YXJnZXQuY2hlY2tlZCA/ICcnIDogJ3RyYW5zcGFyZW50Jztcblx0XHRcdGUudGFyZ2V0LmZvcm0ubW92ZWV4cGlyeS5zdHlsZS5jb2xvciA9IGUudGFyZ2V0LmNoZWNrZWQgPyAnJyA6ICd0cmFuc3BhcmVudCc7XG5cdFx0fSxcblx0XHRtb3ZlbGV2ZWw6IChlKSA9PiB7XG5cdFx0XHRlLnRhcmdldC5mb3JtLm1vdmVleHBpcnkuZGlzYWJsZWQgPSBlLnRhcmdldC52YWx1ZSA9PT0gJ2FsbCc7XG5cdFx0fSxcblx0XHRjcmVhdGVsZXZlbDogKGUpID0+IHtcblx0XHRcdGUudGFyZ2V0LmZvcm0uY3JlYXRlZXhwaXJ5LmRpc2FibGVkID0gZS50YXJnZXQudmFsdWUgPT09ICdhbGwnO1xuXHRcdH0sXG5cdFx0dGFndHlwZTogKGUpID0+IHtcblx0XHRcdGUudGFyZ2V0LmZvcm0uc21hbGwuZGlzYWJsZWQgPSBlLnRhcmdldC52YWx1ZSA9PT0gJ25vbmUnIHx8IGUudGFyZ2V0LnZhbHVlID09PSAnbm9vcCc7XG5cdFx0XHRlLnRhcmdldC5mb3JtLm5vaW5jbHVkZS5kaXNhYmxlZCA9IGUudGFyZ2V0LnZhbHVlID09PSAnbm9uZScgfHwgZS50YXJnZXQudmFsdWUgPT09ICdub29wJztcblx0XHRcdGUudGFyZ2V0LmZvcm0uc2hvd2V4cGlyeS5kaXNhYmxlZCA9IGUudGFyZ2V0LnZhbHVlID09PSAnbm9uZScgfHwgZS50YXJnZXQudmFsdWUgPT09ICdub29wJztcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLnByb3RlY3QuZG9DdXN0b21FeHBpcnkgPSAodGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgY3VzdG9tID0gcHJvbXB0KFxuXHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHQn6L6T5YWl6Ieq5a6a5LmJ57uI5q2i5pe26Ze044CCXFxu5oKo5Y+v5Lul5L2/55So55u45a+55pe26Ze077yM5aaC4oCcMSBtaW51dGXigJ3miJbigJwxOSBkYXlz4oCd77yM5oiW57ud5a+55pe26Ze04oCceXl5eW1tZGRoaG1t4oCd77yI5aaC4oCcMjAwNjAyMDExNDA14oCd5pivMjAwNuW5tDAy5pyIMDHml6UxNO+8mjA177yIVVRD77yJ77yJJyxcblx0XHRcdFx0J+i8uOWFpeiHquiogue1guatouaZgumWk+OAglxcbuaCqOWPr+S7peS9v+eUqOebuOWwjeaZgumWk++8jOWmguOAjDEgbWludXRl44CN5oiW44CMMTkgZGF5c+OAje+8jOaIlue1leWwjeaZgumWk+OAjHl5eXltbWRkaGhtbeOAje+8iOWmguOAjDIwMDYwMjAxMTQwNeOAjeaYrzIwMDblubQwMuaciDAx5pelMTTvvJowNe+8iFVUQ++8ie+8iSdcblx0XHRcdCksXG5cdFx0XHQnJ1xuXHRcdCk7XG5cdFx0aWYgKGN1c3RvbSkge1xuXHRcdFx0Y29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG5cdFx0XHRvcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIGN1c3RvbSk7XG5cdFx0XHRvcHRpb24udGV4dENvbnRlbnQgPSBjdXN0b207XG5cdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcblx0XHRcdHRhcmdldC52YWx1ZSA9IGN1c3RvbTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFyZ2V0LnNlbGVjdGVkSW5kZXggPSAwO1xuXHRcdH1cblx0fTtcblx0Ly8gTk9URTogVGhpcyBsaXN0IGlzIHVzZWQgYnkgYmF0Y2hwcm90ZWN0IGFzIHdlbGxcblx0VHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZXZlbHMgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICflhajpg6gnLFxuXHRcdFx0dmFsdWU6ICdhbGwnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LuF5YWB6K646Ieq5Yqo56Gu6K6k55So5oi3JywgJ+WDheWFgeioseiHquWLleeiuuiqjeS9v+eUqOiAhScpLFxuXHRcdFx0dmFsdWU6ICdhdXRvY29uZmlybWVkJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7heaooeadv+e8lui+keWRmOWSjOeuoeeQhuWRmCcsICflg4XmqKHmnb/nt6jovK/lk6HlkoznrqHnkIblk6EnKSxcblx0XHRcdHZhbHVlOiAndGVtcGxhdGVlZGl0b3InLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LuF566h55CG5ZGYJywgJ+WDheeuoeeQhuWToScpLFxuXHRcdFx0dmFsdWU6ICdzeXNvcCcsXG5cdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7heWFgeiuuOaho+ahiOeQhuS6i+WRmCcsICflg4XlhYHoqLHmqpTmoYjnkIbkuovlk6EnKSxcblx0XHRcdHZhbHVlOiAnb2ZmaWNpYWxwcm90ZWN0ZWQnLFxuXHRcdH0sXG5cdF07XG5cdC8vIGRlZmF1bHQgZXhwaXJ5IHNlbGVjdGlvbiBpcyBjb25kaXRpb25hbGx5IHNldCBpbiBUd2lua2xlLnByb3RlY3QuY2FsbGJhY2suY2hhbmdlUHJlc2V0XG5cdC8vIE5PVEU6IFRoaXMgbGlzdCBpcyB1c2VkIGJ5IGJhdGNocHJvdGVjdCBhcyB3ZWxsXG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGVuZ3RocyA9IFtcblx0XHR7XG5cdFx0XHRsYWJlbDogJzHlpKknLFxuXHRcdFx0dmFsdWU6ICcxIGRheScsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogJzPlpKknLFxuXHRcdFx0dmFsdWU6ICczIGRheXMnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnMeWRqCcsICcx6YCxJyksXG5cdFx0XHR2YWx1ZTogJzEgd2VlaycsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcy5ZGoJywgJzLpgLEnKSxcblx0XHRcdHZhbHVlOiAnMiB3ZWVrcycsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcx5Liq5pyIJywgJzHlgIvmnIgnKSxcblx0XHRcdHZhbHVlOiAnMSBtb250aCcsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCcz5Liq5pyIJywgJzPlgIvmnIgnKSxcblx0XHRcdHZhbHVlOiAnMyBtb250aHMnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnNuS4quaciCcsICc25YCL5pyIJyksXG5cdFx0XHR2YWx1ZTogJzYgbW9udGhzJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiAnMeW5tCcsXG5cdFx0XHR2YWx1ZTogJzEgeWVhcicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfml6DpmZDmnJ8nLCAn54Sh6ZmQ5pyfJyksXG5cdFx0XHR2YWx1ZTogJ2luZmluaXR5Jyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieKApuKApicsICfoh6roqILigKbigKYnKSxcblx0XHRcdHZhbHVlOiAnY3VzdG9tJyxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvblR5cGVzQWRtaW4gPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Kej6Zmk5L+d5oqkJywgJ+ino+mZpOS/neittycpLFxuXHRcdFx0dmFsdWU6ICd1bnByb3RlY3QnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo5L+d5oqkJywgJ+WFqOS/neittycpLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bi46KeE77yI5YWo77yJJywgJ+W4uOimj++8iOWFqO+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtcHJvdGVjdGVkJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S6ieiuruOAgee8lui+keaImO+8iOWFqO+8iScsICfniK3orbDjgIHnt6jovK/miLDvvIjlhajvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLWRpc3B1dGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aooeadv+S/neaKpCcsICfmqKHmnb/kv53orbcnKSxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mrmOmjjumZqeaooeadv++8iOaooeadv++8iScsICfpq5jpoqjpmqrmqKHmnb/vvIjmqKHmnb/vvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLXRlbXBsYXRlJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfljYrkv53miqQnLCAn5Y2K5L+d6K23JyksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfluLjop4TvvIjljYrvvIknLCAn5bi46KaP77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXByb3RlY3RlZCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmjIHnu63noLTlnY/vvIjljYrvvIknLCAn5oyB57qM56C05aOe77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXZhbmRhbGlzbScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfov53lj43nlJ/ogIXkvKDorrDmnaHkvovvvIjljYrvvIknLCAn6YGV5Y+N55Sf6ICF5YKz6KiY5qKd5L6L77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLWJscCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflgoDlhKHnoLTlnY/vvIjljYrvvIknLCAn5YKA5YSh56C05aOe77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXNvY2snLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6auY6aOO6Zmp5qih5p2/77yI5Y2K77yJJywgJ+mrmOmiqOmaquaooeadv++8iOWNiu+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtc2VtaS10ZW1wbGF0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfooqvlsIHnpoHnlKjmiLfmu6XnlKjorqjorrrpobXvvIjljYrvvIknLCAn6KKr5bCB56aB5L2/55So6ICF5r+r55So6KiO6KuW6aCB77yI5Y2K77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zZW1pLXVzZXJ0YWxrJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vliqjkv53miqQnLCAn56e75YuV5L+d6K23JyksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfluLjop4TvvIjnp7vliqjvvIknLCAn5bi46KaP77yI56e75YuV77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S6ieiuruOAgeenu+WKqOaImO+8iOenu+WKqO+8iScsICfniK3orbDjgIHnp7vli5XmiLDvvIjnp7vli5XvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLW1vdmUtZGlzcHV0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vliqjnoLTlnY/vvIjnp7vliqjvvIknLCAn56e75YuV56C05aOe77yI56e75YuV77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlLXZhbmRhbGlzbScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpq5jpo47pmanpobXpnaLvvIjnp7vliqjvvIknLCAn6auY6aKo6Zqq6aCB6Z2i77yI56e75YuV77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlLWluZGVmJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XS5maWx0ZXIoXG5cdFx0KFxuXHRcdFx0Ly8gRmlsdGVyIGZvciB0ZW1wbGF0ZXNcblx0XHRcdHtsYWJlbH1cblx0XHQpID0+IHtcblx0XHRcdHJldHVybiBpc1RlbXBsYXRlIHx8IChsYWJlbCAhPT0gJ+aooeadv+S/neaKpCcgJiYgbGFiZWwgIT09ICfmqKHmnb/kv53orbcnKTtcblx0XHR9XG5cdCk7XG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVHlwZXNDcmVhdGVPbmx5ID0gW1xuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+eZvee6uOS/neaKpCcsICfnmb3ntJnkv53orbcnKSxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W4uOinhO+8iOeZvee6uO+8iScsICfluLjopo/vvIjnmb3ntJnvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLWNyZWF0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflpJrmrKHph43lpI3liJvlu7rvvIjnmb3nurjvvIknLCAn5aSa5qyh6YeN6KSH5bu656uL77yI55m957SZ77yJJyksXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1jcmVhdGUtcmVwZWF0Jyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aMgee7reegtOWdj++8iOeZvee6uO+8iScsICfmjIHnuoznoLTlo57vvIjnmb3ntJnvvIknKSxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLWNyZWF0ZS12YW5kYWxpc20nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bey5bCB56aB55So5oi355qE55So5oi36aG177yI55m957q477yJJywgJ+W3suWwgeemgeS9v+eUqOiAheeahOS9v+eUqOiAhemgge+8iOeZvee0me+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtY3JlYXRlLXVzZXJwYWdlJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlcyA9IFtcblx0XHQuLi5Ud2lua2xlLnByb3RlY3QucHJvdGVjdGlvblR5cGVzQWRtaW4sXG5cdFx0Li4uVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlc0NyZWF0ZU9ubHksXG5cdF07XG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uVHlwZXNDcmVhdGUgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6ICfop6PpmaTkv53miqQnLFxuXHRcdFx0dmFsdWU6ICd1bnByb3RlY3QnLFxuXHRcdH0sXG5cdFx0Li4uVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25UeXBlc0NyZWF0ZU9ubHksXG5cdF07XG5cdC8vIE5PVElDRToga2VlcCB0aGlzIHN5bmNoZWQgd2l0aCBbW01lZGlhV2lraTpQcm90ZWN0LWRyb3Bkb3duXV1cblx0Ly8gZXhwaXJ5IHdpbGwgb3ZlcnJpZGUgYW55IGRlZmF1bHRzXG5cdFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uUHJlc2V0c0luZm8gPSB7XG5cdFx0J3BwLXByb3RlY3RlZCc6IHtcblx0XHRcdGVkaXQ6ICdzeXNvcCcsXG5cdFx0XHRtb3ZlOiAnc3lzb3AnLFxuXHRcdFx0cmVhc29uOiBudWxsLFxuXHRcdH0sXG5cdFx0J3BwLWRpc3B1dGUnOiB7XG5cdFx0XHRlZGl0OiAnc3lzb3AnLFxuXHRcdFx0bW92ZTogJ3N5c29wJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfnvJbovpHmiJgnLCAn57eo6Lyv5oiwJyksXG5cdFx0fSxcblx0XHQncHAtdGVtcGxhdGUnOiB7XG5cdFx0XHRlZGl0OiAndGVtcGxhdGVlZGl0b3InLFxuXHRcdFx0bW92ZTogJ3RlbXBsYXRlZWRpdG9yJyxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCdbW0xJQjpIUlR86auY6aOO6Zmp5qih5p2/XV0nLCAnW1tMSUI6SFJUfOmrmOmiqOmaquaooeadv11dJyksXG5cdFx0XHR0ZW1wbGF0ZTogJ25vb3AnLFxuXHRcdH0sXG5cdFx0J3BwLXZhbmRhbGlzbSc6IHtcblx0XHRcdGVkaXQ6ICdzeXNvcCcsXG5cdFx0XHRtb3ZlOiAnc3lzb3AnLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+iiq+iHquWKqOehruiupOeUqOaIt+egtOWdjycsICfooqvoh6rli5Xnorroqo3kvb/nlKjogIXnoLTlo54nKSxcblx0XHR9LFxuXHRcdCdwcC1zb2NrJzoge1xuXHRcdFx0ZWRpdDogJ3N5c29wJyxcblx0XHRcdG1vdmU6ICdzeXNvcCcsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5oyB57ut55qE5YKA5YSh56C05Z2PJywgJ+aMgee6jOeahOWCgOWEoeegtOWjnicpLFxuXHRcdH0sXG5cdFx0J3BwLXNlbWktdmFuZGFsaXNtJzoge1xuXHRcdFx0ZWRpdDogJ2F1dG9jb25maXJtZWQnLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+iiq+aWsOeUqOaIt+egtOWdjycsICfooqvmlrDkvb/nlKjogIXnoLTlo54nKSxcblx0XHRcdHRlbXBsYXRlOiAncHAtdmFuZGFsaXNtJyxcblx0XHR9LFxuXHRcdCdwcC1zZW1pLWJscCc6IHtcblx0XHRcdGVkaXQ6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfmlrDnlKjmiLfov53lj43nlJ/ogIXkvKDorrDmnaHkvosnLCAn5paw5L2/55So6ICF6YGV5Y+N55Sf6ICF5YKz6KiY5qKd5L6LJyksXG5cdFx0fSxcblx0XHQncHAtc2VtaS11c2VydGFsayc6IHtcblx0XHRcdGVkaXQ6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfooqvlsIHnpoHnlKjmiLfmu6XnlKjlhbborqjorrrpobUnLCAn6KKr5bCB56aB5L2/55So6ICF5r+r55So5YW26KiO6KuW6aCBJyksXG5cdFx0fSxcblx0XHQncHAtc2VtaS10ZW1wbGF0ZSc6IHtcblx0XHRcdC8vIHJlbW92ZWQgZm9yIG5vd1xuXHRcdFx0ZWRpdDogJ2F1dG9jb25maXJtZWQnLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ1tbTElCOkhSVHzpq5jpo47pmanmqKHmnb9dXScsICdbW0xJQjpIUlR86auY6aKo6Zqq5qih5p2/XV0nKSxcblx0XHRcdHRlbXBsYXRlOiAnbm9vcCcsXG5cdFx0fSxcblx0XHQncHAtc2VtaS1zb2NrJzoge1xuXHRcdFx0ZWRpdDogJ2F1dG9jb25maXJtZWQnLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+aMgee7reeahOWCgOWEoeegtOWdjycsICfmjIHnuoznmoTlgoDlhKHnoLTlo54nKSxcblx0XHRcdHRlbXBsYXRlOiAncHAtc29jaycsXG5cdFx0fSxcblx0XHQncHAtc2VtaS1wcm90ZWN0ZWQnOiB7XG5cdFx0XHRlZGl0OiAnYXV0b2NvbmZpcm1lZCcsXG5cdFx0XHRyZWFzb246IG51bGwsXG5cdFx0XHR0ZW1wbGF0ZTogJ3BwLXByb3RlY3RlZCcsXG5cdFx0fSxcblx0XHQncHAtbW92ZSc6IHtcblx0XHRcdG1vdmU6ICdzeXNvcCcsXG5cdFx0XHRyZWFzb246IG51bGwsXG5cdFx0fSxcblx0XHQncHAtbW92ZS1kaXNwdXRlJzoge1xuXHRcdFx0bW92ZTogJ3N5c29wJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfpobXpnaLnp7vliqjmiJgnLCAn6aCB6Z2i56e75YuV5oiwJyksXG5cdFx0fSxcblx0XHQncHAtbW92ZS12YW5kYWxpc20nOiB7XG5cdFx0XHRtb3ZlOiAnc3lzb3AnLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+enu+WKqOegtOWdjycsICfnp7vli5XnoLTlo54nKSxcblx0XHR9LFxuXHRcdCdwcC1tb3ZlLWluZGVmJzoge1xuXHRcdFx0bW92ZTogJ3N5c29wJyxcblx0XHRcdGV4cGlyeTogJ2luZmluaXR5Jyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfpq5jpo47pmanpobXpnaInLCAn6auY6aKo6Zqq6aCB6Z2iJyksXG5cdFx0fSxcblx0XHR1bnByb3RlY3Q6IHtcblx0XHRcdGVkaXQ6ICdhbGwnLFxuXHRcdFx0bW92ZTogJ2FsbCcsXG5cdFx0XHRjcmVhdGU6ICdhbGwnLFxuXHRcdFx0cmVhc29uOiBudWxsLFxuXHRcdFx0dGVtcGxhdGU6ICdub25lJyxcblx0XHR9LFxuXHRcdCdwcC1jcmVhdGUnOiB7XG5cdFx0XHRjcmVhdGU6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdHJlYXNvbjogbnVsbCxcblx0XHR9LFxuXHRcdCdwcC1jcmVhdGUtcmVwZWF0Jzoge1xuXHRcdFx0Y3JlYXRlOiAnYXV0b2NvbmZpcm1lZCcsXG5cdFx0XHRyZWFzb246IHdpbmRvdy53Z1VMUygn5aSa5qyh6YeN5aSN5Yib5bu6JywgJ+WkmuasoemHjeikh+W7uueriycpLFxuXHRcdH0sXG5cdFx0J3BwLWNyZWF0ZS12YW5kYWxpc20nOiB7XG5cdFx0XHRjcmVhdGU6ICdhdXRvY29uZmlybWVkJyxcblx0XHRcdHJlYXNvbjogd2luZG93LndnVUxTKCfooqvmlrDnlKjmiLfnoLTlnY8nLCAn6KKr5paw5L2/55So6ICF56C05aOeJyksXG5cdFx0fSxcblx0XHQncHAtY3JlYXRlLXVzZXJwYWdlJzoge1xuXHRcdFx0Y3JlYXRlOiAnc3lzb3AnLFxuXHRcdFx0ZXhwaXJ5OiAnaW5maW5pdHknLFxuXHRcdFx0cmVhc29uOiB3aW5kb3cud2dVTFMoJ+iiq+awuOS5heWwgeemgeeahOeUqOaIt+mhtScsICfooqvmsLjkuYXlsIHnpoHnmoTkvb/nlKjogIXpoIHpnaInKSxcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvblRhZ3MgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5peg77yI56e76Zmk546w5pyJ5qih5p2/77yJJywgJ+eEoe+8iOenu+mZpOePvuacieaooeadv++8iScpLFxuXHRcdFx0dmFsdWU6ICdub25lJyxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aXoO+8iOS4jeenu+mZpOeOsOacieaooeadv++8iScsICfnhKHvvIjkuI3np7vpmaTnj77mnInmqKHmnb/vvIknKSxcblx0XHRcdHZhbHVlOiAnbm9vcCcsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogJ+mAmueUqOaooeadvycsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtZGlzcHV0ZX19OiAke3dpbmRvdy53Z1VMUygn5LqJ6K6uJywgJ+eIreitsCcpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1kaXNwdXRlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3twcC12YW5kYWxpc219fTogJHt3aW5kb3cud2dVTFMoJ+egtOWdjycsICfnoLTlo54nKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtdmFuZGFsaXNtJyxcblx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAne3twcC1zb2NrfX06IOWCgOWEoScsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1zb2NrJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3twcC10ZW1wbGF0ZX19OiAke3dpbmRvdy53Z1VMUygn6auY6aOO6Zmp5qih5p2/JywgJ+mrmOmiqOmaquaooeadvycpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC10ZW1wbGF0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtcHJvdGVjdGVkfX06ICR7d2luZG93LndnVUxTKCfluLjop4QnLCAn5bi46KaPJyl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLXByb3RlY3RlZCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Y2K5L+d5oqk5qih5p2/JywgJ+WNiuS/neitt+aooeadvycpLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLXNlbWktdXNlcnRhbGt9fTogJHt3aW5kb3cud2dVTFMoJ+WwgeemgeeahOeUqOaItycsICflsIHnpoHnmoTkvb/nlKjogIUnKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtc2VtaS11c2VydGFsaycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7cHAtc2VtaS1ibHB9fTogJHt3aW5kb3cud2dVTFMoJ+eUn+iAheS8oOiusCcsICfnlJ/ogIXlgrPoqJgnKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtc2VtaS1ibHAnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLXNlbWktaW5kZWZ9fTogJHt3aW5kb3cud2dVTFMoJ+mVv+acnycsICfplbfmnJ8nKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtc2VtaS1pbmRlZicsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56e75Yqo5L+d5oqk5qih5p2/JywgJ+enu+WLleS/neitt+aooeadvycpLFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLW1vdmUtZGlzcHV0ZX19OiAke3dpbmRvdy53Z1VMUygn5LqJ6K6uJywgJ+eIreitsCcpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdwcC1tb3ZlLWRpc3B1dGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLW1vdmUtdmFuZGFsaXNtfX06ICR7d2luZG93LndnVUxTKCfnoLTlnY8nLCAn56C05aOeJyl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLW1vdmUtdmFuZGFsaXNtJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3twcC1tb3ZlLWluZGVmfX06ICR7d2luZG93LndnVUxTKCfplb/mnJ8nLCAn6ZW35pyfJyl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ3BwLW1vdmUtaW5kZWYnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e3BwLW1vdmV9fTogJHt3aW5kb3cud2dVTFMoJ+W4uOinhCcsICfluLjopo8nKX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAncHAtbW92ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdF07XG5cdFR3aW5rbGUucHJvdGVjdC5jYWxsYmFjay5jaGFuZ2VQcmVzZXQgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHtmb3JtfSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IGFjdGlvbnR5cGVzID0gZm9ybS5hY3Rpb250eXBlO1xuXHRcdGxldCBhY3Rpb250eXBlO1xuXHRcdGZvciAoY29uc3QgYWN0aW9uX3R5cGVfdmFsdWUgb2YgYWN0aW9udHlwZXMpIHtcblx0XHRcdGlmICghYWN0aW9uX3R5cGVfdmFsdWUuY2hlY2tlZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGFjdGlvbnR5cGUgPSBhY3Rpb25fdHlwZV92YWx1ZS52YWx1ZXM7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWYgKGFjdGlvbnR5cGUgPT09ICdwcm90ZWN0Jykge1xuXHRcdFx0Ly8gYWN0dWFsbHkgcHJvdGVjdGluZyB0aGUgcGFnZVxuXHRcdFx0Y29uc3QgaXRlbSA9IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uUHJlc2V0c0luZm9bZm9ybS5jYXRlZ29yeS52YWx1ZV07XG5cdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkge1xuXHRcdFx0XHRpZiAoaXRlbS5lZGl0KSB7XG5cdFx0XHRcdFx0Zm9ybS5lZGl0bW9kaWZ5LmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLmVkaXRtb2RpZnkoe1xuXHRcdFx0XHRcdFx0dGFyZ2V0OiBmb3JtLmVkaXRtb2RpZnksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Zm9ybS5lZGl0bGV2ZWwudmFsdWUgPSBpdGVtLmVkaXQ7XG5cdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMuZWRpdGxldmVsKHtcblx0XHRcdFx0XHRcdHRhcmdldDogZm9ybS5lZGl0bGV2ZWwsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9ybS5lZGl0bW9kaWZ5LmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5lZGl0bW9kaWZ5KHtcblx0XHRcdFx0XHRcdHRhcmdldDogZm9ybS5lZGl0bW9kaWZ5LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChpdGVtLm1vdmUpIHtcblx0XHRcdFx0XHRmb3JtLm1vdmVtb2RpZnkuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMubW92ZW1vZGlmeSh7XG5cdFx0XHRcdFx0XHR0YXJnZXQ6IGZvcm0ubW92ZW1vZGlmeSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmb3JtLm1vdmVsZXZlbC52YWx1ZSA9IGl0ZW0ubW92ZTtcblx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5tb3ZlbGV2ZWwoe1xuXHRcdFx0XHRcdFx0dGFyZ2V0OiBmb3JtLm1vdmVsZXZlbCxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmb3JtLm1vdmVtb2RpZnkuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLm1vdmVtb2RpZnkoe1xuXHRcdFx0XHRcdFx0dGFyZ2V0OiBmb3JtLm1vdmVtb2RpZnksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9ybS5lZGl0ZXhwaXJ5LnZhbHVlID0gaXRlbS5leHBpcnkgfHwgJzEgd2Vlayc7XG5cdFx0XHRcdGZvcm0ubW92ZWV4cGlyeS52YWx1ZSA9IGl0ZW0uZXhwaXJ5IHx8ICcxIHdlZWsnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGl0ZW0uY3JlYXRlKSB7XG5cdFx0XHRcdFx0Zm9ybS5jcmVhdGVsZXZlbC52YWx1ZSA9IGl0ZW0uY3JlYXRlO1xuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLmNyZWF0ZWxldmVsKHtcblx0XHRcdFx0XHRcdHRhcmdldDogZm9ybS5jcmVhdGVsZXZlbCxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmb3JtLmNyZWF0ZWV4cGlyeS52YWx1ZSA9IGl0ZW0uY3JlYXRlZXhwaXJ5IHx8ICcxIHdlZWsnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcm0uY3JlYXRlZXhwaXJ5LnZhbHVlID0gaXRlbS5leHBpcnkgfHwgJzEgd2Vlayc7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWFzb25GaWVsZCA9IGFjdGlvbnR5cGUgPT09ICdwcm90ZWN0JyA/IGZvcm0ucHJvdGVjdFJlYXNvbiA6IGZvcm0ucmVhc29uO1xuXHRcdFx0aWYgKGl0ZW0ucmVhc29uKSB7XG5cdFx0XHRcdHJlYXNvbkZpZWxkLnZhbHVlID0gaXRlbS5yZWFzb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZWFzb25GaWVsZC52YWx1ZSA9ICcnO1xuXHRcdFx0fVxuXHRcdFx0Ly8gc29ydCBvdXQgdGFnZ2luZyBvcHRpb25zLCBkaXNhYmxlZCBpZiBub25leGlzdGVudCBvciBsdWFcblx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpICYmIG13LmNvbmZpZy5nZXQoJ3dnUGFnZUNvbnRlbnRNb2RlbCcpICE9PSAnU2NyaWJ1bnRvJykge1xuXHRcdFx0XHRpZiAoZm9ybS5jYXRlZ29yeS52YWx1ZSA9PT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0XHRmb3JtLnRhZ3R5cGUudmFsdWUgPSAnbm9uZSc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9ybS50YWd0eXBlLnZhbHVlID0gaXRlbS50ZW1wbGF0ZSA/PyBmb3JtLmNhdGVnb3J5LnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLnRhZ3R5cGUoe1xuXHRcdFx0XHRcdHRhcmdldDogZm9ybS50YWd0eXBlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKC90ZW1wbGF0ZS8udGVzdChmb3JtLmNhdGVnb3J5LnZhbHVlKSkge1xuXHRcdFx0XHRcdGZvcm0ubm9pbmNsdWRlLmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgIT09IDEwKSB7XG5cdFx0XHRcdFx0Zm9ybS5ub2luY2x1ZGUuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChmb3JtLmNhdGVnb3J5LnZhbHVlID09PSAndW5wcm90ZWN0Jykge1xuXHRcdFx0Ly8gUlBQIHJlcXVlc3Rcblx0XHRcdGZvcm0uZXhwaXJ5LnZhbHVlID0gJyc7XG5cdFx0XHRmb3JtLmV4cGlyeS5kaXNhYmxlZCA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvcm0uZXhwaXJ5LnZhbHVlID0gJyc7XG5cdFx0XHRmb3JtLmV4cGlyeS5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrLmV2YWx1YXRlID0gKGUpID0+IHtcblx0XHRjb25zdCBmb3JtID0gZS50YXJnZXQ7XG5cdFx0Y29uc3QgaW5wdXQgPSBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0SW5wdXREYXRhKGZvcm0pO1xuXHRcdGxldCB0YWdwYXJhbXM7XG5cdFx0aWYgKFxuXHRcdFx0aW5wdXQuYWN0aW9udHlwZSA9PT0gJ3RhZycgfHxcblx0XHRcdChpbnB1dC5hY3Rpb250eXBlID09PSAncHJvdGVjdCcgJiZcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VDb250ZW50TW9kZWwnKSAhPT0gJ1NjcmlidW50bycpXG5cdFx0KSB7XG5cdFx0XHR0YWdwYXJhbXMgPSB7XG5cdFx0XHRcdHRhZzogaW5wdXQudGFndHlwZSxcblx0XHRcdFx0cmVhc29uOlxuXHRcdFx0XHRcdChpbnB1dC50YWd0eXBlID09PSAncHAtcHJvdGVjdGVkJyB8fFxuXHRcdFx0XHRcdFx0aW5wdXQudGFndHlwZSA9PT0gJ3BwLXNlbWktcHJvdGVjdGVkJyB8fFxuXHRcdFx0XHRcdFx0aW5wdXQudGFndHlwZSA9PT0gJ3BwLW1vdmUnKSAmJlxuXHRcdFx0XHRcdGlucHV0LnByb3RlY3RSZWFzb25cblx0XHRcdFx0XHRcdD8gaW5wdXQucHJvdGVjdFJlYXNvblxuXHRcdFx0XHRcdFx0OiBudWxsLFxuXHRcdFx0XHRzaG93ZXhwaXJ5OiBpbnB1dC5hY3Rpb250eXBlID09PSAncHJvdGVjdCcgPyBpbnB1dC5zaG93ZXhwaXJ5IDogbnVsbCxcblx0XHRcdFx0c21hbGw6IGlucHV0LnNtYWxsLFxuXHRcdFx0XHRub2luY2x1ZGU6IGlucHV0Lm5vaW5jbHVkZSxcblx0XHRcdH07XG5cdFx0XHRpZiAoaW5wdXQuYWN0aW9udHlwZSA9PT0gJ3Byb3RlY3QnKSB7XG5cdFx0XHRcdGlmIChpbnB1dC5lZGl0bW9kaWZ5KSB7XG5cdFx0XHRcdFx0dGFncGFyYW1zLmV4cGlyeSA9IGlucHV0LmVkaXRleHBpcnk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaW5wdXQubW92ZW1vZGlmeSkge1xuXHRcdFx0XHRcdHRhZ3BhcmFtcy5leHBpcnkgPSBpbnB1dC5tb3ZlZXhwaXJ5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGNsb3NlcGFyYW1zID0ge307XG5cdFx0aWYgKGlucHV0LmNsb3NlKSB7XG5cdFx0XHRpZiAoaW5wdXQuY2F0ZWdvcnkgPT09ICd1bnByb3RlY3QnKSB7XG5cdFx0XHRcdGNsb3NlcGFyYW1zLnR5cGUgPSAndW5wcm90ZWN0Jztcblx0XHRcdH0gZWxzZSBpZiAobXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkge1xuXHRcdFx0XHRpZiAoaW5wdXQuZWRpdG1vZGlmeSkge1xuXHRcdFx0XHRcdHN3aXRjaCAoaW5wdXQuZWRpdGxldmVsKSB7XG5cdFx0XHRcdFx0XHRjYXNlICdvZmZpY2lhbHByb3RlY3RlZCc6XG5cdFx0XHRcdFx0XHRcdGNsb3NlcGFyYW1zLnR5cGUgPSAnb2ZmaWNpYWxwcm90ZWN0ZWQnO1xuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy5leHBpcnkgPSBpbnB1dC5lZGl0ZXhwaXJ5O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3JldmlzaW9ucHJvdGVjdGVkJzpcblx0XHRcdFx0XHRcdFx0Y2xvc2VwYXJhbXMudHlwZSA9ICdyZXZpc2lvbnByb3RlY3RlZCc7XG5cdFx0XHRcdFx0XHRcdGNsb3NlcGFyYW1zLmV4cGlyeSA9IGlucHV0LmVkaXRleHBpcnk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnc3lzb3AnOlxuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy50eXBlID0gJ2Z1bGwnO1xuXHRcdFx0XHRcdFx0XHRjbG9zZXBhcmFtcy5leHBpcnkgPSBpbnB1dC5lZGl0ZXhwaXJ5O1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3RlbXBsYXRlZWRpdG9yJzpcblx0XHRcdFx0XHRcdFx0Y2xvc2VwYXJhbXMudHlwZSA9ICd0ZW1wJztcblx0XHRcdFx0XHRcdFx0Y2xvc2VwYXJhbXMuZXhwaXJ5ID0gaW5wdXQuZWRpdGV4cGlyeTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdhdXRvY29uZmlybWVkJzpcblx0XHRcdFx0XHRcdFx0Y2xvc2VwYXJhbXMudHlwZSA9ICdzZW1pJztcblx0XHRcdFx0XHRcdFx0Y2xvc2VwYXJhbXMuZXhwaXJ5ID0gaW5wdXQuZWRpdGV4cGlyeTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHQvLyBObyBkZWZhdWx0XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdGlucHV0Lm1vdmVtb2RpZnkgJiZcblx0XHRcdFx0XHRbJ29mZmljaWFscHJvdGVjdGVkJywgJ3JldmlzaW9ucHJvdGVjdGVkJywgJ3N5c29wJywgJ3RlbXBsYXRlZWRpdG9yJ10uaW5jbHVkZXMoaW5wdXQubW92ZWxldmVsKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjbG9zZXBhcmFtcy50eXBlID0gJ21vdmUnO1xuXHRcdFx0XHRcdGNsb3NlcGFyYW1zLmV4cGlyeSA9IGlucHV0Lm1vdmVleHBpcnk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaW5wdXQuY3JlYXRlbGV2ZWwgIT09ICdhbGwnKSB7XG5cdFx0XHRcdGNsb3NlcGFyYW1zLnR5cGUgPSAnc2FsdCc7XG5cdFx0XHRcdGNsb3NlcGFyYW1zLmV4cGlyeSA9IGlucHV0LmNyZWF0ZWV4cGlyeTtcblx0XHRcdH1cblx0XHR9XG5cdFx0c3dpdGNoIChpbnB1dC5hY3Rpb250eXBlKSB7XG5cdFx0XHRjYXNlICdwcm90ZWN0Jzoge1xuXHRcdFx0XHQvLyBwcm90ZWN0IHRoZSBwYWdlXG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+S/neaKpOWujOaIkCcsICfkv53orbflrozmiJAnKTtcblx0XHRcdFx0bGV0IHN0YXR1c0luaXRlZCA9IGZhbHNlO1xuXHRcdFx0XHRsZXQgdGhpc3BhZ2U7XG5cdFx0XHRcdGNvbnN0IGFsbERvbmUgPSAoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHRoaXNwYWdlKSB7XG5cdFx0XHRcdFx0XHR0aGlzcGFnZS5nZXRTdGF0dXNFbGVtZW50KCkuaW5mbygn5a6M5oiQJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0YWdwYXJhbXMpIHtcblx0XHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5jYWxsYmFja3MudGFnZ2luZ1BhZ2VJbml0aWFsKHRhZ3BhcmFtcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChjbG9zZXBhcmFtcyAmJiBjbG9zZXBhcmFtcy50eXBlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBycHBQYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdFx0J0xJQl90YWxrOumhtemdouS/neaKpOivt+axgicsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5YWz6Zet6K+35rGCJywgJ+mXnOmWieiri+axgicpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cnBwUGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0XHRcdHJwcFBhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKGNsb3NlcGFyYW1zKTtcblx0XHRcdFx0XHRcdHJwcFBhZ2UubG9hZChUd2lua2xlLnByb3RlY3QuY2FsbGJhY2tzLmNsb3NlUmVxdWVzdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBwcm90ZWN0SXQgPSAobmV4dCkgPT4ge1xuXHRcdFx0XHRcdHRoaXNwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+d5oqk6aG16Z2iJywgJ+S/neitt+mggemdoicpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkge1xuXHRcdFx0XHRcdFx0aWYgKGlucHV0LmVkaXRtb2RpZnkpIHtcblx0XHRcdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0RWRpdFByb3RlY3Rpb24oaW5wdXQuZWRpdGxldmVsLCBpbnB1dC5lZGl0ZXhwaXJ5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChpbnB1dC5tb3ZlbW9kaWZ5KSB7XG5cdFx0XHRcdFx0XHRcdC8vIEVuc3VyZSBhIGxldmVsIGhhcyBhY3R1YWxseSBiZWVuIGNob3NlblxuXHRcdFx0XHRcdFx0XHRpZiAoaW5wdXQubW92ZWxldmVsKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0TW92ZVByb3RlY3Rpb24oaW5wdXQubW92ZWxldmVsLCBpbnB1dC5tb3ZlZXhwaXJ5KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfmgqjpnIDopoHpgInmi6nkv53miqTlsYLnuqfvvIEnLCAn5oKo6ZyA6KaB6YG45pOH5L+d6K235bGk57Sa77yBJyksIHtcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVwcm90ZWN0Jyxcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXNwYWdlLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoUHJvdGVjdGVkUGFnZXMnKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXNwYWdlLnNldENyZWF0ZVByb3RlY3Rpb24oaW5wdXQuY3JlYXRlbGV2ZWwsIGlucHV0LmNyZWF0ZWV4cGlyeSk7XG5cdFx0XHRcdFx0XHR0aGlzcGFnZS5zZXRXYXRjaGxpc3QoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaW5wdXQucHJvdGVjdFJlYXNvbikge1xuXHRcdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0RWRpdFN1bW1hcnkoaW5wdXQucHJvdGVjdFJlYXNvbik7XG5cdFx0XHRcdFx0XHR0aGlzcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG13Lm5vdGlmeShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlv4XpobvovpPlhaXkv53miqTnkIbnlLHvvIzov5nlsIbooqvorrDlvZXlnKjkv53miqTml6Xlv5fkuK3jgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfmgqjlv4XpoIjovLjlhaXkv53orbfnkIbnlLHvvIzpgJnlsIfooqvoqJjpjITlnKjkv53orbfml6XoqozkuK3jgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAndHdpbmtsZXByb3RlY3QnLFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXN0YXR1c0luaXRlZCkge1xuXHRcdFx0XHRcdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRcdFx0c3RhdHVzSW5pdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpc3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHRoaXNwYWdlLnByb3RlY3QobmV4dCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChpbnB1dC5lZGl0bW9kaWZ5IHx8IGlucHV0Lm1vdmVtb2RpZnkgfHwgIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHtcblx0XHRcdFx0XHRwcm90ZWN0SXQoYWxsRG9uZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn6K+35ZGK6K+JVHdpbmtsZeimgeWBmuS7gOS5iO+8gVxcbuiLpeaCqOWPquaYr+aDs+agh+iusOivpemhte+8jOivt+mAieaLqeS4iumdoueahOKAnOeUqOS/neaKpOaooeadv+agh+iusOatpOmhteKAnemAiemhueOAgicsXG5cdFx0XHRcdFx0XHRcdCfoq4vlkYroqLRUd2lua2xl6KaB5YGa5LuA6bq877yBXFxu6Iul5oKo5Y+q5piv5oOz5qiZ6KiY6Kmy6aCB77yM6KuL6YG45pOH5LiK6Z2i55qE44CM55So5L+d6K235qih5p2/5qiZ6KiY5q2k6aCB44CN6YG46aCF44CCJ1xuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlcHJvdGVjdCcsXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgJ3RhZyc6XG5cdFx0XHRcdC8vIGFwcGx5IGEgcHJvdGVjdGlvbiB0ZW1wbGF0ZVxuXHRcdFx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLmZvbGxvd1JlZGlyZWN0ID0gZmFsc2U7XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5qCH6K6w5a6M5oiQJywgJ+aomeiomOWujOaIkCcpO1xuXHRcdFx0XHRUd2lua2xlLnByb3RlY3QuY2FsbGJhY2tzLnRhZ2dpbmdQYWdlSW5pdGlhbCh0YWdwYXJhbXMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JlcXVlc3QnOiB7XG5cdFx0XHRcdC8vIGZpbGUgcmVxdWVzdCBhdCBSRlBQXG5cdFx0XHRcdGxldCB0eXBlbmFtZTtcblx0XHRcdFx0bGV0IHR5cGVyZWFzb247XG5cdFx0XHRcdHN3aXRjaCAoaW5wdXQuY2F0ZWdvcnkpIHtcblx0XHRcdFx0XHRjYXNlICdwcC1kaXNwdXRlJzpcblx0XHRcdFx0XHRjYXNlICdwcC1wcm90ZWN0ZWQnOlxuXHRcdFx0XHRcdFx0dHlwZW5hbWUgPSB3aW5kb3cud2dVTFMoJ+WFqOS/neaKpCcsICflhajkv53orbcnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLXRlbXBsYXRlJzpcblx0XHRcdFx0XHRcdHR5cGVuYW1lID0gd2luZG93LndnVUxTKCfmqKHmnb/kv53miqQnLCAn5qih5p2/5L+d6K23Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcC12YW5kYWxpc20nOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktZGlzcnVwdGl2ZSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS11bnNvdXJjZWQnOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktdmFuZGFsaXNtJzpcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLXVzZXJ0YWxrJzpcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLXRlbXBsYXRlJzogLy8gcmVtb3ZlZCBmb3Igbm93XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS1zb2NrJzpcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLWJscCc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS1wcm90ZWN0ZWQnOlxuXHRcdFx0XHRcdFx0dHlwZW5hbWUgPSB3aW5kb3cud2dVTFMoJ+WNiuS/neaKpCcsICfljYrkv53orbcnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLW1vdmUnOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLW1vdmUtZGlzcHV0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtbW92ZS1pbmRlZic6XG5cdFx0XHRcdFx0Y2FzZSAncHAtbW92ZS12YW5kYWxpc20nOlxuXHRcdFx0XHRcdFx0dHlwZW5hbWUgPSB3aW5kb3cud2dVTFMoJ+enu+WKqOS/neaKpCcsICfnp7vli5Xkv53orbcnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLWNyZWF0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLW9mZmVuc2l2ZSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLWJscCc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLXNhbHQnOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLWNyZWF0ZS11c2VycGFnZSc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLXJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLXZhbmRhbGlzbSc6XG5cdFx0XHRcdFx0XHR0eXBlbmFtZSA9IHdpbmRvdy53Z1VMUygn55m957q45L+d5oqkJywgJ+eZvee0meS/neittycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0LyogY2FzZSAndW5wcm90ZWN0JzogKi9cblx0XHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHR5cGVuYW1lID0gd2luZG93LndnVUxTKCfop6PpmaTkv53miqQnLCAn6Kej6Zmk5L+d6K23Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRzd2l0Y2ggKGlucHV0LmNhdGVnb3J5KSB7XG5cdFx0XHRcdFx0Y2FzZSAncHAtZGlzcHV0ZSc6XG5cdFx0XHRcdFx0XHR0eXBlcmVhc29uID0gd2luZG93LndnVUxTKCfkuonorq7jgIHnvJbovpHmiJgnLCAn54it6K2w44CB57eo6Lyv5oiwJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcC12YW5kYWxpc20nOlxuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktdmFuZGFsaXNtJzpcblx0XHRcdFx0XHRjYXNlICdwcC1jcmVhdGUtdmFuZGFsaXNtJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+aMgee7reegtOWdjycsICfmjIHnuoznoLTlo54nKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLXRlbXBsYXRlJzpcblx0XHRcdFx0XHRjYXNlICdwcC1zZW1pLXRlbXBsYXRlJzpcblx0XHRcdFx0XHRcdC8vIHJlbW92ZWQgZm9yIG5vd1xuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn6auY6aOO6Zmp5qih5p2/JywgJ+mrmOmiqOmaquaooeadvycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtY3JlYXRlLXVzZXJwYWdlJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+iiq+awuOS5heWwgeemgeeahOeUqOaIt+mhtScsICfooqvmsLjkuYXlsIHpjpbnmoTkvb/nlKjogIXpoIHpnaInKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktdXNlcnRhbGsnOlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn5bey5bCB56aB55So5oi355qE6K6o6K666aG1JywgJ+W3suWwgemOluS9v+eUqOiAheeahOiojuirlumggScpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHAtc2VtaS1zb2NrJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+WCgOWEoeegtOWdjycsICflgoDlhKHnoLTlo54nKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLXNlbWktYmxwJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+i/neWPjeeUn+iAheS8oOiusOadoeS+iycsICfpgZXlj43nlJ/ogIXlgrPoqJjmop3kvosnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLW1vdmUtZGlzcHV0ZSc6XG5cdFx0XHRcdFx0XHR0eXBlcmVhc29uID0gd2luZG93LndnVUxTKCfkuonorq7jgIHnp7vliqjmiJgnLCAn54it6K2w44CB56e75YuV5oiwJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcC1tb3ZlLXZhbmRhbGlzbSc6XG5cdFx0XHRcdFx0XHR0eXBlcmVhc29uID0gd2luZG93LndnVUxTKCfnp7vliqjnoLTlnY8nLCAn56e75YuV56C05aOeJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcC1tb3ZlLWluZGVmJzpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSB3aW5kb3cud2dVTFMoJ+mrmOmjjumZqemhtemdoicsICfpq5jpoqjpmqrpoIHpnaInKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BwLWNyZWF0ZS1yZXBlYXQnOlxuXHRcdFx0XHRcdFx0dHlwZXJlYXNvbiA9IHdpbmRvdy53Z1VMUygn5aSa5qyh6YeN5aSN5Yib5bu6JywgJ+WkmuasoemHjeikh+W7uueriycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHR5cGVyZWFzb24gPSAnJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCByZWFzb24gPSB0eXBlcmVhc29uO1xuXHRcdFx0XHRpZiAoaW5wdXQucmVhc29uICE9PSAnJykge1xuXHRcdFx0XHRcdGlmICh0eXBlcmVhc29uICE9PSAnJykge1xuXHRcdFx0XHRcdFx0cmVhc29uICs9ICfvvJonO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZWFzb24gKz0gaW5wdXQucmVhc29uO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZWFzb24gIT09ICcnKSB7XG5cdFx0XHRcdFx0cmVhc29uID0gTW9yZWJpdHMuc3RyaW5nLmFwcGVuZFB1bmN0dWF0aW9uKHJlYXNvbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcnBwcGFyYW1zID0ge1xuXHRcdFx0XHRcdHJlYXNvbixcblx0XHRcdFx0XHR0eXBlbmFtZSxcblx0XHRcdFx0XHRjYXRlZ29yeTogaW5wdXQuY2F0ZWdvcnksXG5cdFx0XHRcdFx0ZXhwaXJ5OiBpbnB1dC5leHBpcnksXG5cdFx0XHRcdH07XG5cdFx0XHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdFx0XHRjb25zdCBycHBOYW1lID0gJ0xJQl90YWxrOumhtemdouS/neaKpOivt+axgic7XG5cdFx0XHRcdC8vIFVwZGF0aW5nIGRhdGEgZm9yIHRoZSBhY3Rpb24gY29tcGxldGVkIGV2ZW50XG5cdFx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gcnBwTmFtZTtcblx0XHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfmj5DlkI3lrozmiJDvvIzph43lrprlkJHliLDorqjorrrpobUnLFxuXHRcdFx0XHRcdCfmj5DlkI3lrozmiJDvvIzph43mlrDlsI7lkJHliLDoqI7oq5bpoIEnXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHJwcFBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHJwcE5hbWUsIHdpbmRvdy53Z1VMUygn6K+35rGC5L+d5oqk6aG16Z2iJywgJ+iri+axguS/neitt+mggemdoicpKTtcblx0XHRcdFx0cnBwUGFnZS5zZXRGb2xsb3dSZWRpcmVjdCh0cnVlKTtcblx0XHRcdFx0cnBwUGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocnBwcGFyYW1zKTtcblx0XHRcdFx0cnBwUGFnZS5sb2FkKFR3aW5rbGUucHJvdGVjdC5jYWxsYmFja3MuZmlsZVJlcXVlc3QpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG13Lm5vdGlmeSgndHdpbmtsZXByb3RlY3Q6IOacquefpeaTjeS9nOexu+WeiycsIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZXByb3RlY3QnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLnByb3RlY3QuY2FsbGJhY2tzID0ge1xuXHRcdHRhZ2dpbmdQYWdlSW5pdGlhbDogKHRhZ3BhcmFtcykgPT4ge1xuXHRcdFx0aWYgKHRhZ3BhcmFtcy50YWcgPT09ICdub29wJykge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+W6lOeUqOS/neaKpOaooeadvycsICfmh4nnlKjkv53orbfmqKHmnb8nKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ayoeS7gOS5iOimgeWBmueahCcsICfmspLku4DpurzopoHlgZrnmoQnKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwYWdlTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRcdGNvbnN0IHByb3RlY3RlZFBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHBhZ2VOYW1lLCB3aW5kb3cud2dVTFMoJ+agh+iusOmhtemdoicsICfmqJnoqJjpoIHpnaInKSk7XG5cdFx0XHRwcm90ZWN0ZWRQYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyh0YWdwYXJhbXMpO1xuXHRcdFx0cHJvdGVjdGVkUGFnZS5sb2FkKFR3aW5rbGUucHJvdGVjdC5jYWxsYmFja3MudGFnZ2luZ1BhZ2UpO1xuXHRcdH0sXG5cdFx0Z2V0VGFnZ2VkUGFnZTogKHBhcmFtcywgdGV4dCkgPT4ge1xuXHRcdFx0bGV0IHRhZztcblx0XHRcdGxldCBzdW1tYXJ5O1xuXHRcdFx0Y29uc3Qgb2xkdGFnX3JlID1cblx0XHRcdFx0Lyg/Ojxub2luY2x1ZGU+KT9bIFxcdF0qXFx7XFx7XFxzKihwcC1bXnt9XSo/fHByb3RlY3RlZHwoPzp0fHZ8c3xwLXx1c2VydGFsay12fHVzZXJ0YWxrLXN8c2J8bW92ZSlwcm90ZWN0ZWQoPzoyKT98cHJvdGVjdGVkIHRlbXBsYXRlfHByaXZhY3kgcHJvdGVjdGlvbilcXHMqP1xcfVxcfVxccyooPzo8XFwvbm9pbmNsdWRlPik/XFxzKi9naTtcblx0XHRcdGNvbnN0IHJlX3Jlc3VsdCA9IG9sZHRhZ19yZS5leGVjKHRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRyZV9yZXN1bHQgJiZcblx0XHRcdFx0KHBhcmFtcy50YWcgPT09ICdub25lJyB8fFxuXHRcdFx0XHRcdGNvbmZpcm0oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WcqOmhtemdouS4iuaJvuWIsHt7JywgJ+WcqOmggemdouS4iuaJvuWIsHt7JykgK1xuXHRcdFx0XHRcdFx0XHRyZV9yZXN1bHRbMV0gK1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J319XFxu5Y2V5Ye756Gu5a6a5Lul56e76Zmk77yM5oiW5Y2V5Ye75Y+W5raI5Lul5Y+W5raI5pON5L2c44CCJyxcblx0XHRcdFx0XHRcdFx0XHQnfX1cXG7pu57mk4rnorrlrprku6Xnp7vpmaTvvIzmiJbpu57mk4rlj5bmtojku6Xlj5bmtojmk43kvZzjgIInXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2Uob2xkdGFnX3JlLCAnJyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLnRhZyA9PT0gJ25vbmUnKSB7XG5cdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+enu+mZpOS/neaKpOaooeadvycsICfnp7vpmaTkv53orbfmqKHmnb8nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCh7dGFnfSA9IHBhcmFtcyk7XG5cdFx0XHRcdGlmIChwYXJhbXMucmVhc29uKSB7XG5cdFx0XHRcdFx0dGFnICs9IGB8cmVhc29uPSR7cGFyYW1zLnJlYXNvbn1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwYXJhbXMuc2hvd2V4cGlyeSAmJiBwYXJhbXMuZXhwaXJ5ICYmICFNb3JlYml0cy5zdHJpbmcuaXNJbmZpbml0eShwYXJhbXMuZXhwaXJ5KSkge1xuXHRcdFx0XHRcdHRhZyArPSAnfGV4cGlyeT17eycuY29uY2F0KCdzdWJzdDonLCBgI3RpbWU6Y3wke3BhcmFtcy5leHBpcnl9fX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocGFyYW1zLnNtYWxsKSB7XG5cdFx0XHRcdFx0dGFnICs9ICd8c21hbGw9eWVzJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoL15cXHMqIyg/OnJlZGlyZWN0fOmHjeWumuWQkXzph43mlrDlsI7lkJEpL2kudGVzdCh0ZXh0KSkge1xuXHRcdFx0XHRcdC8vIHJlZGlyZWN0IHBhZ2Vcblx0XHRcdFx0XHQvLyBPbmx5IHRhZyBpZiBubyB7e3JjYXQgc2hlbGx9fSBpcyBmb3VuZFxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHRleHQubWF0Y2goXG5cdFx0XHRcdFx0XHRcdC97eyg/OlJlZGlyZWN0WyBfXWNhdGVnb3J5IHNoZWxsfFJjYXRbIF9dc2hlbGx8VGhpc1sgX11pcyBhIHJlZGlyZWN0fOWkmuenjeexu+Wei+mHjeWumuWQkXzlpJrnqK7poZ7lnovph43lrprlkJF85aSa56iu6aGe5Z6L6YeN5paw5bCO5ZCRfOWkmuenjeexu+Wei+mHjeaWsOWvvOWQkXxSMHzlhbbku5bph43lrprlkJF8UkNTfFJlZGlyZWN0WyBfXXNoZWxsKS9pXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHRcdFx0J+W3suWtmOWcqFJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsJyxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmsqHku4DkuYjlj6/lgZrnmoQnLCAn5rKS5LuA6bq85Y+v5YGa55qEJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdFx0XHQvIyg/OnJlZGlyZWN0fOmHjeWumuWQkXzph43mlrDlsI7lkJEpID8oXFxbXFxbLio/XFxdXFxdKSguKikvaSxcblx0XHRcdFx0XHRcdGAjUkVESVJFQ1QgJDEkMlxcblxcbnt7JHt0YWd9fX1gXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAocGFyYW1zLm5vaW5jbHVkZSkge1xuXHRcdFx0XHRcdFx0dGFnID0gYDxub2luY2x1ZGU+e3ske3RhZ319fTwvbm9pbmNsdWRlPmA7XG5cdFx0XHRcdFx0XHQvLyDlj6rmnInooajmoLzpnIDopoHljZXni6zliqDlm57ovabvvIzlhbbku5bmg4XlhrXliqDlm57ovabkvJrnoLTlnY/mqKHmnb/jgIJcblx0XHRcdFx0XHRcdGlmICh0ZXh0LmluZGV4T2YoJ3t8JykgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0dGFnICs9ICdcXG4nO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0YWcgPSBge3ske3RhZ319fVxcbmA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIEluc2VydCB0YWcgYWZ0ZXIgc2hvcnQgZGVzY3JpcHRpb24gb3IgYW55IGhhdG5vdGVzXG5cdFx0XHRcdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2l0ZXh0LnBhZ2UodGV4dCk7XG5cdFx0XHRcdFx0dGV4dCA9IHlzYXJjaGl2ZXNfcGFnZS5pbnNlcnRBZnRlclRlbXBsYXRlcyh0YWcsIFR3aW5rbGUuaGF0bm90ZVJlZ2V4KS5nZXRUZXh0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3VtbWFyeSA9IGDliqDlhaV7eyR7cGFyYW1zLnRhZ319fWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0ZXh0LFxuXHRcdFx0XHRzdW1tYXJ5LFxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHRhZ2dpbmdQYWdlOiAocHJvdGVjdGVkUGFnZSkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcHJvdGVjdGVkUGFnZS5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGNvbnN0IHRleHQgPSBwcm90ZWN0ZWRQYWdlLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBuZXdWZXJzaW9uID0gVHdpbmtsZS5wcm90ZWN0LmNhbGxiYWNrcy5nZXRUYWdnZWRQYWdlKHBhcmFtcywgdGV4dCk7XG5cdFx0XHRpZiAobmV3VmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3RlY3RlZFBhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLmluZm8oJ+WujOaIkCcpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRwcm90ZWN0ZWRQYWdlLnNldEVkaXRTdW1tYXJ5KG5ld1ZlcnNpb24uc3VtbWFyeSk7XG5cdFx0XHRwcm90ZWN0ZWRQYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHByb3RlY3RlZFBhZ2Uuc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hQUFRhZ2dlZFBhZ2VzJykpO1xuXHRcdFx0cHJvdGVjdGVkUGFnZS5zZXRQYWdlVGV4dChuZXdWZXJzaW9uLnRleHQpO1xuXHRcdFx0cHJvdGVjdGVkUGFnZS5zZXRDcmVhdGVPcHRpb24oJ25vY3JlYXRlJyk7XG5cdFx0XHRwcm90ZWN0ZWRQYWdlLnN1cHByZXNzUHJvdGVjdFdhcm5pbmcoKTsgLy8gbm8gbmVlZCB0byBsZXQgYWRtaW5zIGtub3cgdGhleSBhcmUgZWRpdGluZyB0aHJvdWdoIHByb3RlY3Rpb25cblx0XHRcdHByb3RlY3RlZFBhZ2Uuc2F2ZSgpO1xuXHRcdH0sXG5cdFx0ZmlsZVJlcXVlc3Q6IChycHBQYWdlKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBycHBQYWdlLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0bGV0IHRleHQgPSBycHBQYWdlLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBzdGF0dXNFbGVtZW50ID0gcnBwUGFnZS5nZXRTdGF0dXNFbGVtZW50KCk7XG5cdFx0XHRjb25zdCBycHBSZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdGA9PT1cXFxccyooXFxcXFtcXFxcWyk/XFxcXHMqOj9cXFxccyoke01vcmViaXRzLnN0cmluZy5lc2NhcGVSZWdFeHAoTW9yZWJpdHMucGFnZU5hbWVOb3JtKX1cXFxccyooXFxcXF1cXFxcXSk/XFxcXHMqPT09YCxcblx0XHRcdFx0J20nXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgdGFnID0gcnBwUmUuZXhlYyh0ZXh0KTtcblx0XHRcdGNvbnN0IHJwcExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0XHRycHBMaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIG13LnV0aWwuZ2V0VXJsKHJwcFBhZ2UuZ2V0UGFnZU5hbWUoKSkpO1xuXHRcdFx0cnBwTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShycHBQYWdlLmdldFBhZ2VOYW1lKCkpKTtcblx0XHRcdGlmICh0YWcpIHtcblx0XHRcdFx0c3RhdHVzRWxlbWVudC5lcnJvcihbXG5cdFx0XHRcdFx0cnBwTGluayxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+W3suacieWvueatpOmhtemdoueahOS/neaKpOaPkOWQje+8jOWPlua2iOaTjeS9nOOAgicsICflt7LmnInlsI3mraTpoIHpnaLnmoTkv53orbfmj5DlkI3vvIzlj5bmtojmk43kvZzjgIInKSxcblx0XHRcdFx0XSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBuZXd0YWcgPSBgPT09IFtbOiR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dID09PVxcbmA7XG5cdFx0XHRpZiAobmV3IFJlZ0V4cChgXiR7bXcudXRpbC5lc2NhcGVSZWdFeHAobmV3dGFnKS5yZXBsYWNlKC9cXHMrL2csIFN0cmluZy5yYXdgXFxzKmApfWAsICdtJykudGVzdCh0ZXh0KSkge1xuXHRcdFx0XHRzdGF0dXNFbGVtZW50LmVycm9yKFtcblx0XHRcdFx0XHRycHBMaW5rLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bey5pyJ5a+55q2k6aG16Z2i55qE5L+d5oqk5o+Q5ZCN77yM5Y+W5raI5pON5L2c44CCJywgJ+W3suacieWwjeatpOmggemdoueahOS/neitt+aPkOWQje+8jOWPlua2iOaTjeS9nOOAgicpLFxuXHRcdFx0XHRdKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHdvcmRzO1xuXHRcdFx0c3dpdGNoIChwYXJhbXMuZXhwaXJ5KSB7XG5cdFx0XHRcdGNhc2UgJ3RlbXBvcmFyeSc6XG5cdFx0XHRcdFx0d29yZHMgPSB3aW5kb3cud2dVTFMoJ+S4tOaXticsICfoh6jmmYInKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnaW5maW5pdHknOlxuXHRcdFx0XHRcdHdvcmRzID0gJ+awuOS5hSc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0d29yZHMgPSAnJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHdvcmRzICs9IHBhcmFtcy50eXBlbmFtZTtcblx0XHRcdG5ld3RhZyArPSBgKiA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogOTAlXCI+JHt3aW5kb3cud2dVTFMoJ+W9k+WJjeS/neaKpOeKtuaAgScsICfnm67liY3kv53orbfni4DmhYsnKX3vvJp7e3Byb3RlY3Rpb24gc3RhdHVzfCR7XG5cdFx0XHRcdC9bPV0vLnRlc3QoTW9yZWJpdHMucGFnZU5hbWVOb3JtKSA/ICcxPScgOiAnJ1xuXHRcdFx0fSR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfX19PC9zcGFuPlxcbmA7XG5cdFx0XHRuZXd0YWcgKz0gYCR7XG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn6K+35rGCJywgJ+iri+axgicpICtcblx0XHRcdFx0TW9yZWJpdHMuc3RyaW5nLnRvVXBwZXJDYXNlRmlyc3RDaGFyKHdvcmRzKSArXG5cdFx0XHRcdChwYXJhbXMucmVhc29uID09PSAnJyA/ICfjgIInIDogYO+8miR7TW9yZWJpdHMuc3RyaW5nLmZvcm1hdFJlYXNvblRleHQocGFyYW1zLnJlYXNvbil9YClcblx0XHRcdH0tLX5+YC5jb25jYXQoJ35+Jyk7XG5cdFx0XHRsZXQgcmVnO1xuXHRcdFx0aWYgKHBhcmFtcy5jYXRlZ29yeSA9PT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0cmVnID0gLyg9PVxccyror7fmsYLop6PpmaTkv53miqRcXHMqPT0pLztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlZyA9IC8oe3tcXHMqXFwvaGVhZGVyXFxzKn19KS87XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvcmlnaW5hbFRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UocmVnLCBgJDFcXG4ke25ld3RhZ31cXG5gKTtcblx0XHRcdGlmICh0ZXh0Lmxlbmd0aCA9PT0gb3JpZ2luYWxUZXh0TGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IGxpbmtub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRsaW5rbm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBtdy51dGlsLmdldFVybCgnSGVscDpUd2lua2xlL+S/ruWkjVJGUFAnKSk7XG5cdFx0XHRcdGxpbmtub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHdpbmRvdy53Z1VMUygn5aaC5L2V5L+u5aSNUkZQUCcsICflpoLkvZXkv67lvqlSRlBQJykpKTtcblx0XHRcdFx0c3RhdHVzRWxlbWVudC5lcnJvcihbXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aXoOazleWcqExJQjpSRlBQ5LiK5om+5Yiw55u45YWz5a6a5L2N54K55qCH6K6w77yM6KaB5L+u5aSN5q2k6Zeu6aKY77yM6K+35Y+C6KeBJyxcblx0XHRcdFx0XHRcdCfnhKHms5XlnKhMSUI6UkZQUOS4iuaJvuWIsOebuOmXnOWumuS9jem7nuaomeiomO+8jOimgeS/ruW+qeatpOWVj+mhjO+8jOiri+WPg+imiydcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGxpbmtub2RlLFxuXHRcdFx0XHRcdCfjgIInLFxuXHRcdFx0XHRdKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0c3RhdHVzRWxlbWVudC5zdGF0dXMoJ+WKoOWFpeaWsOaPkOWQjeKApicpO1xuXHRcdFx0cnBwUGFnZS5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0YC8qICR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfSAqLyAke3dpbmRvdy53Z1VMUygn6K+35rGC5a+5JywgJ+iri+axguWwjScpfVtbJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV0ke1xuXHRcdFx0XHRcdHBhcmFtcy50eXBlbmFtZVxuXHRcdFx0XHR9YFxuXHRcdFx0KTtcblx0XHRcdHJwcFBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cnBwUGFnZS5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRcdHJwcFBhZ2Uuc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0cnBwUGFnZS5zYXZlKCgpID0+IHtcblx0XHRcdFx0Ly8gV2F0Y2ggdGhlIHBhZ2UgYmVpbmcgcmVxdWVzdGVkXG5cdFx0XHRcdGNvbnN0IHdhdGNoUHJlZiA9IFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hSZXF1ZXN0ZWRQYWdlcycpO1xuXHRcdFx0XHQvLyBhY3Rpb249d2F0Y2ggaGFzIG5vIHdheSB0byByZWx5IG9uIHVzZXIgcHJlZmVyZW5jZXMgKFQyNjI5MTIpLCBzbyB3ZSBkbyBpdCBtYW51YWxseS5cblx0XHRcdFx0Ly8gVGhlIHdhdGNoZGVmYXVsdCBwcmVmIGFwcGVhcnMgdG8gcmVsaWFibHkgcmV0dXJuICcxJyAoc3RyaW5nKSxcblx0XHRcdFx0Ly8gYnV0IHRoYXQncyBub3QgY29uc2lzdGVudCBhbW9uZyBwcmVmcyBzbyBtaWdodCBhcyB3ZWxsIGJlIFwiY29ycmVjdFwiXG5cdFx0XHRcdGNvbnN0IHdhdGNoID1cblx0XHRcdFx0XHR3YXRjaFByZWYgIT09ICdubycgJiZcblx0XHRcdFx0XHQod2F0Y2hQcmVmICE9PSAnZGVmYXVsdCcgfHwgISFOdW1iZXIucGFyc2VJbnQobXcudXNlci5vcHRpb25zLmdldCgnd2F0Y2hkZWZhdWx0JyksIDEwKSk7XG5cdFx0XHRcdGlmICh3YXRjaCkge1xuXHRcdFx0XHRcdGNvbnN0IHdhdGNoX3F1ZXJ5ID0ge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiAnd2F0Y2gnLFxuXHRcdFx0XHRcdFx0dGl0bGVzOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdFx0XHR0b2tlbjogbXcudXNlci50b2tlbnMuZ2V0KCd3YXRjaFRva2VuJyksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHQvLyBPbmx5IGFkZCB0aGUgZXhwaXJ5IGlmIHBhZ2UgaXMgdW53YXRjaGVkIG9yIGFscmVhZHkgdGVtcG9yYXJpbHkgd2F0Y2hlZFxuXHRcdFx0XHRcdGlmIChUd2lua2xlLnByb3RlY3Qud2F0Y2hlZCAhPT0gdHJ1ZSAmJiB3YXRjaFByZWYgIT09ICdkZWZhdWx0JyAmJiB3YXRjaFByZWYgIT09ICd5ZXMnKSB7XG5cdFx0XHRcdFx0XHR3YXRjaF9xdWVyeS5leHBpcnkgPSB3YXRjaFByZWY7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCG6K+35rGC5L+d5oqk55qE6aG16Z2i5Yqg5YWl5Yiw55uR6KeG5YiX6KGoJywgJ+Wwh+iri+axguS/neitt+eahOmggemdouWKoOWFpeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdFx0d2F0Y2hfcXVlcnlcblx0XHRcdFx0XHQpLnBvc3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRjbG9zZVJlcXVlc3Q6IChycHBQYWdlKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBycHBQYWdlLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0bGV0IHRleHQgPSBycHBQYWdlLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBzdGF0dXNFbGVtZW50ID0gcnBwUGFnZS5nZXRTdGF0dXNFbGVtZW50KCk7XG5cdFx0XHRjb25zdCBzZWN0aW9ucyA9IHRleHQuc3BsaXQoLyg/PVxcbj09XFxzKuivt+axguino+mZpOS/neaKpFxccyo9PSkvKTtcblx0XHRcdGlmIChzZWN0aW9ucy5sZW5ndGggIT09IDIpIHtcblx0XHRcdFx0Y29uc3QgbGlua25vZGUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRsaW5rbm9kZTIuc2V0QXR0cmlidXRlKCdocmVmJywgbXcudXRpbC5nZXRVcmwoJ0hlbHA6VHdpbmtsZS/kv67lpI1SRlBQJykpO1xuXHRcdFx0XHRsaW5rbm9kZTIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ+WmguS9leS/ruWkjVJGUFAnKSk7XG5cdFx0XHRcdHN0YXR1c0VsZW1lbnQuZXJyb3IoW1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfml6Dms5XlnKhMSUI6UkZQUOS4iuaJvuWIsOebuOWFs+WumuS9jeeCueagh+iusO+8jOimgeS/ruWkjeatpOmXrumimO+8jOivt+WPguingScsXG5cdFx0XHRcdFx0XHQn54Sh5rOV5ZyoTElCOlJGUFDkuIrmib7liLDnm7jpl5zlrprkvY3pu57mqJnoqJjvvIzopoHkv67lvqnmraTllY/poYzvvIzoq4vlj4PoposnXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRsaW5rbm9kZTIsXG5cdFx0XHRcdFx0J+OAgicsXG5cdFx0XHRcdF0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgc2VjdGlvblRleHQ7XG5cdFx0XHRsZXQgZXhwaXJ5VGV4dCA9ICcnO1xuXHRcdFx0aWYgKHBhcmFtcy50eXBlID09PSAndW5wcm90ZWN0Jykge1xuXHRcdFx0XHRbLCBzZWN0aW9uVGV4dF0gPSBzZWN0aW9ucztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFtzZWN0aW9uVGV4dF0gPSBzZWN0aW9ucztcblx0XHRcdFx0ZXhwaXJ5VGV4dCA9IE1vcmViaXRzLnN0cmluZy5mb3JtYXRUaW1lKHBhcmFtcy5leHBpcnkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVxdWVzdExpc3QgPSBzZWN0aW9uVGV4dC5zcGxpdCgvKD89XFxuPT09Lis9PT1cXHMqXFxuKS8pO1xuXHRcdFx0bGV0IGZvdW5kID0gZmFsc2U7XG5cdFx0XHRjb25zdCBycHBSZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdGA9PT1cXFxccyooXFxcXFtcXFxcWyk/XFxcXHMqOj9cXFxccyoke01vcmViaXRzLnBhZ2VOYW1lUmVnZXgoTW9yZWJpdHMucGFnZU5hbWVOb3JtKX1cXFxccyooXFxcXF1cXFxcXSk/XFxcXHMqPT09YCxcblx0XHRcdFx0J20nXG5cdFx0XHQpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCByZXF1ZXN0TGlzdC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocnBwUmUuZXhlYyhyZXF1ZXN0TGlzdFtpXSkpIHtcblx0XHRcdFx0XHRyZXF1ZXN0TGlzdFtpXSA9IHJlcXVlc3RMaXN0W2ldLnRyaW1FbmQoKTtcblx0XHRcdFx0XHRpZiAocGFyYW1zLnR5cGUgPT09ICd1bnByb3RlY3QnKSB7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0TGlzdFtpXSArPSAnXFxuOiB7e1JGUFB8aXN1bn1944CCLS1+ficuY29uY2F0KCd+flxcbicpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0TGlzdFtpXSArPSBgXFxuOiB7e1JGUFB8JHtwYXJhbXMudHlwZX18JHtcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkocGFyYW1zLmV4cGlyeSkgPyAnaW5maW5pdHknIDogZXhwaXJ5VGV4dFxuXHRcdFx0XHRcdFx0fX1944CCLS1+fmAuY29uY2F0KCd+flxcbicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghZm91bmQpIHtcblx0XHRcdFx0c3RhdHVzRWxlbWVudC53YXJuKHdpbmRvdy53Z1VMUygn5rKh5pyJ5om+5Yiw55u45YWz55qE6K+35rGCJywgJ+aykuacieaJvuWIsOebuOmXnOeahOiri+axgicpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy50eXBlID09PSAndW5wcm90ZWN0Jykge1xuXHRcdFx0XHR0ZXh0ID0gc2VjdGlvbnNbMF0gKyByZXF1ZXN0TGlzdC5qb2luKCcnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRleHQgPSByZXF1ZXN0TGlzdC5qb2luKCcnKSArIHNlY3Rpb25zWzFdO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHN1bW1hcnkgPSAnJztcblx0XHRcdGlmIChwYXJhbXMudHlwZSA9PT0gJ3VucHJvdGVjdCcpIHtcblx0XHRcdFx0Wywgc2VjdGlvblRleHRdID0gc2VjdGlvbnM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRbc2VjdGlvblRleHRdID0gc2VjdGlvbnM7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ3NlbWknOlxuXHRcdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+WNiuS/neaKpCcsICfljYrkv53orbcnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndGVtcCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn5qih5p2/5L+d5oqkJywgJ+aooeadv+S/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdlY3AnOlxuXHRcdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+W7tuS8uOehruiupOS/neaKpCcsICflu7bkvLjnorroqo3kv53orbcnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZnVsbCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn5YWo5L+d5oqkJywgJ+WFqOS/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdyZXZpc2lvbnByb3RlY3RlZCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn54mI5pys5L+d5oqkJywgJ+eJiOacrOS/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdvZmZpY2lhbHByb3RlY3RlZCc6XG5cdFx0XHRcdFx0c3VtbWFyeSA9IHdpbmRvdy53Z1VMUygn6KOB5aeU5Lya5L+d5oqkJywgJ+ijgeWnlOacg+S/neittycpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdtb3ZlJzpcblx0XHRcdFx0XHRzdW1tYXJ5ID0gd2luZG93LndnVUxTKCfnp7vliqjkv53miqQnLCAn56e75YuV5L+d6K23Jyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3NhbHQnOlxuXHRcdFx0XHRcdHN1bW1hcnkgPSB3aW5kb3cud2dVTFMoJ+eZvee6uOS/neaKpCcsICfnmb3ntJnkv53orbcnKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndW5wcm90ZWN0Jzpcblx0XHRcdFx0XHRzdW1tYXJ5ID0gd2luZG93LndnVUxTKCfop6PpmaTkv53miqQnLCAn6Kej6Zmk5L+d6K23Jyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0c3RhdHVzRWxlbWVudC53YXJuKHdpbmRvdy53Z1VMUygn5pyq55+l5L+d5oqk57G75Z6LJywgJ+acquefpeS/neitt+mhnuWIpScpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoTW9yZWJpdHMuc3RyaW5nLmlzSW5maW5pdHkocGFyYW1zLmV4cGlyeSkpIHtcblx0XHRcdFx0c3VtbWFyeSA9IGV4cGlyeVRleHQgKyBzdW1tYXJ5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3VtbWFyeSArPSBleHBpcnlUZXh0O1xuXHRcdFx0fVxuXHRcdFx0cnBwUGFnZS5zZXRFZGl0U3VtbWFyeShgLyogJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19ICovICR7c3VtbWFyeX1gKTtcblx0XHRcdHJwcFBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cnBwUGFnZS5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRcdHJwcFBhZ2Uuc2F2ZSgpO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUucHJvdGVjdC5mb3JtYXRQcm90ZWN0aW9uRGVzY3JpcHRpb24gPSAocHJvdGVjdGlvbkxldmVscykgPT4ge1xuXHRcdGNvbnN0IHByb3RlY3Rpb25Ob2RlID0gW107XG5cdFx0aWYgKE9iamVjdC5rZXlzKHByb3RlY3Rpb25MZXZlbHMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cHJvdGVjdGlvbk5vZGUucHVzaCgkKGA8Yj4ke3dpbmRvdy53Z1VMUygn5peg5L+d5oqkJywgJ+eEoeS/neittycpfTwvYj5gKVswXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoY29uc3QgW3R5cGUsIHNldHRpbmdzXSBvZiBPYmplY3QuZW50cmllcyhwcm90ZWN0aW9uTGV2ZWxzKSkge1xuXHRcdFx0XHRsZXQgbGFiZWw7XG5cdFx0XHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0XHRcdGNhc2UgJ2VkaXQnOlxuXHRcdFx0XHRcdFx0bGFiZWwgPSB3aW5kb3cud2dVTFMoJ+e8lui+kScsICfnt6jovK8nKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21vdmUnOlxuXHRcdFx0XHRcdFx0bGFiZWwgPSB3aW5kb3cud2dVTFMoJ+enu+WKqCcsICfnp7vli5UnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NyZWF0ZSc6XG5cdFx0XHRcdFx0XHRsYWJlbCA9IHdpbmRvdy53Z1VMUygn5Yib5bu6JywgJ+W7uueriycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndXBsb2FkJzpcblx0XHRcdFx0XHRcdGxhYmVsID0gd2luZG93LndnVUxTKCfkuIrkvKAnLCAn5LiK5YKzJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0bGFiZWwgPSB0eXBlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IGxldmVsO1xuXHRcdFx0XHRzd2l0Y2ggKHNldHRpbmdzLmxldmVsKSB7XG5cdFx0XHRcdFx0Y2FzZSAnb2ZmaWNpYWxwcm90ZWN0ZWQnOlxuXHRcdFx0XHRcdFx0bGV2ZWwgPSB3aW5kb3cud2dVTFMoJ+S7heWFgeiuuOaho+ahiOeQhuS6i+WRmCcsICflg4XlhYHoqLHmqpTmoYjnkIbkuovlk6EnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2F1dG9jb25maXJtZWQnOlxuXHRcdFx0XHRcdFx0bGV2ZWwgPSB3aW5kb3cud2dVTFMoJ+S7heWFgeiuuOiHquWKqOehruiupOeUqOaItycsICflg4XlhYHoqLHoh6rli5Xnorroqo3kvb/nlKjogIUnKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RlbXBsYXRlZWRpdG9yJzpcblx0XHRcdFx0XHRcdGxldmVsID0gd2luZG93LndnVUxTKCfku4XmqKHmnb/nvJbovpHlkZjlkoznrqHnkIblkZgnLCAn5YOF5qih5p2/57eo6Lyv5ZOh5ZKM566h55CG5ZOhJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzeXNvcCc6XG5cdFx0XHRcdFx0XHRsZXZlbCA9IHdpbmRvdy53Z1VMUygn5LuF566h55CG5ZGYJywgJ+WDheeuoeeQhuWToScpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdCh7bGV2ZWx9ID0gc2V0dGluZ3MpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJvdGVjdGlvbk5vZGUucHVzaCgkKGA8Yj4ke2xhYmVsfe+8miR7bGV2ZWx9PC9iPmApWzBdKTtcblx0XHRcdFx0aWYgKE1vcmViaXRzLnN0cmluZy5pc0luZmluaXR5KHNldHRpbmdzLmV4cGlyeSkpIHtcblx0XHRcdFx0XHRwcm90ZWN0aW9uTm9kZS5wdXNoKHdpbmRvdy53Z1VMUygn77yI5peg6ZmQ5pyf77yJJywgJ++8iOeEoemZkOacn++8iScpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwcm90ZWN0aW9uTm9kZS5wdXNoKFxuXHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfvvIjov4fmnJ/vvJonLCAn77yI6YGO5pyf77yaJykgKyBuZXcgTW9yZWJpdHMuZGF0ZShzZXR0aW5ncy5leHBpcnkpLmNhbGVuZGFyKCd1dGMnKX3vvIlgXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc2V0dGluZ3MuY2FzY2FkZSkge1xuXHRcdFx0XHRcdHByb3RlY3Rpb25Ob2RlLnB1c2god2luZG93LndnVUxTKCfvvIjov57plIHvvIknLCAn77yI6YCj6Y6W77yJJykpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBwcm90ZWN0aW9uTm9kZTtcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5wcm90ZWN0LCAncHJvdGVjdCcpO1xufSkoalF1ZXJ5KTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuLyohIFR3aW5rbGUuanMgLSBmcmllbmRseXRhZy5qcyAqL1xuKGZ1bmN0aW9uIGZyaWVuZGx5dGFnKCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdC8qKlxuXHQgKiBmcmllbmRseXRhZy5qczogVGFnIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJUYWdcIilcblx0ICogQWN0aXZlIG9uOiBFeGlzdGluZyBhcnRpY2xlcyBhbmQgZHJhZnRzOyBmaWxlIHBhZ2VzIHdpdGggYSBjb3JyZXNwb25kaW5nIGZpbGVcblx0ICogd2hpY2ggaXMgbG9jYWwgKG5vdCBvbiBTaGFyZSk7IGFsbCByZWRpcmVjdHNcblx0ICovXG5cdFR3aW5rbGUudGFnID0gKCkgPT4ge1xuXHRcdC8vIHJlZGlyZWN0IHRhZ2dpbmdcblx0XHRpZiAoTW9yZWJpdHMuaXNQYWdlUmVkaXJlY3QoKSkge1xuXHRcdFx0VHdpbmtsZS50YWcubW9kZSA9IHdpbmRvdy53Z1VMUygn6YeN5a6a5ZCRJywgJ+mHjeaWsOWwjuWQkScpO1xuXHRcdFx0VHdpbmtsZS50YWcubW9kZUVuID0gJ3JlZGlyZWN0Jztcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdFR3aW5rbGUudGFnLmNhbGxiYWNrLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+agh+iusCcsICfmqJnoqJgnKSxcblx0XHRcdFx0J2ZyaWVuZGx5LXRhZycsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5qCH6K6w6YeN5a6a5ZCRJywgJ+aomeiomOmHjeaWsOWwjuWQkScpXG5cdFx0XHQpO1xuXHRcdFx0Ly8gZmlsZSB0YWdnaW5nXG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDYgJiZcblx0XHRcdCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctc2hhcmVkdXBsb2FkJykgJiZcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1pbWFnZXBhZ2Utc2VjdGlvbi1maWxlaGlzdG9yeScpXG5cdFx0KSB7XG5cdFx0XHRUd2lua2xlLnRhZy5tb2RlID0gd2luZG93LndnVUxTKCfmlofku7YnLCAn5qqU5qGIJyk7XG5cdFx0XHRUd2lua2xlLnRhZy5tb2RlRW4gPSAnZmlsZSc7XG5cdFx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0XHRUd2lua2xlLnRhZy5jYWxsYmFjayxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmoIforrAnLCAn5qiZ6KiYJyksXG5cdFx0XHRcdCdmcmllbmRseS10YWcnLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+agh+iusOaWh+S7ticsICfmqJnoqJjmqpTmoYgnKVxuXHRcdFx0KTtcblx0XHRcdC8vIGFydGljbGUvZHJhZnQgdGFnZ2luZ1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQoWzAsIDMwMl0uaW5jbHVkZXMobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSkgJiYgbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJykpIHx8XG5cdFx0XHRNb3JlYml0cy5wYWdlTmFtZU5vcm0gPT09IFR3aW5rbGUuZ2V0UHJlZignc2FuZGJveFBhZ2UnKVxuXHRcdCkge1xuXHRcdFx0VHdpbmtsZS50YWcubW9kZSA9IHdpbmRvdy53Z1VMUygn5p2h55uuJywgJ+aineebricpO1xuXHRcdFx0VHdpbmtsZS50YWcubW9kZUVuID0gJ2FydGljbGUnO1xuXHRcdFx0Ly8gQ2FuJ3QgcmVtb3ZlIHRhZ3Mgd2hlbiBub3Qgdmlld2luZyBjdXJyZW50IHZlcnNpb25cblx0XHRcdFR3aW5rbGUudGFnLmNhblJlbW92ZSA9XG5cdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpID09PSBtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSAmJlxuXHRcdFx0XHQvLyBEaXNhYmxlZCBvbiBsYXRlc3QgZGlmZiBiZWNhdXNlIHRoZSBkaWZmIHNsaWRlciBjb3VsZCBiZSB1c2VkIHRvIHNsaWRlXG5cdFx0XHRcdC8vIGF3YXkgZnJvbSB0aGUgbGF0ZXN0IGRpZmYgd2l0aG91dCBjYXVzaW5nIHRoZSBzY3JpcHQgdG8gcmVsb2FkXG5cdFx0XHRcdCFtdy5jb25maWcuZ2V0KCd3Z0RpZmZOZXdJZCcpO1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFx0VHdpbmtsZS50YWcuY2FsbGJhY2ssXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5qCH6K6wJywgJ+aomeiomCcpLFxuXHRcdFx0XHQnZnJpZW5kbHktdGFnJyxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmoIforrDmnaHnm64nLCAn5qiZ6KiY5qKd55uuJylcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLnRhZy5jaGVja2VkVGFncyA9IFtdO1xuXHRUd2lua2xlLnRhZy5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYzMCwgVHdpbmtsZS50YWcubW9kZUVuID09PSAnYXJ0aWNsZScgPyA1MDAgOiA0MDApO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCfmoIforrDorr7nva4nLCAn5qiZ6KiY6Kit5a6aJyksICdIOlRXL1BSRUYjdGFnJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI3RhZycpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUudGFnLmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn562b6YCJ5qCH6K6w5YiX6KGo77yaJywgJ+evqemBuOaomeiomOWIl+ihqO+8micpLFxuXHRcdFx0bmFtZTogJ3F1aWNrZmlsdGVyJyxcblx0XHRcdHNpemU6ICczMCcsXG5cdFx0XHRldmVudDogZnVuY3Rpb24gZXZlbnQoKSB7XG5cdFx0XHRcdC8vIGZsdXNoIHRoZSBET00gb2YgYWxsIGV4aXN0aW5nIHVuZGVybGluZSBzcGFuc1xuXHRcdFx0XHQkYWxsQ2hlY2tib3hEaXZzLmZpbmQoJy5zZWFyY2gtaGl0JykuZWFjaCgoX2ksIGUpID0+IHtcblx0XHRcdFx0XHRjb25zdCBsYWJlbF9lbGVtZW50ID0gZS5wYXJlbnRFbGVtZW50O1xuXHRcdFx0XHRcdC8vIFRoaXMgd291bGQgY29udmVydCA8bGFiZWw+SGVsbG8gPHNwYW4gY2xhc3M9c2VhcmNoLWhpdD53bzwvc3Bhbj5ybGQ8L2xhYmVsPlxuXHRcdFx0XHRcdC8vIHRvIDxsYWJlbD5IZWxsbyB3b3JsZDwvbGFiZWw+XG5cdFx0XHRcdFx0bGFiZWxfZWxlbWVudC5pbm5lckhUTUwgPSBsYWJlbF9lbGVtZW50LnRleHRDb250ZW50O1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKHRoaXMudmFsdWUpIHtcblx0XHRcdFx0XHQkYWxsQ2hlY2tib3hEaXZzLmhpZGUoKTtcblx0XHRcdFx0XHQkYWxsSGVhZGVycy5oaWRlKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc2VhcmNoU3RyaW5nID0gdGhpcy52YWx1ZTtcblx0XHRcdFx0XHRjb25zdCBzZWFyY2hSZWdleCA9IG5ldyBSZWdFeHAobXcudXRpbC5lc2NhcGVSZWdFeHAoc2VhcmNoU3RyaW5nKSwgJ2knKTtcblx0XHRcdFx0XHQkYWxsQ2hlY2tib3hEaXZzLmZpbmQoJ2xhYmVsJykuZWFjaCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBsYWJlbF90ZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcblx0XHRcdFx0XHRcdGNvbnN0IHNlYXJjaEhpdCA9IHNlYXJjaFJlZ2V4LmV4ZWMobGFiZWxfdGV4dCk7XG5cdFx0XHRcdFx0XHRpZiAoc2VhcmNoSGl0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgW3RleHRub2RlXSA9IGVsZW1lbnQuY2hpbGROb2Rlcztcblx0XHRcdFx0XHRcdFx0cmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRleHRub2RlKTtcblx0XHRcdFx0XHRcdFx0cmFuZ2Uuc2V0U3RhcnQodGV4dG5vZGUsIHNlYXJjaEhpdC5pbmRleCk7XG5cdFx0XHRcdFx0XHRcdHJhbmdlLnNldEVuZCh0ZXh0bm9kZSwgc2VhcmNoSGl0LmluZGV4ICsgc2VhcmNoU3RyaW5nLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IFt1bmRlcmxpbmVfc3Bhbl0gPSAkKCc8c3Bhbj4nKVxuXHRcdFx0XHRcdFx0XHRcdC5hZGRDbGFzcygnc2VhcmNoLWhpdCcpXG5cdFx0XHRcdFx0XHRcdFx0LmNzcygndGV4dC1kZWNvcmF0aW9uJywgJ3VuZGVybGluZScpO1xuXHRcdFx0XHRcdFx0XHRyYW5nZS5zdXJyb3VuZENvbnRlbnRzKHVuZGVybGluZV9zcGFuKTtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBzaG93XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JGFsbENoZWNrYm94RGl2cy5zaG93KCk7XG5cdFx0XHRcdFx0JGFsbEhlYWRlcnMuc2hvdygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHRcdHN3aXRjaCAoVHdpbmtsZS50YWcubW9kZUVuKSB7XG5cdFx0XHRjYXNlICdhcnRpY2xlJzpcblx0XHRcdFx0V2luZG93LnNldFRpdGxlKHdpbmRvdy53Z1VMUygn5p2h55uu57u05oqk5qCH6K6wJywgJ+aineebrue2reitt+aomeiomCcpKTtcblx0XHRcdFx0Ly8gQnVpbGQgc29ydGluZyBhbmQgbG9va3VwIG9iamVjdCBmbGF0T2JqZWN0LCB3aGljaCBpcyBhbHdheXNcblx0XHRcdFx0Ly8gbmVlZGVkIGJ1dCBhbHNvIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGFscGhhYmV0aWNhbCBsaXN0XG5cdFx0XHRcdC8vIFdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIHdpdGggT2JqZWN0LnZhbHVlc1xuXHRcdFx0XHRUd2lua2xlLnRhZy5hcnRpY2xlLmZsYXRPYmplY3QgPSB7fTtcblx0XHRcdFx0Zm9yIChjb25zdCBncm91cCBvZiBUd2lua2xlLnRhZy5hcnRpY2xlLnRhZ0xpc3QpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHN1Ymdyb3VwIG9mIGdyb3VwLnZhbHVlKSB7XG5cdFx0XHRcdFx0XHRpZiAoc3ViZ3JvdXAudmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIHN1Ymdyb3VwLnZhbHVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0VHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0W2l0ZW0udGFnXSA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBpdGVtLmRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZXhjbHVkZU1JOiAhIWl0ZW0uZXhjbHVkZU1JLFxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFtzdWJncm91cC50YWddID0ge1xuXHRcdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzdWJncm91cC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdFx0XHRleGNsdWRlTUk6ICEhc3ViZ3JvdXAuZXhjbHVkZU1JLFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NvcnRvcmRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5p+l55yL5YiX6KGo77yaJywgJ+aqouimluWIl+ihqO+8micpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XlnKhUd2lua2xl5Y+C5pWw6K6+572u77yISDpUVy9QUkVG77yJ5Lit5pu05pS55q2k6aG544CCJyxcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XlnKhUd2lua2xl5YGP5aW96Kit5a6a77yISDpUVy9QUkVG77yJ5Lit5pu05pS55q2k6aCF44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUudGFnLnVwZGF0ZVNvcnRPcmRlcixcblx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2NhdCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aMieexu+WeiycsICfmjInpoZ7liKUnKSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IFR3aW5rbGUuZ2V0UHJlZigndGFnQXJ0aWNsZVNvcnRPcmRlcicpID09PSAnY2F0Jyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdvcHRpb24nLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2FscGhhJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICfmjInlrZfmr40nLFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogVHdpbmtsZS5nZXRQcmVmKCd0YWdBcnRpY2xlU29ydE9yZGVyJykgPT09ICdhbHBoYScsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIVR3aW5rbGUudGFnLmNhblJlbW92ZSkge1xuXHRcdFx0XHRcdGNvbnN0IGRpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0XHRkaXZFbGVtZW50LmlubmVySFRNTCA9IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfopoHnp7vpmaTnjrDmnInnu7TmiqTmoIforrDvvIzor7fku47lvZPliY3mnaHnm67niYjmnKzkuK3miZPlvIDigJzmoIforrDigJ3oj5zljZUnLFxuXHRcdFx0XHRcdFx0J+imgeenu+mZpOePvuaciee2reitt+aomeiomO+8jOiri+W+nuebruWJjeaineebrueJiOacrOS4reaJk+mWi+OAjOaomeiomOOAjemBuOWWridcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ3VudGFnbm90aWNlJyxcblx0XHRcdFx0XHRcdGxhYmVsOiBkaXZFbGVtZW50LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRpZDogJ3RhZ1dvcmtBcmVhJyxcblx0XHRcdFx0XHRjbGFzc05hbWU6ICdtb3JlYml0cy1zY3JvbGxib3gnLFxuXHRcdFx0XHRcdHN0eWxlOiAnbWF4LWhlaWdodDogMjhlbScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WmguWPr+iDve+8jOWQiOW5tuWFpXt7bXVsdGlwbGUgaXNzdWVzfX0nLFxuXHRcdFx0XHRcdFx0XHRcdCflpoLlj6/og73vvIzlkIjkvbXlhaV7e211bHRpcGxlIGlzc3Vlc319J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2dyb3VwJyxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2dyb3VwJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfoi6XliqDlhaV7e211bHRpcGxlIGlzc3Vlc3195pSv5oyB55qE5LiJ5Liq5Lul5LiK55qE5qih5p2/77yM5omA5pyJ5pSv5oyB55qE5qih5p2/6YO95Lya6KKr5ZCI5bm25YWle3ttdWx0aXBsZSBpc3N1ZXN9feaooeadv+S4reOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+iLpeWKoOWFpXt7bXVsdGlwbGUgaXNzdWVzfX3mlK/mj7TnmoTkuInlgIvku6XkuIrnmoTmqKHmnb/vvIzmiYDmnInmlK/mj7TnmoTmqKHmnb/pg73mnIPooqvlkIjkvbXlhaV7e211bHRpcGxlIGlzc3Vlc3195qih5p2/5Lit44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRjaGVja2VkOiBUd2lua2xlLmdldFByZWYoJ2dyb3VwQnlEZWZhdWx0JyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRsYWJlbDogJ+eQhueUse+8micsXG5cdFx0XHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+mZhOWKoOS6jue8lui+keaRmOimgeeahOWPr+mAieeQhueUse+8jOS+i+WmguaMh+WHuuadoeebruWGheWuueeahOWTquS6m+mDqOWIhuaciemXrumimOaIluenu+mZpOaooeadv+eahOeQhueUse+8jOS9huiLpeeQhueUseW+iOmVv+WImeW6lOivpeWPkeihqOWcqOiuqOiuuumhteOAgicsXG5cdFx0XHRcdFx0XHQn6ZmE5Yqg5pa857eo6Lyv5pGY6KaB55qE5Y+v6YG455CG55Sx77yM5L6L5aaC5oyH5Ye65qKd55uu5YWn5a6555qE5ZOq5Lqb6YOo5YiG5pyJ5ZWP6aGM5oiW56e76Zmk5qih5p2/55qE55CG55Sx77yM5L2G6Iul55CG55Sx5b6I6ZW35YmH5oeJ6Kmy55m86KGo5Zyo6KiO6KuW6aCB44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0c2l6ZTogJzgwJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZmlsZSc6XG5cdFx0XHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+aWh+S7tue7tOaKpOagh+iusCcsICfmqpTmoYjntq3orbfmqJnoqJgnKSk7XG5cdFx0XHRcdGZvciAoY29uc3QgZ3JvdXAgb2YgVHdpbmtsZS50YWcuZmlsZUxpc3QpIHtcblx0XHRcdFx0XHRpZiAoZ3JvdXAuYnVpbGRGaWxlbmFtZSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBlbCBvZiBncm91cC52YWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRlbC5zdWJncm91cCA9IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+abv+aNoueahOaWh+S7tu+8micsICfmm7/mj5vnmoTmqpTmoYjvvJonKSxcblx0XHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn6L6T5YWl5pu/5o2i5q2k5paH5Lu255qE5paH5Lu25ZCN56ew77yI5b+F5aGr77yJJyxcblx0XHRcdFx0XHRcdFx0XHRcdCfovLjlhaXmm7/mj5vmraTmqpTmoYjnmoTmqpTmoYjlkI3nqLHvvIjlv4XloavvvIknXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiBgJHtlbC52YWx1ZS5yZXBsYWNlKC8gL2csICdfJyl9RmlsZWAsXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdFx0bGFiZWw6IGdyb3VwLmtleSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ3RhZ3MnLFxuXHRcdFx0XHRcdFx0bGlzdDogZ3JvdXAudmFsdWUsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tRmlsZVRhZ0xpc3QnKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieaooeadvycsICfoh6roqILmqKHmnb8nKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ3RhZ3MnLFxuXHRcdFx0XHRcdFx0bGlzdDogVHdpbmtsZS5nZXRQcmVmKCdjdXN0b21GaWxlVGFnTGlzdCcpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVkaXJlY3QnOiB7XG5cdFx0XHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+mHjeWumuWQkeagh+iusCcsICfph43mlrDlsI7lkJHmqJnoqJgnKSk7XG5cdFx0XHRcdGNvbnN0IGkgPSAxO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGdyb3VwIG9mIFR3aW5rbGUudGFnLnJlZGlyZWN0TGlzdCkge1xuXHRcdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdFx0aWQ6IGB0YWdIZWFkZXIke2l9YCxcblx0XHRcdFx0XHRcdGxhYmVsOiBncm91cC5rZXksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICd0YWdzJyxcblx0XHRcdFx0XHRcdGxpc3Q6IGdyb3VwLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBpdGVtLnRhZyxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7JHtpdGVtLnRhZ319fe+8miR7aXRlbS5kZXNjcmlwdGlvbn1gLFxuXHRcdFx0XHRcdFx0XHRcdHN1Ymdyb3VwOiBpdGVtLnN1Ymdyb3VwLFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tUmVkaXJlY3RUYWdMaXN0JykubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnmqKHmnb8nLCAn6Ieq6KiC5qih5p2/JyksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdG5hbWU6ICd0YWdzJyxcblx0XHRcdFx0XHRcdGxpc3Q6IFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tUmVkaXJlY3RUYWdMaXN0JyksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtdy5ub3RpZnkoYFR3aW5rbGUudGFn77ya5pyq55+l5qih5byPICR7VHdpbmtsZS50YWcubW9kZX1gLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ2ZyaWVuZGx5dGFnJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhdHJvbGxpbmsnKS5sZW5ndGgpIHtcblx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOmhtemdouS4uuW3suW3oeafpScsICfmqJnoqJjpoIHpnaLngrrlt7Llt6Hmn6UnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiAncGF0cm9sJyxcblx0XHRcdFx0XHRcdG5hbWU6ICdwYXRyb2wnLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdtYXJrVGFnZ2VkUGFnZXNBc1BhdHJvbGxlZCcpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0XHRjbGFzc05hbWU6ICd0dy10YWctc3VibWl0Jyxcblx0XHR9KTtcblx0XHRjb25zdCByZXN1bHQgPSBmb3JtLnJlbmRlcigpO1xuXHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0XHQvLyBmb3IgcXVpY2sgZmlsdGVyOlxuXHRcdCRhbGxDaGVja2JveERpdnMgPSAkKHJlc3VsdCkuZmluZCgnW25hbWUkPXRhZ3NdJykucGFyZW50KCk7XG5cdFx0JGFsbEhlYWRlcnMgPSAkKHJlc3VsdCkuZmluZCgnaDUnKTtcblx0XHRyZXN1bHQucXVpY2tmaWx0ZXIuZm9jdXMoKTsgLy8gcGxhY2UgY3Vyc29yIGluIHRoZSBxdWljayBmaWx0ZXIgZmllbGQgYXMgc29vbiBhcyB3aW5kb3cgaXMgb3BlbmVkXG5cdFx0cmVzdWx0LnF1aWNrZmlsdGVyLmF1dG9jb21wbGV0ZSA9ICdvZmYnOyAvLyBkaXNhYmxlIGJyb3dzZXIgc3VnZ2VzdGlvbnNcblx0XHRyZXN1bHQucXVpY2tmaWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZSkgPT4ge1xuXHRcdFx0aWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG5cdFx0XHRcdC8vIHByZXZlbnQgZW50ZXIga2V5IGZyb20gYWNjaWRlbnRhbGx5IHN1Ym1pdHRpbmcgdGhlIGZvcm1cblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKFR3aW5rbGUudGFnLm1vZGVFbiA9PT0gJ2FydGljbGUnKSB7XG5cdFx0XHRUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3MgPSBbXTtcblx0XHRcdGlmIChUd2lua2xlLnRhZy5jYW5SZW1vdmUpIHtcblx0XHRcdFx0Ly8gTG9vayBmb3IgZXhpc3RpbmcgbWFpbnRlbmFuY2UgdGFncyBpbiB0aGUgbGVhZCBzZWN0aW9uIGFuZCBwdXQgdGhlbSBpbiBhcnJheVxuXHRcdFx0XHQvLyBBbGwgdGFncyBhcmUgSFRNTCB0YWJsZSBlbGVtZW50cyB0aGF0IGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgLm13LXBhcnNlci1vdXRwdXQsXG5cdFx0XHRcdC8vIGV4Y2VwdCB3aGVuIHRoZXkgYXJlIHdpdGhpbiB7e211bHRpcGxlIGlzc3Vlc319XG5cdFx0XHRcdCRib2R5XG5cdFx0XHRcdFx0LmZpbmQoJy5tdy1wYXJzZXItb3V0cHV0Jylcblx0XHRcdFx0XHQuY2hpbGRyZW4oKVxuXHRcdFx0XHRcdC5lYWNoKChfaSwgZSkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gYnJlYWsgb3V0IG9uIGVuY291bnRlcmluZyB0aGUgZmlyc3QgaGVhZGluZywgd2hpY2ggbWVhbnMgd2UgYXJlIG5vXG5cdFx0XHRcdFx0XHQvLyBsb25nZXIgaW4gdGhlIGxlYWQgc2VjdGlvblxuXHRcdFx0XHRcdFx0aWYgKGUudGFnTmFtZSA9PT0gJ0gyJykge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBUaGUgYWJpbGl0eSB0byByZW1vdmUgdGFncyBkZXBlbmRzIG9uIHRoZSB0ZW1wbGF0ZSdzIHt7YW1ib3h9fSB8bmFtZT1cblx0XHRcdFx0XHRcdC8vIHBhcmFtZXRlciBiZWFyaW5nIHRoZSB0ZW1wbGF0ZSdzIGNvcnJlY3QgbmFtZSAocHJlZmVyYWJseSkgb3IgYSBuYW1lIHRoYXQgYXRcblx0XHRcdFx0XHRcdC8vIGxlYXN0IHJlZGlyZWN0cyB0byB0aGUgYWN0dWFsIG5hbWVcblx0XHRcdFx0XHRcdC8vIEFsbCB0YWdzIGhhdmUgdGhlaXIgZmlyc3QgY2xhc3MgbmFtZSBhcyBcImJveC1cIiArIHRlbXBsYXRlIG5hbWVcblx0XHRcdFx0XHRcdGlmIChlLmNsYXNzTmFtZS5pbmRleE9mKCdib3gtJykgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKGUuY2xhc3NMaXN0WzBdID09PSAnYm94LemXrumimOadoeebricpIHtcblx0XHRcdFx0XHRcdFx0XHQkKGUpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZmluZCgnLmFtYm94Jylcblx0XHRcdFx0XHRcdFx0XHRcdC5lYWNoKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0WzBdLmluZGV4T2YoJ2JveC0nKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJveFRhZyA9IGVsZW1lbnQuY2xhc3NMaXN0WzBdLnNsaWNlKCdib3gtJy5sZW5ndGgpLnJlcGxhY2UoL18vZywgJyAnKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3MucHVzaChib3hUYWcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gY29udGludWVcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRhZyA9IGUuY2xhc3NMaXN0WzBdLnNsaWNlKCdib3gtJy5sZW5ndGgpLnJlcGxhY2UoL18vZywgJyAnKTtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzLnB1c2godGFnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0Ly8ge3tVbmNhdGVnb3JpemVkfX0gYW5kIHt7SW1wcm92ZSBjYXRlZ29yaWVzfX0gYXJlIHVzdWFsbHkgcGxhY2VkIGF0IHRoZSBlbmRcblx0XHRcdFx0aWYgKCRib2R5LmZpbmQoJy5ib3gtVW5jYXRlZ29yaXplZCcpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFR3aW5rbGUudGFnLmFscmVhZHlQcmVzZW50VGFncy5wdXNoKCdVbmNhdGVnb3JpemVkJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCRib2R5LmZpbmQoJy5ib3gtSW1wcm92ZV9jYXRlZ29yaWVzJykubGVuZ3RoKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzLnB1c2goJ0ltcHJvdmUgY2F0ZWdvcmllcycpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBBZGQgc3RhdHVzIHRleHQgbm9kZSBhZnRlciBTdWJtaXQgYnV0dG9uXG5cdFx0XHRjb25zdCBzdGF0dXNOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0c3RhdHVzTm9kZS5zdHlsZS5mb250U2l6ZSA9ICc5MCUnO1xuXHRcdFx0c3RhdHVzTm9kZS5pZCA9ICd0dy10YWctc3RhdHVzJztcblx0XHRcdFR3aW5rbGUudGFnLnN0YXR1cyA9IHtcblx0XHRcdFx0Ly8gaW5pdGlhbCBzdGF0ZTsgZGVmaW5lZCBsaWtlIHRoaXMgYmVjYXVzZSB0aGVzZSBuZWVkIHRvIGJlIGF2YWlsYWJsZSBmb3IgcmVmZXJlbmNlXG5cdFx0XHRcdC8vIGluIHRoZSBjbGljayBldmVudCBoYW5kbGVyXG5cdFx0XHRcdG51bUFkZGVkOiAwLFxuXHRcdFx0XHRudW1SZW1vdmVkOiAwLFxuXHRcdFx0fTtcblx0XHRcdCRib2R5LmZpbmQoJ2J1dHRvbi50dy10YWctc3VibWl0JykuYWZ0ZXIoc3RhdHVzTm9kZSk7XG5cdFx0XHQvLyBmYWtlIGEgY2hhbmdlIGV2ZW50IG9uIHRoZSBzb3J0IGRyb3Bkb3duLCB0byBpbml0aWFsaXplIHRoZSB0YWcgbGlzdFxuXHRcdFx0Y29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0XHRldnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRcdHJlc3VsdC5zb3J0b3JkZXIuZGlzcGF0Y2hFdmVudChldnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZWRpcmVjdHMgYW5kIGZpbGVzOiBBZGQgYSBsaW5rIHRvIGVhY2ggdGVtcGxhdGUncyBkZXNjcmlwdGlvbiBwYWdlXG5cdFx0XHRmb3IgKGNvbnN0IGNoZWNrYm94IG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhyZXN1bHQsICd0YWdzJykpIHtcblx0XHRcdFx0Z2VuZXJhdGVMaW5rcyhjaGVja2JveCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyAkYWxsQ2hlY2tib3hEaXZzIGFuZCAkYWxsSGVhZGVycyBhcmUgZGVmaW5lZCBnbG9iYWxseSwgcmF0aGVyIHRoYW4gaW4gdGhlXG5cdC8vIHF1aWNrZmlsdGVyIGV2ZW50IGZ1bmN0aW9uLCB0byBhdm9pZCBoYXZpbmcgdG8gcmVjb21wdXRlIHRoZW0gb24gZXZlcnkga2V5ZG93blxuXHRsZXQgJGFsbENoZWNrYm94RGl2cztcblx0bGV0ICRhbGxIZWFkZXJzO1xuXHRUd2lua2xlLnRhZy51cGRhdGVTb3J0T3JkZXIgPSAoZSkgPT4ge1xuXHRcdGNvbnN0IHtmb3JtfSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHNvcnRvcmRlciA9IGUudGFyZ2V0LnZhbHVlO1xuXHRcdFR3aW5rbGUudGFnLmNoZWNrZWRUYWdzID0gZm9ybS5nZXRDaGVja2VkKCd0YWdzJyk7XG5cdFx0Y29uc3QgY29udGFpbmVyID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdHR5cGU6ICdmcmFnbWVudCcsXG5cdFx0fSk7XG5cdFx0Ly8gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBjaGVja2JveCwgd2l0aCBhcHByb3ByaWF0ZSBzdWJncm91cCBpZiBuZWVkZWRcblx0XHRjb25zdCBtYWtlQ2hlY2tib3ggPSAodGFnLCBkZXNjcmlwdGlvbikgPT4ge1xuXHRcdFx0Y29uc3QgY2hlY2tib3ggPSB7XG5cdFx0XHRcdHZhbHVlOiB0YWcsXG5cdFx0XHRcdGxhYmVsOiBge3ske3RhZ319fTogJHtkZXNjcmlwdGlvbn1gLFxuXHRcdFx0fTtcblx0XHRcdGlmIChUd2lua2xlLnRhZy5jaGVja2VkVGFncy5pbmNsdWRlcyh0YWcpKSB7XG5cdFx0XHRcdGNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoICh0YWcpIHtcblx0XHRcdFx0Y2FzZSAnRXhwZXJ0IG5lZWRlZCc6XG5cdFx0XHRcdFx0Y2hlY2tib3guc3ViZ3JvdXAgPSBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdleHBlcnQnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflk6rkuKrpoobln5/nmoTkuJPlrrbvvIjlv4XloavvvInvvJonLCAn5ZOq5YCL6aCY5Z+f55qE5bCI5a6277yI5b+F5aGr77yJ77yaJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5b+F5aGr77yM5Y+v5Y+C6ICDIENhdGVnb3J5OumcgOimgeS4k+S4muS6uuWjq+WFs+azqOeahOmhtemdoiDkvb/nlKjnjrDlrZjnmoTliIbnsbvjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCflv4XloavvvIzlj6/lj4PogIMgQ2F0ZWdvcnk66ZyA6KaB5bCI5qWt5Lq65aOr6Zec5rOo55qE6aCB6Z2iIOS9v+eUqOePvuWtmOeahOWIhumhnuOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdleHBlcnQyJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5ZOq5Liq6aKG5Z+f55qE5LiT5a6277yaJywgJ+WTquWAi+mgmOWfn+eahOWwiOWutu+8micpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mAie+8jOWPr+WPguiAgyBDYXRlZ29yeTrpnIDopoHkuJPkuJrkurrlo6vlhbPms6jnmoTpobXpnaIg5L2/55So546w5a2Y55qE5YiG57G744CCJyxcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6YG477yM5Y+v5Y+D6ICDIENhdGVnb3J5OumcgOimgeWwiOalreS6uuWjq+mXnOazqOeahOmggemdoiDkvb/nlKjnj77lrZjnmoTliIbpoZ7jgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnZXhwZXJ0MycsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WTquS4qumihuWfn+eahOS4k+Wutu+8micsICflk6rlgIvpoJjln5/nmoTlsIjlrrbvvJonKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflj6/pgInvvIzlj6/lj4LogIMgQ2F0ZWdvcnk66ZyA6KaB5LiT5Lia5Lq65aOr5YWz5rOo55qE6aG16Z2iIOS9v+eUqOeOsOWtmOeahOWIhuexu+OAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mBuO+8jOWPr+WPg+iAgyBDYXRlZ29yeTrpnIDopoHlsIjmpa3kurrlo6vpl5zms6jnmoTpoIHpnaIg5L2/55So54++5a2Y55qE5YiG6aGe44CCJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdNZXJnZSc6XG5cdFx0XHRcdGNhc2UgJ01lcmdlIGZyb20nOlxuXHRcdFx0XHRjYXNlICdNZXJnZSB0byc6IHtcblx0XHRcdFx0XHRsZXQgb3RoZXJUYWdOYW1lID0gJ01lcmdlJztcblx0XHRcdFx0XHRzd2l0Y2ggKHRhZykge1xuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgZnJvbSc6XG5cdFx0XHRcdFx0XHRcdG90aGVyVGFnTmFtZSA9ICdNZXJnZSB0byc7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgdG8nOlxuXHRcdFx0XHRcdFx0XHRvdGhlclRhZ05hbWUgPSAnTWVyZ2UgZnJvbSc7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gbm8gZGVmYXVsdFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNoZWNrYm94LnN1Ymdyb3VwID0gW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnbWVyZ2VUYXJnZXQnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhbbku5bmnaHnm67vvJonLCAn5YW25LuW5qKd55uu77yaJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5aaC5oyH5a6a5aSa5Liq5p2h55uu77yM6K+355So566h6YGT56ym5YiG6ZqU77ya5p2h55uu55SyfOadoeebruS5mScsXG5cdFx0XHRcdFx0XHRcdFx0J+WmguaMh+WumuWkmuWAi+aineebru+8jOiri+eUqOeuoemBk+espuWIhumalO+8muaineebrueUsnzmop3nm67kuZknXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogJ21lcmdlVGFnT3RoZXInLFxuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGDnlKh7eyR7b3RoZXJUYWdOYW1lfSR7d2luZG93LndnVUxTKCd9feagh+iusOWFtuS7luadoeebricsICd9feaomeiomOWFtuS7luaineebricpfWAsXG5cdFx0XHRcdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQn5LuF5Zyo5Y+q6L6T5YWl5LqG5LiA5Liq5p2h55uu5ZCN5pe25Y+v55SoJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0J+WDheWcqOWPqui8uOWFpeS6huS4gOWAi+aineebruWQjeaZguWPr+eUqCdcblx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0Y2hlY2tib3guc3ViZ3JvdXAucHVzaCh7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdtZXJnZVJlYXNvbicsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICd0ZXh0YXJlYScsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0YOWQiOW5tueQhueUse+8iOS8muiiq+i0tOS4iiR7dGFnID09PSAnTWVyZ2UgdG8nID8gJ+WFtuS7licgOiAn6L+ZJ33mnaHnm67nmoTorqjorrrpobXvvInvvJpgLFxuXHRcdFx0XHRcdFx0XHRcdGDlkIjkvbXnkIbnlLHvvIjmnIPooqvosrzkuIoke3RhZyA9PT0gJ01lcmdlIHRvJyA/ICflhbbku5YnIDogJ+mAmSd95qKd55uu55qE6KiO6KuW6aCB77yJ77yaYFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mAie+8jOS9huW8uueDiOaOqOiNkOOAguWmguS4jemcgOimgeivt+eVmeepuuOAguS7heWcqOWPqui+k+WFpeS6huS4gOS4quadoeebruWQjeaXtuWPr+eUqOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mBuO+8jOS9huW8t+eDiOaOqOiWpuOAguWmguS4jemcgOimgeiri+eVmeepuuOAguWDheWcqOWPqui8uOWFpeS6huS4gOWAi+aineebruWQjeaZguWPr+eUqOOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXNlICdNaXNzaW5nIGluZm9ybWF0aW9uJzpcblx0XHRcdFx0XHRjaGVja2JveC5zdWJncm91cCA9IHtcblx0XHRcdFx0XHRcdG5hbWU6ICdtaXNzaW5nSW5mb3JtYXRpb24nLFxuXHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+e8uuWwkeeahOWGheWuue+8iOW/heWhq++8ie+8micsICfnvLrlsJHnmoTlhaflrrnvvIjlv4XloavvvInvvJonKSxcblx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5b+F5aGr77yM5pi+56S65Li64oCc57y65bCR5pyJ5YWz4oCm4oCm55qE5L+h5oGv44CC4oCdJywgJ+W/heWhq++8jOmhr+ekuueCuuOAjOe8uuWwkeaciemXnOKApuKApueahOizh+ioiuOAguOAjScpLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ05vdGFiaWxpdHknOlxuXHRcdFx0XHRcdGNoZWNrYm94LnN1Ymdyb3VwID0ge1xuXHRcdFx0XHRcdFx0bmFtZTogJ25vdGFiaWxpdHknLFxuXHRcdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0XHRsaXN0OiBbXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eX1977yaJHt3aW5kb3cud2dVTFMoJ+mAmueUqOeahOWFs+azqOW6puaMh+W8lScsICfpgJrnlKjnmoTpl5zms6jluqbmjIflvJUnKX1gLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnbm9uZScsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxBc3Ryb31977yaJHt3aW5kb3cud2dVTFMoJ+WkqeS9kycsICflpKnpq5QnKX1gLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnQXN0cm8nLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl8QmlvZ3JhcGhpZXN9fe+8miR7d2luZG93LndnVUxTKCfkurrniankvKDorrAnLCAn5Lq654mp5YKz6KiYJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ0Jpb2dyYXBoaWVzJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fEJvb2t9fe+8miR7d2luZG93LndnVUxTKCfkuabnsY0nLCAn5pu457GNJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ0Jvb2snLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl8Q3ljbG9uZX1977yaJHt3aW5kb3cud2dVTFMoJ+awlOaXiycsICfmsKPml4snKX1gLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnQ3ljbG9uZScsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxGaWN0aW9ufX3vvJoke3dpbmRvdy53Z1VMUygn6Jma5p6E5LqL54mpJywgJ+iZm+ani+S6i+eJqScpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdGaWN0aW9uJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fEdlb2dyYXBoaWN9fe+8miR7d2luZG93LndnVUxTKCflnLDnkIbnibnlvoEnLCAn5Zyw55CG54m55b61Jyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ0dlb2dyYXBoaWMnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl8R2VvbWV0cnl9fe+8miR7d2luZG93LndnVUxTKCflh6DkvZXlm77lvaInLCAn5bm+5L2V5ZyW5b2iJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ0dlb21ldHJ5Jyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fEludmVudGlvbn1977yaJHt3aW5kb3cud2dVTFMoJ+WPkeaYjuOAgeeglOepticsICfnmbzmmI7jgIHnoJTnqbYnKX1gLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnSW52ZW50aW9uJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fE11c2ljfX3vvJoke3dpbmRvdy53Z1VMUygn6Z+z5LmQJywgJ+mfs+aogicpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdNdXNpYycsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogYHt7Tm90YWJpbGl0eXxOdW1iZXJzfX3vvJoke3dpbmRvdy53Z1VMUygn5pWw5a2XJywgJ+aVuOWtlycpfWAsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdOdW1iZXJzJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fE9yZ2FuaXphdGlvbnN9fe+8miR7d2luZG93LndnVUxTKCfnu4Tnu4cnLCAn57WE57mUJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ09yZ2FuaXphdGlvbnMnLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGB7e05vdGFiaWxpdHl8UHJvcGVydHl9fe+8miR7d2luZG93LndnVUxTKCfmgKfotKjooagnLCAn5oCn6LOq6KGoJyl9YCxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ1Byb3BlcnR5Jyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiAne3tOb3RhYmlsaXR5fFRyYWZmaWN9fe+8muS6pOmAmicsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdUcmFmZmljJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBge3tOb3RhYmlsaXR5fFdlYn1977yaJHt3aW5kb3cud2dVTFMoJ+e9keermeOAgee9kee7nOWGheWuuScsICfntrLnq5njgIHntrLot6/lhaflrrknKX3vvIjpnZ7mraPlvI/mjIflvJXvvIlgLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnV2ViJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnUmVxdWVzdGVkIG1vdmUnOlxuXHRcdFx0XHRcdGNoZWNrYm94LnN1Ymdyb3VwID0gW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnbW92ZVRhcmdldCcsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aWsOWQjeensO+8micsICfmlrDlkI3nqLHvvJonKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdtb3ZlUmVhc29uJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ3RleHRhcmVhJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn56e75Yqo55CG55Sx77yI5Lya6KKr57KY6LS06K+l5p2h55uu55qE6K6o6K666aG177yJ77yaJyxcblx0XHRcdFx0XHRcdFx0XHQn56e75YuV55CG55Sx77yI5pyD6KKr6LK85LiK6Kmy5qKd55uu55qE6KiO6KuW6aCB77yJ77yaJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mAie+8jOS9huW8uueDiOaOqOiNkOOAguWmguS4jemcgOimgeivt+eVmeepuuOAgicsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+mBuO+8jOS9huW8t+eDiOaOqOiWpuOAguWmguS4jemcgOimgeiri+eVmeepuuOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnU3BsaXQnOlxuXHRcdFx0XHRcdGNoZWNrYm94LnN1Ymdyb3VwID0gW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAndGFyZ2V0MScsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mhtemdouWQjTHvvJonLCAn6aCB6Z2i5ZCNMe+8micpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+WPr+mAieOAgicsICflj6/pgbjjgIInKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG5hbWU6ICd0YXJnZXQyJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6aG16Z2i5ZCNMu+8micsICfpoIHpnaLlkI0y77yaJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn5Y+v6YCJ44CCJywgJ+WPr+mBuOOAgicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3RhcmdldDMnLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpobXpnaLlkI0z77yaJywgJ+mggemdouWQjTPvvJonKSxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKCflj6/pgInjgIInLCAn5Y+v6YG444CCJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0NsZWFudXAnOlxuXHRcdFx0XHRcdGNoZWNrYm94LnN1Ymdyb3VwID0gW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnY2xlYW51cFJlYXNvbicsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn6ZyA6KaB5riF55CG55qE55CG55SxJyxcblx0XHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflj6/pgInvvIzkvYblvLrng4jmjqjojZDjgILlpoLkuI3pnIDopoHor7fnlZnnqbrjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCflj6/pgbjvvIzkvYblvLfng4jmjqjolqbjgILlpoLkuI3pnIDopoHoq4vnlZnnqbrjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY2hlY2tib3g7XG5cdFx0fTtcblx0XHRjb25zdCBtYWtlQ2hlY2tib3hlc0ZvckFscmVhZHlQcmVzZW50VGFncyA9ICgpID0+IHtcblx0XHRcdGNvbnRhaW5lci5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0aWQ6ICd0YWdIZWFkZXIwJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bey5pS+572u55qE57u05oqk5qCH6K6wJywgJ+W3suaUvue9rueahOe2reitt+aomeiomCcpLFxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBzdWJkaXYgPSBjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdGlkOiAndGFnU3ViZGl2MCcsXG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGNoZWNrYm94ZXMgPSBbXTtcblx0XHRcdGNvbnN0IHVuQ2hlY2tlZFRhZ3MgPSBlLnRhcmdldC5mb3JtLmdldFVuY2hlY2tlZCgnZXhpc3RpbmdUYWdzJyk7XG5cdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3MpIHtcblx0XHRcdFx0Y29uc3QgY2hlY2tib3ggPSB7XG5cdFx0XHRcdFx0dmFsdWU6IHRhZyxcblx0XHRcdFx0XHRsYWJlbDogYHt7JHt0YWd9fX0ke1xuXHRcdFx0XHRcdFx0VHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0W3RhZ11cblx0XHRcdFx0XHRcdFx0PyBgOiAke1R3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFt0YWddLmRlc2NyaXB0aW9ufWBcblx0XHRcdFx0XHRcdFx0OiAnJ1xuXHRcdFx0XHRcdH1gLFxuXHRcdFx0XHRcdGNoZWNrZWQ6ICF1bkNoZWNrZWRUYWdzLmluY2x1ZGVzKHRhZyksXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNoZWNrYm94ZXMucHVzaChjaGVja2JveCk7XG5cdFx0XHR9XG5cdFx0XHRzdWJkaXYuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ2V4aXN0aW5nVGFncycsXG5cdFx0XHRcdGxpc3Q6IGNoZWNrYm94ZXMsXG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGlmIChzb3J0b3JkZXIgPT09ICdjYXQnKSB7XG5cdFx0XHQvLyBjYXRlZ29yaWNhbCBzb3J0IG9yZGVyXG5cdFx0XHQvLyBmdW5jdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIHRhZ3MgYW5kIGNyZWF0ZSBhIGNoZWNrYm94IGZvciBlYWNoIG9uZVxuXHRcdFx0Y29uc3QgZG9DYXRlZ29yeUNoZWNrYm94ZXMgPSAoc3ViZGl2LCBzdWJncm91cCkgPT4ge1xuXHRcdFx0XHRjb25zdCBjaGVja2JveGVzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBzdWJncm91cCkge1xuXHRcdFx0XHRcdGlmICghVHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzLmluY2x1ZGVzKGl0ZW0udGFnKSkge1xuXHRcdFx0XHRcdFx0Y2hlY2tib3hlcy5wdXNoKG1ha2VDaGVja2JveChpdGVtLnRhZywgaXRlbS5kZXNjcmlwdGlvbikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzdWJkaXYuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdG5hbWU6ICd0YWdzJyxcblx0XHRcdFx0XHRsaXN0OiBjaGVja2JveGVzLFxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRpZiAoVHdpbmtsZS50YWcuYWxyZWFkeVByZXNlbnRUYWdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bWFrZUNoZWNrYm94ZXNGb3JBbHJlYWR5UHJlc2VudFRhZ3MoKTtcblx0XHRcdH1cblx0XHRcdGxldCBpID0gMTtcblx0XHRcdC8vIGdvIHRocm91Z2ggZWFjaCBjYXRlZ29yeSBhbmQgc3ViLWNhdGVnb3J5IGFuZCBhcHBlbmQgbGlzdHMgb2YgY2hlY2tib3hlc1xuXHRcdFx0Zm9yIChjb25zdCBncm91cCBvZiBUd2lua2xlLnRhZy5hcnRpY2xlLnRhZ0xpc3QpIHtcblx0XHRcdFx0Y29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0aWQ6IGB0YWdIZWFkZXIke2l9YCxcblx0XHRcdFx0XHRsYWJlbDogZ3JvdXAua2V5LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3Qgc3ViZGl2ID0gY29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6IGB0YWdTdWJkaXYke2krK31gLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGdyb3VwLnZhbHVlWzBdLnRhZykge1xuXHRcdFx0XHRcdGRvQ2F0ZWdvcnlDaGVja2JveGVzKHN1YmRpdiwgZ3JvdXAudmFsdWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgc3ViZ3JvdXAgb2YgZ3JvdXAudmFsdWUpIHtcblx0XHRcdFx0XHRcdHN1YmRpdi5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IFtNb3JlYml0cy5odG1sTm9kZSgnYicsIHN1Ymdyb3VwLmtleSldLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRkb0NhdGVnb3J5Q2hlY2tib3hlcyhzdWJkaXYsIHN1Ymdyb3VwLnZhbHVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gYWxwaGFiZXRpY2FsIHNvcnQgb3JkZXJcblx0XHRcdGlmIChUd2lua2xlLnRhZy5hbHJlYWR5UHJlc2VudFRhZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRtYWtlQ2hlY2tib3hlc0ZvckFscmVhZHlQcmVzZW50VGFncygpO1xuXHRcdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRpZDogJ3RhZ0hlYWRlcjEnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WPr+eUqOeahOe7tOaKpOagh+iusCcsICflj6/nlKjnmoTntq3orbfmqJnoqJgnKSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBBdm9pZCByZXBlYXRlZGx5IHJlc29ydGluZ1xuXHRcdFx0VHdpbmtsZS50YWcuYXJ0aWNsZS5hbHBoYWJldGljYWxMaXN0IHx8PSBPYmplY3Qua2V5cyhUd2lua2xlLnRhZy5hcnRpY2xlLmZsYXRPYmplY3QpLnNvcnQoKTtcblx0XHRcdGNvbnN0IGNoZWNrYm94ZXMgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgdGFnIG9mIFR3aW5rbGUudGFnLmFydGljbGUuYWxwaGFiZXRpY2FsTGlzdCkge1xuXHRcdFx0XHRpZiAoIVR3aW5rbGUudGFnLmFscmVhZHlQcmVzZW50VGFncy5pbmNsdWRlcyh0YWcpKSB7XG5cdFx0XHRcdFx0Y2hlY2tib3hlcy5wdXNoKG1ha2VDaGVja2JveCh0YWcsIFR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFt0YWddLmRlc2NyaXB0aW9uKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnRhaW5lci5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRuYW1lOiAndGFncycsXG5cdFx0XHRcdGxpc3Q6IGNoZWNrYm94ZXMsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gYXBwZW5kIGFueSBjdXN0b20gdGFnc1xuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2N1c3RvbVRhZ0xpc3QnKS5sZW5ndGgpIHtcblx0XHRcdGNvbnRhaW5lci5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5qih5p2/JywgJ+iHquioguaooeadvycpLFxuXHRcdFx0fSk7XG5cdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bmFtZTogJ3RhZ3MnLFxuXHRcdFx0XHRsaXN0OiBUd2lua2xlLmdldFByZWYoJ2N1c3RvbVRhZ0xpc3QnKS5tYXAoKGVsKSA9PiB7XG5cdFx0XHRcdFx0ZWwuY2hlY2tlZCA9IFR3aW5rbGUudGFnLmNoZWNrZWRUYWdzLmluY2x1ZGVzKGVsLnZhbHVlKTtcblx0XHRcdFx0XHRyZXR1cm4gZWw7XG5cdFx0XHRcdH0pLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNvbnN0ICR3b3JrYXJlYSA9ICQoZm9ybSkuZmluZCgnI3RhZ1dvcmtBcmVhJyk7XG5cdFx0Y29uc3QgcmVuZGVyZWQgPSBjb250YWluZXIucmVuZGVyKCk7XG5cdFx0JHdvcmthcmVhLmVtcHR5KCkuYXBwZW5kKHJlbmRlcmVkKTtcblx0XHQvLyBmb3IgcXVpY2sgZmlsdGVyOlxuXHRcdCRhbGxDaGVja2JveERpdnMgPSAkd29ya2FyZWEuZmluZCgnW25hbWU9dGFnc10sIFtuYW1lPWV4aXN0aW5nVGFnc10nKS5wYXJlbnQoKTtcblx0XHQkYWxsSGVhZGVycyA9ICR3b3JrYXJlYS5maW5kKCdoNSwgLnF1aWNrZm9ybURlc2NyaXB0aW9uJyk7XG5cdFx0Zm9ybS5xdWlja2ZpbHRlci52YWx1ZSA9ICcnOyAvLyBjbGVhciBzZWFyY2gsIGJlY2F1c2UgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSBub3QgcHJlc2VydmVkIG92ZXIgbW9kZSBjaGFuZ2Vcblx0XHRmb3JtLnF1aWNrZmlsdGVyLmZvY3VzKCk7XG5cdFx0Ly8gc3R5bGUgYWRqdXN0bWVudHNcblx0XHQkd29ya2FyZWEuZmluZCgnaDUnKS5jc3Moe1xuXHRcdFx0J2ZvbnQtc2l6ZSc6ICcxMTAlJyxcblx0XHR9KTtcblx0XHQkd29ya2FyZWEuZmluZCgnaDU6bm90KDpmaXJzdC1jaGlsZCknKS5jc3Moe1xuXHRcdFx0J21hcmdpbi10b3AnOiAnMWVtJyxcblx0XHR9KTtcblx0XHQkd29ya2FyZWEuZmluZCgnZGl2JykuZmlsdGVyKCc6aGFzKHNwYW4ucXVpY2tmb3JtRGVzY3JpcHRpb24pJykuY3NzKHtcblx0XHRcdCdtYXJnaW4tdG9wJzogJzAuNGVtJyxcblx0XHR9KTtcblx0XHRmb3IgKGNvbnN0IGNoZWNrYm94IG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhmb3JtLCAnZXhpc3RpbmdUYWdzJykpIHtcblx0XHRcdGdlbmVyYXRlTGlua3MoY2hlY2tib3gpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGNoZWNrYm94IG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhmb3JtLCAndGFncycpKSB7XG5cdFx0XHRnZW5lcmF0ZUxpbmtzKGNoZWNrYm94KTtcblx0XHR9XG5cdFx0Ly8gdGFsbHkgdGFncyBhZGRlZC9yZW1vdmVkLCB1cGRhdGUgc3RhdHVzTm9kZSB0ZXh0XG5cdFx0Y29uc3Qgc3RhdHVzTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0dy10YWctc3RhdHVzJyk7XG5cdFx0JGJvZHkuZmluZCgnW25hbWU9dGFnc10sIFtuYW1lPWV4aXN0aW5nVGFnc10nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAodGhpcy5uYW1lID09PSAndGFncycpIHtcblx0XHRcdFx0VHdpbmtsZS50YWcuc3RhdHVzLm51bUFkZGVkICs9IHRoaXMuY2hlY2tlZCA/IDEgOiAtMTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5uYW1lID09PSAnZXhpc3RpbmdUYWdzJykge1xuXHRcdFx0XHRUd2lua2xlLnRhZy5zdGF0dXMubnVtUmVtb3ZlZCArPSB0aGlzLmNoZWNrZWQgPyAtMSA6IDE7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBmaXJzdFBhcnQgPSBg5Yqg5YWlJHtUd2lua2xlLnRhZy5zdGF0dXMubnVtQWRkZWR9JHt3aW5kb3cud2dVTFMoJ+S4quagh+iusCcsICflgIvmqJnoqJgnKX1gO1xuXHRcdFx0Y29uc3Qgc2Vjb25kUGFydCA9IGDnp7vpmaQke1R3aW5rbGUudGFnLnN0YXR1cy5udW1SZW1vdmVkfSR7d2luZG93LndnVUxTKCfkuKrmoIforrAnLCAn5YCL5qiZ6KiYJyl9YDtcblx0XHRcdHN0YXR1c05vZGUudGV4dENvbnRlbnQgPVxuXHRcdFx0XHQoVHdpbmtsZS50YWcuc3RhdHVzLm51bUFkZGVkID8gYCAgJHtmaXJzdFBhcnR9YCA6ICcnKSArXG5cdFx0XHRcdChUd2lua2xlLnRhZy5zdGF0dXMubnVtUmVtb3ZlZCA/IChUd2lua2xlLnRhZy5zdGF0dXMubnVtQWRkZWQgPyAn77ybJyA6ICcgICcpICsgc2Vjb25kUGFydCA6ICcnKTtcblx0XHR9KTtcblx0fTtcblx0LyoqXG5cdCAqIEFkZHMgYSBsaW5rIHRvIGVhY2ggdGVtcGxhdGUncyBkZXNjcmlwdGlvbiBwYWdlXG5cdCAqXG5cdCAqIEBwYXJhbSB7TW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnR9IGNoZWNrYm94ICBhc3NvY2lhdGVkIHdpdGggdGhlIHRlbXBsYXRlXG5cdCAqL1xuXHRjb25zdCBnZW5lcmF0ZUxpbmtzID0gKGNoZWNrYm94KSA9PiB7XG5cdFx0Y29uc3QgbGluayA9IE1vcmViaXRzLmh0bWxOb2RlKCdhJywgJz4nKTtcblx0XHRsaW5rLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAndGFnLXRlbXBsYXRlLWxpbmsnKTtcblx0XHRjb25zdCB0YWduYW1lID0gY2hlY2tib3gudmFsdWVzO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKFxuXHRcdFx0J2hyZWYnLFxuXHRcdFx0bXcudXRpbC5nZXRVcmwoXG5cdFx0XHRcdCh0YWduYW1lLmluY2x1ZGVzKCc6JykgPyAnJyA6ICdUZW1wbGF0ZTonKSArXG5cdFx0XHRcdFx0KHRhZ25hbWUuaW5jbHVkZXMoJ3wnKSA/IHRhZ25hbWUuc2xpY2UoMCwgdGFnbmFtZS5pbmRleE9mKCd8JykpIDogdGFnbmFtZSlcblx0XHRcdClcblx0XHQpO1xuXHRcdGxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdub29wZW5lciBub3JlZmVycmVyJyk7XG5cdFx0JChjaGVja2JveCkucGFyZW50KCkuYXBwZW5kKFsnXFx1MDBBMCcsIGxpbmtdKTtcblx0fTtcblx0Ly8gVGFncyBmb3IgQVJUSUNMRVMgc3RhcnQgaGVyZVxuXHRUd2lua2xlLnRhZy5hcnRpY2xlID0ge307XG5cdC8vIFRhZ3MgYXJyYW5nZWQgYnkgY2F0ZWdvcnk7IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYWxwaGFiZXRpY2FsIGxpc3QsXG5cdC8vIGJ1dCB0YWdzIHNob3VsZCBiZSBpbiBhbHBoYWJldGljYWwgb3JkZXIgd2l0aGluIHRoZSBjYXRlZ29yaWVzXG5cdC8vIGV4Y2x1ZGVNSTogdHJ1ZSBpbmRpY2F0ZSBhIHRhZyB0aGF0ICpkb2VzIG5vdCogd29yayBpbnNpZGUge3ttdWx0aXBsZSBpc3N1ZXN9fVxuXHQvLyBBZGQgbmV3IGNhdGVnb3JpZXMgd2l0aCBkaXNjcmV0aW9uIC0gdGhlIGxpc3QgaXMgbG9uZyBlbm91Z2ggYXMgaXMhXG5cdFR3aW5rbGUudGFnLmFydGljbGUudGFnTGlzdCA9IFtcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5riF55CG5ZKM57u05oqk5qih5p2/JywgJ+a4heeQhuWSjOe2reitt+aooeadvycpLFxuXHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCfluLjop4TmuIXnkIYnLCAn5bi46KaP5riF55CGJyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQ2xlYW51cCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDvemcgOimgei/m+ihjOa4heeQhu+8jOS7peespuWQiOacieWFveaho+ahiOmmhueahOi0qOmHj+agh+WHhicsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDvemcgOimgemAsuihjOa4heeQhu+8jOS7peespuWQiOacieeNuOaqlOahiOmkqOeahOizqumHj+aomea6lidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0NsZWFudXAgcmV3cml0ZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+S4jeespuWQiOacieWFveaho+ahiOmmhueahOi0qOmHj+agh+WHhu+8jOmcgOimgeWujOWFqOmHjeWGmScsXG5cdFx0XHRcdFx0XHRcdFx0J+S4jeespuWQiOacieeNuOaqlOahiOmkqOeahOizqumHj+aomea6lu+8jOmcgOimgeWujOWFqOmHjeWvqydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0NsZWFudXAtamFyZ29uJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5YyF5ZCr6L+H5aSa6KGM6K+d5oiW5LiT5Lia5pyv6K+t77yM5Y+v6IO96ZyA6KaB566A5YyW5oiW5o+Q5Ye66L+b5LiA5q2l6Kej6YeKJyxcblx0XHRcdFx0XHRcdFx0XHQn5YyF5ZCr6YGO5aSa6KGM6Kmx5oiW5bCI5qWt6KGT6Kqe77yM5Y+v6IO96ZyA6KaB57Ch5YyW5oiW5o+Q5Ye66YCy5LiA5q2l6Kej6YeLJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQ29weSBlZGl0Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB57yW5L+u77yM5Lul56Gu5L+d5paH5rOV44CB55So6K+N44CB6K+t5rCU44CB5qC85byP44CB5qCH54K5562J5L2/55So5oGw5b2TJyxcblx0XHRcdFx0XHRcdFx0XHQn6ZyA6KaB57eo5L+u77yM5Lul56K65L+d5paH5rOV44CB55So6Kme44CB6Kqe5rCj44CB5qC85byP44CB5qiZ6bue562J5L2/55So5oGw55W2J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+WPr+iDveWkmuS9meeahOWGheWuuScsICflj6/og73lpJrppJjnmoTlhaflrrknKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdDb3B5cGFzdGUnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflhoXlrrnlj6/og73mmK/ku47mn5DkuKrmnaXmupDlpITmi7fotJ3lkI7nspjotLQnLFxuXHRcdFx0XHRcdFx0XHRcdCflhaflrrnlj6/og73mmK/lvp7mn5DlgIvkvobmupDomZXmi7fosp3lvozosrzkuIonXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdFeHRlcm5hbCBsaW5rcycsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+S9v+eUqOWklumDqOmTvuaOpeeahOaWueW8j+WPr+iDveS4jeespuWQiOacieWFveaho+ahiOmmhueahOadoeS+iycsXG5cdFx0XHRcdFx0XHRcdFx0J+S9v+eUqOWklumDqOmAo+e1kOeahOaWueW8j+WPr+iDveS4jeespuWQiOacieeNuOaqlOahiOmkqOeahOaineS+iydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ05vbi1mcmVlJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6IO96L+H5aSa5oiW5LiN5b2T5Zyw5L2/55So5LqG5Y+X6JGX5L2c5p2D5L+d5oqk55qE5paH5a2X44CB5Zu+5YOP5oiW5aSa5aqS5L2T5paH5Lu2Jyxcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6IO96YGO5aSa5oiW5LiN55W25Zyw5L2/55So5LqG5Y+X54mI5qyK5L+d6K2355qE5paH5a2X44CB5ZyW5YOP5oiW5aSa5aqS6auU5qqU5qGIJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+e7k+aehOWSjOWvvOiogCcsICfntZDmp4vlkozlsI7oqIAnKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdMZWFkIHRvbyBsb25nJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5a+86KiA6YOo5YiG5Lmf6K646L+H5LqO5YaX6ZW/JywgJ+WwjuiogOmDqOWIhuS5n+iosemBjuaWvOWGl+mVtycpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTGVhZCB0b28gc2hvcnQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflr7zoqIDpg6jliIbkuZ/orrjkuI3otrPku6XmpoLmi6zlhbblhoXlrrknLCAn5bCO6KiA6YOo5YiG5Lmf6Kix5LiN6Laz5Lul5qaC5ous5YW25YWn5a65JyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdWZXJ5IGxvbmcnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflj6/og73ov4fkuo7lhpfplb8nLCAn5Y+v6IO96YGO5pa85YaX6ZW3JyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn6Jma5p6E5L2c5ZOB55u45YWz5riF55CGJywgJ+iZm+ani+S9nOWTgeebuOmXnOa4heeQhicpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0luLXVuaXZlcnNlJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5L2/55So5bCP6K+05pWF5LqL5YaF55qE6KeC54K55o+P6L+w5LiA5Liq6Jma5p6E5LqL54mpJyxcblx0XHRcdFx0XHRcdFx0XHQn5L2/55So5bCP6Kqq5pWF5LqL5YWn55qE6KeA6bue5o+P6L+w5LiA5YCL6Jmb5qeL5LqL54mpJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTG9uZyBwbG90Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5Y+v6IO95YyF5ZCr6L+H5LqO6K+m57uG55qE5Ymn5oOF5pGY6KaBJywgJ+WPr+iDveWMheWQq+mBjuaWvOips+e0sOeahOWKh+aDheaRmOimgScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogd2luZG93LndnVUxTKCfluLjop4TmnaHnm67pl67popgnLCAn5bi46KaP5qKd55uu5ZWP6aGMJyksXG5cdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiAn6YeN6KaB5oCn5ZKM55+l5ZCN5bqmJyxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdOb3RhYmlsaXR5Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5Y+v6IO95LiN56ym5ZCI6YCa55So5YWz5rOo5bqm5oyH5byVJywgJ+WPr+iDveS4jeespuWQiOmAmueUqOmXnOazqOW6puaMh+W8lScpLFxuXHRcdFx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdOb3RhYmlsaXR5IFVucmVmZXJlbmNlZCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDveWFt+Wkh+WFs+azqOW6pu+8jOS9humcgOimgeadpea6kOWKoOS7peW9sOaYvicsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDveWFt+WCmemXnOazqOW6pu+8jOS9humcgOimgeS+hua6kOWKoOS7peW9sOmhrydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCflhpnkvZzpo47moLwnLCAn5a+r5L2c6aKo5qC8JyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQWR2ZXJ0Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn57G75Ly85bm/5ZGK5oiW5a6j5Lyg5oCn5YaF5a65JywgJ+mhnuS8vOW7o+WRiuaIluWuo+WCs+aAp+WFp+WuuScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnRmFucG92Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn57G75Ly854ix5aW96ICF572R6aG1JywgJ+mhnuS8vOaEm+WlveiAhee2sumggScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnSG93LXRvJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5YyF5ZCr5oyH5Y2X5oiW5pWZ5a2m5YaF5a65JywgJ+WMheWQq+aMh+WNl+aIluaVmeWtuOWFp+WuuScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnSW5hcHByb3ByaWF0ZSBwZXJzb24nLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfkvb/nlKjkuI3pgILlvZPnmoTnrKzkuIDkurrnp7DlkoznrKzkuozkurrnp7AnLFxuXHRcdFx0XHRcdFx0XHRcdCfkvb/nlKjkuI3pgannlbbnmoTnrKzkuIDkurrnqLHlkoznrKzkuozkurrnqLEnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdOZXdzcmVsZWFzZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+mYheivu+i1t+adpeWDj+aYr+aWsOmXu+eov+WPiuWMheWQq+i/h+W6pueahOWuo+S8oOaAp+ivreiwgycsXG5cdFx0XHRcdFx0XHRcdFx0J+mWseiugOi1t+S+huWDj+aYr+aWsOiBnueov+WPiuWMheWQq+mBjuW6pueahOWuo+WCs+aAp+iqnuiqvydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1Byb3NlJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5L2/55So5LqG5pel5pyf5oiW5pe26Ze05YiX6KGo5byP6K6w6L+w77yM6ZyA6KaB5pS55YaZ5Li66L+e6LSv55qE5Y+Z6L+w5oCn5paH5a2XJyxcblx0XHRcdFx0XHRcdFx0XHQn5L2/55So5LqG5pel5pyf5oiW5pmC6ZaT5YiX6KGo5byP6KiY6L+w77yM6ZyA6KaB5pS55a+r54K66YCj6LKr55qE5pWY6L+w5oCn5paH5a2XJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnUmV2aWV3Jyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn6ZiF6K+76LW35p2l57G75Ly86K+E6K6677yM6ZyA6KaB5riF55CGJywgJ+mWseiugOi1t+S+humhnuS8vOipleirlu+8jOmcgOimgea4heeQhicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnVG9uZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+ivreiwg+aIlumjjuagvOWPr+iDveS4jemAguWQiOeZvuenkeWFqOS5pueahOWGmeS9nOaWueW8jycsXG5cdFx0XHRcdFx0XHRcdFx0J+iqnuiqv+aIlumiqOagvOWPr+iDveS4jemBqeWQiOeZvuenkeWFqOabuOeahOWvq+S9nOaWueW8jydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCflhoXlrrknLCAn5YWn5a65JyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHt0YWc6ICdNaXNzaW5nIGluZm9ybWF0aW9uJywgZGVzY3JpcHRpb246ICfnvLrlsJHlv4XopoHnmoTkv6Hmga8nfSwgLy8gdGhlc2UgdGhyZWUgaGF2ZSBhIHN1Ymdyb3VwIHdpdGggc2V2ZXJhbCBvcHRpb25zXG5cdFx0XHRcdFx0XHR7dGFnOiAnU3Vic3R1YicsIGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+i/h+S6juefreWwjycsICfpgY7mlrznn63lsI8nKSwgZXhjbHVkZU1JOiB0cnVlfSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnVW5lbmN5Y2xvcGVkaWMnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflj6/og73kuI3pgILlkIjlhpnlhaXnmb7np5HlhajkuaYnLCAn5Y+v6IO95LiN6YGp5ZCI5a+r5YWl55m+56eR5YWo5pu4JyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5L+h5oGv5ZKM57uG6IqCJywgJ+izh+ioiuWSjOe0sOevgCcpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0V4cGVydCBuZWVkZWQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfpnIDopoHnsr7pgJrmiJbnhp/mgonmnKzkuLvpopjnmoTkuJPkuJrkurrlo6vvvIjkuJPlrrbvvInlj4LkuI7lj4rljY/liqnnvJbovpEnLFxuXHRcdFx0XHRcdFx0XHRcdCfpnIDopoHnsr7pgJrmiJbnhp/mgonmnKzkuLvpoYznmoTlsIjmpa3kurrlo6vvvIjlsIjlrrbvvInlj4PoiIflj4rljZTliqnnt6jovK8nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdPdmVybHkgZGV0YWlsZWQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfljIXlkKvlpKrlpJrov4fluqbnu4boioLlhoXlrrknLCAn5YyF5ZCr5aSq5aSa6YGO5bqm57Sw56+A5YWn5a65JyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdUcml2aWEnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflupTpgb/lhY3mnInpmYjliJfmnYLpobnjgIHnkJDnoo7otYTmlpnnmoTpg6jliIYnLFxuXHRcdFx0XHRcdFx0XHRcdCfmh4npgb/lhY3mnInpmbPliJfpm5zpoIXjgIHnkaPnoo7os4fmlpnnmoTpg6jliIYnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5pe26Ze05oCnJywgJ+aZgumWk+aApycpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0N1cnJlbnQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCforrDov7DmlrDpl7vliqjmgIEnLCAn6KiY6L+w5paw6IGe5YuV5oWLJyksXG5cdFx0XHRcdFx0XHRcdGV4Y2x1ZGVNSTogdHJ1ZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1VwZGF0ZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+W9k+WJjeadoeebruaIlueroOiKgumcgOimgeabtOaWsCcsICfnlbbliY3mop3nm67miJbnq6Dnr4DpnIDopoHmm7TmlrAnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCflrqLop4LmgKflkozkuovlrp7lh4bnoa7mgKcnLCAn5a6i6KeA5oCn5ZKM5LqL5a+m5rqW56K65oCnJyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQXV0b2Jpb2dyYXBoeScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+exu+S8vOS4gOevh+iHquS8oO+8jOaIluWGheWuueS4u+imgeeUseadoeebruaPj+i/sOeahOW9k+S6i+S6uuaIlue7hOe7h+aSsOWGmeOAgee8lui+kScsXG5cdFx0XHRcdFx0XHRcdFx0J+mhnuS8vOS4gOevh+iHquWCs++8jOaIluWFp+WuueS4u+imgeeUseaineebruaPj+i/sOeahOeVtuS6i+S6uuaIlue1hOe5lOaSsOWvq+OAgee3qOi8rydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0NPSScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+S4u+imgei0oeeMruiAheS4juacrOadoeebruaJgOWuo+aJrOeahOWGheWuueWPr+iDveWtmOWcqOWIqeebiuWGsueqgScsXG5cdFx0XHRcdFx0XHRcdFx0J+S4u+imgeiyoueNu+iAheiIh+acrOaineebruaJgOWuo+aPmueahOWFp+WuueWPr+iDveWtmOWcqOWIqeebiuihneeqgSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0Rpc3B1dGVkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5YaF5a6555aR5qyg5YeG56Gu77yM5pyJ5b6F5p+l6K+BJywgJ+WFp+WuueeWkeasoOa6lueiuu+8jOacieW+heafpeitiScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnR2xvYmFsaXplJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5LuF5YW35pyJ5LiA6YOo5YiG5Zyw5Yy655qE5L+h5oGv5oiW6KeC54K5JywgJ+WDheWFt+acieS4gOmDqOWIhuWcsOWNgOeahOizh+ioiuaIluingOm7nicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnSG9heCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+ecn+WunuaAp+iiq+i0qOeWkScsICfnnJ/lr6bmgKfooqvos6rnlpEnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1BPVicsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WuouinguaAp+acieS6ieiuruOAguWGheWuueOAgeivreiwg+WPr+iDveW4puacieaYjuaYvueahOS4quS6uuingueCueaIluWcsOaWueiJsuW9qScsXG5cdFx0XHRcdFx0XHRcdFx0J+WuouingOaAp+acieeIreitsOOAguWFp+WuueOAgeiqnuiqv+WPr+iDveW4tuacieaYjumhr+eahOWAi+S6uuingOm7nuaIluWcsOaWueiJsuW9qSdcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1NlbGYtY29udHJhZGljdG9yeScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+WGheWuueiHquebuOefm+ebvicsICflhaflrrnoh6rnm7jnn5vnm74nKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1dlYXNlbCcsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+ivreS5ieaooeajseS4pOWPr+iAjOaNn+WPiuWFtuWuouinguaAp+aIluWHhuehruaApycsXG5cdFx0XHRcdFx0XHRcdFx0J+iqnuaEj+aooeajseWFqeWPr+iAjOaQjeWPiuWFtuWuouingOaAp+aIlua6lueiuuaApydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCflj6/kvpvmn6Xor4HlkozmnaXmupAnLCAn5Y+v5L6b5p+l6K2J5ZKM5L6G5rqQJyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQkxQZGlzcHV0ZScsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDvei/neWPjeS6huacieWFveaho+ahiOmmhuWFs+S6jueUn+iAheS8oOiusOeahOadoeS+iycsXG5cdFx0XHRcdFx0XHRcdFx0J+WPr+iDvemBleWPjeS6huacieeNuOaqlOahiOmkqOmXnOaWvOeUn+iAheWCs+iomOeahOaineS+iydcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0JMUHNvdXJjZXMnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfnlJ/ogIXkvKDorrDpnIDopoHooaXlhYXmm7TlpJrlj6/kvpvmn6Xor4HnmoTmnaXmupAnLFxuXHRcdFx0XHRcdFx0XHRcdCfnlJ/ogIXlgrPoqJjpnIDopoHoo5zlhYXmm7TlpJrlj6/kvpvmn6XorYnnmoTkvobmupAnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdCTFAgdW5zb3VyY2VkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn55Sf6ICF5Lyg6K6w5rKh5pyJ5YiX5Ye65Lu75L2V5Y+C6ICD5oiW5p2l5rqQJyxcblx0XHRcdFx0XHRcdFx0XHQn55Sf6ICF5YKz6KiY5rKS5pyJ5YiX5Ye65Lu75L2V5Y+D6ICD5oiW5L6G5rqQJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnQ2l0ZWNoZWNrJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6IO95YyF5ZCr5LiN6YCC55So5oiW6KKr5puy6Kej55qE5byV55So6LWE5paZ77yM6YOo5YiG5YaF5a6555qE5YeG56Gu5oCn5peg5rOV6KKr6K+B5a6eJyxcblx0XHRcdFx0XHRcdFx0XHQn5Y+v6IO95YyF5ZCr5LiN6YGp55So5oiW6KKr5puy6Kej55qE5byV55So6LOH5paZ77yM6YOo5YiG5YWn5a6555qE5rqW56K65oCn54Sh5rOV6KKr6K2J5a+mJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTW9yZSBmb290bm90ZXMgbmVlZGVkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Zug5Li65paH5YaF5byV55So5LiN6Laz77yM6YOo5YiG5a2X5Y+l55qE5p2l5rqQ5LuN54S25LiN5piOJyxcblx0XHRcdFx0XHRcdFx0XHQn5Zug54K65paH5YWn5byV55So5LiN6Laz77yM6YOo5YiG5a2X5Y+l55qE5L6G5rqQ5LuN54S25LiN5piOJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnTm8gZm9vdG5vdGVzJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5Zug5Li65rKh5pyJ5YaF5paH5byV55So6ICM5p2l5rqQ5LuN54S25LiN5piOJyxcblx0XHRcdFx0XHRcdFx0XHQn5Zug54K65rKS5pyJ5YWn5paH5byV55So6ICM5L6G5rqQ5LuN54S25LiN5piOJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnT25lc291cmNlJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5p6B5aSn5oiW5a6M5YWo5Zyw5L6d6LWW5LqO5p+Q5Liq5Y2V5LiA55qE5p2l5rqQJyxcblx0XHRcdFx0XHRcdFx0XHQn5qW15aSn5oiW5a6M5YWo5Zyw5L6d6LO05pa85p+Q5YCL5Zau5LiA55qE5L6G5rqQJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnT3JpZ2luYWwgcmVzZWFyY2gnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflj6/og73ljIXlkKvljp/liJvnoJTnqbbmiJbmnKrmn6Xor4HlhoXlrrknLCAn5Y+v6IO95YyF5ZCr5Y6f5Ym156CU56m25oiW5pyq5p+l6K2J5YWn5a65JyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdQcmltYXJ5c291cmNlcycsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+S+nei1luesrOS4gOaJi+adpea6kCcsICfkvp3os7TnrKzkuIDmiYvkvobmupAnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1JlZmltcHJvdmUnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfpnIDopoHooaXlhYXmm7TlpJrmnaXmupAnLCAn6ZyA6KaB6KOc5YWF5pu05aSa5L6G5rqQJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdVbnJlZmVyZW5jZWQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfmsqHmnInliJflh7rku7vkvZXlj4LogIPmiJbmnaXmupAnLCAn5rKS5pyJ5YiX5Ye65Lu75L2V5Y+D6ICD5oiW5L6G5rqQJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+WFt+S9k+WGheWuuemXrumimCcsICflhbfpq5TlhaflrrnllY/poYwnKSxcblx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn6K+t6KiAJywgJ+iqnuiogCcpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ05vdE1hbmRhcmluJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5YyF5ZCr6L+H5aSa5LiN5piv546w5Luj5qCH5YeG5rGJ6K+t55qE5YaF5a65Jyxcblx0XHRcdFx0XHRcdFx0XHQn5YyF5ZCr6YGO5aSa5LiN5piv54++5Luj5qiZ5rqW5ryi6Kqe55qE5YWn5a65J1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdSb3VnaCB0cmFuc2xhdGlvbicsXG5cdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+e/u+ivkeWTgei0qOS4jeS9sycsICfnv7vora/lk4Hos6rkuI3kvbMnKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogd2luZG93LndnVUxTKCfpk77mjqUnLCAn6YCj57WQJyksXG5cdFx0XHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnRGVhZCBlbmQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfpnIDopoHliqDkuIrlhoXpg6jpk77mjqXku6XmnoTnrZHnmb7np5HlhajkuabnmoTpk77mjqXnvZHnu5wnLFxuXHRcdFx0XHRcdFx0XHRcdCfpnIDopoHliqDkuIrlhafpg6jpgKPntZDku6Xmp4vnr4nnmb7np5Hlhajmm7jnmoTpgKPntZDntrLntaEnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdPcnBoYW4nLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfmsqHmnInmiJblj6rmnInlvojlsJHpk77lhaXpobXpnaInLCAn5rKS5pyJ5oiW5Y+q5pyJ5b6I5bCR6YCj5YWl6aCB6Z2iJyksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdPdmVybGlua2VkJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHQn5ZCr5pyJ6L+H5aSa44CB6YeN5aSN44CB5oiW5LiN5b+F6KaB55qE5YaF6YOo6ZO+5o6lJyxcblx0XHRcdFx0XHRcdFx0XHQn5ZCr5pyJ6YGO5aSa44CB6YeN6KSH44CB5oiW5LiN5b+F6KaB55qE5YWn6YOo6YCj57WQJ1xuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFnOiAnVW5kZXJsaW5rZWQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfpnIDopoHmm7TlpJrlhoXpg6jpk77mjqXku6XmnoTnrZHnmb7np5HlhajkuabnmoTpk77mjqXnvZHnu5wnLFxuXHRcdFx0XHRcdFx0XHRcdCfpnIDopoHmm7TlpJrlhafpg6jpgKPntZDku6Xmp4vnr4nnmb7np5Hlhajmm7jnmoTpgKPntZDntrLntaEnXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5Y+C6ICD5oqA5pyvJywgJ+WPg+iAg+aKgOihkycpLFxuXHRcdFx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ0NpdGF0aW9uIHN0eWxlJyxcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5byV55So6ZyA6KaB6L+b6KGM5riF55CGJywgJ+W8leeUqOmcgOimgemAsuihjOa4heeQhicpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+WIhuexuycsICfliIbpoZ4nKSxcblx0XHRcdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YWc6ICdJbXByb3ZlIGNhdGVnb3JpZXMnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfpnIDopoHmm7TlpJrpobXpnaLliIbnsbsnLCAn6ZyA6KaB5pu05aSa6aCB6Z2i5YiG6aGeJyksXG5cdFx0XHRcdFx0XHRcdGV4Y2x1ZGVNSTogdHJ1ZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhZzogJ1VuY2F0ZWdvcml6ZWQnLFxuXHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfnvLrlsJHpobXpnaLliIbnsbsnLCAn57y65bCR6aCB6Z2i5YiG6aGeJyksXG5cdFx0XHRcdFx0XHRcdGV4Y2x1ZGVNSTogdHJ1ZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5ZCI5bm244CB5ouG5YiG44CB56e75YqoJywgJ+WQiOS9teOAgeaLhuWIhuOAgeenu+WLlScpLFxuXHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ01lcmdlIGZyb20nLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+W7uuiuruWwhumhtemdouW5tuWFpeatpOmhtemdoicsICflu7rorbDlsIfpoIHpnaLkvbXlhaXmraTpoIHpnaInKSxcblx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICdNZXJnZSB0bycsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5bu66K6u5bCG5q2k6aG16Z2i5bm25YWl6aG16Z2iJywgJ+W7uuitsOWwh+atpOmggemdouS9teWFpemggemdoicpLFxuXHRcdFx0XHRcdGV4Y2x1ZGVNSTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ01lcmdlJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflu7rorq7mraTpobXpnaLkuI7pobXpnaLlkIjlubYnLCAn5bu66K2w5q2k6aCB6Z2i6IiH6aCB6Z2i5ZCI5L21JyksXG5cdFx0XHRcdFx0ZXhjbHVkZU1JOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAnUmVxdWVzdGVkIG1vdmUnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+W7uuiuruWwhuatpOmhtemdouenu+WKqOWIsOaWsOWQjeensCcsICflu7rorbDlsIfmraTpoIHpnaLnp7vli5XliLDmlrDlkI3nqLEnKSxcblx0XHRcdFx0XHRleGNsdWRlTUk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICdTcGxpdCcsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5bu66K6u5bCG5q2k6aG16Z2i5YiG5Ymy5Li65aSa5Liq6aG16Z2iJywgJ+W7uuitsOWwh+atpOmggemdouWIhuWJsueCuuWkmuWAi+mggemdoicpLFxuXHRcdFx0XHRcdGV4Y2x1ZGVNSTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XTtcblx0Ly8gVGFncyBmb3IgUkVESVJFQ1RTIHN0YXJ0IGhlcmVcblx0Ly8gTm90IGJ5IHBvbGljeSwgYnV0IHRoZSBsaXN0IHJvdWdobHkgYXBwcm94aW1hdGVzIGl0ZW1zIHdpdGggPjUwMFxuXHQvLyB0cmFuc2NsdXNpb25zIGZyb20gVGVtcGxhdGU6UiB0ZW1wbGF0ZSBpbmRleFxuXHRUd2lua2xlLnRhZy5yZWRpcmVjdExpc3QgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiAn5bi455So5qih5p2/Jyxcblx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5ZCI5bm26YeN5a6a5ZCRJywgJ+WQiOS9temHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5L+d5oyB6aG16Z2i6aKY5ZCN6Iez55u45bqU5Li75p2h55uu77yM5Luk6aG16Z2i5YaF5a655Zyo5ZCI5bm25ZCO5LuN6IO95L+d5a2Y5YW257yW6L6R5Y6G5Y+yJyxcblx0XHRcdFx0XHRcdCfkv53mjIHpoIHpnaLpoYzlkI3oh7Pnm7jmh4nkuLvmop3nm67vvIzku6TpoIHpnaLlhaflrrnlnKjlkIjkvbXlvozku43og73lhLLlrZjlhbbnt6jovK/mrbflj7InXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfnroDnuYHph43lrprlkJEnLCAn57Ch57mB6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5byV5a+8566A5L2T6Iez57mB5L2T77yM5oiW57mB5L2T6Iez566A5L2TJywgJ+W8leWwjuewoemrlOiHs+e5gemrlO+8jOaIlue5gemrlOiHs+ewoemrlCcpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+WFs+azqOW6pumHjeWumuWQkScsICfpl5zms6jluqbph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+e8uuS5j+WFs+azqOW6pueahOWtkOS4u+mimOWQkeacieWFs+azqOW6pueahOavjeS4u+mimOeahOmHjeWumuWQkScsXG5cdFx0XHRcdFx0XHQn57y65LmP6Zec5rOo5bqm55qE5a2Q5Li76aGM5ZCR5pyJ6Zec5rOo5bqm55qE5q+N5Li76aGM55qE6YeN5a6a5ZCRJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICfmqKHmnb/ph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+aMh+WQkeaooeadv+eahOmHjeWumuWQkemhtemdoicsICfmjIflkJHmqKHmnb/nmoTph43lrprlkJHpoIHpnaInKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfliKvlkI3ph43lrprlkJEnLCAn5Yil5ZCN6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmoIfpopjnmoTlhbbku5blkI3np7DjgIHnrJTlkI3jgIHnu7Dlj7fjgIHlkIzkuYnlrZfnrYknLFxuXHRcdFx0XHRcdFx0J+aomemhjOeahOWFtuS7luWQjeeoseOAgeethuWQjeOAgee2veiZn+OAgeWQjOe+qeWtl+etiSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+ivkeWQjemHjeWumuWQkScsICfora/lkI3ph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+S6uueJqeOAgeS9nOWTgeetieWQhOmhueS6i+eJqeeahOWFtuS7lue/u+ivkeWQjeensCcsXG5cdFx0XHRcdFx0XHQn5Lq654mp44CB5L2c5ZOB562J5ZCE6aCF5LqL54mp55qE5YW25LuW57+76K2v5ZCN56ixJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn57yp5YaZ6YeN5a6a5ZCRJywgJ+e4ruWvq+mHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+agh+mimOe8qeWGmScsICfmqJnpoYznuK7lr6snKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfmi7zlhpnph43lrprlkJEnLCAn5ou85a+r6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5qCH6aKY55qE5YW25LuW5LiN5ZCM5ou85YaZJywgJ+aomemhjOeahOWFtuS7luS4jeWQjOaLvOWvqycpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+mUmeWtl+mHjeWumuWQkScsICfpjK/lrZfph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfnuqDmraPmoIfpopjnmoTluLjop4HplJnor6/mi7zlhpnmiJbor6/mpI0nLCAn57O+5q2j5qiZ6aGM55qE5bi46KaL6Yyv6Kqk5ou85a+r5oiW6Kqk5qSNJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5pen5ZCN6YeN5a6a5ZCRJywgJ+iIiuWQjemHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5bCG5LqL54mp5pep5YmN55qE5ZCN56ew5byV5a+86Iez5pu05pS55ZCO55qE5Li76aKYJyxcblx0XHRcdFx0XHRcdCflsIfkuovnianml6nliY3nmoTlkI3nqLHlvJXlsI7oh7Pmm7TmlLnlvoznmoTkuLvpoYwnXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+WFqOWQjemHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5qCH6aKY55qE5a6M5pW05oiW5pu05a6M5pW05ZCN56ewJywgJ+aomemhjOeahOWujOaVtOaIluabtOWujOaVtOWQjeeosScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn55+t5ZCN6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WujOaVtOagh+mimOWQjeensOaIluS6uueJqeWFqOWQjeeahOmDqOWIhuOAgeS4jeWujOaVtOeahOWQjeensOaIlueugOensCcsXG5cdFx0XHRcdFx0XHQn5a6M5pW05qiZ6aGM5ZCN56ix5oiW5Lq654mp5YWo5ZCN55qE6YOo5YiG44CB5LiN5a6M5pW055qE5ZCN56ix5oiW57Ch56ixJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICflp5PmsI/ph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAn5Lq654mp5aeT5rCPJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogJ+WQjeWtl+mHjeWumuWQkScsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246ICfkurrniankurrlkI0nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5pys5ZCN6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ+S6uueJqeacrOWQjScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICfpnZ7kuK3mlofph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+mdnuS4reaWh+agh+mimCcsICfpnZ7kuK3mlofmqJnpoYwnKSxcblx0XHRcdFx0XHRzdWJncm91cDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiAnYWx0TGFuZ0Zyb20nLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogJ+acrOmHjeaWsOWwjuWQkeeahOiqnuiogO+8iOWPr+mBuO+8iScsXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6XG5cdFx0XHRcdFx0XHRcdFx0J+i8uOWFpemHjeaWsOWwjuWQkeWQjeeoseaJgOS9v+eUqOiqnuiogOeahElTTyA2Mznku6PnorzvvIzkvovlpoJlbuS7o+ihqOiLseiqnu+8jOS7o+eivOWPr+WPg+imiyBUZW1wbGF0ZTpJU09fNjM5X25hbWUnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5pel5paH6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfml6Xor63lkI3np7AnLCAn5pel6Kqe5ZCN56ixJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiAn5YG255So5qih5p2/Jyxcblx0XHRcdHZhbHVlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICfop5LoibLph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+eUteinhuWJp+OAgeeUteW9seOAgeS5puexjeetieS9nOWTgeeahOinkuiJsicsICfpm7voppbliofjgIHpm7vlvbHjgIHmm7jnsY3nrYnkvZzlk4HnmoTop5LoibInKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfnq6DoioLph43lrprlkJEnLCAn56ug56+A6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5a+85ZCR6Iez6L6D6auY5a+G5bqm57uE57uH55qE6aG16Z2iJywgJ+WwjuWQkeiHs+i8g+mrmOWvhuW6pue1hOe5lOeahOmggemdoicpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5YiX6KGo6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflr7zlkJHoh7PkvY7lr4bluqbnmoTliJfooagnLCAn5bCO5ZCR6Iez5L2O5a+G5bqm55qE5YiX6KGoJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICflj6/og73mgKfph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5a+85ZCR6Iez5b2T5YmN5o+Q5L6b5YaF5a655pu05Li66K+m5bC955qE55uu5qCH6aG16Z2iJyxcblx0XHRcdFx0XHRcdCflsI7lkJHoh7PnlbbliY3mj5Dkvpvlhaflrrnmm7TngrroqbPnm6HnmoTnm67mqJnpoIHpnaInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCflhbPogZTlrZfph43lrprlkJEnLCAn6Zec6IGv5a2X6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5qCH6aKY5ZCN56ew5YWz6IGU5a2XJywgJ+aomemhjOWQjeeosemXnOiBr+WtlycpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiB3aW5kb3cud2dVTFMoJ+adoeebruivt+axgumHjeWumuWQkScsICfmop3nm67oq4vmsYLph43lrprlkJEnKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfpnIDopoHni6znq4vmnaHnm67nmoTpobXpnaInLCAn6ZyA6KaB542o56uL5qKd55uu55qE6aCB6Z2iJyksXG5cdFx0XHRcdFx0c3ViZ3JvdXA6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3JlcUFydGljbGVMYW5nJyxcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICflpJboqp7oqp7oqIDku6PnorzvvJonLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiAn5L2/55SoSVNPIDYzOeS7o+eivO+8jOWPr+WPg+imiyBUZW1wbGF0ZTpJU09fNjM5X25hbWUnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3JlcUFydGljbGVUaXRsZScsXG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiAn5aSW6Kqe6aCB6Z2i5ZCN56ix77yaJyxcblx0XHRcdFx0XHRcdFx0c2l6ZTogNjAsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6IHdpbmRvdy53Z1VMUygn5b+r5o235pa55byP6YeN5a6a5ZCRJywgJ+aNt+W+kemHjeWumuWQkScpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+acieWFveaho+ahiOmmhuW/q+aNt+aWueW8jycsICfmnInnjbjmqpTmoYjppKjlv6vmjbfmlrnlvI8nKSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn6bKc55So5qih5p2/JywgJ+murueUqOaooeadvycpLFxuXHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfor43nu4Tph43lrprlkJEnLCAn6Kme57WE6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflsIbor43nu4Qv6K+N57uEL+aIkOivreaMh+WQkeWIh+mimOeahOadoeebruWPiuaBsOW9k+eroOiKgicsXG5cdFx0XHRcdFx0XHQn5bCH6Kme57WEL+ipnue1hC/miJDoqp7mjIflkJHliIfpoYznmoTmop3nm67lj4rmgbDnlbbnq6Dnr4AnXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfmtojmrafkuYnpobXph43lrprlkJEnLCAn5raI5q2n576p6aCB6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn5oyH5ZCR5raI5q2n5LmJ6aG1JywgJ+aMh+WQkea2iOatp+e+qemggScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn5Z+f5ZCN6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCfln5/lkI0nLCAn57ay5Z+f5ZCN56ixJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICflubTku6Pph43lrprlkJEnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiB3aW5kb3cud2dVTFMoJ+S6juW5tOS7veadoeebruWvvOWQkeiHs+W5tOS7o+adoeebricsICfmlrzlubTku73mop3nm67lsI7lkJHoh7PlubTku6Pmop3nm64nKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfnlKjmiLfmoYbmqKHmnb/ph43lrprlkJEnLCAn55So5oi25qGG5qih5p2/6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHdpbmRvdy53Z1VMUygn55So5oi35qGG5qih5p2/JywgJ+eUqOaItuahhuaooeadvycpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGFnOiAn6YeN5a6a5ZCR5qih5p2/55So6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCflr7zlkJHoh7Pph43lrprlkJHmqKHmnb8nLCAn5bCO5ZCR6Iez6YeN5a6a5ZCR5qih5p2/JyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0YWc6ICdFWElG6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogd2luZG93LndnVUxTKCdKUEVH5Zu+5YOP5paH5Lu25YyF5ZCrRVhJRuS/oeaBrycsICdKUEVH5ZyW5qqU5YyF5ZCrRVhJRuizh+ioiicpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRdO1xuXHQvLyBtYWludGVuYW5jZSB0YWdzIGZvciBGSUxFUyBzdGFydCBoZXJlXG5cdFR3aW5rbGUudGFnLmZpbGVMaXN0ID0gW1xuXHRcdHtcblx0XHRcdGtleTogd2luZG93LndnVUxTKCfokZfkvZzmnYPlkozmnaXmupDpl67popjmoIfnrb4nLCAn6JGX5L2c5qyK5ZKM5L6G5rqQ5ZWP6aGM5qiZ57GkJyksXG5cdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e05vbi1mcmVlIHJlZHVjZX1977yaJHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6Z2e5L2O5YiG6L6o546H55qE5ZCI55CG5L2/55So5Zu+5YOP77yI5oiW6L+H6ZW/55qE6Z+z6aKR5Ymq6L6R562J77yJJyxcblx0XHRcdFx0XHRcdCfpnZ7kvY7op6PmnpDluqbnmoTlkIjnkIbkvb/nlKjlnJblg4/vvIjmiJbpgY7plbfnmoTpn7PpoLvliarovK/nrYnvvIknXG5cdFx0XHRcdFx0KX1gLFxuXHRcdFx0XHRcdHZhbHVlOiAnTm9uLWZyZWUgcmVkdWNlJyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn5riF55CG5qCH562+JywgJ+a4heeQhuaomeexpCcpLFxuXHRcdFx0dmFsdWU6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3tXYXRlcm1hcmt9fe+8miR7d2luZG93LndnVUxTKCflm77lg4/ljIXlkKvkuobmsLTljbAnLCAn5ZyW5YOP5YyF5ZCr5LqG5rWu5rC05Y2wJyl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ1dhdGVybWFyaycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7UmVuYW1lIG1lZGlhfX3vvJoke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmlofku7blupTor6XmoLnmja7mlofku7blkI3np7DmjIflvJXooqvph43lkb3lkI0nLFxuXHRcdFx0XHRcdFx0J+aqlOahiOaHieipsuagueaTmuaqlOahiOWQjeeoseaMh+W8leiiq+mHjeaWsOWRveWQjSdcblx0XHRcdFx0XHQpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdSZW5hbWUgbWVkaWEnLFxuXHRcdFx0XHRcdHN1Ymdyb3VwOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRcdFx0XHRcdG5hbWU6ICdyZW5hbWVtZWRpYU5ld25hbWUnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmlrDlkI3np7DvvJonLCAn5paw5ZCN56ix77yaJyksXG5cdFx0XHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUygn6L6T5YWl5Zu+5YOP55qE5paw5ZCN56ew77yI5Y+v6YCJ77yJJywgJ+i8uOWFpeWcluWDj+eahOaWsOWQjeeose+8iOWPr+mBuO+8iScpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdFx0XHRcdFx0bmFtZTogJ3JlbmFtZW1lZGlhUmVhc29uJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICfljp/lm6DvvJonLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoJ+i+k+WFpemHjeWRveWQjeeahOWOn+WboO+8iOWPr+mAie+8iScsICfovLjlhaXph43mlrDlkb3lkI3nmoTljp/lm6DvvIjlj6/pgbjvvIknKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiBge3tTaG91bGQgYmUgU1ZHfX3vvJoke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCdQTkfjgIFHSUbjgIFKUEVH5paH5Lu25bqU6K+l6YeN5Yi25oiQ55+i6YeP5Zu+5b2iJyxcblx0XHRcdFx0XHRcdCdQTkfjgIFHSUbjgIFKUEVH5qqU5qGI5oeJ6Kmy6YeN6KO95oiQ5ZCR6YeP5ZyW5b2iJ1xuXHRcdFx0XHRcdCl9YCxcblx0XHRcdFx0XHR2YWx1ZTogJ1Nob3VsZCBiZSBTVkcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogd2luZG93LndnVUxTKCfmlofku7blj5bku6PmoIfnrb4nLCAn5qqU5qGI5Y+W5Luj5qiZ57GkJyksXG5cdFx0XHR2YWx1ZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IGB7e09ic29sZXRlfX3vvJoke3dpbmRvdy53Z1VMUygn5pyJ5paw54mI5pys5Y+v55So55qE6L+H5pe25paH5Lu2JywgJ+acieaWsOeJiOacrOWPr+eUqOeahOmBjuaZguaqlOahiCcpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdPYnNvbGV0ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogYHt7VmVjdG9yIHZlcnNpb24gYXZhaWxhYmxlfX3vvJoke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmnInnn6Lph4/lm77lvaLlj6/nlKjnmoTpnZ7nn6Lph4/lm77lvaLmlofku7YnLFxuXHRcdFx0XHRcdFx0J+acieWQkemHj+WcluW9ouWPr+eUqOeahOmdnuWQkemHj+WcluW9ouaqlOahiCdcblx0XHRcdFx0XHQpfWAsXG5cdFx0XHRcdFx0dmFsdWU6ICdWZWN0b3IgdmVyc2lvbiBhdmFpbGFibGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHRcdGJ1aWxkRmlsZW5hbWU6IHRydWUsXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS50YWcuY2FsbGJhY2tzID0ge1xuXHRcdGFydGljbGU6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHQvLyBSZW1vdmUgdGFncyB0aGF0IGJlY29tZSBzdXBlcmZsdW91cyB3aXRoIHRoaXMgYWN0aW9uXG5cdFx0XHRsZXQgcGFnZVRleHQgPSBwYWdlb2JqXG5cdFx0XHRcdC5nZXRQYWdlVGV4dCgpXG5cdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdC9cXHtcXHtcXHMqKFtObl1ldyB1bnJldmlld2VkIGFydGljbGV8W1V1XW5yZXZpZXdlZHxbVXVdc2Vyc3BhY2UgZHJhZnQpXFxzKihcXHwoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pKik/XFx9XFx9XFxzKi9nLFxuXHRcdFx0XHRcdCcnXG5cdFx0XHRcdCk7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBTYXZlcyB0aGUgcGFnZSBmb2xsb3dpbmcgdGhlIHJlbW92YWwgb2YgdGFncyBpZiBhbnkuIFRoZSBsYXN0IHN0ZXAuXG5cdFx0XHQgKiBDYWxsZWQgZnJvbSByZW1vdmVUYWdzKClcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgcG9zdFJlbW92YWwgPSAoKSA9PiB7XG5cdFx0XHRcdGlmIChwYXJhbXMudGFnc1RvUmVtb3ZlLmxlbmd0aCkge1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBlbXB0eSB7e211bHRpcGxlIGlzc3Vlc319IGlmIGZvdW5kXG5cdFx0XHRcdFx0cGFnZVRleHQgPSBwYWdlVGV4dC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0L1xce1xceyhtdWx0aXBsZSA/aXNzdWVzfGFydGljbGUgP2lzc3Vlc3xtaXxhaXxpc3N1ZXN85aSa5YCL5ZWP6aGMfOWkmuS4qumXrumimHzllY/poYzmop3nm6586Zeu6aKY5p2h55uufOaVuOWAi+WVj+mhjHzmlbDkuKrpl67popgpXFxzKlxcfFxccypcXH1cXH1cXG4/L2ltLFxuXHRcdFx0XHRcdFx0Jydcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdC8vIFJlbW92ZSBzaW5nbGUtZWxlbWVudCB7e211bHRpcGxlIGlzc3Vlc319IGlmIGZvdW5kXG5cdFx0XHRcdFx0cGFnZVRleHQgPSBwYWdlVGV4dC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0L1xce1xceyg/Om11bHRpcGxlID9pc3N1ZXN8YXJ0aWNsZSA/aXNzdWVzfG1pfGFpfGlzc3Vlc3zlpJrlgIvllY/poYx85aSa5Liq6Zeu6aKYfOWVj+mhjOaineebrnzpl67popjmnaHnm6585pW45YCL5ZWP6aGMfOaVsOS4qumXrumimClcXHMqXFx8XFxzKihcXHtcXHsoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pK1xcfVxcfSlcXHMqXFx9XFx9L2ltLFxuXHRcdFx0XHRcdFx0JyQxJ1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gQnVpbGQgZWRpdCBzdW1tYXJ5XG5cdFx0XHRcdGNvbnN0IG1ha2VTZW50ZW5jZSA9IChhcnJheSkgPT4ge1xuXHRcdFx0XHRcdGlmIChhcnJheS5sZW5ndGggPCAzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYXJyYXkuam9pbign5ZKMJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGxhc3QgPSBhcnJheS5wb3AoKTtcblx0XHRcdFx0XHRyZXR1cm4gYCR7YXJyYXkuam9pbign44CBJyl95ZKMJHtsYXN0fWA7XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IG1ha2VUZW1wbGF0ZUxpbmsgPSAodGFnKSA9PiB7XG5cdFx0XHRcdFx0bGV0IHRleHQgPSAne3tbWyc7XG5cdFx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBjdXN0b20gdGFnIHdpdGggYSBwYXJhbWV0ZXJcblx0XHRcdFx0XHRpZiAodGFnLmluY2x1ZGVzKCd8JykpIHtcblx0XHRcdFx0XHRcdHRhZyA9IHRhZy5zbGljZSgwLCB0YWcuaW5kZXhPZignfCcpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGV4dCArPSB0YWcuaW5jbHVkZXMoJzonKSA/IHRhZyA6IGBUZW1wbGF0ZToke3RhZ318JHt0YWd9YDtcblx0XHRcdFx0XHRyZXR1cm4gYCR7dGV4dH1dXX19YDtcblx0XHRcdFx0fTtcblx0XHRcdFx0bGV0IHN1bW1hcnlUZXh0O1xuXHRcdFx0XHRjb25zdCBhZGRlZFRhZ3MgPSBwYXJhbXMudGFncy5tYXAobWFrZVRlbXBsYXRlTGluayk7XG5cdFx0XHRcdGNvbnN0IHJlbW92ZWRUYWdzID0gcGFyYW1zLnRhZ3NUb1JlbW92ZS5tYXAobWFrZVRlbXBsYXRlTGluayk7XG5cdFx0XHRcdGlmIChhZGRlZFRhZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdFx0c3VtbWFyeVRleHQgPSBg5Yqg5YWlJHttYWtlU2VudGVuY2UoYWRkZWRUYWdzKX1gO1xuXHRcdFx0XHRcdHN1bW1hcnlUZXh0ICs9IHJlbW92ZWRUYWdzLmxlbmd0aCA/IGDkuKbnp7vpmaQke21ha2VTZW50ZW5jZShyZW1vdmVkVGFncyl9YCA6ICcnO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN1bW1hcnlUZXh0ID0gYOenu+mZpCR7bWFrZVNlbnRlbmNlKHJlbW92ZWRUYWdzKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN1bW1hcnlUZXh0ICs9IHdpbmRvdy53Z1VMUygn5qCH6K6wJywgJ+aomeiomCcpO1xuXHRcdFx0XHRpZiAocGFyYW1zLnJlYXNvbikge1xuXHRcdFx0XHRcdHN1bW1hcnlUZXh0ICs9IGDvvJoke3BhcmFtcy5yZWFzb259YDtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBhdm9pZCB0cnVuY2F0ZWQgc3VtbWFyaWVzXG5cdFx0XHRcdGlmIChzdW1tYXJ5VGV4dC5sZW5ndGggPiA0OTkpIHtcblx0XHRcdFx0XHRzdW1tYXJ5VGV4dCA9IHN1bW1hcnlUZXh0LnJlcGxhY2UoL1xcW1xcW1tefF0rXFx8KFteXFxdXSspXFxdXFxdL2csICckMScpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQocGFnZVRleHQpO1xuXHRcdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnlUZXh0KTtcblx0XHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdHBhZ2VvYmouc2V0V2F0Y2hsaXN0KFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hUYWdnZWRQYWdlcycpKTtcblx0XHRcdFx0cGFnZW9iai5zZXRNaW5vckVkaXQoVHdpbmtsZS5nZXRQcmVmKCdtYXJrVGFnZ2VkUGFnZXNBc01pbm9yJykpO1xuXHRcdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdFx0cGFnZW9iai5zYXZlKCgpID0+IHtcblx0XHRcdFx0XHQvLyBzcGVjaWFsIGZ1bmN0aW9ucyBmb3IgbWVyZ2UgdGFnc1xuXHRcdFx0XHRcdGlmIChwYXJhbXMubWVyZ2VSZWFzb24pIHtcblx0XHRcdFx0XHRcdC8vIHBvc3QgdGhlIHJhdGlvbmFsZSBvbiB0aGUgdGFsayBwYWdlIChvbmx5IG9wZXJhdGVzIGluIG1haW4gbmFtZXNwYWNlKVxuXHRcdFx0XHRcdFx0Y29uc3QgdGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHRgVGFsazoke3BhcmFtcy5kaXNjdXNzQXJ0aWNsZX1gLFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WwhueQhueUsei0tOi/m+iuqOiuuumhtScsICflsIfnkIbnlLHosrzpgLLoqI7oq5bpoIEnKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHRhbGtwYWdlLnNldE5ld1NlY3Rpb25UZXh0KGAke3BhcmFtcy5tZXJnZVJlYXNvbi50cmltKCl9IH5+YC5jb25jYXQoJ35+JykpO1xuXHRcdFx0XHRcdFx0dGFsa3BhZ2Uuc2V0TmV3U2VjdGlvblRpdGxlKGDor7fmsYLkuI5bWyR7cGFyYW1zLm5vbkRpc2N1c3NBcnRpY2xlfV1d5ZCI5bm2YCk7XG5cdFx0XHRcdFx0XHR0YWxrcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0XHR0YWxrcGFnZS5zZXRXYXRjaGxpc3QoVHdpbmtsZS5nZXRQcmVmKCd3YXRjaE1lcmdlRGlzY3Vzc2lvbnMnKSk7XG5cdFx0XHRcdFx0XHR0YWxrcGFnZS5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRcdFx0XHR0YWxrcGFnZS5uZXdTZWN0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwYXJhbXMubWVyZ2VUYWdPdGhlcikge1xuXHRcdFx0XHRcdFx0Ly8gdGFnIHRoZSB0YXJnZXQgcGFnZSBpZiByZXF1ZXN0ZWRcblx0XHRcdFx0XHRcdGxldCBvdGhlclRhZ05hbWUgPSAnTWVyZ2UnO1xuXHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5tZXJnZVRhZyA9PT0gJ01lcmdlIGZyb20nKSB7XG5cdFx0XHRcdFx0XHRcdG90aGVyVGFnTmFtZSA9ICdNZXJnZSB0byc7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHBhcmFtcy5tZXJnZVRhZyA9PT0gJ01lcmdlIHRvJykge1xuXHRcdFx0XHRcdFx0XHRvdGhlclRhZ05hbWUgPSAnTWVyZ2UgZnJvbSc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdQYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRcdHRhZ3M6IFtvdGhlclRhZ05hbWVdLFxuXHRcdFx0XHRcdFx0XHR0YWdzVG9SZW1vdmU6IFtdLFxuXHRcdFx0XHRcdFx0XHR0YWdzVG9SZW1haW46IFtdLFxuXHRcdFx0XHRcdFx0XHRtZXJnZVRhcmdldDogTW9yZWJpdHMucGFnZU5hbWVOb3JtLFxuXHRcdFx0XHRcdFx0XHRkaXNjdXNzQXJ0aWNsZTogcGFyYW1zLmRpc2N1c3NBcnRpY2xlLFxuXHRcdFx0XHRcdFx0XHR0YWxrRGlzY3Vzc2lvblRpdGxlOiBwYXJhbXMudGFsa0Rpc2N1c3Npb25UaXRsZSxcblx0XHRcdFx0XHRcdFx0dGFsa0Rpc2N1c3Npb25UaXRsZUxpbmtlZDogcGFyYW1zLnRhbGtEaXNjdXNzaW9uVGl0bGVMaW5rZWQsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3RoZXJwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdFx0cGFyYW1zLm1lcmdlVGFyZ2V0LFxuXHRcdFx0XHRcdFx0XHRgJHt3aW5kb3cud2dVTFMoJ+agh+iusOWFtuS7lumhtemdou+8iCcsICfmqJnoqJjlhbbku5bpoIHpnaLvvIgnKSArIHBhcmFtcy5tZXJnZVRhcmdldH3vvIlgXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b3RoZXJwYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhuZXdQYXJhbXMpO1xuXHRcdFx0XHRcdFx0b3RoZXJwYWdlLmxvYWQoVHdpbmtsZS50YWcuY2FsbGJhY2tzLmFydGljbGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBzcGVjaWFsIGZ1bmN0aW9ucyBmb3IgcmVxdWVzdGVkIG1vdmUgdGFnc1xuXHRcdFx0XHRcdGlmIChwYXJhbXMubW92ZVJlYXNvbikge1xuXHRcdFx0XHRcdFx0Ly8gcG9zdCB0aGUgcmF0aW9uYWxlIG9uIHRoZSB0YWxrIHBhZ2UgKG9ubHkgb3BlcmF0ZXMgaW4gbWFpbiBuYW1lc3BhY2UpXG5cdFx0XHRcdFx0XHRsZXQgbW92ZVRhbGtwYWdlVGV4dCA9ICdcXG5cXG57eycuY29uY2F0KCdzdWJzdDonLCBgUk18MT0ke3BhcmFtcy5tb3ZlUmVhc29uLnRyaW0oKX1gKTtcblx0XHRcdFx0XHRcdGlmIChwYXJhbXMubW92ZVRhcmdldCkge1xuXHRcdFx0XHRcdFx0XHRtb3ZlVGFsa3BhZ2VUZXh0ICs9IGB8Mj0ke3BhcmFtcy5tb3ZlVGFyZ2V0fWA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtb3ZlVGFsa3BhZ2VUZXh0ICs9ICd9fSc7XG5cdFx0XHRcdFx0XHRjb25zdCBtb3ZlVGFsa3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHRgVGFsazoke3BhcmFtcy5kaXNjdXNzQXJ0aWNsZX1gLFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WwhueQhueUsei0tOi/m+iuqOiuuumhtScsICflsIfnkIbnlLHosrzpgLLoqI7oq5bpoIEnKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdG1vdmVUYWxrcGFnZS5zZXRBcHBlbmRUZXh0KG1vdmVUYWxrcGFnZVRleHQpO1xuXHRcdFx0XHRcdFx0bW92ZVRhbGtwYWdlLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivt+axguenu+WKqCcsICfoq4vmsYLnp7vli5UnKSArXG5cdFx0XHRcdFx0XHRcdFx0KHBhcmFtcy5tb3ZlVGFyZ2V0ID8gYOiHs1tbJHtwYXJhbXMubW92ZVRhcmdldH1dXWAgOiAnJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRtb3ZlVGFsa3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdFx0bW92ZVRhbGtwYWdlLnNldENyZWF0ZU9wdGlvbigncmVjcmVhdGUnKTtcblx0XHRcdFx0XHRcdG1vdmVUYWxrcGFnZS5hcHBlbmQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAocGFyYW1zLnBhdHJvbCkge1xuXHRcdFx0XHRcdHBhZ2VvYmoucGF0cm9sKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHQvKipcblx0XHRcdCAqIFJlbW92ZXMgdGhlIGV4aXN0aW5nIHRhZ3MgdGhhdCB3ZXJlIGRlc2VsZWN0ZWQgKGlmIGFueSlcblx0XHRcdCAqIENhbGxzIHBvc3RSZW1vdmFsKCkgd2hlbiBkb25lXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHJlbW92ZVRhZ3MgPSAoKSA9PiB7XG5cdFx0XHRcdGlmIChwYXJhbXMudGFnc1RvUmVtb3ZlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHBvc3RSZW1vdmFsKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+h5oGvJywgJ+izh+ioiicpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn56e76Zmk5Y+W5raI6YCJ5oup55qE5bey5a2Y5Zyo5qCH6K6wJywgJ+enu+mZpOWPlua2iOmBuOaTh+eahOW3suWtmOWcqOaomeiomCcpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGdldFJlZGlyZWN0c0ZvciA9IFtdO1xuXHRcdFx0XHQvLyBSZW1vdmUgdGhlIHRhZ3MgZnJvbSB0aGUgcGFnZSB0ZXh0LCBpZiBmb3VuZCBpbiBpdHMgcHJvcGVyIG5hbWUsXG5cdFx0XHRcdC8vIG90aGVyd2lzZSBtb3ZlcyBpdCB0byBgZ2V0UmVkaXJlY3RzRm9yYCBhcnJheSBlYXJtYXJraW5nIGl0IGZvclxuXHRcdFx0XHQvLyBsYXRlciByZW1vdmFsXG5cdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHBhcmFtcy50YWdzVG9SZW1vdmUpIHtcblx0XHRcdFx0XHRjb25zdCB0YWdfcmUgPSBuZXcgUmVnRXhwKGBcXFxce1xcXFx7JHtNb3JlYml0cy5wYWdlTmFtZVJlZ2V4KHRhZyl9XFxcXHMqKFxcXFx8W159XSspP1xcXFx9XFxcXH1cXFxcbj9gKTtcblx0XHRcdFx0XHRpZiAodGFnX3JlLnRlc3QocGFnZVRleHQpKSB7XG5cdFx0XHRcdFx0XHRwYWdlVGV4dCA9IHBhZ2VUZXh0LnJlcGxhY2UodGFnX3JlLCAnJyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGdldFJlZGlyZWN0c0Zvci5wdXNoKGBUZW1wbGF0ZToke3RhZ31gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFnZXRSZWRpcmVjdHNGb3IubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cG9zdFJlbW92YWwoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUmVtb3ZlIHRhZ3Mgd2hpY2ggYXBwZWFyIGluIHBhZ2UgdGV4dCBhcyByZWRpcmVjdHNcblx0XHRcdFx0Y29uc3QgYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6I635Y+W5qih5p2/6YeN5a6a5ZCRJywgJ+WPluW+l+aooeadv+mHjeaWsOWwjuWQkScpLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRcdHByb3A6ICdsaW5rc2hlcmUnLFxuXHRcdFx0XHRcdFx0dGl0bGVzOiBnZXRSZWRpcmVjdHNGb3Iuam9pbignfCcpLFxuXHRcdFx0XHRcdFx0cmVkaXJlY3RzOiAxLFxuXHRcdFx0XHRcdFx0bGhuYW1lc3BhY2U6ICcxMCcsXG5cdFx0XHRcdFx0XHRsaHNob3c6ICdyZWRpcmVjdCcsXG5cdFx0XHRcdFx0XHRsaGxpbWl0OiAnbWF4JywgLy8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdChhcGlvYmopID0+IHtcblx0XHRcdFx0XHRcdCQoYXBpb2JqLnJlc3BvbnNlWE1MKVxuXHRcdFx0XHRcdFx0XHQuZmluZCgncGFnZScpXG5cdFx0XHRcdFx0XHRcdC5lYWNoKChfaWR4LCBwYWdlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHJlbW92ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHQkKHBhZ2UpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZmluZCgnbGgnKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmVhY2goKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB0YWcgPSAkKGVsZW1lbnQpLmF0dHIoJ3RpdGxlJykuc2xpY2UoOSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRhZ19yZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YFxcXFx7XFxcXHske01vcmViaXRzLnBhZ2VOYW1lUmVnZXgoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0YWdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpfVxcXFxzKihcXFxcfCg/OlxcXFx7XFxcXHtbXnt9XSpcXFxcfVxcXFx9fFtee31dKSopP1xcXFx9XFxcXH1cXFxcbj9gXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0YWdfcmUudGVzdChwYWdlVGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYWdlVGV4dCA9IHBhZ2VUZXh0LnJlcGxhY2UodGFnX3JlLCAnJyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVtb3ZlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBicmVhayBvdXQgb2YgJC5lYWNoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFyZW1vdmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5peg5rOV5Zyo6aG16Z2i5LiK5om+5Yiwe3snLCAn54Sh5rOV5Zyo6aCB6Z2i5LiK5om+5Yiwe3snKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JChwYWdlKS5hdHRyKCd0aXRsZScpLnNsaWNlKDkpICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ3194oCm4oCm6Lez6L+HJywgJ3194oCm4oCm6Lez6YGOJylcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHBvc3RSZW1vdmFsKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhcGkucG9zdCgpO1xuXHRcdFx0fTtcblx0XHRcdGlmICghcGFyYW1zLnRhZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdHJlbW92ZVRhZ3MoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHRhZ1JlO1xuXHRcdFx0bGV0IHRhZ1RleHQgPSAnJztcblx0XHRcdGxldCB0YWdzID0gW107XG5cdFx0XHRjb25zdCBncm91cGFibGVUYWdzID0gW107XG5cdFx0XHRjb25zdCBncm91cGFibGVFeGlzdGluZ1RhZ3MgPSBbXTtcblx0XHRcdC8vIEV4ZWN1dGVzIGZpcnN0OiBhZGRpdGlvbiBvZiBzZWxlY3RlZCB0YWdzXG5cdFx0XHQvKipcblx0XHRcdCAqIFVwZGF0ZXMgYHRhZ1RleHRgIHdpdGggdGhlIHN5bnRheCBvZiBgdGFnTmFtZWAgdGVtcGxhdGUgd2l0aCBpdHMgcGFyYW1ldGVyc1xuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFkZFRhZyA9ICh0YWdOYW1lKSA9PiB7XG5cdFx0XHRcdGxldCBjdXJyZW50VGFnID0gJyc7XG5cdFx0XHRcdGlmICh0YWdOYW1lID09PSAnVW5jYXRlZ29yaXplZCcgfHwgdGFnTmFtZSA9PT0gJ0ltcHJvdmUgY2F0ZWdvcmllcycpIHtcblx0XHRcdFx0XHRwYWdlVGV4dCArPSBgXFxuXFxue3ske3RhZ05hbWV9fHRpbWU9e3tgLmNvbmNhdCgnc3Vic3Q6JywgJyN0aW1lOmN9fX19Jyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudFRhZyArPSBge3ske3RhZ05hbWV9YDtcblx0XHRcdFx0XHQvLyBmaWxsIGluIG90aGVyIHBhcmFtZXRlcnMsIGJhc2VkIG9uIHRoZSB0YWdcblx0XHRcdFx0XHRzd2l0Y2ggKHRhZ05hbWUpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ0V4cGVydCBuZWVkZWQnOlxuXHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8c3ViamVjdD0ke3BhcmFtcy5leHBlcnR9YDtcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5leHBlcnQyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfHN1YmplY3QyPSR7cGFyYW1zLmV4cGVydDJ9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLmV4cGVydDMpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8c3ViamVjdDM9JHtwYXJhbXMuZXhwZXJ0M31gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UnOlxuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgdG8nOlxuXHRcdFx0XHRcdFx0Y2FzZSAnTWVyZ2UgZnJvbSc6XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJhbXMubWVyZ2VUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBub3JtYWxpemUgdGhlIG1lcmdlIHRhcmdldCBmb3Igbm93IGFuZCBsYXRlclxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5tZXJnZVRhcmdldCA9IE1vcmViaXRzLnN0cmluZy50b1VwcGVyQ2FzZUZpcnN0Q2hhcihcblx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5tZXJnZVRhcmdldC5yZXBsYWNlKC9fL2csICcgJylcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwke3BhcmFtcy5tZXJnZVRhcmdldH1gO1xuXHRcdFx0XHRcdFx0XHRcdC8vIGxpbmsgdG8gdGhlIGNvcnJlY3Qgc2VjdGlvbiBvbiB0aGUgdGFsayBwYWdlLCBmb3IgYXJ0aWNsZSBzcGFjZSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMCAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0KHBhcmFtcy5tZXJnZVJlYXNvbiB8fCBwYXJhbXMuZGlzY3Vzc0FydGljbGUpXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXBhcmFtcy5kaXNjdXNzQXJ0aWNsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBkaXNjdXNzQXJ0aWNsZSBpcyB0aGUgYXJ0aWNsZSB3aG9zZSB0YWxrIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkaXNjdXNzaW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5kaXNjdXNzQXJ0aWNsZSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGFnTmFtZSA9PT0gJ01lcmdlIHRvJyA/IHBhcmFtcy5tZXJnZVRhcmdldCA6IG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gbm9uRGlzY3Vzc0FydGljbGUgaXMgdGhlIGFydGljbGUgd2hpY2ggd29uJ3QgaGF2ZSB0aGUgZGlzY3Vzc2lvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbXMubm9uRGlzY3Vzc0FydGljbGUgPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRhZ05hbWUgPT09ICdNZXJnZSB0bycgPyBtdy5jb25maWcuZ2V0KCd3Z1RpdGxlJykgOiBwYXJhbXMubWVyZ2VUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtcy50YWxrRGlzY3Vzc2lvblRpdGxlID1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ivt+axguS4jicsICfoq4vmsYLoiIcnKSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1zLm5vbkRpc2N1c3NBcnRpY2xlICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WQiOW5ticsICflkIjkvbUnKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHxkaXNjdXNzPVRhbGs6JHtwYXJhbXMuZGlzY3Vzc0FydGljbGV9IyR7cGFyYW1zLnRhbGtEaXNjdXNzaW9uVGl0bGV9YDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdNaXNzaW5nIGluZm9ybWF0aW9uJzpcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDE9JHtwYXJhbXMubWlzc2luZ0luZm9ybWF0aW9ufWA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnTm90YWJpbGl0eSc6XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJhbXMubm90YWJpbGl0eSAhPT0gJ25vbmUnKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDM9JHtwYXJhbXMubm90YWJpbGl0eX1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnUmVxdWVzdGVkIG1vdmUnOlxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLm1vdmVUYXJnZXQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBub3JtYWxpemUgdGhlIG1vdmUgdGFyZ2V0IGZvciBub3cgYW5kIGxhdGVyXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW1zLm1vdmVUYXJnZXQgPSBNb3JlYml0cy5zdHJpbmcudG9VcHBlckNhc2VGaXJzdENoYXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRwYXJhbXMubW92ZVRhcmdldC5yZXBsYWNlKC9fL2csICcgJylcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdHBhcmFtcy5kaXNjdXNzQXJ0aWNsZSA9IG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKTtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8JHtwYXJhbXMubW92ZVRhcmdldH1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnU3BsaXQnOlxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLnRhcmdldDEpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8MT0ke3BhcmFtcy50YXJnZXQxfWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy50YXJnZXQyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDI9JHtwYXJhbXMudGFyZ2V0Mn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChwYXJhbXMudGFyZ2V0Mykge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwzPSR7cGFyYW1zLnRhcmdldDN9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ0NsZWFudXAnOlxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLmNsZWFudXBSZWFzb24pIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8cmVhc29uPSR7cGFyYW1zLmNsZWFudXBSZWFzb259YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJyZW50VGFnICs9ICd8dGltZT17eycuY29uY2F0KCdzdWJzdDonLCAnI3RpbWU6Y319fX1cXG4nKTtcblx0XHRcdFx0XHR0YWdUZXh0ICs9IGN1cnJlbnRUYWc7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHQvKipcblx0XHRcdCAqIEFkZHMgdGhlIHRhZ3Mgd2hpY2ggZ28gb3V0c2lkZSB7e211bHRpcGxlIGlzc3Vlc319LCBlaXRoZXIgYmVjYXVzZVxuXHRcdFx0ICogdGhlc2UgdGFncyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHt7bXVsdGlwbGUgaXNzdWVzfX0gb3IgYmVjYXVzZVxuXHRcdFx0ICoge3ttdWx0aXBsZSBpc3N1ZXN9fSBpcyBub3QgYmVpbmcgYWRkZWQgdG8gdGhlIHBhZ2UgYXQgYWxsXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFkZFVuZ3JvdXBlZFRhZ3MgPSAoKSA9PiB7XG5cdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcblx0XHRcdFx0XHRhZGRUYWcodGFnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBJbnNlcnQgdGFnIGFmdGVyIHNob3J0IGRlc2NyaXB0aW9uIG9yIGFueSBoYXRub3Rlcyxcblx0XHRcdFx0Ly8gYXMgd2VsbCBhcyBkZWxldGlvbi9wcm90ZWN0aW9uLXJlbGF0ZWQgdGVtcGxhdGVzXG5cdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpdGV4dC5wYWdlKHBhZ2VUZXh0KTtcblx0XHRcdFx0Y29uc3QgdGVtcGxhdGVzQWZ0ZXIgPVxuXHRcdFx0XHRcdC8vIFByb3RlY3Rpb24gdGVtcGxhdGVzXG5cdFx0XHRcdFx0Ly8gQ1NEXG5cdFx0XHRcdFx0Ly8gQWZEXG5cdFx0XHRcdFx0YCR7VHdpbmtsZS5oYXRub3RlUmVnZXh9cHB8cHAtLio/fCg/OkRlbGV0ZXxEYi1yZWFzb258RHxEZWxldGViZWNhdXNlfERifOmAn+WIoHzpgJ/liKp8U3BlZWR5fFNEfOW/q+WIoHzlv6vliKp8Q1NEKXxbcnNhaWZ0Y212XWZkfHZmZC0oPzpifHF8c3xzb3VyY2V8dnx3aWt0KXwoPzrnp7vliqjliLDnu7Tln7p856e75YuV5Yiw57at5Z+6KSg/OuaVmeenkeS5pnzmlZnnp5Hmm7h86K+t5b2VfOiqnumMhHzmloflupN85paH5bqrfOWvvOa4uHzlsI7pgYp86K+N5YW4fOipnuWFuClgO1xuXHRcdFx0XHRwYWdlVGV4dCA9IHlzYXJjaGl2ZXNfcGFnZS5pbnNlcnRBZnRlclRlbXBsYXRlcyh0YWdUZXh0LCB0ZW1wbGF0ZXNBZnRlcikuZ2V0VGV4dCgpO1xuXHRcdFx0XHRyZW1vdmVUYWdzKCk7XG5cdFx0XHR9O1xuXHRcdFx0Ly8gU2VwYXJhdGUgdGFncyBpbnRvIGdyb3VwYWJsZSBvbmVzIChgZ3JvdXBhYmxlVGFnc2ApIGFuZCBub24tZ3JvdXBhYmxlIG9uZXMgKGB0YWdzYClcblx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHBhcmFtcy50YWdzKSB7XG5cdFx0XHRcdHRhZ1JlID0gbmV3IFJlZ0V4cChgXFxcXHtcXFxceyR7dGFnfShcXFxcfHxcXFxcfVxcXFx9KWAsICdpbScpO1xuXHRcdFx0XHQvLyByZWdleCBjaGVjayBmb3IgcHJlZXhpc3RlbmNlIG9mIHRhZyBjYW4gYmUgc2tpcHBlZCBpZiBpbiBjYW5SZW1vdmUgbW9kZVxuXHRcdFx0XHRpZiAoVHdpbmtsZS50YWcuY2FuUmVtb3ZlIHx8ICF0YWdSZS5leGVjKHBhZ2VUZXh0KSkge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHRhZyA9PT0gJ05vdGFiaWxpdHknICYmXG5cdFx0XHRcdFx0XHQobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMCB8fFxuXHRcdFx0XHRcdFx0XHRjb25maXJtKFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfor6XpobXpnaLkuI3mmK/mnaHnm67vvIzmgqjku43opoHmj5DmiqXliLDlhbPms6jluqbmj5DmiqXlkJfvvJ8nLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+ipsumggemdouS4jeaYr+aineebru+8jOaCqOS7jeimgeaPkOWgseWIsOmXnOazqOW6puaPkOWgseWXju+8nydcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRcdFx0XHQnTElCX3RhbGs65a2Y5bqf6K6o6K66L+WFs+azqOW6puaPkOaKpScsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Yqg5YWl5YWz5rOo5bqm6K6w5b2V6aG5JywgJ+WKoOWFpemXnOazqOW6puiomOmMhOmghScpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldEZvbGxvd1JlZGlyZWN0KHRydWUpO1xuXHRcdFx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS50YWcuY2FsbGJhY2tzLm5vdGFiaWxpdHlMaXN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gY29uZGl0aW9uIFR3aW5rbGUudGFnLmFydGljbGUudGFnc1t0YWddIHRvIGVuc3VyZSB0aGF0IGl0cyBub3QgYSBjdXN0b20gdGFnXG5cdFx0XHRcdFx0Ly8gQ3VzdG9tIHRhZ3MgYXJlIGFzc3VtZWQgbm9uLWdyb3VwYWJsZSwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGV0aGVyIE1JIHRlbXBsYXRlIHN1cHBvcnRzIHRoZW1cblx0XHRcdFx0XHRpZiAoVHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0W3RhZ10gJiYgIVR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFt0YWddLmV4Y2x1ZGVNSSkge1xuXHRcdFx0XHRcdFx0Z3JvdXBhYmxlVGFncy5wdXNoKHRhZyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0YWcgPT09ICdNZXJnZSBmcm9tJykge1xuXHRcdFx0XHRcdHRhZ3MucHVzaCh0YWcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy53YXJuKFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WcqOmhtemdouS4iuaJvuWIsHt7JywgJ+WcqOmggemdouS4iuaJvuWIsHt7JykgKyB0YWcgKyB3aW5kb3cud2dVTFMoJ3194oCm4oCm6Lez6L+HJywgJ3194oCm4oCm6Lez6YGOJylcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdC8vIGRvbid0IGRvIGFueXRoaW5nIGVsc2Ugd2l0aCBtZXJnZSB0YWdzXG5cdFx0XHRcdFx0aWYgKFsnTWVyZ2UnLCAnTWVyZ2UgdG8nXS5pbmNsdWRlcyh0YWcpKSB7XG5cdFx0XHRcdFx0XHRwYXJhbXMubWVyZ2VUYXJnZXQgPSBudWxsO1xuXHRcdFx0XHRcdFx0cGFyYW1zLm1lcmdlUmVhc29uID0gbnVsbDtcblx0XHRcdFx0XHRcdHBhcmFtcy5tZXJnZVRhZ090aGVyID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFRvLWJlLXJldGFpbmVkIGV4aXN0aW5nIHRhZ3MgdGhhdCBhcmUgZ3JvdXBhYmxlXG5cdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBwYXJhbXMudGFnc1RvUmVtYWluKSB7XG5cdFx0XHRcdC8vIElmIHRoZSB0YWcgaXMgdW5rbm93biB0byB1cywgd2UgY29uc2lkZXIgaXQgbm9uLWdyb3VwYWJsZVxuXHRcdFx0XHRpZiAoVHdpbmtsZS50YWcuYXJ0aWNsZS5mbGF0T2JqZWN0W3RhZ10gJiYgIVR3aW5rbGUudGFnLmFydGljbGUuZmxhdE9iamVjdFt0YWddLmV4Y2x1ZGVNSSkge1xuXHRcdFx0XHRcdGdyb3VwYWJsZUV4aXN0aW5nVGFncy5wdXNoKHRhZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IG1pVGVzdCA9XG5cdFx0XHRcdC9cXHtcXHsobXVsdGlwbGUgP2lzc3Vlc3xhcnRpY2xlID9pc3N1ZXN8bWl8YWl8aXNzdWVzfOWkmuWAi+WVj+mhjHzlpJrkuKrpl67poph85ZWP6aGM5qKd55uufOmXrumimOadoeebrnzmlbjlgIvllY/poYx85pWw5Liq6Zeu6aKYKVxccypcXHxbXn1dK1xcey9pbS5leGVjKFxuXHRcdFx0XHRcdHBhZ2VUZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHRpZiAobWlUZXN0ICYmIGdyb3VwYWJsZVRhZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyhcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5Yqg5YWl5pSv5oyB55qE5qCH6K6w5YWl5bey5a2Y5Zyo55qEe3ttdWx0aXBsZSBpc3N1ZXN9fScsXG5cdFx0XHRcdFx0XHQn5Yqg5YWl5pSv5o+055qE5qiZ6KiY5YWl5bey5a2Y5Zyo55qEe3ttdWx0aXBsZSBpc3N1ZXN9fSdcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRhZ1RleHQgPSAnJztcblx0XHRcdFx0Zm9yIChjb25zdCB0YWcgb2YgZ3JvdXBhYmxlVGFncykge1xuXHRcdFx0XHRcdGFkZFRhZyh0YWcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG1pUmVnZXggPSBuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdGAoXFxcXHtcXFxce1xcXFxzKiR7bWlUZXN0WzFdfVxcXFxzKig/OlxcXFx8KD86XFxcXHtcXFxce1tee31dKlxcXFx9XFxcXH18W157fV0pKik/KVxcXFx9XFxcXH1cXFxccypgLFxuXHRcdFx0XHRcdCdpbSdcblx0XHRcdFx0KTtcblx0XHRcdFx0cGFnZVRleHQgPSBwYWdlVGV4dC5yZXBsYWNlKG1pUmVnZXgsIGAkMSR7dGFnVGV4dH19fVxcbmApO1xuXHRcdFx0XHR0YWdUZXh0ID0gJyc7XG5cdFx0XHRcdGFkZFVuZ3JvdXBlZFRhZ3MoKTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1zLmdyb3VwICYmICFtaVRlc3QgJiYgZ3JvdXBhYmxlRXhpc3RpbmdUYWdzLmxlbmd0aCArIGdyb3VwYWJsZVRhZ3MubGVuZ3RoID49IDIpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfliqDlhaXmlK/mjIHnmoTmoIforrDlhaV7e211bHRpcGxlIGlzc3Vlc319JywgJ+WKoOWFpeaUr+aPtOeahOaomeiomOWFpXt7bXVsdGlwbGUgaXNzdWVzfX0nKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR0YWdUZXh0ICs9ICd7e011bHRpcGxlIGlzc3Vlc3xcXG4nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogQWRkcyBuZXdseSBhZGRlZCB0YWdzIHRvIE1JXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRjb25zdCBhZGROZXdUYWdzVG9NSSA9ICgpID0+IHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBncm91cGFibGVUYWdzKSB7XG5cdFx0XHRcdFx0XHRhZGRUYWcodGFnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGFnVGV4dCArPSAnfX1cXG4nO1xuXHRcdFx0XHRcdGFkZFVuZ3JvdXBlZFRhZ3MoKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgZ2V0UmVkaXJlY3RzRm9yID0gW107XG5cdFx0XHRcdC8vIFJlcG9zaXRpb24gdGhlIHRhZ3Mgb24gdGhlIHBhZ2UgaW50byB7e211bHRpcGxlIGlzc3Vlc319LCBpZiBmb3VuZCB3aXRoIGl0c1xuXHRcdFx0XHQvLyBwcm9wZXIgbmFtZSwgZWxzZSBtb3ZlcyBpdCB0byBgZ2V0UmVkaXJlY3RzRm9yYCBhcnJheSB0byBiZSBoYW5kbGVkIGxhdGVyXG5cdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIGdyb3VwYWJsZUV4aXN0aW5nVGFncykge1xuXHRcdFx0XHRcdGNvbnN0IHRhZ19yZSA9IG5ldyBSZWdFeHAoYChcXFxce1xcXFx7JHtNb3JlYml0cy5wYWdlTmFtZVJlZ2V4KHRhZyl9XFxcXHMqKFxcXFx8W159XSspP1xcXFx9XFxcXH1cXFxcbj8pYCk7XG5cdFx0XHRcdFx0aWYgKHRhZ19yZS50ZXN0KHBhZ2VUZXh0KSkge1xuXHRcdFx0XHRcdFx0dGFnVGV4dCArPSB0YWdfcmUuZXhlYyhwYWdlVGV4dClbMV07XG5cdFx0XHRcdFx0XHRwYWdlVGV4dCA9IHBhZ2VUZXh0LnJlcGxhY2UodGFnX3JlLCAnJyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGdldFJlZGlyZWN0c0Zvci5wdXNoKGBUZW1wbGF0ZToke3RhZ31gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFnZXRSZWRpcmVjdHNGb3IubGVuZ3RoKSB7XG5cdFx0XHRcdFx0YWRkTmV3VGFnc1RvTUkoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6I635Y+W5qih5p2/6YeN5a6a5ZCRJywgJ+WPluW+l+aooeadv+mHjeaWsOWwjuWQkScpLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRcdHByb3A6ICdsaW5rc2hlcmUnLFxuXHRcdFx0XHRcdFx0dGl0bGVzOiBnZXRSZWRpcmVjdHNGb3Iuam9pbignfCcpLFxuXHRcdFx0XHRcdFx0cmVkaXJlY3RzOiAxLFxuXHRcdFx0XHRcdFx0bGhuYW1lc3BhY2U6ICcxMCcsXG5cdFx0XHRcdFx0XHRsaHNob3c6ICdyZWRpcmVjdCcsXG5cdFx0XHRcdFx0XHRsaGxpbWl0OiAnbWF4JywgLy8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdChhcGlvYmopID0+IHtcblx0XHRcdFx0XHRcdCQoYXBpb2JqLnJlc3BvbnNlWE1MKVxuXHRcdFx0XHRcdFx0XHQuZmluZCgncGFnZScpXG5cdFx0XHRcdFx0XHRcdC5lYWNoKChfaWR4LCBwYWdlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0JChwYWdlKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmZpbmQoJ2xoJylcblx0XHRcdFx0XHRcdFx0XHRcdC5lYWNoKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGFnID0gJChlbGVtZW50KS5hdHRyKCd0aXRsZScpLnNsaWNlKDkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB0YWdfcmUgPSBuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGAoXFxcXHtcXFxceyR7TW9yZWJpdHMucGFnZU5hbWVSZWdleCh0YWcpfVxcXFxzKihcXFxcfFtefV0qKT9cXFxcfVxcXFx9XFxcXG4/KWBcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRhZ19yZS50ZXN0KHBhZ2VUZXh0KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRhZ1RleHQgKz0gdGFnX3JlLmV4ZWMocGFnZVRleHQpWzFdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhZ2VUZXh0ID0gcGFnZVRleHQucmVwbGFjZSh0YWdfcmUsICcnKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBicmVhayBvdXQgb2YgJC5lYWNoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFmb3VuZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+h5oGvJywgJ+izh+ioiicpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aXoOazleWcqOmhtemdouS4iuaJvuWIsHt7JywgJ+eEoeazleWcqOmggemdouS4iuaJvuWIsHt7JykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCQocGFnZSkuYXR0cigndGl0bGUnKS5zbGljZSg5KSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCd9feKApuKApui3s+i/hycsICd9feKApuKApui3s+mBjicpXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhZGROZXdUYWdzVG9NSSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdFx0YXBpLnBvc3QoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhZ3MgPSBbLi4udGFncywgLi4uZ3JvdXBhYmxlVGFnc107XG5cdFx0XHRcdGFkZFVuZ3JvdXBlZFRhZ3MoKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG5vdGFiaWxpdHlMaXN0OiAocGFnZW9iaikgPT4ge1xuXHRcdFx0cGFnZW9iai5zZXRBcHBlbmRUZXh0KCdcXG57eycuY29uY2F0KCdzdWJzdDonLCBgRmFtZWl0ZW18dGl0bGU9JHtNb3JlYml0cy5wYWdlTmFtZU5vcm19fX1gKSk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KGDliqDlhaVbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dYCk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdyZWNyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5hcHBlbmQoKTtcblx0XHR9LFxuXHRcdHJlZGlyZWN0OiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGxldCBwYWdlVGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGxldCB0YWdSZTtcblx0XHRcdGxldCB0YWdUZXh0ID0gJyc7XG5cdFx0XHRsZXQgc3VtbWFyeVRleHQgPSAn5Yqg5YWlJztcblx0XHRcdGNvbnN0IHRhZ3MgPSBbXTtcblx0XHRcdGxldCBpO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHBhcmFtcy50YWdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHRhZ1JlID0gbmV3IFJlZ0V4cChgKFxcXFx7XFxcXHske3BhcmFtcy50YWdzW2ldfShcXFxcfHxcXFxcfVxcXFx9KSlgLCAnaW0nKTtcblx0XHRcdFx0aWYgKHRhZ1JlLmV4ZWMocGFnZVRleHQpKSB7XG5cdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5Zyo6YeN5a6a5ZCR5LiK5om+5Yiwe3snLCAn5Zyo6YeN5paw5bCO5ZCR5LiK5om+5Yiwe3snKSArXG5cdFx0XHRcdFx0XHRcdHBhcmFtcy50YWdzW2ldICtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCd9feKApuKApui3s+i/hycsICd9feKApuKApui3s+mBjicpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YWdzLnB1c2gocGFyYW1zLnRhZ3NbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyB1c2VkIGluIEFycmF5I2ZvckVhY2hcblx0XHRcdGNvbnN0IGFkZFRhZyA9ICh0YWdOYW1lLCB0YWdJbmRleCkgPT4ge1xuXHRcdFx0XHR0YWdUZXh0ICs9IGBcXG57eyR7dGFnTmFtZX1gO1xuXHRcdFx0XHRpZiAodGFnTmFtZSA9PT0gJ+mdnuS4reaWh+mHjeWumuWQkScpIHtcblx0XHRcdFx0XHRpZiAocGFyYW1zLmFsdExhbmdGcm9tKSB7XG5cdFx0XHRcdFx0XHR0YWdUZXh0ICs9IGB8MT0ke3BhcmFtcy5hbHRMYW5nRnJvbX1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHQodGFnTmFtZSA9PT0gJ+adoeebruivt+axgumHjeWumuWQkScgfHwgdGFnTmFtZSA9PT0gJ+aineebruiri+axgumHjeWumuWQkScpICYmXG5cdFx0XHRcdFx0cGFyYW1zLnJlcUFydGljbGVMYW5nICYmXG5cdFx0XHRcdFx0cGFyYW1zLnJlcUFydGljbGVUaXRsZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR0YWdUZXh0ICs9IGB8MT0ke3BhcmFtcy5yZXFBcnRpY2xlTGFuZ31gO1xuXHRcdFx0XHRcdHRhZ1RleHQgKz0gYHwyPSR7cGFyYW1zLnJlcUFydGljbGVUaXRsZX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhZ1RleHQgKz0gJ319Jztcblx0XHRcdFx0aWYgKHRhZ0luZGV4ID4gMCkge1xuXHRcdFx0XHRcdGlmICh0YWdJbmRleCA9PT0gdGFncy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRzdW1tYXJ5VGV4dCArPSAn5ZKMJztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRhZ0luZGV4IDwgdGFncy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRzdW1tYXJ5VGV4dCArPSAn44CBJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0c3VtbWFyeVRleHQgKz0gYHt7W1s6JHt0YWdOYW1lLmluY2x1ZGVzKCc6JykgPyB0YWdOYW1lIDogYFRlbXBsYXRlOiR7dGFnTmFtZX18JHt0YWdOYW1lfWB9XV19fWA7XG5cdFx0XHR9O1xuXHRcdFx0aWYgKCF0YWdzLmxlbmd0aCkge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ayoeacieagh+etvuWPr+S+m+agh+iusCcsICfmspLmnInmqJnnsaTlj6/kvpvmqJnoqJgnKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dGFncy5zb3J0KCk7XG5cdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG5cdFx0XHRcdGFkZFRhZyh0YWcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGFsbCBSY2F0IHNoZWxsIHJlZGlyZWN0cyAoZnJvbSAjNDMzKVxuXHRcdFx0aWYgKHBhZ2VUZXh0Lm1hdGNoKC97eyg/OnJlZHJ8dGhpcyBpcyBhIHJlZGlyZWN0fHIoPzplZGlyZWN0KT8oPzouP2NhdC4qKT9bIF9dP3NoKS9pKSkge1xuXHRcdFx0XHQvLyBSZWdleCBpbnNwaXJlZCBieSBbW1VzZXI6S2VwaGlyL2dhZGdldHMvc2FnaXR0YXJpdXMuanNdXSAoW1tTcGVjaWFsOlBlcm1hTGluay84MzE0MDI4OTNdXSlcblx0XHRcdFx0Y29uc3Qgb2xkVGFncyA9IHBhZ2VUZXh0Lm1hdGNoKC8oXFxzKnt7W0EtWmEtelxcc10rXFx8KD86XFxzKjE9KT8pKCg/OltefHt9XXx7e1tefV0rfX0pKykofX0pXFxzKi9pKTtcblx0XHRcdFx0cGFnZVRleHQgPSBwYWdlVGV4dC5yZXBsYWNlKG9sZFRhZ3NbMF0sIG9sZFRhZ3NbMV0gKyB0YWdUZXh0ICsgb2xkVGFnc1syXSArIG9sZFRhZ3NbM10pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gRm9sZCBhbnkgcHJlLWV4aXN0aW5nIFJjYXRzIGludG8gdGFnbGlzdCBhbmQgdW5kZXIgUmNhdHNoZWxsXG5cdFx0XHRcdGNvbnN0IHBhZ2VUYWdzID0gcGFnZVRleHQubWF0Y2goL1xccyp7ey4rP+mHjeWumuWQkS4qP319L2dpbSk7XG5cdFx0XHRcdGxldCBvbGRQYWdlVGFncyA9ICcnO1xuXHRcdFx0XHRpZiAocGFnZVRhZ3MpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBwYWdlVGFnIG9mIHBhZ2VUYWdzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwYWdlUmUgPSBuZXcgUmVnRXhwKE1vcmViaXRzLnN0cmluZy5lc2NhcGVSZWdFeHAocGFnZVRhZyksICdpbWcnKTtcblx0XHRcdFx0XHRcdHBhZ2VUZXh0ID0gcGFnZVRleHQucmVwbGFjZShwYWdlUmUsICcnKTtcblx0XHRcdFx0XHRcdHBhZ2VUYWcgPSBwYWdlVGFnLnRyaW0oKTtcblx0XHRcdFx0XHRcdG9sZFBhZ2VUYWdzICs9IGBcXG4ke3BhZ2VUYWd9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cGFnZVRleHQgKz0gYFxcbnt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8JHt0YWdUZXh0fSR7b2xkUGFnZVRhZ3N9XFxufX1gO1xuXHRcdFx0fVxuXHRcdFx0c3VtbWFyeVRleHQgKz1cblx0XHRcdFx0KHRhZ3MubGVuZ3RoID4gMCA/IHdpbmRvdy53Z1VMUygn5qCH6K6wJywgJ+aomeiomCcpIDogJ3t7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx9fScpICtcblx0XHRcdFx0d2luZG93LndnVUxTKCfliLDph43lrprlkJEnLCAn5Yiw6YeN5paw5bCO5ZCRJyk7XG5cdFx0XHQvLyBhdm9pZCB0cnVuY2F0ZWQgc3VtbWFyaWVzXG5cdFx0XHRpZiAoc3VtbWFyeVRleHQubGVuZ3RoID4gNDk5KSB7XG5cdFx0XHRcdHN1bW1hcnlUZXh0ID0gc3VtbWFyeVRleHQucmVwbGFjZSgvXFxbXFxbW158XStcXHwoW15cXF1dKylcXF1cXF0vZywgJyQxJyk7XG5cdFx0XHR9XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHBhZ2VUZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoc3VtbWFyeVRleHQpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoVGFnZ2VkUGFnZXMnKSk7XG5cdFx0XHRwYWdlb2JqLnNldE1pbm9yRWRpdChUd2lua2xlLmdldFByZWYoJ21hcmtUYWdnZWRQYWdlc0FzTWlub3InKSk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZSgpO1xuXHRcdFx0aWYgKHBhcmFtcy5wYXRyb2wpIHtcblx0XHRcdFx0cGFnZW9iai5wYXRyb2woKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZpbGU6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRsZXQgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRsZXQgc3VtbWFyeSA9ICfliqDlhaUnO1xuXHRcdFx0Ly8gQWRkIG1haW50ZW5hbmNlIHRhZ3Ncblx0XHRcdGlmIChwYXJhbXMudGFncy5sZW5ndGgpIHtcblx0XHRcdFx0bGV0IHRhZ3RleHQgPSAnJztcblx0XHRcdFx0bGV0IGN1cnJlbnRUYWc7XG5cdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHBhcmFtcy50YWdzKSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBvdGhlciBjb21tb25zLXJlbGF0ZWQgdGFncyBhcmUgcGxhY2VkLCByZW1vdmUgXCJtb3ZlIHRvIFNoYXJlXCIgdGFnXG5cdFx0XHRcdFx0aWYgKFsnS2VlcCBsb2NhbCcsICdOb3cgWXNBcmNoaXZlcyBTaGFyZScsICdEbyBub3QgbW92ZSB0byBZc0FyY2hpdmVzIFNoYXJlJ10uaW5jbHVkZXModGFnKSkge1xuXHRcdFx0XHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0L3t7KG10Y3woY29weSB8bW92ZSApP3RvID9zaGFyZXxtb3ZlIHRvIHlzYXJjaGl2ZXMgc2hhcmV8Y29weSB0byB5c2FyY2hpdmVzIHNoYXJlKVtefV0qfX0vZ2ksXG5cdFx0XHRcdFx0XHRcdCcnXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGFnID09PSAnVmVjdG9yIHZlcnNpb24gYXZhaWxhYmxlJykge1xuXHRcdFx0XHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0L1xce1xceygoY29udmVydCB0byB8Y29udmVydHRvfHNob3VsZCBiZSB8c2hvdWxkYmV8dG8pP3N2Z3xiYWRwbmd8dmVjdG9yaXplKVtefV0qXFx9XFx9L2dpLFxuXHRcdFx0XHRcdFx0XHQnJ1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y3VycmVudFRhZyA9IHRhZztcblx0XHRcdFx0XHRzd2l0Y2ggKHRhZykge1xuXHRcdFx0XHRcdFx0Y2FzZSAnTm93IENvbW1vbnMnOlxuXHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnID0gYHN1YnN0OiR7Y3VycmVudFRhZ31gOyAvLyBzdWJzdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLm5vd2NvbW1vbnNOYW1lICE9PSAnJykge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwxPSR7cGFyYW1zLm5vd2NvbW1vbnNOYW1lfWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdLZWVwIGxvY2FsJzpcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5rZWVwbG9jYWxOYW1lICE9PSAnJykge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHwxPSR7cGFyYW1zLmtlZXBsb2NhbE5hbWV9YDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAocGFyYW1zLmtlZXBsb2NhbFJlYXNvbiAhPT0gJycpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8cmVhc29uPSR7cGFyYW1zLmtlZXBsb2NhbFJlYXNvbn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnUmVuYW1lIG1lZGlhJzpcblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5yZW5hbWVtZWRpYU5ld25hbWUgIT09ICcnKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDE9JHtwYXJhbXMucmVuYW1lbWVkaWFOZXduYW1lfWA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtcy5yZW5hbWVtZWRpYVJlYXNvbiAhPT0gJycpIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VGFnICs9IGB8Mj0ke3BhcmFtcy5yZW5hbWVtZWRpYVJlYXNvbn1gO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnVmVjdG9yIHZlcnNpb24gYXZhaWxhYmxlJzpcblx0XHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0XHRcdGNhc2UgJ09ic29sZXRlJzpcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfDE9JHtwYXJhbXNbYCR7dGFnLnJlcGxhY2UoLyAvZywgJ18nKX1GaWxlYF19YDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdEbyBub3QgbW92ZSB0byBDb21tb25zJzpcblx0XHRcdFx0XHRcdFx0Y3VycmVudFRhZyArPSBgfHJlYXNvbj0ke3BhcmFtcy5Eb05vdE1vdmVUb0NvbW1vbnNfcmVhc29ufWA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnQ29weSB0byBXaWtpbWVkaWEgQ29tbW9ucyc6XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRUYWcgKz0gYHxodW1hbj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX1gO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gZG9uJ3QgY2FyZVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGN1cnJlbnRUYWcgPSBge3ske2N1cnJlbnRUYWd9fX1cXG5gO1xuXHRcdFx0XHRcdHRhZ3RleHQgKz0gY3VycmVudFRhZztcblx0XHRcdFx0XHRzdW1tYXJ5ICs9IGB7eyR7dGFnfX1944CBYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXRhZ3RleHQpIHtcblx0XHRcdFx0XHRwYWdlb2JqXG5cdFx0XHRcdFx0XHQuZ2V0U3RhdHVzRWxlbWVudCgpXG5cdFx0XHRcdFx0XHQud2Fybih3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nO+8jOayoeS7gOS5iOimgeWBmueahCcsICfkvb/nlKjogIXlj5bmtojmk43kvZzvvIzmspLku4DpurzopoHlgZrnmoQnKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHQgPSB0YWd0ZXh0ICsgdGV4dDtcblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KHN1bW1hcnkuc2xpY2UoMCwgTWF0aC5tYXgoMCwgc3VtbWFyeS5sZW5ndGggLSAxKSkpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoVGFnZ2VkUGFnZXMnKSk7XG5cdFx0XHRwYWdlb2JqLnNldE1pbm9yRWRpdChUd2lua2xlLmdldFByZWYoJ21hcmtUYWdnZWRQYWdlc0FzTWlub3InKSk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZSgpO1xuXHRcdFx0aWYgKHBhcmFtcy5wYXRyb2wpIHtcblx0XHRcdFx0cGFnZW9iai5wYXRyb2woKTtcblx0XHRcdH1cblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLnRhZy5jYWxsYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHBhcmFtcyA9IE1vcmViaXRzLnF1aWNrRm9ybS5nZXRJbnB1dERhdGEoZm9ybSk7XG5cdFx0Ly8gVmFsaWRhdGlvblxuXHRcdC8vIEdpdmVuIGFuIGFycmF5IG9mIGluY29tcGF0aWJsZSB0YWdzLCBjaGVjayBpZiB3ZSBoYXZlIHR3byBvciBtb3JlIHNlbGVjdGVkXG5cdFx0Y29uc3QgY2hlY2tJbmNvbXBhdGlibGUgPSAoY29uZmxpY3RzLCBleHRyYSkgPT4ge1xuXHRcdFx0Y29uc3QgY291bnQgPSBjb25mbGljdHMucmVkdWNlKChzdW0sIHRhZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gKHN1bSArPSBwYXJhbXMudGFncy5pbmNsdWRlcyh0YWcpKTtcblx0XHRcdH0sIDApO1xuXHRcdFx0aWYgKGNvdW50ID4gMSkge1xuXHRcdFx0XHRsZXQgbWVzc2FnZSA9IGAke3dpbmRvdy53Z1VMUygn6K+35Zyo5Lul5LiL5qCH562+5Lit5oup5LiA5L2/55SoJywgJ+iri+WcqOS7peS4i+aomeexpOS4reaTh+S4gOS9v+eUqCcpfe+8mnt7JHtjb25mbGljdHMuam9pbihcblx0XHRcdFx0XHQnfX3jgIF7eydcblx0XHRcdFx0KX19feOAgmA7XG5cdFx0XHRcdG1lc3NhZ2UgKz0gZXh0cmEgfHwgJyc7XG5cdFx0XHRcdG13Lm5vdGlmeShtZXNzYWdlLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ2ZyaWVuZGx5dGFnJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gR2l2ZW4gYSB0YWcsIGVuc3VyZSBhbiBhc3NvY2lhdGUgcGFyYW1ldGVyIGlzIHByZXNlbnRcblx0XHQvLyBNYXliZSBqdXN0IHNvY2sgdGhpcyBhd2F5IGluIGVhY2ggZnVuY3Rpb24/Pz9cblx0XHRjb25zdCBjaGVja1BhcmFtZXRlciA9ICh0YWcsIHBhcmFtZXRlciwgZGVzY3JpcHRpb24gPSAn55CG55SxJykgPT4ge1xuXHRcdFx0aWYgKHBhcmFtcy50YWdzLmluY2x1ZGVzKHRhZykgJiYgcGFyYW1zW3BhcmFtZXRlcl0udHJpbSgpID09PSAnJykge1xuXHRcdFx0XHRtdy5ub3RpZnkoYCR7d2luZG93LndnVUxTKCfmgqjlv4XpobvmjIflrponLCAn5oKo5b+F6aCI5oyH5a6aJyl9e3ske3RhZ319feeahCR7ZGVzY3JpcHRpb25944CCYCwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICdmcmllbmRseXRhZycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdC8vIFdlIGNvdWxkIHRoZW9yZXRpY2FsbHkgcHV0IHRoZW0gYWxsIGNoZWNrSW5jb21wYXRpYmxlIGNhbGxzIGluIGFcblx0XHQvLyBmb3JFYWNoIGxvb3AsIGJ1dCBpdCdzIHByb2JhYmx5IGNsZWFyZXIgbm90IHRvIGhhdmUgW1thcnJheSBvbmVdLFxuXHRcdC8vIFthcnJheSB0d29dXSBkZXZvaWQgb2YgY29udGV4dC4gTGlrZXdpc2UsIGFsbCB0aGUgY2hlY2tQYXJhbWV0ZXJcblx0XHQvLyBjYWxscyBjb3VsZCBiZSBpbiBvbmUgaWYsIGJ1dCBjb3VsZCBiZSBzaW1pbGFybHkgY29uZnVzaW5nLlxuXHRcdHN3aXRjaCAoVHdpbmtsZS50YWcubW9kZUVuKSB7XG5cdFx0XHRjYXNlICdhcnRpY2xlJzpcblx0XHRcdFx0cGFyYW1zLnRhZ3NUb1JlbW92ZSA9IGZvcm0uZ2V0VW5jaGVja2VkKCdleGlzdGluZ1RhZ3MnKTsgLy8gbm90IGluIGBpbnB1dGBcblx0XHRcdFx0cGFyYW1zLnRhZ3NUb1JlbWFpbiA9IHBhcmFtcy5leGlzdGluZ1RhZ3MgfHwgW107IC8vIGNvbnRhaW5lciBub3QgY3JlYXRlZCBpZiBub25lIHByZXNlbnRcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHBhcmFtcy50YWdzLmluY2x1ZGVzKCdNZXJnZScpIHx8XG5cdFx0XHRcdFx0cGFyYW1zLnRhZ3MuaW5jbHVkZXMoJ01lcmdlIGZyb20nKSB8fFxuXHRcdFx0XHRcdHBhcmFtcy50YWdzLmluY2x1ZGVzKCdNZXJnZSB0bycpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGNoZWNrSW5jb21wYXRpYmxlKFxuXHRcdFx0XHRcdFx0XHRbJ01lcmdlJywgJ01lcmdlIGZyb20nLCAnTWVyZ2UgdG8nXSxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfoi6XpnIDopoHlpJrmrKHlkIjlubbvvIzor7fkvb/nlKh7e01lcmdlfX3lubbnlKjnrqHpgZPnrKbliIbpmpTmnaHnm67lkI3vvIjkvYblnKjov5nnp43mg4XlvaLkuK1Ud2lua2xl5LiN6IO96Ieq5Yqo5qCH6K6w5YW25LuW5p2h55uu77yJ44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn6Iul6ZyA6KaB5aSa5qyh5ZCI5L2177yM6KuL5L2/55Soe3tNZXJnZX195Lim55So566h6YGT56ym5YiG6ZqU5qKd55uu5ZCN77yI5L2G5Zyo6YCZ56iu5oOF5b2i5LitVHdpbmtsZeS4jeiDveiHquWLleaomeiomOWFtuS7luaineebru+8ieOAgidcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXBhcmFtcy5tZXJnZVRhcmdldCkge1xuXHRcdFx0XHRcdFx0bXcubm90aWZ5KFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+ivt+aMh+WumuS9v+eUqOS6jm1lcmdl5qih5p2/5Lit55qE5Y+m5LiA5Liq6aG16Z2i5qCH6aKY44CCJyxcblx0XHRcdFx0XHRcdFx0XHQn6KuL5oyH5a6a5L2/55So5pa8bWVyZ2XmqKHmnb/kuK3nmoTlj6bkuIDlgIvpoIHpnaLmqJnpoYzjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAnZnJpZW5kbHl0YWcnLFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKHBhcmFtcy5tZXJnZVRhZ090aGVyIHx8IHBhcmFtcy5tZXJnZVJlYXNvbikgJiYgcGFyYW1zLm1lcmdlVGFyZ2V0LmluY2x1ZGVzKCd8JykpIHtcblx0XHRcdFx0XHRcdG13Lm5vdGlmeShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCflvZPliY3ov5jkuI3mlK/mjIHlnKjkuIDmrKHlkIjlubbkuK3moIforrDlpJrkuKrmnaHnm67vvIzkuI7lvIDlkK/lhbPkuo7lpJrkuKrmnaHnm67nmoTorqjorrrjgILor7fkuI3opoHli77pgInigJzmoIforrDlhbbku5bmnaHnm67igJ3lubbmuIXnqbrigJznkIbnlLHigJ3moYblkI7lho3mj5DkuqTjgIInLFxuXHRcdFx0XHRcdFx0XHRcdCfnm67liY3pgoTkuI3mlK/mj7TlnKjkuIDmrKHlkIjkvbXkuK3mqJnoqJjlpJrlgIvmop3nm67vvIzoiIfplovllZ/pl5zmlrzlpJrlgIvmop3nm67nmoToqI7oq5bjgILoq4vkuI3opoHli77pgbjjgIzmqJnoqJjlhbbku5bmop3nm67jgI3kuKbmuIXnqbrjgIznkIbnlLHjgI3moYblvozlho3mj5DkuqTjgIInXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0dGFnOiAnZnJpZW5kbHl0YWcnLFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0Y2hlY2tQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHQnTWlzc2luZyBpbmZvcm1hdGlvbicsXG5cdFx0XHRcdFx0XHQnbWlzc2luZ0luZm9ybWF0aW9uJyxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn57y65bCR55qE5YaF5a65JywgJ+e8uuWwkeeahOWFp+WuuScpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNoZWNrUGFyYW1ldGVyKCdFeHBlcnQgbmVlZGVkJywgJ2V4cGVydCcsIHdpbmRvdy53Z1VMUygn5LiT5a626aKG5Z+fJywgJ+WwiOWutumgmOWfnycpKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2ZpbGUnOlxuXHRcdFx0XHQvLyBTaWxseSB0byBwcm92aWRlIHRoZSBzYW1lIHN0cmluZyB0byBlYWNoIG9mIHRoZXNlXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRjaGVja1BhcmFtZXRlcignT2Jzb2xldGUnLCAnT2Jzb2xldGVGaWxlJywgd2luZG93LndnVUxTKCfmm7/mjaLnmoTmlofku7blkI3np7AnLCAn5pu/5o+b55qE5qqU5qGI5ZCN56ixJykpIHx8XG5cdFx0XHRcdFx0Y2hlY2tQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHQnVmVjdG9yIHZlcnNpb24gYXZhaWxhYmxlJyxcblx0XHRcdFx0XHRcdCdWZWN0b3JfdmVyc2lvbl9hdmFpbGFibGVGaWxlJyxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pu/5o2i55qE5paH5Lu25ZCN56ewJywgJ+abv+aPm+eahOaqlOahiOWQjeeosScpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNoZWNrUGFyYW1ldGVyKCdEbyBub3QgbW92ZSB0byBDb21tb25zJywgJ0RvTm90TW92ZVRvQ29tbW9uc19yZWFzb24nKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JlZGlyZWN0Jzpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtdy5ub3RpZnkoYFR3aW5rbGUudGFn77ya5pyq55+l5qih5byPICR7VHdpbmtsZS50YWcubW9kZX1gLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ2ZyaWVuZGx5dGFnJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvLyBGaWxlL3JlZGlyZWN0OiByZXR1cm4gaWYgbm8gdGFncyBzZWxlY3RlZFxuXHRcdC8vIEFydGljbGU6IHJldHVybiBpZiBubyB0YWcgaXMgc2VsZWN0ZWQgYW5kIG5vIGFscmVhZHkgcHJlc2VudCB0YWcgaXMgZGVzZWxlY3RlZFxuXHRcdGlmIChwYXJhbXMudGFncy5sZW5ndGggPT09IDAgJiYgKFR3aW5rbGUudGFnLm1vZGVFbiAhPT0gJ2FydGljbGUnIHx8IHBhcmFtcy50YWdzVG9SZW1vdmUubGVuZ3RoID09PSAwKSkge1xuXHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5b+F6aG76YCJ5oup6Iez5bCR5LiA5Liq5qCH6K6w77yBJywgJ+W/hemgiOmBuOaTh+iHs+WwkeS4gOWAi+aomeiomO+8gScpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAnZnJpZW5kbHl0YWcnLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQucmVkaXJlY3QgPSBNb3JlYml0cy5wYWdlTmFtZU5vcm07XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gd2luZG93LndnVUxTKFxuXHRcdFx0J+agh+iusOWujOaIkO+8jOWwhuWcqOWHoOenkuWGheWIt+aWsOmhtemdoicsXG5cdFx0XHQn5qiZ6KiY5a6M5oiQ77yM5bCH5Zyo5bm+56eS5YWn6YeN5paw5pW055CG6aCB6Z2iJ1xuXHRcdCk7XG5cdFx0aWYgKFR3aW5rbGUudGFnLm1vZGVFbiA9PT0gJ3JlZGlyZWN0Jykge1xuXHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQuZm9sbG93UmVkaXJlY3QgPSBmYWxzZTtcblx0XHR9XG5cdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSxcblx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo5qCH6K6wJywgJ+ato+WcqOaomeiomCcpICsgVHdpbmtsZS50YWcubW9kZVxuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdHlzYXJjaGl2ZXNfcGFnZS5sb2FkKFR3aW5rbGUudGFnLmNhbGxiYWNrc1tUd2lua2xlLnRhZy5tb2RlRW5dKTtcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS50YWcsICd0YWcnKTtcbn0pKGpRdWVyeSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZXN0dWIuanMgKi9cbihmdW5jdGlvbiB0d2lua2xlc3R1YigkKSB7XG5cdC8qKlxuXHQgKiB0d2lua2xlc3R1Yi5qczogVGFnIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJTdHViXCIpXG5cdCAqIEFjdGl2ZSBvbjogRXhpc3RpbmcgYXJ0aWNsZXNcblx0ICogQ29uZmlnIGRpcmVjdGl2ZXMgaW46IEZyaWVuZGx5Q29uZmlnXG5cdCAqIE5vdGU6IGN1c3RvbWlzZWQgZnJpZW5kbHl0YWcgbW9kdWxlXG5cdCAqL1xuXHRUd2lua2xlLnN0dWIgPSAoKSA9PiB7XG5cdFx0aWYgKE1vcmViaXRzLmlzUGFnZVJlZGlyZWN0KCkpIHtcblx0XHRcdC8vIFNraXBcblx0XHRcdC8vIGFydGljbGUvZHJhZnQgYXJ0aWNsZSB0YWdnaW5nXG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdChbMCwgMzAyXS5pbmNsdWRlcyhtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpKSAmJiBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSkgfHxcblx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSA9PT0gVHdpbmtsZS5nZXRQcmVmKCdzYW5kYm94UGFnZScpXG5cdFx0KSB7XG5cdFx0XHRUd2lua2xlLnN0dWIubW9kZSA9ICfmnaHnm64nO1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhUd2lua2xlLnN0dWIuY2FsbGJhY2ssICflsI/kvZzlk4EnLCAnZnJpZW5kbHktdGFnJywgJ+agh+iusOWwj+S9nOWTgScpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5zdHViLmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGlmIChNb3JlYml0cy5pc1BhZ2VSZWRpcmVjdCgpKSB7XG5cdFx0XHQvLyBTa2lwXG5cdFx0XHQvLyBhcnRpY2xlL2RyYWZ0IGFydGljbGUgdGFnZ2luZ1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQoKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDAgfHwgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMzAyKSAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSkgfHxcblx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSA9PT0gVHdpbmtsZS5nZXRQcmVmKCdzYW5kYm94UGFnZScpXG5cdFx0KSB7XG5cdFx0XHRUd2lua2xlLnN0dWIubW9kZSA9IHdpbmRvdy53Z1VMUygn5p2h55uuJywgJ+aineebricpO1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFx0VHdpbmtsZS5zdHViLmNhbGxiYWNrLFxuXHRcdFx0XHQn5bCP5L2c5ZOBJyxcblx0XHRcdFx0J2ZyaWVuZGx5LXRhZycsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5qCH6K6w5bCP5L2c5ZOBJywgJ+aomeiomOWwj+S9nOWTgScpXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5zdHViLmNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjMwLCBUd2lua2xlLnN0dWIubW9kZSA9PT0gJ2FydGljbGUnID8gNDUwIDogNDAwKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5bCP5L2c5ZOB6Kqq5piOJywgJ+Wwj+S9nOWTgeivtOaYjicpLCAnTElCOuWwj+S9nOWTgScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5bCP5L2c5ZOB6K6+572uJywgJ+Wwj+S9nOWTgeioreWumicpLCAnSDpUVy9QUkVGI3N0dWInKTtcblx0XHRXaW5kb3cuYWRkRm9vdGVyTGluayh3aW5kb3cud2dVTFMoJ1R3aW5rbGXluK7liqknLCAnVHdpbmtsZeiqquaYjicpLCAnSDpUVy9ET0Mjc3R1YicpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUuc3R1Yi5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYXRyb2xsaW5rJykubGVuZ3RoKSB7XG5cdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDpobXpnaLkuLrlt7Llt6Hmn6UnLCAn5qiZ6KiY6aCB6Z2i54K65bey5beh5p+lJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3BhdHJvbFBhZ2UnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ3BhdHJvbFBhZ2UnLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogVHdpbmtsZS5nZXRQcmVmKCdtYXJrU3R1YmJlZFBhZ2VzQXNQYXRyb2xsZWQnKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHN3aXRjaCAoVHdpbmtsZS5zdHViLm1vZGUpIHtcblx0XHRcdGNhc2UgJ+aineebric6XG5cdFx0XHRjYXNlICfmnaHnm64nOlxuXHRcdFx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmnaHnm67lsI/kvZzlk4HmoIforrAnLCAn5qKd55uu5bCP5L2c5ZOB5qiZ6KiYJykpO1xuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0bmFtZTogJ3NvcnRvcmRlcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5p+l55yL5YiX6KGo77yaJywgJ+aqouimluWIl+ihqO+8micpLFxuXHRcdFx0XHRcdHRvb2x0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XlnKhUd2lua2xl5Y+C5pWw6K6+572u77yISDpUVy9QUkVG77yJ5Lit5pu05pS55q2k6aG544CCJyxcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XlnKhUd2lua2xl5YGP5aW96Kit5a6a77yISDpUVy9QUkVG77yJ5Lit5pu05pS55q2k6aCF44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0ZXZlbnQ6IFR3aW5rbGUuc3R1Yi51cGRhdGVTb3J0T3JkZXIsXG5cdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0dmFsdWU6ICdjYXQnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmjInnsbvlnosnLCAn5oyJ6aGe5YilJyksXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiBUd2lua2xlLmdldFByZWYoJ3N0dWJBcnRpY2xlU29ydE9yZGVyJykgPT09ICdjYXQnLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiAnYWxwaGEnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogJ+aMieWtl+avjScsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiBUd2lua2xlLmdldFByZWYoJ3N0dWJBcnRpY2xlU29ydE9yZGVyJykgPT09ICdhbHBoYScsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6ICd0YWdXb3JrQXJlYScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG13Lm5vdGlmeShgVHdpbmtsZS5zdHVi77ya5pyq55+l5qih5byPICR7VHdpbmtsZS5zdHViLm1vZGV9YCwge1xuXHRcdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0XHR0YWc6ICd0d2lua2xlc3R1YicsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3N1Ym1pdCcsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZm9ybS5yZW5kZXIoKTtcblx0XHRXaW5kb3cuc2V0Q29udGVudChyZXN1bHQpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0aWYgKFsn5p2h55uuJywgJ+aineebriddLmluY2x1ZGVzKFR3aW5rbGUuc3R1Yi5tb2RlKSkge1xuXHRcdFx0Ly8gZmFrZSBhIGNoYW5nZSBldmVudCBvbiB0aGUgc29ydCBkcm9wZG93biwgdG8gaW5pdGlhbGl6ZSB0aGUgdGFnIGxpc3Rcblx0XHRcdGNvbnN0IGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuXHRcdFx0ZXZ0LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRyZXN1bHQuc29ydG9yZGVyLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuc3R1Yi5jaGVja2VkVGFncyA9IFtdO1xuXHRUd2lua2xlLnN0dWIudXBkYXRlU29ydE9yZGVyID0gKGUpID0+IHtcblx0XHRjb25zdCBzb3J0b3JkZXIgPSBlLnRhcmdldC52YWx1ZTtcblx0XHRUd2lua2xlLnN0dWIuY2hlY2tlZFRhZ3MgPSBlLnRhcmdldC5mb3JtLmdldENoZWNrZWQoJ2FydGljbGVUYWdzJyk7XG5cdFx0aWYgKCFUd2lua2xlLnN0dWIuY2hlY2tlZFRhZ3MpIHtcblx0XHRcdFR3aW5rbGUuc3R1Yi5jaGVja2VkVGFncyA9IFtdO1xuXHRcdH1cblx0XHRjb25zdCBjb250YWluZXIgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0dHlwZTogJ2ZyYWdtZW50Jyxcblx0XHR9KTtcblx0XHQvLyBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIGNoZWNrYm94LCB3aXRoIGFwcHJvcHJpYXRlIHN1Ymdyb3VwIGlmIG5lZWRlZFxuXHRcdGNvbnN0IG1ha2VDaGVja2JveCA9ICh0YWcsIGRlc2NyaXB0aW9uKSA9PiB7XG5cdFx0XHRjb25zdCBjaGVja2JveCA9IHtcblx0XHRcdFx0dmFsdWU6IHRhZyxcblx0XHRcdFx0bGFiZWw6IGB7eyR7dGFnfX19OiAke2Rlc2NyaXB0aW9ufWAsXG5cdFx0XHR9O1xuXHRcdFx0aWYgKFR3aW5rbGUuc3R1Yi5jaGVja2VkVGFncy5pbmNsdWRlcyh0YWcpKSB7XG5cdFx0XHRcdGNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNoZWNrYm94O1xuXHRcdH07XG5cdFx0Ly8gYXBwZW5kIGFueSBjdXN0b20gdGFnc1xuXHRcdGlmIChUd2lua2xlLmdldFByZWYoJ2N1c3RvbVN0dWJMaXN0JykubGVuZ3RoKSB7XG5cdFx0XHRjb250YWluZXIuYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieaooeadvycsICfoh6roqILmqKHmnb8nKSxcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgY3VzdG9tY2hlY2tib3hlcyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tU3R1Ykxpc3QnKSkge1xuXHRcdFx0XHRjdXN0b21jaGVja2JveGVzLnB1c2gobWFrZUNoZWNrYm94KGl0ZW0udmFsdWUsIGl0ZW0ubGFiZWwpKTtcblx0XHRcdH1cblx0XHRcdGNvbnRhaW5lci5hcHBlbmQoe1xuXHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRuYW1lOiAnYXJ0aWNsZVRhZ3MnLFxuXHRcdFx0XHRsaXN0OiBjdXN0b21jaGVja2JveGVzLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIGNhdGVnb3JpY2FsIHNvcnQgb3JkZXJcblx0XHRpZiAoc29ydG9yZGVyID09PSAnY2F0Jykge1xuXHRcdFx0Ly8gZnVuY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSB0YWdzIGFuZCBjcmVhdGUgYSBjaGVja2JveCBmb3IgZWFjaCBvbmVcblx0XHRcdGNvbnN0IGRvQ2F0ZWdvcnlDaGVja2JveGVzID0gKHN1YmRpdiwgYXJyYXkpID0+IHtcblx0XHRcdFx0Y29uc3QgY2hlY2tib3hlcyA9IFtdO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHRhZyBvZiBhcnJheSkge1xuXHRcdFx0XHRcdGNvbnN0IGRlc2NyaXB0aW9uID0gVHdpbmtsZS5zdHViLmFydGljbGUudGFnc1t0YWddO1xuXHRcdFx0XHRcdGNoZWNrYm94ZXMucHVzaChtYWtlQ2hlY2tib3godGFnLCBkZXNjcmlwdGlvbikpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN1YmRpdi5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdFx0bmFtZTogJ2FydGljbGVUYWdzJyxcblx0XHRcdFx0XHRsaXN0OiBjaGVja2JveGVzLFxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cdFx0XHRsZXQgaSA9IDA7XG5cdFx0XHQvLyBnbyB0aHJvdWdoIGVhY2ggY2F0ZWdvcnkgYW5kIHN1Yi1jYXRlZ29yeSBhbmQgYXBwZW5kIGxpc3RzIG9mIGNoZWNrYm94ZXNcblx0XHRcdGZvciAoY29uc3QgW3RpdGxlLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhUd2lua2xlLnN0dWIuYXJ0aWNsZS50YWdDYXRlZ29yaWVzKSkge1xuXHRcdFx0XHRjb25zdCB0aXRsZU5hbWUgPSBUd2lua2xlLnN0dWIuYXJ0aWNsZS50YWdDYXRlZ29yaWVzSGVhZGVyW3RpdGxlXTtcblx0XHRcdFx0Y29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0aWQ6IGB0YWdIZWFkZXIke2l9YCxcblx0XHRcdFx0XHRsYWJlbDogdGl0bGVOYW1lLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3Qgc3ViZGl2ID0gY29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0aWQ6IGB0YWdTdWJkaXYke2krK31gLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHtcblx0XHRcdFx0XHRkb0NhdGVnb3J5Q2hlY2tib3hlcyhzdWJkaXYsIGNvbnRlbnQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgW3N1YnRpdGxlLCBzdWJjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhjb250ZW50KSkge1xuXHRcdFx0XHRcdFx0c3ViZGl2LmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogW01vcmViaXRzLmh0bWxOb2RlKCdiJywgc3VidGl0bGUpXSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0ZG9DYXRlZ29yeUNoZWNrYm94ZXMoc3ViZGl2LCBzdWJjb250ZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIGFscGhhYmV0aWNhbCBzb3J0IG9yZGVyXG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGNoZWNrYm94ZXMgPSBbXTtcblx0XHRcdGZvciAoY29uc3QgW3RhZywgZGVzY3JpcHRpb25dIG9mIE9iamVjdC5lbnRyaWVzKFR3aW5rbGUuc3R1Yi5hcnRpY2xlLnRhZ3MpKSB7XG5cdFx0XHRcdGNoZWNrYm94ZXMucHVzaChtYWtlQ2hlY2tib3godGFnLCBkZXNjcmlwdGlvbikpO1xuXHRcdFx0fVxuXHRcdFx0Y29udGFpbmVyLmFwcGVuZCh7XG5cdFx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRcdG5hbWU6ICdhcnRpY2xlVGFncycsXG5cdFx0XHRcdGxpc3Q6IGNoZWNrYm94ZXMsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3QgJHdvcmthcmVhID0gJChlLnRhcmdldC5mb3JtKS5maW5kKCdkaXYjdGFnV29ya0FyZWEnKTtcblx0XHRjb25zdCByZW5kZXJlZCA9IGNvbnRhaW5lci5yZW5kZXIoKTtcblx0XHQkd29ya2FyZWEuZW1wdHkoKS5hcHBlbmQocmVuZGVyZWQpO1xuXHRcdC8vIHN0eWxlIGFkanVzdG1lbnRzXG5cdFx0JHdvcmthcmVhLmZpbmQoJ2g1JykuY3NzKHtcblx0XHRcdCdmb250LXNpemUnOiAnMTEwJScsXG5cdFx0fSk7XG5cdFx0JHdvcmthcmVhLmZpbmQoJ2g1Om5vdCg6Zmlyc3QtY2hpbGQpJykuY3NzKHtcblx0XHRcdCdtYXJnaW4tdG9wJzogJzFlbScsXG5cdFx0fSk7XG5cdFx0JHdvcmthcmVhLmZpbmQoJ2RpdicpLmZpbHRlcignOmhhcyhzcGFuLnF1aWNrZm9ybURlc2NyaXB0aW9uKScpLmNzcyh7XG5cdFx0XHQnbWFyZ2luLXRvcCc6ICcwLjRlbScsXG5cdFx0fSk7XG5cdFx0Ly8gYWRkIGEgbGluayB0byBlYWNoIHRlbXBsYXRlJ3MgZGVzY3JpcHRpb24gcGFnZVxuXHRcdGZvciAoY29uc3QgY2hlY2tib3ggb2YgTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdhcnRpY2xlVGFncycpKSB7XG5cdFx0XHRjb25zdCAkY2hlY2tib3ggPSAkKGNoZWNrYm94KTtcblx0XHRcdGNvbnN0IGxpbmsgPSBNb3JlYml0cy5odG1sTm9kZSgnYScsICc+Jyk7XG5cdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAndGFnLXRlbXBsYXRlLWxpbmsnKTtcblx0XHRcdGxpbmsuc2V0QXR0cmlidXRlKFxuXHRcdFx0XHQnaHJlZicsXG5cdFx0XHRcdG13LnV0aWwuZ2V0VXJsKGBUZW1wbGF0ZToke01vcmViaXRzLnN0cmluZy50b1VwcGVyQ2FzZUZpcnN0Q2hhcihjaGVja2JveC52YWx1ZXMpfWApXG5cdFx0XHQpO1xuXHRcdFx0bGluay5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTtcblx0XHRcdGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuXHRcdFx0JGNoZWNrYm94LnBhcmVudCgpLmFwcGVuZChbJ1xcdTAwQTAnLCBsaW5rXSk7XG5cdFx0fVxuXHR9O1xuXHQvLyBUYWdzIGZvciBBUlRJQ0xFUyBzdGFydCBoZXJlXG5cdFR3aW5rbGUuc3R1Yi5hcnRpY2xlID0ge307XG5cdC8vIEEgbGlzdCBvZiBhbGwgYXJ0aWNsZSB0YWdzLCBpbiBhbHBoYWJldGljYWwgb3JkZXJcblx0Ly8gVG8gZW5zdXJlIHRhZ3MgYXBwZWFyIGluIHRoZSBkZWZhdWx0IFwiY2F0ZWdvcml6ZWRcIiB2aWV3LCBhZGQgdGhlbSB0byB0aGUgdGFnQ2F0ZWdvcmllcyBoYXNoIGJlbG93LlxuXHRUd2lua2xlLnN0dWIuYXJ0aWNsZS50YWdzID0ge1xuXHRcdCdhY3Rvci1zdHViJzogJ+a8lOWRmCcsXG5cdFx0J2FzaWEtc3R1Yic6ICfkuprmtLInLFxuXHRcdCdiaW8tc3R1Yic6ICfkurrniaknLFxuXHRcdCdiaW9sb2d5LXN0dWInOiAn55Sf54mp5a2mJyxcblx0XHQnY2hlbS1zdHViJzogJ+WMluWtpicsXG5cdFx0J2V1cm9wZS1zdHViJzogJ+asp+a0sicsXG5cdFx0J2V4cGFuZCBsaXN0JzogJ+acquWujOaIkOWIl+ihqCcsXG5cdFx0J2Zvb2Qtc3R1Yic6ICfpo5/niaknLFxuXHRcdCdmcmFuY2UtZ2VvLXN0dWInOiAn5rOV5Zu95Zyw55CGJyxcblx0XHQnZ2VvLXN0dWInOiAn5Zyw55CG5L2N572uJyxcblx0XHQnaGlzdC1zdHViJzogJ+WOhuWPsuaIluWOhuWPsuWtpicsXG5cdFx0J0pQLXN0dWInOiAn5pel5pysJyxcblx0XHQnbGl0LXN0dWInOiAn5paH5a2mJyxcblx0XHQnbWF0aC1zdHViJzogJ+aVsOWtpicsXG5cdFx0J21lZC1zdHViJzogJ+WMu+WtpicsXG5cdFx0J21pbC1zdHViJzogJ+WGm+S6iycsXG5cdFx0J21vdmllLXN0dWInOiAn55S15b2xJyxcblx0XHQnbXVzaWMtc3R1Yic6ICfpn7PkuZAnLFxuXHRcdCdwaHlzaWNzLXN0dWInOiAn54mp55CG5a2mJyxcblx0XHQncG9saXRpYy1zdHViJzogJ+aUv+ayuycsXG5cdFx0J3JlbGlnaW9uLXN0dWInOiAn5a6X5pWZJyxcblx0XHQnc2NpZW5jZS1zdHViJzogJ+enkeWtpicsXG5cdFx0J3Nwb3J0LXN0dWInOiAn5L2T6IKyJyxcblx0XHRzdHViOiAn6YCa55So5bCP5L2c5ZOBJyxcblx0XHQnc3dpdHplcmxhbmQtc3R1Yic6ICfnkZ7lo6snLFxuXHRcdCd0ZWNoLXN0dWInOiAn56eR5oqAJyxcblx0XHQndHJhbnNwLXN0dWInOiAn5Lqk6YCaJyxcblx0XHQnVFYtc3R1Yic6ICfnlLXop4YnLFxuXHRcdCdVSy1zdHViJzogJ+iLseWbvScsXG5cdFx0J1VTLWJpby1zdHViJzogJ+e+juWbveS6uueJqScsXG5cdFx0J1VTLWdlby1zdHViJzogJ+e+juWbveWcsOeQhicsXG5cdFx0J1VTLXN0dWInOiAn576O5Zu9Jyxcblx0XHQnd2VhdGhlci1zdHViJzogJ+WkqeawlOWSjOeJueWIq+eahOWkqeawlOS6i+S7ticsXG5cdH07XG5cdC8vIEEgbGlzdCBvZiB0YWdzIGluIG9yZGVyIG9mIGNhdGVnb3J5XG5cdC8vIFRhZ3Mgc2hvdWxkIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlciB3aXRoaW4gdGhlIGNhdGVnb3JpZXNcblx0Ly8gQWRkIG5ldyBjYXRlZ29yaWVzIHdpdGggZGlzY3JldGlvbiAtIHRoZSBsaXN0IGlzIGxvbmcgZW5vdWdoIGFzIGlzIVxuXHRUd2lua2xlLnN0dWIuYXJ0aWNsZS50YWdDYXRlZ29yaWVzSGVhZGVyID0ge1xuXHRcdGdlbmVyYWw6ICfpgJrnlKjmqKHmnb8nLFxuXHRcdGdlbzogJ+WbveWutuWSjOWcsOeQhicsXG5cdFx0b3RoZXJzOiAn5p2C6aG5Jyxcblx0XHRiaW86ICfkurrniaknLFxuXHRcdHNjaWVuY2U6ICfnp5HlraYnLFxuXHRcdHNwb3J0OiAn5L2T6IKyJyxcblx0XHR0ZWNoOiAn5oqA5pyvJyxcblx0XHRhcnQ6ICfoibrmnK8nLFxuXHR9O1xuXHRUd2lua2xlLnN0dWIuYXJ0aWNsZS50YWdDYXRlZ29yaWVzID0ge1xuXHRcdGdlbmVyYWw6IFsnc3R1YicsICdleHBhbmQgbGlzdCddLFxuXHRcdGdlbzogW1xuXHRcdFx0J2FzaWEtc3R1YicsXG5cdFx0XHQnZXVyb3BlLXN0dWInLFxuXHRcdFx0J2ZyYW5jZS1nZW8tc3R1YicsXG5cdFx0XHQnZ2VvLXN0dWInLFxuXHRcdFx0J0pQLXN0dWInLFxuXHRcdFx0J3N3aXR6ZXJsYW5kLXN0dWInLFxuXHRcdFx0J1VLLXN0dWInLFxuXHRcdFx0J1VTLWJpby1zdHViJyxcblx0XHRcdCdVUy1nZW8tc3R1YicsXG5cdFx0XHQnVVMtc3R1YicsXG5cdFx0XSxcblx0XHRvdGhlcnM6IFsnZm9vZC1zdHViJywgJ2hpc3Qtc3R1YicsICdtaWwtc3R1YicsICdwb2xpdGljLXN0dWInLCAncmVsaWdpb24tc3R1YicsICd0cmFuc3Atc3R1YiddLFxuXHRcdGJpbzogWydhY3Rvci1zdHViJywgJ2Jpby1zdHViJywgJ1VTLWJpby1zdHViJ10sXG5cdFx0c2NpZW5jZTogWydiaW9sb2d5LXN0dWInLCAnY2hlbS1zdHViJywgJ21hdGgtc3R1YicsICdtZWQtc3R1YicsICdwaHlzaWNzLXN0dWInLCAnc2NpZW5jZS1zdHViJywgJ3dlYXRoZXItc3R1YiddLFxuXHRcdHNwb3J0OiBbJ3Nwb3J0LXN0dWInXSxcblx0XHR0ZWNoOiBbJ3RlY2gtc3R1YiddLFxuXHRcdGFydDogWydhY3Rvci1zdHViJywgJ2xpdC1zdHViJywgJ21vdmllLXN0dWInLCAnbXVzaWMtc3R1YicsICdUVi1zdHViJ10sXG5cdH07XG5cdC8vIFRhZ3MgZm9yIFJFRElSRUNUUyBzdGFydCBoZXJlXG5cdFR3aW5rbGUuc3R1Yi5jYWxsYmFja3MgPSB7XG5cdFx0bWFpbjogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRsZXQgdGFnUmU7XG5cdFx0XHRsZXQgc3VtbWFyeVRleHQgPSAn5Yqg5YWlJztcblx0XHRcdGxldCB0YWdzID0gW107XG5cdFx0XHRjb25zdCBncm91cGFibGVUYWdzID0gW107XG5cdFx0XHRsZXQgaTtcblx0XHRcdC8vIFJlbW92ZSB0YWdzIHRoYXQgYmVjb21lIHN1cGVyZmx1b3VzIHdpdGggdGhpcyBhY3Rpb25cblx0XHRcdGxldCBwYWdlVGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdC8vIENoZWNrIGZvciBwcmVleGlzdGluZyB0YWdzIGFuZCBzZXBhcmF0ZSB0YWdzIGludG8gZ3JvdXBhYmxlIGFuZCBub24tZ3JvdXBhYmxlIGFycmF5c1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHBhcmFtcy50YWdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHRhZ1JlID0gbmV3IFJlZ0V4cChgKFxcXFx7XFxcXHske3BhcmFtcy50YWdzW2ldfShcXFxcfHxcXFxcfVxcXFx9KSlgLCAnaW0nKTtcblx0XHRcdFx0aWYgKHRhZ1JlLmV4ZWMocGFnZVRleHQpKSB7XG5cdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0YOWcqOmhtemdouS4iuaJvuWIsHt7JHtwYXJhbXMudGFnc1tpXX19feKApuKApui3s+i/h2AsXG5cdFx0XHRcdFx0XHRcdGDlnKjpoIHpnaLkuIrmib7liLB7eyR7cGFyYW1zLnRhZ3NbaV19fX3igKbigKbot7PpgY5gXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YWdzID0gWy4uLnRhZ3MsIC4uLihBcnJheS5pc0FycmF5KHBhcmFtcy50YWdzW2ldKSA/IHBhcmFtcy50YWdzW2ldIDogW3BhcmFtcy50YWdzW2ldXSldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YWdzID0gWy4uLnRhZ3MsIC4uLmdyb3VwYWJsZVRhZ3NdO1xuXHRcdFx0dGFncy5zb3J0KCk7XG5cdFx0XHRjb25zdCB0b3RhbFRhZ3MgPSB0YWdzLmxlbmd0aDtcblx0XHRcdGNvbnN0IGFkZFRhZyA9ICh0YWdOYW1lLCB0YWdJbmRleCkgPT4ge1xuXHRcdFx0XHRwYWdlVGV4dCArPSBgXFxue3ske3RhZ05hbWV9fX1gO1xuXHRcdFx0XHRpZiAodGFnSW5kZXggPiAwKSB7XG5cdFx0XHRcdFx0aWYgKHRhZ0luZGV4ID09PSB0b3RhbFRhZ3MgLSAxKSB7XG5cdFx0XHRcdFx0XHRzdW1tYXJ5VGV4dCArPSAn5ZKMJztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRhZ0luZGV4IDwgdG90YWxUYWdzIC0gMSkge1xuXHRcdFx0XHRcdFx0c3VtbWFyeVRleHQgKz0gJ+OAgSc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN1bW1hcnlUZXh0ICs9ICd7e1tbJztcblx0XHRcdFx0c3VtbWFyeVRleHQgKz0gdGFnTmFtZS5pbmNsdWRlcygnOicpID8gdGFnTmFtZSA6IGBUZW1wbGF0ZToke3RhZ05hbWV9fCR7dGFnTmFtZX1gO1xuXHRcdFx0XHRzdW1tYXJ5VGV4dCArPSAnXV19fSc7XG5cdFx0XHR9O1xuXHRcdFx0Zm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuXHRcdFx0XHRhZGRUYWcodGFnKTtcblx0XHRcdH1cblx0XHRcdHN1bW1hcnlUZXh0ICs9IHdpbmRvdy53Z1VMUygn5qCH6K6w5YiwJywgJ+aomeiomOWIsCcpICsgVHdpbmtsZS5zdHViLm1vZGU7XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHBhZ2VUZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoc3VtbWFyeVRleHQpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFdhdGNobGlzdChUd2lua2xlLmdldFByZWYoJ3dhdGNoU3R1YmJlZFBhZ2VzJykpO1xuXHRcdFx0cGFnZW9iai5zZXRNaW5vckVkaXQoVHdpbmtsZS5nZXRQcmVmKCdtYXJrU3R1YmJlZFBhZ2VzQXNNaW5vcicpKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdub2NyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5zYXZlKCk7XG5cdFx0XHRpZiAocGFyYW1zLnBhdHJvbCkge1xuXHRcdFx0XHRwYWdlb2JqLnBhdHJvbCgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuc3R1Yi5jYWxsYmFjay5ldmFsdWF0ZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuXHRcdGNvbnN0IHBhcmFtcyA9IHt9O1xuXHRcdGlmIChmb3JtLnBhdHJvbFBhZ2UpIHtcblx0XHRcdHBhcmFtcy5wYXRyb2wgPSBmb3JtLnBhdHJvbFBhZ2UuY2hlY2tlZDtcblx0XHR9XG5cdFx0c3dpdGNoIChUd2lua2xlLnN0dWIubW9kZSkge1xuXHRcdFx0Y2FzZSAn5qKd55uuJzpcblx0XHRcdGNhc2UgJ+adoeebric6XG5cdFx0XHRcdHBhcmFtcy50YWdzID0gZm9ybS5nZXRDaGVja2VkKCdhcnRpY2xlVGFncycpO1xuXHRcdFx0XHRwYXJhbXMuZ3JvdXAgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtdy5ub3RpZnkoYFR3aW5rbGUuc3R1Yu+8muacquefpeaooeW8jyAke1R3aW5rbGUuc3R1Yi5tb2RlfWAsIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZXN0dWInLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmICghcGFyYW1zLnRhZ3MubGVuZ3RoKSB7XG5cdFx0XHRtdy5ub3RpZnkoJ+W/hemhu+mAieaLqeiHs+WwkeS4gOS4quagh+iusO+8gScsIHtcblx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHR0YWc6ICd0d2lua2xlc3R1YicsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoXG5cdFx0XHQn5qCH6K6w5a6M5oiQ77yM5bCG5Zyo5Yeg56eS5YaF5Yi35paw6aG16Z2iJyxcblx0XHRcdCfmqJnoqJjlrozmiJDvvIzlsIflnKjlub7np5Llhafph43mlrDmlbTnkIbpoIHpnaInXG5cdFx0KTtcblx0XHRpZiAoVHdpbmtsZS5zdHViLm1vZGUgPT09ICfph43lrprlkJEnKSB7XG5cdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5mb2xsb3dSZWRpcmVjdCA9IGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjmoIforrAnLCAn5q2j5Zyo5qiZ6KiYJykgKyBUd2lua2xlLnN0dWIubW9kZVxuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdHN3aXRjaCAoVHdpbmtsZS5zdHViLm1vZGUpIHtcblx0XHRcdGNhc2UgJ+aineebric6XG5cdFx0XHRjYXNlICfmnaHnm64nOlxuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAn6YeN5a6a5ZCRJzpcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS5zdHViLmNhbGxiYWNrcy5tYWluKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0Y2FzZSAn5paH5Lu2Jzpcblx0XHRcdGNhc2UgJ+aqlOahiCc6XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5sb2FkKFR3aW5rbGUuc3R1Yi5jYWxsYmFja3MuZmlsZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0bXcubm90aWZ5KGBUd2lua2xlLnN0dWLvvJrmnKrnn6XmqKHlvI8gJHtUd2lua2xlLnN0dWIubW9kZX1gLCB7XG5cdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVzdHViJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5zdHViLCAnc3R1YicpO1xufSkoalF1ZXJ5KTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlZGlmZi5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVkaWZmKCQpIHtcblx0LyoqXG5cdCAqIHR3aW5rbGVkaWZmLmpzOiBEaWZmIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiBvbiBub24tZGlmZiBwYWdlcyAoXCJMYXN0XCIpO1xuXHQgKiB0YWJzIG9uIGRpZmYgcGFnZXMgKFwiU2luY2VcIiwgXCJTaW5jZSBtaW5lXCIsIFwiQ3VycmVudFwiKVxuXHQgKiBBY3RpdmUgb246IEV4aXN0aW5nIG5vbi1zcGVjaWFsIHBhZ2VzXG5cdCAqL1xuXHRUd2lua2xlLmRpZmYgPSAoKSA9PiB7XG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPCAwIHx8ICFtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRtdy51dGlsLmdldFVybChtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksIHtcblx0XHRcdFx0ZGlmZjogJ2N1cicsXG5cdFx0XHRcdG9sZGlkOiAncHJldicsXG5cdFx0XHR9KSxcblx0XHRcdHdpbmRvdy53Z1VMUygn5pyA5ZCOJywgJ+acgOW+jCcpLFxuXHRcdFx0J3R3LWxhc3RkaWZmJyxcblx0XHRcdHdpbmRvdy53Z1VMUygn5pi+56S65pyA5ZCO5L+u5pS5JywgJ+mhr+ekuuacgOW+jOS/ruaUuScpXG5cdFx0KTtcblx0XHQvLyBTaG93IGFkZGl0aW9uYWwgdGFicyBvbmx5IG9uIGRpZmYgcGFnZXNcblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dEaWZmTmV3SWQnKSkge1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFR3aW5rbGUuZGlmZi5ldmFsdWF0ZShmYWxzZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCfoh6rkuIonLFxuXHRcdFx0XHQndHctc2luY2UnLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aYvuekuuS4juS4iuS4gOS/ruiuoueJiOacrOmXtOeahOW3ruW8gicsICfpoa/npLroiIfkuIrkuIDkv67oqILniYjmnKzplpPnmoTlt67nlbAnKVxuXHRcdFx0KTtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRUd2lua2xlLmRpZmYuZXZhbHVhdGUodHJ1ZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCfoh6rmiJEnLFxuXHRcdFx0XHQndHctc2luY2VtaW5lJyxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmmL7npLrkuI7miJHlgZrlh7rnmoTkv67orqLniYjmnKznmoTlt67lvIInLCAn6aGv56S66IiH5oiR5YGa5Ye655qE5L+u6KiC54mI5pys55qE5beu55WwJylcblx0XHRcdCk7XG5cdFx0XHRUd2lua2xlLmFkZFBvcnRsZXRMaW5rKFxuXHRcdFx0XHRtdy51dGlsLmdldFVybChtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksIHtcblx0XHRcdFx0XHRkaWZmOiAnY3VyJyxcblx0XHRcdFx0XHRvbGRpZDogbXcuY29uZmlnLmdldCgnd2dEaWZmTmV3SWQnKSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5b2T5YmNJywgJ+ebruWJjScpLFxuXHRcdFx0XHQndHctY3VyZGlmZicsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5pi+56S65LiO5b2T5YmN54mI5pys6Ze055qE5beu5byCJywgJ+mhr+ekuuiIh+ebruWJjeeJiOacrOmWk+eahOW3rueVsCcpXG5cdFx0XHQpO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5kaWZmLmV2YWx1YXRlID0gKG1lKSA9PiB7XG5cdFx0bGV0IHVzZXI7XG5cdFx0aWYgKG1lKSB7XG5cdFx0XHR1c2VyID0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWRpZmYtbnRpdGxlMicpO1xuXHRcdFx0aWYgKCFub2RlKSB7XG5cdFx0XHRcdC8vIG5vdGhpbmcgdG8gZG8/XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHVzZXIgPSAkKG5vZGUpLmZpbmQoJ2EnKS5maXJzdCgpLnRleHQoKTtcblx0XHR9XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRwcm9wOiAncmV2aXNpb25zJyxcblx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdHRpdGxlczogbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLFxuXHRcdFx0cnZsaW1pdDogMSxcblx0XHRcdHJ2cHJvcDogWydpZHMnLCAndXNlciddLFxuXHRcdFx0cnZzdGFydGlkOiBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSAtIDEsXG5cdFx0XHRydnVzZXI6IHVzZXIsXG5cdFx0fTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctY29udGVudC10ZXh0JykpO1xuXHRcdGNvbnN0IHlzYXJjaGl2ZXNfYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0d2luZG93LndnVUxTKCfmipPlj5bmnIDliJ3otKHnjK7ogIXkv6Hmga8nLCAn5oqT5Y+W5pyA5Yid6LKi54276ICF6LOH6KiKJyksXG5cdFx0XHRxdWVyeSxcblx0XHRcdFR3aW5rbGUuZGlmZi5jYWxsYmFja3MubWFpblxuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zID0ge1xuXHRcdFx0dXNlcixcblx0XHR9O1xuXHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0fTtcblx0VHdpbmtsZS5kaWZmLmNhbGxiYWNrcyA9IHtcblx0XHRtYWluOiAoc2VsZikgPT4ge1xuXHRcdFx0Y29uc3QgeG1sRG9jID0gc2VsZi5yZXNwb25zZVhNTDtcblx0XHRcdGNvbnN0IHJldmlkID0gJCh4bWxEb2MpLmZpbmQoJ3JldicpLmF0dHIoJ3JldmlkJyk7XG5cdFx0XHRpZiAoIXJldmlkKSB7XG5cdFx0XHRcdHNlbGYuc3RhdGVsZW0uZXJyb3IoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmnKrmib7liLDlkIjpgILnmoTml6nmnJ/niYjmnKzvvIzmiJYgJywgJ+acquaJvuWIsOWQiOmBqeeahOaXqeacn+eJiOacrO+8jOaIliAnKSArXG5cdFx0XHRcdFx0XHRzZWxmLnBhcmFtcy51c2VyICtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOaYr+WUr+S4gOi0oeeMruiAheOAguWPlua2iOOAgicsICcg5piv5ZSv5LiA6LKi54276ICF44CC5Y+W5raI44CCJylcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bG9jYXRpb24gPSBtdy51dGlsLmdldFVybChtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksIHtcblx0XHRcdFx0ZGlmZjogbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyksXG5cdFx0XHRcdG9sZGlkOiByZXZpZCxcblx0XHRcdH0pO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuZGlmZiwgJ2RpZmYnKTtcbn0pKGpRdWVyeSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZXVubGluay5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGV1bmxpbmsoJCkge1xuXHQvKipcblx0ICogdHdpbmtsZXVubGluay5qczogVW5saW5rIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJVbmxpbmtcIilcblx0ICogQWN0aXZlIG9uOiBOb24tc3BlY2lhbCBwYWdlcywgZXhjZXB0IExJQjrmspnnm5Jcblx0ICovXG5cdFR3aW5rbGUudW5saW5rID0gKCkgPT4ge1xuXHRcdGlmIChcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPCAwIHx8XG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgPT09IFR3aW5rbGUuZ2V0UHJlZignc2FuZGJveFBhZ2UnKSB8fFxuXHRcdFx0IU1vcmViaXRzLnVzZXJJc1N5c29wXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRUd2lua2xlLnVubGluay5jYWxsYmFjayxcblx0XHRcdHdpbmRvdy53Z1VMUygn5raI6ZO+JywgJ+a2iOmAoycpLFxuXHRcdFx0J3R3LXVubGluaycsXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WPlua2iOWIsOacrOmhteeahOmTvuaOpScsICflj5bmtojliLDmnKzpoIHnmoTpgKPntZAnKVxuXHRcdCk7XG5cdH07XG5cdC8vIHRoZSBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIGludm9raW5nIHVubGluayBmcm9tIGFkbWluIHNwZWVkeVxuXHRUd2lua2xlLnVubGluay5jYWxsYmFjayA9IChwcmVzZXRSZWFzb24pID0+IHtcblx0XHRjb25zdCBmaWxlU3BhY2UgPSBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSA2O1xuXHRcdGNvbnN0IFdpbmRvdyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNjAwLCA0NDApO1xuXHRcdFdpbmRvdy5zZXRUaXRsZShcblx0XHRcdHdpbmRvdy53Z1VMUygn5Y+W5raI6ZO+5YWlJywgJ+WPlua2iOmAo+WFpScpICtcblx0XHRcdFx0KGZpbGVTcGFjZSA/IHdpbmRvdy53Z1VMUygn5ZKM5qih5p2/44CB5paH5Lu25L2/55SoJywgJ+WSjOaooeadv+OAgeaqlOahiOS9v+eUqCcpIDogJycpXG5cdFx0KTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn6ZO+5YWl6K6+572uJywgJ+mAo+WFpeioreWumicpLCAnSDpUVy9QUkVGI3VubGluaycpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygnVHdpbmtsZeW4ruWKqScsICdUd2lua2xl6Kqq5piOJyksICdIOlRXL0RPQyN1bmxpbmsnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLnVubGluay5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Ly8gcHJlcGVuZCBzb21lIGRvY3VtZW50YXRpb246IGZpbGVzIGFyZSBjb21tZW50ZWQgb3V0LCB3aGlsZSBhbnlcblx0XHQvLyBkaXNwbGF5IHRleHQgaXMgcHJlc2VydmVkIGZvciBsaW5rcyAob3RoZXJ3aXNlIHRoZSBsaW5rIGl0c2VsZiBpcyB1c2VkKVxuXHRcdGNvbnN0IGxpbmtUZXh0QmVmb3JlID0gTW9yZWJpdHMuaHRtbE5vZGUoXG5cdFx0XHQnY29kZScsXG5cdFx0XHRgW1ske2ZpbGVTcGFjZSA/ICc6JyA6ICcnfSR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfSR7d2luZG93LndnVUxTKCd86ZO+5o6l5paH5a2XXV0nLCAnfOmAo+e1kOaWh+Wtl11dJyl9YFxuXHRcdCk7XG5cdFx0Y29uc3QgbGlua1RleHRBZnRlciA9IE1vcmViaXRzLmh0bWxOb2RlKCdjb2RlJywgd2luZG93LndnVUxTKCfpk77mjqXmloflrZcnLCAn6YCj57WQ5paH5a2XJykpO1xuXHRcdGNvbnN0IGxpbmtQbGFpbkJlZm9yZSA9IE1vcmViaXRzLmh0bWxOb2RlKCdjb2RlJywgYFtbJHtNb3JlYml0cy5wYWdlTmFtZU5vcm19XV1gKTtcblx0XHRjb25zdCBsaW5rVGVtcGxhdGVCZWZvcmUgPSBNb3JlYml0cy5odG1sTm9kZSgnY29kZScsIGB7eyR7bXcuY29uZmlnLmdldCgnd2dUaXRsZScpfX19YCk7XG5cdFx0bGV0IGxpbmtQbGFpbkFmdGVyO1xuXHRcdGlmIChmaWxlU3BhY2UpIHtcblx0XHRcdGxpbmtQbGFpbkFmdGVyID0gTW9yZWJpdHMuaHRtbE5vZGUoJ2NvZGUnLCBgPCEtLSBbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1dIC0tPmApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsaW5rUGxhaW5BZnRlciA9IE1vcmViaXRzLmh0bWxOb2RlKCdjb2RlJywgTW9yZWJpdHMucGFnZU5hbWVOb3JtKTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBub2RlIG9mIFtsaW5rVGV4dEJlZm9yZSwgbGlua1RleHRBZnRlciwgbGlua1BsYWluQmVmb3JlLCBsaW5rUGxhaW5BZnRlciwgbGlua1RlbXBsYXRlQmVmb3JlXSkge1xuXHRcdFx0bm9kZS5zdHlsZS5mb250RmFtaWx5ID0gJ21vbm9zcGFjZSc7XG5cdFx0XHRub2RlLnN0eWxlLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuXHRcdH1cblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdHN0eWxlOiAnbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQtc3R5bGU6IG5vcm1hbCcsXG5cdFx0XHRsYWJlbDogW1xuXHRcdFx0XHRgJHtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6L+Z5Liq5bel5YW35Y+v5Lul5Y+W5raI5omA5pyJ5oyH5ZCR6K+l6aG155qE6ZO+5o6l77yI4oCc6ZO+5YWl4oCd77yJJyxcblx0XHRcdFx0XHRcdCfpgJnlgIvlt6Xlhbflj6/ku6Xlj5bmtojmiYDmnInmjIflkJHoqbLpoIHnmoTpgKPntZDvvIjjgIzpgKPlhaXjgI3vvIknXG5cdFx0XHRcdFx0KSArXG5cdFx0XHRcdFx0KGZpbGVTcGFjZVxuXHRcdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J++8jOaIlumAmui/h+WKoOWFpTwhLS0gLS0+5rOo6YeK5qCH6K6w6ZqQ6JeP5omA5pyJ5a+55q2k5paH5Lu255qE5L2/55SoJyxcblx0XHRcdFx0XHRcdFx0XHQn77yM5oiW6YCP6YGO5Yqg5YWlPCEtLSAtLT7ms6jph4vmqJnoqJjpmrHol4/miYDmnInlsI3mraTmqpTmoYjnmoTkvb/nlKgnXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdDogJycpXG5cdFx0XHRcdH3jgILkvovlpoLvvJpgLFxuXHRcdFx0XHRsaW5rVGV4dEJlZm9yZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCflsIbkvJrlj5jmiJAnLCAn5bCH5pyD6K6K5oiQJyksXG5cdFx0XHRcdGxpbmtUZXh0QWZ0ZXIsXG5cdFx0XHRcdCfvvIwnLFxuXHRcdFx0XHRsaW5rUGxhaW5CZWZvcmUsXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCG5Lya5Y+Y5oiQJywgJ+Wwh+acg+iuiuaIkCcpLFxuXHRcdFx0XHRsaW5rUGxhaW5BZnRlcixcblx0XHRcdFx0J++8jCcsXG5cdFx0XHRcdGxpbmtUZW1wbGF0ZUJlZm9yZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCflsIbkvJrooqvnp7vpmaQnLCAn5bCH5pyD6KKr56e76ZmkJyksXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn44CC6K+35bCP5b+D5L2/55So44CCJywgJ+OAguiri+Wwj+W/g+S9v+eUqOOAgicpLFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHRsYWJlbDogJ+eQhueUse+8micsXG5cdFx0XHR2YWx1ZTogcHJlc2V0UmVhc29uIHx8ICcnLFxuXHRcdFx0c2l6ZTogNjAsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRsaXN0OiAnYmFja2xpbmtzJyxcblx0XHRcdGJsdGl0bGU6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdGJsbGltaXQ6ICdtYXgnLFxuXHRcdFx0Ly8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdGJsbmFtZXNwYWNlOiBUd2lua2xlLmdldFByZWYoJ3VubGlua05hbWVzcGFjZXMnKSxcblx0XHRcdHJhd2NvbnRpbnVlOiB0cnVlLFxuXHRcdFx0Zm9ybWF0OiAnanNvbicsXG5cdFx0fTtcblx0XHRpZiAoZmlsZVNwYWNlKSB7XG5cdFx0XHRxdWVyeS5saXN0ICs9ICd8aW1hZ2V1c2FnZSc7XG5cdFx0XHRxdWVyeS5pdXRpdGxlID0gcXVlcnkuYmx0aXRsZTtcblx0XHRcdHF1ZXJ5Lml1bGltaXQgPSBxdWVyeS5ibGxpbWl0O1xuXHRcdFx0cXVlcnkuaXVuYW1lc3BhY2UgPSBxdWVyeS5ibG5hbWVzcGFjZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cXVlcnkuYmxmaWx0ZXJyZWRpciA9ICdub25yZWRpcmVjdHMnO1xuXHRcdH1cblx0XHRjb25zdCB5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdHdpbmRvdy53Z1VMUygn5oqT5Y+W6ZO+5YWlJywgJ+aKk+WPlumAo+WFpScpLFxuXHRcdFx0cXVlcnksXG5cdFx0XHRUd2lua2xlLnVubGluay5jYWxsYmFja3MuZGlzcGxheS5iYWNrbGlua3Ncblx0XHQpO1xuXHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcyA9IHtcblx0XHRcdGZvcm0sXG5cdFx0XHRXaW5kb3csXG5cdFx0XHRpbWFnZTogZmlsZVNwYWNlLFxuXHRcdH07XG5cdFx0eXNhcmNoaXZlc19hcGkucG9zdCgpO1xuXHRcdGNvbnN0IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRyb290LnN0eWxlLnBhZGRpbmcgPSAnMTVweCc7IC8vIGp1c3Qgc28gaXQgZG9lc24ndCBsb29rIGJyb2tlblxuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KHJvb3QpO1xuXHRcdHlzYXJjaGl2ZXNfYXBpLnN0YXRlbGVtLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+WKoOi9veS4reKApuKApicsICfovInlhaXkuK3igKbigKYnKSk7XG5cdFx0V2luZG93LnNldENvbnRlbnQocm9vdCk7XG5cdFx0V2luZG93LmRpc3BsYXkoKTtcblx0fTtcblx0VHdpbmtsZS51bmxpbmsuY2FsbGJhY2suZXZhbHVhdGUgPSAoZXZlbnQpID0+IHtcblx0XHRjb25zdCBmb3JtID0gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnN0IGlucHV0ID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldElucHV0RGF0YShmb3JtKTtcblx0XHRpZiAoIWlucHV0LnJlYXNvbikge1xuXHRcdFx0bXcubm90aWZ5KHdpbmRvdy53Z1VMUygn5oKo5b+F6aG75oyH5a6a5Y+W5raI6ZO+5YWl55qE55CG55Sx44CCJywgJ+aCqOW/hemgiOaMh+WumuWPlua2iOmAo+WFpeeahOeQhueUseOAgicpLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZXVubGluaycsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5wdXQuYmFja2xpbmtzIHx8PSBbXTtcblx0XHRpbnB1dC5pbWFnZXVzYWdlIHx8PSBbXTtcblx0XHRjb25zdCBwYWdlcyA9IE1vcmViaXRzLmFycmF5LnVuaXEoWy4uLmlucHV0LmJhY2tsaW5rcywgLi4uaW5wdXQuaW1hZ2V1c2FnZV0pO1xuXHRcdGlmICghcGFnZXMubGVuZ3RoKSB7XG5cdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfmgqjlv4Xpobvoh7PlsJHpgInmi6nkuIDkuKropoHlj5bmtojpk77lhaXnmoTpobXpnaLjgIInLCAn5oKo5b+F6aCI6Iez5bCR6YG45pOH5LiA5YCL6KaB5Y+W5raI6YCj5YWl55qE6aCB6Z2i44CCJyksIHtcblx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHR0YWc6ICd0d2lua2xldW5saW5rJyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGZvcm0pO1xuXHRcdGNvbnN0IHVubGlua2VyID0gbmV3IE1vcmViaXRzLmJhdGNoT3BlcmF0aW9uKFxuXHRcdFx0YOWPlua2iCR7XG5cdFx0XHRcdGlucHV0LmJhY2tsaW5rcy5sZW5ndGhcblx0XHRcdFx0XHQ/IHdpbmRvdy53Z1VMUygn6ZO+5YWlJywgJ+mAo+WFpScpICtcblx0XHRcdFx0XHRcdChpbnB1dC5pbWFnZXVzYWdlLmxlbmd0aCA/IHdpbmRvdy53Z1VMUygn5LiO5paH5Lu25L2/55SoJywgJ+iIh+aqlOahiOS9v+eUqCcpIDogJycpXG5cdFx0XHRcdFx0OiB3aW5kb3cud2dVTFMoJ+aWh+S7tuS9v+eUqCcsICfmqpTmoYjkvb/nlKgnKVxuXHRcdFx0fWBcblx0XHQpO1xuXHRcdHVubGlua2VyLnNldE9wdGlvbigncHJlc2VydmVJbmRpdmlkdWFsU3RhdHVzTGluZXMnLCB0cnVlKTtcblx0XHR1bmxpbmtlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0cmVhc29uOiBpbnB1dC5yZWFzb24sXG5cdFx0XHR1bmxpbmtlcixcblx0XHR9O1xuXHRcdHVubGlua2VyLnJ1bigocGFnZU5hbWUpID0+IHtcblx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdHBhZ2VOYW1lLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WcqOmhtemdouKAnCcsICflnKjpoIHpnaLjgIwnKSArIHBhZ2VOYW1lICsgd2luZG93LndnVUxTKCfigJ3kuK3lj5bmtojpk77lhaUnLCAn44CN5Lit5Y+W5raI6YCj5YWlJylcblx0XHRcdCk7XG5cdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Qm90RWRpdCh0cnVlKTsgLy8gdW5saW5rIGNvbnNpZGVyZWQgYSBmbG9vZHkgb3BlcmF0aW9uXG5cdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHtcblx0XHRcdFx0ZG9CYWNrbGlua3M6IGlucHV0LmJhY2tsaW5rcy5pbmNsdWRlcyhwYWdlTmFtZSksXG5cdFx0XHRcdGRvSW1hZ2V1c2FnZTogaW5wdXQuaW1hZ2V1c2FnZS5pbmNsdWRlcyhwYWdlTmFtZSksXG5cdFx0XHRcdC4uLnBhcmFtcyxcblx0XHRcdH0pO1xuXHRcdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS51bmxpbmsuY2FsbGJhY2tzLnVubGlua0JhY2tsaW5rcyk7XG5cdFx0fSk7XG5cdH07XG5cdFR3aW5rbGUudW5saW5rLmNhbGxiYWNrcyA9IHtcblx0XHRkaXNwbGF5OiB7XG5cdFx0XHRiYWNrbGlua3M6IChhcGlvYmopID0+IHtcblx0XHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhcGlvYmouZ2V0UmVzcG9uc2UoKTtcblx0XHRcdFx0bGV0IGhhdmVjb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdGxldCBsaXN0O1xuXHRcdFx0XHRsZXQgbmFtZXNwYWNlcztcblx0XHRcdFx0bGV0IGk7XG5cdFx0XHRcdGlmIChhcGlvYmoucGFyYW1zLmltYWdlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2V1c2FnZSA9IHJlc3BvbnNlLnF1ZXJ5LmltYWdldXNhZ2Uuc29ydChUd2lua2xlLnNvcnRCeU5hbWVzcGFjZSk7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBpbWFnZXVzYWdlLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdFx0XHQvLyBMYWJlbCBtYWRlIGJ5IFR3aW5rbGUuZ2VuZXJhdGVCYXRjaFBhZ2VMaW5rc1xuXHRcdFx0XHRcdFx0bGlzdC5wdXNoKHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6ICcnLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogaW1hZ2V1c2FnZVtpXS50aXRsZSxcblx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobGlzdC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5paH5Lu25L2/55SoJywgJ+aqlOahiOS9v+eUqCcpLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRuYW1lc3BhY2VzID0gW107XG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IHYgb2YgVHdpbmtsZS5nZXRQcmVmKCd1bmxpbmtOYW1lc3BhY2VzJykpIHtcblx0XHRcdFx0XHRcdFx0bmFtZXNwYWNlcy5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdHYgPT09ICcwJ1xuXHRcdFx0XHRcdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoJ++8iOadoeebru+8iScsICfvvIjmop3nm67vvIknKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiBtdy5jb25maWcuZ2V0KCd3Z0Zvcm1hdHRlZE5hbWVzcGFjZXMnKVt2XVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflt7LpgInmi6nnmoTlkb3lkI3nqbrpl7TvvJonLCAn5bey6YG45pOH55qE5ZG95ZCN56m66ZaT77yaJykgKyBuYW1lc3BhY2VzLmpvaW4oJ+OAgScpLFxuXHRcdFx0XHRcdFx0XHR0b29sdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0J+aCqOWPr+WcqFR3aW5rbGXlj4LmlbDorr7nva7kuK3mm7TmlLnnm7jlhbPpgInpobnvvIzor7flj4Lop4FbW0g6VFcvUFJFRl1dJyxcblx0XHRcdFx0XHRcdFx0XHQn5oKo5Y+v5ZyoVHdpbmtsZeWBj+WlveioreWumuS4reabtOaUueebuOmXnOmBuOmghe+8jOiri+WPg+imi1tbSDpUVy9QUkVGXV0nXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGlmIChyZXNwb25zZVsncXVlcnktY29udGludWUnXSAmJiByZXNwb25zZVsncXVlcnktY29udGludWUnXS5pbWFnZXVzYWdlKSB7XG5cdFx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOlxuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmmL7npLrliY0nLCAn6aGv56S65YmNJykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0bXcubGFuZ3VhZ2UuY29udmVydE51bWJlcihsaXN0Lmxlbmd0aCkgK1xuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkuKrmlofku7bkvb/nlKjjgIInLCAn5YCL5qqU5qGI5L2/55So44CCJyksXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhajpgIknLCAn5YWo6YG4JyksXG5cdFx0XHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdpbWFnZXVzYWdlJykpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhajkuI3pgIknLCAn5YWo5LiN6YG4JyksXG5cdFx0XHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdpbWFnZXVzYWdlJykpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0XHRuYW1lOiAnaW1hZ2V1c2FnZScsXG5cdFx0XHRcdFx0XHRcdHNoaWZ0Q2xpY2tTdXBwb3J0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRsaXN0LFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRoYXZlY29udGVudCA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pyq5om+5Yiw5paH5Lu25L2/55So44CCJywgJ+acquaJvuWIsOaqlOahiOS9v+eUqOOAgicpLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGJhY2tsaW5rcyA9IHJlc3BvbnNlLnF1ZXJ5LmJhY2tsaW5rcy5zb3J0KFR3aW5rbGUuc29ydEJ5TmFtZXNwYWNlKTtcblx0XHRcdFx0aWYgKGJhY2tsaW5rcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBiYWNrbGlua3MubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0XHRcdC8vIExhYmVsIG1hZGUgYnkgVHdpbmtsZS5nZW5lcmF0ZUJhdGNoUGFnZUxpbmtzXG5cdFx0XHRcdFx0XHRsaXN0LnB1c2goe1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogJycsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBiYWNrbGlua3NbaV0udGl0bGUsXG5cdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mTvuWFpScsICfpgKPlhaUnKSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRuYW1lc3BhY2VzID0gW107XG5cdFx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIFR3aW5rbGUuZ2V0UHJlZigndW5saW5rTmFtZXNwYWNlcycpKSB7XG5cdFx0XHRcdFx0XHRuYW1lc3BhY2VzLnB1c2goXG5cdFx0XHRcdFx0XHRcdHYgPT09ICcwJyA/IHdpbmRvdy53Z1VMUygn77yI5p2h55uu77yJJywgJ++8iOaineebru+8iScpIDogbXcuY29uZmlnLmdldCgnd2dGb3JtYXR0ZWROYW1lc3BhY2VzJylbdl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflt7LpgInmi6nnmoTlkb3lkI3nqbrpl7TvvJonLCAn5bey6YG45pOH55qE5ZG95ZCN56m66ZaT77yaJykgKyBuYW1lc3BhY2VzLmpvaW4oJ+OAgScpLFxuXHRcdFx0XHRcdFx0dG9vbHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHQn5oKo5Y+v5ZyoVHdpbmtsZeWPguaVsOiuvue9ruS4reabtOaUueebuOWFs+mAiemhue+8jOivt+WPguingVtbSDpUVy9QUkVGXV0nLFxuXHRcdFx0XHRcdFx0XHQn5oKo5Y+v5ZyoVHdpbmtsZeWBj+WlveioreWumuS4reabtOaUueebuOmXnOmBuOmghe+8jOiri+WPg+imi1tbSDpUVy9QUkVGXV0nXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmIChyZXNwb25zZVsncXVlcnktY29udGludWUnXSAmJiByZXNwb25zZVsncXVlcnktY29udGludWUnXS5iYWNrbGlua3MpIHtcblx0XHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnZGl2Jyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmmL7npLrliY0nLCAn6aGv56S65YmNJykgK1xuXHRcdFx0XHRcdFx0XHRcdG13Lmxhbmd1YWdlLmNvbnZlcnROdW1iZXIobGlzdC5sZW5ndGgpICtcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S4qumTvuWFpeOAgicsICflgIvpgKPlhaXjgIInKSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLmZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo6YCJJywgJ+WFqOmBuCcpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdiYWNrbGlua3MnKSkucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLmZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo5LiN6YCJJywgJ+WFqOS4jemBuCcpLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IChlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdiYWNrbGlua3MnKSkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ2JhY2tsaW5rcycsXG5cdFx0XHRcdFx0XHRzaGlmdENsaWNrU3VwcG9ydDogdHJ1ZSxcblx0XHRcdFx0XHRcdGxpc3QsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aGF2ZWNvbnRlbnQgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ2RpdicsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmnKrmib7liLDpk77lhaXjgIInLCAn5pyq5om+5Yiw6YCj5YWl44CCJyksXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGhhdmVjb250ZW50KSB7XG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy5mb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhcGlvYmoucGFyYW1zLmZvcm0ucmVuZGVyKCk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuV2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRcdFx0Zm9yIChjb25zdCBsaW5rIG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhyZXN1bHQsICdiYWNrbGlua3MnKSkge1xuXHRcdFx0XHRcdFR3aW5rbGUuZ2VuZXJhdGVCYXRjaFBhZ2VMaW5rcyhsaW5rKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGxpbmsgb2YgTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKHJlc3VsdCwgJ2ltYWdldXNhZ2UnKSkge1xuXHRcdFx0XHRcdFR3aW5rbGUuZ2VuZXJhdGVCYXRjaFBhZ2VMaW5rcyhsaW5rKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHVubGlua0JhY2tsaW5rczogKHBhZ2VvYmopID0+IHtcblx0XHRcdGxldCBvbGR0ZXh0ID0gcGFnZW9iai5nZXRQYWdlVGV4dCgpO1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpdGV4dC5wYWdlKG9sZHRleHQpO1xuXHRcdFx0bGV0IHN1bW1hcnlUZXh0ID0gJyc7XG5cdFx0XHRsZXQgd2FybmluZ1N0cmluZyA9IGZhbHNlO1xuXHRcdFx0bGV0IHRleHQ7XG5cdFx0XHQvLyByZW1vdmUgaW1hZ2UgdXNhZ2VzXG5cdFx0XHRpZiAocGFyYW1zLmRvSW1hZ2V1c2FnZSkge1xuXHRcdFx0XHR0ZXh0ID0geXNhcmNoaXZlc19wYWdlXG5cdFx0XHRcdFx0LmNvbW1lbnRPdXRJbWFnZShtdy5jb25maWcuZ2V0KCd3Z1RpdGxlJyksIHdpbmRvdy53Z1VMUygn5rOo6YeKJywgJ+azqOmHiycpKVxuXHRcdFx0XHRcdC5nZXRUZXh0KCk7XG5cdFx0XHRcdC8vIGRpZCB3ZSBhY3R1YWxseSBtYWtlIGFueSBjaGFuZ2VzP1xuXHRcdFx0XHRpZiAodGV4dCA9PT0gb2xkdGV4dCkge1xuXHRcdFx0XHRcdHdhcm5pbmdTdHJpbmcgPSB3aW5kb3cud2dVTFMoJ+aWh+S7tuS9v+eUqCcsICfmqpTmoYjkvb/nlKgnKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdW1tYXJ5VGV4dCA9IHdpbmRvdy53Z1VMUygn5rOo6YeK5paH5Lu25L2/55SoJywgJ+azqOmHi+aqlOahiOS9v+eUqCcpO1xuXHRcdFx0XHRcdG9sZHRleHQgPSB0ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyByZW1vdmUgYmFja2xpbmtzXG5cdFx0XHRpZiAocGFyYW1zLmRvQmFja2xpbmtzKSB7XG5cdFx0XHRcdHRleHQgPSB5c2FyY2hpdmVzX3BhZ2UucmVtb3ZlTGluayhNb3JlYml0cy5wYWdlTmFtZU5vcm0pLmdldFRleHQoKTtcblx0XHRcdFx0dGV4dCA9IHlzYXJjaGl2ZXNfcGFnZS5yZW1vdmVUZW1wbGF0ZShtdy5jb25maWcuZ2V0KCd3Z1RpdGxlJykpLmdldFRleHQoKTtcblx0XHRcdFx0Ly8gZGlkIHdlIGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXM/XG5cdFx0XHRcdGlmICh0ZXh0ID09PSBvbGR0ZXh0KSB7XG5cdFx0XHRcdFx0d2FybmluZ1N0cmluZyA9IHdhcm5pbmdTdHJpbmdcblx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCflj5bmtojpk77lhaXmiJbmlofku7bkvb/nlKgnLCAn5Y+W5raI6YCj5YWl5oiW5qqU5qGI5L2/55SoJylcblx0XHRcdFx0XHRcdDogd2luZG93LndnVUxTKCflj5bmtojpk77lhaUnLCAn5Y+W5raI6YCj5YWlJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3VtbWFyeVRleHQgPSAoc3VtbWFyeVRleHQgPyBgJHtzdW1tYXJ5VGV4dH0gLyBgIDogJycpICsgd2luZG93LndnVUxTKCflj5bmtojpk77nu5PliLAnLCAn5Y+W5raI6YCj57WQ5YiwJyk7XG5cdFx0XHRcdFx0b2xkdGV4dCA9IHRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh3YXJuaW5nU3RyaW5nKSB7XG5cdFx0XHRcdC8vIG5vdGhpbmcgdG8gZG8hXG5cdFx0XHRcdHBhZ2VvYmpcblx0XHRcdFx0XHQuZ2V0U3RhdHVzRWxlbWVudCgpXG5cdFx0XHRcdFx0LmVycm9yKGAke3dpbmRvdy53Z1VMUygn5pyq6IO95Zyo6aG16Z2i5LiK5om+5YiwJywgJ+acquiDveWcqOmggemdouS4iuaJvuWIsCcpICsgd2FybmluZ1N0cmluZ33jgIJgKTtcblx0XHRcdFx0cGFyYW1zLnVubGlua2VyLndvcmtlckZhaWx1cmUocGFnZW9iaik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHBhZ2VvYmouc2V0UGFnZVRleHQodGV4dCk7XG5cdFx0XHRwYWdlb2JqLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRzdW1tYXJ5VGV4dCArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfigJwnLCAn44CMJykgK1xuXHRcdFx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfigJ3vvJonLCAn44CN77yaJykgK1xuXHRcdFx0XHRcdHBhcmFtcy5yZWFzb25cblx0XHRcdCk7XG5cdFx0XHRwYWdlb2JqLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdub2NyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5zYXZlKHBhcmFtcy51bmxpbmtlci53b3JrZXJTdWNjZXNzLCBwYXJhbXMudW5saW5rZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS51bmxpbmssICd1bmxpbmsnKTtcbn0pKGpRdWVyeSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcblxuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlZmx1ZmYuanMgKi9cbihmdW5jdGlvbiB0d2lua2xlZmx1ZmYoJCkge1xuXHRjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcblx0LyoqXG5cdCAqIHR3aW5rbGVmbHVmZi5qczogUmV2ZXJ0L3JvbGxiYWNrIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IExpbmtzIG9uIGNvbnRyaWJ1dGlvbnMsXG5cdCAqIHJlY2VudCBjaGFuZ2VzLCBoaXN0b3J5LCBhbmQgZGlmZiBwYWdlc1xuXHQgKiBBY3RpdmUgb246IERpZmYgcGFnZXMsIGhpc3RvcnkgcGFnZXMsXG5cdCAqIFNwZWNpYWw6UmVjZW50Q2hhbmdlcyhMaW5rZWQpLCBhbmQgU3BlY2lhbDpDb250cmlidXRpb25zXG5cdCAqL1xuXHQvKipcblx0ICogVHdpbmtsZWZsdWZmIHJldmVydCBhbmQgYW50aXZhbmRhbGlzbSB1dGlsaXR5XG5cdCAqL1xuXHRUd2lua2xlLmZsdWZmID0gKCkgPT4ge1xuXHRcdC8vIE9ubHkgcHJvY2VlZCBpZiB0aGUgdXNlciBjYW4gYWN0dWFsbHkgZWRpdCB0aGUgcGFnZSBpbiBxdWVzdGlvbi5cblx0XHQvLyB3Z0lzUHJvYmFibHlFZGl0YWJsZSBzaG91bGQgdGFrZVxuXHRcdC8vIGNhcmUgb2YgbmFtZXNwYWNlL2NvbnRlbnRNb2RlbCByZXN0cmljdGlvbnMgYXMgd2VsbCBhcyBleHBsaWNpdFxuXHRcdC8vIHByb3RlY3Rpb25zOyBpdCB3b24ndCB0YWtlIGNhcmUgb2YgY2FzY2FkaW5nIG9yIFRpdGxlQmxhY2tsaXN0LlxuXHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0lzUHJvYmFibHlFZGl0YWJsZScpKSB7XG5cdFx0XHQvLyB3Z0RpZmZPbGRJZCBpbmNsdWRlZCBmb3IgY2xhcml0eSBpbiBpZiBlbHNlIGxvb3Bcblx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0RpZmZOZXdJZCcpIHx8IG13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJykpIHtcblx0XHRcdFx0Ly8gUmVsb2FkIGFsb25nc2lkZSB0aGUgcmV2aXNpb24gc2xpZGVyXG5cdFx0XHRcdG13Lmhvb2soJ3dpa2lwYWdlLmRpZmYnKS5hZGQoKCkgPT4ge1xuXHRcdFx0XHRcdFR3aW5rbGUuZmx1ZmYuYWRkTGlua3MuZGlmZigpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICd2aWV3JyAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSAhPT0gbXcuY29uZmlnLmdldCgnd2dSZXZpc2lvbklkJylcblx0XHRcdCkge1xuXHRcdFx0XHRUd2lua2xlLmZsdWZmLmFkZExpbmtzLm9sZGlkKCk7XG5cdFx0XHR9IGVsc2UgaWYgKG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICdoaXN0b3J5Jykge1xuXHRcdFx0XHRUd2lua2xlLmZsdWZmLmFkZExpbmtzLmhpc3RvcnkoKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IC0xKSB7XG5cdFx0XHRUd2lua2xlLmZsdWZmLnNraXBUYWxrID0gIVR3aW5rbGUuZ2V0UHJlZignb3BlblRhbGtQYWdlT25BdXRvUmV2ZXJ0Jyk7XG5cdFx0XHRUd2lua2xlLmZsdWZmLnJvbGxiYWNrSW5QbGFjZSA9IFR3aW5rbGUuZ2V0UHJlZigncm9sbGJhY2tJblBsYWNlJyk7XG5cdFx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ0NvbnRyaWJ1dGlvbnMnKSB7XG5cdFx0XHRcdFR3aW5rbGUuZmx1ZmYuYWRkTGlua3MuY29udHJpYnV0aW9ucygpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ1JlY2VudGNoYW5nZXMnIHx8XG5cdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lJykgPT09ICdSZWNlbnRjaGFuZ2VzbGlua2VkJ1xuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFJlbG9hZCB3aXRoIHJlY2VudCBjaGFuZ2VzIHVwZGF0ZXNcblx0XHRcdFx0Ly8gc3RydWN0dXJlZENoYW5nZUZpbHRlcnMudWkuaW5pdGlhbGl6ZWQgaXMganVzdCBvbiBsb2FkXG5cdFx0XHRcdG13Lmhvb2soJ3dpa2lwYWdlLmNvbnRlbnQnKS5hZGQoKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRpZiAoaXRlbS5pcygnZGl2JykpIHtcblx0XHRcdFx0XHRcdFR3aW5rbGUuZmx1ZmYuYWRkTGlua3MucmVjZW50Y2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyBBIGxpc3Qgb2YgdXNlcm5hbWVzLCB1c3VhbGx5IG9ubHkgYm90cywgdGhhdCB2YW5kYWxpc20gcmV2ZXJ0IGlzIGp1bXBlZFxuXHQvLyBvdmVyOyB0aGF0IGlzLCBpZiB2YW5kYWxpc20gcmV2ZXJ0IHdhcyBjaG9zZW4gb24gc3VjaCB1c2VybmFtZSwgdGhlbiBpdHNcblx0Ly8gdGFyZ2V0IGlzIG9uIHRoZSByZXZpc2lvbiBiZWZvcmUuICBUaGlzIGlzIGZvciBoYW5kbGluZyBxdWljayBib3RzIHRoYXRcblx0Ly8gbWFrZXMgZWRpdHMgc2Vjb25kcyBhZnRlciB0aGUgb3JpZ2luYWwgZWRpdCBpcyBtYWRlLiAgVGhpcyBvbmx5IGFmZmVjdHNcblx0Ly8gdmFuZGFsaXNtIHJvbGxiYWNrOyBmb3IgZ29vZCBmYWl0aCByb2xsYmFjaywgaXQgd2lsbCBzdG9wLCBpbmRpY2F0aW5nIGEgYm90XG5cdC8vIGhhcyBubyBmYWl0aCwgYW5kIGZvciBub3JtYWwgcm9sbGJhY2ssIGl0IHdpbGwgcm9sbGJhY2sgdGhhdCBlZGl0LlxuXHRUd2lua2xlLmZsdWZmLnRydXN0ZWRCb3RzID0gW107XG5cdFR3aW5rbGUuZmx1ZmYuc2tpcFRhbGsgPSBudWxsO1xuXHRUd2lua2xlLmZsdWZmLnJvbGxiYWNrSW5QbGFjZSA9IG51bGw7XG5cdC8vIFN0cmluZyB0byBpbnNlcnQgd2hlbiBhIHVzZXJuYW1lIGlzIGhpZGRlblxuXHRUd2lua2xlLmZsdWZmLmhpZGRlbk5hbWUgPSB3aW5kb3cud2dVTFMoJ+W3sumakOiXj+eahOeUqOaItycsICflt7LpmrHol4/nmoTkvb/nlKjogIUnKTtcblx0Ly8gQ29uc29saWRhdGVkIGNvbnN0cnVjdGlvbiBvZiBmbHVmZiBsaW5rc1xuXHRUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyID0ge1xuXHRcdHNwYW5UYWc6IChjb2xvciwgY29udGVudCkgPT4ge1xuXHRcdFx0Y29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRcdHNwYW4uc3R5bGUuY29sb3IgPSBjb2xvcjtcblx0XHRcdHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpO1xuXHRcdFx0cmV0dXJuIHNwYW47XG5cdFx0fSxcblx0XHRidWlsZExpbms6IChjb2xvciwgdGV4dCkgPT4ge1xuXHRcdFx0Y29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdGxpbmsuYXBwZW5kQ2hpbGQoVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5zcGFuVGFnKCdCbGFjaycsICdbJykpO1xuXHRcdFx0bGluay5hcHBlbmRDaGlsZChUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyLnNwYW5UYWcoY29sb3IsIHRleHQpKTtcblx0XHRcdGxpbmsuYXBwZW5kQ2hpbGQoVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5zcGFuVGFnKCdCbGFjaycsICddJykpO1xuXHRcdFx0bGluay5ocmVmID0gJyMnO1xuXHRcdFx0cmV0dXJuIGxpbms7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbmRhbD1udWxsXSAtIFVzZXJuYW1lIG9mIHRoZSBlZGl0b3IgYmVpbmcgcmV2ZXJ0ZWRcblx0XHQgKiBQcm92aWRlIGEgZmFsc2V5IHZhbHVlIGlmIHRoZSB1c2VybmFtZSBpcyBoaWRkZW4sIGRlZmF1bHRzIHRvIG51bGxcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGlubGluZSAtIFRydWUgdG8gY3JlYXRlIHR3byBsaW5rcyBpbiBhIHNwYW4sIGZhbHNlXG5cdFx0ICogdG8gY3JlYXRlIHRocmVlIGxpbmtzIGluIGEgZGl2IChvcHRpb25hbClcblx0XHQgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtyZXY9d2dDdXJSZXZpc2lvbklkXSAtIFJldmlzaW9uIElEIGJlaW5nIHJldmVydGVkIChvcHRpb25hbClcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW3BhZ2U9d2dQYWdlTmFtZV0gLSBQYWdlIGJlaW5nIHJldmVydGVkIChvcHRpb25hbClcblx0XHQgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gcmV2Tm9kZVxuXHRcdCAqL1xuXHRcdHJvbGxiYWNrTGlua3M6ICh2YW5kYWwsIGlubGluZSwgcmV2LCBwYWdlKSA9PiB7XG5cdFx0XHR2YW5kYWwgfHw9IG51bGw7XG5cdFx0XHRjb25zdCBlbGVtID0gaW5saW5lID8gJ3NwYW4nIDogJ2Rpdic7XG5cdFx0XHRjb25zdCByZXZOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtKTtcblx0XHRcdHJldiA9IE51bWJlci5wYXJzZUludChyZXYsIDEwKTtcblx0XHRcdGlmIChyZXYpIHtcblx0XHRcdFx0cmV2Tm9kZS5zZXRBdHRyaWJ1dGUoJ2lkJywgYHR3LXJldmVydCR7cmV2fWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV2Tm9kZS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3R3LXJldmVydCcpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgbm9ybU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHJvbmcnKTtcblx0XHRcdGNvbnN0IHZhbmROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3Ryb25nJyk7XG5cdFx0XHRjb25zdCBub3JtTGluayA9IFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIuYnVpbGRMaW5rKCdTdGVlbEJsdWUnLCAn5Zue6YCAJyk7XG5cdFx0XHRjb25zdCB2YW5kTGluayA9IFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIuYnVpbGRMaW5rKCdSZWQnLCB3aW5kb3cud2dVTFMoJ+egtOWdjycsICfnoLTlo54nKSk7XG5cdFx0XHQkKG5vcm1MaW5rKS5vbignY2xpY2snLCAoZSkgPT4ge1xuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFR3aW5rbGUuZmx1ZmYucmV2ZXJ0KCdub3JtJywgdmFuZGFsLCByZXYsIHBhZ2UpO1xuXHRcdFx0XHRUd2lua2xlLmZsdWZmLmRpc2FibGVMaW5rcyhyZXZOb2RlKTtcblx0XHRcdH0pO1xuXHRcdFx0JCh2YW5kTGluaykub24oJ2NsaWNrJywgKGUpID0+IHtcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRUd2lua2xlLmZsdWZmLnJldmVydCgndmFuZCcsIHZhbmRhbCwgcmV2LCBwYWdlKTtcblx0XHRcdFx0VHdpbmtsZS5mbHVmZi5kaXNhYmxlTGlua3MocmV2Tm9kZSk7XG5cdFx0XHR9KTtcblx0XHRcdHZhbmROb2RlLmFwcGVuZENoaWxkKHZhbmRMaW5rKTtcblx0XHRcdG5vcm1Ob2RlLmFwcGVuZENoaWxkKG5vcm1MaW5rKTtcblx0XHRcdGNvbnN0IHNlcGFyYXRvciA9IGlubGluZSA/ICcgJyA6ICcgfHwgJztcblx0XHRcdHJldk5vZGUuYXBwZW5kQ2hpbGQobm9ybU5vZGUpO1xuXHRcdFx0cmV2Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzZXBhcmF0b3IpKTtcblx0XHRcdHJldk5vZGUuYXBwZW5kQ2hpbGQodmFuZE5vZGUpO1xuXHRcdFx0cmV0dXJuIHJldk5vZGU7XG5cdFx0fSxcblx0XHQvLyBCdWlsZCBbcmVzdG9yZSB0aGlzIHJldmlzaW9uXSBsaW5rc1xuXHRcdHJlc3RvcmVUaGlzUmV2aXNpb25MaW5rOiAocmV2aXNpb25SZWYsIGlubGluZSkgPT4ge1xuXHRcdFx0Ly8gSWYgbm90IGEgc3BlY2lmaWMgcmV2aXNpb24gbnVtYmVyLCBzaG91bGQgYmUgd2dEaWZmTmV3SWQvd2dEaWZmT2xkSWQvd2dSZXZpc2lvbklkXG5cdFx0XHRyZXZpc2lvblJlZiA9IHR5cGVvZiByZXZpc2lvblJlZiA9PT0gJ251bWJlcicgPyByZXZpc2lvblJlZiA6IG13LmNvbmZpZy5nZXQocmV2aXNpb25SZWYpO1xuXHRcdFx0Y29uc3QgZWxlbSA9IGlubGluZSA/ICdzcGFuJyA6ICdkaXYnO1xuXHRcdFx0Y29uc3QgcmV2ZXJ0VG9SZXZpc2lvbk5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW0pO1xuXHRcdFx0cmV2ZXJ0VG9SZXZpc2lvbk5vZGUuc2V0QXR0cmlidXRlKCdpZCcsIGB0dy1yZXZlcnQtdG8tJHtyZXZpc2lvblJlZn1gKTtcblx0XHRcdHJldmVydFRvUmV2aXNpb25Ob2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG5cdFx0XHRjb25zdCByZXZlcnRUb1JldmlzaW9uTGluayA9IFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIuYnVpbGRMaW5rKFxuXHRcdFx0XHQnU2FkZGxlQnJvd24nLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aBouWkjeatpOeJiOacrCcsICfmgaLlvqnmraTniYjmnKwnKVxuXHRcdFx0KTtcblx0XHRcdCQocmV2ZXJ0VG9SZXZpc2lvbkxpbmspLm9uKCdjbGljaycsIChlKSA9PiB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0VHdpbmtsZS5mbHVmZi5yZXZlcnRUb1JldmlzaW9uKHJldmlzaW9uUmVmKTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGlubGluZSkge1xuXHRcdFx0XHRyZXZlcnRUb1JldmlzaW9uTm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpKTtcblx0XHRcdH1cblx0XHRcdHJldmVydFRvUmV2aXNpb25Ob2RlLmFwcGVuZENoaWxkKHJldmVydFRvUmV2aXNpb25MaW5rKTtcblx0XHRcdHJldHVybiByZXZlcnRUb1JldmlzaW9uTm9kZTtcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLmZsdWZmLmFkZExpbmtzID0ge1xuXHRcdGNvbnRyaWJ1dGlvbnM6ICgpID0+IHtcblx0XHRcdC8vICQoJ3NwLWNvbnRyaWJ1dGlvbnMtZm9vdGVyLWFub24tcmFuZ2UnKSByZWxpZXMgb24gdGhlIGZtYm94XG5cdFx0XHQvLyBpZCBpbiBbW01lZGlhV2lraTpTcC1jb250cmlidXRpb25zLWZvb3Rlci1hbm9uLXJhbmdlXV0gYW5kXG5cdFx0XHQvLyBpcyB1c2VkIHRvIHNob3cgcm9sbGJhY2svdmFuZGFsaXNtIGxpbmtzIGZvciBJUCByYW5nZXNcblx0XHRcdGNvbnN0IGlzUmFuZ2UgPSAhISRib2R5LmZpbmQoJyNzcC1jb250cmlidXRpb25zLWZvb3Rlci1hbm9uLXJhbmdlJylbMF07XG5cdFx0XHRpZiAobXcuY29uZmlnLmV4aXN0cygnd2dSZWxldmFudFVzZXJOYW1lJykgfHwgaXNSYW5nZSkge1xuXHRcdFx0XHQvLyBHZXQgdGhlIHVzZXJuYW1lIHRoZXNlIGNvbnRyaWJ1dGlvbnMgYXJlIGZvclxuXHRcdFx0XHRsZXQgdXNlcm5hbWUgPSBtdy5jb25maWcuZ2V0KCd3Z1JlbGV2YW50VXNlck5hbWUnKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignc2hvd1JvbGxiYWNrTGlua3MnKS5pbmNsdWRlcygnY29udHJpYnMnKSB8fFxuXHRcdFx0XHRcdChtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgIT09IHVzZXJuYW1lICYmXG5cdFx0XHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3Nob3dSb2xsYmFja0xpbmtzJykuaW5jbHVkZXMoJ290aGVycycpKSB8fFxuXHRcdFx0XHRcdChtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgPT09IHVzZXJuYW1lICYmIFR3aW5rbGUuZ2V0UHJlZignc2hvd1JvbGxiYWNrTGlua3MnKS5pbmNsdWRlcygnbWluZScpKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCAkbGlzdCA9ICRib2R5XG5cdFx0XHRcdFx0XHQuZmluZCgnI213LWNvbnRlbnQtdGV4dCcpXG5cdFx0XHRcdFx0XHQuZmluZCgndWwgbGk6aGFzKHNwYW4ubXctdWN0b3ApOmhhcygubXctY2hhbmdlc2xpc3QtZGlmZiknKTtcblx0XHRcdFx0XHQkbGlzdC5lYWNoKChfa2V5LCBjdXJyZW50KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyByZXZpZCBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgaHJlZiBvZiBib3RoXG5cdFx0XHRcdFx0XHQvLyAubXctY2hhbmdlc2xpc3QtZGF0ZSBvciAubXctY2hhbmdlc2xpc3QtZGlmZlxuXHRcdFx0XHRcdFx0Y29uc3QgcGFnZSA9ICQoY3VycmVudCkuZmluZCgnLm13LWNvbnRyaWJ1dGlvbnMtdGl0bGUnKS50ZXh0KCk7XG5cdFx0XHRcdFx0XHQvLyBHZXQgdXNlcm5hbWUgZm9yIElQIHJhbmdlcyAod2dSZWxldmFudFVzZXJOYW1lIGlzIG51bGwpXG5cdFx0XHRcdFx0XHRpZiAoaXNSYW5nZSkge1xuXHRcdFx0XHRcdFx0XHQvLyBUaGUgOm5vdCBpcyBwb3NzaWJseSB1bm5lY2Vzc2FyeSwgYXMgaXQgYXBwZWFycyB0aGF0XG5cdFx0XHRcdFx0XHRcdC8vIC5tdy11c2VybGluayBpcyBzaW1wbHkgbm90IHByZXNlbnQgaWYgdGhlIHVzZXJuYW1lIGlzIGhpZGRlblxuXHRcdFx0XHRcdFx0XHR1c2VybmFtZSA9ICQoY3VycmVudCkuZmluZCgnLm13LXVzZXJsaW5rOm5vdCguaGlzdG9yeS1kZWxldGVkKScpLnRleHQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIEl0J3MgdW5saWtlbHksIGJ1dCB3ZSBjYW4ndCBlYXNpbHkgY2hlY2sgZm9yIHJldmRlbCdkIHVzZXJuYW1lc1xuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugb25seSBhIHN0cm9uZyBlbGVtZW50IGlzIHByb3ZpZGVkLCB3aXRoIG5vIGVhc3kgc2VsZWN0b3Jcblx0XHRcdFx0XHRcdGN1cnJlbnQuYXBwZW5kQ2hpbGQoXG5cdFx0XHRcdFx0XHRcdFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIucm9sbGJhY2tMaW5rcyh1c2VybmFtZSwgdHJ1ZSwgY3VycmVudC5kYXRhc2V0Lm13UmV2aWQsIHBhZ2UpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWNlbnRjaGFuZ2VzOiAoKSA9PiB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnUmVjZW50Y2hhbmdlcycgJiZcblx0XHRcdFx0XHRUd2lua2xlLmdldFByZWYoJ3Nob3dSb2xsYmFja0xpbmtzJykuaW5jbHVkZXMoJ3JlY2VudGNoYW5nZXMnKSkgfHxcblx0XHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lJykgPT09ICdSZWNlbnRjaGFuZ2VzbGlua2VkJyAmJlxuXHRcdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignc2hvd1JvbGxiYWNrTGlua3MnKS5pbmNsdWRlcygncmVjZW50Y2hhbmdlc2xpbmtlZCcpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIExhdGVzdCBhbmQgcmV2ZXJ0YWJsZSAobm90IHBhZ2UgY3JlYXRpb25zLCBsb2dzLCBjYXRlZ29yaXphdGlvbnMsIGV0Yy4pXG5cdFx0XHRcdGxldCAkbGlzdCA9ICRib2R5LmZpbmQoJy5tdy1jaGFuZ2VzbGlzdCAubXctY2hhbmdlc2xpc3QtbGFzdC5tdy1jaGFuZ2VzbGlzdC1zcmMtbXctZWRpdCcpO1xuXHRcdFx0XHQvLyBFeGNsdWRlIHRvcC1sZXZlbCBoZWFkZXIgaWYgXCJncm91cCBjaGFuZ2VzXCIgcHJlZmVyZW5jZSBpcyB1c2VkXG5cdFx0XHRcdC8vIGFuZCBmaW5kIG9ubHkgaW5kaXZpZHVhbCBsaW5lcyBvciBuZXN0ZWQgbGluZXNcblx0XHRcdFx0JGxpc3QgPSAkbGlzdFxuXHRcdFx0XHRcdC5ub3QoJy5tdy1yY2ZpbHRlcnMtdWktaGlnaGxpZ2h0cy1lbmhhbmNlZC10b3BsZXZlbCcpXG5cdFx0XHRcdFx0LmZpbmQoJy5tdy1jaGFuZ2VzbGlzdC1saW5lLWlubmVyLCB0ZC5tdy1lbmhhbmNlZC1yYy1uZXN0ZWQnKTtcblx0XHRcdFx0JGxpc3QuZWFjaCgoX2tleSwgY3VycmVudCkgPT4ge1xuXHRcdFx0XHRcdC8vIFRoZSA6bm90IGlzIHBvc3NpYmx5IHVubmVjZXNzYXJ5LCBhcyBpdCBhcHBlYXJzIHRoYXRcblx0XHRcdFx0XHQvLyAubXctdXNlcmxpbmsgaXMgc2ltcGx5IG5vdCBwcmVzZW50IGlmIHRoZSB1c2VybmFtZSBpcyBoaWRkZW5cblx0XHRcdFx0XHRjb25zdCB2YW5kYWwgPSAkKGN1cnJlbnQpLmZpbmQoJy5tdy11c2VybGluazpub3QoLmhpc3RvcnktZGVsZXRlZCknKS50ZXh0KCk7XG5cdFx0XHRcdFx0Y29uc3QgaHJlZiA9ICQoY3VycmVudCkuZmluZCgnLm13LWNoYW5nZXNsaXN0LWRpZmYnKS5hdHRyKCdocmVmJyk7XG5cdFx0XHRcdFx0Y29uc3QgcmV2ID0gbXcudXRpbC5nZXRQYXJhbVZhbHVlKCdkaWZmJywgaHJlZik7XG5cdFx0XHRcdFx0Y29uc3QgcGFnZSA9IGN1cnJlbnQuZGF0YXNldC50YXJnZXRQYWdlO1xuXHRcdFx0XHRcdGN1cnJlbnQuYXBwZW5kQ2hpbGQoVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5yb2xsYmFja0xpbmtzKHZhbmRhbCwgdHJ1ZSwgcmV2LCBwYWdlKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aGlzdG9yeTogKCkgPT4ge1xuXHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignc2hvd1JvbGxiYWNrTGlua3MnKS5pbmNsdWRlcygnaGlzdG9yeScpKSB7XG5cdFx0XHRcdC8vIEFsbCByZXZzXG5cdFx0XHRcdGNvbnN0IGhpc3RMaXN0ID0gJGJvZHkuZmluZCgnI3BhZ2VoaXN0b3J5IGxpJykudG9BcnJheSgpO1xuXHRcdFx0XHQvLyBPbiBmaXJzdCBwYWdlIG9mIHJlc3VsdHMsIHNvIGFkZCByZXZlcnQvcm9sbGJhY2tcblx0XHRcdFx0Ly8gbGlua3MgdG8gdGhlIHRvcCByZXZpc2lvblxuXHRcdFx0XHRpZiAoISRib2R5LmZpbmQoJ2EubXctZmlyc3RsaW5rJykubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlyc3QgPSBoaXN0TGlzdC5zaGlmdCgpO1xuXHRcdFx0XHRcdGNvbnN0IHZhbmRhbCA9ICQoZmlyc3QpLmZpbmQoJy5tdy11c2VybGluazpub3QoLmhpc3RvcnktZGVsZXRlZCknKS50ZXh0KCk7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZm9yIGZpcnN0IHVzZXJuYW1lIGRpZmZlcmVudCB0aGFuIHRoZSB0b3AgdXNlcixcblx0XHRcdFx0XHQvLyBvbmx5IGFwcGx5IHJvbGxiYWNrIGxpbmtzIGlmL3doZW4gZm91bmRcblx0XHRcdFx0XHQvLyBmb3IgZmFzdGVyIHRoYW4gZXZlcnlcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgaGlzdExpc3QpIHtcblx0XHRcdFx0XHRcdGlmICgkKGl0ZW0pLmZpbmQoJy5tdy11c2VybGluaycpLnRleHQoKSAhPT0gdmFuZGFsKSB7XG5cdFx0XHRcdFx0XHRcdGZpcnN0LmFwcGVuZENoaWxkKFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIucm9sbGJhY2tMaW5rcyh2YW5kYWwsIHRydWUpKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIG9sZGlkXG5cdFx0XHRcdGZvciAoY29uc3QgcmV2IG9mIGhpc3RMaXN0KSB7XG5cdFx0XHRcdFx0Ly8gRnJvbSByZXN0b3JlVGhpc1JldmlzaW9uLCBub24tdHJhbnNmZXJhYmxlXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHRleHQgaGFzIGJlZW4gcmV2ZGVsJ2QsIGl0IGdldHMgd3JhcHBlZCBpbiBhIHNwYW4gd2l0aCAuaGlzdG9yeS1kZWxldGVkLFxuXHRcdFx0XHRcdC8vIGFuZCBocmVmIHdpbGwgYmUgdW5kZWZpbmVkIChhbmQgdGh1cyBvbGRpZCBpcyBOYU4pXG5cdFx0XHRcdFx0Y29uc3Qge2hyZWZ9ID0gcmV2LnF1ZXJ5U2VsZWN0b3IoJy5tdy1jaGFuZ2VzbGlzdC1kYXRlJyk7XG5cdFx0XHRcdFx0Y29uc3Qgb2xkaWQgPSBOdW1iZXIucGFyc2VJbnQobXcudXRpbC5nZXRQYXJhbVZhbHVlKCdvbGRpZCcsIGhyZWYpLCAxMCk7XG5cdFx0XHRcdFx0aWYgKCFOdW1iZXIuaXNOYU4ob2xkaWQpKSB7XG5cdFx0XHRcdFx0XHRyZXYuYXBwZW5kQ2hpbGQoVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5yZXN0b3JlVGhpc1JldmlzaW9uTGluayhvbGRpZCwgdHJ1ZSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZGlmZjogKCkgPT4ge1xuXHRcdFx0Ly8gQXV0b2ZpbGwgdXNlciB0YWxrIGxpbmtzIG9uIGRpZmZzIHdpdGggdmFuYXJ0aWNsZSBmb3IgZWFzeSB3YXJuaW5nLCBidXQgZG9uJ3QgYXV0b3dhcm5cblx0XHRcdGNvbnN0IHdhcm5Gcm9tVGFsayA9ICh4dGl0bGUpID0+IHtcblx0XHRcdFx0Y29uc3QgdGFsa0xpbmsgPSAkKGAjbXctZGlmZi0ke3h0aXRsZX0yIC5tdy11c2VydG9vbGxpbmtzIGFgKS5maXJzdCgpO1xuXHRcdFx0XHRpZiAodGFsa0xpbmsubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bGV0IGV4dHJhUGFyYW1zID0gYHZhbmFydGljbGU9JHttdy51dGlsLnJhd3VybGVuY29kZShNb3JlYml0cy5wYWdlTmFtZU5vcm0pfSZub2F1dG93YXJuPXRydWVgO1xuXHRcdFx0XHRcdC8vIGRpZmZJRHMgZm9yIHZhbmFydGljbGVyZXZpZFxuXHRcdFx0XHRcdGV4dHJhUGFyYW1zICs9ICcmdmFuYXJ0aWNsZXJldmlkPSc7XG5cdFx0XHRcdFx0ZXh0cmFQYXJhbXMgKz0geHRpdGxlID09PSAnb3RpdGxlJyA/IG13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJykgOiBtdy5jb25maWcuZ2V0KCd3Z0RpZmZOZXdJZCcpO1xuXHRcdFx0XHRcdGNvbnN0IGhyZWYgPSB0YWxrTGluay5hdHRyKCdocmVmJyk7XG5cdFx0XHRcdFx0aWYgKGhyZWYuaW5jbHVkZXMoJz8nKSkge1xuXHRcdFx0XHRcdFx0dGFsa0xpbmsuYXR0cignaHJlZicsIGAke2hyZWZ9JiR7ZXh0cmFQYXJhbXN9YCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRhbGtMaW5rLmF0dHIoJ2hyZWYnLCBgJHtocmVmfT8ke2V4dHJhUGFyYW1zfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdC8vIE9sZGVyIHJldmlzaW9uXG5cdFx0XHR3YXJuRnJvbVRhbGsoJ290aXRsZScpOyAvLyBBZGQgcXVpY2std2FybiBsaW5rIHRvIHVzZXIgdGFsayBsaW5rXG5cdFx0XHQvLyBEb24ndCBsb2FkIGlmIHRoZXJlJ3MgYSBzaW5nbGUgcmV2aXNpb24gb3Igd2VpcmQgZGlmZiAoY3VyIG9uIGxhdGVzdClcblx0XHRcdGlmIChtdy5jb25maWcuZ2V0KCd3Z0RpZmZPbGRJZCcpICYmIG13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJykgIT09IG13LmNvbmZpZy5nZXQoJ3dnRGlmZk5ld0lkJykpIHtcblx0XHRcdFx0Ly8gQWRkIGEgW3Jlc3RvcmUgdGhpcyByZXZpc2lvbl0gbGluayB0byB0aGUgb2xkZXIgcmV2aXNpb25cblx0XHRcdFx0Y29uc3Qgb2xkVGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctZGlmZi1vdGl0bGUxJykucGFyZW50Tm9kZTtcblx0XHRcdFx0Y29uc3QgcmV2ZXJ0VG9SZXZpc2lvbiA9IFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIucmVzdG9yZVRoaXNSZXZpc2lvbkxpbmsoJ3dnRGlmZk9sZElkJyk7XG5cdFx0XHRcdG9sZFRpdGxlLmluc2VydEJlZm9yZShyZXZlcnRUb1JldmlzaW9uLCBvbGRUaXRsZS5maXJzdENoaWxkKTtcblx0XHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignY3VzdG9tUmV2ZXJ0U3VtbWFyeScpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRyZXZlcnRUb1JldmlzaW9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgfHwgJykpO1xuXHRcdFx0XHRcdGNvbnN0IHJldmVydHN1bW1hcnkgPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtLmVsZW1lbnQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdFx0XHRuYW1lOiAncmV2ZXJ0c3VtbWFyeScsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV2ZXJ0c3VtbWFyeS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpgInmi6nlm57pgIDnkIbnlLEnLCAn6YG45pOH5Zue6YCA55CG55SxJyksXG5cdFx0XHRcdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0JChUd2lua2xlLmdldFByZWYoJ2N1c3RvbVJldmVydFN1bW1hcnknKSkuZWFjaCgoXywgZSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV2ZXJ0c3VtbWFyeS5hcHBlbmQoe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiAnb3B0aW9uJyxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IGUubGFiZWwsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBlLnZhbHVlLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV2ZXJ0VG9SZXZpc2lvbi5hcHBlbmRDaGlsZChyZXZlcnRzdW1tYXJ5LnJlbmRlcigpLmNoaWxkTm9kZXNbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBOZXdlciByZXZpc2lvblxuXHRcdFx0d2FybkZyb21UYWxrKCdudGl0bGUnKTsgLy8gQWRkIHF1aWNrLXdhcm4gbGluayB0byB1c2VyIHRhbGsgbGlua1xuXHRcdFx0Ly8gQWRkIGVpdGhlciByZXN0b3JlIG9yIHJvbGxiYWNrIGxpbmtzIHRvIHRoZSBuZXdlciByZXZpc2lvblxuXHRcdFx0Ly8gRG9uJ3Qgc2hvdyBpZiB0aGVyZSdzIGEgc2luZ2xlIHJldmlzaW9uIG9yIHdlaXJkIGRpZmYgKHByZXYgb24gZmlyc3QpXG5cdFx0XHRpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RpZmZlcmVuY2VzLW5leHRsaW5rJykpIHtcblx0XHRcdFx0Ly8gTm90IGxhdGVzdCByZXZpc2lvbiwgYWRkIFtyZXN0b3JlIHRoaXMgcmV2aXNpb25dIGxpbmsgdG8gbmV3ZXIgcmV2aXNpb25cblx0XHRcdFx0Y29uc3QgbmV3VGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctZGlmZi1udGl0bGUxJykucGFyZW50Tm9kZTtcblx0XHRcdFx0bmV3VGl0bGUuaW5zZXJ0QmVmb3JlKFxuXHRcdFx0XHRcdFR3aW5rbGUuZmx1ZmYubGlua0J1aWxkZXIucmVzdG9yZVRoaXNSZXZpc2lvbkxpbmsoJ3dnRGlmZk5ld0lkJyksXG5cdFx0XHRcdFx0bmV3VGl0bGUuZmlyc3RDaGlsZFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdzaG93Um9sbGJhY2tMaW5rcycpLmluY2x1ZGVzKCdkaWZmJykgJiZcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSAmJlxuXHRcdFx0XHQobXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSAhPT0gbXcuY29uZmlnLmdldCgnd2dEaWZmTmV3SWQnKSB8fFxuXHRcdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkaWZmZXJlbmNlcy1wcmV2bGluaycpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIE5vcm1hbGx5IC5tdy11c2VybGluayBpcyBhIGxpbmssIGJ1dCBpZiB0aGVcblx0XHRcdFx0Ly8gdXNlcm5hbWUgaXMgaGlkZGVuLCBpdCB3aWxsIGJlIGEgc3BhbiB3aXRoXG5cdFx0XHRcdC8vIC5oaXN0b3J5LWRlbGV0ZWQgYXMgd2VsbC4gV2hlbiBhIHN5c29wIHZpZXdzIHRoZVxuXHRcdFx0XHQvLyBoaWRkZW4gY29udGVudCwgdGhlIHNwYW4gY29udGFpbnMgdGhlIHVzZXJuYW1lIGluIGFcblx0XHRcdFx0Ly8gbGluayBlbGVtZW50LCB3aGljaCB3aWxsICpqdXN0KiBoYXZlXG5cdFx0XHRcdC8vIC5tdy11c2VybGluay4gVGhlIGJlbG93IHRodXMgZmluZHMgdGhlIGZpcnN0XG5cdFx0XHRcdC8vIGluc3RhbmNlIG9mIHRoZSBjbGFzcywgd2hpY2ggaWYgaGlkZGVuIGlzIHRoZSBzcGFuXG5cdFx0XHRcdC8vIGFuZCB0aHVzIHRleHQgcmV0dXJucyB1bmRlZmluZWQuIFRlY2huaWNhbGx5LCB0aGlzXG5cdFx0XHRcdC8vIGlzIGEgcGxhY2Ugd2hlcmUgc3lzb3BzICpjb3VsZCogaGF2ZSBtb3JlXG5cdFx0XHRcdC8vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byB0aGVtIChhcyBhYm92ZSwgdmlhXG5cdFx0XHRcdC8vICZ1bmhpZGU9MSksIHNpbmNlIHRoZSB1c2VybmFtZSB3aWxsIGJlIGF2YWlsYWJsZSBieVxuXHRcdFx0XHQvLyBjaGVja2luZyBhLm13LXVzZXJsaW5rIGluc3RlYWQsIGJ1dCByZXZlcnQoKSB3aWxsXG5cdFx0XHRcdC8vIG5lZWQgcmV3b3JraW5nIGFyb3VuZCB1c2VySGlkZGVuXG5cdFx0XHRcdGNvbnN0IHZhbmRhbCA9ICRib2R5LmZpbmQoJyNtdy1kaWZmLW50aXRsZTInKS5maW5kKCcubXctdXNlcmxpbmsnKVswXS50ZXh0O1xuXHRcdFx0XHRjb25zdCBudGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctZGlmZi1udGl0bGUxJykucGFyZW50Tm9kZTtcblx0XHRcdFx0bnRpdGxlLmluc2VydEJlZm9yZShUd2lua2xlLmZsdWZmLmxpbmtCdWlsZGVyLnJvbGxiYWNrTGlua3ModmFuZGFsKSwgbnRpdGxlLmZpcnN0Q2hpbGQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b2xkaWQ6ICgpID0+IHtcblx0XHRcdC8vIEFkZCBhIFtyZXN0b3JlIHRoaXMgcmV2aXNpb25dIGxpbmsgb24gb2xkIHJldmlzaW9uc1xuXHRcdFx0Y29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctcmV2aXNpb24taW5mbycpLnBhcmVudE5vZGU7XG5cdFx0XHR0aXRsZS5pbnNlcnRCZWZvcmUoVHdpbmtsZS5mbHVmZi5saW5rQnVpbGRlci5yZXN0b3JlVGhpc1JldmlzaW9uTGluaygnd2dSZXZpc2lvbklkJyksIHRpdGxlLmZpcnN0Q2hpbGQpO1xuXHRcdH0sXG5cdH07XG5cdFR3aW5rbGUuZmx1ZmYuZGlzYWJsZUxpbmtzID0gKHBhcmVudE5vZGUpID0+IHtcblx0XHQvLyBBcnJheS5mcm9tIG5vdCBhdmFpbGFibGUgaW4gSUUxMSA6KFxuXHRcdCQocGFyZW50Tm9kZSlcblx0XHRcdC5jaGlsZHJlbigpXG5cdFx0XHQuZWFjaCgoX2ksIG5vZGUpID0+IHtcblx0XHRcdFx0bm9kZS5pbm5lckhUTUwgPSBub2RlLnRleHRDb250ZW50OyAvLyBGZWVscyBsaWtlIGNoZWF0aW5nXG5cdFx0XHRcdCQobm9kZSkuY3NzKCdmb250LXdlaWdodCcsICdub3JtYWwnKS5jc3MoJ2NvbG9yJywgJ2RhcmtncmF5Jyk7XG5cdFx0XHR9KTtcblx0fTtcblx0VHdpbmtsZS5mbHVmZi5yZXZlcnQgPSAodHlwZSwgdmFuZGFsLCByZXYsIHBhZ2UpID0+IHtcblx0XHRpZiAobXcudXRpbC5pc0lQdjZBZGRyZXNzKHZhbmRhbCkpIHtcblx0XHRcdHZhbmRhbCA9IE1vcmViaXRzLnNhbml0aXplSVB2Nih2YW5kYWwpO1xuXHRcdH1cblx0XHRjb25zdCBwYWdlbmFtZSA9IHBhZ2UgfHwgbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdGNvbnN0IHJldmlkID0gcmV2IHx8IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpO1xuXHRcdGxldCBzdW1tYXJ5ID0gJyc7XG5cdFx0aWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdyZXZlcnRzdW1tYXJ5JylbMF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c3VtbWFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdyZXZlcnRzdW1tYXJ5JylbMF0udmFsdWU7XG5cdFx0fVxuXHRcdGlmIChUd2lua2xlLmZsdWZmLnJvbGxiYWNrSW5QbGFjZSkge1xuXHRcdFx0Y29uc3Qgbm90aWZ5U3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0bXcubm90aWZ5KG5vdGlmeVN0YXR1cywge1xuXHRcdFx0XHRhdXRvSGlkZTogZmFsc2UsXG5cdFx0XHRcdHRpdGxlOiBg5Zue6YCAJHtwYWdlfWAsXG5cdFx0XHRcdHRhZzogYHR3aW5rbGVmbHVmZl8ke3Jldn1gLCAvLyBTaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGdpdmVuIGRpc2FibGVMaW5rXG5cdFx0XHR9KTtcblxuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQobm90aWZ5U3RhdHVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWNvbnRlbnQtdGV4dCcpKTtcblx0XHRcdCRib2R5LmZpbmQoJyNjYXRsaW5rcycpLnJlbW92ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHR0eXBlLFxuXHRcdFx0dXNlcjogdmFuZGFsLFxuXHRcdFx0dXNlckhpZGRlbjogIXZhbmRhbCxcblx0XHRcdHBhZ2VuYW1lLFxuXHRcdFx0cmV2aWQsXG5cdFx0XHRzdW1tYXJ5LFxuXHRcdH07XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRwcm9wOiBbJ2luZm8nLCAncmV2aXNpb25zJ10sXG5cdFx0XHR0aXRsZXM6IHBhZ2VuYW1lLFxuXHRcdFx0aW50ZXN0YWN0aW9uczogJ2VkaXQnLFxuXHRcdFx0cnZsaW1pdDogVHdpbmtsZS5nZXRQcmVmKCdyZXZlcnRNYXhSZXZpc2lvbnMnKSxcblx0XHRcdHJ2cHJvcDogWydpZHMnLCAndGltZXN0YW1wJywgJ3VzZXInXSxcblx0XHRcdGN1cnRpbWVzdGFtcDogJycsXG5cdFx0XHRtZXRhOiAndG9rZW5zJyxcblx0XHRcdHR5cGU6ICdjc3JmJyxcblx0XHR9O1xuXHRcdGNvbnN0IHlzYXJjaGl2ZXNfYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0d2luZG93LndnVUxTKCfmipPlj5bovoPml6nkv67orqLniYjmnKzkv6Hmga8nLCAn5oqT5Y+W6LyD5pep5L+u6KiC54mI5pys6LOH6KiKJyksXG5cdFx0XHRxdWVyeSxcblx0XHRcdFR3aW5rbGUuZmx1ZmYuY2FsbGJhY2tzLm1haW5cblx0XHQpO1xuXHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcyA9IHBhcmFtcztcblx0XHR5c2FyY2hpdmVzX2FwaS5wb3N0KCk7XG5cdH07XG5cdFR3aW5rbGUuZmx1ZmYucmV2ZXJ0VG9SZXZpc2lvbiA9IChvbGRyZXYpID0+IHtcblx0XHRsZXQgc3VtbWFyeSA9ICcnO1xuXHRcdGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgncmV2ZXJ0c3VtbWFyeScpWzBdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgncmV2ZXJ0c3VtbWFyeScpWzBdLnZhbHVlO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctY29udGVudC10ZXh0JykpO1xuXHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0cHJvcDogWydpbmZvJywgJ3JldmlzaW9ucyddLFxuXHRcdFx0dGl0bGVzOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRydmxpbWl0OiAxLFxuXHRcdFx0cnZzdGFydGlkOiBvbGRyZXYsXG5cdFx0XHRydnByb3A6IFsnaWRzJywgJ3VzZXInXSxcblx0XHRcdGZvcm1hdDogJ3htbCcsXG5cdFx0XHRjdXJ0aW1lc3RhbXA6ICcnLFxuXHRcdFx0bWV0YTogJ3Rva2VucycsXG5cdFx0XHR0eXBlOiAnY3NyZicsXG5cdFx0fTtcblx0XHRjb25zdCB5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdHdpbmRvdy53Z1VMUygn5oqT5Y+W6L6D5pep5L+u6K6i54mI5pys5L+h5oGvJywgJ+aKk+WPlui8g+aXqeS/ruiogueJiOacrOizh+ioiicpLFxuXHRcdFx0cXVlcnksXG5cdFx0XHRUd2lua2xlLmZsdWZmLmNhbGxiYWNrcy50b1JldmlzaW9uXG5cdFx0KTtcblx0XHR5c2FyY2hpdmVzX2FwaS5wYXJhbXMgPSB7XG5cdFx0XHRyZXY6IG9sZHJldixcblx0XHRcdHN1bW1hcnksXG5cdFx0fTtcblx0XHR5c2FyY2hpdmVzX2FwaS5wb3N0KCk7XG5cdH07XG5cdFR3aW5rbGUuZmx1ZmYuY2FsbGJhY2tzID0ge1xuXHRcdHRvUmV2aXNpb246IChhcGlvYmopID0+IHtcblx0XHRcdGNvbnN0IHhtbERvYyA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdGNvbnN0IGxhc3RyZXZpZCA9IE51bWJlci5wYXJzZUludCgkKHhtbERvYykuZmluZCgncGFnZScpLmF0dHIoJ2xhc3RyZXZpZCcpLCAxMCk7XG5cdFx0XHRjb25zdCB0b3VjaGVkID0gJCh4bWxEb2MpLmZpbmQoJ3BhZ2UnKS5hdHRyKCd0b3VjaGVkJyk7XG5cdFx0XHRjb25zdCBsb2FkdGltZXN0YW1wID0gJCh4bWxEb2MpLmZpbmQoJ2FwaScpLmF0dHIoJ2N1cnRpbWVzdGFtcCcpO1xuXHRcdFx0Y29uc3QgY3NyZnRva2VuID0gJCh4bWxEb2MpLmZpbmQoJ3Rva2VucycpLmF0dHIoJ2NzcmZ0b2tlbicpO1xuXHRcdFx0Y29uc3QgcmV2ZXJ0VG9SZXZJRCA9IE51bWJlci5wYXJzZUludCgkKHhtbERvYykuZmluZCgncmV2JykuYXR0cigncmV2aWQnKSwgMTApO1xuXHRcdFx0Y29uc3QgcmV2ZXJ0VG9Vc2VyID0gJCh4bWxEb2MpLmZpbmQoJ3JldicpLmF0dHIoJ3VzZXInKTtcblx0XHRcdGNvbnN0IHJldmVydFRvVXNlckhpZGRlbiA9IHR5cGVvZiAkKHhtbERvYykuZmluZCgncmV2JykuYXR0cigndXNlcmhpZGRlbicpID09PSAnc3RyaW5nJztcblx0XHRcdGlmIChyZXZlcnRUb1JldklEICE9PSBhcGlvYmoucGFyYW1zLnJldikge1xuXHRcdFx0XHRhcGlvYmouc3RhdGVsZW0uZXJyb3IoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aKk+WPluWIsOeahOS/ruiuoueJiOacrOS4juivt+axgueahOS/ruiuoueJiOacrOS4jeespu+8jOWPlua2iOOAgicsXG5cdFx0XHRcdFx0XHQn5oqT5Y+W5Yiw55qE5L+u6KiC54mI5pys6IiH6KuL5rGC55qE5L+u6KiC54mI5pys5LiN56ym77yM5Y+W5raI44CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3B0aW9uYWxfc3VtbWFyeSA9IHByb21wdChcblx0XHRcdFx0YCR7d2luZG93LndnVUxTKCfor7fovpPlhaXlm57pgIDnkIbnlLHvvJonLCAn6KuL6Ly45YWl5Zue6YCA55CG55Sx77yaJyl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLFxuXHRcdFx0XHRhcGlvYmoucGFyYW1zLnN1bW1hcnlcblx0XHRcdCk7IC8vIHBhZGRlZCBvdXQgdG8gd2lkZW4gcHJvbXB0IGluIEZpcmVmb3hcblx0XHRcdGlmIChvcHRpb25hbF9zdW1tYXJ5ID09PSBudWxsKSB7XG5cdFx0XHRcdGFwaW9iai5zdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+eUseeUqOaIt+WPlua2iOOAgicsICfnlLHkvb/nlKjogIXlj5bmtojjgIInKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHN1bW1hcnkgPSBUd2lua2xlLmZsdWZmLmZvcm1hdFN1bW1hcnkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5Zue6YCA5Yiw55SxJFVTRVLlgZrlh7rnmoTkv67orqLniYjmnKwnLCAn5Zue6YCA5Yiw55SxJFVTRVLlgZrlh7rnmoTkv67oqILniYjmnKwnKSArIHJldmVydFRvUmV2SUQsXG5cdFx0XHRcdHJldmVydFRvVXNlckhpZGRlbiA/IG51bGwgOiByZXZlcnRUb1VzZXIsXG5cdFx0XHRcdG9wdGlvbmFsX3N1bW1hcnlcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdFx0YWN0aW9uOiAnZWRpdCcsXG5cdFx0XHRcdHRpdGxlOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG5cdFx0XHRcdHN1bW1hcnksXG5cdFx0XHRcdHRhZ3M6IFR3aW5rbGUuY2hhbmdlVGFncyxcblx0XHRcdFx0dG9rZW46IGNzcmZ0b2tlbixcblx0XHRcdFx0dW5kbzogbGFzdHJldmlkLFxuXHRcdFx0XHR1bmRvYWZ0ZXI6IHJldmVydFRvUmV2SUQsXG5cdFx0XHRcdGJhc2V0aW1lc3RhbXA6IHRvdWNoZWQsXG5cdFx0XHRcdHN0YXJ0dGltZXN0YW1wOiBsb2FkdGltZXN0YW1wLFxuXHRcdFx0XHRtaW5vcjogVHdpbmtsZS5nZXRQcmVmKCdtYXJrUmV2ZXJ0ZWRQYWdlc0FzTWlub3InKS5pbmNsdWRlcygndG9yZXYnKSA/IHRydWUgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGJvdDogdHJ1ZSxcblx0XHRcdH07XG5cdFx0XHQvLyBIYW5kbGUgd2F0Y2hpbmcsIHBvc3NpYmxlIGV4cGlyeVxuXHRcdFx0aWYgKFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hSZXZlcnRlZFBhZ2VzJykuaW5jbHVkZXMoJ3RvcmV2JykpIHtcblx0XHRcdFx0Y29uc3Qgd2F0Y2hPckV4cGlyeSA9IFR3aW5rbGUuZ2V0UHJlZignd2F0Y2hSZXZlcnRlZEV4cGlyeScpO1xuXHRcdFx0XHRpZiAoIXdhdGNoT3JFeHBpcnkgfHwgd2F0Y2hPckV4cGlyeSA9PT0gJ25vJykge1xuXHRcdFx0XHRcdHF1ZXJ5LndhdGNobGlzdCA9ICdub2NoYW5nZSc7XG5cdFx0XHRcdH0gZWxzZSBpZiAod2F0Y2hPckV4cGlyeSA9PT0gJ2RlZmF1bHQnIHx8IHdhdGNoT3JFeHBpcnkgPT09ICdwcmVmZXJlbmNlcycpIHtcblx0XHRcdFx0XHRxdWVyeS53YXRjaGxpc3QgPSAncHJlZmVyZW5jZXMnO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXJ5LndhdGNobGlzdCA9ICd3YXRjaCc7XG5cdFx0XHRcdFx0Ly8gbnVtYmVyIGFsbG93ZWQgYnV0IG5vdCB1c2VkIGluIFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB3YXRjaE9yRXhwaXJ5ID09PSAnc3RyaW5nJyAmJiB3YXRjaE9yRXhwaXJ5ICE9PSAneWVzJykge1xuXHRcdFx0XHRcdFx0cXVlcnkud2F0Y2hsaXN0ZXhwaXJ5ID0gd2F0Y2hPckV4cGlyeTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLnJlZGlyZWN0ID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gJ+WbnumAgOWujOaIkCc7XG5cdFx0XHRjb25zdCB5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0d2luZG93LndnVUxTKCfkv53lrZjlm57pgIDlhoXlrrknLCAn5YSy5a2Y5Zue6YCA5YWn5a65JyksXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRUd2lua2xlLmZsdWZmLmNhbGxiYWNrcy5jb21wbGV0ZSxcblx0XHRcdFx0YXBpb2JqLnN0YXRlbGVtXG5cdFx0XHQpO1xuXHRcdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zID0gYXBpb2JqLnBhcmFtcztcblx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0XHR9LFxuXHRcdG1haW46IChhcGlvYmopID0+IHtcblx0XHRcdGNvbnN0IHhtbERvYyA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdGlmICgkKHhtbERvYykuZmluZCgnYWN0aW9ucycpLmF0dHIoJ2VkaXQnKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGFwaW9iai5zdGF0ZWxlbS5lcnJvcihcIlVuYWJsZSB0byBlZGl0IHRoZSBwYWdlLCBpdCdzIHByb2JhYmx5IHByb3RlY3RlZC5cIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGxhc3RyZXZpZCA9IE51bWJlci5wYXJzZUludCgkKHhtbERvYykuZmluZCgncGFnZScpLmF0dHIoJ2xhc3RyZXZpZCcpLCAxMCk7XG5cdFx0XHRjb25zdCB0b3VjaGVkID0gJCh4bWxEb2MpLmZpbmQoJ3BhZ2UnKS5hdHRyKCd0b3VjaGVkJyk7XG5cdFx0XHRjb25zdCBsb2FkdGltZXN0YW1wID0gJCh4bWxEb2MpLmZpbmQoJ2FwaScpLmF0dHIoJ2N1cnRpbWVzdGFtcCcpO1xuXHRcdFx0Y29uc3QgY3NyZnRva2VuID0gJCh4bWxEb2MpLmZpbmQoJ3Rva2VucycpLmF0dHIoJ2NzcmZ0b2tlbicpO1xuXHRcdFx0Y29uc3QgcmV2cyA9ICQoeG1sRG9jKS5maW5kKCdyZXYnKTtcblx0XHRcdGNvbnN0IHtzdGF0ZWxlbX0gPSBhcGlvYmo7XG5cdFx0XHRjb25zdCB7cGFyYW1zfSA9IGFwaW9iajtcblx0XHRcdGlmIChyZXZzLmxlbmd0aCA8IDEpIHtcblx0XHRcdFx0c3RhdGVsZW0uZXJyb3Iod2luZG93LndnVUxTKCfmsqHmnInlhbblroPkv67orqLniYjmnKzvvIzml6Dms5Xlm57pgIAnLCAn5rKS5pyJ5YW25a6D5L+u6KiC54mI5pys77yM54Sh5rOV5Zue6YCAJykpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBbdG9wXSA9IHJldnM7XG5cdFx0XHRjb25zdCBsYXN0dXNlciA9IHRvcC5nZXRBdHRyaWJ1dGUoJ3VzZXInKTtcblx0XHRcdGlmIChsYXN0cmV2aWQgPCBwYXJhbXMucmV2aWQpIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmVycm9yKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6ZSZ6K+vJywgJ+mMr+iqpCcpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0J+S7juacjeWKoeWZqOiOt+WPlueahOacgOaWsOS/ruiuoueJiOacrElEICcsXG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCBsYXN0cmV2aWQpLFxuXHRcdFx0XHRcdFx0XHQnIOWwj+S6juebruWJjeaJgOaYvuekuueahOS/ruiuoueJiOacrElE44CC6L+Z5Y+v6IO95oSP5ZGz552A5b2T5YmN5L+u6K6i54mI5pys5bey6KKr5Yig6Zmk44CB5pyN5Yqh5Zmo5bu26L+f44CB5oiW5oqT5Y+W5Yiw5LqG5Z2P5o6J55qE5L+h5oGv44CC5Y+W5raI44CCJyxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdCflvp7kvLrmnI3lmajlj5blvpfnmoTmnIDmlrDkv67oqILniYjmnKxJRCAnLFxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHJldmlkKSxcblx0XHRcdFx0XHRcdFx0JyDlsI/mlrznm67liY3miYDpoa/npLrnmoTkv67oqILniYjmnKxJROOAgumAmeWPr+iDveaEj+WRs+iRl+eVtuWJjeS/ruiogueJiOacrOW3suiiq+WIqumZpOOAgeS8uuacjeWZqOW7tumBsuOAgeaIluaTt+WPluWIsOS6huWjnuaOieeahOizh+ioiuOAguWPlua2iOOAgicsXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBVc2VkIGZvciB1c2VyLWZhY2luZyBhbGVydHMsIG1lc3NhZ2VzLCBldGMuLCBub3QgZWRpdHMgb3Igc3VtbWFyaWVzXG5cdFx0XHRsZXQgdXNlck5vcm0gPSBwYXJhbXMudXNlciB8fCBUd2lua2xlLmZsdWZmLmhpZGRlbk5hbWU7XG5cdFx0XHRsZXQgaW5kZXggPSAxO1xuXHRcdFx0aWYgKHBhcmFtcy5yZXZpZCA9PT0gbGFzdHJldmlkKSB7XG5cdFx0XHRcdC8vIEV4cGVjdGVkIHJldmlzaW9uIGlzIHRoZSBzYW1lLCBzbyB0aGUgdXNlcnMgbXVzdCBtYXRjaDtcblx0XHRcdFx0Ly8gdGhpcyBhbGxvd3Mgc3lzb3BzIHRvIGtub3cgd2hldGhlciB0aGUgdXNlcnMgYXJlIHRoZSBzYW1lXG5cdFx0XHRcdHBhcmFtcy51c2VyID0gbGFzdHVzZXI7XG5cdFx0XHRcdHVzZXJOb3JtID0gcGFyYW1zLnVzZXIgfHwgVHdpbmtsZS5mbHVmZi5oaWRkZW5OYW1lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdFx0J+itpuWRiicsXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHQn5pyA5paw5L+u6K6i54mI5pysICcsXG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCBsYXN0cmV2aWQpLFxuXHRcdFx0XHRcdFx0XHQnIOS4juaIkeS7rOeahOS/ruiuoueJiOacrCAnLFxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgcGFyYW1zLnJldmlkKSxcblx0XHRcdFx0XHRcdFx0J+S4jeWQjCcsXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHQn5pyA5paw5L+u6KiC54mI5pysICcsXG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCBsYXN0cmV2aWQpLFxuXHRcdFx0XHRcdFx0XHQnIOiIh+aIkeWAkeeahOS/ruiogueJiOacrCAnLFxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgcGFyYW1zLnJldmlkKSxcblx0XHRcdFx0XHRcdFx0JyDkuI3lkIwnLFxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGxhc3R1c2VyID09PSBwYXJhbXMudXNlcikge1xuXHRcdFx0XHRcdHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ3ZhbmQnOlxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuaW5mbyh3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSwgW1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyA5paw5L+u6K6i54mI5pys55SxICcsICfmnIDmlrDkv67oqILniYjmnKznlLEgJyksXG5cdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHVzZXJOb3JtKSxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQnIOWBmuWHuu+8jOWboOaIkeS7rOWBh+WumuegtOWdj++8jOe7p+e7reWbnumAgOaTjeS9nOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0XHQnIOWBmuWHuu+8jOWboOaIkeWAkeWBh+WumuegtOWjnu+8jOe5vOe6jOWbnumAgOaTjeS9nOOAgidcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybign5o+Q56S6JywgW1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyA5paw5L+u6K6i54mI5pys55SxICcsICfmnIDmlrDkv67oqILniYjmnKznlLEgJyksXG5cdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHVzZXJOb3JtKSxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJyDlgZrlh7rvvIzkvYbmiJHku6zov5jmmK/kuI3lm57pgIDkuobjgIInLCAnIOWBmuWHuu+8jOS9huaIkeWAkemChOaYr+S4jeWbnumAgOS6huOAgicpLFxuXHRcdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRwYXJhbXMudHlwZSA9PT0gJ3ZhbmQnICYmIC8vIE9rYXkgdG8gdGVzdCBvbiB1c2VyIHNpbmNlIGl0IHdpbGwgZWl0aGVyIGZhaWwgb3Igc3lzb3Agd2lsbCBjb3JyZWN0bHkgYWNjZXNzIGl0XG5cdFx0XHRcdFx0Ly8gQmVzaWRlcywgbm9uZSBvZiB0aGUgdHJ1c3RlZCBib3RzIGFyZSBnb2luZyB0byBiZSByZXZkZWwnZFxuXHRcdFx0XHRcdFR3aW5rbGUuZmx1ZmYudHJ1c3RlZEJvdHMuaW5jbHVkZXModG9wLmdldEF0dHJpYnV0ZSgndXNlcicpKSAmJlxuXHRcdFx0XHRcdHJldnMubGVuZ3RoID4gMSAmJlxuXHRcdFx0XHRcdHJldnNbMV0uZ2V0QXR0cmlidXRlKCdyZXZpZCcpID09PSBwYXJhbXMucmV2aWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8oXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S/oeaBrycsICfos4foqIonKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdCfmnIDmlrDkv67orqLniYjmnKznlLEgJyxcblx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHVzZXIpLFxuXHRcdFx0XHRcdFx0XHRcdCfvvIzkuIDkuKrlj6/kv6HnmoTmnLrlmajkurrlgZrlh7rvvIzkvYbkuYvliY3nmoTniYjmnKzooqvorqTkuLrmmK/noLTlnY/vvIznu6fnu63lm57pgIDmk43kvZzjgIInLFxuXHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0J+acgOaWsOS/ruiogueJiOacrOeUsSAnLFxuXHRcdFx0XHRcdFx0XHRcdE1vcmViaXRzLmh0bWxOb2RlKCdzdHJvbmcnLCBsYXN0dXNlciksXG5cdFx0XHRcdFx0XHRcdFx0J++8jOS4gOWAi+WPr+S/oeeahOapn+WZqOS6uuWBmuWHuu+8jOS9huS5i+WJjeeahOeJiOacrOiiq+iqjeeCuuaYr+egtOWjnu+8jOe5vOe6jOWbnumAgOaTjeS9nOOAgicsXG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGluZGV4ID0gMjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuZXJyb3IoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+mUmeivrycsICfpjK/oqqQnKSxcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdCfmnIDmlrDkv67orqLniYjmnKznlLEgJyxcblx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHVzZXIpLFxuXHRcdFx0XHRcdFx0XHRcdCcg5YGa5Ye677yM5omA5Lul6L+Z5Liq5L+u6K6i54mI5pys5Y+v6IO95bey57uP6KKr5Zue6YCA5LqG77yM5Y+W5raI5Zue6YCA5pON5L2c44CCJyxcblx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0XHRcdCfmnIDmlrDkv67oqILniYjmnKznlLEgJyxcblx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgbGFzdHVzZXIpLFxuXHRcdFx0XHRcdFx0XHRcdCcg5YGa5Ye677yM5omA5Lul6YCZ5YCL5L+u6KiC54mI5pys5Y+v6IO95bey57aT6KKr5Zue6YCA5LqG77yM5Y+W5raI5Zue6YCA5pON5L2c44CCJyxcblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoVHdpbmtsZS5mbHVmZi50cnVzdGVkQm90cy5pbmNsdWRlcyhwYXJhbXMudXNlcikpIHtcblx0XHRcdFx0c3dpdGNoIChwYXJhbXMudHlwZSkge1xuXHRcdFx0XHRcdGNhc2UgJ3ZhbmQnOlxuXHRcdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8od2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksIFtcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflsIblr7kgJywgJ+Wwh+WwjSAnKSxcblx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHVzZXJOb3JtKSxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCcg5omn6KGM56C05Z2P5Zue6YCA77yM6L+Z5piv5LiA5Liq5Y+v5L+h55qE5py65Zmo5Lq677yM5oiR5Lus5YGH5a6a5oKo6KaB5Zue6YCA5YmN5LiA5Liq5L+u6K6i54mI5pys44CCJyxcblx0XHRcdFx0XHRcdFx0XHQnIOWft+ihjOegtOWjnuWbnumAgO+8jOmAmeaYr+S4gOWAi+WPr+S/oeeahOapn+WZqOS6uu+8jOaIkeWAkeWBh+WumuaCqOimgeWbnumAgOWJjeS4gOWAi+S/ruiogueJiOacrOOAgidcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdF0pO1xuXHRcdFx0XHRcdFx0aW5kZXggPSAyO1xuXHRcdFx0XHRcdFx0cGFyYW1zLnVzZXIgPSByZXZzWzFdLmdldEF0dHJpYnV0ZSgndXNlcicpO1xuXHRcdFx0XHRcdFx0cGFyYW1zLnVzZXJIaWRkZW4gPSByZXZzWzFdLmdldEF0dHJpYnV0ZSgndXNlcmhpZGRlbicpID09PSAnJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdC8qIGNhc2UgJ25vcm0nOiAqL1xuXHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb250ID0gY29uZmlybShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfpgInmi6nkuobluLjop4Tlm57pgIDvvIzkvYbmnIDmlrDkv67mlLnmmK/nlLHkuIDkuKrlj6/kv6HnmoTmnLrlmajkurrvvIgnLFxuXHRcdFx0XHRcdFx0XHRcdCfpgbjmk4fkuobluLjopo/lm57pgIDvvIzkvYbmnIDmlrDkv67mlLnmmK/nlLHkuIDlgIvlj6/kv6HnmoTmqZ/lmajkurrvvIgnXG5cdFx0XHRcdFx0XHRcdCkgK1xuXHRcdFx0XHRcdFx0XHRcdHVzZXJOb3JtICtcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQn77yJ5YGa5Ye655qE44CC56Gu5a6a5Lul5Zue6YCA5YmN5LiA5Liq5L+u6K6i54mI5pys77yM5Y+W5raI5Lul5Zue6YCA5py65Zmo5Lq655qE5L+u5pS5Jyxcblx0XHRcdFx0XHRcdFx0XHRcdCfvvInlgZrlh7rnmoTjgILnorrlrprku6Xlm57pgIDliY3kuIDlgIvkv67oqILniYjmnKzvvIzlj5bmtojku6Xlm57pgIDmqZ/lmajkurrnmoTkv67mlLknXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGlmIChjb250KSB7XG5cdFx0XHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKHdpbmRvdy53Z1VMUygn5L+h5oGvJywgJ+izh+ioiicpLCBbXG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflsIblr7kgJywgJ+Wwh+WwjSAnKSxcblx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgdXNlck5vcm0pLFxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCcg5omn6KGM5bi46KeE5Zue6YCA77yM6L+Z5piv5LiA5Liq5Y+v5L+h55qE5py65Zmo5Lq677yM5Z+65LqO56Gu6K6k77yM5oiR5Lus5bCG5Zue6YCA5YmN5LiA5Liq5L+u6K6i54mI5pys44CCJyxcblx0XHRcdFx0XHRcdFx0XHRcdCcg5Z+36KGM5bi46KaP5Zue6YCA77yM6YCZ5piv5LiA5YCL5Y+v5L+h55qE5qmf5Zmo5Lq677yM5Z+65pa856K66KqN77yM5oiR5YCR5bCH5Zue6YCA5YmN5LiA5YCL5L+u6KiC54mI5pys44CCJ1xuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdF0pO1xuXHRcdFx0XHRcdFx0XHRpbmRleCA9IDI7XG5cdFx0XHRcdFx0XHRcdHBhcmFtcy51c2VyID0gcmV2c1sxXS5nZXRBdHRyaWJ1dGUoJ3VzZXInKTtcblx0XHRcdFx0XHRcdFx0cGFyYW1zLnVzZXJIaWRkZW4gPSByZXZzWzFdLmdldEF0dHJpYnV0ZSgndXNlcmhpZGRlbicpID09PSAnJztcblx0XHRcdFx0XHRcdFx0dXNlck5vcm0gPSBwYXJhbXMudXNlciB8fCBUd2lua2xlLmZsdWZmLmhpZGRlbk5hbWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybign5o+Q56S6JywgW1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5bCG5a+5ICcsICflsIflsI0gJyksXG5cdFx0XHRcdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHVzZXJOb3JtKSxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHQnIOaJp+ihjOW4uOinhOWbnumAgO+8jOi/meaYr+S4gOS4quWPr+S/oeeahOacuuWZqOS6uu+8jOWfuuS6juehruiupO+8jOaIkeS7rOS7jeWwhuWbnumAgOi/meS4quS/ruiuoueJiOacrOOAgicsXG5cdFx0XHRcdFx0XHRcdFx0XHQnIOWft+ihjOW4uOimj+WbnumAgO+8jOmAmeaYr+S4gOWAi+WPr+S/oeeahOapn+WZqOS6uu+8jOWfuuaWvOeiuuiqje+8jOaIkeWAkeS7jeWwh+WbnumAgOmAmeWAi+S/ruiogueJiOacrOOAgidcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV0IGZvdW5kID0gZmFsc2U7XG5cdFx0XHRsZXQgY291bnQgPSAwO1xuXHRcdFx0Zm9yIChsZXQgaSA9IGluZGV4OyBpIDwgcmV2cy5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHQrK2NvdW50O1xuXHRcdFx0XHRpZiAocmV2c1tpXS5nZXRBdHRyaWJ1dGUoJ3VzZXInKSAhPT0gcGFyYW1zLnVzZXIpIHtcblx0XHRcdFx0XHRmb3VuZCA9IGk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghZm91bmQpIHtcblx0XHRcdFx0c3RhdGVsZW0uZXJyb3IoW1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyq5om+5Yiw5LmL5YmN55qE5L+u6K6i54mI5pys77yM5Y+v6IO9ICcsICfmnKrmib7liLDkuYvliY3nmoTkv67oqILniYjmnKzvvIzlj6/og70gJyksXG5cdFx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIHVzZXJOb3JtKSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQnIOaYr+WUr+S4gOi0oeeMruiAhe+8jOaIlui/meS4queUqOaIt+i/nue7reWBmuWHuuS6hui2hei/hyAnLFxuXHRcdFx0XHRcdFx0JyDmmK/llK/kuIDosqLnjbvogIXvvIzmiJbpgJnlgIvnlKjmiLbpgKPnuozlgZrlh7rkuobotoXpgY4gJ1xuXHRcdFx0XHRcdCkgK1xuXHRcdFx0XHRcdFx0bXcubGFuZ3VhZ2UuY29udmVydE51bWJlcihUd2lua2xlLmdldFByZWYoJ3JldmVydE1heFJldmlzaW9ucycpKSArXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJyDmrKHnvJbovpHjgIInLCAnIOasoee3qOi8r+OAgicpLFxuXHRcdFx0XHRdKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFjb3VudCkge1xuXHRcdFx0XHRNb3JlYml0cy5zdGF0dXMuZXJyb3IoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfplJnor68nLCAn6Yyv6KqkJyksXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aIkeS7rOWwhuimgeWbnumAgDDkuKrkv67orqLniYjmnKzvvIzov5nmsqHmnInmhI/kuYnvvIzmiYDku6Xlj5bmtojlm57pgIDmk43kvZzjgILlj6/og73mmK/lm6DkuLrov5nkuKrkv67orqLniYjmnKzlt7Lnu4/ooqvlm57pgIDvvIzkvYbkv67orqLniYjmnKxJROS7jeaYr+S4gOagt+eahOOAgicsXG5cdFx0XHRcdFx0XHQn5oiR5YCR5bCH6KaB5Zue6YCAMOWAi+S/ruiogueJiOacrO+8jOmAmeaykuacieaEj+e+qe+8jOaJgOS7peWPlua2iOWbnumAgOaTjeS9nOOAguWPr+iDveaYr+WboOeCuumAmeWAi+S/ruiogueJiOacrOW3sue2k+iiq+WbnumAgO+8jOS9huS/ruiogueJiOacrElE5LuN5piv5LiA5qij55qE44CCJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZ29vZF9yZXZpc2lvbiA9IHJldnNbZm91bmRdO1xuXHRcdFx0bGV0IHVzZXJIYXNBbHJlYWR5Q29uZmlybWVkQWN0aW9uID0gZmFsc2U7XG5cdFx0XHRpZiAocGFyYW1zLnR5cGUgIT09ICd2YW5kJyAmJiBjb3VudCA+IDEpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHRcdFx0dXNlck5vcm0gK1xuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJyDov57nu63lgZrlh7rkuoYgJywgJyDpgKPnuozlgZrlh7rkuoYgJykgK1xuXHRcdFx0XHRcdFx0XHRtdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKGNvdW50KSArXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOasoee8lui+ke+8jOaYr+WQpuimgeWFqOmDqOWbnumAgO+8nycsICcg5qyh57eo6Lyv77yM5piv5ZCm6KaB5YWo6YOo5Zue6YCA77yfJylcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1vcmViaXRzLnN0YXR1cy5pbmZvKCfmj5DnpLonLCB3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nCcsICfkvb/nlKjogIXlj5bmtojmk43kvZwnKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHVzZXJIYXNBbHJlYWR5Q29uZmlybWVkQWN0aW9uID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhcmFtcy5jb3VudCA9IGNvdW50O1xuXHRcdFx0cGFyYW1zLmdvb2RpZCA9IGdvb2RfcmV2aXNpb24uZ2V0QXR0cmlidXRlKCdyZXZpZCcpO1xuXHRcdFx0cGFyYW1zLmdvb2R1c2VyID0gZ29vZF9yZXZpc2lvbi5nZXRBdHRyaWJ1dGUoJ3VzZXInKTtcblx0XHRcdHBhcmFtcy5nb29kdXNlckhpZGRlbiA9IGdvb2RfcmV2aXNpb24uZ2V0QXR0cmlidXRlKCd1c2VyaGlkZGVuJykgPT09ICcnO1xuXHRcdFx0c3RhdGVsZW0uc3RhdHVzKFtcblx0XHRcdFx0TW9yZWJpdHMuaHRtbE5vZGUoJ3N0cm9uZycsIG13Lmxhbmd1YWdlLmNvbnZlcnROdW1iZXIoY291bnQpKSxcblx0XHRcdFx0d2luZG93LndnVUxTKCcg5Liq5L+u6K6i54mI5pys5LmL5YmN55SxICcsICcg5YCL5L+u6KiC54mI5pys5LmL5YmN55SxICcpLFxuXHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgcGFyYW1zLmdvb2R1c2VySGlkZGVuID8gVHdpbmtsZS5mbHVmZi5oaWRkZW5OYW1lIDogcGFyYW1zLmdvb2R1c2VyKSxcblx0XHRcdFx0d2luZG93LndnVUxTKCcg5YGa5Ye655qE5L+u6K6i54mI5pysICcsICcg5YGa5Ye655qE5L+u6KiC54mI5pysICcpLFxuXHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgcGFyYW1zLmdvb2RpZCksXG5cdFx0XHRdKTtcblx0XHRcdGxldCBzdW1tYXJ5O1xuXHRcdFx0bGV0IGV4dHJhX3N1bW1hcnk7XG5cdFx0XHRzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ3ZhbmQnOlxuXHRcdFx0XHRcdHN1bW1hcnkgPSBUd2lua2xlLmZsdWZmLmZvcm1hdFN1bW1hcnkoXG5cdFx0XHRcdFx0XHRg5Zue6YCAJFVTRVLlgZrlh7rnmoQke3BhcmFtcy5jb3VudH0ke3dpbmRvdy53Z1VMUygn5qyh57yW6L6R77yM5Yiw55SxJywgJ+asoee3qOi8r++8jOWIsOeUsScpfSR7XG5cdFx0XHRcdFx0XHRcdHBhcmFtcy5nb29kdXNlckhpZGRlbiA/IFR3aW5rbGUuZmx1ZmYuaGlkZGVuTmFtZSA6IHBhcmFtcy5nb29kdXNlclxuXHRcdFx0XHRcdFx0fSR7d2luZG93LndnVUxTKCflgZrlh7rnmoTmnIDlkI7kv67orqLniYjmnKwgJywgJ+WBmuWHuueahOacgOW+jOS/ruiogueJiOacrCAnKX1gLFxuXHRcdFx0XHRcdFx0cGFyYW1zLnVzZXJIaWRkZW4gPyBudWxsIDogcGFyYW1zLnVzZXJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHQvKiBjYXNlICdub3JtJzogKi9cblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ29mZmVyUmVhc29uT25Ob3JtYWxSZXZlcnQnKSkge1xuXHRcdFx0XHRcdFx0ZXh0cmFfc3VtbWFyeSA9IHByb21wdChcblx0XHRcdFx0XHRcdFx0YCR7d2luZG93LndnVUxTKCflj6/pgInnmoTnvJbovpHmkZjopoHvvJonLCAn5Y+v6YG455qE57eo6Lyv5pGY6KaB77yaJyl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCxcblx0XHRcdFx0XHRcdFx0cGFyYW1zLnN1bW1hcnlcblx0XHRcdFx0XHRcdCk7IC8vIHBhZGRlZCBvdXQgdG8gd2lkZW4gcHJvbXB0IGluIEZpcmVmb3hcblx0XHRcdFx0XHRcdGlmIChleHRyYV9zdW1tYXJ5ID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdHN0YXRlbGVtLmVycm9yKHdpbmRvdy53Z1VMUygn55So5oi35Y+W5raI5pON5L2c44CCJywgJ+S9v+eUqOiAheWPlua2iOaTjeS9nOOAgicpKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dXNlckhhc0FscmVhZHlDb25maXJtZWRBY3Rpb24gPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdW1tYXJ5ID0gVHdpbmtsZS5mbHVmZi5mb3JtYXRTdW1tYXJ5KFxuXHRcdFx0XHRcdFx0YOWbnumAgCRVU0VS5YGa5Ye655qEJHtwYXJhbXMuY291bnR9JHt3aW5kb3cud2dVTFMoJ+asoee8lui+kScsICfmrKHnt6jovK8nKX1gLFxuXHRcdFx0XHRcdFx0cGFyYW1zLnVzZXJIaWRkZW4gPyBudWxsIDogcGFyYW1zLnVzZXIsXG5cdFx0XHRcdFx0XHRleHRyYV9zdW1tYXJ5XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0VHdpbmtsZS5nZXRQcmVmKCdjb25maXJtT25GbHVmZicpICYmXG5cdFx0XHRcdCF1c2VySGFzQWxyZWFkeUNvbmZpcm1lZEFjdGlvbiAmJlxuXHRcdFx0XHQhY29uZmlybSh3aW5kb3cud2dVTFMoJ+WbnumAgOmhtemdou+8muaCqOehruWumuWQl++8nycsICflm57pgIDpoIHpnaLvvJrmgqjnorrlrprll47vvJ8nKSlcblx0XHRcdCkge1xuXHRcdFx0XHRzdGF0ZWxlbS5lcnJvcih3aW5kb3cud2dVTFMoJ+eUqOaIt+WPlua2iOaTjeS9nOOAgicsICfkvb/nlKjogIXlj5bmtojmk43kvZzjgIInKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIERlY2lkZSB3aGV0aGVyIHRvIG5vdGlmeSB0aGUgdXNlciBvbiBzdWNjZXNzXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFUd2lua2xlLmZsdWZmLnNraXBUYWxrICYmXG5cdFx0XHRcdFR3aW5rbGUuZ2V0UHJlZignb3BlblRhbGtQYWdlJykuaW5jbHVkZXMocGFyYW1zLnR5cGUpICYmXG5cdFx0XHRcdCFwYXJhbXMudXNlckhpZGRlbiAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgIT09IHBhcmFtcy51c2VyXG5cdFx0XHQpIHtcblx0XHRcdFx0cGFyYW1zLm5vdGlmeVVzZXIgPSB0cnVlO1xuXHRcdFx0XHQvLyBQYXNzIGFsb25nIHRvIHRoZSB3YXJuIG1vZHVsZVxuXHRcdFx0XHRwYXJhbXMudmFudGltZXN0YW1wID0gdG9wLmdldEF0dHJpYnV0ZSgndGltZXN0YW1wJyk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBxdWVyeSA9IHtcblx0XHRcdFx0YWN0aW9uOiAnZWRpdCcsXG5cdFx0XHRcdHRpdGxlOiBwYXJhbXMucGFnZW5hbWUsXG5cdFx0XHRcdHN1bW1hcnksXG5cdFx0XHRcdHRhZ3M6IFR3aW5rbGUuY2hhbmdlVGFncyxcblx0XHRcdFx0dG9rZW46IGNzcmZ0b2tlbixcblx0XHRcdFx0dW5kbzogbGFzdHJldmlkLFxuXHRcdFx0XHR1bmRvYWZ0ZXI6IHBhcmFtcy5nb29kaWQsXG5cdFx0XHRcdGJhc2V0aW1lc3RhbXA6IHRvdWNoZWQsXG5cdFx0XHRcdHN0YXJ0dGltZXN0YW1wOiBsb2FkdGltZXN0YW1wLFxuXHRcdFx0XHRtaW5vcjogVHdpbmtsZS5nZXRQcmVmKCdtYXJrUmV2ZXJ0ZWRQYWdlc0FzTWlub3InKS5pbmNsdWRlcyhwYXJhbXMudHlwZSkgPyB0cnVlIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRib3Q6IHRydWUsXG5cdFx0XHR9O1xuXHRcdFx0Ly8gSGFuZGxlIHdhdGNoaW5nLCBwb3NzaWJsZSBleHBpcnlcblx0XHRcdGlmIChUd2lua2xlLmdldFByZWYoJ3dhdGNoUmV2ZXJ0ZWRQYWdlcycpLmluY2x1ZGVzKHBhcmFtcy50eXBlKSkge1xuXHRcdFx0XHRjb25zdCB3YXRjaE9yRXhwaXJ5ID0gVHdpbmtsZS5nZXRQcmVmKCd3YXRjaFJldmVydGVkRXhwaXJ5Jyk7XG5cdFx0XHRcdGlmICghd2F0Y2hPckV4cGlyeSB8fCB3YXRjaE9yRXhwaXJ5ID09PSAnbm8nKSB7XG5cdFx0XHRcdFx0cXVlcnkud2F0Y2hsaXN0ID0gJ25vY2hhbmdlJztcblx0XHRcdFx0fSBlbHNlIGlmICh3YXRjaE9yRXhwaXJ5ID09PSAnZGVmYXVsdCcgfHwgd2F0Y2hPckV4cGlyeSA9PT0gJ3ByZWZlcmVuY2VzJykge1xuXHRcdFx0XHRcdHF1ZXJ5LndhdGNobGlzdCA9ICdwcmVmZXJlbmNlcyc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVlcnkud2F0Y2hsaXN0ID0gJ3dhdGNoJztcblx0XHRcdFx0XHQvLyBudW1iZXIgYWxsb3dlZCBidXQgbm90IHVzZWQgaW4gVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXNcblx0XHRcdFx0XHRpZiAodHlwZW9mIHdhdGNoT3JFeHBpcnkgPT09ICdzdHJpbmcnICYmIHdhdGNoT3JFeHBpcnkgIT09ICd5ZXMnKSB7XG5cdFx0XHRcdFx0XHRxdWVyeS53YXRjaGxpc3RleHBpcnkgPSB3YXRjaE9yRXhwaXJ5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFUd2lua2xlLmZsdWZmLnJvbGxiYWNrSW5QbGFjZSkge1xuXHRcdFx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5yZWRpcmVjdCA9IHBhcmFtcy5wYWdlbmFtZTtcblx0XHRcdH1cblx0XHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9ICflm57pgIDlrozmiJAnO1xuXHRcdFx0Y29uc3QgeXNhcmNoaXZlc19hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5L+d5a2Y5Zue6YCA5YaF5a65JywgJ+WEsuWtmOWbnumAgOWFp+WuuScpLFxuXHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0VHdpbmtsZS5mbHVmZi5jYWxsYmFja3MuY29tcGxldGUsXG5cdFx0XHRcdHN0YXRlbGVtXG5cdFx0XHQpO1xuXHRcdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdFx0eXNhcmNoaXZlc19hcGkucG9zdCgpO1xuXHRcdH0sXG5cdFx0Y29tcGxldGU6IChhcGlvYmopID0+IHtcblx0XHRcdC8vIFRPRE8gTW9zdCBvZiB0aGlzIGlzIGNvcHktcGFzdGVkIGZyb20gTW9yZWJpdHMud2lraS5wYWdlI2ZuU2F2ZVN1Y2Nlc3MuIFVuaWZ5IGl0XG5cdFx0XHRjb25zdCB4bWwgPSBhcGlvYmouZ2V0WE1MKCk7XG5cdFx0XHRjb25zdCAkZWRpdCA9ICQoeG1sKS5maW5kKCdlZGl0Jyk7XG5cdFx0XHRpZiAoJCh4bWwpLmZpbmQoJ2NhcHRjaGEnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGFwaW9iai5zdGF0ZWxlbS5lcnJvcihcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+S4jeiDveWbnumAgO+8jOWboOacjeWKoeWZqOimgeaxguaCqOi+k+WFpemqjOivgeeggeOAgicsICfkuI3og73lm57pgIDvvIzlm6DkvLrmnI3lmajopoHmsYLmgqjovLjlhaXpqZforYnnorzjgIInKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmICgkZWRpdC5hdHRyKCdub2NoYW5nZScpID09PSAnJykge1xuXHRcdFx0XHRhcGlvYmouc3RhdGVsZW0uZXJyb3IoXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+imgeWbnumAgOWIsOeahOeJiOacrOS4juW9k+WJjeeJiOacrOebuOWQjO+8jOayoeS7gOS5iOimgeWBmueahCcsXG5cdFx0XHRcdFx0XHQn6KaB5Zue6YCA5Yiw55qE54mI5pys6IiH55uu5YmN54mI5pys55u45ZCM77yM5rKS5LuA6bq86KaB5YGa55qEJ1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFwaW9iai5zdGF0ZWxlbS5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0Y29uc3Qge3BhcmFtc30gPSBhcGlvYmo7XG5cdFx0XHRcdGlmIChwYXJhbXMubm90aWZ5VXNlciAmJiAhcGFyYW1zLnVzZXJIaWRkZW4pIHtcblx0XHRcdFx0XHQvLyBub3RpZnlVc2VyIG9ubHkgZnJvbSBtYWluLCBub3QgZnJvbSB0b1JldmlzaW9uXG5cdFx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLmluZm8od2luZG93LndnVUxTKCfkv6Hmga8nLCAn6LOH6KiKJyksIFtcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5byA5ZCv55So5oi3ICcsICfplovllZ/kvb/nlKjogIUgJyksXG5cdFx0XHRcdFx0XHRNb3JlYml0cy5odG1sTm9kZSgnc3Ryb25nJywgcGFyYW1zLnVzZXIpLFxuXHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCcg55qE6K6o6K666aG1JywgJyDnmoToqI7oq5bpoIEnKSxcblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRjb25zdCB3aW5kb3dRdWVyeSA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBgVXNlciB0YWxrOiR7cGFyYW1zLnVzZXJ9YCxcblx0XHRcdFx0XHRcdGFjdGlvbjogJ2VkaXQnLFxuXHRcdFx0XHRcdFx0cHJldmlldzogJ3llcycsXG5cdFx0XHRcdFx0XHR2YW5hcnRpY2xlOiBwYXJhbXMucGFnZW5hbWUucmVwbGFjZSgvXy9nLCAnICcpLFxuXHRcdFx0XHRcdFx0dmFuYXJ0aWNsZXJldmlkOiBwYXJhbXMucmV2aWQsXG5cdFx0XHRcdFx0XHR2YW50aW1lc3RhbXA6IHBhcmFtcy52YW50aW1lc3RhbXAsXG5cdFx0XHRcdFx0XHR2YW5hcnRpY2xlZ29vZHJldmlkOiBwYXJhbXMuZ29vZGlkLFxuXHRcdFx0XHRcdFx0dHlwZTogcGFyYW1zLnR5cGUsXG5cdFx0XHRcdFx0XHRjb3VudDogcGFyYW1zLmNvdW50LFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0c3dpdGNoIChUd2lua2xlLmdldFByZWYoJ3VzZXJUYWxrUGFnZU1vZGUnKSkge1xuXHRcdFx0XHRcdFx0Y2FzZSAndGFiJzpcblx0XHRcdFx0XHRcdFx0d2luZG93Lm9wZW4obXcudXRpbC5nZXRVcmwoJycsIHdpbmRvd1F1ZXJ5KSwgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJyk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnYmxhbmsnOlxuXHRcdFx0XHRcdFx0XHR3aW5kb3cub3Blbihcblx0XHRcdFx0XHRcdFx0XHRtdy51dGlsLmdldFVybCgnJywgd2luZG93UXVlcnkpLFxuXHRcdFx0XHRcdFx0XHRcdCdfYmxhbmsnLFxuXHRcdFx0XHRcdFx0XHRcdCdub29wZW5lcixub3JlZmVycmVyLGxvY2F0aW9uPW5vLHRvb2xiYXI9bm8sc3RhdHVzPW5vLGRpcmVjdG9yaWVzPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTEyMDAsaGVpZ2h0PTgwMCdcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHQvKiBjYXNlICd3aW5kb3cnOiAqL1xuXHRcdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0d2luZG93Lm9wZW4oXG5cdFx0XHRcdFx0XHRcdFx0bXcudXRpbC5nZXRVcmwoJycsIHdpbmRvd1F1ZXJ5KSxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubmFtZSA9PT0gJ3R3aW5rbGV3YXJud2luZG93JyA/ICdfYmxhbmsnIDogJ3R3aW5rbGV3YXJud2luZG93Jyxcblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cubmFtZSA9PT0gJ3R3aW5rbGV3YXJud2luZG93J1xuXHRcdFx0XHRcdFx0XHRcdFx0PyAnbm9vcGVuZXIsbm9yZWZlcnJlciwnXG5cdFx0XHRcdFx0XHRcdFx0XHQ6ICcnICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnbG9jYXRpb249bm8sdG9vbGJhcj1ubyxzdGF0dXM9bm8sZGlyZWN0b3JpZXM9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9MTIwMCxoZWlnaHQ9ODAwJ1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHR9O1xuXHQvLyBJZiBidWlsdEluU3RyaW5nIGNvbnRhaW5zIHRoZSBzdHJpbmcgXCIkVVNFUlwiLCBpdCB3aWxsIGJlIHJlcGxhY2VkXG5cdC8vIGJ5IGFuIGFwcHJvcHJpYXRlIHVzZXIgbGluayBpZiBhIHVzZXIgbmFtZSBpcyBwcm92aWRlZFxuXHRUd2lua2xlLmZsdWZmLmZvcm1hdFN1bW1hcnkgPSAoYnVpbHRJblN0cmluZywgdXNlck5hbWUsIGN1c3RvbVN0cmluZykgPT4ge1xuXHRcdGxldCByZXN1bHQgPSBidWlsdEluU3RyaW5nO1xuXHRcdC8vIGFwcGVuZCB1c2VyJ3MgY3VzdG9tIHJlYXNvblxuXHRcdGlmIChjdXN0b21TdHJpbmcpIHtcblx0XHRcdHJlc3VsdCArPSBg77yaJHtNb3JlYml0cy5zdHJpbmcudG9VcHBlckNhc2VGaXJzdENoYXIoY3VzdG9tU3RyaW5nKX1gO1xuXHRcdH1cblx0XHQvLyBmaW5kIG51bWJlciBvZiBVVEYtOCBieXRlcyB0aGUgcmVzdWx0aW5nIHN0cmluZyB0YWtlcyB1cCwgYW5kIHBvc3NpYmx5IGFkZFxuXHRcdC8vIGEgY29udHJpYnV0aW9ucyBvciBjb250cmlidXRpb25zK3RhbGsgbGluayBpZiBpdCBkb2Vzbid0IHB1c2ggdGhlIGVkaXQgc3VtbWFyeVxuXHRcdC8vIG92ZXIgdGhlIDQ5OS1ieXRlIGxpbWl0XG5cdFx0aWYgKC9cXCRVU0VSLy50ZXN0KGJ1aWx0SW5TdHJpbmcpKSB7XG5cdFx0XHRpZiAodXNlck5hbWUpIHtcblx0XHRcdFx0Y29uc3QgcmVzdWx0TGVuID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHJlc3VsdC5yZXBsYWNlKCckVVNFUicsICcnKSkpLmxlbmd0aDtcblx0XHRcdFx0Y29uc3QgY29udHJpYnNMaW5rID0gYFtbU3BlY2lhbDpDb250cmlidXRpb25zLyR7dXNlck5hbWV9fCR7dXNlck5hbWV9XV1gO1xuXHRcdFx0XHRjb25zdCBjb250cmlic0xlbiA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChjb250cmlic0xpbmspKS5sZW5ndGg7XG5cdFx0XHRcdGlmIChyZXN1bHRMZW4gKyBjb250cmlic0xlbiA8PSA0OTkpIHtcblx0XHRcdFx0XHRjb25zdCB0YWxrTGluayA9IGDvvIhbW1VzZXIgdGFsazoke3VzZXJOYW1lfSR7d2luZG93LndnVUxTKCd86K6o6K66XV3vvIknLCAnfOiojuirll1d77yJJyl9YDtcblx0XHRcdFx0XHRpZiAocmVzdWx0TGVuICsgY29udHJpYnNMZW4gKyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodGFsa0xpbmspKS5sZW5ndGggPD0gNDk5KSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSBNb3JlYml0cy5zdHJpbmcuc2FmZVJlcGxhY2UocmVzdWx0LCAnJFVTRVInLCBjb250cmlic0xpbmsgKyB0YWxrTGluayk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlc3VsdCA9IE1vcmViaXRzLnN0cmluZy5zYWZlUmVwbGFjZShyZXN1bHQsICckVVNFUicsIGNvbnRyaWJzTGluayk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc3VsdCA9IE1vcmViaXRzLnN0cmluZy5zYWZlUmVwbGFjZShyZXN1bHQsICckVVNFUicsIHVzZXJOYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0ID0gTW9yZWJpdHMuc3RyaW5nLnNhZmVSZXBsYWNlKHJlc3VsdCwgJyRVU0VSJywgVHdpbmtsZS5mbHVmZi5oaWRkZW5OYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5mbHVmZiwgJ2ZsdWZmJyk7XG59KShqUXVlcnkpO1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG5cbi8qISBUd2lua2xlLmpzIC0gdHdpbmtsZWJhdGNoZGVsZXRlLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWJhdGNoZGVsZXRlKCQpIHtcblx0Y29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XG5cdC8qKlxuXHQgKiB0d2lua2xlYmF0Y2hkZWxldGUuanM6IEJhdGNoIGRlbGV0ZSBtb2R1bGUgKHN5c29wcyBvbmx5KVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJELWJhdGNoXCIpXG5cdCAqIEFjdGl2ZSBvbjogRXhpc3Rpbmcgbm9uLWFydGljbGVzLCBhbmQgU3BlY2lhbDpQcmVmaXhJbmRleFxuXHQgKi9cblx0VHdpbmtsZS5iYXRjaGRlbGV0ZSA9ICgpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRNb3JlYml0cy51c2VySXNTeXNvcCAmJlxuXHRcdFx0KChtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSAmJiBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID4gMCkgfHxcblx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ1ByZWZpeGluZGV4JyB8fFxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnQnJva2VuUmVkaXJlY3RzJylcblx0XHQpIHtcblx0XHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRcdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2ssXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5om55YigJywgJ+aJueWIqicpLFxuXHRcdFx0XHQndHctYmF0Y2gnLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WIoOmZpOatpOWIhuexu+aIlumhtemdouS4reeahOaJgOaciemTvuaOpScsICfliKrpmaTmraTliIbpoZ7miJbpoIHpnaLkuK3nmoTmiYDmnInpgKPntZAnKVxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUudW5saW5rQ2FjaGUgPSB7fTtcblx0Ly8gSGFzIHRoZSBzdWJwYWdlcyBsaXN0IGJlZW4gbG9hZGVkP1xuXHRsZXQgc3VicGFnZXNMb2FkZWQ7XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0c3VicGFnZXNMb2FkZWQgPSBmYWxzZTtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgNDAwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUod2luZG93LndnVUxTKCfmibnph4/liKDpmaQnLCAn5om55qyh5Yiq6ZmkJykpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2JhdGNoZGVsZXRlJyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOmhtemdoicsICfliKrpmaTpoIHpnaInKSxcblx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlX3BhZ2UnLFxuXHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlJyxcblx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdHN1Ymdyb3VwOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdCfliKDpmaTlhbPogZTnmoTorqjorrrpobXvvIjnlKjmiLforqjorrrpobXpmaTlpJbvvIknLFxuXHRcdFx0XHRcdFx0XHRcdFx0J+WIqumZpOmXnOiBr+eahOiojuirlumgge+8iOS9v+eUqOiAheiojuirlumggemZpOWklu+8iSdcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdkZWxldGVfdGFsaycsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdkZWxldGVfdGFsaycsXG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOWIsOW3suWIoOmhtemdoueahOmHjeWumuWQkemhtScsICfliKrpmaTliLDlt7LliKrpoIHpnaLnmoTph43mlrDlsI7lkJHpoIHpnaInKSxcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlX3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdkZWxldGVfcmVkaXJlY3RzJyxcblx0XHRcdFx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yig6Zmk5bey5Yig6aG16Z2i55qE5a2Q6aG16Z2iJywgJ+WIqumZpOW3suWIqumggemdoueahOWtkOmggemdoicpLFxuXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdkZWxldGVfc3VicGFnZXMnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlX3N1YnBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0XHRjaGVja2VkOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFjay50b2dnbGVTdWJwYWdlcyxcblx0XHRcdFx0XHRcdFx0XHRzdWJncm91cDoge1xuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOmZpOW3suWIoOWtkOmhtemdoueahOiuqOiuuumhtScsICfliKrpmaTlt7LliKrlrZDpoIHpnaLnmoToqI7oq5bpoIEnKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiAnZGVsZXRlX3N1YnBhZ2VfdGFsa3MnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlX3N1YnBhZ2VfdGFsa3MnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCfliKDpmaTliLDlt7LliKDlrZDpobXpnaLnmoTph43lrprlkJHpobUnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J+WIqumZpOWIsOW3suWIquWtkOmggemdoueahOmHjeaWsOWwjuWQkemggemdoidcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6ICdkZWxldGVfc3VicGFnZV9yZWRpcmVjdHMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnZGVsZXRlX3N1YnBhZ2VfcmVkaXJlY3RzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQn5Y+W5raI5omA5pyJ5bey5Yig6aG16Z2i55qE6ZO+5YWl77yI5LuF5aSE55CG5p2h55uu5ZG95ZCN56m66Ze077yJJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCflj5bmtojmiYDmnInlt7LliKrpoIHpnaLnmoTpgKPlhaXvvIjlg4XomZXnkIbmop3nm67lkb3lkI3nqbrplpPvvIknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuYW1lOiAndW5saW5rX3N1YnBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ3VubGlua19zdWJwYWdlcycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflj5bmtojpk77lhaXvvIjku4XlpITnkIbmnaHnm67lkb3lkI3nqbrpl7TvvIknLCAn5Y+W5raI6YCj5YWl77yI5YOF6JmV55CG5qKd55uu5ZG95ZCN56m66ZaT77yJJyksXG5cdFx0XHRcdFx0bmFtZTogJ3VubGlua19wYWdlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3VubGluaycsXG5cdFx0XHRcdFx0Y2hlY2tlZDogZmFsc2UsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnp7vpmaTmlofku7bkvb/nlKjvvIjmiYDmnInlkb3lkI3nqbrpl7TvvIknLCAn56e76Zmk5qqU5qGI5L2/55So77yI5omA5pyJ5ZG95ZCN56m66ZaT77yJJyksXG5cdFx0XHRcdFx0bmFtZTogJ3VubGlua19maWxlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3VubGlua19maWxlJyxcblx0XHRcdFx0XHRjaGVja2VkOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdG5hbWU6ICdjb21tb25fcmVhc29uJyxcblx0XHRcdGxhYmVsOiAn5bi455So55CG55Sx77yaJyxcblx0XHRcdHN0eWxlOiAnd2lkdGg6IDg1JTsnLFxuXHRcdFx0bGlzdDogVHdpbmtsZS5iYXRjaGRlbGV0ZS5kZWxldGVyZWFzb25saXN0LFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2suY2hhbmdlX2NvbW1vbl9yZWFzb24sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0bmFtZTogJ3JlYXNvbicsXG5cdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0bGFiZWw6ICfnkIbnlLHvvJonLFxuXHRcdFx0c2l6ZTogNzUsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRwcm9wOiAncmV2aXNpb25zfGluZm98aW1hZ2VpbmZvJyxcblx0XHRcdGlucHJvcDogJ3Byb3RlY3Rpb24nLFxuXHRcdFx0cnZwcm9wOiAnc2l6ZXx1c2VyJyxcblx0XHR9O1xuXHRcdC8vIE9uIGNhdGVnb3JpZXNcblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA9PT0gMTQpIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdjYXRlZ29yeW1lbWJlcnMnO1xuXHRcdFx0cXVlcnkuZ2NtdGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRxdWVyeS5nY21saW1pdCA9IFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hNYXgnKTtcblx0XHRcdC8vIE9uIFNwZWNpYWw6UHJlZml4SW5kZXhcblx0XHR9IGVsc2UgaWYgKG13LmNvbmZpZy5nZXQoJ3dnQ2Fub25pY2FsU3BlY2lhbFBhZ2VOYW1lJykgPT09ICdQcmVmaXhpbmRleCcpIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdhbGxwYWdlcyc7XG5cdFx0XHRxdWVyeS5nYXBsaW1pdCA9IFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hNYXgnKTtcblx0XHRcdGlmIChtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ByZWZpeCcpKSB7XG5cdFx0XHRcdHF1ZXJ5LmdhcG5hbWVzcGFjZSA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgnbmFtZXNwYWNlJyk7XG5cdFx0XHRcdHF1ZXJ5LmdhcHByZWZpeCA9IG13LnV0aWwuZ2V0UGFyYW1WYWx1ZSgncHJlZml4Jyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsZXQgcGF0aFNwbGl0ID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLnBhdGhuYW1lKS5zcGxpdCgnLycpO1xuXHRcdFx0XHRpZiAocGF0aFNwbGl0Lmxlbmd0aCA8IDMgfHwgcGF0aFNwbGl0WzJdICE9PSAnU3BlY2lhbDrliY3nvIDntKLlvJUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHRpdGxlU3BsaXQgPSBwYXRoU3BsaXRbM10uc3BsaXQoJzonKTtcblx0XHRcdFx0cXVlcnkuZ2FwbmFtZXNwYWNlID0gbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKVt0aXRsZVNwbGl0WzBdLnRvTG93ZXJDYXNlKCldO1xuXHRcdFx0XHRpZiAodGl0bGVTcGxpdC5sZW5ndGggPCAyIHx8IHF1ZXJ5LmdhcG5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cXVlcnkuZ2FwbmFtZXNwYWNlID0gMDsgLy8gYXJ0aWNsZSBuYW1lc3BhY2Vcblx0XHRcdFx0XHRxdWVyeS5nYXBwcmVmaXggPSBwYXRoU3BsaXQuc3BsaWNlKDMpLmpvaW4oJy8nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXRoU3BsaXQgPSBwYXRoU3BsaXQuc3BsaWNlKDQpO1xuXHRcdFx0XHRcdHBhdGhTcGxpdC5zcGxpY2UoMCwgMCwgdGl0bGVTcGxpdC5zcGxpY2UoMSkuam9pbignOicpKTtcblx0XHRcdFx0XHRxdWVyeS5nYXBwcmVmaXggPSBwYXRoU3BsaXQuam9pbignLycpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBPbiBTcGVjaWFsOkJyb2tlblJlZGlyZWN0c1xuXHRcdH0gZWxzZSBpZiAobXcuY29uZmlnLmdldCgnd2dDYW5vbmljYWxTcGVjaWFsUGFnZU5hbWUnKSA9PT0gJ0Jyb2tlblJlZGlyZWN0cycpIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdxdWVyeXBhZ2UnO1xuXHRcdFx0cXVlcnkuZ3FwcGFnZSA9ICdCcm9rZW5SZWRpcmVjdHMnO1xuXHRcdFx0cXVlcnkuZ3FwbGltaXQgPSBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4Jyk7XG5cdFx0XHQvLyBPbiBub3JtYWwgcGFnZXNcblx0XHR9IGVsc2Uge1xuXHRcdFx0cXVlcnkuZ2VuZXJhdG9yID0gJ2xpbmtzJztcblx0XHRcdHF1ZXJ5LnRpdGxlcyA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblx0XHRcdHF1ZXJ5LmdwbGxpbWl0ID0gVHdpbmtsZS5nZXRQcmVmKCdiYXRjaE1heCcpO1xuXHRcdH1cblx0XHRjb25zdCBzdGF0dXNkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRzdGF0dXNkaXYuc3R5bGUucGFkZGluZyA9ICcxNXB4JzsgLy8ganVzdCBzbyBpdCBkb2Vzbid0IGxvb2sgYnJva2VuXG5cdFx0V2luZG93LnNldENvbnRlbnQoc3RhdHVzZGl2KTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChzdGF0dXNkaXYpO1xuXHRcdFdpbmRvdy5kaXNwbGF5KCk7XG5cdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5wYWdlcyA9IHt9O1xuXHRcdGNvbnN0IHN0YXRlbGVtID0gbmV3IE1vcmViaXRzLnN0YXR1cyh3aW5kb3cud2dVTFMoJ+aKk+WPlumhtemdouWIl+ihqCcsICfmipPlj5bpoIHpnaLliJfooagnKSk7XG5cdFx0Y29uc3QgeXNhcmNoaXZlc19hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WKoOi9veS4reKApicsICfovInlhaXkuK3igKYnKSxcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0KGFwaW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRcdGNvbnN0ICRwYWdlcyA9ICQoeG1sKS5maW5kKCdwYWdlJykuZmlsdGVyKCc6bm90KFttaXNzaW5nXSknKTsgLy8gOm5vdChbaW1hZ2VyZXBvc2l0b3J5PVwic2hhcmVkXCJdKVxuXHRcdFx0XHQkcGFnZXMuZWFjaCgoX2luZGV4LCBwYWdlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgJHBhZ2UgPSAkKHBhZ2UpO1xuXHRcdFx0XHRcdGNvbnN0IG5zID0gJHBhZ2UuYXR0cignbnMnKTtcblx0XHRcdFx0XHRjb25zdCB0aXRsZSA9ICRwYWdlLmF0dHIoJ3RpdGxlJyk7XG5cdFx0XHRcdFx0Y29uc3QgaXNSZWRpciA9ICRwYWdlLmF0dHIoJ3JlZGlyZWN0JykgPT09ICcnO1xuXHRcdFx0XHRcdGNvbnN0ICRlZGl0cHJvdCA9ICRwYWdlLmZpbmQoJ3ByW3R5cGU9XCJlZGl0XCJdW2xldmVsPVwic3lzb3BcIl0nKTtcblx0XHRcdFx0XHRjb25zdCBpc1Byb3RlY3RlZCA9ICRlZGl0cHJvdC5sZW5ndGggPiAwO1xuXHRcdFx0XHRcdGNvbnN0IHNpemUgPSAkcGFnZS5maW5kKCdyZXYnKS5hdHRyKCdzaXplJyk7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YWRhdGEgPSBbXTtcblx0XHRcdFx0XHRpZiAoaXNSZWRpcikge1xuXHRcdFx0XHRcdFx0bWV0YWRhdGEucHVzaCh3aW5kb3cud2dVTFMoJ+mHjeWumuWQkScsICfph43mlrDlsI7lkJEnKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpc1Byb3RlY3RlZCkge1xuXHRcdFx0XHRcdFx0bWV0YWRhdGEucHVzaChcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflhajkv53miqTvvIwnLCAn5YWo5L+d6K2377yMJykgK1xuXHRcdFx0XHRcdFx0XHRcdCgkZWRpdHByb3QuYXR0cignZXhwaXJ5JykgPT09ICdpbmZpbml0eSdcblx0XHRcdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCfml6DpmZDmnJ8nLCAn54Sh6ZmQ5pyfJylcblx0XHRcdFx0XHRcdFx0XHRcdDogYCR7bmV3IE1vcmViaXRzLmRhdGUoJGVkaXRwcm90LmF0dHIoJ2V4cGlyeScpKS5jYWxlbmRhcigndXRjJyl9IChVVEMpYCkgK1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn6L+H5pyfJywgJ+mBjuacnycpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobnMgPT09ICc2Jykge1xuXHRcdFx0XHRcdFx0Ly8gbWltaWMgd2hhdCBkZWxpbWFnZXMgdXNlZCB0byBzaG93IGZvciBmaWxlc1xuXHRcdFx0XHRcdFx0bWV0YWRhdGEucHVzaChcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkuIrkvKDogIXvvJonLCAn5LiK5YKz6ICF77yaJykgKyAkcGFnZS5maW5kKCdpaScpLmF0dHIoJ3VzZXInKSxcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmnIDlkI7nvJbovpHvvJonLCAn5pyA5b6M57eo6Lyv77yaJykgKyAkcGFnZS5maW5kKCdyZXYnKS5hdHRyKCd1c2VyJylcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG1ldGFkYXRhLnB1c2gobXcubGFuZ3VhZ2UuY29udmVydE51bWJlcihzaXplKSArIHdpbmRvdy53Z1VMUygn5a2X6IqCJywgJ+S9jeWFg+e1hCcpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5wYWdlc1t0aXRsZV0gPSB7XG5cdFx0XHRcdFx0XHRsYWJlbDogdGl0bGUgKyAobWV0YWRhdGEubGVuZ3RoID8gYO+8iCR7bWV0YWRhdGEuam9pbign77yMJyl977yJYCA6ICcnKSxcblx0XHRcdFx0XHRcdHZhbHVlOiB0aXRsZSxcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzdHlsZTogaXNQcm90ZWN0ZWQgPyAnY29sb3I6ICNmMDAnIDogJycsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IGZvcm1fID0gYXBpb2JqLnBhcmFtcy5mb3JtO1xuXHRcdFx0XHRmb3JtXy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W+heWIoOmZpOmhtemdoicsICflvoXliKrpmaTpoIHpnaInKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvcm1fLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2J1dHRvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWo6YCJJywgJ+WFqOmBuCcpLFxuXHRcdFx0XHRcdGV2ZW50OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHQkKHJlc3VsdClcblx0XHRcdFx0XHRcdFx0LmZpbmQoJ2lucHV0W25hbWU9cGFnZXNdOm5vdCg6Y2hlY2tlZCknKVxuXHRcdFx0XHRcdFx0XHQuZWFjaCgoXywgZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGUuY2xpY2soKTsgLy8gY2hlY2sgaXQsIGFuZCBpbnZva2UgY2xpY2sgZXZlbnQgc28gdGhhdCBzdWJncm91cCBjYW4gYmUgc2hvd25cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBDaGVjayBhbnkgdW5jaGVja2VkIHN1YnBhZ2VzIHRvb1xuXHRcdFx0XHRcdFx0JGJvZHkuZmluZCgnaW5wdXRbbmFtZT1cInBhZ2VzLnN1YnBhZ2VzXCJdJykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtXy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WFqOS4jemAiScsICflhajkuI3pgbgnKSxcblx0XHRcdFx0XHRldmVudDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0JChyZXN1bHQpXG5cdFx0XHRcdFx0XHRcdC5maW5kKCdpbnB1dFtuYW1lPXBhZ2VzXTpjaGVja2VkJylcblx0XHRcdFx0XHRcdFx0LmVhY2goKF8sIGUpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRlLmNsaWNrKCk7IC8vIHVuY2hlY2sgaXQsIGFuZCBpbnZva2UgY2xpY2sgZXZlbnQgc28gdGhhdCBzdWJncm91cCBjYW4gYmUgaGlkZGVuXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGZvcm1fLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0XHRuYW1lOiAncGFnZXMnLFxuXHRcdFx0XHRcdGlkOiAndHctZGJhdGNoLXBhZ2VzJyxcblx0XHRcdFx0XHRzaGlmdENsaWNrU3VwcG9ydDogdHJ1ZSxcblx0XHRcdFx0XHRsaXN0OiBPYmplY3QudmFsdWVzKFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXMpLm1hcCgoZSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGU7XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRmb3JtXy5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gZm9ybV8ucmVuZGVyKCk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuV2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRcdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocmVzdWx0LCAncGFnZXMnKSkge1xuXHRcdFx0XHRcdGdlbmVyYXRlQXJyb3dMaW5rcyhjaGVja2JveCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzdGF0ZWxlbVxuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zID0ge1xuXHRcdFx0Zm9ybSxcblx0XHRcdFdpbmRvdyxcblx0XHR9O1xuXHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0fTtcblx0Y29uc3QgZ2VuZXJhdGVBcnJvd0xpbmtzID0gKGNoZWNrYm94KSA9PiB7XG5cdFx0Y29uc3QgbGluayA9IE1vcmViaXRzLmh0bWxOb2RlKCdhJywgJyA+Jyk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3R3LWRiYXRjaC1wYWdlLWxpbmsnKTtcblx0XHRsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIG13LnV0aWwuZ2V0VXJsKGNoZWNrYm94LnZhbHVlKSk7XG5cdFx0bGluay5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTtcblx0XHRsaW5rLnNldEF0dHJpYnV0ZSgncmVsJywgJ25vb3BlbmVyIG5vcmVmZXJyZXInKTtcblx0XHRjaGVja2JveC5uZXh0RWxlbWVudFNpYmxpbmcuYXBwZW5kKGxpbmspO1xuXHR9O1xuXHRUd2lua2xlLmJhdGNoZGVsZXRlLmdlbmVyYXRlTmV3UGFnZUxpc3QgPSAoZm9ybSkgPT4ge1xuXHRcdC8vIFVwZGF0ZSB0aGUgbGlzdCBvZiBjaGVja2VkIHBhZ2VzIGluIFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXMgb2JqZWN0XG5cdFx0Y29uc3QgZWxlbWVudHMgPSBmb3JtLmVsZW1lbnRzLnBhZ2VzO1xuXHRcdGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcGFnZXNcblx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuXHRcdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLnBhZ2VzW2VsZW1lbnQudmFsdWVdLmNoZWNrZWQgPSBlbGVtZW50LmNoZWNrZWQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcblx0XHRcdC8vIGlmIHRoZXJlIGlzIGp1c3Qgb25lIHBhZ2Vcblx0XHRcdFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXNbZWxlbWVudHMudmFsdWVdLmNoZWNrZWQgPSBlbGVtZW50cy5jaGVja2VkO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IE1vcmViaXRzLnF1aWNrRm9ybS5lbGVtZW50KHtcblx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRuYW1lOiAncGFnZXMnLFxuXHRcdFx0aWQ6ICd0dy1kYmF0Y2gtcGFnZXMnLFxuXHRcdFx0c2hpZnRDbGlja1N1cHBvcnQ6IHRydWUsXG5cdFx0XHRsaXN0OiBPYmplY3QudmFsdWVzKFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXMpLm1hcCgoZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZTtcblx0XHRcdH0pLFxuXHRcdH0pLnJlbmRlcigpO1xuXHR9O1xuXHRUd2lua2xlLmJhdGNoZGVsZXRlLmRlbGV0ZXJlYXNvbmxpc3QgPSBbXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6K+36YCJ5oupJywgJ+iri+mBuOaThycpLFxuXHRcdFx0dmFsdWU6ICcnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J0c277ya5Y6f5L2c6ICF5o+Q6K+35Yig6Zmk5oiW5riF56m66aG16Z2i77yM5LiU6aG16Z2i5Y6f5L2c6ICF5LuF5pyJ5LiA5Lq6Jyxcblx0XHRcdFx0J0c277ya5Y6f5L2c6ICF5o+Q6KuL5Yiq6Zmk5oiW5riF56m66aCB6Z2i77yM5LiU6aCB6Z2i5Y6f5L2c6ICF5YOF5pyJ5LiA5Lq6J1xuXHRcdFx0KSxcblx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdbW0xJQjpDU0QjRzZ8RzZdXe+8muWOn+S9nOiAheaPkOivt+WIoOmZpOaIlua4heepuumhtemdou+8jOS4lOmhtemdouWOn+S9nOiAheS7heacieS4gOS6uicsXG5cdFx0XHRcdCdbW0xJQjpDU0QjRzZ8RzZdXe+8muWOn+S9nOiAheaPkOiri+WIqumZpOaIlua4heepuumggemdou+8jOS4lOmggemdouWOn+S9nOiAheWDheacieS4gOS6uidcblx0XHRcdCksXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnRznvvJrlraTnq4vpobXpnaLvvIzmr5TlpoLmsqHmnInkuLvpobXpnaLnmoTorqjorrrpobXjgIHmjIflkJHnqbrpobXpnaLnmoTph43lrprlkJHnrYknLFxuXHRcdFx0XHQnRznvvJrlraTnq4vpoIHpnaLvvIzmr5TlpoLmspLmnInkuLvpoIHpnaLnmoToqI7oq5bpoIHjgIHmjIflkJHnqbrpoIHpnaLnmoTph43mlrDlsI7lkJHnrYknXG5cdFx0XHQpLFxuXHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUygnW1tMSUI6Q1NEI0c5fEc5XV3vvJrlraTnq4vpobXpnaInLCAnW1tMSUI6Q1NEI0c5fEc5XV3vvJrlraTnq4vpoIHpnaInKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ1Ix77ya5LiN6IO95Y+R5oyl5a6e6ZmF5L2c55So55qE6YeN5a6a5ZCR44CCJywgJ1Ix77ya5LiN6IO955m85o+u5a+m6Zqb5L2c55So55qE6YeN5a6a5ZCR44CCJyksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tMSUI6Q1NEI1IxfFIxXV3vvJrkuI3og73lj5HmjKXlrp7pmYXkvZznlKjnmoTph43lrprlkJHjgIInLFxuXHRcdFx0XHQnW1tMSUI6Q1NEI1IxfFIxXV3vvJrkuI3og73nmbzmj67lr6bpmpvkvZznlKjnmoTph43lrprlkJHjgIInXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J1Iy77ya5ZCN56ew5LiO5a+85ZCR55uu5qCH5Luj6KGo5LqL54mp5LiN5LiA6Ie05oiW5LiN5a6M5YWo5LiA6Ie055qE6YeN5a6a5ZCR44CCJyxcblx0XHRcdFx0J1Iy77ya5ZCN56ix6IiH5bCO5ZCR55uu5qiZ5Luj6KGo5LqL54mp5LiN5LiA6Ie05oiW5LiN5a6M5YWo5LiA6Ie055qE6YeN5a6a5ZCR44CCJ1xuXHRcdFx0KSxcblx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdbW0xJQjpDU0QjUjJ8UjJdXe+8muWQjeensOS4juWvvOWQkeebruagh+S7o+ihqOS6i+eJqeS4jeS4gOiHtOaIluS4jeWujOWFqOS4gOiHtOeahOmHjeWumuWQkeOAgicsXG5cdFx0XHRcdCdbW0xJQjpDU0QjUjJ8UjJdXe+8muWQjeeoseiIh+WwjuWQkeebruaomeS7o+ihqOS6i+eJqeS4jeS4gOiHtOaIluS4jeWujOWFqOS4gOiHtOeahOmHjeWumuWQkeOAgidcblx0XHRcdCksXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCdGNO+8muWPr+iiq+abv+S7o+eahOWQiOeQhuS9v+eUqOaWh+S7ticsICdGNO+8muWPr+iiq+abv+S7o+eahOWQiOeQhuS9v+eUqOaqlOahiCcpLFxuXHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J1tbTElCOkNTRCNGNHxGNF1d77ya5Y+v6KKr5pu/5Luj55qE5ZCI55CG5L2/55So5paH5Lu2Jyxcblx0XHRcdFx0J1tbTElCOkNTRCNGNHxGNF1d77ya5Y+v6KKr5pu/5Luj55qE5ZCI55CG5L2/55So5qqU5qGIJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdGNe+8muayoeacieiiq+adoeebruS9v+eUqOeahOmdnuiHqueUseiRl+S9nOadg+aWh+S7tuOAgeayoeacieWhq+WGmeS7u+S9leWQiOeQhuS9v+eUqOS+neaNrueahOmdnuiHqueUseiRl+S9nOadg+aWh+S7ticsXG5cdFx0XHRcdCdGNe+8muaykuacieiiq+aineebruS9v+eUqOeahOmdnuiHqueUseeJiOasiuaqlOahiOOAgeaykuacieWhq+Wvq+S7u+S9leWQiOeQhuS9v+eUqOS+neaTmueahOmdnuiHqueUseeJiOasiuaqlOahiCdcblx0XHRcdCksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tMSUI6Q1NEI0Y1fEY1XV3vvJrmsqHmnInooqvmnaHnm67kvb/nlKjnmoTpnZ7oh6rnlLHokZfkvZzmnYPmlofku7bjgIHmsqHmnInloavlhpnku7vkvZXlkIjnkIbkvb/nlKjkvp3mja7nmoTpnZ7oh6rnlLHokZfkvZzmnYPmlofku7YnLFxuXHRcdFx0XHQnW1tMSUI6Q1NEI0Y1fEY1XV3vvJrmspLmnInooqvmop3nm67kvb/nlKjnmoTpnZ7oh6rnlLHniYjmrIrmqpTmoYjjgIHmspLmnInloavlr6vku7vkvZXlkIjnkIbkvb/nlKjkvp3mk5rnmoTpnZ7oh6rnlLHniYjmrIrmqpTmoYgnXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0J08x77ya55So5oi36K+35rGC5Yig6Zmk6Ieq5bex55qE55So5oi36aG15oiW5YW25a2Q6aG16Z2iJyxcblx0XHRcdFx0J08x77ya5L2/55So6ICF6KuL5rGC5Yiq6Zmk6Ieq5bex55qE5L2/55So6ICF6aCB6Z2i5oiW5YW25a2Q6aCB6Z2iJ1xuXHRcdFx0KSxcblx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdCdbW0xJQjpDU0QjTzF8TzFdXe+8mueUqOaIt+ivt+axguWIoOmZpOiHquW3seeahFtbSGVscDrnlKjmiLfpobV855So5oi36aG1XV3miJblhbblrZDpobXpnaLjgIInLFxuXHRcdFx0XHQnW1tMSUI6Q1NEI08xfE8xXV3vvJrkvb/nlKjogIXoq4vmsYLliKrpmaToh6rlt7HnmoRbW0hlbHA655So5oi36aG1fOS9v+eUqOiAhemggemdol1d5oiW5YW25a2Q6aCB6Z2i44CCJ1xuXHRcdFx0KSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ08y77ya56m655qE5YiG57G777yI5rKh5pyJ5p2h55uu5Lmf5rKh5pyJ5a2Q5YiG57G777yJJywgJ08y77ya56m655qE5YiG6aGe77yI5rKS5pyJ5qKd55uu5Lmf5rKS5pyJ5a2Q5YiG6aGe77yJJyksXG5cdFx0XHR2YWx1ZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHQnW1tMSUI6Q1NEI08yfE8yXV3vvJrnqbrnmoTliIbnsbvvvIjmsqHmnInmnaHnm67kuZ/msqHmnInlrZDliIbnsbvvvInjgIInLFxuXHRcdFx0XHQnW1tMSUI6Q1NEI08yfE8yXV3vvJrnqbrnmoTliIbpoZ7vvIjmspLmnInmop3nm67kuZ/mspLmnInlrZDliIbpoZ7vvInjgIInXG5cdFx0XHQpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygnTzPvvJrlup/lvIPojYnnqL8nLCAnTzPvvJrlu6Lmo4TojYnnqL8nKSxcblx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ1tbTElCOkNTRCNPM3xPM11d77ya5bqf5byD6I2J56i/44CCJywgJ1tbTElCOkNTRCNPM3xPM11d77ya5bui5qOE6I2J56i/44CCJyksXG5cdFx0fSxcblx0XTtcblx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFjay5jaGFuZ2VfY29tbW9uX3JlYXNvbiA9IChlKSA9PiB7XG5cdFx0aWYgKGUudGFyZ2V0LmZvcm0ucmVhc29uLnZhbHVlICE9PSAnJykge1xuXHRcdFx0ZS50YXJnZXQuZm9ybS5yZWFzb24udmFsdWUgPSBNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24oZS50YXJnZXQuZm9ybS5yZWFzb24udmFsdWUpO1xuXHRcdH1cblx0XHRlLnRhcmdldC5mb3JtLnJlYXNvbi52YWx1ZSArPSBlLnRhcmdldC52YWx1ZTtcblx0XHRlLnRhcmdldC52YWx1ZSA9ICcnO1xuXHR9O1xuXHRUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrLnRvZ2dsZVN1YnBhZ2VzID0gKGUpID0+IHtcblx0XHRjb25zdCB7Zm9ybX0gPSBlLnRhcmdldDtcblx0XHRsZXQgbmV3UGFnZUxpc3Q7XG5cdFx0aWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcblx0XHRcdGZvcm0uZGVsZXRlX3N1YnBhZ2VfcmVkaXJlY3RzLmNoZWNrZWQgPSBmb3JtLmRlbGV0ZV9yZWRpcmVjdHMuY2hlY2tlZDtcblx0XHRcdGZvcm0uZGVsZXRlX3N1YnBhZ2VfdGFsa3MuY2hlY2tlZCA9IGZvcm0uZGVsZXRlX3RhbGsuY2hlY2tlZDtcblx0XHRcdGZvcm0udW5saW5rX3N1YnBhZ2VzLmNoZWNrZWQgPSBmb3JtLnVubGlua19wYWdlLmNoZWNrZWQ7XG5cdFx0XHQvLyBJZiBsaXN0cyBvZiBzdWJwYWdlcyB3ZXJlIGFscmVhZHkgbG9hZGVkIG9uY2UsIHRoZXkgYXJlXG5cdFx0XHQvLyBhdmFpbGFibGUgd2l0aG91dCB1c2Ugb2YgYW55IEFQSSBjYWxsc1xuXHRcdFx0aWYgKHN1YnBhZ2VzTG9hZGVkKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZWwgb2YgVHdpbmtsZS5iYXRjaGRlbGV0ZS5wYWdlcykge1xuXHRcdFx0XHRcdC8vIEdldCBiYWNrIHRoZSBzdWJncm91cCBmcm9tIHN1Ymdyb3VwXywgd2hlcmUgd2Ugc2F2ZWQgaXRcblx0XHRcdFx0XHRpZiAoZWwuc3ViZ3JvdXAgPT09IG51bGwgJiYgZWwuc3ViZ3JvdXBfKSB7XG5cdFx0XHRcdFx0XHRlbC5zdWJncm91cCA9IGVsLnN1Ymdyb3VwXztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bmV3UGFnZUxpc3QgPSBUd2lua2xlLmJhdGNoZGVsZXRlLmdlbmVyYXRlTmV3UGFnZUxpc3QoZm9ybSk7XG5cdFx0XHRcdCRib2R5LmZpbmQoJyN0dy1kYmF0Y2gtcGFnZXMnKS5yZXBsYWNlV2l0aChuZXdQYWdlTGlzdCk7XG5cdFx0XHRcdGZvciAoY29uc3QgY2hlY2tib3ggb2YgTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKG5ld1BhZ2VMaXN0LCAncGFnZXMnKSkge1xuXHRcdFx0XHRcdGdlbmVyYXRlQXJyb3dMaW5rcyhjaGVja2JveCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMobmV3UGFnZUxpc3QsICdwYWdlcy5zdWJwYWdlcycpKSB7XG5cdFx0XHRcdFx0Z2VuZXJhdGVBcnJvd0xpbmtzKGNoZWNrYm94KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBQcm9jZWVkIHdpdGggQVBJIGNhbGxzIHRvIGdldCBsaXN0IG9mIHN1YnBhZ2VzXG5cdFx0XHRjb25zdCBsb2FkaW5nVGV4dCA9IGA8c3Ryb25nIGlkPVwiZGJhdGNoLXN1YnBhZ2UtbG9hZGluZ1wiPiR7d2luZG93LndnVUxTKCfliqDovb3kuK0uLi4nLCAn6LyJ5YWl5LitLi4uJyl9PC9zdHJvbmc+YDtcblx0XHRcdCQoZS50YXJnZXQpLmFmdGVyKGxvYWRpbmdUZXh0KTtcblx0XHRcdGNvbnN0IHBhZ2VzID0gJChmb3JtLnBhZ2VzKVxuXHRcdFx0XHQubWFwKChfaSwgZWwpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gZWwudmFsdWU7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5nZXQoKTtcblx0XHRcdGNvbnN0IHN1YnBhZ2VMaXN0ZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oKTtcblx0XHRcdHN1YnBhZ2VMaXN0ZXIuc2V0T3B0aW9uKCdjaHVua1NpemUnLCBUd2lua2xlLmdldFByZWYoJ2JhdGNoQ2h1bmtzJykpO1xuXHRcdFx0c3VicGFnZUxpc3Rlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0XHRzdWJwYWdlTGlzdGVyLnJ1bihcblx0XHRcdFx0KHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcGFnZVRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFnZU5hbWUpO1xuXHRcdFx0XHRcdC8vIE5vIG5lZWQgdG8gbG9vayBmb3Igc3VicGFnZXMgaW4gbWFpbi9maWxlL21lZGlhd2lraSBzcGFjZVxuXHRcdFx0XHRcdGlmIChbMCwgNiwgOF0uaW5jbHVkZXMocGFnZVRpdGxlLm5hbWVzcGFjZSkpIHtcblx0XHRcdFx0XHRcdHN1YnBhZ2VMaXN0ZXIud29ya2VyU3VjY2VzcygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCB5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo6I635Y+WICcsICfmraPlnKjlj5blvpcgJykgKyBwYWdlTmFtZSArIHdpbmRvdy53Z1VMUygnIOeahOWtkOmhtemdoicsICcg55qE5a2Q6aCB6Z2iJyksXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRcdFx0cHJvcDogJ3JldmlzaW9uc3xpbmZvfGltYWdlaW5mbycsXG5cdFx0XHRcdFx0XHRcdGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0cnZwcm9wOiAnc2l6ZScsXG5cdFx0XHRcdFx0XHRcdGlucHJvcDogJ3Byb3RlY3Rpb24nLFxuXHRcdFx0XHRcdFx0XHRnYXBwcmVmaXg6IGAke3BhZ2VUaXRsZS50aXRsZX0vYCxcblx0XHRcdFx0XHRcdFx0Z2FwbmFtZXNwYWNlOiBwYWdlVGl0bGUubmFtZXNwYWNlLFxuXHRcdFx0XHRcdFx0XHRnYXBsaW1pdDogJ21heCcsXG5cdFx0XHRcdFx0XHRcdHBhZ2VOYW1lRnVsbDogcGFnZU5hbWUsIC8vIE5vdCB1c2VkIGJ5IEFQSSwgYnV0IGFkZGVkIGZvciBhY2Nlc3MgaW4gb25TdWNjZXNzKClcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQoYXBpb2JqKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHhtbCA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdFx0XHRcdFx0Y29uc3QgJHBhZ2VzID0gJCh4bWwpLmZpbmQoJ3BhZ2UnKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VicGFnZUxpc3QgPSBbXTtcblx0XHRcdFx0XHRcdFx0JHBhZ2VzLmVhY2goKF9pbmRleCwgcGFnZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0ICRwYWdlID0gJChwYWdlKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBucyA9ICRwYWdlLmF0dHIoJ25zJyk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGl0bGUgPSAkcGFnZS5hdHRyKCd0aXRsZScpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlzUmVkaXIgPSAkcGFnZS5hdHRyKCdyZWRpcmVjdCcpID09PSAnJztcblx0XHRcdFx0XHRcdFx0XHRjb25zdCAkZWRpdHByb3QgPSAkcGFnZS5maW5kKCdwclt0eXBlPVwiZWRpdFwiXVtsZXZlbD1cInN5c29wXCJdJyk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaXNQcm90ZWN0ZWQgPSAkZWRpdHByb3QubGVuZ3RoID4gMDtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzaXplID0gJHBhZ2UuZmluZCgncmV2JykuYXR0cignc2l6ZScpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1ldGFkYXRhID0gW107XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGlzUmVkaXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGFkYXRhLnB1c2goJ3JlZGlyZWN0Jyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChpc1Byb3RlY3RlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bWV0YWRhdGEucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCflhajkv53miqTvvIwnLCAn5YWo5L+d6K2377yMJykgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCgkZWRpdHByb3QuYXR0cignZXhwaXJ5JykgPT09ICdpbmZpbml0eSdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gd2luZG93LndnVUxTKCfml6DpmZDmnJ8nLCAn54Sh6ZmQ5pyfJylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogYCR7bmV3IE1vcmViaXRzLmRhdGUoJGVkaXRwcm90LmF0dHIoJ2V4cGlyeScpKS5jYWxlbmRhcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndXRjJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpfSAoVVRDKWApICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+i/h+acnycsICfpgY7mnJ8nKVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG5zID09PSAnNicpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIG1pbWljIHdoYXQgZGVsaW1hZ2VzIHVzZWQgdG8gc2hvdyBmb3IgZmlsZXNcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGFkYXRhLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5LiK5Lyg6ICF77yaJywgJ+S4iuWCs+iAhe+8micpICsgJHBhZ2UuZmluZCgnaWknKS5hdHRyKCd1c2VyJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5pyA5ZCO57yW6L6R77yaJywgJ+acgOW+jOe3qOi8r++8micpICsgJHBhZ2UuZmluZCgncmV2JykuYXR0cigndXNlcicpXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRhZGF0YS5wdXNoKG13Lmxhbmd1YWdlLmNvbnZlcnROdW1iZXIoc2l6ZSkgKyB3aW5kb3cud2dVTFMoJ+Wtl+iKgicsICfkvY3lhYPntYQnKSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHN1YnBhZ2VMaXN0LnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHRpdGxlICsgKG1ldGFkYXRhLmxlbmd0aCA/IGAgKCR7bWV0YWRhdGEuam9pbignOyAnKX0pYCA6ICcnKSxcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB0aXRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRzdHlsZTogaXNQcm90ZWN0ZWQgPyAnY29sb3I6ICNmMDAnIDogJycsXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoc3VicGFnZUxpc3QubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcGFnZU5hbWVfID0gYXBpb2JqLnF1ZXJ5LnBhZ2VOYW1lRnVsbDtcblx0XHRcdFx0XHRcdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLnBhZ2VzW3BhZ2VOYW1lX10uc3ViZ3JvdXAgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogJ3N1YnBhZ2VzJyxcblx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogJ2RiYXRjaC1zdWJwYWdlcycsXG5cdFx0XHRcdFx0XHRcdFx0XHRzaGlmdENsaWNrU3VwcG9ydDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3Q6IHN1YnBhZ2VMaXN0LFxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0c3VicGFnZUxpc3Rlci53b3JrZXJTdWNjZXNzKCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0bnVsbCAvKiBzdGF0dXNFbGVtZW50ICovLFxuXHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRzdWJwYWdlTGlzdGVyLndvcmtlckZhaWx1cmUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdC8vIExpc3QgJ2VtIG9uIHRoZSBpbnRlcmZhY2Vcblx0XHRcdFx0XHRuZXdQYWdlTGlzdCA9IFR3aW5rbGUuYmF0Y2hkZWxldGUuZ2VuZXJhdGVOZXdQYWdlTGlzdChmb3JtKTtcblx0XHRcdFx0XHQkYm9keS5maW5kKCcjdHctZGJhdGNoLXBhZ2VzJykucmVwbGFjZVdpdGgobmV3UGFnZUxpc3QpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hlY2tib3ggb2YgTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKG5ld1BhZ2VMaXN0LCAncGFnZXMnKSkge1xuXHRcdFx0XHRcdFx0Z2VuZXJhdGVBcnJvd0xpbmtzKGNoZWNrYm94KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGVja2JveCBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMobmV3UGFnZUxpc3QsICdwYWdlcy5zdWJwYWdlcycpKSB7XG5cdFx0XHRcdFx0XHRnZW5lcmF0ZUFycm93TGlua3MoY2hlY2tib3gpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzdWJwYWdlc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIFwiTG9hZGluZy4uLiBcIiB0ZXh0XG5cdFx0XHRcdFx0JGJvZHkuZmluZCgnI2RiYXRjaC1zdWJwYWdlLWxvYWRpbmcnKS5yZW1vdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKCFlLnRhcmdldC5jaGVja2VkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVsIG9mIFR3aW5rbGUuYmF0Y2hkZWxldGUucGFnZXMpIHtcblx0XHRcdFx0aWYgKGVsLnN1Ymdyb3VwKSB7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHN1Ymdyb3VwIGFmdGVyIHNhdmluZyBpdHMgY29udGVudHMgaW4gc3ViZ3JvdXBfXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGVhc2lseSBpZiB1c2VyIGRlY2lkZXMgdG9cblx0XHRcdFx0XHQvLyBkZWxldGUgdGhlIHN1YnBhZ2VzIGFnYWluXG5cdFx0XHRcdFx0ZWwuc3ViZ3JvdXBfID0gZWwuc3ViZ3JvdXA7XG5cdFx0XHRcdFx0ZWwuc3ViZ3JvdXAgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRuZXdQYWdlTGlzdCA9IFR3aW5rbGUuYmF0Y2hkZWxldGUuZ2VuZXJhdGVOZXdQYWdlTGlzdChmb3JtKTtcblx0XHRcdCRib2R5LmZpbmQoJyN0dy1kYmF0Y2gtcGFnZXMnKS5yZXBsYWNlV2l0aChuZXdQYWdlTGlzdCk7XG5cdFx0XHRmb3IgKGNvbnN0IGNoZWNrYm94IG9mIE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhuZXdQYWdlTGlzdCwgJ3BhZ2VzJykpIHtcblx0XHRcdFx0Z2VuZXJhdGVBcnJvd0xpbmtzKGNoZWNrYm94KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2suZXZhbHVhdGUgPSAoZXZlbnQpID0+IHtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSB3aW5kb3cud2dVTFMoJ+aJuemHj+WIoOmZpOW3suWujOaIkCcsICfmibnmrKHliKrpmaTlt7LlrozmiJAnKTtcblx0XHRjb25zdCBmb3JtID0gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnN0IG51bVByb3RlY3RlZCA9ICQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGZvcm0sICdwYWdlcycpKS5maWx0ZXIoKF9pbmRleCwgZWxlbWVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIGVsZW1lbnQuY2hlY2tlZCAmJiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5zdHlsZS5jb2xvciA9PT0gJ3JlZCc7XG5cdFx0fSkubGVuZ3RoO1xuXHRcdGlmIChcblx0XHRcdG51bVByb3RlY3RlZCA+IDAgJiZcblx0XHRcdCFjb25maXJtKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aCqOato+imgeWIoOmZpCAnLCAn5oKo5q2j6KaB5Yiq6ZmkICcpICtcblx0XHRcdFx0XHRtdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKG51bVByb3RlY3RlZCkgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOS4quWFqOS/neaKpOmhtemdou+8jOaCqOehruWumuWQl++8nycsICcg5YCL5YWo5L+d6K236aCB6Z2i77yM5oKo56K65a6a5ZeO77yfJylcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcGFnZXMgPSBmb3JtLmdldENoZWNrZWQoJ3BhZ2VzJyk7XG5cdFx0Y29uc3Qgc3VicGFnZXMgPSBmb3JtLmdldENoZWNrZWQoJ3BhZ2VzLnN1YnBhZ2VzJyk7XG5cdFx0Y29uc3QgcmVhc29uID0gZm9ybS5yZWFzb24udmFsdWU7XG5cdFx0Y29uc3QgZGVsZXRlX3BhZ2UgPSBmb3JtLmRlbGV0ZV9wYWdlLmNoZWNrZWQ7XG5cdFx0bGV0IGRlbGV0ZV90YWxrO1xuXHRcdGxldCBkZWxldGVfcmVkaXJlY3RzO1xuXHRcdGxldCBkZWxldGVfc3VicGFnZXM7XG5cdFx0bGV0IGRlbGV0ZV9zdWJwYWdlX3JlZGlyZWN0cztcblx0XHRsZXQgZGVsZXRlX3N1YnBhZ2VfdGFsa3M7XG5cdFx0bGV0IHVubGlua19zdWJwYWdlcztcblx0XHRpZiAoZGVsZXRlX3BhZ2UpIHtcblx0XHRcdGRlbGV0ZV90YWxrID0gZm9ybS5kZWxldGVfdGFsay5jaGVja2VkO1xuXHRcdFx0ZGVsZXRlX3JlZGlyZWN0cyA9IGZvcm0uZGVsZXRlX3JlZGlyZWN0cy5jaGVja2VkO1xuXHRcdFx0ZGVsZXRlX3N1YnBhZ2VzID0gZm9ybS5kZWxldGVfc3VicGFnZXMuY2hlY2tlZDtcblx0XHRcdGlmIChkZWxldGVfc3VicGFnZXMpIHtcblx0XHRcdFx0ZGVsZXRlX3N1YnBhZ2VfcmVkaXJlY3RzID0gZm9ybS5kZWxldGVfc3VicGFnZV9yZWRpcmVjdHMuY2hlY2tlZDtcblx0XHRcdFx0ZGVsZXRlX3N1YnBhZ2VfdGFsa3MgPSBmb3JtLmRlbGV0ZV9zdWJwYWdlX3RhbGtzLmNoZWNrZWQ7XG5cdFx0XHRcdHVubGlua19zdWJwYWdlcyA9IGZvcm0udW5saW5rX3N1YnBhZ2VzLmNoZWNrZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IHVubGlua19wYWdlID0gZm9ybS51bmxpbmtfcGFnZS5jaGVja2VkO1xuXHRcdGNvbnN0IHVubGlua19maWxlID0gZm9ybS51bmxpbmtfZmlsZS5jaGVja2VkO1xuXHRcdGlmICghcmVhc29uKSB7XG5cdFx0XHRtdy5ub3RpZnkod2luZG93LndnVUxTKCfmgqjpnIDopoHnu5nlh7rkuIDkuKrnkIbnlLEnLCAn5oKo6ZyA6KaB57Wm5Ye65LiA5YCL55CG55SxJyksIHtcblx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHR0YWc6ICd0d2lua2xlYmF0Y2hkZWxldGUnLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdE1vcmViaXRzLnNpbXBsZVdpbmRvdy5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoZm9ybSk7XG5cdFx0aWYgKCFwYWdlcykge1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmVycm9yKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+mUmeivrycsICfpjK/oqqQnKSxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmsqHmnInopoHliKDpmaTnmoTlhoXlrrnvvIzkuK3mraInLCAn5rKS5pyJ6KaB5Yiq6Zmk55qE5YWn5a6577yM5Lit5q2iJylcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHBhZ2VEZWxldGVyID0gbmV3IE1vcmViaXRzLmJhdGNoT3BlcmF0aW9uKFxuXHRcdFx0ZGVsZXRlX3BhZ2Vcblx0XHRcdFx0PyB3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpOmhtemdoicsICfmraPlnKjliKrpmaTpoIHpnaInKVxuXHRcdFx0XHQ6IHdpbmRvdy53Z1VMUygn5q2j5Zyo5ZCv5Yqo6KaB5rGC55qE5Lu75YqhJywgJ+ato+WcqOWVn+WLleimgeaxgueahOS7u+WLmScpXG5cdFx0KTtcblx0XHRwYWdlRGVsZXRlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hDaHVua3MnKSk7XG5cdFx0Ly8gd2Ugb25seSBuZWVkIHRoZSBpbml0aWFsIHN0YXR1cyBsaW5lcyBpZiB3ZSdyZSBkZWxldGluZyB0aGUgcGFnZXMgaW4gdGhlIHBhZ2VzIGFycmF5XG5cdFx0cGFnZURlbGV0ZXIuc2V0T3B0aW9uKCdwcmVzZXJ2ZUluZGl2aWR1YWxTdGF0dXNMaW5lcycsIGRlbGV0ZV9wYWdlKTtcblx0XHRwYWdlRGVsZXRlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0cGFnZURlbGV0ZXIucnVuKFxuXHRcdFx0KHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHRwYWdlOiBwYWdlTmFtZSxcblx0XHRcdFx0XHRkZWxldGVfcGFnZSxcblx0XHRcdFx0XHRkZWxldGVfdGFsayxcblx0XHRcdFx0XHRkZWxldGVfcmVkaXJlY3RzLFxuXHRcdFx0XHRcdHVubGlua19wYWdlLFxuXHRcdFx0XHRcdHVubGlua19maWxlOiB1bmxpbmtfZmlsZSAmJiBuZXcgUmVnRXhwKGBeJHtNb3JlYml0cy5uYW1lc3BhY2VSZWdleCg2KX06YCwgJ2knKS50ZXN0KHBhZ2VOYW1lKSxcblx0XHRcdFx0XHRyZWFzb24sXG5cdFx0XHRcdFx0cGFnZURlbGV0ZXIsXG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0cGFnZU5hbWUsXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjliKDpmaTpobXpnaIgJywgJ+ato+WcqOWIqumZpOmggemdoiAnKSArIHBhZ2VOYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0aWYgKGRlbGV0ZV9wYWdlKSB7XG5cdFx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldEVkaXRTdW1tYXJ5KGAke3JlYXNvbn3vvIjmibnph4/vvIlgKTtcblx0XHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zdXBwcmVzc1Byb3RlY3RXYXJuaW5nKCk7XG5cdFx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLmRlbGV0ZVBhZ2UoVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFja3MuZG9FeHRyYXMsIHBhZ2VEZWxldGVyLndvcmtlckZhaWx1cmUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2tzLmRvRXh0cmFzKHlzYXJjaGl2ZXNfcGFnZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGlmIChkZWxldGVfc3VicGFnZXMpIHtcblx0XHRcdFx0XHRjb25zdCBzdWJwYWdlRGVsZXRlciA9IG5ldyBNb3JlYml0cy5iYXRjaE9wZXJhdGlvbihcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo5Yig6Zmk5a2Q6aG16Z2iJywgJ+ato+WcqOWIqumZpOWtkOmggemdoicpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRzdWJwYWdlRGVsZXRlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hDaHVua3MnKSk7XG5cdFx0XHRcdFx0c3VicGFnZURlbGV0ZXIuc2V0T3B0aW9uKCdwcmVzZXJ2ZUluZGl2aWR1YWxTdGF0dXNMaW5lcycsIHRydWUpO1xuXHRcdFx0XHRcdHN1YnBhZ2VEZWxldGVyLnNldFBhZ2VMaXN0KHN1YnBhZ2VzKTtcblx0XHRcdFx0XHRzdWJwYWdlRGVsZXRlci5ydW4oKHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRcdHBhZ2U6IHBhZ2VOYW1lLFxuXHRcdFx0XHRcdFx0XHRkZWxldGVfcGFnZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0ZGVsZXRlX3RhbGs6IGRlbGV0ZV9zdWJwYWdlX3RhbGtzLFxuXHRcdFx0XHRcdFx0XHRkZWxldGVfcmVkaXJlY3RzOiBkZWxldGVfc3VicGFnZV9yZWRpcmVjdHMsXG5cdFx0XHRcdFx0XHRcdHVubGlua19wYWdlOiB1bmxpbmtfc3VicGFnZXMsXG5cdFx0XHRcdFx0XHRcdHVubGlua19maWxlOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cmVhc29uLFxuXHRcdFx0XHRcdFx0XHRwYWdlRGVsZXRlcjogc3VicGFnZURlbGV0ZXIsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRcdFx0cGFnZU5hbWUsXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo5Yig6Zmk5a2Q6aG16Z2iICcsICfmraPlnKjliKrpmaTlrZDpoIHpnaIgJykgKyBwYWdlTmFtZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRFZGl0U3VtbWFyeShgJHtyZWFzb25977yI5om56YeP77yJYCk7XG5cdFx0XHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnN1cHByZXNzUHJvdGVjdFdhcm5pbmcoKTtcblx0XHRcdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5kZWxldGVQYWdlKFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2tzLmRvRXh0cmFzLCBwYWdlRGVsZXRlci53b3JrZXJGYWlsdXJlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2tzID0ge1xuXHRcdC8vIHRoaXMgc3R1cGlkIHBhcmFtZXRlciBuYW1lIGlzIGEgdGVtcG9yYXJ5IHRoaW5nIHVudGlsIEkgaW1wbGVtZW50IGFuIG92ZXJoYXVsXG5cdFx0Ly8gb2YgTW9yZWJpdHMud2lraS4qIGNhbGxiYWNrIHBhcmFtZXRlcnNcblx0XHRkb0V4dHJhczogKHRoaW5nV2l0aFBhcmFtZXRlcnMpID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHRoaW5nV2l0aFBhcmFtZXRlcnMucGFyZW50XG5cdFx0XHRcdD8gdGhpbmdXaXRoUGFyYW1ldGVycy5wYXJlbnQuZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKClcblx0XHRcdFx0OiB0aGluZ1dpdGhQYXJhbWV0ZXJzLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0Ly8gdGhlIGluaXRpYWwgYmF0Y2ggb3BlcmF0aW9uJ3Mgam9iIGlzIHRvIGRlbGV0ZSB0aGUgcGFnZSwgYW5kIHRoYXQgaGFzXG5cdFx0XHQvLyBzdWNjZWVkZWQgYnkgbm93XG5cdFx0XHRwYXJhbXMucGFnZURlbGV0ZXIud29ya2VyU3VjY2Vzcyh0aGluZ1dpdGhQYXJhbWV0ZXJzKTtcblx0XHRcdGxldCBxdWVyeTtcblx0XHRcdGxldCB5c2FyY2hpdmVzX2FwaTtcblx0XHRcdGlmIChwYXJhbXMudW5saW5rX3BhZ2UpIHtcblx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS51bmxpbmtDYWNoZSA9IHt9O1xuXHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0bGlzdDogJ2JhY2tsaW5rcycsXG5cdFx0XHRcdFx0YmxmaWx0ZXJyZWRpcjogJ25vbnJlZGlyZWN0cycsXG5cdFx0XHRcdFx0YmxuYW1lc3BhY2U6IFswXSxcblx0XHRcdFx0XHRibHRpdGxlOiBwYXJhbXMucGFnZSxcblx0XHRcdFx0XHRibGxpbWl0OiAnbWF4JywgLy8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOiOt+WPlumTvuWFpScsICfmraPlnKjlj5blvpfpgKPlhaUnKSxcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrcy51bmxpbmtCYWNrbGlua3NNYWluXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcyA9IHBhcmFtcztcblx0XHRcdFx0eXNhcmNoaXZlc19hcGkucG9zdCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtcy51bmxpbmtfZmlsZSkge1xuXHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0bGlzdDogJ2ltYWdldXNhZ2UnLFxuXHRcdFx0XHRcdGl1dGl0bGU6IHBhcmFtcy5wYWdlLFxuXHRcdFx0XHRcdGl1bGltaXQ6ICdtYXgnLCAvLyA1MDAgaXMgbWF4IGZvciBub3JtYWwgdXNlcnMsIDUwMDAgZm9yIGJvdHMgYW5kIHN5c29wc1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHlzYXJjaGl2ZXNfYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5q2j5Zyo6I635Y+W5paH5Lu26ZO+5YWlJywgJ+ato+WcqOWPluW+l+aqlOahiOmAo+WFpScpLFxuXHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdFR3aW5rbGUuYmF0Y2hkZWxldGUuY2FsbGJhY2tzLnVubGlua0ltYWdlSW5zdGFuY2VzTWFpblxuXHRcdFx0XHQpO1xuXHRcdFx0XHR5c2FyY2hpdmVzX2FwaS5wYXJhbXMgPSBwYXJhbXM7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMuZGVsZXRlX3BhZ2UpIHtcblx0XHRcdFx0aWYgKHBhcmFtcy5kZWxldGVfcmVkaXJlY3RzKSB7XG5cdFx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHR0aXRsZXM6IHBhcmFtcy5wYWdlLFxuXHRcdFx0XHRcdFx0cHJvcDogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0XHRyZGxpbWl0OiAnbWF4JywgLy8gNTAwIGlzIG1heCBmb3Igbm9ybWFsIHVzZXJzLCA1MDAwIGZvciBib3RzIGFuZCBzeXNvcHNcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0eXNhcmNoaXZlc19hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOiOt+WPlumHjeWumuWQkScsICfmraPlnKjlj5blvpfph43mlrDlsI7lkJEnKSxcblx0XHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdFx0VHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFja3MuZGVsZXRlUmVkaXJlY3RzTWFpblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocGFyYW1zLmRlbGV0ZV90YWxrKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFnZVRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFyYW1zLnBhZ2UpO1xuXHRcdFx0XHRcdGlmIChwYWdlVGl0bGUgJiYgcGFnZVRpdGxlLm5hbWVzcGFjZSAlIDIgPT09IDAgJiYgcGFnZVRpdGxlLm5hbWVzcGFjZSAhPT0gMikge1xuXHRcdFx0XHRcdFx0cGFnZVRpdGxlLm5hbWVzcGFjZSsrOyAvLyBub3cgcGFnZVRpdGxlIGlzIHRoZSB0YWxrIHBhZ2UgdGl0bGUhXG5cdFx0XHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0XHR0aXRsZXM6IHBhZ2VUaXRsZS50b1RleHQoKSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjmo4Dmn6XorqjorrrpobXpnaLmmK/lkKblrZjlnKgnLCAn5q2j5Zyo5qqi5p+l6KiO6KuW6aCB6Z2i5piv5ZCm5a2Y5ZyoJyksXG5cdFx0XHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLmNhbGxiYWNrcy5kZWxldGVUYWxrXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdFx0XHRcdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zLnRhbGtQYWdlID0gcGFnZVRpdGxlLnRvVGV4dCgpO1xuXHRcdFx0XHRcdFx0eXNhcmNoaXZlc19hcGkucG9zdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZGVsZXRlUmVkaXJlY3RzTWFpbjogKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgeG1sID0gYXBpb2JqLnJlc3BvbnNlWE1MO1xuXHRcdFx0Y29uc3QgcGFnZXMgPSAkKHhtbClcblx0XHRcdFx0LmZpbmQoJ3JkJylcblx0XHRcdFx0Lm1hcCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuICQoZWxlbWVudCkuYXR0cigndGl0bGUnKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmdldCgpO1xuXHRcdFx0aWYgKCFwYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVkaXJlY3REZWxldGVyID0gbmV3IE1vcmViaXRzLmJhdGNoT3BlcmF0aW9uKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpOWIsCAnLCAn5q2j5Zyo5Yiq6Zmk5YiwICcpICtcblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLnBhZ2UgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOeahOmHjeWumuWQkScsICcg55qE6YeN5paw5bCO5ZCRJylcblx0XHRcdCk7XG5cdFx0XHRyZWRpcmVjdERlbGV0ZXIuc2V0T3B0aW9uKCdjaHVua1NpemUnLCBUd2lua2xlLmdldFByZWYoJ2JhdGNoQ2h1bmtzJykpO1xuXHRcdFx0cmVkaXJlY3REZWxldGVyLnNldFBhZ2VMaXN0KHBhZ2VzKTtcblx0XHRcdHJlZGlyZWN0RGVsZXRlci5ydW4oKHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0cGFnZU5hbWUsXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjliKDpmaQgJywgJ+ato+WcqOWIqumZpCAnKSArIHBhZ2VOYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0XHRgW1tMSUI6Q1NEI0c5fEc5XV06ICR7d2luZG93LndnVUxTKCfmjIflkJHlt7LliKDpobXpnaLigJwnLCAn5oyH5ZCR5bey5Yiq6aCB6Z2i44CMJyl9JHthcGlvYmoucGFyYW1zLnBhZ2V9JHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn4oCd55qE6YeN5a6a5ZCRJyxcblx0XHRcdFx0XHRcdCfjgI3nmoTph43mlrDlsI7lkJEnXG5cdFx0XHRcdFx0KX1gXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5kZWxldGVQYWdlKHJlZGlyZWN0RGVsZXRlci53b3JrZXJTdWNjZXNzLCByZWRpcmVjdERlbGV0ZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGRlbGV0ZVRhbGs6IChhcGlvYmopID0+IHtcblx0XHRcdGNvbnN0IHhtbCA9IGFwaW9iai5yZXNwb25zZVhNTDtcblx0XHRcdGNvbnN0IGV4aXN0cyA9ICQoeG1sKS5maW5kKCdwYWdlOm5vdChbbWlzc2luZ10pJykubGVuZ3RoID4gMDtcblx0XHRcdGlmICghZXhpc3RzKSB7XG5cdFx0XHRcdC8vIG5vIHRhbGsgcGFnZTsgZm9yZ2V0IGFib3V0IGl0XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0XHRhcGlvYmoucGFyYW1zLnRhbGtQYWdlLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpOmhtemdoiAnLCAn5q2j5Zyo5Yiq6Zmk6aCB6Z2iICcpICtcblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLnBhZ2UgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygnIOeahOiuqOiuuumhtScsICcg55qE6KiO6KuW6aCBJylcblx0XHRcdCk7XG5cdFx0XHRwYWdlLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRgW1tMSUI6Q1NEI0c5fEc5XV06ICR7d2luZG93LndnVUxTKCflt7LliKDpobXpnaLigJwnLCAn5bey5Yiq6aCB6Z2i44CMJyl9JHthcGlvYmoucGFyYW1zLnBhZ2V9JHt3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0J+KAneeahFtbSGVscDrorqjorrrpobV86K6o6K666aG1XV0nLFxuXHRcdFx0XHRcdCfjgI3nmoRbW0hlbHA66KiO6KuW6aCBfOiojuirlumggV1dJ1xuXHRcdFx0XHQpfWBcblx0XHRcdCk7XG5cdFx0XHRwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2UuZGVsZXRlUGFnZSgpO1xuXHRcdH0sXG5cdFx0dW5saW5rQmFja2xpbmtzTWFpbjogKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgeG1sID0gYXBpb2JqLnJlc3BvbnNlWE1MO1xuXHRcdFx0Y29uc3QgcGFnZXMgPSAkKHhtbClcblx0XHRcdFx0LmZpbmQoJ2JsJylcblx0XHRcdFx0Lm1hcCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuICQoZWxlbWVudCkuYXR0cigndGl0bGUnKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmdldCgpO1xuXHRcdFx0aWYgKCFwYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdW5saW5rZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oXG5cdFx0XHRcdGDmraPlnKjlj5bmtojliLAgJHthcGlvYmoucGFyYW1zLnBhZ2V9JHt3aW5kb3cud2dVTFMoJyDnmoTpk77lhaUnLCAnIOeahOmAo+WFpScpfWBcblx0XHRcdCk7XG5cdFx0XHR1bmxpbmtlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hDaHVua3MnKSk7XG5cdFx0XHR1bmxpbmtlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0XHR1bmxpbmtlci5ydW4oKHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0cGFnZU5hbWUsXG5cdFx0XHRcdFx0YOato+WcqOWPlua2iCAke3BhZ2VOYW1lfSR7d2luZG93LndnVUxTKCcg5LiK55qE6ZO+5YWlJywgJyDkuIrnmoTpgKPlhaUnKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHQuLi5hcGlvYmoucGFyYW1zLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRwYXJhbXMudGl0bGUgPSBwYWdlTmFtZTtcblx0XHRcdFx0cGFyYW1zLnVubGlua2VyID0gdW5saW5rZXI7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFja3MudW5saW5rQmFja2xpbmtzKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0dW5saW5rQmFja2xpbmtzOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdGlmICghcGFnZW9iai5leGlzdHMoKSkge1xuXHRcdFx0XHQvLyB3ZSBwcm9iYWJseSBqdXN0IGRlbGV0ZWQgaXQsIGFzIGEgcmVjdXJzaXZlIGJhY2tsaW5rXG5cdFx0XHRcdHBhcmFtcy51bmxpbmtlci53b3JrZXJTdWNjZXNzKHBhZ2VvYmopO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgdGV4dDtcblx0XHRcdGlmIChwYXJhbXMudGl0bGUgaW4gVHdpbmtsZS5iYXRjaGRlbGV0ZS51bmxpbmtDYWNoZSkge1xuXHRcdFx0XHR0ZXh0ID0gVHdpbmtsZS5iYXRjaGRlbGV0ZS51bmxpbmtDYWNoZVtwYXJhbXMudGl0bGVdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9sZF90ZXh0ID0gdGV4dDtcblx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpdGV4dC5wYWdlKHRleHQpO1xuXHRcdFx0dGV4dCA9IHlzYXJjaGl2ZXNfcGFnZS5yZW1vdmVMaW5rKHBhcmFtcy5wYWdlKS5nZXRUZXh0KCk7XG5cdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLnVubGlua0NhY2hlW3BhcmFtcy50aXRsZV0gPSB0ZXh0O1xuXHRcdFx0aWYgKHRleHQgPT09IG9sZF90ZXh0KSB7XG5cdFx0XHRcdC8vIE5vdGhpbmcgdG8gZG8sIHJldHVyblxuXHRcdFx0XHRwYXJhbXMudW5saW5rZXIud29ya2VyU3VjY2VzcyhwYWdlb2JqKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0d2luZG93LndnVUxTKCflj5bmtojliLDlt7LliKDpobXpnaInLCAn5Y+W5raI5Yiw5bey5Yiq6aCB6Z2iJykgKyBwYXJhbXMucGFnZSArIHdpbmRvdy53Z1VMUygn55qE6ZO+5YWlJywgJ+eahOmAo+WFpScpXG5cdFx0XHQpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdFx0cGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ25vY3JlYXRlJyk7XG5cdFx0XHRwYWdlb2JqLnNldE1heENvbmZsaWN0UmV0cmllcygxMCk7XG5cdFx0XHRwYWdlb2JqLnNhdmUocGFyYW1zLnVubGlua2VyLndvcmtlclN1Y2Nlc3MsIHBhcmFtcy51bmxpbmtlci53b3JrZXJGYWlsdXJlKTtcblx0XHR9LFxuXHRcdHVubGlua0ltYWdlSW5zdGFuY2VzTWFpbjogKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgeG1sID0gYXBpb2JqLnJlc3BvbnNlWE1MO1xuXHRcdFx0Y29uc3QgcGFnZXMgPSAkKHhtbClcblx0XHRcdFx0LmZpbmQoJ2l1Jylcblx0XHRcdFx0Lm1hcCgoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuICQoZWxlbWVudCkuYXR0cigndGl0bGUnKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmdldCgpO1xuXHRcdFx0aWYgKCFwYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdW5saW5rZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24oXG5cdFx0XHRcdGDmraPlnKjlj5bmtojliLAgJHthcGlvYmoucGFyYW1zLnBhZ2V9JHt3aW5kb3cud2dVTFMoJyDnmoTpk77lhaUnLCAnIOeahOmAo+WFpScpfWBcblx0XHRcdCk7XG5cdFx0XHR1bmxpbmtlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hDaHVua3MnKSk7XG5cdFx0XHR1bmxpbmtlci5zZXRQYWdlTGlzdChwYWdlcyk7XG5cdFx0XHR1bmxpbmtlci5ydW4oKHBhZ2VOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0cGFnZU5hbWUsXG5cdFx0XHRcdFx0YOWPlua2iCAke3BhZ2VOYW1lfSR7d2luZG93LndnVUxTKCcg55qE5paH5Lu25L2/55SoJywgJyDnmoTmqpTmoYjkvb/nlKgnKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFx0XHQuLi5hcGlvYmoucGFyYW1zLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRwYXJhbXMudGl0bGUgPSBwYWdlTmFtZTtcblx0XHRcdFx0cGFyYW1zLnVubGlua2VyID0gdW5saW5rZXI7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS5iYXRjaGRlbGV0ZS5jYWxsYmFja3MudW5saW5rSW1hZ2VJbnN0YW5jZXMpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHR1bmxpbmtJbWFnZUluc3RhbmNlczogKHBhZ2VvYmopID0+IHtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRpZiAoIXBhZ2VvYmouZXhpc3RzKCkpIHtcblx0XHRcdFx0Ly8gd2UgcHJvYmFibHkganVzdCBkZWxldGVkIGl0LCBhcyBhIHJlY3Vyc2l2ZSBiYWNrbGlua1xuXHRcdFx0XHRwYXJhbXMudW5saW5rZXIud29ya2VyU3VjY2VzcyhwYWdlb2JqKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBwYXJhbXMucGFnZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4ke01vcmViaXRzLm5hbWVzcGFjZVJlZ2V4KDYpfTpgKSwgJycpO1xuXHRcdFx0bGV0IHRleHQ7XG5cdFx0XHRpZiAocGFyYW1zLnRpdGxlIGluIFR3aW5rbGUuYmF0Y2hkZWxldGUudW5saW5rQ2FjaGUpIHtcblx0XHRcdFx0dGV4dCA9IFR3aW5rbGUuYmF0Y2hkZWxldGUudW5saW5rQ2FjaGVbcGFyYW1zLnRpdGxlXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvbGRfdGV4dCA9IHRleHQ7XG5cdFx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraXRleHQucGFnZSh0ZXh0KTtcblx0XHRcdHRleHQgPSB5c2FyY2hpdmVzX3BhZ2Vcblx0XHRcdFx0LmNvbW1lbnRPdXRJbWFnZShpbWFnZSwgd2luZG93LndnVUxTKCflm6Dmlofku7blt7LliKDvvIzmlYXms6jop6MnLCAn5Zug5qqU5qGI5bey5Yiq77yM5pWF6Ki76KejJykpXG5cdFx0XHRcdC5nZXRUZXh0KCk7XG5cdFx0XHRUd2lua2xlLmJhdGNoZGVsZXRlLnVubGlua0NhY2hlW3BhcmFtcy50aXRsZV0gPSB0ZXh0O1xuXHRcdFx0aWYgKHRleHQgPT09IG9sZF90ZXh0KSB7XG5cdFx0XHRcdHBhZ2VvYmpcblx0XHRcdFx0XHQuZ2V0U3RhdHVzRWxlbWVudCgpXG5cdFx0XHRcdFx0LmVycm9yKFxuXHRcdFx0XHRcdFx0YOWcqCAke3BhZ2VvYmouZ2V0UGFnZU5hbWUoKX0g5LiK5Y+W5raIICR7aW1hZ2V9JHt3aW5kb3cud2dVTFMoJyDnmoTmlofku7bkvb/nlKjlpLHotKUnLCAnIOeahOaqlOahiOS9v+eUqOWkseaVlycpfWBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRwYXJhbXMudW5saW5rZXIud29ya2VyRmFpbHVyZShwYWdlb2JqKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cGFnZW9iai5zZXRFZGl0U3VtbWFyeShcblx0XHRcdFx0d2luZG93LndnVUxTKCflj5bmtojkvb/nlKjlt7LooqvliKDpmaTmlofku7YnLCAn5Y+W5raI5L2/55So5bey6KKr5Yiq6Zmk5qqU5qGIJykgK1xuXHRcdFx0XHRcdGltYWdlICtcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ++8jOWboOS4uu+8micsICfvvIzlm6DngrrvvJonKSArXG5cdFx0XHRcdFx0cGFyYW1zLnJlYXNvblxuXHRcdFx0KTtcblx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0Q3JlYXRlT3B0aW9uKCdub2NyZWF0ZScpO1xuXHRcdFx0cGFnZW9iai5zZXRNYXhDb25mbGljdFJldHJpZXMoMTApO1xuXHRcdFx0cGFnZW9iai5zYXZlKHBhcmFtcy51bmxpbmtlci53b3JrZXJTdWNjZXNzLCBwYXJhbXMudW5saW5rZXIud29ya2VyRmFpbHVyZSk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5iYXRjaGRlbGV0ZSwgJ2JhdGNoZGVsZXRlJyk7XG59KShqUXVlcnkpO1xuIiwgIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1ub2NoZWNrXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGViYXRjaHVuZGVsZXRlLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWJhdGNodW5kZWxldGUoJCkge1xuXHQvKipcblx0ICogdHdpbmtsZWJhdGNodW5kZWxldGUuanM6IEJhdGNoIHVuZGVsZXRlIG1vZHVsZVxuXHQgKiBNb2RlIG9mIGludm9jYXRpb246IFRhYiAoXCJVbmQtYmF0Y2hcIilcblx0ICogQWN0aXZlIG9uOiBFeGlzdGluZyB1c2VyIGFuZCBwcm9qZWN0IHBhZ2VzXG5cdCAqL1xuXHRUd2lua2xlLmJhdGNodW5kZWxldGUgPSAoKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0IU1vcmViaXRzLnVzZXJJc1N5c29wIHx8XG5cdFx0XHQhbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSB8fFxuXHRcdFx0KG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgIT09IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlSWRzJykudXNlciAmJlxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpLnByb2plY3QpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFR3aW5rbGUuYWRkUG9ydGxldExpbmsoXG5cdFx0XHRUd2lua2xlLmJhdGNodW5kZWxldGUuY2FsbGJhY2ssXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+aJueWkjScsICfmibnlvqknKSxcblx0XHRcdCd0dy1iYXRjaC11bmRlbCcsXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+WPjeWIoOmZpOmhtemdoicsICflj43liKrpmaTpoIHpnaInKVxuXHRcdCk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2h1bmRlbGV0ZS5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgNDAwKTtcblx0XHRXaW5kb3cuc2V0U2NyaXB0TmFtZSgnVHdpbmtsZScpO1xuXHRcdFdpbmRvdy5zZXRUaXRsZSh3aW5kb3cud2dVTFMoJ+aJuemHj+WPjeWIoOmZpCcsICfmibnmrKHlj43liKrpmaQnKSk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCdUd2lua2xl5biu5YqpJywgJ1R3aW5rbGXoqqrmmI4nKSwgJ0g6VFcvRE9DI2JhdGNodW5kZWxldGUnKTtcblx0XHRjb25zdCBmb3JtID0gbmV3IE1vcmViaXRzLnF1aWNrRm9ybShUd2lua2xlLmJhdGNodW5kZWxldGUuY2FsbGJhY2suZXZhbHVhdGUpO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoi6XlrZjlnKjlt7LliKDpmaTnmoTorqjorrrpobXvvIzkuZ/mgaLlpI0nLCAn6Iul5a2Y5Zyo5bey5Yiq6Zmk55qE6KiO6KuW6aCB77yM5Lmf5oGi5b6pJyksXG5cdFx0XHRcdFx0bmFtZTogJ3VuZGVsX3RhbGsnLFxuXHRcdFx0XHRcdHZhbHVlOiAndW5kZWxfdGFsaycsXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0bGFiZWw6ICfnkIbnlLHvvJonLFxuXHRcdFx0c2l6ZTogNjAsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc3RhdHVzZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0c3RhdHVzZGl2LnN0eWxlLnBhZGRpbmcgPSAnMTVweCc7IC8vIGp1c3Qgc28gaXQgZG9lc24ndCBsb29rIGJyb2tlblxuXHRcdFdpbmRvdy5zZXRDb250ZW50KHN0YXR1c2Rpdik7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoc3RhdHVzZGl2KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdGNvbnN0IHF1ZXJ5ID0ge1xuXHRcdFx0YWN0aW9uOiAncXVlcnknLFxuXHRcdFx0Z2VuZXJhdG9yOiAnbGlua3MnLFxuXHRcdFx0cHJvcDogJ2luZm8nLFxuXHRcdFx0aW5wcm9wOiAncHJvdGVjdGlvbicsXG5cdFx0XHR0aXRsZXM6IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSxcblx0XHRcdGdwbGxpbWl0OiBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4JyksXG5cdFx0fTtcblx0XHRjb25zdCBzdGF0ZWxlbSA9IG5ldyBNb3JlYml0cy5zdGF0dXMod2luZG93LndnVUxTKCfmipPlj5bpobXpnaLliJfooagnLCAn5oqT5Y+W6aCB6Z2i5YiX6KGoJykpO1xuXHRcdGNvbnN0IHlzYXJjaGl2ZXNfYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0d2luZG93LndnVUxTKCfliqDovb3kuK3igKYnLCAn6LyJ5YWl5Lit4oCmJyksXG5cdFx0XHRxdWVyeSxcblx0XHRcdChhcGlvYmopID0+IHtcblx0XHRcdFx0Y29uc3QgeG1sID0gYXBpb2JqLnJlc3BvbnNlWE1MO1xuXHRcdFx0XHRjb25zdCAkcGFnZXMgPSAkKHhtbCkuZmluZCgncGFnZVttaXNzaW5nXScpO1xuXHRcdFx0XHRjb25zdCBsaXN0ID0gW107XG5cdFx0XHRcdCRwYWdlcy5lYWNoKChfaW5kZXgsIHBhZ2UpID0+IHtcblx0XHRcdFx0XHRjb25zdCAkcGFnZSA9ICQocGFnZSk7XG5cdFx0XHRcdFx0Y29uc3QgdGl0bGUgPSAkcGFnZS5hdHRyKCd0aXRsZScpO1xuXHRcdFx0XHRcdGNvbnN0ICRlZGl0cHJvdCA9ICRwYWdlLmZpbmQoJ3ByW3R5cGU9XCJjcmVhdGVcIl1bbGV2ZWw9XCJzeXNvcFwiXScpO1xuXHRcdFx0XHRcdGNvbnN0IGlzUHJvdGVjdGVkID0gJGVkaXRwcm90Lmxlbmd0aCA+IDA7XG5cdFx0XHRcdFx0bGlzdC5wdXNoKHtcblx0XHRcdFx0XHRcdGxhYmVsOlxuXHRcdFx0XHRcdFx0XHR0aXRsZSArXG5cdFx0XHRcdFx0XHRcdChpc1Byb3RlY3RlZFxuXHRcdFx0XHRcdFx0XHRcdD8gYO+8iCR7d2luZG93LndnVUxTKCflhajkv53miqTvvIwnLCAn5YWo5L+d6K2377yMJyl9JHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0JGVkaXRwcm90LmF0dHIoJ2V4cGlyeScpID09PSAnaW5maW5pdHknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyB3aW5kb3cud2dVTFMoJ+aXoOmZkOacnycsICfnhKHpmZDmnJ8nKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogYCR7bmV3IE1vcmViaXRzLmRhdGUoJGVkaXRwcm90LmF0dHIoJ2V4cGlyeScpKS5jYWxlbmRhcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3V0Yydcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCl9IChVVEMpJHt3aW5kb3cud2dVTFMoJ+i/h+acnycsICfpgY7mnJ8nKX1gXG5cdFx0XHRcdFx0XHRcdFx0XHR977yJYFxuXHRcdFx0XHRcdFx0XHRcdDogJycpLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHRpdGxlLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdHN0eWxlOiBpc1Byb3RlY3RlZCA/ICdjb2xvcjogI2YwMCcgOiAnJyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdoZWFkZXInLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W+heaBouWkjemhtemdoicsICflvoXmgaLlvqnpoIHpnaInKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WFqOmAiScsICflhajpgbgnKSxcblx0XHRcdFx0XHRldmVudDogKGUpID0+IHtcblx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdwYWdlcycpKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WFqOS4jemAiScsICflhajkuI3pgbgnKSxcblx0XHRcdFx0XHRldmVudDogKGUpID0+IHtcblx0XHRcdFx0XHRcdCQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGUudGFyZ2V0LmZvcm0sICdwYWdlcycpKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRhcGlvYmoucGFyYW1zLmZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdG5hbWU6ICdwYWdlcycsXG5cdFx0XHRcdFx0c2hpZnRDbGlja1N1cHBvcnQ6IHRydWUsXG5cdFx0XHRcdFx0bGlzdCxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuZm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXBpb2JqLnBhcmFtcy5mb3JtLnJlbmRlcigpO1xuXHRcdFx0XHRhcGlvYmoucGFyYW1zLldpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0XHR9LFxuXHRcdFx0c3RhdGVsZW1cblx0XHQpO1xuXHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcyA9IHtcblx0XHRcdGZvcm0sXG5cdFx0XHRXaW5kb3csXG5cdFx0fTtcblx0XHR5c2FyY2hpdmVzX2FwaS5wb3N0KCk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2h1bmRlbGV0ZS5jYWxsYmFjay5ldmFsdWF0ZSA9IChldmVudCkgPT4ge1xuXHRcdE1vcmViaXRzLndpa2kuYWN0aW9uQ29tcGxldGVkLm5vdGljZSA9IHdpbmRvdy53Z1VMUygn5Y+N5Yig6Zmk5bey5a6M5oiQJywgJ+WPjeWIqumZpOW3suWujOaIkCcpO1xuXHRcdGNvbnN0IG51bVByb3RlY3RlZCA9ICQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGV2ZW50LnRhcmdldCwgJ3BhZ2VzJykpLmZpbHRlcigoX2luZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRyZXR1cm4gZWxlbWVudC5jaGVja2VkICYmIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLmNvbG9yID09PSAncmVkJztcblx0XHR9KS5sZW5ndGg7XG5cdFx0aWYgKFxuXHRcdFx0bnVtUHJvdGVjdGVkID4gMCAmJlxuXHRcdFx0IWNvbmZpcm0oXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5oKo5q2j6KaB5Y+N5Yig6ZmkICcsICfmgqjmraPopoHlj43liKrpmaQgJykgK1xuXHRcdFx0XHRcdG51bVByb3RlY3RlZCArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCcg5Liq5YWo5L+d5oqk6aG16Z2i77yM5oKo56Gu5a6a5ZCX77yfJywgJyDlgIvlhajkv53orbfpoIHpnaLvvIzmgqjnorrlrprll47vvJ8nKVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBwYWdlcyA9IGV2ZW50LnRhcmdldC5nZXRDaGVja2VkKCdwYWdlcycpO1xuXHRcdGNvbnN0IHJlYXNvbiA9IGV2ZW50LnRhcmdldC5yZWFzb24udmFsdWU7XG5cdFx0Y29uc3QgdW5kZWxfdGFsayA9IGV2ZW50LnRhcmdldC5yZWFzb24udmFsdWU7XG5cdFx0aWYgKCFyZWFzb24pIHtcblx0XHRcdG13Lm5vdGlmeSgn5oKo6ZyA6KaB5oyH5a6a55CG55Sx44CCJywge1xuXHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdHRhZzogJ3R3aW5rbGViYXRjaHVuZGVsZXRlJyxcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRNb3JlYml0cy5zaW1wbGVXaW5kb3cuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpO1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGV2ZW50LnRhcmdldCk7XG5cdFx0aWYgKCFwYWdlcykge1xuXHRcdFx0TW9yZWJpdHMuc3RhdHVzLmVycm9yKFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+mUmeivrycsICfpjK/oqqQnKSxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmsqHku4DkuYjopoHlj43liKDpmaTnmoTvvIzlj5bmtojmk43kvZwnLCAn5rKS5LuA6bq86KaB5Y+N5Yiq6Zmk55qE77yM5Y+W5raI5pON5L2cJylcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHBhZ2VVbmRlbGV0ZXIgPSBuZXcgTW9yZWJpdHMuYmF0Y2hPcGVyYXRpb24od2luZG93LndnVUxTKCflj43liKDpmaTpobXpnaInLCAn5Y+N5Yiq6Zmk6aCB6Z2iJykpO1xuXHRcdHBhZ2VVbmRlbGV0ZXIuc2V0T3B0aW9uKCdjaHVua1NpemUnLCBUd2lua2xlLmdldFByZWYoJ2JhdGNoQ2h1bmtzJykpO1xuXHRcdHBhZ2VVbmRlbGV0ZXIuc2V0T3B0aW9uKCdwcmVzZXJ2ZUluZGl2aWR1YWxTdGF0dXNMaW5lcycsIHRydWUpO1xuXHRcdHBhZ2VVbmRlbGV0ZXIuc2V0UGFnZUxpc3QocGFnZXMpO1xuXHRcdHBhZ2VVbmRlbGV0ZXIucnVuKChwYWdlTmFtZSkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0XHRwYWdlOiBwYWdlTmFtZSxcblx0XHRcdFx0dW5kZWxfdGFsayxcblx0XHRcdFx0cmVhc29uLFxuXHRcdFx0XHRwYWdlVW5kZWxldGVyLFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdHBhZ2VOYW1lLFxuXHRcdFx0XHR3aW5kb3cud2dVTFMoJ+WPjeWIoOmZpOmhtemdoicsICflj43liKrpmaTpoIHpnaInKSArIHBhZ2VOYW1lXG5cdFx0XHQpO1xuXHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhwYXJhbXMpO1xuXHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldEVkaXRTdW1tYXJ5KGAke3JlYXNvbn0gKOaJuemHjylgKTtcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc3VwcHJlc3NQcm90ZWN0V2FybmluZygpO1xuXHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldE1heFJldHJpZXMoMyk7IC8vIHRlbXBvcmFyeSBpbmNyZWFzZSBmcm9tIDIgdG8gbWFrZSBiYXRjaHVuZGVsZXRlIG1vcmUgbGlrZWx5IHRvIHN1Y2NlZWRcblx0XHRcdHlzYXJjaGl2ZXNfcGFnZS51bmRlbGV0ZVBhZ2UoVHdpbmtsZS5iYXRjaHVuZGVsZXRlLmNhbGxiYWNrcy5kb0V4dHJhcywgcGFnZVVuZGVsZXRlci53b3JrZXJGYWlsdXJlKTtcblx0XHR9KTtcblx0fTtcblx0VHdpbmtsZS5iYXRjaHVuZGVsZXRlLmNhbGxiYWNrcyA9IHtcblx0XHQvLyB0aGlzIHN0dXBpZCBwYXJhbWV0ZXIgbmFtZSBpcyBhIHRlbXBvcmFyeSB0aGluZyB1bnRpbCBJIGltcGxlbWVudCBhbiBvdmVyaGF1bFxuXHRcdC8vIG9mIE1vcmViaXRzLndpa2kuKiBjYWxsYmFjayBwYXJhbWV0ZXJzXG5cdFx0ZG9FeHRyYXM6ICh0aGluZ1dpdGhQYXJhbWV0ZXJzKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSB0aGluZ1dpdGhQYXJhbWV0ZXJzLnBhcmVudFxuXHRcdFx0XHQ/IHRoaW5nV2l0aFBhcmFtZXRlcnMucGFyZW50LmdldENhbGxiYWNrUGFyYW1ldGVycygpXG5cdFx0XHRcdDogdGhpbmdXaXRoUGFyYW1ldGVycy5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdC8vIHRoZSBpbml0aWFsIGJhdGNoIG9wZXJhdGlvbidzIGpvYiBpcyB0byBkZWxldGUgdGhlIHBhZ2UsIGFuZCB0aGF0IGhhc1xuXHRcdFx0Ly8gc3VjY2VlZGVkIGJ5IG5vd1xuXHRcdFx0cGFyYW1zLnBhZ2VVbmRlbGV0ZXIud29ya2VyU3VjY2Vzcyh0aGluZ1dpdGhQYXJhbWV0ZXJzKTtcblx0XHRcdGxldCBxdWVyeTtcblx0XHRcdGxldCB5c2FyY2hpdmVzX2FwaTtcblx0XHRcdGlmIChwYXJhbXMudW5kZWxfdGFsaykge1xuXHRcdFx0XHRjb25zdCB0YWxrcGFnZW5hbWUgPSBuZXcgbXcuVGl0bGUocGFyYW1zLnBhZ2UpLmdldFRhbGtQYWdlKCkuZ2V0UHJlZml4ZWRUZXh0KCk7XG5cdFx0XHRcdGlmICh0YWxrcGFnZW5hbWUgIT09IHBhcmFtcy5wYWdlKSB7XG5cdFx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHRwcm9wOiAnZGVsZXRlZHJldmlzaW9ucycsXG5cdFx0XHRcdFx0XHRkcnZwcm9wOiAnaWRzJyxcblx0XHRcdFx0XHRcdGRydmxpbWl0OiAxLFxuXHRcdFx0XHRcdFx0dGl0bGVzOiB0YWxrcGFnZW5hbWUsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR5c2FyY2hpdmVzX2FwaSA9IG5ldyBNb3JlYml0cy53aWtpLmFwaShcblx0XHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5qOA5p+l6K6o6K666aG155qE5bey5Yig54mI5pysJywgJ+aqouafpeiojuirlumggeeahOW3suWIqueJiOacrCcpLFxuXHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRUd2lua2xlLmJhdGNodW5kZWxldGUuY2FsbGJhY2tzLnVuZGVsZXRlVGFsa1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0eXNhcmNoaXZlc19hcGkucGFyYW1zID0gcGFyYW1zO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcy50YWxrUGFnZSA9IHRhbGtwYWdlbmFtZTtcblx0XHRcdFx0XHR5c2FyY2hpdmVzX2FwaS5wb3N0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHVuZGVsZXRlVGFsazogKGFwaW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgeG1sID0gYXBpb2JqLnJlc3BvbnNlWE1MO1xuXHRcdFx0Y29uc3QgZXhpc3RzID0gJCh4bWwpLmZpbmQoJ3BhZ2U6bm90KFttaXNzaW5nXSknKS5sZW5ndGggPiAwO1xuXHRcdFx0Y29uc3QgZGVscmV2cyA9ICQoeG1sKS5maW5kKCdyZXYnKS5hdHRyKCdyZXZpZCcpO1xuXHRcdFx0aWYgKGV4aXN0cyB8fCAhZGVscmV2cykge1xuXHRcdFx0XHQvLyBwYWdlIGV4aXN0cyBvciBoYXMgbm8gZGVsZXRlZCByZXZpc2lvbnM7IGZvcmdldCBhYm91dCBpdFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy50YWxrUGFnZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjlj43liKDpmaQnLCAn5q2j5Zyo5Y+N5Yiq6ZmkJykgKyBhcGlvYmoucGFyYW1zLnBhZ2UgKyB3aW5kb3cud2dVTFMoJ+eahOiuqOiuuumhtScsICfnmoToqI7oq5bpoIEnKVxuXHRcdFx0KTtcblx0XHRcdHBhZ2Uuc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygn5Y+N5Yig6Zmk4oCcJywgJ+WPjeWIqumZpOOAjCcpICtcblx0XHRcdFx0XHRhcGlvYmoucGFyYW1zLnBhZ2UgK1xuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn4oCd55qEW1tIZWxwOuiuqOiuuumhtXzorqjorrrpobVdXScsICfjgI3nmoRbW0hlbHA66KiO6KuW6aCBfOiojuirlumggV1dJylcblx0XHRcdCk7XG5cdFx0XHRwYWdlLnNldENoYW5nZVRhZ3MoVHdpbmtsZS5jaGFuZ2VUYWdzKTtcblx0XHRcdHBhZ2UudW5kZWxldGVQYWdlKCk7XG5cdFx0fSxcblx0fTtcblx0VHdpbmtsZS5hZGRJbml0Q2FsbGJhY2soVHdpbmtsZS5iYXRjaHVuZGVsZXRlLCAnYmF0Y2h1bmRlbGV0ZScpO1xufSkoalF1ZXJ5KTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGViYXRjaHByb3RlY3QuanMgKi9cbihmdW5jdGlvbiB0d2lua2xlYmF0Y2hwcm90ZWN0KCQpIHtcblx0LyoqXG5cdCAqIHR3aW5rbGViYXRjaHByb3RlY3QuanM6IEJhdGNoIHByb3RlY3QgbW9kdWxlIChzeXNvcHMgb25seSlcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBUYWIgKFwiUC1iYXRjaFwiKVxuXHQgKiBBY3RpdmUgb246IEV4aXN0aW5nIHByb2plY3QgcGFnZXMgYW5kIHVzZXIgcGFnZXM7XG5cdCAqIGV4aXN0aW5nIGFuZCBub24tZXhpc3RpbmcgY2F0ZWdvcmllczsgU3BlY2lhbDpQcmVmaXhJbmRleFxuXHQgKi9cblx0VHdpbmtsZS5iYXRjaHByb3RlY3QgPSAoKSA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0TW9yZWJpdHMudXNlcklzU3lzb3AgJiZcblx0XHRcdCgobXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSA+IDAgJiYgWzIsIDRdLmluY2x1ZGVzKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykpKSB8fFxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSAxNCB8fFxuXHRcdFx0XHRtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnUHJlZml4aW5kZXgnKVxuXHRcdCkge1xuXHRcdFx0VHdpbmtsZS5hZGRQb3J0bGV0TGluayhUd2lua2xlLmJhdGNocHJvdGVjdC5jYWxsYmFjaywgJ+aJueS/nScsICd0dy1wYmF0Y2gnLCAn5om56YeP5L+d5oqk6ZO+5Ye66aG16Z2iJyk7XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmJhdGNocHJvdGVjdC51bmxpbmtDYWNoZSA9IHt9O1xuXHRUd2lua2xlLmJhdGNocHJvdGVjdC5jYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBXaW5kb3cgPSBuZXcgTW9yZWJpdHMuc2ltcGxlV2luZG93KDYwMCwgNDAwKTtcblx0XHRXaW5kb3cuc2V0VGl0bGUoJ+aJueS/nScpO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3RlckxpbmsoJ+S/neaKpOadoeS+iycsICdMSUI6UFJPVCcpO1xuXHRcdFdpbmRvdy5hZGRGb290ZXJMaW5rKHdpbmRvdy53Z1VMUygn5biu5Yqp5paH5qGjJywgJ+W5q+WKqeaWh+aqlCcpLCAnSDpUVy9ET0Mj5L+d5oqkJyk7XG5cdFx0V2luZG93LmFkZEZvb3Rlckxpbmsod2luZG93LndnVUxTKCfpl67popjlj43ppognLCAn5ZWP6aGM5Y+N6aWLJyksICdIVDpUVycpO1xuXHRcdGNvbnN0IGZvcm0gPSBuZXcgTW9yZWJpdHMucXVpY2tGb3JtKFR3aW5rbGUuYmF0Y2hwcm90ZWN0LmNhbGxiYWNrLmV2YWx1YXRlKTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0ZXZlbnQ6IFR3aW5rbGUucHJvdGVjdC5mb3JtZXZlbnRzLmVkaXRtb2RpZnksXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJ+S/ruaUuee8lui+keS/neaKpCcsXG5cdFx0XHRcdFx0dmFsdWU6ICdlZGl0bW9kaWZ5Jyxcblx0XHRcdFx0XHRuYW1lOiAnZWRpdG1vZGlmeScsXG5cdFx0XHRcdFx0dG9vbHRpcDogJ+S7hemZkOeOsOaciemhtemdouOAgicsXG5cdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRuYW1lOiAnZWRpdGxldmVsJyxcblx0XHRcdGxhYmVsOiAn57yW6L6R5p2D6ZmQ77yaJyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5lZGl0bGV2ZWwsXG5cdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvbkxldmVscyxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnc2VsZWN0Jyxcblx0XHRcdG5hbWU6ICdlZGl0ZXhwaXJ5Jyxcblx0XHRcdGxhYmVsOiAn57uI5q2i5pe26Ze077yaJyxcblx0XHRcdGV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ2N1c3RvbScpIHtcblx0XHRcdFx0XHRUd2lua2xlLnByb3RlY3QuZG9DdXN0b21FeHBpcnkoZXZlbnQudGFyZ2V0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGVuZ3RocywgLy8gRGVmYXVsdCAoMiBkYXlzKSBzZXQgYWZ0ZXIgcmVuZGVyXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5tb3ZlbW9kaWZ5LFxuXHRcdFx0bGlzdDogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICfkv67mlLnnp7vliqjkv53miqQnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbW92ZW1vZGlmeScsXG5cdFx0XHRcdFx0bmFtZTogJ21vdmVtb2RpZnknLFxuXHRcdFx0XHRcdHRvb2x0aXA6ICfku4XpmZDnjrDmnInpobXpnaLjgIInLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ21vdmVsZXZlbCcsXG5cdFx0XHRsYWJlbDogJ+enu+WKqOadg+mZkO+8micsXG5cdFx0XHRldmVudDogVHdpbmtsZS5wcm90ZWN0LmZvcm1ldmVudHMubW92ZWxldmVsLFxuXHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZXZlbHMuZmlsdGVyKFxuXHRcdFx0XHQvLyBBdXRvY29uZmlybWVkIGlzIHJlcXVpcmVkIGZvciBhIG1vdmUsIHJlZHVuZGFudFxuXHRcdFx0XHQocHJvdExldmVsKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3RMZXZlbC52YWx1ZSAhPT0gJ2F1dG9jb25maXJtZWQnO1xuXHRcdFx0XHR9XG5cdFx0XHQpLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ21vdmVleHBpcnknLFxuXHRcdFx0bGFiZWw6ICfnu4jmraLml7bpl7TvvJonLFxuXHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoZXZlbnQudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tJykge1xuXHRcdFx0XHRcdFR3aW5rbGUucHJvdGVjdC5kb0N1c3RvbUV4cGlyeShldmVudC50YXJnZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0bGlzdDogVHdpbmtsZS5wcm90ZWN0LnByb3RlY3Rpb25MZW5ndGhzLCAvLyBEZWZhdWx0ICgyIGRheXMpIHNldCBhZnRlciByZW5kZXJcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0ZXZlbnQ6IChldmVudCkgPT4ge1xuXHRcdFx0XHRldmVudC50YXJnZXQuZm9ybS5jcmVhdGVsZXZlbC5kaXNhYmxlZCA9ICFldmVudC50YXJnZXQuY2hlY2tlZDtcblx0XHRcdFx0ZXZlbnQudGFyZ2V0LmZvcm0uY3JlYXRlZXhwaXJ5LmRpc2FibGVkID1cblx0XHRcdFx0XHQhZXZlbnQudGFyZ2V0LmNoZWNrZWQgfHwgZXZlbnQudGFyZ2V0LmZvcm0uY3JlYXRlbGV2ZWwudmFsdWUgPT09ICdhbGwnO1xuXHRcdFx0XHRldmVudC50YXJnZXQuZm9ybS5jcmVhdGVsZXZlbC5zdHlsZS5jb2xvciA9IGV2ZW50LnRhcmdldC5jaGVja2VkID8gJycgOiAndHJhbnNwYXJlbnQnO1xuXHRcdFx0XHRldmVudC50YXJnZXQuZm9ybS5jcmVhdGVleHBpcnkuc3R5bGUuY29sb3IgPSBldmVudC50YXJnZXQuY2hlY2tlZCA/ICcnIDogJ3RyYW5zcGFyZW50Jztcblx0XHRcdH0sXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJ+S/ruaUueWIm+W7uuS/neaKpCcsXG5cdFx0XHRcdFx0dmFsdWU6ICdjcmVhdGVtb2RpZnknLFxuXHRcdFx0XHRcdG5hbWU6ICdjcmVhdGVtb2RpZnknLFxuXHRcdFx0XHRcdHRvb2x0aXA6ICfku4XpmZDkuI3lrZjlnKjnmoTpobXpnaLjgIInLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ2NyZWF0ZWxldmVsJyxcblx0XHRcdGxhYmVsOiAn5Yib5bu65p2D6ZmQ77yaJyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLnByb3RlY3QuZm9ybWV2ZW50cy5jcmVhdGVsZXZlbCxcblx0XHRcdGxpc3Q6IFR3aW5rbGUucHJvdGVjdC5wcm90ZWN0aW9uTGV2ZWxzLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0bmFtZTogJ2NyZWF0ZWV4cGlyeScsXG5cdFx0XHRsYWJlbDogJ+e7iOatouaXtumXtO+8micsXG5cdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChldmVudC50YXJnZXQudmFsdWUgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdFx0VHdpbmtsZS5wcm90ZWN0LmRvQ3VzdG9tRXhwaXJ5KGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRsaXN0OiBUd2lua2xlLnByb3RlY3QucHJvdGVjdGlvbkxlbmd0aHMsIC8vIERlZmF1bHQgKGluZGVmaW5pdGUpIHNldCBhZnRlciByZW5kZXJcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnaGVhZGVyJyxcblx0XHRcdGxhYmVsOiAnJywgLy8gaG9yaXpvbnRhbCBydWxlXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2lucHV0Jyxcblx0XHRcdG5hbWU6ICdyZWFzb24nLFxuXHRcdFx0bGFiZWw6ICfnkIbnlLHvvIjkv53miqTml6Xlv5fvvIknLFxuXHRcdFx0c2l6ZTogNjAsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRwcm9wOiAncmV2aXNpb25zfGluZm98aW1hZ2VpbmZvJyxcblx0XHRcdHJ2cHJvcDogJ3NpemV8dXNlcicsXG5cdFx0XHRpbnByb3A6ICdwcm90ZWN0aW9uJyxcblx0XHRcdGZvcm1hdDogJ2pzb24nLFxuXHRcdH07XG5cdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IDE0KSB7XG5cdFx0XHQvLyBjYXRlZ29yaWVzXG5cdFx0XHRxdWVyeS5nZW5lcmF0b3IgPSAnY2F0ZWdvcnltZW1iZXJzJztcblx0XHRcdHF1ZXJ5LmdjbXRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXHRcdFx0cXVlcnkuZ2NtbGltaXQgPSBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4Jyk7XG5cdFx0fSBlbHNlIGlmIChtdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbFNwZWNpYWxQYWdlTmFtZScpID09PSAnUHJlZml4aW5kZXgnKSB7XG5cdFx0XHRxdWVyeS5nZW5lcmF0b3IgPSAnYWxscGFnZXMnO1xuXHRcdFx0cXVlcnkuZ2FwbmFtZXNwYWNlID1cblx0XHRcdFx0bXcudXRpbC5nZXRQYXJhbVZhbHVlKCduYW1lc3BhY2UnKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3RbbmFtZT1uYW1lc3BhY2VdJylbMF0udmFsdWU7XG5cdFx0XHRxdWVyeS5nYXBwcmVmaXggPVxuXHRcdFx0XHRtdy51dGlsLmdldFBhcmFtVmFsdWUoJ3ByZWZpeCcpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9cHJlZml4XScpWzBdLnZhbHVlO1xuXHRcdFx0cXVlcnkuZ2FwbGltaXQgPSBUd2lua2xlLmdldFByZWYoJ2JhdGNoTWF4Jyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHF1ZXJ5LmdlbmVyYXRvciA9ICdsaW5rcyc7XG5cdFx0XHRxdWVyeS50aXRsZXMgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cdFx0XHRxdWVyeS5ncGxsaW1pdCA9IFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hNYXgnKTtcblx0XHR9XG5cdFx0Y29uc3Qgc3RhdHVzZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0c3RhdHVzZGl2LnN0eWxlLnBhZGRpbmcgPSAnMTVweCc7IC8vIGp1c3Qgc28gaXQgZG9lc24ndCBsb29rIGJyb2tlblxuXHRcdFdpbmRvdy5zZXRDb250ZW50KHN0YXR1c2Rpdik7XG5cdFx0TW9yZWJpdHMuc3RhdHVzLmluaXQoc3RhdHVzZGl2KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdGNvbnN0IHN0YXRlbGVtID0gbmV3IE1vcmViaXRzLnN0YXR1cygn5oqT5Y+W6aG16Z2i5YiX6KGoJyk7XG5cdFx0Y29uc3QgeXNhcmNoaXZlc19hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHQn5Yqg6L295Lit4oCm4oCmJyxcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0KGFwaW9iaikgPT4ge1xuXHRcdFx0XHRjb25zdCByZXNwb25zZSA9IGFwaW9iai5nZXRSZXNwb25zZSgpO1xuXHRcdFx0XHRjb25zdCBwYWdlcyA9IChyZXNwb25zZS5xdWVyeSAmJiByZXNwb25zZS5xdWVyeS5wYWdlcykgfHwgW107XG5cdFx0XHRcdGNvbnN0IGxpc3QgPSBbXTtcblx0XHRcdFx0cGFnZXMuc29ydChUd2lua2xlLnNvcnRCeU5hbWVzcGFjZSk7XG5cdFx0XHRcdGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFkYXRhID0gW107XG5cdFx0XHRcdFx0Y29uc3QgbWlzc2luZyA9ICEhcGFnZS5taXNzaW5nO1xuXHRcdFx0XHRcdGxldCBlZGl0UHJvdDtcblx0XHRcdFx0XHRpZiAobWlzc2luZykge1xuXHRcdFx0XHRcdFx0bWV0YWRhdGEucHVzaCgn6aG16Z2i5LiN5a2Y5ZyoJyk7XG5cdFx0XHRcdFx0XHRlZGl0UHJvdCA9IHBhZ2UucHJvdGVjdGlvblxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKChwcm90ZWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHByb3RlY3Rpb24udHlwZSA9PT0gJ2NyZWF0ZScgJiYgcHJvdGVjdGlvbi5sZXZlbCA9PT0gJ3N5c29wJztcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnBvcCgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAocGFnZS5yZWRpcmVjdCkge1xuXHRcdFx0XHRcdFx0XHRtZXRhZGF0YS5wdXNoKCfph43lrprlkJEnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChwYWdlLm5zID09PSA2KSB7XG5cdFx0XHRcdFx0XHRcdG1ldGFkYXRhLnB1c2goYOS4iuS8oOiAhe+8miR7cGFnZS5pbWFnZWluZm9bMF0udXNlcn1gLCBg5pyA5ZCO57yW6L6R6ICF77yaJHtwYWdlLnJldmlzaW9uc1swXS51c2VyfWApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bWV0YWRhdGEucHVzaChgJHttdy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKHBhZ2UucmV2aXNpb25zWzBdLnNpemUpfeWtl+iKgmApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWRpdFByb3QgPSBwYWdlLnByb3RlY3Rpb25cblx0XHRcdFx0XHRcdFx0LmZpbHRlcigocHJvdGVjdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm90ZWN0aW9uLnR5cGUgPT09ICdlZGl0JyAmJiBwcm90ZWN0aW9uLmxldmVsID09PSAnc3lzb3AnO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQucG9wKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChlZGl0UHJvdCkge1xuXHRcdFx0XHRcdFx0bWV0YWRhdGEucHVzaChcblx0XHRcdFx0XHRcdFx0YCR7bWlzc2luZyA/ICfnmb3nurgnIDogJyd95YWo5L+d5oqkJHtcblx0XHRcdFx0XHRcdFx0XHRlZGl0UHJvdC5leHBpcnkgPT09ICdpbmZpbml0eSdcblx0XHRcdFx0XHRcdFx0XHRcdD8gJ++8iOawuOS5he+8iSdcblx0XHRcdFx0XHRcdFx0XHRcdDogYO+8iCR7bmV3IE1vcmViaXRzLmRhdGUoZWRpdFByb3QuZXhwaXJ5KS5jYWxlbmRhcigndXRjJyl9IChVVEMp6L+H5pyf77yJYFxuXHRcdFx0XHRcdFx0XHR9YFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3Qge3RpdGxlfSA9IHBhZ2U7XG5cdFx0XHRcdFx0bGlzdC5wdXNoKHtcblx0XHRcdFx0XHRcdGxhYmVsOiB0aXRsZSArIChtZXRhZGF0YS5sZW5ndGggPiAwID8gYCAoJHttZXRhZGF0YS5qb2luKCc7ICcpfSlgIDogJycpLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHRpdGxlLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdHN0eWxlOiBlZGl0UHJvdCA/ICdjb2xvcjogI2YwMCcgOiAnJyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHRcdFx0dHlwZTogJ2hlYWRlcicsXG5cdFx0XHRcdFx0bGFiZWw6ICflvoXkv53miqTpobXpnaInLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiAn5YWo6YCJJyxcblx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHQkKE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhldmVudC50YXJnZXQuZm9ybSwgJ3BhZ2VzJykpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0XHRcdHR5cGU6ICdidXR0b24nLFxuXHRcdFx0XHRcdGxhYmVsOiAn5YWo5LiN6YCJJyxcblx0XHRcdFx0XHRldmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHQkKE1vcmViaXRzLnF1aWNrRm9ybS5nZXRFbGVtZW50cyhldmVudC50YXJnZXQuZm9ybSwgJ3BhZ2VzJykpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnY2hlY2tib3gnLFxuXHRcdFx0XHRcdG5hbWU6ICdwYWdlcycsXG5cdFx0XHRcdFx0c2hpZnRDbGlja1N1cHBvcnQ6IHRydWUsXG5cdFx0XHRcdFx0bGlzdCxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0XHR0eXBlOiAnc3VibWl0Jyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0XHRcdFdpbmRvdy5zZXRDb250ZW50KHJlc3VsdCk7XG5cdFx0XHRcdC8vIFNldCBkZWZhdWx0c1xuXHRcdFx0XHRyZXN1bHQuZWRpdGV4cGlyeS52YWx1ZSA9ICcyIGRheXMnO1xuXHRcdFx0XHRyZXN1bHQubW92ZWV4cGlyeS52YWx1ZSA9ICcyIGRheXMnO1xuXHRcdFx0XHRyZXN1bHQuY3JlYXRlZXhwaXJ5LnZhbHVlID0gJ2luZmluaXR5Jztcblx0XHRcdFx0Zm9yIChjb25zdCBsaW5rcyBvZiBNb3JlYml0cy5xdWlja0Zvcm0uZ2V0RWxlbWVudHMocmVzdWx0LCAn5Liq6aG16Z2iJykpIHtcblx0XHRcdFx0XHRUd2lua2xlLmdlbmVyYXRlQXJyb3dMaW5rcyhsaW5rcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzdGF0ZWxlbVxuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19hcGkucG9zdCgpO1xuXHR9O1xuXHRUd2lua2xlLmJhdGNocHJvdGVjdC5jdXJyZW50UHJvdGVjdENvdW50ZXIgPSAwO1xuXHRUd2lua2xlLmJhdGNocHJvdGVjdC5jdXJyZW50cHJvdGVjdG9yID0gMDtcblx0VHdpbmtsZS5iYXRjaHByb3RlY3QuY2FsbGJhY2suZXZhbHVhdGUgPSAoZXZlbnQpID0+IHtcblx0XHRNb3JlYml0cy53aWtpLmFjdGlvbkNvbXBsZXRlZC5ub3RpY2UgPSAn5om56YeP5L+d5oqk5a6M5oiQJztcblx0XHRjb25zdCBmb3JtID0gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnN0IG51bVByb3RlY3RlZCA9ICQoTW9yZWJpdHMucXVpY2tGb3JtLmdldEVsZW1lbnRzKGZvcm0sICfkuKrpobXpnaInKSkuZmlsdGVyKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcblx0XHRcdHJldHVybiBlbGVtZW50LmNoZWNrZWQgJiYgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcuc3R5bGUuY29sb3IgPT09ICcjZjAwJztcblx0XHR9KS5sZW5ndGg7XG5cdFx0aWYgKFxuXHRcdFx0bnVtUHJvdGVjdGVkID4gMCAmJlxuXHRcdFx0IWNvbmZpcm0oYOaCqOWNs+WwhuWvuSR7bXcubGFuZ3VhZ2UuY29udmVydE51bWJlcihudW1Qcm90ZWN0ZWQpfeS4quWFqOS/neaKpOmhtemdoui/m+ihjOaTjeS9nOOAguaCqOehruWumuWQl++8n2ApXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGlucHV0ID0gTW9yZWJpdHMucXVpY2tGb3JtLmdldElucHV0RGF0YShmb3JtKTtcblx0XHRpZiAoIWlucHV0LnJlYXNvbikge1xuXHRcdFx0bXcubm90aWZ5KCfmgqjlv4Xpobvnu5nlh7rkuIDkuKrnkIbnlLHjgIInLCB7XG5cdFx0XHRcdHR5cGU6ICd3YXJuJyxcblx0XHRcdFx0dGFnOiAndHdpbmtsZWJhdGNocHJvdGVjdCcsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChmb3JtKTtcblx0XHRpZiAoaW5wdXQucGFnZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRNb3JlYml0cy5zdGF0dXMuZXJyb3IoJ0Vycm9yJywgJ+W+heS/neaKpOmhtemdouS4jeWtmOWcqO+8jOeoi+W6j+e7iOatoicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBiYXRjaE9wZXJhdGlvbiA9IG5ldyBNb3JlYml0cy5iYXRjaE9wZXJhdGlvbign5bqU55So5L+d5oqk6K6+572uJyk7XG5cdFx0YmF0Y2hPcGVyYXRpb24uc2V0T3B0aW9uKCdjaHVua1NpemUnLCBUd2lua2xlLmdldFByZWYoJ2JhdGNoQ2h1bmtzJykpO1xuXHRcdGJhdGNoT3BlcmF0aW9uLnNldE9wdGlvbigncHJlc2VydmVJbmRpdmlkdWFsU3RhdHVzTGluZXMnLCB0cnVlKTtcblx0XHRiYXRjaE9wZXJhdGlvbi5zZXRQYWdlTGlzdChpbnB1dC5wYWdlcyk7XG5cdFx0YmF0Y2hPcGVyYXRpb24ucnVuKChwYWdlTmFtZSkgPT4ge1xuXHRcdFx0Y29uc3QgcXVlcnkgPSB7XG5cdFx0XHRcdGFjdGlvbjogJ3F1ZXJ5Jyxcblx0XHRcdFx0dGl0bGVzOiBwYWdlTmFtZSxcblx0XHRcdFx0Zm9ybWF0OiAnanNvbicsXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgeXNhcmNoaXZlc19hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdGDmraPlnKjmo4Dmn6XpobXpnaLigJwke3BhZ2VOYW1lfeKAneaYr+WQpuWtmOWcqGAsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRUd2lua2xlLmJhdGNocHJvdGVjdC5jYWxsYmFja3MubWFpbixcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0YmF0Y2hPcGVyYXRpb24ud29ya2VyRmFpbHVyZVxuXHRcdFx0KTtcblx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcyA9IHtcblx0XHRcdFx0cGFnZTogcGFnZU5hbWUsXG5cdFx0XHRcdGJhdGNoT3BlcmF0aW9uLFxuXHRcdFx0XHQuLi5pbnB1dCxcblx0XHRcdH07XG5cdFx0XHR5c2FyY2hpdmVzX2FwaS5wb3N0KCk7XG5cdFx0fSk7XG5cdH07XG5cdFR3aW5rbGUuYmF0Y2hwcm90ZWN0LmNhbGxiYWNrcyA9IHtcblx0XHRtYWluOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGFwaW9iai5nZXRSZXNwb25zZSgpO1xuXHRcdFx0aWYgKHJlc3BvbnNlLnF1ZXJ5Lm5vcm1hbGl6ZWQpIHtcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy5wYWdlID0gcmVzcG9uc2UucXVlcnkubm9ybWFsaXplZFswXS50bztcblx0XHRcdH1cblx0XHRcdGNvbnN0IGV4aXN0cyA9ICFyZXNwb25zZS5xdWVyeS5wYWdlc1swXS5taXNzaW5nO1xuXHRcdFx0Y29uc3QgcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoYXBpb2JqLnBhcmFtcy5wYWdlLCBg5q2j5Zyo5L+d5oqkJHthcGlvYmoucGFyYW1zLnBhZ2V9YCk7XG5cdFx0XHRsZXQgdGFrZW5BY3Rpb24gPSBmYWxzZTtcblx0XHRcdGlmIChleGlzdHMgJiYgYXBpb2JqLnBhcmFtcy5lZGl0bW9kaWZ5KSB7XG5cdFx0XHRcdHBhZ2Uuc2V0RWRpdFByb3RlY3Rpb24oYXBpb2JqLnBhcmFtcy5lZGl0bGV2ZWwsIGFwaW9iai5wYXJhbXMuZWRpdGV4cGlyeSk7XG5cdFx0XHRcdHRha2VuQWN0aW9uID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChleGlzdHMgJiYgYXBpb2JqLnBhcmFtcy5tb3ZlbW9kaWZ5KSB7XG5cdFx0XHRcdHBhZ2Uuc2V0TW92ZVByb3RlY3Rpb24oYXBpb2JqLnBhcmFtcy5tb3ZlbGV2ZWwsIGFwaW9iai5wYXJhbXMubW92ZWV4cGlyeSk7XG5cdFx0XHRcdHRha2VuQWN0aW9uID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmICghZXhpc3RzICYmIGFwaW9iai5wYXJhbXMuY3JlYXRlbW9kaWZ5KSB7XG5cdFx0XHRcdHBhZ2Uuc2V0Q3JlYXRlUHJvdGVjdGlvbihhcGlvYmoucGFyYW1zLmNyZWF0ZWxldmVsLCBhcGlvYmoucGFyYW1zLmNyZWF0ZWV4cGlyeSk7XG5cdFx0XHRcdHRha2VuQWN0aW9uID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmICghdGFrZW5BY3Rpb24pIHtcblx0XHRcdFx0TW9yZWJpdHMuc3RhdHVzLndhcm4oXG5cdFx0XHRcdFx0YOato+WcqOS/neaKpOKAnCR7YXBpb2JqLnBhcmFtcy5wYWdlfWAsXG5cdFx0XHRcdFx0YOKAnemhtemdoiR7ZXhpc3RzID8gJ+WtmOWcqCcgOiAn5LiN5a2Y5ZyoJ33vvJvml6Dkuovlj6/lgZrvvIzot7Pov4dgXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFwaW9iai5wYXJhbXMuYmF0Y2hPcGVyYXRpb24ud29ya2VyRmFpbHVyZShhcGlvYmopO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRwYWdlLnNldEVkaXRTdW1tYXJ5KGFwaW9iai5wYXJhbXMucmVhc29uKTtcblx0XHRcdHBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZS5wcm90ZWN0KGFwaW9iai5wYXJhbXMuYmF0Y2hPcGVyYXRpb24ud29ya2VyU3VjY2VzcywgYXBpb2JqLnBhcmFtcy5iYXRjaE9wZXJhdGlvbi53b3JrZXJGYWlsdXJlKTtcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLmJhdGNocHJvdGVjdCwgJ2JhdGNocHJvdGVjdCcpO1xufSkoalF1ZXJ5KTtcbiIsICIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtbm9jaGVja1xuXG4vKiEgVHdpbmtsZS5qcyAtIHR3aW5rbGVjbG9zZS5qcyAqL1xuKGZ1bmN0aW9uIHR3aW5rbGVjbG9zZSgkKSB7XG5cdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHQvKipcblx0ICogdHdpbmtsZWNsb3NlLmpzOiBYRkQgY2xvc2luZyBtb2R1bGVcblx0ICogTW9kZSBvZiBpbnZvY2F0aW9uOiBMaW5rcyBhZnRlciBzZWN0aW9uIGhlYWRpbmdcblx0ICogQWN0aXZlIG9uOiBBZkQgZGF0ZWQgYXJjaGl2ZSBwYWdlc1xuXHQgKiBDb25maWcgZGlyZWN0aXZlcyBpbjogVHdpbmtsZUNvbmZpZ1xuXHQgKi9cblx0VHdpbmtsZS5jbG9zZSA9ICgpID0+IHtcblx0XHRpZiAoXG5cdFx0XHRUd2lua2xlLmdldFByZWYoJ1hmZENsb3NlJykgPT09ICdoaWRlJyB8fFxuXHRcdFx0IS9e5pyJ5YW95qGj5qGI6aaGKFtfIF10YWxrKT865a2Y5bqf6K6o6K66XFwv6K6w5b2VKD86XFwvXFxkKyl7M30kLy50ZXN0KG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSlcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bXcuaG9vaygnd2lraXBhZ2UuY29udGVudCcpLmFkZCgoaXRlbSkgPT4ge1xuXHRcdFx0aWYgKGl0ZW0uYXR0cignaWQnKSA9PT0gJ213LWNvbnRlbnQtdGV4dCcpIHtcblx0XHRcdFx0VHdpbmtsZS5jbG9zZS5hZGRMaW5rcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHRUd2lua2xlLmNsb3NlLmFkZExpbmtzID0gKCkgPT4ge1xuXHRcdGNvbnN0IHNwYW5UYWcgPSAoY29sb3IsIGNvbnRlbnQpID0+IHtcblx0XHRcdGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0XHRzcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7XG5cdFx0XHRzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTtcblx0XHRcdHJldHVybiBzcGFuO1xuXHRcdH07XG5cdFx0JGJvZHlcblx0XHRcdC5maW5kKFxuXHRcdFx0XHQnaDE6aGFzKC5tdy1oZWFkbGluZSksaDI6aGFzKC5tdy1oZWFkbGluZSksaDM6aGFzKC5tdy1oZWFkbGluZSksaDQ6aGFzKC5tdy1oZWFkbGluZSksaDU6aGFzKC5tdy1oZWFkbGluZSksaDY6aGFzKC5tdy1oZWFkbGluZSknLFxuXHRcdFx0XHQnI2JvZHlDb250ZW50J1xuXHRcdFx0KVxuXHRcdFx0LmVhY2goKGluZGV4LCBlbGVtZW50KSA9PiB7XG5cdFx0XHRcdGVsZW1lbnQuZGF0YXNldC5zZWN0aW9uID0gaW5kZXggKyAxO1xuXHRcdFx0fSk7XG5cdFx0Y29uc3Qgc2VsZWN0b3IgPSAnOmhhcygubXctaGVhZGxpbmUgYTpvbmx5LW9mLXR5cGUpOm5vdCg6aGFzKCsgZGl2Lk5hdkZyYW1lKSknO1xuXHRcdGNvbnN0IHRpdGxlcyA9ICRib2R5LmZpbmQoJyNib2R5Q29udGVudCcpLmZpbmQoYGgyJHtzZWxlY3Rvcn06bm90KDpoYXMoKyBwICsgaDMpKSwgaDMke3NlbGVjdG9yfWApOyAvLyByZWFsbHkgbmVlZHMgdG8gd29yayBvblxuXHRcdGNvbnN0IGRlbE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHJvbmcnKTtcblx0XHRjb25zdCBkZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdGRlbExpbmsuYXBwZW5kQ2hpbGQoc3BhblRhZygnQmxhY2snLCAnWycpKTtcblx0XHRkZWxMaW5rLmFwcGVuZENoaWxkKHNwYW5UYWcoJ1JlZCcsIHdpbmRvdy53Z1VMUygn5YWz6Zet6K6o6K66JywgJ+mXnOmWieiojuirlicpKSk7XG5cdFx0ZGVsTGluay5hcHBlbmRDaGlsZChzcGFuVGFnKCdCbGFjaycsICddJykpO1xuXHRcdGRlbE5vZGUuYXBwZW5kQ2hpbGQoZGVsTGluayk7XG5cdFx0Zm9yIChjb25zdCBjdXJyZW50IG9mIHRpdGxlcykge1xuXHRcdFx0Y29uc3QgaGVhZGxpbmVocmVmID0gJChjdXJyZW50KS5maW5kKCcubXctaGVhZGxpbmUgYScpLmF0dHIoJ2hyZWYnKTtcblx0XHRcdGlmIChoZWFkbGluZWhyZWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRsZXQgdGl0bGUgPSBudWxsO1xuXHRcdFx0XHRpZiAoaGVhZGxpbmVocmVmLmluY2x1ZGVzKCdyZWRsaW5rPTEnKSkge1xuXHRcdFx0XHRcdHRpdGxlID0gaGVhZGxpbmVocmVmLnNsaWNlKDE5LCAtMjIpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IG0gPSBoZWFkbGluZWhyZWYubWF0Y2goL1xcL3dpa2lcXC8oW14/XSspLywgJyQxJyk7XG5cdFx0XHRcdFx0aWYgKG0gIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFssIHRpdGxlXSA9IG07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aXRsZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHRpdGxlID0gZGVjb2RlVVJJQ29tcG9uZW50KHRpdGxlKTtcblx0XHRcdFx0XHR0aXRsZSA9IHRpdGxlLnJlcGxhY2UoL18vZywgJyAnKTsgLy8gTm9ybWFsaXplIGZvciB1c2luZyBpbiBpbnRlcmZhY2UgYW5kIHN1bW1hcnlcblx0XHRcdFx0XHRjb25zdCBwYWdlbm90ZXhpc3QgPSAkKGN1cnJlbnQpLmZpbmQoJy5tdy1oZWFkbGluZSBhJykuaGFzQ2xhc3MoJ25ldycpO1xuXHRcdFx0XHRcdGNvbnN0IHtzZWN0aW9ufSA9IGN1cnJlbnQuZGF0YXNldDtcblx0XHRcdFx0XHRjb25zdCBbbm9kZV0gPSBjdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tdy1oZWFkbGluZScpO1xuXHRcdFx0XHRcdG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyAnKSk7XG5cdFx0XHRcdFx0Y29uc3QgdG1wTm9kZSA9IGRlbE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuXHRcdFx0XHRcdHRtcE5vZGUuZmlyc3RDaGlsZC5ocmVmID0gYCMke3NlY3Rpb259YDtcblx0XHRcdFx0XHQkKHRtcE5vZGUuZmlyc3RDaGlsZCkub24oJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHRcdFx0VHdpbmtsZS5jbG9zZS5jYWxsYmFjayh0aXRsZSwgc2VjdGlvbiwgcGFnZW5vdGV4aXN0KTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRub2RlLmFwcGVuZENoaWxkKHRtcE5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyBLZWVwIHRoaXMgc3luY2hyb25pemVkIHdpdGgge3tkZWxofX1cblx0VHdpbmtsZS5jbG9zZS5jb2RlcyA9IFtcblx0XHR7XG5cdFx0XHRrZXk6IHdpbmRvdy53Z1VMUygn6K+35rGC5peg5pWIJywgJ+iri+axgueEoeaViCcpLFxuXHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0aXI6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fmsYLml6DmlYgnLCAn6KuL5rGC54Sh5pWIJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlcDoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mHjeWkjeaPkOWHuu+8jOaXoOaViCcsICfph43opIfmj5Dlh7rvvIznhKHmlYgnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0bmU6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfnm67moIfpobXpnaLmiJbmlofku7bkuI3lrZjlnKjvvIzml6DmlYgnLCAn55uu5qiZ6aCB6Z2i5oiW5qqU5qGI5LiN5a2Y5Zyo77yM54Sh5pWIJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG5xOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5o+Q5Yig6ICF5pyq6I635Y+W5o+Q5Yig6LWE5qC877yM5peg5pWIJywgJ+aPkOWIquiAheacquWPluW+l+aPkOWIquizh+agvO+8jOeEoeaViCcpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogJ+S/neeVmScsXG5cdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRrOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICfkv53nlZknLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHRcdGFkbWlub25seTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0c2s6IHtcblx0XHRcdFx0XHRsYWJlbDogJ+W/q+mAn+S/neeVmScsXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRrOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5pqC5pe25L+d55WZ77yM5pS55oyC57u05oqk5qih5p2/77yI5YWz5rOo5bqm562J77yJJywgJ+aaq+aZguS/neeVme+8jOaUueaOm+e2reitt+aooeadv++8iOmXnOazqOW6puetie+8iScpLFxuXHRcdFx0XHRcdHZhbHVlOiB3aW5kb3cud2dVTFMoJ+aaguaXtuS/neeVmScsICfmmqvmmYLkv53nlZknKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0cnI6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fmsYLnkIbnlLHmtojlpLEnLCAn6KuL5rGC55CG55Sx5raI5aSxJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6IFR3aW5rbGUuZ2V0UHJlZignWGZkQ2xvc2UnKSA9PT0gJ25vbmFkbWlub25seScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRhbjoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WIoOWQjumHjeW7uicsICfliKrlvozph43lu7onKSxcblx0XHRcdFx0XHRhY3Rpb246ICdrZWVwJyxcblx0XHRcdFx0XHRhZG1pbm9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0a2V5OiB3aW5kb3cud2dVTFMoJ+WIoOmZpCcsICfliKrpmaQnKSxcblx0XHRcdHZhbHVlOiB7XG5cdFx0XHRcdGQ6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliKDpmaQnLCAn5Yiq6ZmkJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAnZGVsJyxcblx0XHRcdFx0XHRhZG1pbm9ubHk6IHRydWUsXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6IFR3aW5rbGUuZ2V0UHJlZignWGZkQ2xvc2UnKSA9PT0gJ2FsbCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGljOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zu+5YOP5Zug5L615p2D6KKr5YigJywgJ+WcluWDj+WboOS+teasiuiiq+WIqicpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2RlbCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogd2luZG93LndnVUxTKCflv6vpgJ/liKDpmaQnLCAn5b+r6YCf5Yiq6ZmkJyksXG5cdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRzZDoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W/q+mAn+WIoOmZpCcsICflv6vpgJ/liKrpmaQnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdkZWwnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsc3NkOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5peg5p2l5rqQ5oiW6JGX5L2c5p2D5L+h5oGv77yM5b+r6YCf5Yig6ZmkJywgJ+eEoeS+hua6kOaIlueJiOasiuizh+ioiu+8jOW/q+mAn+WIqumZpCcpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2RlbCcsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN2Zzoge1xuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W3suaUueeUqFNWR+WbvuW9ou+8jOW/q+mAn+WIoOmZpCcsICflt7LmlLnnlKhTVkflnJblvaLvvIzlv6vpgJ/liKrpmaQnKSxcblx0XHRcdFx0XHRhY3Rpb246ICdkZWwnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkcmVwOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5aSa5qyh6KKr5Yig6Zmk77yM5p2h55uu6ZSB5a6aJywgJ+Wkmuasoeiiq+WIqumZpO+8jOaineebrumOluWumicpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2RlbCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGtleTogd2luZG93LndnVUxTKCflhbbku5blpITnkIbmlrnms5UnLCAn5YW25LuW6JmV55CG5pa55rOVJyksXG5cdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRjOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6L2s5Lqk5L615p2DJywgJ+i9ieS6pOS+teasiicpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ25vb3AnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICfph43lrprlkJEnLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHRcdGFkbWlub25seTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y3I6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliIbnsbvph43lrprlkJEnLCAn5YiG6aGe6YeN5a6a5ZCRJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn56e75YqoJywgJ+enu+WLlScpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHRcdGFkbWlub25seTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0bWVyZ2U6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflubblhaUnLCAn5L215YWlJyksXG5cdFx0XHRcdFx0YWN0aW9uOiAna2VlcCcsXG5cdFx0XHRcdFx0YWRtaW5vbmx5OiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtZXJnZWFwcHJvdmVkOiB7XG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5YWB6K645bm25YWlJywgJ+WFgeioseS9teWFpScpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHRcdGFkbWlub25seTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0bmM6IHtcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfml6DlhbHor4bmmoLml7bkv53nlZknLCAn54Sh5YWx6K2Y5pqr5pmC5L+d55WZJyksXG5cdFx0XHRcdFx0dmFsdWU6IHdpbmRvdy53Z1VMUygn5peg5YWx6K+GJywgJ+eEoeWFseitmCcpLFxuXHRcdFx0XHRcdGFjdGlvbjogJ2tlZXAnLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9LFxuXHRdO1xuXHRUd2lua2xlLmNsb3NlLmNhbGxiYWNrID0gKHRpdGxlLCBzZWN0aW9uLCBub29wKSA9PiB7XG5cdFx0Y29uc3QgV2luZG93ID0gbmV3IE1vcmViaXRzLnNpbXBsZVdpbmRvdyg0MTAsIDIwMCk7XG5cdFx0V2luZG93LnNldFRpdGxlKGDlhbPpl63lrZjlup/orqjorrogXFx1MDBCNyAke3RpdGxlfWApO1xuXHRcdFdpbmRvdy5zZXRTY3JpcHROYW1lKCdUd2lua2xlJyk7XG5cdFx0V2luZG93LmFkZEZvb3RlckxpbmsoJ+WtmOW6n+iuqOiuuuiuvue9ricsICdIOlRXL1BSRUYj5YWz6Zet5a2Y5bqf6K6o6K66Jyk7XG5cdFx0V2luZG93LmFkZEZvb3RlckxpbmsoJ1R3aW5rbGXluK7liqknLCAnSDpUVy9ET0Mj5YWz6Zet5a2Y5bqf6K6o6K66Jyk7XG5cdFx0Y29uc3QgZm9ybSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0oVHdpbmtsZS5jbG9zZS5jYWxsYmFjay5ldmFsdWF0ZSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRsYWJlbDogJ+WkhOeQhue7k+aenO+8micsXG5cdFx0XHRuYW1lOiAnc3ViX2dyb3VwJyxcblx0XHRcdGV2ZW50OiBUd2lua2xlLmNsb3NlLmNhbGxiYWNrLmNoYW5nZV9jb2RlLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdpbnB1dCcsXG5cdFx0XHRuYW1lOiAnc2RyZWFzb24nLFxuXHRcdFx0bGFiZWw6ICfpgJ/liKDnkIbnlLHvvJonLFxuXHRcdFx0dG9vbHRpcDogJ+eUqOS6juWIoOmZpOaXpeW/l++8jOS9v+eUqHt7ZGVsZXRlfX3nmoTlj4LmlbDmoLzlvI/vvIzkvovlpoIgQTEg5oiWIEExfEcxJyxcblx0XHRcdGhpZGRlbjogdHJ1ZSxcblx0XHR9KTtcblx0XHRmb3JtLmFwcGVuZCh7XG5cdFx0XHR0eXBlOiAnaW5wdXQnLFxuXHRcdFx0bmFtZTogJ3JlbWFyaycsXG5cdFx0XHRsYWJlbDogJ+ihpeWFheivtOaYju+8micsXG5cdFx0fSk7XG5cdFx0Zm9ybS5hcHBlbmQoe1xuXHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdGxpc3Q6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAn5Y+q5YWz6Zet6K6o6K6677yM5LiN6L+b6KGM5YW25LuW5pON5L2cJyxcblx0XHRcdFx0XHR2YWx1ZTogJ25vb3AnLFxuXHRcdFx0XHRcdG5hbWU6ICdub29wJyxcblx0XHRcdFx0XHRldmVudDogVHdpbmtsZS5jbG9zZS5jYWxsYmFjay5jaGFuZ2Vfb3BlcmF0aW9uLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IG5vb3AsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGlmIChuZXcgbXcuVGl0bGUodGl0bGUpLm5hbWVzcGFjZSAlIDIgPT09IDAgJiYgbmV3IG13LlRpdGxlKHRpdGxlKS5uYW1lc3BhY2UgIT09IDIpIHtcblx0XHRcdC8vIGhpZGUgb3B0aW9uIGZvciB1c2VyIHBhZ2VzLCB0byBhdm9pZCBhY2NpZGVudGFsbHkgZGVsZXRpbmcgdXNlciB0YWxrIHBhZ2Vcblx0XHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdFx0dHlwZTogJ2NoZWNrYm94Jyxcblx0XHRcdFx0bGlzdDogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxhYmVsOiAn5Yig6Zmk5YWz6IGU55qE6K6o6K666aG1Jyxcblx0XHRcdFx0XHRcdHZhbHVlOiAndGFsa3BhZ2UnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ3RhbGtwYWdlJyxcblx0XHRcdFx0XHRcdHRvb2x0aXA6ICfliKDpmaTml7bpmYTluKbliKDpmaTmraTpobXpnaLnmoTorqjorrrpobXjgIInLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGV2ZW50OiAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdjaGVja2JveCcsXG5cdFx0XHRsaXN0OiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJ+WIoOmZpOmHjeWumuWQkemhtScsXG5cdFx0XHRcdFx0dmFsdWU6ICdyZWRpcmVjdHMnLFxuXHRcdFx0XHRcdG5hbWU6ICdyZWRpcmVjdHMnLFxuXHRcdFx0XHRcdHRvb2x0aXA6ICfliKDpmaTliLDmraTpobXnmoTph43lrprlkJHjgIInLFxuXHRcdFx0XHRcdGNoZWNrZWQ6IHRydWUsXG5cdFx0XHRcdFx0ZXZlbnQ6IChlKSA9PiB7XG5cdFx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGZvcm0uYXBwZW5kKHtcblx0XHRcdHR5cGU6ICdzdWJtaXQnLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGZvcm0ucmVuZGVyKCk7XG5cdFx0V2luZG93LnNldENvbnRlbnQocmVzdWx0KTtcblx0XHRXaW5kb3cuZGlzcGxheSgpO1xuXHRcdGNvbnN0IFtzdWJfZ3JvdXBdID0gcmVzdWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpOyAvLyBoYWNrXG5cdFx0Y29uc3QgcmVzdWx0RGF0YSA9IHtcblx0XHRcdHRpdGxlLFxuXHRcdFx0c2VjdGlvbjogTnVtYmVyLnBhcnNlSW50KHNlY3Rpb24sIDEwKSxcblx0XHRcdG5vb3AsXG5cdFx0fTtcblx0XHQkKHJlc3VsdCkuZGF0YSgncmVzdWx0RGF0YScsIHJlc3VsdERhdGEpO1xuXHRcdC8vIHdvcmtlciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGNvbWJvIGJveCBlbnRyaWVzXG5cdFx0Y29uc3QgY3JlYXRlRW50cmllcyA9IChjb250ZW50cywgY29udGFpbmVyKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IFtpdGVtS2V5LCBpdGVtUHJvcGVydGllc10gb2YgT2JqZWN0LmVudHJpZXMoY29udGVudHMpKSB7XG5cdFx0XHRcdGNvbnN0IGtleSA9IHR5cGVvZiBpdGVtS2V5ID09PSAnc3RyaW5nJyA/IGl0ZW1LZXkgOiBpdGVtUHJvcGVydGllcy52YWx1ZTtcblx0XHRcdFx0Y29uc3QgZWxlbSA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdFx0dHlwZTogJ29wdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IGAke2tleX3vvJoke2l0ZW1Qcm9wZXJ0aWVzLmxhYmVsfWAsXG5cdFx0XHRcdFx0dmFsdWU6IGtleSxcblx0XHRcdFx0XHRzZWxlY3RlZDogaXRlbVByb3BlcnRpZXMuc2VsZWN0ZWQsXG5cdFx0XHRcdFx0ZGlzYWJsZWQ6XG5cdFx0XHRcdFx0XHQoVHdpbmtsZS5nZXRQcmVmKCdYZmRDbG9zZScpICE9PSAnYWxsJyAmJiBpdGVtUHJvcGVydGllcy5hZG1pbm9ubHkpIHx8IGl0ZW1Qcm9wZXJ0aWVzLmRpc2FibGVkLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgZWxlbVJlbmRlcmVkID0gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW0ucmVuZGVyKCkpO1xuXHRcdFx0XHQkKGVsZW1SZW5kZXJlZCkuZGF0YSgnbWVzc2FnZURhdGEnLCBpdGVtUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IGdyb3VwIG9mIFR3aW5rbGUuY2xvc2UuY29kZXMpIHtcblx0XHRcdGxldCBvcHRncm91cCA9IG5ldyBNb3JlYml0cy5xdWlja0Zvcm0uZWxlbWVudCh7XG5cdFx0XHRcdHR5cGU6ICdvcHRncm91cCcsXG5cdFx0XHRcdGxhYmVsOiBncm91cC5rZXksXG5cdFx0XHR9KTtcblx0XHRcdG9wdGdyb3VwID0gb3B0Z3JvdXAucmVuZGVyKCk7XG5cdFx0XHRzdWJfZ3JvdXAuYXBwZW5kQ2hpbGQob3B0Z3JvdXApO1xuXHRcdFx0Ly8gY3JlYXRlIHRoZSBvcHRpb25zXG5cdFx0XHRjcmVhdGVFbnRyaWVzKGdyb3VwLnZhbHVlLCBvcHRncm91cCk7XG5cdFx0fVxuXHRcdGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0ZXZlbnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcblx0XHRyZXN1bHQuc3ViX2dyb3VwLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9O1xuXHRUd2lua2xlLmNsb3NlLmNhbGxiYWNrLmNoYW5nZV9vcGVyYXRpb24gPSAoZSkgPT4ge1xuXHRcdGNvbnN0IG5vb3AgPSBlLnRhcmdldC5jaGVja2VkO1xuXHRcdGNvbnN0IGNvZGUgPSBlLnRhcmdldC5mb3JtLnN1Yl9ncm91cC52YWx1ZTtcblx0XHRjb25zdCBtZXNzYWdlRGF0YSA9ICQoZS50YXJnZXQuZm9ybS5zdWJfZ3JvdXApLmZpbmQoYG9wdGlvblt2YWx1ZT1cIiR7Y29kZX1cIl1gKS5kYXRhKCdtZXNzYWdlRGF0YScpO1xuXHRcdGNvbnN0IHt0YWxrcGFnZX0gPSBlLnRhcmdldC5mb3JtO1xuXHRcdGNvbnN0IHtyZWRpcmVjdHN9ID0gZS50YXJnZXQuZm9ybTtcblx0XHRpZiAobm9vcCB8fCBtZXNzYWdlRGF0YS5hY3Rpb24gPT09ICdrZWVwJykge1xuXHRcdFx0aWYgKHRhbGtwYWdlKSB7XG5cdFx0XHRcdHRhbGtwYWdlLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0dGFsa3BhZ2UuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmVkaXJlY3RzLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdHJlZGlyZWN0cy5kaXNhYmxlZCA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0YWxrcGFnZSkge1xuXHRcdFx0XHR0YWxrcGFnZS5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0dGFsa3BhZ2UuZGlzYWJsZWQgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJlZGlyZWN0cy5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdHJlZGlyZWN0cy5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5jbG9zZS5jYWxsYmFjay5jaGFuZ2VfY29kZSA9IChlKSA9PiB7XG5cdFx0Y29uc3QgcmVzdWx0RGF0YSA9ICQoZS50YXJnZXQuZm9ybSkuZGF0YSgncmVzdWx0RGF0YScpO1xuXHRcdGNvbnN0IG1lc3NhZ2VEYXRhID0gJChlLnRhcmdldCkuZmluZChgb3B0aW9uW3ZhbHVlPVwiJHtlLnRhcmdldC52YWx1ZX1cIl1gKS5kYXRhKCdtZXNzYWdlRGF0YScpO1xuXHRcdGNvbnN0IHtub29wfSA9IGUudGFyZ2V0LmZvcm07XG5cdFx0Y29uc3Qge3RhbGtwYWdlfSA9IGUudGFyZ2V0LmZvcm07XG5cdFx0Y29uc3Qge3JlZGlyZWN0c30gPSBlLnRhcmdldC5mb3JtO1xuXHRcdGlmIChyZXN1bHREYXRhLm5vb3AgfHwgbWVzc2FnZURhdGEuYWN0aW9uID09PSAnbm9vcCcpIHtcblx0XHRcdG5vb3AuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRub29wLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdGlmICh0YWxrcGFnZSkge1xuXHRcdFx0XHR0YWxrcGFnZS5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdHRhbGtwYWdlLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJlZGlyZWN0cy5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRyZWRpcmVjdHMuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRub29wLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdG5vb3AuZGlzYWJsZWQgPSBmYWxzZTtcblx0XHRcdGlmIChtZXNzYWdlRGF0YS5hY3Rpb24gPT09ICdrZWVwJykge1xuXHRcdFx0XHRpZiAodGFsa3BhZ2UpIHtcblx0XHRcdFx0XHR0YWxrcGFnZS5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0dGFsa3BhZ2UuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlZGlyZWN0cy5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRcdHJlZGlyZWN0cy5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodGFsa3BhZ2UpIHtcblx0XHRcdFx0XHR0YWxrcGFnZS5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0XHR0YWxrcGFnZS5kaXNhYmxlZCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlZGlyZWN0cy5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0cmVkaXJlY3RzLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZS50YXJnZXQudmFsdWUgPT09ICdzZCcpIHtcblx0XHRcdFx0ZS50YXJnZXQuZm9ybS5zZHJlYXNvbi5wYXJlbnRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlLnRhcmdldC5mb3JtLnNkcmVhc29uLnBhcmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRUd2lua2xlLmNsb3NlLmNhbGxiYWNrLmV2YWx1YXRlID0gKGUpID0+IHtcblx0XHRjb25zdCBjb2RlID0gZS50YXJnZXQuc3ViX2dyb3VwLnZhbHVlO1xuXHRcdGNvbnN0IHJlc3VsdERhdGEgPSAkKGUudGFyZ2V0KS5kYXRhKCdyZXN1bHREYXRhJyk7XG5cdFx0Y29uc3QgbWVzc2FnZURhdGEgPSAkKGUudGFyZ2V0LnN1Yl9ncm91cCkuZmluZChgb3B0aW9uW3ZhbHVlPVwiJHtjb2RlfVwiXWApLmRhdGEoJ21lc3NhZ2VEYXRhJyk7XG5cdFx0Y29uc3Qgbm9vcCA9IGUudGFyZ2V0Lm5vb3AuY2hlY2tlZDtcblx0XHRjb25zdCB0YWxrcGFnZSA9IGUudGFyZ2V0LnRhbGtwYWdlICYmIGUudGFyZ2V0LnRhbGtwYWdlLmNoZWNrZWQ7XG5cdFx0Y29uc3QgcmVkaXJlY3RzID0gZS50YXJnZXQucmVkaXJlY3RzLmNoZWNrZWQ7XG5cdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0dGl0bGU6IHJlc3VsdERhdGEudGl0bGUsXG5cdFx0XHRjb2RlLFxuXHRcdFx0cmVtYXJrOiBlLnRhcmdldC5yZW1hcmsudmFsdWUsXG5cdFx0XHRzZHJlYXNvbjogZS50YXJnZXQuc2RyZWFzb24udmFsdWUsXG5cdFx0XHRzZWN0aW9uOiByZXN1bHREYXRhLnNlY3Rpb24sXG5cdFx0XHRwYXJlbnRTZWN0aW9uOiByZXN1bHREYXRhLnBhcmVudFNlY3Rpb24sXG5cdFx0XHRtZXNzYWdlRGF0YSxcblx0XHRcdHRhbGtwYWdlLFxuXHRcdFx0cmVkaXJlY3RzLFxuXHRcdH07XG5cdFx0TW9yZWJpdHMuc2ltcGxlV2luZG93LnNldEJ1dHRvbnNFbmFibGVkKGZhbHNlKTtcblx0XHRNb3JlYml0cy5zdGF0dXMuaW5pdChlLnRhcmdldCk7XG5cdFx0TW9yZWJpdHMud2lraS5hY3Rpb25Db21wbGV0ZWQubm90aWNlID0gJ+aTjeS9nOWujOaIkCc7XG5cdFx0aWYgKG5vb3AgfHwgbWVzc2FnZURhdGEuYWN0aW9uID09PSAnbm9vcCcpIHtcblx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3dpdGNoIChtZXNzYWdlRGF0YS5hY3Rpb24pIHtcblx0XHRcdFx0Y2FzZSAnZGVsJzpcblx0XHRcdFx0XHRUd2lua2xlLmNsb3NlLmNhbGxiYWNrcy5kZWwocGFyYW1zKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAna2VlcCc6IHtcblx0XHRcdFx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHBhcmFtcy50aXRsZSwgJ+enu+mZpOWtmOW6n+iuqOiuuuaooeadvycpO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfcGFnZS5zZXRDYWxsYmFja1BhcmFtZXRlcnMocGFyYW1zKTtcblx0XHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2UubG9hZChUd2lua2xlLmNsb3NlLmNhbGxiYWNrcy5rZWVwKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdG13Lm5vdGlmeShg5YWz6Zet5a2Y5bqf6K6o6K6677ya5pyq5a6a5LmJICR7Y29kZX1gLCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlY2xvc2UnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0VHdpbmtsZS5jbG9zZS5jYWxsYmFja3MgPSB7XG5cdFx0ZGVsOiAocGFyYW1zKSA9PiB7XG5cdFx0XHRsZXQgcXVlcnk7XG5cdFx0XHRsZXQgeXNhcmNoaXZlc19hcGk7XG5cdFx0XHRNb3JlYml0cy53aWtpLmFkZENoZWNrcG9pbnQoKTtcblx0XHRcdGNvbnN0IHBhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKHBhcmFtcy50aXRsZSwgJ+WIoOmZpOmhtemdoicpO1xuXHRcdFx0aWYgKHBhcmFtcy5jb2RlID09PSAnc2QnKSB7XG5cdFx0XHRcdFR3aW5rbGUuc3BlZWR5LmNhbGxiYWNrcy5wYXJzZVdpa2l0ZXh0KHBhcmFtcy50aXRsZSwgYHt7ZGVsZXRlfCR7cGFyYW1zLnNkcmVhc29ufX19YCwgKHJlYXNvbikgPT4ge1xuXHRcdFx0XHRcdHJlYXNvbiA9IHByb21wdCgn6L6T5YWl5Yig6Zmk55CG55Sx77yM5oiW54K55Ye756Gu5a6a5Lul5o6l5Y+X6Ieq5Yqo55Sf5oiQ55qE77yaJywgcmVhc29uKTtcblx0XHRcdFx0XHRpZiAocmVhc29uID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRwYWdlLmdldFN0YXR1c0VsZW1lbnQoKS53YXJuKCfmsqHmnInmiafooYzliKDpmaQnKTtcblx0XHRcdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cGFnZS5zZXRFZGl0U3VtbWFyeShyZWFzb24pO1xuXHRcdFx0XHRcdFx0cGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRcdFx0XHRwYWdlLmRlbGV0ZVBhZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRwYWdlLmdldFN0YXR1c0VsZW1lbnQoKS5pbmZvKCflrozmiJAnKTtcblx0XHRcdFx0XHRcdFx0VHdpbmtsZS5jbG9zZS5jYWxsYmFja3MudGFsa2VuZChwYXJhbXMpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhZ2Uuc2V0RWRpdFN1bW1hcnkoYOWtmOW6n+iuqOiuuumAmui/h++8mltbJHttdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyl9IyR7cGFyYW1zLnRpdGxlfV1dYCk7XG5cdFx0XHRcdHBhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHRwYWdlLmRlbGV0ZVBhZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdHBhZ2UuZ2V0U3RhdHVzRWxlbWVudCgpLmluZm8oJ+WujOaIkCcpO1xuXHRcdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1zLnJlZGlyZWN0cykge1xuXHRcdFx0XHRxdWVyeSA9IHtcblx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0dGl0bGVzOiBwYXJhbXMudGl0bGUsXG5cdFx0XHRcdFx0cHJvcDogJ3JlZGlyZWN0cycsXG5cdFx0XHRcdFx0cmRsaW1pdDogJ21heCcsIC8vIDUwMCBpcyBtYXggZm9yIG5vcm1hbCB1c2VycywgNTAwMCBmb3IgYm90cyBhbmQgc3lzb3BzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0eXNhcmNoaXZlc19hcGkgPSBuZXcgTW9yZWJpdHMud2lraS5hcGkoXG5cdFx0XHRcdFx0J+ato+WcqOiOt+WPlumHjeWumuWQkScsXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0VHdpbmtsZS5jbG9zZS5jYWxsYmFja3MuZGVsZXRlUmVkaXJlY3RzTWFpblxuXHRcdFx0XHQpO1xuXHRcdFx0XHR5c2FyY2hpdmVzX2FwaS5wYXJhbXMgPSBwYXJhbXM7XG5cdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMudGFsa1BhZ2UpIHtcblx0XHRcdFx0Y29uc3QgcGFnZVRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFyYW1zLnRpdGxlKTtcblx0XHRcdFx0aWYgKHBhZ2VUaXRsZSAmJiBwYWdlVGl0bGUubmFtZXNwYWNlICUgMiA9PT0gMCAmJiBwYWdlVGl0bGUubmFtZXNwYWNlICE9PSAyKSB7XG5cdFx0XHRcdFx0cGFnZVRpdGxlLm5hbWVzcGFjZSsrOyAvLyBub3cgcGFnZVRpdGxlIGlzIHRoZSB0YWxrIHBhZ2UgdGl0bGUhXG5cdFx0XHRcdFx0cXVlcnkgPSB7XG5cdFx0XHRcdFx0XHRhY3Rpb246ICdxdWVyeScsXG5cdFx0XHRcdFx0XHR0aXRsZXM6IHBhZ2VUaXRsZS50b1RleHQoKSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfYXBpID0gbmV3IE1vcmViaXRzLndpa2kuYXBpKFxuXHRcdFx0XHRcdFx0J+ato+WcqOajgOafpeiuqOiuuumhtemdouaYr+WQpuWtmOWcqCcsXG5cdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLmRlbGV0ZVRhbGtcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBhcmFtcyA9IHBhcmFtcztcblx0XHRcdFx0XHR5c2FyY2hpdmVzX2FwaS5hcGlvYmoucGFyYW1zLnRhbGtQYWdlID0gcGFnZVRpdGxlLnRvVGV4dCgpO1xuXHRcdFx0XHRcdHlzYXJjaGl2ZXNfYXBpLnBvc3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0TW9yZWJpdHMud2lraS5yZW1vdmVDaGVja3BvaW50KCk7XG5cdFx0fSxcblx0XHRkZWxldGVSZWRpcmVjdHNNYWluOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCBwYWdlcyA9ICQoeG1sKVxuXHRcdFx0XHQuZmluZCgncmQnKVxuXHRcdFx0XHQubWFwKChfaW5kZXgsIGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gJChlbGVtZW50KS5hdHRyKCd0aXRsZScpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZ2V0KCk7XG5cdFx0XHRpZiAocGFnZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlZGlyZWN0RGVsZXRlciA9IG5ldyBNb3JlYml0cy5iYXRjaE9wZXJhdGlvbihcblx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjliKDpmaTliLAgJywgJ+ato+WcqOWIqumZpOWIsCAnKSArXG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy50aXRsZSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCcg55qE6YeN5a6a5ZCRJywgJyDnmoTph43mlrDlsI7lkJEnKVxuXHRcdFx0KTtcblx0XHRcdHJlZGlyZWN0RGVsZXRlci5zZXRPcHRpb24oJ2NodW5rU2l6ZScsIFR3aW5rbGUuZ2V0UHJlZignYmF0Y2hkZWxldGVDaHVua3MnKSk7XG5cdFx0XHRyZWRpcmVjdERlbGV0ZXIuc2V0UGFnZUxpc3QocGFnZXMpO1xuXHRcdFx0cmVkaXJlY3REZWxldGVyLnJ1bigocGFnZU5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0XHRwYWdlTmFtZSxcblx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+ato+WcqOWIoOmZpCAnLCAn5q2j5Zyo5Yiq6ZmkICcpICsgcGFnZU5hbWVcblx0XHRcdFx0KTtcblx0XHRcdFx0eXNhcmNoaXZlc19wYWdlLnNldEVkaXRTdW1tYXJ5KFxuXHRcdFx0XHRcdGBbW0xJQjpDU0QjRzV8RzVdXe+8miR7d2luZG93LndnVUxTKCfmjIflkJHlt7LliKDpobXpnaLigJwnLCAn5oyH5ZCR5bey5Yiq6aCB6Z2i44CMJyl9JHthcGlvYmoucGFyYW1zLnRpdGxlfSR7d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+KAneeahOmHjeWumuWQkScsXG5cdFx0XHRcdFx0XHQn44CN55qE6YeN5paw5bCO5ZCRJ1xuXHRcdFx0XHRcdCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHR5c2FyY2hpdmVzX3BhZ2UuZGVsZXRlUGFnZShyZWRpcmVjdERlbGV0ZXIud29ya2VyU3VjY2VzcywgcmVkaXJlY3REZWxldGVyLndvcmtlckZhaWx1cmUpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRkZWxldGVUYWxrOiAoYXBpb2JqKSA9PiB7XG5cdFx0XHRjb25zdCB4bWwgPSBhcGlvYmoucmVzcG9uc2VYTUw7XG5cdFx0XHRjb25zdCBleGlzdHMgPSAkKHhtbCkuZmluZCgncGFnZTpub3QoW21pc3NpbmddKScpLmxlbmd0aCA+IDA7XG5cdFx0XHRpZiAoIWV4aXN0cykge1xuXHRcdFx0XHQvLyBubyB0YWxrIHBhZ2U7IGZvcmdldCBhYm91dCBpdFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwYWdlID0gbmV3IE1vcmViaXRzLndpa2kucGFnZShcblx0XHRcdFx0YXBpb2JqLnBhcmFtcy50YWxrUGFnZSxcblx0XHRcdFx0d2luZG93LndnVUxTKCfmraPlnKjliKDpmaTpobXpnaIgJywgJ+ato+WcqOWIqumZpOmggemdoiAnKSArXG5cdFx0XHRcdFx0YXBpb2JqLnBhcmFtcy50aXRsZSArXG5cdFx0XHRcdFx0d2luZG93LndnVUxTKCcg55qE6K6o6K666aG1JywgJyDnmoToqI7oq5bpoIEnKVxuXHRcdFx0KTtcblx0XHRcdHBhZ2Uuc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHRcdGBbW0xJQjpDU0QjRzV8RzVdXe+8miR7d2luZG93LndnVUxTKCflt7LliKDpobXpnaLigJwnLCAn5bey5Yiq6aCB6Z2i44CMJyl9JHthcGlvYmoucGFyYW1zLnRpdGxlfSR7d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdCfigJ3nmoRbW0hlbHA66K6o6K666aG1fOiuqOiuuumhtV1dJyxcblx0XHRcdFx0XHQn44CN55qEW1tIZWxwOuiojuirlumggXzoqI7oq5bpoIFdXSdcblx0XHRcdFx0KX1gXG5cdFx0XHQpO1xuXHRcdFx0cGFnZS5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlLmRlbGV0ZVBhZ2UoKTtcblx0XHR9LFxuXHRcdGtlZXA6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0aWYgKCFwYWdlb2JqLmV4aXN0cygpKSB7XG5cdFx0XHRcdHN0YXRlbGVtLmVycm9yKCfpobXpnaLkuI3lrZjlnKjvvIzlj6/og73lt7LooqvliKDpmaQnKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdGV4dCA9IHBhZ2VvYmouZ2V0UGFnZVRleHQoKTtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHBhZ2VvYmouZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKCk7XG5cdFx0XHRjb25zdCBwYWdldGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChwYXJhbXMudGl0bGUpO1xuXHRcdFx0aWYgKHBhZ2V0aXRsZS5nZXROYW1lc3BhY2VJZCgpICUgMiA9PT0gMCkge1xuXHRcdFx0XHRjb25zdCB0YWxrcGFnZXRpdGxlID0gbmV3IG13LlRpdGxlKHBhZ2V0aXRsZS5nZXRNYWluVGV4dCgpLCBwYWdldGl0bGUuZ2V0TmFtZXNwYWNlSWQoKSArIDEpO1xuXHRcdFx0XHRjb25zdCB0YWxrcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UoXG5cdFx0XHRcdFx0dGFsa3BhZ2V0aXRsZS50b1N0cmluZygpLFxuXHRcdFx0XHRcdHdpbmRvdy53Z1VMUygn5qCH6K6w6K6o6K666aG1JywgJ+aomeiomOiojuirlumggScpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHJlYXNvbiA9IHBhcmFtcy5tZXNzYWdlRGF0YS52YWx1ZSB8fCBwYXJhbXMubWVzc2FnZURhdGEubGFiZWw7XG5cdFx0XHRcdGNvbnN0IHZmZGtlcHQgPSBge3tPbGQgdmZkIG11bHRpfCR7bXcuY29uZmlnXG5cdFx0XHRcdFx0LmdldCgnd2dQYWdlTmFtZScpXG5cdFx0XHRcdFx0LnNwbGl0KCcvJylcblx0XHRcdFx0XHQuc2xpY2UoMilcblx0XHRcdFx0XHQuam9pbignLycpfXwke3JlYXNvbn19fVxcbmA7XG5cdFx0XHRcdHRhbGtwYWdlLnNldFByZXBlbmRUZXh0KHZmZGtlcHQpO1xuXHRcdFx0XHR0YWxrcGFnZS5zZXRFZGl0U3VtbWFyeShgW1ske213LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKX0jJHtwYXJhbXMudGl0bGV9XV3vvJoke3JlYXNvbn1gKTtcblx0XHRcdFx0dGFsa3BhZ2Uuc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0XHR0YWxrcGFnZS5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0XHRcdHRhbGtwYWdlLnByZXBlbmQoKTtcblx0XHRcdH1cblx0XHRcdGxldCBuZXd0ZXh0ID0gdGV4dC5yZXBsYWNlKFxuXHRcdFx0XHQvPG5vaW5jbHVkZT5cXHMqXFx7XFx7KFtyc2FpZnRjbXZdZmQpKFxcfCg/Olxce1xce1tee31dKlxcfVxcfXxbXnt9XSkqKT9cXH1cXH1cXHMqPFxcL25vaW5jbHVkZT5cXHMqL2dpLFxuXHRcdFx0XHQnJ1xuXHRcdFx0KTtcblx0XHRcdG5ld3RleHQgPSBuZXd0ZXh0LnJlcGxhY2UoL1xce1xceyhbcnNhaWZ0Y212XWZkKShcXHwoPzpcXHtcXHtbXnt9XSpcXH1cXH18W157fV0pKik/XFx9XFx9XFxzKi9naSwgJycpO1xuXHRcdFx0aWYgKHBhcmFtcy5jb2RlICE9PSAndGsnKSB7XG5cdFx0XHRcdG5ld3RleHQgPSBuZXd0ZXh0LnJlcGxhY2UoXG5cdFx0XHRcdFx0L3t7KG5vdGFiaWxpdHl8ZmFtZXxtYWlyfOefpeWQjeW6pnzph43opoHmgKd85pi+6JGX5oCnfOmhr+iRl+aAp3znn6XlkI3luqbkuI3otrN85Lq654mp6YeN6KaB5oCnfOmHjeimgeaAp+S4jei2s3xub3RhYmxlfOWFs+azqOW6pnzlhbPms6jluqbkuI3otrN86Zec5rOo5bqmfOmXnOazqOW6puS4jei2s3zph43opoF86YeN6KaB5bqmKShcXHwoPzp7e1tee31dKn19fFtee31dKSopP319XFxuKi9naSxcblx0XHRcdFx0XHQnJ1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRuZXd0ZXh0ID0gbmV3dGV4dC5yZXBsYWNlKFxuXHRcdFx0XHRcdC97eyhzdWJzdHVifOWwj+Wwj+S9nOWTgXxjb2R85bCP5bCP5qKd55uufOWwj+Wwj+adoeebrikoXFx8KD86e3tbXnt9XSp9fXxbXnt9XSkqKT99fVxcbiovZ2ksXG5cdFx0XHRcdFx0Jydcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbXMuY29kZSA9PT0gJ21lcmdlYXBwcm92ZWQnKSB7XG5cdFx0XHRcdGNvbnN0IHRhZyA9ICd7eydcblx0XHRcdFx0XHQuY29uY2F0KCdzdWJzdDonKVxuXHRcdFx0XHRcdC5jb25jYXQoYE1lcmdlIGFwcHJvdmVkL2F1dG98ZGlzY3Vzcz0ke213LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKX0jJHtwYXJhbXMudGl0bGV9fX1cXG5gKTtcblx0XHRcdFx0Ly8gSW5zZXJ0IHRhZyBhZnRlciBzaG9ydCBkZXNjcmlwdGlvbiBvciBhbnkgaGF0bm90ZXNcblx0XHRcdFx0Y29uc3QgeXNhcmNoaXZlc19wYWdlID0gbmV3IE1vcmViaXRzLndpa2l0ZXh0LnBhZ2UobmV3dGV4dCk7XG5cdFx0XHRcdG5ld3RleHQgPSB5c2FyY2hpdmVzX3BhZ2UuaW5zZXJ0QWZ0ZXJUZW1wbGF0ZXModGFnLCBUd2lua2xlLmhhdG5vdGVSZWdleCkuZ2V0VGV4dCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5ld3RleHQgPT09IHRleHQpIHtcblx0XHRcdFx0c3RhdGVsZW0ud2Fybign5pyq5om+5Yiw5a2Y5bqf6K6o6K665qih5p2/77yM5Y+v6IO95bey6KKr56e76ZmkJyk7XG5cdFx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZWRpdHN1bW1hcnkgPSBg5a2Y5bqf6K6o6K665YWz6Zet77yaW1ske213LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKX0jJHtwYXJhbXMudGl0bGV9XV1gO1xuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dChuZXd0ZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoZWRpdHN1bW1hcnkpO1xuXHRcdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0XHRwYWdlb2JqLnNldENyZWF0ZU9wdGlvbignbm9jcmVhdGUnKTtcblx0XHRcdHBhZ2VvYmouc2F2ZShUd2lua2xlLmNsb3NlLmNhbGxiYWNrcy5rZWVwQ29tcGxldGUpO1xuXHRcdH0sXG5cdFx0a2VlcENvbXBsZXRlOiAocGFnZW9iaikgPT4ge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHRcdFR3aW5rbGUuY2xvc2UuY2FsbGJhY2tzLnRhbGtlbmQocGFyYW1zKTtcblx0XHR9LFxuXHRcdHRhbGtlbmQ6IChwYXJhbXMpID0+IHtcblx0XHRcdGNvbnN0IHlzYXJjaGl2ZXNfcGFnZSA9IG5ldyBNb3JlYml0cy53aWtpLnBhZ2UobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLCAn5YWz6Zet6K6o6K66Jyk7XG5cdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0Q2FsbGJhY2tQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cdFx0XHR5c2FyY2hpdmVzX3BhZ2Uuc2V0UGFnZVNlY3Rpb24ocGFyYW1zLnNlY3Rpb24pO1xuXHRcdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS5jbG9zZS5jYWxsYmFja3Muc2F2ZVRhbGspO1xuXHRcdH0sXG5cdFx0c2F2ZVRhbGs6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRjb25zdCBzdGF0ZWxlbSA9IHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpO1xuXHRcdFx0bGV0IHRleHQgPSBwYWdlb2JqLmdldFBhZ2VUZXh0KCk7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0aWYgKHRleHQuaW5jbHVkZXMoJ3t7ZGVsaCcpKSB7XG5cdFx0XHRcdHN0YXRlbGVtLmVycm9yKCforqjorrrlt7LooqvlhbPpl60nKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc2JlZ2luID0gdGV4dC5pbmNsdWRlcygnPHNlY3Rpb24gYmVnaW49YmFja2xvZyAvPicpO1xuXHRcdFx0Y29uc3Qgc2VuZCA9IHRleHQuaW5jbHVkZXMoJzxzZWN0aW9uIGVuZD1iYWNrbG9nIC8+Jyk7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCdcXG48c2VjdGlvbiBiZWdpbj1iYWNrbG9nIC8+JywgJycpO1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSgnXFxuPHNlY3Rpb24gZW5kPWJhY2tsb2cgLz4nLCAnJyk7XG5cdFx0XHRjb25zdCBiYXIgPSB0ZXh0LnNwbGl0KCdcXG4tLS0tXFxuJyk7XG5cdFx0XHRjb25zdCBzcGxpdCA9IGJhclswXS5zcGxpdCgnXFxuJyk7XG5cdFx0XHR0ZXh0ID0gYCR7c3BsaXRbMF19XFxue3tkZWxofCR7cGFyYW1zLmNvZGV9fX1cXG5gO1xuXHRcdFx0dGV4dCArPSBzcGxpdC5zbGljZSgxKS5qb2luKCdcXG4nKTtcblx0XHRcdGNvbnN0IHJlYXNvbiA9IHBhcmFtcy5tZXNzYWdlRGF0YS52YWx1ZSB8fCBwYXJhbXMubWVzc2FnZURhdGEubGFiZWw7XG5cdFx0XHR0ZXh0ICs9IGBcXG48aHI+XFxuOiAke3JlYXNvbn1gO1xuXHRcdFx0aWYgKHBhcmFtcy5yZW1hcmspIHtcblx0XHRcdFx0dGV4dCArPSBg77yaJHtNb3JlYml0cy5zdHJpbmcuYXBwZW5kUHVuY3R1YXRpb24ocGFyYW1zLnJlbWFyayl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRleHQgKz0gJ+OAgic7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIU1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRcdHRleHQgKz0gJ3t7Jy5jb25jYXQoJ3N1YnN0OicpLmNvbmNhdCgnTkFDfX0nKTtcblx0XHRcdH1cblx0XHRcdHRleHQgKz0gJy0tfn4nLmNvbmNhdCgnfn4nLCAnXFxue3tkZWxmfX0nKTtcblx0XHRcdGlmIChiYXJbMV0pIHtcblx0XHRcdFx0dGV4dCArPSBgXFxuLS0tLVxcbiR7YmFyLnNsaWNlKDEpLmpvaW4oJ1xcbi0tLS1cXG4nKX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNlbmQpIHtcblx0XHRcdFx0dGV4dCArPSAnXFxuPHNlY3Rpb24gZW5kPWJhY2tsb2cgLz4nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNiZWdpbikge1xuXHRcdFx0XHQvLyBndWFyYW50ZWVkIHRvIGJlIGF0IHRuZSBlbmQ/XG5cdFx0XHRcdHRleHQgKz0gJ1xcbjxzZWN0aW9uIGJlZ2luPWJhY2tsb2cgLz4nO1xuXHRcdFx0fVxuXHRcdFx0cGFnZW9iai5zZXRQYWdlVGV4dCh0ZXh0KTtcblx0XHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoYC8qICR7cGFyYW1zLnRpdGxlfSAqLyAke3JlYXNvbn1gKTtcblx0XHRcdHBhZ2VvYmouc2V0Q2hhbmdlVGFncyhUd2lua2xlLmNoYW5nZVRhZ3MpO1xuXHRcdFx0cGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ25vY3JlYXRlJyk7XG5cdFx0XHRwYWdlb2JqLnNhdmUoVHdpbmtsZS5jbG9zZS5jYWxsYmFja3MuZGlzYWJsZUxpbmspO1xuXHRcdH0sXG5cdFx0ZGlzYWJsZUxpbms6IChwYWdlb2JqKSA9PiB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBwYWdlb2JqLmdldENhbGxiYWNrUGFyYW1ldGVycygpO1xuXHRcdFx0JChgc3Ryb25nIGFbaHJlZj0jJHtwYXJhbXMuc2VjdGlvbn1dIHNwYW5gKS5jc3MoJ2NvbG9yJywgJyM4MDgwODAnKTtcblx0XHR9LFxuXHR9O1xuXHRUd2lua2xlLmFkZEluaXRDYWxsYmFjayhUd2lua2xlLmNsb3NlLCAnY2xvc2UnKTtcbn0pKGpRdWVyeSk7XG4iLCAiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLW5vY2hlY2tcblxuLyohIFR3aW5rbGUuanMgLSB0d2lua2xlY29uZmlnLmpzICovXG4oZnVuY3Rpb24gdHdpbmtsZWNvbmZpZygkKSB7XG5cdGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXHQvKipcblx0ICogdHdpbmtsZWNvbmZpZy5qczogUHJlZmVyZW5jZXMgbW9kdWxlXG5cdCAqIE1vZGUgb2YgaW52b2NhdGlvbjogQWRkcyBjb25maWd1cmF0aW9uIGZvcm0gdG8gSGVscDpUd2lua2xlL+WPguaVsOiuvue9rixcblx0ICogYW5kIGFkZHMgYW4gYWQgYm94IHRvIHRoZSB0b3Agb2YgdXNlciBzdWJwYWdlcyBiZWxvbmdpbmcgdG8gdGhlXG5cdCAqIGN1cnJlbnRseSBsb2dnZWQtaW4gdXNlciB3aGljaCBlbmQgaW4gJy5qcydcblx0ICogQWN0aXZlIG9uOiBXaGF0IEkganVzdCBzYWlkLiBZZWFoLlxuXHQgKi9cblx0VHdpbmtsZS5jb25maWcgPSB7fTtcblx0VHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMgPSB7XG5cdFx0eWVzOiB3aW5kb3cud2dVTFMoJ+awuOS5heWKoOWFpeWIsOebkeinhuWIl+ihqCcsICfmsLjkuYXliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRubzogd2luZG93LndnVUxTKCfkuI3liqDlhaXliLDnm5Hop4bliJfooagnLCAn5LiN5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0ZGVmYXVsdDogd2luZG93LndnVUxTKCfpgbXlrojnq5nngrnorr7nva4nLCAn6YG15a6I56uZ6bue6Kit5a6aJyksXG5cdFx0JzEgd2Vlayc6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5Yiw55uR6KeG5YiX6KGoMeWRqCcsICfliqDlhaXliLDnm6PoppbmuIXllq4x6YCxJyksXG5cdFx0JzEgbW9udGgnOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeWIsOebkeinhuWIl+ihqDHkuKrmnIgnLCAn5Yqg5YWl5Yiw55uj6KaW5riF5ZauMeWAi+aciCcpLFxuXHRcdCczIG1vbnRocyc6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5Yiw55uR6KeG5YiX6KGoM+S4quaciCcsICfliqDlhaXliLDnm6PoppbmuIXllq4z5YCL5pyIJyksXG5cdFx0JzYgbW9udGhzJzogd2luZG93LndnVUxTKCfliqDlhaXliLDnm5Hop4bliJfooag25Liq5pyIJywgJ+WKoOWFpeWIsOebo+imlua4heWWrjblgIvmnIgnKSxcblx0fTtcblx0VHdpbmtsZS5jb25maWcuY29tbW9uU2V0cyA9IHtcblx0XHRjc2RDcml0ZXJpYToge1xuXHRcdFx0ZGI6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ55CG55SxJywgJ+iHquiogueQhueUsScpLFxuXHRcdFx0ZzE6ICdHMScsXG5cdFx0XHRnMjogJ0cyJyxcblx0XHRcdGczOiAnRzMnLFxuXHRcdFx0ZzQ6ICdHNCcsXG5cdFx0XHRnNTogJ0c1Jyxcblx0XHRcdGc2OiAnRzYnLFxuXHRcdFx0Zzc6ICdHNycsXG5cdFx0XHRnODogJ0c4Jyxcblx0XHRcdGc5OiAnRzknLFxuXHRcdFx0YTE6ICdBMScsXG5cdFx0XHRhMjogJ0EyJyxcblx0XHRcdGEzOiAnQTMnLFxuXHRcdFx0bzE6ICdPMScsXG5cdFx0XHRvMjogJ08yJyxcblx0XHRcdG8zOiAnTzMnLFxuXHRcdFx0ZjE6ICdGMScsXG5cdFx0XHRmMjogJ0YyJyxcblx0XHRcdGYzOiAnRjMnLFxuXHRcdFx0ZjQ6ICdGNCcsXG5cdFx0XHRmNTogJ0Y1Jyxcblx0XHRcdHIxOiAnUjEnLFxuXHRcdFx0cjI6ICdSMicsXG5cdFx0fSxcblx0XHRjc2RDcml0ZXJpYURpc3BsYXlPcmRlcjogW1xuXHRcdFx0J2RiJyxcblx0XHRcdCdnMScsXG5cdFx0XHQnZzInLFxuXHRcdFx0J2czJyxcblx0XHRcdCdnNCcsXG5cdFx0XHQnZzUnLFxuXHRcdFx0J2c2Jyxcblx0XHRcdCdnNycsXG5cdFx0XHQnZzgnLFxuXHRcdFx0J2c5Jyxcblx0XHRcdCdhMScsXG5cdFx0XHQnYTInLFxuXHRcdFx0J2EzJyxcblx0XHRcdCdvMScsXG5cdFx0XHQnbzInLFxuXHRcdFx0J28zJyxcblx0XHRcdCdmMScsXG5cdFx0XHQnZjInLFxuXHRcdFx0J2YzJyxcblx0XHRcdCdmNCcsXG5cdFx0XHQnZjUnLFxuXHRcdFx0J3IxJyxcblx0XHRcdCdyMicsXG5cdFx0XSxcblx0XHRjc2RDcml0ZXJpYU5vdGlmaWNhdGlvbjoge1xuXHRcdFx0ZGI6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ55CG55SxJywgJ+iHquiogueQhueUsScpLFxuXHRcdFx0ZzE6ICdHMScsXG5cdFx0XHRnMjogJ0cyJyxcblx0XHRcdGczOiAnRzMnLFxuXHRcdFx0ZzQ6ICdHNCcsXG5cdFx0XHRnNTogJ0c1Jyxcblx0XHRcdGc2OiAnRzYnLFxuXHRcdFx0Zzc6ICdHNycsXG5cdFx0XHRnODogJ0c4Jyxcblx0XHRcdGc5OiAnRzknLFxuXHRcdFx0YTE6ICdBMScsXG5cdFx0XHRhMjogJ0EyJyxcblx0XHRcdGEzOiAnQTMnLFxuXHRcdFx0bzE6ICdPMScsXG5cdFx0XHRvMjogJ08yJyxcblx0XHRcdG8zOiAnTzMnLFxuXHRcdFx0ZjE6ICdGMScsXG5cdFx0XHRmMjogJ0YyJyxcblx0XHRcdGYzOiAnRjMnLFxuXHRcdFx0ZjQ6ICdGNCcsXG5cdFx0XHRmNTogJ0Y1Jyxcblx0XHRcdHIxOiAnUjEnLFxuXHRcdFx0cjI6ICdSMicsXG5cdFx0fSxcblx0XHRjc2RDcml0ZXJpYU5vdGlmaWNhdGlvbkRpc3BsYXlPcmRlcjogW1xuXHRcdFx0J2RiJyxcblx0XHRcdCdnMScsXG5cdFx0XHQnZzInLFxuXHRcdFx0J2czJyxcblx0XHRcdCdnNCcsXG5cdFx0XHQnZzUnLFxuXHRcdFx0J2c2Jyxcblx0XHRcdCdnNycsXG5cdFx0XHQnZzgnLFxuXHRcdFx0J2c5Jyxcblx0XHRcdCdhMScsXG5cdFx0XHQnYTInLFxuXHRcdFx0J2EzJyxcblx0XHRcdCdvMScsXG5cdFx0XHQnbzInLFxuXHRcdFx0J28zJyxcblx0XHRcdCdmMScsXG5cdFx0XHQnZjInLFxuXHRcdFx0J2YzJyxcblx0XHRcdCdmNCcsXG5cdFx0XHQnZjUnLFxuXHRcdFx0J3IxJyxcblx0XHRcdCdyMicsXG5cdFx0XSxcblx0XHRjc2RBbmRESUNyaXRlcmlhOiB7XG5cdFx0XHRkYjogd2luZG93LndnVUxTKCfoh6rlrprkuYnnkIbnlLEnLCAn6Ieq6KiC55CG55SxJyksXG5cdFx0XHRnMTogJ0cxJyxcblx0XHRcdGcyOiAnRzInLFxuXHRcdFx0ZzM6ICdHMycsXG5cdFx0XHRnNDogJ0c0Jyxcblx0XHRcdGc1OiAnRzUnLFxuXHRcdFx0ZzY6ICdHNicsXG5cdFx0XHRnNzogJ0c3Jyxcblx0XHRcdGc4OiAnRzgnLFxuXHRcdFx0Zzk6ICdHOScsXG5cdFx0XHRhMTogJ0ExJyxcblx0XHRcdGEyOiAnQTInLFxuXHRcdFx0YTM6ICdBMycsXG5cdFx0XHRvMTogJ08xJyxcblx0XHRcdG8yOiAnTzInLFxuXHRcdFx0bzM6ICdPMycsXG5cdFx0XHRmMTogJ0YxJyxcblx0XHRcdGYyOiAnRjInLFxuXHRcdFx0ZjM6ICdGMycsXG5cdFx0XHRmNDogJ0Y0Jyxcblx0XHRcdGY1OiAnRjUnLFxuXHRcdFx0cjE6ICdSMScsXG5cdFx0XHRyMjogJ1IyJyxcblx0XHR9LFxuXHRcdGNzZEFuZERJQ3JpdGVyaWFEaXNwbGF5T3JkZXI6IFtcblx0XHRcdCdkYicsXG5cdFx0XHQnZzEnLFxuXHRcdFx0J2cyJyxcblx0XHRcdCdnMycsXG5cdFx0XHQnZzQnLFxuXHRcdFx0J2c1Jyxcblx0XHRcdCdnNicsXG5cdFx0XHQnZzcnLFxuXHRcdFx0J2c4Jyxcblx0XHRcdCdnOScsXG5cdFx0XHQnYTEnLFxuXHRcdFx0J2EyJyxcblx0XHRcdCdhMycsXG5cdFx0XHQnbzEnLFxuXHRcdFx0J28yJyxcblx0XHRcdCdvMycsXG5cdFx0XHQnZjEnLFxuXHRcdFx0J2YyJyxcblx0XHRcdCdmMycsXG5cdFx0XHQnZjQnLFxuXHRcdFx0J2Y1Jyxcblx0XHRcdCdyMScsXG5cdFx0XHQncjInLFxuXHRcdF0sXG5cdFx0eGZkQ3JpdGVyaWE6IHtcblx0XHRcdGRlbGV0ZTogd2luZG93LndnVUxTKCfliKDpmaQnLCAn5Yiq6ZmkJyksXG5cdFx0XHRtZXJnZTogd2luZG93LndnVUxTKCflkIjlubYnLCAn5ZCI5L21JyksXG5cdFx0XHRmd2Rjc2Q6IHdpbmRvdy53Z1VMUygn6L2s5Lqk6Ieq5b+r6YCf5Yig6Zmk5YCZ6YCJJywgJ+i9ieS6pOiHquW/q+mAn+WIqumZpOWAmemBuCcpLFxuXHRcdFx0ZmFtZTogd2luZG93LndnVUxTKCfmibnph4/lhbPms6jluqbmj5DliKAnLCAn5om55qyh6Zec5rOo5bqm5o+Q5YiqJyksXG5cdFx0XHRzdWJzdHViOiB3aW5kb3cud2dVTFMoJ+aJuemHj+Wwj+Wwj+S9nOWTgeaPkOWIoCcsICfmibnmrKHlsI/lsI/kvZzlk4Hmj5DliKonKSxcblx0XHRcdGJhdGNoOiB3aW5kb3cud2dVTFMoJ+aJuemHj+WFtuS7luaPkOWIoCcsICfmibnmrKHlhbbku5bmj5DliKonKSxcblx0XHR9LFxuXHRcdHhmZENyaXRlcmlhRGlzcGxheU9yZGVyOiBbJ2RlbGV0ZScsICdtZXJnZScsICdmd2Rjc2QnLCAnZmFtZScsICdzdWJzdHViJywgJ2JhdGNoJ10sXG5cdFx0bmFtZXNwYWNlc05vU3BlY2lhbDoge1xuXHRcdFx0MDogd2luZG93LndnVUxTKCfvvIjmnaHnm67vvIknLCAn77yI5qKd55uu77yJJyksXG5cdFx0XHQxOiAnVGFsaycsXG5cdFx0XHQyOiAnVXNlcicsXG5cdFx0XHQzOiAnVXNlciB0YWxrJyxcblx0XHRcdDQ6ICdMSUInLFxuXHRcdFx0NTogJ0xJQiB0YWxrJyxcblx0XHRcdDY6ICdGaWxlJyxcblx0XHRcdDc6ICdGaWxlIHRhbGsnLFxuXHRcdFx0ODogJ01lZGlhV2lraScsXG5cdFx0XHQ5OiAnTWVkaWFXaWtpIHRhbGsnLFxuXHRcdFx0MTA6ICdUZW1wbGF0ZScsXG5cdFx0XHQxMTogJ1RlbXBsYXRlIHRhbGsnLFxuXHRcdFx0MTI6ICdIZWxwJyxcblx0XHRcdDEzOiAnSGVscCB0YWxrJyxcblx0XHRcdDE0OiAnQ2F0ZWdvcnknLFxuXHRcdFx0MTU6ICdDYXRlZ29yeSB0YWxrJyxcblx0XHRcdDI3NDogJ1dpZGdldCcsXG5cdFx0XHQyNzU6ICdXaWRnZXQgdGFsaycsXG5cdFx0XHQzMDA6ICdGYW5tYWRlJyxcblx0XHRcdDMwMTogJ0Zhbm1hZGUgdGFsaycsXG5cdFx0XHQzMDI6ICdEcmFmdCcsXG5cdFx0XHQzMDM6ICdEcmFmdCB0YWxrJyxcblx0XHRcdDMwNDogJ1NNV0RhdGEnLFxuXHRcdFx0MzA1OiAnU01XRGF0YSB0YWxrJyxcblx0XHRcdDgyOTogJ01vZHVsZSB0YWxrJyxcblx0XHR9LFxuXHR9O1xuXHQvKipcblx0ICogU2VjdGlvbiBlbnRyeSBmb3JtYXQ6XG5cdCAqXG5cdCAqIHtcblx0ICogICB0aXRsZTogPGh1bWFuLXJlYWRhYmxlIHNlY3Rpb24gdGl0bGU+LFxuXHQgKiAgIG1vZHVsZTogPG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgbW9kdWxlLCB1c2VkIHRvIGxpbmsgdG8gc2VjdGlvbnM+LFxuXHQgKiAgIGFkbWluT25seTogPHRydWUgZm9yIGFkbWluLW9ubHkgc2VjdGlvbnM+LFxuXHQgKiAgIGhpZGRlbjogPHRydWUgZm9yIGFkdmFuY2VkIHByZWZlcmVuY2VzIHRoYXQgcmFyZWx5IG5lZWQgdG8gYmUgY2hhbmdlZCAtIHRoZXkgY2FuIHN0aWxsIGJlIG1vZGlmaWVkIGJ5IG1hbnVhbGx5IGVkaXRpbmcgdHdpbmtsZW9wdGlvbnMuanM+LFxuXHQgKiAgIHByZWZlcmVuY2VzOiBbXG5cdCAqICAgICB7XG5cdCAqICAgICAgIG5hbWU6IDxUd2lua2xlQ29uZmlnIHByb3BlcnR5IG5hbWU+LFxuXHQgKiAgICAgICBsYWJlbDogPGh1bWFuLXJlYWRhYmxlIHNob3J0IGRlc2NyaXB0aW9uIC0gdXNlZCBhcyBhIGZvcm0gbGFiZWw+LFxuXHQgKiAgICAgICBoZWxwdGlwOiA8KG9wdGlvbmFsKSBodW1hbi1yZWFkYWJsZSB0ZXh0ICh1c2luZyB2YWxpZCBIVE1MKSB0aGF0IGNvbXBsZW1lbnRzIHRoZSBkZXNjcmlwdGlvbiwgbGlrZSBsaW1pdHMsIHdhcm5pbmdzLCBldGMuPlxuXHQgKiAgICAgICBhZG1pbk9ubHk6IDx0cnVlIGZvciBhZG1pbi1vbmx5IHByZWZlcmVuY2VzPixcblx0ICogICAgICAgdHlwZTogPHN0cmluZ3xib29sZWFufGludGVnZXJ8ZW51bXxzZXR8Y3VzdG9tTGlzdD4gKGN1c3RvbUxpc3Qgc3RvcmVzIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0cyB7IHZhbHVlLCBsYWJlbCB9KSxcblx0ICogICAgICAgZW51bVZhbHVlczogPGZvciB0eXBlID0gXCJlbnVtXCI6IGEgSlNPTiBvYmplY3Qgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBpbnRlcm5hbCBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgaHVtYW4tcmVhZGFibGUgc3RyaW5ncz4sXG5cdCAqICAgICAgIHNldFZhbHVlczogPGZvciB0eXBlID0gXCJzZXRcIjogYSBKU09OIG9iamVjdCB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIGludGVybmFsIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSBodW1hbi1yZWFkYWJsZSBzdHJpbmdzPixcblx0ICogICAgICAgc2V0RGlzcGxheU9yZGVyOiA8KG9wdGlvbmFsKSBmb3IgdHlwZSA9IFwic2V0XCI6IGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleXMgb2Ygc2V0VmFsdWVzIChhcyBzdHJpbmdzKSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBkaXNwbGF5ZWQ+LFxuXHQgKiAgICAgICBjdXN0b21MaXN0VmFsdWVUaXRsZTogPGZvciB0eXBlID0gXCJjdXN0b21MaXN0XCI6IHRoZSBoZWFkaW5nIGZvciB0aGUgbGVmdCBcInZhbHVlXCIgY29sdW1uIGluIHRoZSBjdXN0b20gbGlzdCBlZGl0b3I+LFxuXHQgKiAgICAgICBjdXN0b21MaXN0TGFiZWxUaXRsZTogPGZvciB0eXBlID0gXCJjdXN0b21MaXN0XCI6IHRoZSBoZWFkaW5nIGZvciB0aGUgcmlnaHQgXCJsYWJlbFwiIGNvbHVtbiBpbiB0aGUgY3VzdG9tIGxpc3QgZWRpdG9yPlxuXHQgKiAgICAgfSxcblx0ICogICAgIC4gLiAuXG5cdCAqICAgXVxuXHQgKiB9LFxuXHQgKiAuIC4gLlxuXHQgKlxuXHQgKi9cblx0VHdpbmtsZS5jb25maWcuc2VjdGlvbnMgPSBbXG5cdFx0e1xuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5bi46KeEJywgJ+W4uOimjycpLFxuXHRcdFx0bW9kdWxlOiAnZ2VuZXJhbCcsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnVzZXJUYWxrUGFnZU1vZGUgbWF5IHRha2UgYXJndW1lbnRzOlxuXHRcdFx0XHQvLyAnd2luZG93Jzogb3BlbiBhIG5ldyB3aW5kb3csIHJlbWVtYmVyIHRoZSBvcGVuZWQgd2luZG93XG5cdFx0XHRcdC8vICd0YWInOiBvcGVucyBpbiBhIG5ldyB0YWIsIGlmIHBvc3NpYmxlLlxuXHRcdFx0XHQvLyAnYmxhbmsnOiBmb3JjZSBvcGVuIGluIGEgbmV3IHdpbmRvdywgZXZlbiBpZiBzdWNoIGEgd2luZG93IGV4aXN0c1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3VzZXJUYWxrUGFnZU1vZGUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W9k+imgeaJk+W8gOeUqOaIt+iuqOiuuumhteaXticsICfnlbbopoHmiZPplovkvb/nlKjogIXoqI7oq5bpoIHmmYInKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczoge1xuXHRcdFx0XHRcdFx0d2luZG93OiB3aW5kb3cud2dVTFMoJ+WcqOeql+WPo+S4re+8jOabv+aNouaIkOWFtuWug+eUqOaIt+WvueivnemhtScsICflnKjnlbbliY3liIbpoIHvvIzmm7/mj5vmiJDlhbblroPnlKjmiLboqI7oq5bpoIEnKSxcblx0XHRcdFx0XHRcdHRhYjogd2luZG93LndnVUxTKCflnKjmlrDmoIfnrb7pobXkuK0nLCAn5Zyo5paw5YiG6aCB5LitJyksXG5cdFx0XHRcdFx0XHRibGFuazogd2luZG93LndnVUxTKCflnKjlhajmlrDnmoTnqpflj6PkuK0nLCAn5Zyo5paw6KaW56qX5LitJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5kaWFsb2dMYXJnZUZvbnQgKGJvb2xlYW4pXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGlhbG9nTGFyZ2VGb250Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflnKhUd2lua2xl5a+56K+d5qGG5Lit5L2/55So5aSn5Y+35a2X5L2TJywgJ+WcqFR3aW5rbGXlsI3oqbHmlrnloYrkuK3kvb/nlKjlpKfomZ/lrZflnosnKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGUuY29uZmlnLmRpc2FibGVkTW9kdWxlcyAoYXJyYXkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGlzYWJsZWRNb2R1bGVzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflhbPpl63mjIflrprnmoRUd2lua2xl5qih5Z2XJywgJ+mXnOmWieaMh+WumueahFR3aW5rbGXmqKHntYQnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5oKo5Zyo5q2k6YCJ5oup55qE5Yqf6IO95bCG5peg5rOV5L2/55So77yM5Y+W5raI6YCJ5oup5Lul6YeN5paw5ZCv55So5Yqf6IO944CCJyxcblx0XHRcdFx0XHRcdCfmgqjlnKjmraTpgbjmk4fnmoTlip/og73lsIfnhKHms5Xkvb/nlKjvvIzlj5bmtojpgbjmk4fku6Xph43mlrDllZ/nlKjlip/og73jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IHtcblx0XHRcdFx0XHRcdGFydjogd2luZG93LndnVUxTKCflkYrnirYnLCAn5ZGK54uAJyksXG5cdFx0XHRcdFx0XHR3YXJuOiAn6K2m5ZGKJyxcblx0XHRcdFx0XHRcdGJsb2NrOiB3aW5kb3cud2dVTFMoJ+WwgeemgScsICflsIHpjpYnKSxcblx0XHRcdFx0XHRcdHRhbGtiYWNrOiAn6YCa5ZGKJyxcblx0XHRcdFx0XHRcdHNwZWVkeTogd2luZG93LndnVUxTKCfpgJ/liKAnLCAn6YCf5YiqJyksXG5cdFx0XHRcdFx0XHRjb3B5dmlvOiB3aW5kb3cud2dVTFMoJ+S+teadgycsICfkvrXmrIonKSxcblx0XHRcdFx0XHRcdHhmZDogd2luZG93LndnVUxTKCfmj5DliKAnLCAn5o+Q5YiqJyksXG5cdFx0XHRcdFx0XHRpbWFnZTogd2luZG93LndnVUxTKCflm77mnYMnLCAn5ZyW5qyKJyksXG5cdFx0XHRcdFx0XHRwcm90ZWN0OiB3aW5kb3cud2dVTFMoJ+S/neaKpCcsICfkv53orbcnKSxcblx0XHRcdFx0XHRcdHRhZzogd2luZG93LndnVUxTKCfmoIforrAnLCAn5qiZ6KiYJyksXG5cdFx0XHRcdFx0XHRzdHViOiAn5bCP5L2c5ZOBJyxcblx0XHRcdFx0XHRcdGRpZmY6IHdpbmRvdy53Z1VMUygn5beu5byCJywgJ+W3rueVsCcpLFxuXHRcdFx0XHRcdFx0dW5saW5rOiB3aW5kb3cud2dVTFMoJ+mTvuWFpScsICfpgKPlhaUnKSxcblx0XHRcdFx0XHRcdGZsdWZmOiAn5Zue6YCAJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlLmNvbmZpZy5kaXNhYmxlZFN5c29wTW9kdWxlcyAoYXJyYXkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGlzYWJsZWRTeXNvcE1vZHVsZXMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WFs+mXreaMh+WumueahFR3aW5rbGXnrqHnkIblkZjmqKHlnZcnLCAn6Zec6ZaJ5oyH5a6a55qEVHdpbmtsZeeuoeeQhuWToeaooee1hCcpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjlnKjmraTpgInmi6nnmoTlip/og73lsIbml6Dms5Xkvb/nlKjvvIzlj5bmtojpgInmi6nku6Xph43mlrDlkK/nlKjlip/og73jgIInLFxuXHRcdFx0XHRcdFx0J+aCqOWcqOatpOmBuOaTh+eahOWKn+iDveWwh+eEoeazleS9v+eUqO+8jOWPlua2iOmBuOaTh+S7pemHjeaWsOWVn+eUqOWKn+iDveOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IHtcblx0XHRcdFx0XHRcdGJhdGNoZGVsZXRlOiB3aW5kb3cud2dVTFMoJ+aJueWIoCcsICfmibnliKonKSxcblx0XHRcdFx0XHRcdGJhdGNodW5kZWxldGU6IHdpbmRvdy53Z1VMUygn5om55aSNJywgJ+aJueW+qScpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5ZGK54q2JywgJ+WRiueLgCcpLFxuXHRcdFx0bW9kdWxlOiAnYXJ2Jyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnc3BpV2F0Y2hSZXBvcnQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WPkei1t+WCgOWEoeiwg+afpeaXtuWKoOWFpeWIsOebkeinhuWIl+ihqCcsICfnmbzotbflgoDlhKHoqr/mn6XmmYLliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5bCB56aB55So5oi3JywgJ+WwgemOluS9v+eUqOiAhScpLFxuXHRcdFx0bW9kdWxlOiAnYmxvY2snLFxuXHRcdFx0YWRtaW5Pbmx5OiB0cnVlLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5kZWZhdWx0VG9CbG9jazY0IChib29sZWFuKVxuXHRcdFx0XHQvLyBXaGV0aGVyIHRvIGRlZmF1bHQgdG8ganVzdCBibG9ja2luZyB0aGUgLzY0IG9uIG9yIG9mZlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2RlZmF1bHRUb0Jsb2NrNjQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WvueS6jklQdjblnLDlnYDvvIzpu5jorqTpgInmi6nlsIHnpoEvNjTmrrUnLCAn5bCN5pa8SVB2NuWcsOWdgO+8jOmgkOioremBuOaTh+WwgemOli82NOautScpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5kZWZhdWx0VG9QYXJ0aWFsQmxvY2tzIChib29sZWFuKVxuXHRcdFx0XHQvLyBXaGV0aGVyIHRvIGRlZmF1bHQgcGFydGlhbCBibG9ja3Mgb24gb3Igb2ZmXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZGVmYXVsdFRvUGFydGlhbEJsb2NrcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5omT5byA5bCB56aB6I+c5Y2V5pe26buY6K6k6YCJ5oup6YOo5YiG5bCB56aBJywgJ+aJk+mWi+WwgemOlumBuOWWruaZgumgkOioremBuOaTh+mDqOWIhuWwgemOlicpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy53YXRjaEJsb2NrTm90aWNlcyAoc3RyaW5nKVxuXHRcdFx0XHQvLyBXYXRjaGxpc3Qgc2V0dGluZyBmb3IgdGhlIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gZGlzcGF0Y2hlZCBhbiB3YXJuaW5nIG9yIG5vdGljZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoQmxvY2tOb3RpY2VzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WPkemAgeWwgeemgeaooeadv+aXtuWKoOWFpeeUqOaIt+iuqOiuuumhteWIsOebkeinhuWIl+ihqCcsXG5cdFx0XHRcdFx0XHQn55m86YCB5bCB6Y6W5qih5p2/5pmC5Yqg5YWl5L2/55So6ICF6KiO6KuW6aCB5Yiw55uj6KaW5riF5ZauJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2N1c3RvbUJsb2NrUmVhc29uTGlzdCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5bCB56aB55CG55SxJywgJ+iHquioguWwgemOlueQhueUsScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfmgqjlj6/ku6XliqDlhaXluLjnlKjnmoTlsIHnpoHnkIbnlLHjgILoh6rlrprkuYnnmoTlsIHnpoHnkIbnlLHkvJrlh7rnjrDlnKjkuIDoiKznmoTlsIHnpoHnkIbnlLHkuIvmlrnjgIInLFxuXHRcdFx0XHRcdFx0J+aCqOWPr+S7peWKoOWFpeW4uOeUqOeahOWwgemOlueQhueUseOAguiHquiogueahOWwgemOlueQhueUseacg+WHuuePvuWcqOS4gOiIrOeahOWwgemOlueQhueUseS4i+aWueOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdjdXN0b21MaXN0Jyxcblx0XHRcdFx0XHRjdXN0b21MaXN0VmFsdWVUaXRsZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+S9v+eUqOWwgeemgeaooeadv++8iOm7mOiupOS4uiB1dy1ibG9jazHvvIknLFxuXHRcdFx0XHRcdFx0J+S9v+eUqOWwgemOluaooeadv++8iOmgkOioreeCuiB1dy1ibG9jazHvvIknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRjdXN0b21MaXN0TGFiZWxUaXRsZTogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+KAnOeUseS6juKApuaCqOW3suiiq+WwgeemgeKAneWPiuWwgeemgeaXpeW/l+eQhueUsScsXG5cdFx0XHRcdFx0XHQn44CM55Sx5pa84oCm5oKo5bey6KKr5bCB6Y6W44CN5Y+K5bCB6Y6W5pel6KqM55CG55SxJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5Zu+54mH5Yig6ZmkJywgJ+WclueJh+WIqumZpCcpLFxuXHRcdFx0bW9kdWxlOiAnaW1hZ2UnLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5ub3RpZnlVc2VyT25EZWxpIChib29sZWFuKVxuXHRcdFx0XHQvLyBJZiB0aGUgdXNlciBzaG91bGQgYmUgbm90aWZpZWQgYWZ0ZXIgcGxhY2luZyBhIGZpbGUgZGVsZXRpb24gdGFnXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbm90aWZ5VXNlck9uRGVsaScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5Yu+6YCJ4oCc6YCa55+l5Yib5bu66ICF4oCdJywgJ+mgkOioreWLvumBuOOAjOmAmuefpeW7uueri+iAheOAjScpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5kZWxpV2F0Y2hQYWdlIChzdHJpbmcpXG5cdFx0XHRcdC8vIFRoZSB3YXRjaGxpc3Qgc2V0dGluZyBvZiB0aGUgcGFnZSB0YWdnZWQgZm9yIGRlbGV0aW9uLlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2RlbGlXYXRjaFBhZ2UnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOWbvueJh+aXtuWKoOWFpeWIsOebkeinhuWIl+ihqCcsICfmqJnoqJjlnJbniYfmmYLliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuZGVsaVdhdGNoVXNlciAoc3RyaW5nKVxuXHRcdFx0XHQvLyBUaGUgd2F0Y2hsaXN0IHNldHRpbmcgb2YgdGhlIHVzZXIgdGFsayBwYWdlIGlmIGEgbm90aWZpY2F0aW9uIGlzIHBsYWNlZC5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdkZWxpV2F0Y2hVc2VyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDlm77niYfml7bliqDlhaXliJvlu7rogIXorqjorrrpobXliLDnm5Hop4bliJfooagnLCAn5qiZ6KiY5ZyW54mH5pmC5Yqg5YWl5bu656uL6ICF6KiO6KuW6aCB5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+S/neaKpCcsICfkv53orbcnKSxcblx0XHRcdG1vZHVsZTogJ3Byb3RlY3QnLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFJlcXVlc3RlZFBhZ2VzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfor7fmsYLkv53miqTpobXpnaLml7bliqDlhaXliLDnm5Hop4bliJfooagnLCAn6KuL5rGC5L+d6K236aCB6Z2i5pmC5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoUFBUYWdnZWRQYWdlcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w5L+d5oqk5qih5p2/5pe25Yqg5YWl5Yiw55uR6KeG5YiX6KGoJywgJ+aomeiomOS/neitt+aooeadv+aZguWKoOWFpeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFByb3RlY3RlZFBhZ2VzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkv53miqTml7bliqDlhaXliLDnm5Hop4bliJfooagnLCAn5L+d6K235pmC5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+iLpeWcqOS/neaKpOWQjuS5n+agh+iusOmhtemdou+8jOWImeS9v+eUqOagh+iusOmhtemdoueahOWPguaVsOiuvue9ruOAgicsXG5cdFx0XHRcdFx0XHQn6Iul5Zyo5L+d6K235b6M5Lmf5qiZ6KiY6aCB6Z2i77yM5YmH5L2/55So5qiZ6KiY6aCB6Z2i55qE5YGP5aW96Kit5a6a44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0YWRtaW5Pbmx5OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogJ+WbnumAgCcsXG5cdFx0XHQvLyB0d2lua2xlZmx1ZmYgbW9kdWxlXG5cdFx0XHRtb2R1bGU6ICdmbHVmZicsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLmF1dG9NZW51QWZ0ZXJSb2xsYmFjayAoYm9vbClcblx0XHRcdFx0Ly8gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkgb3BlbiB0aGUgd2FybmluZyBtZW51IGlmIHRoZSB1c2VyIHRhbGsgcGFnZSBpcyBvcGVuZWQgcG9zdC1yZXZlcnNpb25cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdhdXRvTWVudUFmdGVyUm9sbGJhY2snLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5ZyoVHdpbmtsZeWbnumAgOWQjuiHquWKqOaJk+W8gOeUqOaIt+iuqOiuuumhteS4iueahFR3aW5rbGXorablkYroj5zljZUnLFxuXHRcdFx0XHRcdFx0J+WcqFR3aW5rbGXlm57pgIDlvozoh6rli5XmiZPplovkvb/nlKjogIXoqI7oq5bpoIHkuIrnmoRUd2lua2xl6K2m5ZGK6YG45ZauJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKCfku4XlnKjpgInlj5bkuIvmlrnlr7nlupTmoYbml7bmiY3miafooYwnLCAn5YOF5Zyo6YG45Y+W5LiL5pa55bCN5oeJ5qGG5pmC5omN5Z+36KGMJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLm9wZW5UYWxrUGFnZSAoYXJyYXkpXG5cdFx0XHRcdC8vIFdoYXQgdHlwZXMgb2YgYWN0aW9ucyB0aGF0IHNob3VsZCByZXN1bHQgaW4gb3BlbmluZyBvZiB0YWxrIHBhZ2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdvcGVuVGFsa1BhZ2UnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOi/meS6m+exu+Wei+eahOWbnumAgOWQjuaJk+W8gOeUqOaIt+iuqOiuuumhtScsICflnKjpgJnkupvpoZ7liKXnmoTlm57pgIDlvozmiZPplovkvb/nlKjogIXoqI7oq5bpoIEnKSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IHtcblx0XHRcdFx0XHRcdG5vcm06IHdpbmRvdy53Z1VMUygn5bi46KeE5Zue6YCAJywgJ+W4uOimj+WbnumAgCcpLFxuXHRcdFx0XHRcdFx0dmFuZDogd2luZG93LndnVUxTKCfnoLTlnY/lm57pgIAnLCAn56C05aOe5Zue6YCAJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5vcGVuVGFsa1BhZ2VPbkF1dG9SZXZlcnQgKGJvb2wpXG5cdFx0XHRcdC8vIERlZmluZXMgaWYgdGFsayBwYWdlIHNob3VsZCBiZSBvcGVuZWQgd2hlbiBjYWxsaW5nIHJldmVydCBmcm9tIGNvbnRyaWJzIG9yIHJlY2VudCBjaGFuZ2VzIHBhZ2VzLiBJZiBzZXQgdG8gdHJ1ZSwgb3BlblRhbGtQYWdlIGRlZmluZXMgdGhlbiBpZiB0YWxrIHBhZ2Ugd2lsbCBiZSBvcGVuZWQuXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnb3BlblRhbGtQYWdlT25BdXRvUmV2ZXJ0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOS7jueUqOaIt+i0oeeMruWPiuacgOi/keabtOaUueS4reWPkei1t+WbnumAgOaXtuaJk+W8gOeUqOaIt+iuqOiuuumhtScsXG5cdFx0XHRcdFx0XHQn5Zyo5b6e5L2/55So6ICF6LKi54275Y+K6L+R5pyf6K6K5pu05Lit55m86LW35Zue6YCA5pmC5omT6ZaL5L2/55So6ICF6KiO6KuW6aCBJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKCflvZPlroPmiZPlvIDml7bvvIzkvp3otZbkuIrkuIDkuKrorr7nva7jgIInLCAn55W25a6D5omT6ZaL5pmC77yM5L6d6LO05LiK5LiA5YCL6Kit5a6a44CCJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnJvbGxiYWNrSW5QbGFjZSAoYm9vbClcblx0XHRcdFx0Ly9cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdyb2xsYmFja0luUGxhY2UnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5Zyo5LuO55So5oi36LSh54yu5Y+K5pyA6L+R5pu05pS55Lit5Y+R6LW35Zue6YCA5pe25LiN5Yi35paw6aG16Z2iJyxcblx0XHRcdFx0XHRcdCflnKjlvp7kvb/nlKjogIXosqLnjbvlj4rov5HmnJ/orormm7TkuK3nmbzotbflm57pgIDmmYLkuI3ph43mlrDmlbTnkIbpoIHpnaInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5b2T5a6D5omT5byA5pe277yMVHdpbmtsZeWwhuS4jeS8muWcqOS7jueUqOaIt+i0oeeMruWPiuacgOi/keabtOaUueS4reWPkei1t+WbnumAgOaXtuWIt+aWsOmhtemdou+8jOWFgeiuuOaCqOS4gOasoeaAp+WbnumAgOWkmuS4que8lui+keOAgicsXG5cdFx0XHRcdFx0XHQn55W25a6D5omT6ZaL5pmC77yMVHdpbmtsZeWwh+S4jeacg+WcqOW+nuS9v+eUqOiAheiyoueNu+WPiui/keacn+iuiuabtOS4reeZvOi1t+WbnumAgOaZgumHjeaWsOaVtOeQhumggemdou+8jOWFgeioseaCqOS4gOasoeaAp+WbnumAgOWkmuWAi+e3qOi8r+OAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5tYXJrUmV2ZXJ0ZWRQYWdlc0FzTWlub3IgKGFycmF5KVxuXHRcdFx0XHQvLyBXaGF0IHR5cGVzIG9mIGFjdGlvbnMgdGhhdCBzaG91bGQgcmVzdWx0IGluIG1hcmtpbmcgZWRpdCBhcyBtaW5vclxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtSZXZlcnRlZFBhZ2VzQXNNaW5vcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCG6L+Z5Lqb57G75Z6L55qE5Zue6YCA5qCH6K6w5Li65bCP5L+u5pS5JywgJ+Wwh+mAmeS6m+mhnuWIpeeahOWbnumAgOaomeiomOeCuuWwj+S/ruaUuScpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczoge1xuXHRcdFx0XHRcdFx0bm9ybTogd2luZG93LndnVUxTKCfluLjop4Tlm57pgIAnLCAn5bi46KaP5Zue6YCAJyksXG5cdFx0XHRcdFx0XHR2YW5kOiB3aW5kb3cud2dVTFMoJ+egtOWdj+WbnumAgCcsICfnoLTlo57lm57pgIAnKSxcblx0XHRcdFx0XHRcdHRvcmV2OiB3aW5kb3cud2dVTFMoJ+KAnOaBouWkjeatpOeJiOacrOKAnScsICfjgIzmgaLlvqnmraTniYjmnKzjgI0nKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLndhdGNoUmV2ZXJ0ZWRQYWdlcyAoYXJyYXkpXG5cdFx0XHRcdC8vIFdoYXQgdHlwZXMgb2YgYWN0aW9ucyB0aGF0IHNob3VsZCByZXN1bHQgaW4gZm9yY2VkIGFkZGl0aW9uIHRvIHdhdGNobGlzdFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoUmV2ZXJ0ZWRQYWdlcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5oqK6L+Z5Lqb57G75Z6L55qE5Zue6YCA5Yqg5YWl5Yiw55uR6KeG5YiX6KGoJywgJ+aKiumAmeS6m+mhnuWIpeeahOWbnumAgOWKoOWFpeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczoge1xuXHRcdFx0XHRcdFx0bm9ybTogd2luZG93LndnVUxTKCfluLjop4Tlm57pgIAnLCAn5bi46KaP5Zue6YCAJyksXG5cdFx0XHRcdFx0XHR2YW5kOiB3aW5kb3cud2dVTFMoJ+egtOWdj+WbnumAgCcsICfnoLTlo57lm57pgIAnKSxcblx0XHRcdFx0XHRcdHRvcmV2OiB3aW5kb3cud2dVTFMoJ+KAnOaBouWkjeatpOeJiOacrOKAnScsICfjgIzmgaLlvqnmraTniYjmnKzjgI0nKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLndhdGNoUmV2ZXJ0ZWRFeHBpcnlcblx0XHRcdFx0Ly8gSWYgYW55IG9mIHRoZSBhYm92ZSBpdGVtcyBhcmUgc2VsZWN0ZWQsIHdoZXRoZXIgdG8gZXhwaXJlIHRoZSB3YXRjaFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoUmV2ZXJ0ZWRFeHBpcnknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W9k+WbnumAgOmhtemdouaXtu+8jOWKoOWFpeWIsOebkeinhuWIl+ihqOeahOacn+mZkCcsICfnlbblm57pgIDpoIHpnaLmmYLvvIzliqDlhaXliLDnm6PoppbmuIXllq7nmoTmnJ/pmZAnKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcub2ZmZXJSZWFzb25Pbk5vcm1hbFJldmVydCAoYm9vbGVhbilcblx0XHRcdFx0Ly8gSWYgdG8gb2ZmZXIgYSBwcm9tcHQgZm9yIGV4dHJhIHN1bW1hcnkgcmVhc29uIGZvciBub3JtYWwgcmV2ZXJ0cywgZGVmYXVsdCB0byB0cnVlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnb2ZmZXJSZWFzb25Pbk5vcm1hbFJldmVydCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bi46KeE5Zue6YCA5pe26K+i6Zeu55CG55SxJywgJ+W4uOimj+WbnumAgOaZguipouWVj+eQhueUsScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn4oCc5bi46KeE4oCd5Zue6YCA5piv5Lit6Ze055qE6YKj5LiqW+WbnumAgF3pk77mjqXjgIInLCAn44CM5bi46KaP44CN5Zue6YCA5piv5Lit6ZaT55qE6YKj5YCLW+WbnumAgF3pgKPntZDjgIInKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY29uZmlybU9uRmx1ZmYnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WbnumAgOWJjeimgeaxguehruiupO+8iOaJgOacieiuvuWkh++8iScsICflm57pgIDliY3opoHmsYLnorroqo3vvIjmiYDmnInoo53nva7vvIknKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5a+55LqO5L2/55So56e75Yqo6K6+5aSH55qE55So5oi377yM5oiW6ICF5oSP5b+X5LiN5Z2a5a6a55qE44CCJyxcblx0XHRcdFx0XHRcdCflsI3mlrzkvb/nlKjooYzli5Xoo53nva7nmoTkvb/nlKjogIXvvIzmiJbogIXmhI/lv5fkuI3loIXlrprnmoTjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuc2hvd1JvbGxiYWNrTGlua3MgKGFycmF5KVxuXHRcdFx0XHQvLyBXaGVyZSBUd2lua2xlIHNob3VsZCBzaG93IHJvbGxiYWNrIGxpbmtzOlxuXHRcdFx0XHQvLyBkaWZmLCBvdGhlcnMsIG1pbmUsIGNvbnRyaWJzLCBoaXN0b3J5LCByZWNlbnRcblx0XHRcdFx0Ly8gTm90ZSBmcm9tIFRUTzogfGNvbnRyaWJzfCBzZWVtcyB0byBiZSBlcXVhbCB0byB8b3RoZXJzfCArIHxtaW5lfCwgaS5lLiByZWR1bmRhbnQsIHNvIEkgbGVmdCBpdCBvdXQgaGVyZXNcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdzaG93Um9sbGJhY2tMaW5rcycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo6L+Z5Lqb6aG16Z2i5LiK5pi+56S65Zue6YCA6ZO+5o6lJywgJ+WcqOmAmeS6m+mggemdouS4iumhr+ekuuWbnumAgOmAo+e1kCcpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczoge1xuXHRcdFx0XHRcdFx0ZGlmZjogd2luZG93LndnVUxTKCflt67lvIInLCAn5beu55WwJyksXG5cdFx0XHRcdFx0XHRoaXN0b3J5OiB3aW5kb3cud2dVTFMoJ+WOhuWPsuiusOW9lScsICfmrbflj7LoqJjpjIQnKSxcblx0XHRcdFx0XHRcdG90aGVyczogd2luZG93LndnVUxTKCflhbblroPnlKjmiLfnmoTotKHnjK4nLCAn5YW25a6D5L2/55So6ICF55qE6LKi5427JyksXG5cdFx0XHRcdFx0XHRtaW5lOiB3aW5kb3cud2dVTFMoJ+aIkeeahOi0oeeMricsICfmiJHnmoTosqLnjbsnKSxcblx0XHRcdFx0XHRcdHJlY2VudGNoYW5nZXM6IHdpbmRvdy53Z1VMUygn5pyA6L+R5pu05pS5JywgJ+i/keacn+iuiuabtCcpLFxuXHRcdFx0XHRcdFx0cmVjZW50Y2hhbmdlc2xpbmtlZDogd2luZG93LndnVUxTKCfnm7jlhbPmm7TmlLknLCAn55u46Zec6K6K5pu0JyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjdXN0b21SZXZlcnRTdW1tYXJ5Jyxcblx0XHRcdFx0XHRsYWJlbDogJ+WbnumAgOeQhueUsScsXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WcqOafpeeci+W3ruW8guaXtuWPr+mAie+8jOS7heWWhOaEj+WbnumAgOOAgeW4uOinhOWbnumAgOOAgeaBouWkjeatpOeJiOacrCcsXG5cdFx0XHRcdFx0XHQn5Zyo5qqi6KaW5beu55Ww5pmC5Y+v6YG477yM5YOF5ZaE5oSP5Zue6YCA44CB5bi46KaP5Zue6YCA44CB5oGi5b6p5q2k54mI5pysJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2N1c3RvbUxpc3QnLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RWYWx1ZVRpdGxlOiAn55CG55SxJyxcblx0XHRcdFx0XHRjdXN0b21MaXN0TGFiZWxUaXRsZTogd2luZG93LndnVUxTKCfmmL7npLrnmoTmloflrZcnLCAn6aGv56S655qE5paH5a2XJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5b+r6YCf5Yig6ZmkJywgJ+W/q+mAn+WIqumZpCcpLFxuXHRcdFx0bW9kdWxlOiAnc3BlZWR5Jyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnc3BlZWR5U2VsZWN0aW9uU3R5bGUnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+S7gOS5iOaXtuWAmeaJp+ihjOagh+iusOaIluWIoOmZpCcsICfku4DpurzmmYLlgJnln7fooYzmqJnoqJjmiJbliKrpmaQnKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczoge1xuXHRcdFx0XHRcdFx0YnV0dG9uQ2xpY2s6IHdpbmRvdy53Z1VMUygn5b2T5oiR54K54oCc5o+Q5Lqk4oCd5pe2JywgJ+eVtuaIkem7nuOAjOaPkOS6pOOAjeaZgicpLFxuXHRcdFx0XHRcdFx0cmFkaW9DbGljazogd2luZG93LndnVUxTKCflvZPmiJHngrnkuIDkuKrpgInpobnml7YnLCAn55W25oiR6bue5LiA5YCL6YG46aCF5pmCJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy53YXRjaFNwZWVkeVBhZ2VzIChhcnJheSlcblx0XHRcdFx0Ly8gV2hldGhlciB0byBhZGQgc3BlZWR5IHRhZ2dlZCBwYWdlcyB0byB3YXRjaGxpc3Rcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd3YXRjaFNwZWVkeVBhZ2VzJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCflsIbku6XkuIvnkIbnlLHliqDlhaXliLDnm5Hop4bliJfooagnLCAn5bCH5Lul5LiL55CG55Sx5Yqg5YWl5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ3NldCcsXG5cdFx0XHRcdFx0c2V0VmFsdWVzOiBUd2lua2xlLmNvbmZpZy5jb21tb25TZXRzLmNzZENyaXRlcmlhLFxuXHRcdFx0XHRcdHNldERpc3BsYXlPcmRlcjogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5jc2RDcml0ZXJpYURpc3BsYXlPcmRlcixcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy53YXRjaFNwZWVkeUV4cGlyeVxuXHRcdFx0XHQvLyBJZiBhbnkgb2YgdGhlIGFib3ZlIGl0ZW1zIGFyZSBzZWxlY3RlZCwgd2hldGhlciB0byBleHBpcmUgdGhlIHdhdGNoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnd2F0Y2hTcGVlZHlFeHBpcnknLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+W9k+agh+iusOmhtemdouaXtu+8jOWKoOWFpeWIsOebkeinhuWIl+ihqOeahOacn+mZkCcsICfnlbbmqJnoqJjpoIHpnaLmmYLvvIzliqDlhaXliLDnm6PoppbmuIXllq7nmoTmnJ/pmZAnKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcubWFya1NwZWVkeVBhZ2VzQXNQYXRyb2xsZWQgKGJvb2xlYW4pXG5cdFx0XHRcdC8vIElmLCB3aGVuIGFwcGx5aW5nIHNwZWVkeSB0ZW1wbGF0ZSB0byBwYWdlLCB0byBtYXJrIHRoZSBwYWdlIGFzIHBhdHJvbGxlZCAoaWYgdGhlIHBhZ2Ugd2FzIHJlYWNoZWQgZnJvbSBOZXdQYWdlcylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdtYXJrU3BlZWR5UGFnZXNBc1BhdHJvbGxlZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w5pe25qCH6K6w6aG16Z2i5Li65bey5beh5p+l77yI5aaC5Y+v6IO977yJJywgJ+aomeiomOaZguaomeiomOmggemdoueCuuW3suW3oeafpe+8iOWmguWPr+iDve+8iScpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5ub3RpZnlVc2VyT25TcGVlZHlEZWxldGlvbk5vbWluYXRpb24gKGFycmF5KVxuXHRcdFx0XHQvLyBXaGF0IHR5cGVzIG9mIGFjdGlvbnMgc2hvdWxkIHJlc3VsdCB0aGF0IHRoZSBhdXRob3Igb2YgdGhlIHBhZ2UgYmVpbmcgbm90aWZpZWQgb2Ygbm9taW5hdGlvblxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ25vdGlmeVVzZXJPblNwZWVkeURlbGV0aW9uTm9taW5hdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5LuF5Zyo5L2/55So5Lul5LiL55CG55Sx5pe26YCa55+l6aG16Z2i5Yib5bu66ICFJywgJ+WDheWcqOS9v+eUqOS7peS4i+eQhueUseaZgumAmuefpemggemdouW7uueri+iAhScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflsL3nrqHmgqjlnKjlr7nor53moYbkuK3pgInmi6npgJrnn6XvvIzpgJrnn6Xku43lj6rkvJrlnKjkvb/nlKjov5nkupvnkIbnlLHml7blj5Hlh7rjgIInLFxuXHRcdFx0XHRcdFx0J+WEmOeuoeaCqOWcqOWwjeipseaWueWhiuS4remBuOaTh+mAmuefpe+8jOmAmuefpeS7jeWPquacg+WcqOS9v+eUqOmAmeS6m+eQhueUseaZgueZvOWHuuOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5jc2RDcml0ZXJpYU5vdGlmaWNhdGlvbixcblx0XHRcdFx0XHRzZXREaXNwbGF5T3JkZXI6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQ3JpdGVyaWFOb3RpZmljYXRpb25EaXNwbGF5T3JkZXIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcucHJvbXB0Rm9yU3BlZWR5RGVsZXRpb25TdW1tYXJ5IChhcnJheSBvZiBzdHJpbmdzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3Byb21wdEZvclNwZWVkeURlbGV0aW9uU3VtbWFyeScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5L2/55So5Lul5LiL55CG55Sx5Yig6Zmk5pe25YWB6K6457yW6L6R5Yig6Zmk55CG55SxJywgJ+S9v+eUqOS7peS4i+eQhueUseWIqumZpOaZguWFgeiosee3qOi8r+WIqumZpOeQhueUsScpLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHRcdFx0XHRzZXRWYWx1ZXM6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQW5kRElDcml0ZXJpYSxcblx0XHRcdFx0XHRzZXREaXNwbGF5T3JkZXI6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMuY3NkQW5kRElDcml0ZXJpYURpc3BsYXlPcmRlcixcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5vcGVuVXNlclRhbGtQYWdlT25TcGVlZHlEZWxldGUgKGFycmF5IG9mIHN0cmluZ3MpXG5cdFx0XHRcdC8vIFdoYXQgdHlwZXMgb2YgYWN0aW9ucyB0aGF0IHNob3VsZCByZXN1bHQgdXNlciB0YWxrIHBhZ2UgdG8gYmUgb3BlbmVkIHdoZW4gc3BlZWRpbHkgZGVsZXRpbmcgKGFkbWluIG9ubHkpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnb3BlblVzZXJUYWxrUGFnZU9uU3BlZWR5RGVsZXRlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkvb/nlKjku6XkuIvnkIbnlLHml7bmiZPlvIDnlKjmiLforqjorrrpobUnLCAn5L2/55So5Lul5LiL55CG55Sx5pmC5omT6ZaL5L2/55So6ICF6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0YWRtaW5Pbmx5OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5jc2RBbmRESUNyaXRlcmlhLFxuXHRcdFx0XHRcdHNldERpc3BsYXlPcmRlcjogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5jc2RBbmRESUNyaXRlcmlhRGlzcGxheU9yZGVyLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLmRlbGV0ZVRhbGtQYWdlT25EZWxldGUgKGJvb2xlYW4pXG5cdFx0XHRcdC8vIElmIHRhbGsgcGFnZSBpZiBleGlzdHMgc2hvdWxkIGFsc28gYmUgZGVsZXRlZCAoQ1NEIEc4KSB3aGVuIHNwZWR5aW5nIGEgcGFnZSAoYWRtaW4gb25seSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdkZWxldGVUYWxrUGFnZU9uRGVsZXRlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqTli77pgInigJzliKDpmaTorqjorrrpobXigJ0nLCAn6aCQ6Kit5Yu+6YG444CM5Yiq6Zmk6KiO6KuW6aCB44CNJyksXG5cdFx0XHRcdFx0YWRtaW5Pbmx5OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdkZWxldGVSZWRpcmVjdHNPbkRlbGV0ZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5Yu+6YCJ4oCc5Yig6Zmk6YeN5a6a5ZCR4oCdJywgJ+mgkOioreWLvumBuOOAjOWIqumZpOmHjeaWsOWwjuWQkeOAjScpLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuZGVsZXRlU3lzb3BEZWZhdWx0VG9EZWxldGUgKGJvb2xlYW4pXG5cdFx0XHRcdC8vIE1ha2UgdGhlIENTRCBzY3JlZW4gZGVmYXVsdCB0byBcImRlbGV0ZVwiIGluc3RlYWQgb2YgXCJ0YWdcIiAoYWRtaW4gb25seSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdkZWxldGVTeXNvcERlZmF1bHRUb0RlbGV0ZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5Li655u05o6l5Yig6Zmk6ICM5LiN5piv5qCH6K6wJywgJ+mgkOioreeCuuebtOaOpeWIqumZpOiAjOS4jeaYr+aomeiomCcpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfoi6Xlt7LmlL7nva7lv6vpgJ/liKDpmaTmoIforrDvvIzliJnmsLjov5zpu5jorqTkuLrliKDpmaTmqKHlvI/jgIInLFxuXHRcdFx0XHRcdFx0J+iLpeW3suaUvue9ruW/q+mAn+WIqumZpOaomeiomO+8jOWJh+awuOmBoOmgkOioreeCuuWIqumZpOaooeW8j+OAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuc3BlZWR5V2luZG93V2lkdGggKGludGVnZXIpXG5cdFx0XHRcdC8vIERlZmluZXMgdGhlIHdpZHRoIG9mIHRoZSBUd2lua2xlIFNEIHdpbmRvdyBpbiBwaXhlbHNcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdzcGVlZHlXaW5kb3dXaWR0aCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5b+r6YCf5Yig6Zmk5a+56K+d5qGG5a695bqm77yI5YOP57Sg77yJJywgJ+W/q+mAn+WIqumZpOWwjeipseaWueWhiuWvrOW6pu+8iOWDj+e0oO+8iScpLFxuXHRcdFx0XHRcdHR5cGU6ICdpbnRlZ2VyJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5zcGVlZHlXaW5kb3dXaWR0aCAoaW50ZWdlcilcblx0XHRcdFx0Ly8gRGVmaW5lcyB0aGUgd2lkdGggb2YgdGhlIFR3aW5rbGUgU0Qgd2luZG93IGluIHBpeGVsc1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3NwZWVkeVdpbmRvd0hlaWdodCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5b+r6YCf5Yig6Zmk5a+56K+d5qGG6auY5bqm77yI5YOP57Sg77yJJywgJ+W/q+mAn+WIqumZpOWwjeipseaWueWhiumrmOW6pu+8iOWDj+e0oO+8iScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfoi6XmgqjmnInkuIDlj7DlvojlpKfnmoTmmL7npLrlmajvvIzmgqjlj6/ku6XlsIbmraTosIPpq5jjgIInLFxuXHRcdFx0XHRcdFx0J+iLpeaCqOacieS4gOWPsOW+iOWkp+eahOmhr+ekuuWZqO+8jOaCqOWPr+S7peWwh+atpOiqv+mrmOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdpbnRlZ2VyJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdsb2dTcGVlZHlOb21pbmF0aW9ucycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo55So5oi356m66Ze05Lit6K6w5b2V5omA5pyJ5b+r6YCf5Yig6Zmk5o+Q5ZCNJywgJ+WcqOS9v+eUqOiAheepuumWk+S4reiomOmMhOaJgOacieW/q+mAn+WIqumZpOaPkOWQjScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfpnZ7nrqHnkIblkZjml6Dms5Xorr/pl67liLDlt7LliKDpmaTnmoTotKHnjK7vvIznlKjmiLfnqbrpl7Tml6Xlv5fmj5DkvpvkuobkuIDkuKrlvojlpb3nmoTmlrnms5XmnaXorrDlvZXov5nkupvljoblj7LjgIInLFxuXHRcdFx0XHRcdFx0J+mdnueuoeeQhuWToeeEoeazleWtmOWPluWIsOW3suWIqumZpOeahOiyoueNu++8jOS9v+eUqOiAheepuumWk+aXpeiqjOaPkOS+m+S6huS4gOWAi+W+iOWlveeahOaWueazleS+huiomOmMhOmAmeS6m+att+WPsuOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdzcGVlZHlMb2dQYWdlTmFtZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5q2k6aG15L+d55WZ5pel5b+XJywgJ+WcqOatpOmggeS/neeVmeaXpeiqjCcpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflnKjmraTmoYbkuK3ovpPlhaXlrZDpobXpnaLlkI3np7DvvIzmgqjlsIblnKhVc2VyOjxpPueUqOaIt+WQjTwvaT4vPGk+5a2Q6aG16Z2iPC9pPuaJvuWIsENTROaXpeW/l+OAguS7heWcqOWQr+eUqOaXpeW/l+aXtuW3peS9nOOAgicsXG5cdFx0XHRcdFx0XHQn5Zyo5q2k5qGG5Lit6Ly45YWl5a2Q6aCB6Z2i5ZCN56ix77yM5oKo5bCH5ZyoVXNlcjo8aT7kvb/nlKjogIXlkI3nqLE8L2k+LzxpPuWtkOmggemdojwvaT7mib7liLBDU0Tml6XoqozjgILlg4XlnKjllZ/nlKjml6XoqozmmYLlt6XkvZzjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdub0xvZ09uU3BlZWR5Tm9taW5hdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5L2/55So5Lul5LiL55CG55Sx5pe25LiN5YGa6K6w5b2VJywgJ+WcqOS9v+eUqOS7peS4i+eQhueUseaZguS4jeWBmuiomOmMhCcpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5jc2RBbmRESUNyaXRlcmlhLFxuXHRcdFx0XHRcdHNldERpc3BsYXlPcmRlcjogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5jc2RBbmRESUNyaXRlcmlhRGlzcGxheU9yZGVyLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2VubGFyZ2VHN0lucHV0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmianlpKdDU0QgRzfnmoTmjInpkq4nLCAn5pO05aSnQ1NEIEc355qE5oyJ6YiVJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKCfmiankuLrpu5jorqTnmoTkuKTlgI3lpKfjgIInLCAn5pO054K66aCQ6Kit55qE5YWp5YCN5aSn44CCJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+agh+iusCcsICfmqJnoqJgnKSxcblx0XHRcdG1vZHVsZTogJ3RhZycsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoVGFnZ2VkUGFnZXMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOaXtuWKoOWFpeWIsOebkeinhuWIl+ihqCcsICfmqJnoqJjmmYLliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnd2F0Y2hNZXJnZURpc2N1c3Npb25zJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliqDlhaXlkIjlubborqjorrrml7bnm5Hop4borqjorrrpobUnLCAn5Yqg5YWl5ZCI5L216KiO6KuW5pmC55uj6KaW6KiO6KuW6aCBJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtUYWdnZWRQYWdlc0FzTWlub3InLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+Wwhuagh+iusOagh+iusOS4uuWwj+S/ruaUuScsICflsIfmqJnoqJjmqJnoqJjngrrlsI/kv67mlLknKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbWFya1RhZ2dlZFBhZ2VzQXNQYXRyb2xsZWQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+m7mOiupOWLvumAieKAnOagh+iusOmhtemdouS4uuW3suW3oeafpeKAneahhicsICfpoJDoqK3li77pgbjjgIzmqJnoqJjpoIHpnaLngrrlt7Llt6Hmn6XjgI3moYYnKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnZ3JvdXBCeURlZmF1bHQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6buY6K6k5Yu+6YCJ4oCc5ZCI5bm25Yiwe3ttdWx0aXBsZSBpc3N1ZXN9feKAneWkjemAieahhicsXG5cdFx0XHRcdFx0XHQn6aCQ6Kit5Yu+6YG444CM5ZCI5L215Yiwe3ttdWx0aXBsZSBpc3N1ZXN9feOAjeaguOWPluaWueWhiidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd0YWdBcnRpY2xlU29ydE9yZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmnaHnm67moIforrDnmoTpu5jorqTmn6XnnIvmlrnlvI8nLCAn5qKd55uu5qiZ6KiY55qE6aCQ6Kit5qqi6KaW5pa55byPJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IHtcblx0XHRcdFx0XHRcdGNhdDogd2luZG93LndnVUxTKCfmjInnsbvlnosnLCAn5oyJ6aGe5YilJyksXG5cdFx0XHRcdFx0XHRhbHBoYTogJ+aMieWtl+avjScsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjdXN0b21UYWdMaXN0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnmnaHnm67nu7TmiqTmoIforrAnLCAn6Ieq6KiC5qKd55uu57at6K235qiZ6KiYJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKCfov5nkupvkvJrlh7rnjrDlnKjliJfooajnmoTmnKvlsL7jgIInLCAn6YCZ5Lqb5pyD5Ye654++5Zyo5YiX6KGo55qE5pyr5bC+44CCJyksXG5cdFx0XHRcdFx0dHlwZTogJ2N1c3RvbUxpc3QnLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RWYWx1ZVRpdGxlOiB3aW5kb3cud2dVTFMoJ+aooeadv+WQje+8iOS4jeWQq+Wkp+aLrOWPt++8iScsICfmqKHmnb/lkI3vvIjkuI3lkKvlpKfmi6zomZ/vvIknKSxcblx0XHRcdFx0XHRjdXN0b21MaXN0TGFiZWxUaXRsZTogd2luZG93LndnVUxTKCfmmL7npLrnmoTmloflrZcnLCAn6aGv56S655qE5paH5a2XJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY3VzdG9tRmlsZVRhZ0xpc3QnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieaWh+S7tue7tOaKpOagh+iusCcsICfoh6roqILmqpTmoYjntq3orbfmqJnoqJgnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoJ+i/meS6m+S8muWHuueOsOWcqOWIl+ihqOeahOacq+WwvuOAgicsICfpgJnkupvmnIPlh7rnj77lnKjliJfooajnmoTmnKvlsL7jgIInKSxcblx0XHRcdFx0XHR0eXBlOiAnY3VzdG9tTGlzdCcsXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdFZhbHVlVGl0bGU6IHdpbmRvdy53Z1VMUygn5qih5p2/5ZCN77yI5LiN5ZCr5aSn5ous5Y+377yJJywgJ+aooeadv+WQje+8iOS4jeWQq+Wkp+aLrOiZn++8iScpLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RMYWJlbFRpdGxlOiB3aW5kb3cud2dVTFMoJ+aYvuekuueahOaWh+WtlycsICfpoa/npLrnmoTmloflrZcnKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjdXN0b21SZWRpcmVjdFRhZ0xpc3QnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+iHquWumuS5iemHjeWumuWQkee7tOaKpOagh+iusCcsICfoh6roqILph43mlrDlsI7lkJHntq3orbfmqJnoqJgnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoJ+i/meS6m+S8muWHuueOsOWcqOWIl+ihqOeahOacq+WwvuOAgicsICfpgJnkupvmnIPlh7rnj77lnKjliJfooajnmoTmnKvlsL7jgIInKSxcblx0XHRcdFx0XHR0eXBlOiAnY3VzdG9tTGlzdCcsXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdFZhbHVlVGl0bGU6IHdpbmRvdy53Z1VMUygn5qih5p2/5ZCN77yI5LiN5ZCr5aSn5ous5Y+377yJJywgJ+aooeadv+WQje+8iOS4jeWQq+Wkp+aLrOiZn++8iScpLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RMYWJlbFRpdGxlOiB3aW5kb3cud2dVTFMoJ+aYvuekuueahOaWh+WtlycsICfpoa/npLrnmoTmloflrZcnKSxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogJ+Wwj+S9nOWTgScsXG5cdFx0XHRtb2R1bGU6ICdzdHViJyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnd2F0Y2hTdHViYmVkUGFnZXMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+agh+iusOaXtuWKoOWFpeWIsOebkeinhuWIl+ihqCcsICfmqJnoqJjmmYLliqDlhaXliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbWFya1N0dWJiZWRQYWdlc0FzTWlub3InLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwhuWwj+S9nOWTgeagh+iusOS4uuWwj+S/ruaUuScsICflsIflsI/kvZzlk4HmqJnoqJjngrrlsI/kv67mlLknKSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbWFya1N0dWJiZWRQYWdlc0FzUGF0cm9sbGVkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqTli77pgInigJzmoIforrDpobXpnaLkuLrlt7Llt6Hmn6XigJ3moYYnLCAn6aCQ6Kit5Yu+6YG444CM5qiZ6KiY6aCB6Z2i54K65bey5beh5p+l44CN5qGGJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3N0dWJBcnRpY2xlU29ydE9yZGVyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmnaHnm67lsI/kvZzlk4HnmoTpu5jorqTmn6XnnIvmlrnlvI8nLCAn5qKd55uu5bCP5L2c5ZOB55qE6aCQ6Kit5qqi6KaW5pa55byPJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IHtcblx0XHRcdFx0XHRcdGNhdDogd2luZG93LndnVUxTKCfmjInnsbvlnosnLCAn5oyJ6aGe5YilJyksXG5cdFx0XHRcdFx0XHRhbHBoYTogJ+aMieWtl+avjScsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjdXN0b21TdHViTGlzdCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6Ieq5a6a5LmJ5p2h55uu5bCP5L2c5ZOB5qCH6K6wJywgJ+iHquioguaineebruWwj+S9nOWTgeaomeiomCcpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn6L+Z5Lqb5Lya5Ye6546w5Zyo5YiX6KGo55qE5pyr5bC+44CCJywgJ+mAmeS6m+acg+WHuuePvuWcqOWIl+ihqOeahOacq+WwvuOAgicpLFxuXHRcdFx0XHRcdHR5cGU6ICdjdXN0b21MaXN0Jyxcblx0XHRcdFx0XHRjdXN0b21MaXN0VmFsdWVUaXRsZTogd2luZG93LndnVUxTKCfmqKHmnb/lkI3vvIjkuI3lkKvlpKfmi6zlj7fvvIknLCAn5qih5p2/5ZCN77yI5LiN5ZCr5aSn5ous6Jmf77yJJyksXG5cdFx0XHRcdFx0Y3VzdG9tTGlzdExhYmVsVGl0bGU6IHdpbmRvdy53Z1VMUygn5pi+56S655qE5paH5a2XJywgJ+mhr+ekuueahOaWh+WtlycpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiAn6YCa5ZGKJyxcblx0XHRcdG1vZHVsZTogJ3RhbGtiYWNrJyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbWFya1RhbGtiYWNrQXNNaW5vcicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5bCG6YCa5ZGK5qCH6K6w5Li65bCP5L+u5pS5JywgJ+Wwh+mAmuWRiuaomeiomOeCuuWwj+S/ruaUuScpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdpbnNlcnRUYWxrYmFja1NpZ25hdHVyZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6YCa5ZGK5pe25Yqg5YWl562+5ZCNJywgJ+mAmuWRiuaZguWKoOWFpeewveWQjScpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd0YWxrYmFja0hlYWRpbmcnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+mAmuWRiuaJgOeUqOeahOWwj+iKguagh+mimCcsICfpgJrlkYrmiYDnlKjnmoTlsI/nr4DmqJnpoYwnKSxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdtYWlsSGVhZGluZycsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn4oCc5pyJ5paw6YKu5Lu24oCd5omA55So55qE5bCP6IqC5qCH6aKYJywgJ+OAjOacieaWsOmDteS7tuOAjeaJgOeUqOeahOWwj+evgOaomemhjCcpLFxuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+WPlua2iOmTvuWFpScsICflj5bmtojpgKPlhaUnKSxcblx0XHRcdG1vZHVsZTogJ3VubGluaycsXG5cdFx0XHRwcmVmZXJlbmNlczogW1xuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLnVubGlua05hbWVzcGFjZXMgKGFycmF5KVxuXHRcdFx0XHQvLyBJbiB3aGF0IG5hbWVzcGFjZXMgdW5saW5rIHNob3VsZCBoYXBwZW4sIGRlZmF1bHQgaW4gMCAoYXJ0aWNsZSkgYW5kIDEwMCAocG9ydGFsKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3VubGlua05hbWVzcGFjZXMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WPlua2iOS7peS4i+WRveWQjeepuumXtOS4reeahOWPjeWQkemTvuaOpScsICflj5bmtojku6XkuIvlkb3lkI3nqbrplpPkuK3nmoTlj43lkJHpgKPntZAnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6K+36YG/5YWN6YCJ5oup6K6o6K666aG177yM5Zug6L+Z5qC35Lya5a+86Ie0VHdpbmtsZeivleWbvuS/ruaUueiuqOiuuuWtmOaho+OAgicsXG5cdFx0XHRcdFx0XHQn6KuL6YG/5YWN6YG45pOH6KiO6KuW6aCB77yM5Zug6YCZ5qij5pyD5bCO6Ie0VHdpbmtsZeippuWcluS/ruaUueiojuirluWtmOaqlOOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy5uYW1lc3BhY2VzTm9TcGVjaWFsLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+itpuWRiueUqOaItycsICforablkYrkvb/nlKjogIUnKSxcblx0XHRcdG1vZHVsZTogJ3dhcm4nLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5kZWZhdWx0V2FybmluZ0dyb3VwIChpbnQpXG5cdFx0XHRcdC8vIGlmIHRydWUsIHdhdGNoIHRoZSBwYWdlIHdoaWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQgYW4gd2FybmluZyBvciBub3RpY2UsIGlmIGZhbHNlLCBkZWZhdWx0IGFwcGxpZXNcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdkZWZhdWx0V2FybmluZ0dyb3VwJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqTorablkYrnuqfliKsnLCAn6aCQ6Kit6K2m5ZGK57Sa5YilJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IHtcblx0XHRcdFx0XHRcdDE6ICcx77ya5rOo5oSPJyxcblx0XHRcdFx0XHRcdDI6ICcy77ya6K2m5ZGKJyxcblx0XHRcdFx0XHRcdDM6IHdpbmRvdy53Z1VMUygn5Y2V5bGC57qn5o+Q6YaSJywgJ+WWruWxpOe0muaPkOmGkicpLFxuXHRcdFx0XHRcdFx0NDogd2luZG93LndnVUxTKCfljZXlsYLnuqforablkYonLCAn5Zau5bGk57Sa6K2m5ZGKJyksXG5cdFx0XHRcdFx0XHQ1OiB3aW5kb3cud2dVTFMoJ+iHquWumuS5ieaPkOmGkuaIluitpuWRiicsICfoh6roqILmj5DphpLmiJborablkYonKSxcblx0XHRcdFx0XHRcdDY6ICfmiYDmnInorablkYrmqKHmnb8nLFxuXHRcdFx0XHRcdFx0Nzogd2luZG93LndnVUxTKCfoh6rliqjpgInmi6nlsYLnuqcnLCAn6Ieq5YuV6YG45pOH5bGk57SaJyksXG5cdFx0XHRcdFx0XHQvLyA4IHdhcyB1c2VkIGZvciBibG9jayB0ZW1wbGF0ZXMgYmVmb3JlICMyNjBcblx0XHRcdFx0XHRcdC8vIDkgd2FzIGRlcHJlY2F0ZWRcblx0XHRcdFx0XHRcdC8vIDEwIHdhcyBkZXByZWNhdGVkXG5cdFx0XHRcdFx0XHQvLyAxMSB3YXMgZGVwcmVjYXRlZFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcuY29tYmluZWRTaW5nbGV0TWVudXMgKGJvb2xlYW4pXG5cdFx0XHRcdC8vIGlmIHRydWUsIHNob3cgb25lIG1lbnUgd2l0aCBib3RoIHNpbmdsZS1pc3N1ZSBub3RpY2VzIGFuZCB3YXJuaW5ncyBpbnN0ZWFkIG9mIHR3byBzZXBhcmF0ZWx5XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnY29tYmluZWRTaW5nbGV0TWVudXMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WwhuS4pOS4quWNleWxgue6p+iPnOWNleWQiOW5tuaIkOS4gOS4qicsICflsIflhanlgIvllq7lsaTntJrpgbjllq7lkIjkvbXmiJDkuIDlgIsnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5b2T5ZCv55So5q2k6YCJ6aG55pe277yM5peg6K666buY6K6k6K2m5ZGK57qn5Yir6YCJ5oup5Y2V5bGC57qn6YCa55+l5oiW5Y2V5bGC57qn6K2m5ZGK55qG5bGe5LqO5q2k6aG544CCJyxcblx0XHRcdFx0XHRcdCfnlbbllZ/nlKjmraTpgbjpoIXmmYLvvIznhKHoq5bpoJDoqK3orablkYrntJrliKXpgbjmk4fllq7lsaTntJrpgJrnn6XmiJbllq7lsaTntJrorablkYrnmoblsazmlrzmraTpoIXjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcud2F0Y2hXYXJuaW5ncyAoc3RyaW5nKVxuXHRcdFx0XHQvLyBXYXRjaGxpc3Qgc2V0dGluZyBmb3IgdGhlIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gZGlzcGF0Y2hlZCBhbiB3YXJuaW5nIG9yIG5vdGljZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3dhdGNoV2FybmluZ3MnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+itpuWRiuaXtuWKoOWFpeeUqOaIt+iuqOiuuumhteWIsOebkeinhuWIl+ihqCcsICforablkYrmmYLliqDlhaXkvb/nlKjogIXoqI7oq5bpoIHliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcub2xkU2VsZWN0IChib29sZWFuKVxuXHRcdFx0XHQvLyBpZiB0cnVlLCB1c2UgdGhlIG5hdGl2ZSBzZWxlY3QgbWVudSByYXRoZXIgdGhlIGpxdWVyeSBjaG9zZW4tYmFzZWQgb25lXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnb2xkU2VsZWN0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfkvb/nlKjkuI3lj6/mkJzntKLnmoTnu4/lhbjoj5zljZUnLCAn5L2/55So5LiN5Y+v5pCc5bCL55qE57aT5YW46YG45ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2N1c3RvbVdhcm5pbmdMaXN0Jyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfoh6rlrprkuYnorablkYrmqKHmnb8nLCAn6Ieq6KiC6K2m5ZGK5qih5p2/JyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+aCqOWPr+S7peWKoOWFpeaooeadv+aIlueUqOaIt+WtkOmhtemdouOAguiHquWumuS5ieitpuWRiuS8muWHuueOsOWcqOitpuWRiuWvueivneahhuS4reKAnOiHquWumuS5ieitpuWRiuKAneS4gOiKguOAgicsXG5cdFx0XHRcdFx0XHQn5oKo5Y+v5Lul5Yqg5YWl5qih5p2/5oiW5L2/55So6ICF5a2Q6aCB6Z2i44CC6Ieq6KiC6K2m5ZGK5pyD5Ye654++5Zyo6K2m5ZGK5bCN6Kmx5pa55aGK5Lit44CM6Ieq6KiC6K2m5ZGK44CN5LiA56+A44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2N1c3RvbUxpc3QnLFxuXHRcdFx0XHRcdGN1c3RvbUxpc3RWYWx1ZVRpdGxlOiB3aW5kb3cud2dVTFMoJ+aooeadv+WQje+8iOS4jeWQq+Wkp+aLrOWPt++8iScsICfmqKHmnb/lkI3vvIjkuI3lkKvlpKfmi6zomZ/vvIknKSxcblx0XHRcdFx0XHRjdXN0b21MaXN0TGFiZWxUaXRsZTogd2luZG93LndnVUxTKCfmmL7npLrnmoTmloflrZfvvIjlkoznvJbovpHmkZjopoHvvIknLCAn6aGv56S655qE5paH5a2X77yI5ZKM57eo6Lyv5pGY6KaB77yJJyksXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5a2Y5bqf6K6o6K66JywgJ+WtmOW7ouiojuirlicpLFxuXHRcdFx0bW9kdWxlOiAneGZkJyxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnbG9nWGZkTm9taW5hdGlvbnMnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WcqOeUqOaIt+epuumXtOS4reiusOW9leaJgOacieWtmOW6n+iuqOiuuuaPkOWQjScsICflnKjkvb/nlKjogIXnqbrplpPkuK3oqJjpjITmiYDmnInlrZjlu6LoqI7oq5bmj5DlkI0nKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6K+l5pel5b+X5L6b5oKo6L+96Liq5omA5pyJ6YCa6L+HVHdpbmtsZeaPkOS6pOeahOWtmOW6n+iuqOiuuicsXG5cdFx0XHRcdFx0XHQn6Kmy5pel6KqM5L6b5oKo6L+96Lmk5omA5pyJ6YCP6YGOVHdpbmtsZeaPkOS6pOeahOWtmOW7ouiojuirlidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdib29sZWFuJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd4ZmRMb2dQYWdlTmFtZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5q2k6aG15L+d55WZ5pel5b+XJywgJ+WcqOatpOmggeS/neeVmeaXpeiqjCcpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCflnKjmraTmoYbkuK3ovpPlhaXlrZDpobXpnaLlkI3np7DvvIzmgqjlsIblnKhVc2VyOjxpPueUqOaIt+WQjTwvaT4vPGk+5a2Q6aG16Z2iPC9pPuaJvuWIsFhGROaXpeW/l+OAguS7heWcqOWQr+eUqOaXpeW/l+aXtuW3peS9nOOAgicsXG5cdFx0XHRcdFx0XHQn5Zyo5q2k5qGG5Lit6Ly45YWl5a2Q6aCB6Z2i5ZCN56ix77yM5oKo5bCH5ZyoVXNlcjo8aT7kvb/nlKjogIXlkI3nqLE8L2k+LzxpPuWtkOmggemdojwvaT7mib7liLBYRkTml6XoqozjgILlg4XlnKjllZ/nlKjml6XoqozmmYLlt6XkvZzjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdub0xvZ09uWGZkTm9taW5hdGlvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5L2/55So5Lul5LiL55CG55Sx5pe25LiN5YGa6K6w5b2VJywgJ+WcqOS9v+eUqOS7peS4i+eQhueUseaZguS4jeWBmuiomOmMhCcpLFxuXHRcdFx0XHRcdHR5cGU6ICdzZXQnLFxuXHRcdFx0XHRcdHNldFZhbHVlczogVHdpbmtsZS5jb25maWcuY29tbW9uU2V0cy54ZmRDcml0ZXJpYSxcblx0XHRcdFx0XHRzZXREaXNwbGF5T3JkZXI6IFR3aW5rbGUuY29uZmlnLmNvbW1vblNldHMueGZkQ3JpdGVyaWFEaXNwbGF5T3JkZXIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcueGZkV2F0Y2hQYWdlIChzdHJpbmcpXG5cdFx0XHRcdC8vIFRoZSB3YXRjaGxpc3Qgc2V0dGluZyBvZiB0aGUgcGFnZSBiZWluZyBub21pbmF0ZWQgZm9yIFhmRC5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICd4ZmRXYXRjaFBhZ2UnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+WKoOWFpeaPkOWQjeeahOmhtemdouWIsOebkeinhuWIl+ihqCcsICfliqDlhaXmj5DlkI3nmoTpoIHpnaLliLDnm6PoppbmuIXllq4nKSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcueGZkV2F0Y2hEaXNjdXNzaW9uIChzdHJpbmcpXG5cdFx0XHRcdC8vIFRoZSB3YXRjaGxpc3Qgc2V0dGluZyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBYZkQgcGFnZSAoZm9yIHRob3NlIHByb2Nlc3NlcyB0aGF0IGNyZWF0ZSBkaXNjdXNzaW9uIHBhZ2VzIGZvciBlYWNoIG5vbWluYXRpb24pLFxuXHRcdFx0XHQvLyBvciB0aGUgbGlzdCBwYWdlIGZvciB0aGUgb3RoZXIgcHJvY2Vzc2VzLlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3hmZFdhdGNoRGlzY3Vzc2lvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Yqg5YWl5a2Y5bqf6K6o6K666aG15Yiw55uR6KeG5YiX6KGoJywgJ+WKoOWFpeWtmOW7ouiojuirlumggeWIsOebo+imlua4heWWricpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn5b2T5pel55qE6aG16Z2i44CCJywgJ+eVtuaXpeeahOmggemdouOAgicpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiBUd2lua2xlLmNvbmZpZy53YXRjaGxpc3RFbnVtcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy54ZmRXYXRjaFVzZXIgKHN0cmluZylcblx0XHRcdFx0Ly8gVGhlIHdhdGNobGlzdCBzZXR0aW5nIG9mIHRoZSB1c2VyIHRhbGsgcGFnZSBpZiB0aGV5IHJlY2VpdmUgYSBub3RpZmljYXRpb24uXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAneGZkV2F0Y2hVc2VyJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WKoOWFpeWIm+W7uuiAheiuqOiuuumhteWIsOebkeinhuWIl+ihqO+8iOWcqOmAmuefpeaXtu+8iScsXG5cdFx0XHRcdFx0XHQn5Yqg5YWl5bu656uL6ICF6KiO6KuW6aCB5Yiw55uj6KaW5riF5Zau77yI5Zyo6YCa55+l5pmC77yJJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtYZmRQYWdlc0FzUGF0cm9sbGVkJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfmoIforrDml7bmoIforrDpobXpnaLkuLrlt7Llt6Hmn6XvvIjlpoLlj6/og73vvIknLCAn5qiZ6KiY5pmC5qiZ6KiY6aCB6Z2i54K65bey5beh5p+l77yI5aaC5Y+v6IO977yJJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0J+WfuuS6juaKgOacr+WOn+WboO+8jOmhtemdouS7heS8muWcqOeUsVNwZWNpYWw6TmV3UGFnZXPliLDovr7ml7booqvmoIforrDkuLrlt7Llt6Hmn6XjgIInLFxuXHRcdFx0XHRcdFx0J+WfuuaWvOaKgOihk+WOn+WboO+8jOmggemdouWDheacg+WcqOeUsVNwZWNpYWw6TmV3UGFnZXPliLDpgZTmmYLooqvmqJnoqJjngrrlt7Llt6Hmn6XjgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnYm9vbGVhbicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnRndkQ3NkVG9YZmQnLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoJ+aPkOWIoOexu+Wei+WinuWKoOi9rOS6pOiHquW/q+mAn+WIoOmZpOWAmemAiScsICfmj5DliKrpoZ7liKXlop7liqDovYnkuqToh6rlv6vpgJ/liKrpmaTlgJnpgbgnKSxcblx0XHRcdFx0XHRoZWxwdGlwOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn6K+356Gu5L+d5oKo5YWF5YiG5LqG6KejW1tMSUI65b+r6YCf5Yig6Zmk5p2h5L6LXV3miY3lvIDlkK/mraTlip/og73jgIInLFxuXHRcdFx0XHRcdFx0J+iri+eiuuS/neaCqOWFheWIhuS6huino1tbTElCOuW/q+mAn+WIqumZpOaineS+i11d5omN6ZaL5ZWf5q2k5Yqf6IO944CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2FmZERlZmF1bHRDYXRlZ29yeScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5o+Q5Yig57G75Z6LJywgJ+mgkOioreaPkOWIqumhnuWIpScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfoi6XpgInmi6nigJznm7jlkIzkuo7kuIrmrKHpgInmi6nigJ3lsIbkvb/nlKhsb2NhbFN0b3JhZ2XmnaXorrDlv4bjgIInLFxuXHRcdFx0XHRcdFx0J+iLpemBuOaTh+OAjOebuOWQjOaWvOS4iuasoemBuOaTh+OAjeWwh+S9v+eUqGxvY2FsU3RvcmFnZeS+huiomOaGtuOAgidcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHR5cGU6ICdlbnVtJyxcblx0XHRcdFx0XHRlbnVtVmFsdWVzOiB7XG5cdFx0XHRcdFx0XHRkZWxldGU6IHdpbmRvdy53Z1VMUygn5Yig6ZmkJywgJ+WIqumZpCcpLFxuXHRcdFx0XHRcdFx0c2FtZTogd2luZG93LndnVUxTKCfnm7jlkIzkuo7kuIrmrKHpgInmi6knLCAn55u45ZCM5pa85LiK5qyh6YG45pOHJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdhZmRGYW1lRGVmYXVsdFJlYXNvbicsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn6buY6K6k5YWz5rOo5bqm5o+Q5Yig55CG55SxJywgJ+mgkOioremXnOazqOW6puaPkOWIqueQhueUsScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUygn55So5LqO5om56YeP5o+Q5Yig44CCJywgJ+eUqOaWvOaJueasoeaPkOWIquOAgicpLFxuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2FmZFN1YnN0dWJEZWZhdWx0UmVhc29uJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfpu5jorqTlsI/lsI/kvZzlk4Hmj5DliKDnkIbnlLEnLCAn6aCQ6Kit5bCP5bCP5L2c5ZOB5o+Q5Yiq55CG55SxJyksXG5cdFx0XHRcdFx0aGVscHRpcDogd2luZG93LndnVUxTKCfnlKjkuo7mibnph4/mj5DliKDjgIInLCAn55So5pa85om55qyh5o+Q5Yiq44CCJyksXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dGl0bGU6IHdpbmRvdy53Z1VMUygn5YWz6Zet5a2Y5bqf6K6o6K66JywgJ+mXnOmWieWtmOW7ouiojuirlicpLFxuXHRcdFx0bW9kdWxlOiAnY2xvc2UnLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdYZmRDbG9zZScsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5Zyo5a2Y5bqf6K6o6K665pi+56S65YWz6Zet6K6o6K665oyJ6ZKuJywgJ+WcqOWtmOW7ouiojuirlumhr+ekuumXnOmWieiojuirluaMiemIlScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfor7fnoa7kv53mgqjlhYXliIbkuobop6NbW0xJQjrliKDpmaTmnaHkvotdXeaJjeW8gOWQr+atpOWKn+iDveOAgicsXG5cdFx0XHRcdFx0XHQn6KuL56K65L+d5oKo5YWF5YiG5LqG6KejW1tMSUI65Yiq6Zmk5qKd5L6LXV3miY3plovllZ/mraTlip/og73jgIInXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczoge1xuXHRcdFx0XHRcdFx0aGlkZTogd2luZG93LndnVUxTKCfkuI3mmL7npLonLCAn5LiN6aGv56S6JyksXG5cdFx0XHRcdFx0XHRub25hZG1pbm9ubHk6IHdpbmRvdy53Z1VMUygn5Y+q5YyF5ZCr6Z2e566h55CG5ZGY5Y+v5L2/55So6YCJ6aG5JywgJ+WPquWMheWQq+mdnueuoeeQhuWToeWPr+S9v+eUqOmBuOmghScpLFxuXHRcdFx0XHRcdFx0YWxsOiB3aW5kb3cud2dVTFMoJ+aYvuekuuaJgOaciemAiemhuScsICfpoa/npLrmiYDmnInpgbjpoIUnKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+S+teeKr+iRl+S9nOadgycsICfkvrXniq/okZfkvZzmrIonKSxcblx0XHRcdG1vZHVsZTogJ2NvcHl2aW8nLFxuXHRcdFx0cHJlZmVyZW5jZXM6IFtcblx0XHRcdFx0Ly8gVHdpbmtsZUNvbmZpZy5jb3B5dmlvV2F0Y2hQYWdlIChzdHJpbmcpXG5cdFx0XHRcdC8vIFRoZSB3YXRjaGxpc3Qgc2V0dGluZyBvZiB0aGUgcGFnZSBiZWluZyBub21pbmF0ZWQgZm9yIFhmRC5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdjb3B5dmlvV2F0Y2hQYWdlJyxcblx0XHRcdFx0XHRsYWJlbDogd2luZG93LndnVUxTKCfliqDlhaXmj5DmiqXnmoTpobXpnaLliLDnm5Hop4bliJfooagnLCAn5Yqg5YWl5o+Q5aCx55qE6aCB6Z2i5Yiw55uj6KaW5riF5ZauJyksXG5cdFx0XHRcdFx0dHlwZTogJ2VudW0nLFxuXHRcdFx0XHRcdGVudW1WYWx1ZXM6IFR3aW5rbGUuY29uZmlnLndhdGNobGlzdEVudW1zLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBUd2lua2xlQ29uZmlnLmNvcHl2aW9XYXRjaFVzZXIgKHN0cmluZylcblx0XHRcdFx0Ly8gVGhlIHdhdGNobGlzdCBzZXR0aW5nIG9mIHRoZSB1c2VyIGlmIGhlIHJlY2VpdmVzIGEgbm90aWZpY2F0aW9uLlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ2NvcHl2aW9XYXRjaFVzZXInLFxuXHRcdFx0XHRcdGxhYmVsOiB3aW5kb3cud2dVTFMoXG5cdFx0XHRcdFx0XHQn5Yqg5YWl5Yib5bu66ICF6K6o6K666aG15Yiw55uR6KeG5YiX6KGo77yI5Zyo6YCa55+l5pe277yJJyxcblx0XHRcdFx0XHRcdCfliqDlhaXlu7rnq4vogIXoqI7oq5bpoIHliLDnm6PoppbmuIXllq7vvIjlnKjpgJrnn6XmmYLvvIknXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR0eXBlOiAnZW51bScsXG5cdFx0XHRcdFx0ZW51bVZhbHVlczogVHdpbmtsZS5jb25maWcud2F0Y2hsaXN0RW51bXMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFR3aW5rbGVDb25maWcubWFya0NvcHl2aW9QYWdlc0FzUGF0cm9sbGVkIChib29sZWFuKVxuXHRcdFx0XHQvLyBJZiwgd2hlbiBhcHBseWluZyBjb3B5dmlvIHRlbXBsYXRlIHRvIHBhZ2UsIHRvIG1hcmsgdGhlIHBhZ2UgYXMgcGF0cm9sbGVkIChpZiB0aGUgcGFnZSB3YXMgcmVhY2hlZCBmcm9tIE5ld1BhZ2VzKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ21hcmtDb3B5dmlvUGFnZXNBc1BhdHJvbGxlZCcsXG5cdFx0XHRcdFx0bGFiZWw6IHdpbmRvdy53Z1VMUygn5qCH6K6w5pe25qCH6K6w6aG16Z2i5Li65bey5beh5p+l77yI5aaC5Y+v6IO977yJJywgJ+aomeiomOaZguaomeiomOmggemdoueCuuW3suW3oeafpe+8iOWmguWPr+iDve+8iScpLFxuXHRcdFx0XHRcdGhlbHB0aXA6IHdpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdCfln7rkuo7mioDmnK/ljp/lm6DvvIzpobXpnaLku4XkvJrlnKjnlLFTcGVjaWFsOk5ld1BhZ2Vz5Yiw6L6+5pe26KKr5qCH6K6w5Li65bey5beh5p+l44CCJyxcblx0XHRcdFx0XHRcdCfln7rmlrzmioDooZPljp/lm6DvvIzpoIHpnaLlg4XmnIPlnKjnlLFTcGVjaWFsOk5ld1BhZ2Vz5Yiw6YGU5pmC6KKr5qiZ6KiY54K65bey5beh5p+l44CCJ1xuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0dHlwZTogJ2Jvb2xlYW4nLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiB3aW5kb3cud2dVTFMoJ+makOiXjycsICfpmrHol48nKSxcblx0XHRcdGhpZGRlbjogdHJ1ZSxcblx0XHRcdHByZWZlcmVuY2VzOiBbXG5cdFx0XHRcdC8vIHR3aW5rbGUuanM6IHBvcnRsZXQgc2V0dXBcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdwb3J0bGV0QXJlYScsXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAncG9ydGxldElkJyxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdwb3J0bGV0TmFtZScsXG5cdFx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAncG9ydGxldFR5cGUnLFxuXHRcdFx0XHRcdHR5cGU6ICdzdHJpbmcnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZTogJ3BvcnRsZXROZXh0Jyxcblx0XHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gdHdpbmtsZWZsdWZmLmpzOiBkZWZpbmVzIGhvdyBtYW55IHJldmlzaW9uIHRvIHF1ZXJ5IG1heGltdW0sIG1heGltdW0gcG9zc2libGUgaXMgNTAsIGRlZmF1bHQgaXMgNTBcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdyZXZlcnRNYXhSZXZpc2lvbnMnLFxuXHRcdFx0XHRcdHR5cGU6ICdpbnRlZ2VyJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gdHdpbmtsZWJhdGNoZGVsZXRlLmpzOiBIb3cgbWFueSBwYWdlcyBzaG91bGQgYmUgcHJvY2Vzc2VkIG1heGltdW1cblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWU6ICdiYXRjaE1heCcsXG5cdFx0XHRcdFx0dHlwZTogJ2ludGVnZXInLFxuXHRcdFx0XHRcdGFkbWluT25seTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gSG93IG1hbnkgcGFnZXMgc2hvdWxkIGJlIHByb2Nlc3NlZCBhdCBhIHRpbWUgYnkgZGVwcm9kIGFuZCBiYXRjaGRlbGV0ZS9wcm90ZWN0L3VuZGVsZXRlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lOiAnYmF0Y2hDaHVua3MnLFxuXHRcdFx0XHRcdHR5cGU6ICdpbnRlZ2VyJyxcblx0XHRcdFx0XHRhZG1pbk9ubHk6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0sXG5cdF07IC8vIGVuZCBvZiBUd2lua2xlLmNvbmZpZy5zZWN0aW9uc1xuXHRUd2lua2xlLmNvbmZpZy5pbml0ID0gKCkgPT4ge1xuXHRcdC8vIGNyZWF0ZSB0aGUgY29uZmlnIHBhZ2UgYXQgVHdpbmtsZS5nZXRQcmVmKCdjb25maWdQYWdlJylcblx0XHRpZiAobXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpID09PSBUd2lua2xlLmdldFByZWYoJ2NvbmZpZ1BhZ2UnKSAmJiBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAndmlldycpIHtcblx0XHRcdGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3R3aW5rbGUtY29uZmlnJykpIHtcblx0XHRcdFx0cmV0dXJuOyAvLyBtYXliZSB0aGUgcGFnZSBpcyBtaXNjb25maWd1cmVkLCBvciBzb21ldGhpbmcgLSBidXQgYW55IGF0dGVtcHQgdG8gbW9kaWZ5IGl0IHdpbGwgYmUgcG9pbnRsZXNzXG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjb250ZW50ZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3R3aW5rbGUtY29uZmlnLWNvbnRlbnQnKTtcblx0XHRcdGNvbnRlbnRkaXYudGV4dENvbnRlbnQgPSAnJzsgLy8gY2xlYXIgY2hpbGRyZW5cblx0XHRcdC8vIHN0YXJ0IGEgdGFibGUgb2YgY29udGVudHNcblx0XHRcdGNvbnN0IHRvY3RhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHR0b2N0YWJsZS5jbGFzc05hbWUgPSAndG9jJztcblx0XHRcdHRvY3RhYmxlLnN0eWxlLm1hcmdpbkxlZnQgPSAnMC40ZW0nO1xuXHRcdFx0Ly8gY3JlYXRlIFRPQyB0aXRsZVxuXHRcdFx0Y29uc3QgdG9jdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdHRvY3RpdGxlLmlkID0gJ3RvY3RpdGxlJztcblx0XHRcdGNvbnN0IHRvY2gyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcblx0XHRcdHRvY2gyLnRleHRDb250ZW50ID0gd2luZG93LndnVUxTKCfnm67lvZUgJywgJ+ebrumMhCAnKTtcblx0XHRcdHRvY3RpdGxlLmFwcGVuZENoaWxkKHRvY2gyKTtcblx0XHRcdC8vIGFkZCBUT0Mgc2hvdy9oaWRlIGxpbmtcblx0XHRcdGNvbnN0IHRvY3RvZ2dsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRcdHRvY3RvZ2dsZS5jbGFzc05hbWUgPSAndG9jdG9nZ2xlJztcblx0XHRcdHRvY3RvZ2dsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnWycpKTtcblx0XHRcdGNvbnN0IHRvY3RvZ2dsZWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cdFx0XHR0b2N0b2dnbGVsaW5rLmNsYXNzTmFtZSA9ICdpbnRlcm5hbCc7XG5cdFx0XHR0b2N0b2dnbGVsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsICcjdHctdG9jc2hvd2hpZGUnKTtcblx0XHRcdHRvY3RvZ2dsZWxpbmsudGV4dENvbnRlbnQgPSB3aW5kb3cud2dVTFMoJ+makOiXjycsICfpmrHol48nKTtcblx0XHRcdHRvY3RvZ2dsZS5hcHBlbmRDaGlsZCh0b2N0b2dnbGVsaW5rKTtcblx0XHRcdHRvY3RvZ2dsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXScpKTtcblx0XHRcdHRvY3RpdGxlLmFwcGVuZENoaWxkKHRvY3RvZ2dsZSk7XG5cdFx0XHR0b2N0YWJsZS5hcHBlbmRDaGlsZCh0b2N0aXRsZSk7XG5cdFx0XHQvLyBjcmVhdGUgaXRlbSBjb250YWluZXI6IHRoaXMgaXMgd2hhdCB3ZSBhZGQgc3R1ZmYgdG9cblx0XHRcdGNvbnN0IHRvY3VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcblx0XHRcdHRvY3RvZ2dsZWxpbmsuYWRkRXZlbnRMaXN0ZW5lcihcblx0XHRcdFx0J2NsaWNrJyxcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0ICR0b2N1bCA9ICQodG9jdWwpO1xuXHRcdFx0XHRcdCR0b2N1bC50b2dnbGUoKTtcblx0XHRcdFx0XHRpZiAoJHRvY3VsLmZpbmQoJzp2aXNpYmxlJykubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0b2N0b2dnbGVsaW5rLnRleHRDb250ZW50ID0gd2luZG93LndnVUxTKCfpmpDol48nLCAn6Zqx6JePJyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRvY3RvZ2dsZWxpbmsudGV4dENvbnRlbnQgPSB3aW5kb3cud2dVTFMoJ+aYvuekuicsICfpoa/npLonKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0dG9jdGFibGUuYXBwZW5kQ2hpbGQodG9jdWwpO1xuXHRcdFx0Y29udGVudGRpdi5hcHBlbmRDaGlsZCh0b2N0YWJsZSk7XG5cdFx0XHRjb25zdCBjb250ZW50Zm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zY3JpcHQtdXJsXG5cdFx0XHRjb250ZW50Zm9ybS5zZXRBdHRyaWJ1dGUoJ2FjdGlvbicsICdqYXZhc2NyaXB0OnZvaWQoMCknKTsgLy8gd2FzICN0dy1zYXZlIC0gY2hhbmdlZCB0byB2b2lkKDApIHRvIHdvcmsgYXJvdW5kIENocm9tZSBpc3N1ZVxuXHRcdFx0Y29udGVudGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgVHdpbmtsZS5jb25maWcuc2F2ZSwgdHJ1ZSk7XG5cdFx0XHRjb250ZW50ZGl2LmFwcGVuZENoaWxkKGNvbnRlbnRmb3JtKTtcblx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XG5cdFx0XHRjb250YWluZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cdFx0XHRjb250ZW50Zm9ybS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXHRcdFx0JChUd2lua2xlLmNvbmZpZy5zZWN0aW9ucykuZWFjaCgoc2VjdGlvbmtleSwgc2VjdGlvbikgPT4ge1xuXHRcdFx0XHRpZiAoc2VjdGlvbi5oaWRkZW4gfHwgKHNlY3Rpb24uYWRtaW5Pbmx5ICYmICFNb3JlYml0cy51c2VySXNTeXNvcCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gaS5lLiBcImNvbnRpbnVlXCIgaW4gdGhpcyBjb250ZXh0XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gYWRkIHRvIFRPQ1xuXHRcdFx0XHRjb25zdCB0b2NsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG5cdFx0XHRcdHRvY2xpLmNsYXNzTmFtZSA9ICd0b2NsZXZlbC0xJztcblx0XHRcdFx0Y29uc3QgdG9jYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdFx0dG9jYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBgIyR7c2VjdGlvbi5tb2R1bGV9YCk7XG5cdFx0XHRcdHRvY2EuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2VjdGlvbi50aXRsZSkpO1xuXHRcdFx0XHR0b2NsaS5hcHBlbmRDaGlsZCh0b2NhKTtcblx0XHRcdFx0dG9jdWwuYXBwZW5kQ2hpbGQodG9jbGkpO1xuXHRcdFx0XHRsZXQgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcblx0XHRcdFx0bGV0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuXHRcdFx0XHRjZWxsLnNldEF0dHJpYnV0ZSgnY29sc3BhbicsICczJyk7XG5cdFx0XHRcdGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNCcpO1xuXHRcdFx0XHRoZWFkaW5nLnN0eWxlLmJvcmRlckJvdHRvbSA9ICcxcHggc29saWQgIzgwODA4MCc7XG5cdFx0XHRcdGhlYWRpbmcuc3R5bGUubWFyZ2luVG9wID0gJzAuMmVtJztcblx0XHRcdFx0aGVhZGluZy5pZCA9IHNlY3Rpb24ubW9kdWxlO1xuXHRcdFx0XHRoZWFkaW5nLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlY3Rpb24udGl0bGUpKTtcblx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChoZWFkaW5nKTtcblx0XHRcdFx0cm93LmFwcGVuZENoaWxkKGNlbGwpO1xuXHRcdFx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQocm93KTtcblx0XHRcdFx0bGV0IHJvd2NvdW50ID0gMTsgLy8gZm9yIHJvdyBiYW5kaW5nXG5cdFx0XHRcdC8vIGFkZCBlYWNoIG9mIHRoZSBwcmVmZXJlbmNlcyB0byB0aGUgZm9ybVxuXHRcdFx0XHQkKHNlY3Rpb24ucHJlZmVyZW5jZXMpLmVhY2goKHByZWZrZXksIHByZWYpID0+IHtcblx0XHRcdFx0XHRpZiAocHJlZi5hZG1pbk9ubHkgJiYgIU1vcmViaXRzLnVzZXJJc1N5c29wKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gaS5lLiBcImNvbnRpbnVlXCIgaW4gdGhpcyBjb250ZXh0XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcblx0XHRcdFx0XHRyb3cuc3R5bGUubWFyZ2luQm90dG9tID0gJzAuMmVtJztcblx0XHRcdFx0XHQvLyBjcmVhdGUgb2RkIHJvdyBiYW5kaW5nXG5cdFx0XHRcdFx0aWYgKHJvd2NvdW50KysgJSAyID09PSAwKSB7XG5cdFx0XHRcdFx0XHRyb3cuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYigxMjggMTI4IDEyOC8uMSknO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRcdFx0XHRsZXQgbGFiZWw7XG5cdFx0XHRcdFx0bGV0IGlucHV0O1xuXHRcdFx0XHRcdGNvbnN0IGdvdFByZWYgPSBUd2lua2xlLmdldFByZWYocHJlZi5uYW1lKTtcblx0XHRcdFx0XHRzd2l0Y2ggKHByZWYudHlwZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSAnYm9vbGVhbic6XG5cdFx0XHRcdFx0XHRcdC8vIGNyZWF0ZSBhIGNoZWNrYm94XG5cdFx0XHRcdFx0XHRcdGNlbGwuc2V0QXR0cmlidXRlKCdjb2xzcGFuJywgJzInKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuXHRcdFx0XHRcdFx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0XHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsICdjaGVja2JveCcpO1xuXHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ2lkJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKGdvdFByZWYgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdFx0XHRpbnB1dC5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRsYWJlbC5hcHBlbmRDaGlsZChpbnB1dCk7XG5cdFx0XHRcdFx0XHRcdGxhYmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHByZWYubGFiZWwpKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChsYWJlbCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnc3RyaW5nJzogLy8gY3JlYXRlIGFuIGlucHV0IGJveFxuXHRcdFx0XHRcdFx0Y2FzZSAnaW50ZWdlcic6XG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBsYWJlbCB0byBmaXJzdCBjb2x1bW5cblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS50ZXh0QWxpZ24gPSAncmlnaHQnO1xuXHRcdFx0XHRcdFx0XHRjZWxsLnN0eWxlLnBhZGRpbmdSaWdodCA9ICcwLjVlbSc7XG5cdFx0XHRcdFx0XHRcdGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBwcmVmLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRsYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtwcmVmLmxhYmVsfe+8mmApKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChsYWJlbCk7XG5cdFx0XHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0XHRcdFx0Ly8gYWRkIGlucHV0IGJveCB0byBzZWNvbmQgY29sdW1uXG5cdFx0XHRcdFx0XHRcdGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuXHRcdFx0XHRcdFx0XHRjZWxsLnN0eWxlLnBhZGRpbmdSaWdodCA9ICcxZW0nO1xuXHRcdFx0XHRcdFx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0XHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0Jyk7XG5cdFx0XHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgnaWQnLCBwcmVmLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBwcmVmLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAocHJlZi50eXBlID09PSAnaW50ZWdlcicpIHtcblx0XHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3NpemUnLCA2KTtcblx0XHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnbnVtYmVyJyk7XG5cdFx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCdzdGVwJywgJzEnKTsgLy8gaW50ZWdlcnMgb25seVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGdvdFByZWYpIHtcblx0XHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgZ290UHJlZik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChpbnB1dCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZW51bSc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gY3JlYXRlIGEgY29tYm8gYm94XG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBsYWJlbCB0byBmaXJzdCBjb2x1bW5cblx0XHRcdFx0XHRcdFx0Ly8gbm90ZTogZHVwbGljYXRlcyB0aGUgY29kZSBhYm92ZSwgdW5kZXIgc3RyaW5nL2ludGVnZXJcblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS50ZXh0QWxpZ24gPSAncmlnaHQnO1xuXHRcdFx0XHRcdFx0XHRjZWxsLnN0eWxlLnBhZGRpbmdSaWdodCA9ICcwLjVlbSc7XG5cdFx0XHRcdFx0XHRcdGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBwcmVmLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRsYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtwcmVmLmxhYmVsfe+8mmApKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChsYWJlbCk7XG5cdFx0XHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0XHRcdFx0Ly8gYWRkIGlucHV0IGJveCB0byBzZWNvbmQgY29sdW1uXG5cdFx0XHRcdFx0XHRcdGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuXHRcdFx0XHRcdFx0XHRjZWxsLnN0eWxlLnBhZGRpbmdSaWdodCA9ICcxZW0nO1xuXHRcdFx0XHRcdFx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuXHRcdFx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ2lkJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0bGV0IG9wdGlvbkV4aXN0cyA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtlbnVtdmFsdWUsIGVudW1kaXNwbGF5XSBvZiBPYmplY3QuZW50cmllcyhwcmVmLmVudW1WYWx1ZXMpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBlbnVtdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdGdvdFByZWYgPT09IGVudW12YWx1ZSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFjayB0byBjb252ZXJ0IG9sZCBib29sZWFuIHdhdGNobGlzdCBwcmVmc1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gdG8gY29ycmVzcG9uZGluZyBlbnVtcyAoYWRkZWQgaW4gdjIuMSlcblx0XHRcdFx0XHRcdFx0XHRcdCh0eXBlb2YgZ290UHJlZiA9PT0gJ2Jvb2xlYW4nICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCgoZ290UHJlZiAmJiBlbnVtdmFsdWUgPT09ICd5ZXMnKSB8fCAoIWdvdFByZWYgJiYgZW51bXZhbHVlID09PSAnbm8nKSkpXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvcHRpb24uc2V0QXR0cmlidXRlKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9uRXhpc3RzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVudW1kaXNwbGF5KSk7XG5cdFx0XHRcdFx0XHRcdFx0aW5wdXQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQvLyBBcHBlbmQgdXNlci1kZWZpbmVkIHZhbHVlIHRvIG9wdGlvbnNcblx0XHRcdFx0XHRcdFx0aWYgKCFvcHRpb25FeGlzdHMpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcblx0XHRcdFx0XHRcdFx0XHRvcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIGdvdFByZWYpO1xuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdvdFByZWYpKTtcblx0XHRcdFx0XHRcdFx0XHRpbnB1dC5hcHBlbmRDaGlsZChvcHRpb24pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgJ3NldCc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gY3JlYXRlIGEgc2V0IG9mIGNoZWNrIGJveGVzXG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBsYWJlbCBmaXJzdCBvZiBhbGxcblx0XHRcdFx0XHRcdFx0Y2VsbC5zZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nLCAnMicpO1xuXHRcdFx0XHRcdFx0XHRsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7IC8vIG5vdCByZWFsbHkgbmVjZXNzYXJ5IHRvIHVzZSBhIGxhYmVsIGVsZW1lbnQgaGVyZSwgYnV0IHdlIGRvIGl0IGZvciBjb25zaXN0ZW5jeSBvZiBzdHlsaW5nXG5cdFx0XHRcdFx0XHRcdGxhYmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAke3ByZWYubGFiZWx977yaYCkpO1xuXHRcdFx0XHRcdFx0XHRjZWxsLmFwcGVuZENoaWxkKGxhYmVsKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hlY2tkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0XHRcdFx0Y2hlY2tkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAnMWVtJztcblx0XHRcdFx0XHRcdFx0Y29uc3Qgd29ya2VyID0gKGl0ZW1rZXksIGl0ZW12YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrbGFiZWwuc3R5bGUubWFyZ2luUmlnaHQgPSAnMC43ZW0nO1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrbGFiZWwuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblx0XHRcdFx0XHRcdFx0XHRjaGVjay5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcblx0XHRcdFx0XHRcdFx0XHRjaGVjay5zZXRBdHRyaWJ1dGUoJ2lkJywgYCR7cHJlZi5uYW1lfV8ke2l0ZW1rZXl9YCk7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2suc2V0QXR0cmlidXRlKCduYW1lJywgYCR7cHJlZi5uYW1lfV8ke2l0ZW1rZXl9YCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGdvdFByZWYgJiYgZ290UHJlZi5pbmNsdWRlcyhpdGVta2V5KSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hlY2suY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIGNhdGVyIGZvciBsZWdhY3kgaW50ZWdlciBhcnJheSB2YWx1ZXMgZm9yIHVubGlua05hbWVzcGFjZXMgKHRoaXMgY2FuIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgZG93biB0aGUgdHJhY2suLi4pXG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJlZi5uYW1lID09PSAndW5saW5rTmFtZXNwYWNlcycgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGdvdFByZWYgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGdvdFByZWYuaW5jbHVkZXMoTnVtYmVyLnBhcnNlSW50KGl0ZW1rZXksIDEwKSlcblx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNoZWNrLmNoZWNrZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjaGVja2xhYmVsLmFwcGVuZENoaWxkKGNoZWNrKTtcblx0XHRcdFx0XHRcdFx0XHRjaGVja2xhYmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGl0ZW12YWx1ZSkpO1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrZGl2LmFwcGVuZENoaWxkKGNoZWNrbGFiZWwpO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRpZiAocHJlZi5zZXREaXNwbGF5T3JkZXIpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBhZGQgY2hlY2sgYm94ZXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBkaXNwbGF5IG9yZGVyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIHByZWYuc2V0RGlzcGxheU9yZGVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR3b3JrZXIoaXRlbSwgcHJlZi5zZXRWYWx1ZXNbaXRlbV0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBhZGQgY2hlY2sgYm94ZXMgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpdCBnZXRzIGZlZCB0byB1cyAocHJvYmFibHkgc3RyaWN0IGFscGhhYmV0aWNhbClcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtpdGVta2V5LCBpdGVtdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByZWYuc2V0VmFsdWVzKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0d29ya2VyKGl0ZW1rZXksIGl0ZW12YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNlbGwuYXBwZW5kQ2hpbGQoY2hlY2tkaXYpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgJ2N1c3RvbUxpc3QnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBsYWJlbCB0byBmaXJzdCBjb2x1bW5cblx0XHRcdFx0XHRcdFx0Y2VsbC5zdHlsZS50ZXh0QWxpZ24gPSAncmlnaHQnO1xuXHRcdFx0XHRcdFx0XHRjZWxsLnN0eWxlLnBhZGRpbmdSaWdodCA9ICcwLjVlbSc7XG5cdFx0XHRcdFx0XHRcdGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBwcmVmLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRsYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtwcmVmLmxhYmVsfe+8mmApKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChsYWJlbCk7XG5cdFx0XHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0XHRcdFx0Ly8gYWRkIGJ1dHRvbiB0byBzZWNvbmQgY29sdW1uXG5cdFx0XHRcdFx0XHRcdGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuXHRcdFx0XHRcdFx0XHRjZWxsLnN0eWxlLnBhZGRpbmdSaWdodCA9ICcxZW0nO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjdXN0b21MaXN0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG5cdFx0XHRcdFx0XHRcdGN1c3RvbUxpc3RCdXR0b24uc2V0QXR0cmlidXRlKCdpZCcsIHByZWYubmFtZSk7XG5cdFx0XHRcdFx0XHRcdGN1c3RvbUxpc3RCdXR0b24uc2V0QXR0cmlidXRlKCduYW1lJywgcHJlZi5uYW1lKTtcblx0XHRcdFx0XHRcdFx0Y3VzdG9tTGlzdEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnYnV0dG9uJyk7XG5cdFx0XHRcdFx0XHRcdGN1c3RvbUxpc3RCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBUd2lua2xlLmNvbmZpZy5saXN0RGlhbG9nLmRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0Ly8gdXNlIGpRdWVyeSBkYXRhIG9uIHRoZSBidXR0b24gdG8gc3RvcmUgdGhlIGN1cnJlbnQgY29uZmlnIHZhbHVlXG5cdFx0XHRcdFx0XHRcdCQoY3VzdG9tTGlzdEJ1dHRvbikuZGF0YSh7XG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGdvdFByZWYsXG5cdFx0XHRcdFx0XHRcdFx0cHJlZixcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGN1c3RvbUxpc3RCdXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2luZG93LndnVUxTKCfnvJbovpHpobnnm64nLCAn57eo6Lyv6aCF55uuJykpKTtcblx0XHRcdFx0XHRcdFx0Y2VsbC5hcHBlbmRDaGlsZChjdXN0b21MaXN0QnV0dG9uKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRtdy5ub3RpZnkoYHR3aW5rbGVjb25maWc6IOacquefpeexu+Wei+eahOWxnuaApyAke3ByZWYubmFtZX1gLCB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ3dhcm4nLFxuXHRcdFx0XHRcdFx0XHRcdHRhZzogJ3R3aW5rbGVjb25maWcnLFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0XHQvLyBhZGQgaGVscCB0aXBcblx0XHRcdFx0XHRjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRcdFx0XHRjZWxsLnN0eWxlLmZvbnRTaXplID0gJzkwJSc7XG5cdFx0XHRcdFx0Y2VsbC5zdHlsZS5jb2xvciA9ICdncmF5Jztcblx0XHRcdFx0XHRpZiAocHJlZi5oZWxwdGlwKSB7XG5cdFx0XHRcdFx0XHQvLyBjb252ZXJ0IG1lbnRpb25zIG9mIHRlbXBsYXRlcyBpbiB0aGUgaGVscHRpcCB0byBjbGlja2FibGUgbGlua3Ncblx0XHRcdFx0XHRcdGNlbGwuaW5uZXJIVE1MID0gcHJlZi5oZWxwdGlwXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRcdC97eyguKz8pfX0vZyxcblx0XHRcdFx0XHRcdFx0XHRge3s8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCgnVGVtcGxhdGU6Jyl9JDFcIiByZWw9XCJub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPn19YFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRcdC9cXFtcXFsoLis/KV1dL2csXG5cdFx0XHRcdFx0XHRcdFx0YDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCcnKX0kMVwiIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+YFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBhZGQgcmVzZXQgbGluayAoY3VzdG9tIGxpc3RzIGRvbid0IG5lZWQgdGhpcywgYXMgdGhlaXIgY29uZmlnIHZhbHVlIGlzbid0IGRpc3BsYXllZCBvbiB0aGUgZm9ybSlcblx0XHRcdFx0XHRpZiAocHJlZi50eXBlICE9PSAnY3VzdG9tTGlzdCcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc2V0bGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdFx0XHRcdHJlc2V0bGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnI3R3LXJlc2V0Jyk7XG5cdFx0XHRcdFx0XHRyZXNldGxpbmsuc2V0QXR0cmlidXRlKCdpZCcsIGB0d2lua2xlLWNvbmZpZy1yZXNldC0ke3ByZWYubmFtZX1gKTtcblx0XHRcdFx0XHRcdHJlc2V0bGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIFR3aW5rbGUuY29uZmlnLnJlc2V0UHJlZkxpbmssIGZhbHNlKTtcblx0XHRcdFx0XHRcdHJlc2V0bGluay5zdHlsZS5jc3NGbG9hdCA9ICdyaWdodCc7XG5cdFx0XHRcdFx0XHRyZXNldGxpbmsuc3R5bGUubWFyZ2luID0gJzAgMC42ZW0nO1xuXHRcdFx0XHRcdFx0cmVzZXRsaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHdpbmRvdy53Z1VMUygn5aSN5L2NJywgJ+W+qeS9jScpKSk7XG5cdFx0XHRcdFx0XHRjZWxsLmFwcGVuZENoaWxkKHJlc2V0bGluayk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZChjZWxsKTtcblx0XHRcdFx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQocm93KTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBmb290ZXJib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGZvb3RlcmJveC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3R3aW5rbGUtY29uZmlnLWJ1dHRvbnBhbmUnKTtcblx0XHRcdGZvb3RlcmJveC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0JDQ0FERic7XG5cdFx0XHRmb290ZXJib3guc3R5bGUucGFkZGluZyA9ICcwLjVlbSc7XG5cdFx0XHRjb25zdCBzdWJtaXRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRcdHN1Ym1pdEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3R3aW5rbGUtY29uZmlnLXN1Ym1pdCcpO1xuXHRcdFx0c3VibWl0QnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdzdWJtaXQnKTtcblx0XHRcdHN1Ym1pdEJ1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh3aW5kb3cud2dVTFMoJ+S/neWtmOS/ruaUuScsICflhLLlrZjkv67mlLknKSkpO1xuXHRcdFx0Zm9vdGVyYm94LmFwcGVuZENoaWxkKHN1Ym1pdEJ1dHRvbik7XG5cdFx0XHRjb25zdCBmb290ZXJzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdFx0Zm9vdGVyc3Bhbi5jbGFzc05hbWUgPSAncGxhaW5saW5rcyc7XG5cdFx0XHRmb290ZXJzcGFuLnN0eWxlLm1hcmdpbkxlZnQgPSAnMi40ZW0nO1xuXHRcdFx0Zm9vdGVyc3Bhbi5zdHlsZS5mb250U2l6ZSA9ICc5MCUnO1xuXHRcdFx0Y29uc3QgZm9vdGVyYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRcdGZvb3RlcmEuc2V0QXR0cmlidXRlKCdocmVmJywgJyN0dy1yZXNldC1hbGwnKTtcblx0XHRcdGZvb3RlcmEuc2V0QXR0cmlidXRlKCdpZCcsICd0d2lua2xlLWNvbmZpZy1yZXNldGFsbCcpO1xuXHRcdFx0Zm9vdGVyYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIFR3aW5rbGUuY29uZmlnLnJlc2V0QWxsUHJlZnMsIGZhbHNlKTtcblx0XHRcdGZvb3RlcmEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2luZG93LndnVUxTKCfmgaLlpI3pu5jorqQnLCAn5oGi5b6p6aCQ6KitJykpKTtcblx0XHRcdGZvb3RlcnNwYW4uYXBwZW5kQ2hpbGQoZm9vdGVyYSk7XG5cdFx0XHRmb290ZXJib3guYXBwZW5kQ2hpbGQoZm9vdGVyc3Bhbik7XG5cdFx0XHRjb250ZW50Zm9ybS5hcHBlbmRDaGlsZChmb290ZXJib3gpO1xuXHRcdFx0Ly8gc2luY2UgYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgZXhpc3Qgbm93LCB3ZSBjYW4gdHJ5IGdvaW5nIHRvIHRoZSByZXF1ZXN0ZWQgYW5jaG9yXG5cdFx0XHRpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHtcblx0XHRcdFx0Y29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7XG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gbG9jO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID09PSBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZUlkcycpLnVzZXIgJiZcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnVGl0bGUnKS5pbmRleE9mKG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkgPT09IDAgJiZcblx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKS5zbGljZSgtMykgPT09ICcuanMnXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdC8vIFN0eWxlZCBpbiB0d2lua2xlLmNzc1xuXHRcdFx0Ym94LnNldEF0dHJpYnV0ZSgnaWQnLCAndHdpbmtsZS1jb25maWctaGVhZGVyYm94Jyk7XG5cdFx0XHRsZXQgbGluaztcblx0XHRcdGNvbnN0IHNjcmlwdFBhZ2VOYW1lID0gbXcuY29uZmlnXG5cdFx0XHRcdC5nZXQoJ3dnUGFnZU5hbWUnKVxuXHRcdFx0XHQuc2xpY2UoXG5cdFx0XHRcdFx0bXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLmxhc3RJbmRleE9mKCcvJykgKyAxLFxuXHRcdFx0XHRcdG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKS5sYXN0SW5kZXhPZignLmpzJylcblx0XHRcdFx0KTtcblx0XHRcdGlmIChzY3JpcHRQYWdlTmFtZSA9PT0gJ3R3aW5rbGVvcHRpb25zJykge1xuXHRcdFx0XHQvLyBwbGFjZSBcIndoeSBub3QgdHJ5IHRoZSBwcmVmZXJlbmNlIHBhbmVsXCIgbm90aWNlXG5cdFx0XHRcdGJveC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2NvbmZpZy10d29wdC1ib3gnKTtcblx0XHRcdFx0aWYgKG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykgPiAwKSB7XG5cdFx0XHRcdFx0Ly8gcGFnZSBleGlzdHNcblx0XHRcdFx0XHRib3guYXBwZW5kQ2hpbGQoXG5cdFx0XHRcdFx0XHRkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcblx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKFxuXHRcdFx0XHRcdFx0XHRcdCfov5npobXljIXlkKvmgqjnmoRUd2lua2xl5Y+C5pWw6K6+572u77yM5oKo5Y+v5L2/55SoJyxcblx0XHRcdFx0XHRcdFx0XHQn6YCZ6aCB5YyF5ZCr5oKo55qEVHdpbmtsZeWBj+WlveioreWumu+8jOaCqOWPr+S9v+eUqCdcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gcGFnZSBkb2VzIG5vdCBleGlzdFxuXHRcdFx0XHRcdGJveC5hcHBlbmRDaGlsZChcblx0XHRcdFx0XHRcdGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+aCqOWPr+mFjee9ruaCqOeahFR3aW5rbGXvvIzpgJrov4fkvb/nlKgnLCAn5oKo5Y+v6YWN572u5oKo55qEVHdpbmtsZe+8jOmAmumBjuS9v+eUqCcpXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIG13LnV0aWwuZ2V0VXJsKFR3aW5rbGUuZ2V0UHJlZignY29uZmlnUGFnZScpKSk7XG5cdFx0XHRcdGxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2luZG93LndnVUxTKCdUd2lua2xl5Y+C5pWw6K6+572u6Z2i5p2/JywgJ1R3aW5rbGXlgY/lpb3oqK3lrprpnaLmnb8nKSkpO1xuXHRcdFx0XHRib3guYXBwZW5kQ2hpbGQobGluayk7XG5cdFx0XHRcdGJveC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh3aW5kb3cud2dVTFMoJ++8jOaIluebtOaOpee8lui+keacrOmhteOAgicsICfvvIzmiJbnm7TmjqXnt6jovK/mnKzpoIHjgIInKSkpO1xuXHRcdFx0XHQkKGJveCkuaW5zZXJ0QWZ0ZXIoJGJvZHkuZmluZCgnI2NvbnRlbnRTdWInKSk7XG5cdFx0XHR9IGVsc2UgaWYgKFsndmVjdG9yJywgJ3ZlY3Rvci0yMDIyJywgJ2dvbmdiaScsICdjaXRpemVuJywgJ2NvbW1vbiddLmluY2x1ZGVzKHNjcmlwdFBhZ2VOYW1lKSkge1xuXHRcdFx0XHQvLyBwbGFjZSBcIkxvb2tpbmcgZm9yIFR3aW5rbGUgb3B0aW9ucz9cIiBub3RpY2Vcblx0XHRcdFx0Ym94LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnY29uZmlnLXVzZXJza2luLWJveCcpO1xuXHRcdFx0XHRib3guYXBwZW5kQ2hpbGQoXG5cdFx0XHRcdFx0ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXG5cdFx0XHRcdFx0XHR3aW5kb3cud2dVTFMoJ+iLpeaCqOaDs+mFjee9ruaCqOeahFR3aW5rbGXvvIzor7fkvb/nlKgnLCAn6Iul5oKo5oOz6YWN572u5oKo55qEVHdpbmtsZe+8jOiri+S9v+eUqCcpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdFx0XHRsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIG13LnV0aWwuZ2V0VXJsKFR3aW5rbGUuZ2V0UHJlZignY29uZmlnUGFnZScpKSk7XG5cdFx0XHRcdGxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2luZG93LndnVUxTKCdUd2lua2xl5Y+C5pWw6K6+572u6Z2i5p2/JywgJ1R3aW5rbGXlgY/lpb3oqK3lrprpnaLmnb8nKSkpO1xuXHRcdFx0XHRib3guYXBwZW5kQ2hpbGQobGluayk7XG5cdFx0XHRcdGJveC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgn44CCJykpO1xuXHRcdFx0XHQkKGJveCkuaW5zZXJ0QWZ0ZXIoJGJvZHkuZmluZCgnI2NvbnRlbnRTdWInKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHQvLyBjdXN0b20gbGlzdC1yZWxhdGVkIHN0dWZmXG5cdFR3aW5rbGUuY29uZmlnLmxpc3REaWFsb2cgPSB7fTtcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5hZGRSb3cgPSAoZGxndGFibGUsIHZhbHVlLCBsYWJlbCkgPT4ge1xuXHRcdGNvbnN0IGNvbnRlbnR0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG5cdFx0Ly8gXCJyZW1vdmVcIiBidXR0b25cblx0XHRsZXQgY29udGVudHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRjb25zdCByZW1vdmVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRyZW1vdmVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xuXHRcdHJlbW92ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0J2NsaWNrJyxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0JChjb250ZW50dHIpLnJlbW92ZSgpO1xuXHRcdFx0fSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHRyZW1vdmVCdXR0b24udGV4dENvbnRlbnQgPSAn56e76ZmkJztcblx0XHRjb250ZW50dGQuYXBwZW5kQ2hpbGQocmVtb3ZlQnV0dG9uKTtcblx0XHRjb250ZW50dHIuYXBwZW5kQ2hpbGQoY29udGVudHRkKTtcblx0XHQvLyB2YWx1ZSBpbnB1dCBib3hcblx0XHRjb250ZW50dGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuXHRcdGxldCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcblx0XHRpbnB1dC5jbGFzc05hbWUgPSAndHdpbmtsZS1jb25maWctY3VzdG9tbGlzdC12YWx1ZSc7XG5cdFx0aW5wdXQuc3R5bGUud2lkdGggPSAnOTclJztcblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7XG5cdFx0fVxuXHRcdGNvbnRlbnR0ZC5hcHBlbmRDaGlsZChpbnB1dCk7XG5cdFx0Y29udGVudHRyLmFwcGVuZENoaWxkKGNvbnRlbnR0ZCk7XG5cdFx0Ly8gbGFiZWwgaW5wdXQgYm94XG5cdFx0Y29udGVudHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcblx0XHRpbnB1dC5jbGFzc05hbWUgPSAndHdpbmtsZS1jb25maWctY3VzdG9tbGlzdC1sYWJlbCc7XG5cdFx0aW5wdXQuc3R5bGUud2lkdGggPSAnOTglJztcblx0XHRpZiAobGFiZWwpIHtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBsYWJlbCk7XG5cdFx0fVxuXHRcdGNvbnRlbnR0ZC5hcHBlbmRDaGlsZChpbnB1dCk7XG5cdFx0Y29udGVudHRyLmFwcGVuZENoaWxkKGNvbnRlbnR0ZCk7XG5cdFx0ZGxndGFibGUuYXBwZW5kQ2hpbGQoY29udGVudHRyKTtcblx0fTtcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5kaXNwbGF5ID0gKGUpID0+IHtcblx0XHRjb25zdCAkcHJlZmJ1dHRvbiA9ICQoZS50YXJnZXQpO1xuXHRcdGNvbnN0IGN1cnZhbHVlID0gJHByZWZidXR0b24uZGF0YSgndmFsdWUnKTtcblx0XHRjb25zdCBjdXJwcmVmID0gJHByZWZidXR0b24uZGF0YSgncHJlZicpO1xuXHRcdGNvbnN0IGRpYWxvZyA9IG5ldyBNb3JlYml0cy5zaW1wbGVXaW5kb3coNzIwLCA0MDApO1xuXHRcdGRpYWxvZy5zZXRUaXRsZShjdXJwcmVmLmxhYmVsKTtcblx0XHRkaWFsb2cuc2V0U2NyaXB0TmFtZSh3aW5kb3cud2dVTFMoJ1R3aW5rbGXlj4LmlbDorr7nva4nLCAnVHdpbmtsZeWBj+WlveioreWumicpKTtcblx0XHRjb25zdCBkaWFsb2djb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0Y29uc3QgZGxndGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpO1xuXHRcdGRsZ3RhYmxlLmNsYXNzTmFtZSA9ICd3aWtpdGFibGUnO1xuXHRcdGRsZ3RhYmxlLnN0eWxlLm1hcmdpbiA9ICcxLjRlbSAxZW0nO1xuXHRcdGRsZ3RhYmxlLnN0eWxlLndpZHRoID0gJzk3JSc7XG5cdFx0Y29uc3QgZGxndGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuXHRcdC8vIGhlYWRlciByb3dcblx0XHRsZXQgZGxndHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xuXHRcdC8vIHRvcC1sZWZ0IGNlbGxcblx0XHRsZXQgZGxndGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0aCcpO1xuXHRcdGRsZ3RoLnN0eWxlLndpZHRoID0gJzUlJztcblx0XHRkbGd0ci5hcHBlbmRDaGlsZChkbGd0aCk7XG5cdFx0Ly8gdmFsdWUgY29sdW1uIGhlYWRlclxuXHRcdGRsZ3RoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcblx0XHRkbGd0aC5zdHlsZS53aWR0aCA9ICczNSUnO1xuXHRcdGRsZ3RoLnRleHRDb250ZW50ID0gY3VycHJlZi5jdXN0b21MaXN0VmFsdWVUaXRsZSA/PyB3aW5kb3cud2dVTFMoJ+aVsOWAvCcsICfmlbjlgLwnKTtcblx0XHRkbGd0ci5hcHBlbmRDaGlsZChkbGd0aCk7XG5cdFx0Ly8gbGFiZWwgY29sdW1uIGhlYWRlclxuXHRcdGRsZ3RoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcblx0XHRkbGd0aC5zdHlsZS53aWR0aCA9ICc2MCUnO1xuXHRcdGRsZ3RoLnRleHRDb250ZW50ID0gY3VycHJlZi5jdXN0b21MaXN0TGFiZWxUaXRsZSA/PyB3aW5kb3cud2dVTFMoJ+agh+etvicsICfmqJnnsaQnKTtcblx0XHRkbGd0ci5hcHBlbmRDaGlsZChkbGd0aCk7XG5cdFx0ZGxndGJvZHkuYXBwZW5kQ2hpbGQoZGxndHIpO1xuXHRcdC8vIGNvbnRlbnQgcm93c1xuXHRcdGxldCBnb3RSb3cgPSBmYWxzZTtcblx0XHRmb3IgKGNvbnN0IHYgb2YgY3VydmFsdWUpIHtcblx0XHRcdGdvdFJvdyA9IHRydWU7XG5cdFx0XHRUd2lua2xlLmNvbmZpZy5saXN0RGlhbG9nLmFkZFJvdyhkbGd0Ym9keSwgdi52YWx1ZSwgdi5sYWJlbCk7XG5cdFx0fVxuXHRcdC8vIGlmIHRoZXJlIGFyZSBubyB2YWx1ZXMgcHJlc2VudCwgYWRkIGEgYmxhbmsgcm93IHRvIHN0YXJ0IHRoZSB1c2VyIG9mZlxuXHRcdGlmICghZ290Um93KSB7XG5cdFx0XHRUd2lua2xlLmNvbmZpZy5saXN0RGlhbG9nLmFkZFJvdyhkbGd0Ym9keSk7XG5cdFx0fVxuXHRcdC8vIGZpbmFsIFwiYWRkXCIgYnV0dG9uXG5cdFx0Y29uc3QgZGxndGZvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Zm9vdCcpO1xuXHRcdGRsZ3RyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcblx0XHRjb25zdCBkbGd0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XG5cdFx0ZGxndGQuc2V0QXR0cmlidXRlKCdjb2xzcGFuJywgJzMnKTtcblx0XHRjb25zdCBhZGRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRhZGRCdXR0b24uc3R5bGUubWluV2lkdGggPSAnOGVtJztcblx0XHRhZGRCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xuXHRcdGFkZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0J2NsaWNrJyxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5hZGRSb3coZGxndGJvZHkpO1xuXHRcdFx0fSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblx0XHRhZGRCdXR0b24udGV4dENvbnRlbnQgPSAn5re75YqgJztcblx0XHRkbGd0ZC5hcHBlbmRDaGlsZChhZGRCdXR0b24pO1xuXHRcdGRsZ3RyLmFwcGVuZENoaWxkKGRsZ3RkKTtcblx0XHRkbGd0Zm9vdC5hcHBlbmRDaGlsZChkbGd0cik7XG5cdFx0ZGxndGFibGUuYXBwZW5kQ2hpbGQoZGxndGJvZHkpO1xuXHRcdGRsZ3RhYmxlLmFwcGVuZENoaWxkKGRsZ3Rmb290KTtcblx0XHRkaWFsb2djb250ZW50LmFwcGVuZENoaWxkKGRsZ3RhYmxlKTtcblx0XHQvLyBidXR0b25wYW5lIGJ1dHRvbnM6IFtTYXZlIGNoYW5nZXNdIFtSZXNldF0gW0NhbmNlbF1cblx0XHRsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG5cdFx0YnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdzdWJtaXQnKTsgLy8gc28gTW9yZWJpdHMuc2ltcGxlV2luZG93IHB1dHMgdGhlIGJ1dHRvbiBpbiB0aGUgYnV0dG9uIHBhbmVcblx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcblx0XHRcdCdjbGljaycsXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFR3aW5rbGUuY29uZmlnLmxpc3REaWFsb2cuc2F2ZSgkcHJlZmJ1dHRvbiwgZGxndGJvZHkpO1xuXHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdH0sXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0YnV0dG9uLnRleHRDb250ZW50ID0gd2luZG93LndnVUxTKCfkv53lrZjkv67mlLknLCAn5YSy5a2Y5L+u5pS5Jyk7XG5cdFx0ZGlhbG9nY29udGVudC5hcHBlbmRDaGlsZChidXR0b24pO1xuXHRcdGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuXHRcdGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnc3VibWl0Jyk7IC8vIHNvIE1vcmViaXRzLnNpbXBsZVdpbmRvdyBwdXRzIHRoZSBidXR0b24gaW4gdGhlIGJ1dHRvbiBwYW5lXG5cdFx0YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHQnY2xpY2snLFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRUd2lua2xlLmNvbmZpZy5saXN0RGlhbG9nLnJlc2V0KCRwcmVmYnV0dG9uLCBkbGd0Ym9keSk7XG5cdFx0XHR9LFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9IHdpbmRvdy53Z1VMUygn5aSN5L2NJywgJ+W+qeS9jScpO1xuXHRcdGRpYWxvZ2NvbnRlbnQuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblx0XHRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblx0XHRidXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ3N1Ym1pdCcpOyAvLyBzbyBNb3JlYml0cy5zaW1wbGVXaW5kb3cgcHV0cyB0aGUgYnV0dG9uIGluIHRoZSBidXR0b24gcGFuZVxuXHRcdGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0J2NsaWNrJyxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7IC8vIHRoZSBldmVudCBwYXJhbWV0ZXIgb24gdGhpcyBmdW5jdGlvbiBzZWVtcyB0byBiZSBicm9rZW5cblx0XHRcdH0sXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ+WPlua2iCc7XG5cdFx0ZGlhbG9nY29udGVudC5hcHBlbmRDaGlsZChidXR0b24pO1xuXHRcdGRpYWxvZy5zZXRDb250ZW50KGRpYWxvZ2NvbnRlbnQpO1xuXHRcdGRpYWxvZy5kaXNwbGF5KCk7XG5cdH07XG5cdC8vIFJlc2V0cyB0aGUgZGF0YSB2YWx1ZSwgcmUtcG9wdWxhdGVzIGJhc2VkIG9uIHRoZSBuZXcgKGRlZmF1bHQpIHZhbHVlLCB0aGVuIHNhdmVzIHRoZVxuXHQvLyBvbGQgZGF0YSB2YWx1ZSBhZ2FpbiAobGVzcyBzdXJwcmlzaW5nIGJlaGF2aW91cilcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5yZXNldCA9IChidXR0b24sIHRib2R5KSA9PiB7XG5cdFx0Ly8gcmVzZXQgdmFsdWUgb24gYnV0dG9uXG5cdFx0Y29uc3QgJGJ1dHRvbiA9ICQoYnV0dG9uKTtcblx0XHRjb25zdCBjdXJwcmVmID0gJGJ1dHRvbi5kYXRhKCdwcmVmJyk7XG5cdFx0Y29uc3Qgb2xkdmFsdWUgPSAkYnV0dG9uLmRhdGEoJ3ZhbHVlJyk7XG5cdFx0VHdpbmtsZS5jb25maWcucmVzZXRQcmVmKGN1cnByZWYpO1xuXHRcdC8vIHJlc2V0IGZvcm1cblx0XHRjb25zdCAkdGJvZHkgPSAkKHRib2R5KTtcblx0XHQkdGJvZHkuZmluZCgndHInKS5zbGljZSgxKS5yZW1vdmUoKTsgLy8gYWxsIHJvd3MgZXhjZXB0IHRoZSBmaXJzdCAoaGVhZGVyKSByb3dcblx0XHQvLyBhZGQgdGhlIG5ldyB2YWx1ZXNcblx0XHRjb25zdCBjdXJ2YWx1ZSA9ICRidXR0b24uZGF0YSgndmFsdWUnKTtcblx0XHRmb3IgKGNvbnN0IHYgb2YgY3VydmFsdWUpIHtcblx0XHRcdFR3aW5rbGUuY29uZmlnLmxpc3REaWFsb2cuYWRkUm93KHRib2R5LCB2LnZhbHVlLCB2LmxhYmVsKTtcblx0XHR9XG5cdFx0Ly8gc2F2ZSB0aGUgb2xkIHZhbHVlXG5cdFx0JGJ1dHRvbi5kYXRhKCd2YWx1ZScsIG9sZHZhbHVlKTtcblx0fTtcblx0VHdpbmtsZS5jb25maWcubGlzdERpYWxvZy5zYXZlID0gKGJ1dHRvbiwgdGJvZHkpID0+IHtcblx0XHRjb25zdCByZXN1bHQgPSBbXTtcblx0XHRsZXQgY3VycmVudCA9IHt9O1xuXHRcdCQodGJvZHkpXG5cdFx0XHQuZmluZCgnaW5wdXRbdHlwZT1cInRleHRcIl0nKVxuXHRcdFx0LmVhY2goKGlucHV0a2V5LCBpbnB1dCkgPT4ge1xuXHRcdFx0XHRpZiAoJChpbnB1dCkuaGFzQ2xhc3MoJ3R3aW5rbGUtY29uZmlnLWN1c3RvbWxpc3QtdmFsdWUnKSkge1xuXHRcdFx0XHRcdGN1cnJlbnQgPSB7XG5cdFx0XHRcdFx0XHR2YWx1ZTogaW5wdXQudmFsdWUsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjdXJyZW50LmxhYmVsID0gaW5wdXQudmFsdWU7XG5cdFx0XHRcdFx0Ly8gZXhjbHVkZSB0b3RhbGx5IGVtcHR5IHJvd3Ncblx0XHRcdFx0XHRpZiAoY3VycmVudC52YWx1ZSB8fCBjdXJyZW50LmxhYmVsKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjdXJyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdCQoYnV0dG9uKS5kYXRhKCd2YWx1ZScsIHJlc3VsdCk7XG5cdH07XG5cdC8vIHJlc2V0L3Jlc3RvcmUgZGVmYXVsdHNcblx0VHdpbmtsZS5jb25maWcucmVzZXRQcmVmTGluayA9IChlKSA9PiB7XG5cdFx0Y29uc3Qgd2FudGVkcHJlZiA9IGUudGFyZ2V0LmlkLnNsaWNlKDIxKTsgLy8gXCJ0d2lua2xlLWNvbmZpZy1yZXNldC1cIiBwcmVmaXggaXMgc3RyaXBwZWRcblx0XHQvLyBzZWFyY2ggdGFjdGljc1xuXHRcdCQoVHdpbmtsZS5jb25maWcuc2VjdGlvbnMpLmVhY2goKHNlY3Rpb25rZXksIHNlY3Rpb24pID0+IHtcblx0XHRcdGlmIChzZWN0aW9uLmhpZGRlbiB8fCAoc2VjdGlvbi5hZG1pbk9ubHkgJiYgIU1vcmViaXRzLnVzZXJJc1N5c29wKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTsgLy8gY29udGludWU6IHNraXAgaW1wb3NzaWJpbGl0aWVzXG5cdFx0XHR9XG5cblx0XHRcdGxldCBmb3VuZGl0ID0gZmFsc2U7XG5cdFx0XHQkKHNlY3Rpb24ucHJlZmVyZW5jZXMpLmVhY2goKHByZWZrZXksIHByZWYpID0+IHtcblx0XHRcdFx0aWYgKHByZWYubmFtZSAhPT0gd2FudGVkcHJlZikge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlOyAvLyBjb250aW51ZVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0VHdpbmtsZS5jb25maWcucmVzZXRQcmVmKHByZWYpO1xuXHRcdFx0XHRmb3VuZGl0ID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBicmVha1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChmb3VuZGl0KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTsgLy8gYnJlYWtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBmYWxzZTsgLy8gc3RvcCBsaW5rIGZyb20gc2Nyb2xsaW5nIHBhZ2Vcblx0fTtcblxuXHRUd2lua2xlLmNvbmZpZy5yZXNldFByZWYgPSAocHJlZikgPT4ge1xuXHRcdHN3aXRjaCAocHJlZi50eXBlKSB7XG5cdFx0XHRjYXNlICdib29sZWFuJzpcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZi5uYW1lfWApLmNoZWNrZWQgPSBUd2lua2xlLmRlZmF1bHRDb25maWdbcHJlZi5uYW1lXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdFx0Y2FzZSAnaW50ZWdlcic6XG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZi5uYW1lfWApLnZhbHVlID0gVHdpbmtsZS5kZWZhdWx0Q29uZmlnW3ByZWYubmFtZV07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2V0Jzpcblx0XHRcdFx0Zm9yIChjb25zdCBbaXRlbWtleV0gb2YgT2JqZWN0LmVudHJpZXMocHJlZi5zZXRWYWx1ZXMpKSB7XG5cdFx0XHRcdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWYubmFtZX1fJHtpdGVta2V5fWApKSB7XG5cdFx0XHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmLm5hbWV9XyR7aXRlbWtleX1gKS5jaGVja2VkID1cblx0XHRcdFx0XHRcdFx0VHdpbmtsZS5kZWZhdWx0Q29uZmlnW3ByZWYubmFtZV0uaW5jbHVkZXMoaXRlbWtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY3VzdG9tTGlzdCc6XG5cdFx0XHRcdCQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZi5uYW1lfWApKS5kYXRhKCd2YWx1ZScsIFR3aW5rbGUuZGVmYXVsdENvbmZpZ1twcmVmLm5hbWVdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtdy5ub3RpZnkoYHR3aW5rbGVjb25maWc6IHVua25vd24gZGF0YSB0eXBlIGZvciBwcmVmZXJlbmNlICR7cHJlZi5uYW1lfWAsIHtcblx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0dGFnOiAndHdpbmtsZWNvbmZpZycsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH07XG5cdFR3aW5rbGUuY29uZmlnLnJlc2V0QWxsUHJlZnMgPSAoKSA9PiB7XG5cdFx0Ly8gbm8gY29uZmlybWF0aW9uIG1lc3NhZ2UgLSB0aGUgdXNlciBjYW4ganVzdCByZWZyZXNoL2Nsb3NlIHRoZSBwYWdlIHRvIGFib3J0XG5cdFx0JChUd2lua2xlLmNvbmZpZy5zZWN0aW9ucykuZWFjaCgoc2VjdGlvbmtleSwgc2VjdGlvbikgPT4ge1xuXHRcdFx0aWYgKHNlY3Rpb24uaGlkZGVuIHx8IChzZWN0aW9uLmFkbWluT25seSAmJiAhTW9yZWJpdHMudXNlcklzU3lzb3ApKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlOyAvLyBjb250aW51ZTogc2tpcCBpbXBvc3NpYmlsaXRpZXNcblx0XHRcdH1cblxuXHRcdFx0JChzZWN0aW9uLnByZWZlcmVuY2VzKS5lYWNoKChwcmVma2V5LCBwcmVmKSA9PiB7XG5cdFx0XHRcdGlmICghcHJlZi5hZG1pbk9ubHkgfHwgTW9yZWJpdHMudXNlcklzU3lzb3ApIHtcblx0XHRcdFx0XHRUd2lua2xlLmNvbmZpZy5yZXNldFByZWYocHJlZik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGZhbHNlOyAvLyBzdG9wIGxpbmsgZnJvbSBzY3JvbGxpbmcgcGFnZVxuXHR9O1xuXG5cdFR3aW5rbGUuY29uZmlnLnNhdmUgPSAoZSkgPT4ge1xuXHRcdE1vcmViaXRzLnN0YXR1cy5pbml0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0d2lua2xlLWNvbmZpZy1jb250ZW50JykpO1xuXHRcdGNvbnN0IHVzZXJqcyA9IGAke213LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpW213LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlSWRzJykudXNlcl19OiR7bXcuY29uZmlnLmdldChcblx0XHRcdCd3Z1VzZXJOYW1lJ1xuXHRcdCl9L3R3aW5rbGVvcHRpb25zLmpzYDtcblx0XHRjb25zdCB5c2FyY2hpdmVzX3BhZ2UgPSBuZXcgTW9yZWJpdHMud2lraS5wYWdlKFxuXHRcdFx0dXNlcmpzLFxuXHRcdFx0d2luZG93LndnVUxTKCfkv53lrZjlj4LmlbDorr7nva7liLAgJywgJ+WEsuWtmOWBj+WlveioreWumuWIsCAnKSArIHVzZXJqc1xuXHRcdCk7XG5cdFx0eXNhcmNoaXZlc19wYWdlLnNldENhbGxiYWNrUGFyYW1ldGVycyhlLnRhcmdldCk7XG5cdFx0eXNhcmNoaXZlc19wYWdlLmxvYWQoVHdpbmtsZS5jb25maWcud3JpdGVQcmVmcyk7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRUd2lua2xlLmNvbmZpZy53cml0ZVByZWZzID0gKHBhZ2VvYmopID0+IHtcblx0XHRjb25zdCBmb3JtID0gcGFnZW9iai5nZXRDYWxsYmFja1BhcmFtZXRlcnMoKTtcblx0XHQvLyB0aGlzIGlzIHRoZSBvYmplY3Qgd2hpY2ggZ2V0cyBzZXJpYWxpemVkIGludG8gSlNPTjsgb25seVxuXHRcdC8vIHByZWZlcmVuY2VzIHRoYXQgdGhpcyBzY3JpcHQga25vd3MgYWJvdXQgYXJlIGtlcHRcblx0XHRjb25zdCBuZXdDb25maWcgPSB7XG5cdFx0XHRvcHRpb25zVmVyc2lvbjogMi4xLFxuXHRcdH07XG5cdFx0Ly8gYSBjb21wYXJpc29uIGZ1bmN0aW9uIGlzIG5lZWRlZCBsYXRlciBvblxuXHRcdC8vIGl0IGlzIGp1c3QgZW5vdWdoIGZvciBvdXIgcHVycG9zZXMgKGkuZS4gY29tcGFyaW5nIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLFxuXHRcdC8vIGFycmF5cyBvZiBzdHJpbmdzLCBhbmQgYXJyYXlzIG9mIHsgdmFsdWUsIGxhYmVsIH0pXG5cdFx0Ly8gYW5kIGl0IGlzIG5vdCB2ZXJ5IHJvYnVzdDogZS5nLiBjb21wYXJlKFsyXSwgW1wiMlwiXSkgPT09IHRydWUsIGFuZFxuXHRcdC8vIGNvbXBhcmUoe30sIHt9KSA9PT0gZmFsc2UsIGJ1dCBpdCdzIGdvb2QgZW5vdWdoIGZvciBvdXIgcHVycG9zZXMgaGVyZVxuXHRcdGNvbnN0IGNvbXBhcmUgPSAoYSwgYikgPT4ge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcblx0XHRcdFx0aWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhLnNvcnQoKTtcblx0XHRcdFx0Yi5zb3J0KCk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBhW2ldOyArK2kpIHtcblx0XHRcdFx0XHQvLyBjb21wYXJpc29uIG9mIHRoZSB0d28gcHJvcGVydGllcyBvZiBjdXN0b20gbGlzdHNcblx0XHRcdFx0XHRpZiAodHlwZW9mIGFbaV0gPT09ICdvYmplY3QnICYmIChhW2ldLmxhYmVsICE9PSBiW2ldLmxhYmVsIHx8IGFbaV0udmFsdWUgIT09IGJbaV0udmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhW2ldLnRvU3RyaW5nKCkgIT09IGJbaV0udG9TdHJpbmcoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhID09PSBiO1xuXHRcdH07XG5cdFx0JChUd2lua2xlLmNvbmZpZy5zZWN0aW9ucykuZWFjaCgoc2VjdGlvbmtleSwgc2VjdGlvbikgPT4ge1xuXHRcdFx0aWYgKHNlY3Rpb24uYWRtaW5Pbmx5ICYmICFNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0XHRyZXR1cm47IC8vIGkuZS4gXCJjb250aW51ZVwiIGluIHRoaXMgY29udGV4dFxuXHRcdFx0fVxuXHRcdFx0Ly8gcmVhY2ggZWFjaCBvZiB0aGUgcHJlZmVyZW5jZXMgZnJvbSB0aGUgZm9ybVxuXHRcdFx0JChzZWN0aW9uLnByZWZlcmVuY2VzKS5lYWNoKChwcmVma2V5LCBwcmVmKSA9PiB7XG5cdFx0XHRcdGxldCB1c2VyVmFsdWU7IC8vID0gdW5kZWZpbmVkXG5cdFx0XHRcdC8vIG9ubHkgcmVhZCBmb3JtIHZhbHVlcyBmb3IgdGhvc2UgcHJlZnMgdGhhdCBoYXZlIHRoZW1cblx0XHRcdFx0aWYgKCFwcmVmLmFkbWluT25seSB8fCBNb3JlYml0cy51c2VySXNTeXNvcCkge1xuXHRcdFx0XHRcdGlmICghc2VjdGlvbi5oaWRkZW4pIHtcblx0XHRcdFx0XHRcdHN3aXRjaCAocHJlZi50eXBlKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2Jvb2xlYW4nOlxuXHRcdFx0XHRcdFx0XHRcdC8vIHJlYWQgZnJvbSB0aGUgY2hlY2tib3hcblx0XHRcdFx0XHRcdFx0XHR1c2VyVmFsdWUgPSBmb3JtW3ByZWYubmFtZV0uY2hlY2tlZDtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnc3RyaW5nJzogLy8gcmVhZCBmcm9tIHRoZSBpbnB1dCBib3ggb3IgY29tYm8gYm94XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0XHRcdFx0XHRcdHVzZXJWYWx1ZSA9IGZvcm1bcHJlZi5uYW1lXS52YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnaW50ZWdlcic6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVhZCBmcm9tIHRoZSBpbnB1dCBib3hcblx0XHRcdFx0XHRcdFx0XHR1c2VyVmFsdWUgPSBOdW1iZXIucGFyc2VJbnQoZm9ybVtwcmVmLm5hbWVdLnZhbHVlLCAxMCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKE51bWJlci5pc05hTih1c2VyVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRNb3JlYml0cy5zdGF0dXMud2Fybihcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndnVUxTKCfkv53lrZgnLCAn5YSy5a2YJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGAke3dpbmRvdy53Z1VMUygn5oKo5Li6ICcsICfmgqjngrogJykgKyBwcmVmLm5hbWV9IOaMh+WumueahOWAvO+8iCR7cHJlZi52YWx1ZX0ke3dpbmRvdy53Z1VMUyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQn77yJ5LiN5ZCI5rOV77yM5Lya57un57ut5L+d5a2Y5pON5L2c77yM5L2G5q2k5YC85bCG5Lya6Lez6L+H44CCJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQn77yJ5LiN5ZCI5rOV77yM5pyD57m857qM5YSy5a2Y5pON5L2c77yM5L2G5q2k5YC85bCH5pyD6Lez6YGO44CCJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQpfWBcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR1c2VyVmFsdWUgPSBudWxsO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnc2V0Jzpcblx0XHRcdFx0XHRcdFx0XHQvLyByZWFkIGZyb20gdGhlIHNldCBvZiBjaGVjayBib3hlc1xuXHRcdFx0XHRcdFx0XHRcdHVzZXJWYWx1ZSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwcmVmLnNldERpc3BsYXlPcmRlcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVhZCBvbmx5IHRob3NlIGtleXMgc3BlY2lmaWVkIGluIHRoZSBkaXNwbGF5IG9yZGVyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgcHJlZi5zZXREaXNwbGF5T3JkZXIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGZvcm1bYCR7cHJlZi5uYW1lfV8ke2l0ZW19YF0uY2hlY2tlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXJWYWx1ZS5wdXNoKGl0ZW0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIHJlYWQgYWxsIHRoZSBrZXlzIGluIHRoZSBsaXN0IG9mIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBbaXRlbWtleV0gb2YgT2JqZWN0LmVudHJpZXMocHJlZi5zZXRWYWx1ZXMpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChmb3JtW2Ake3ByZWYubmFtZX1fJHtpdGVta2V5fWBdLmNoZWNrZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyVmFsdWUucHVzaChpdGVta2V5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnY3VzdG9tTGlzdCc6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcmVhZCBmcm9tIHRoZSBqUXVlcnkgZGF0YSBzdG9yZWQgb24gdGhlIGJ1dHRvbiBvYmplY3Rcblx0XHRcdFx0XHRcdFx0XHR1c2VyVmFsdWUgPSAkKGZvcm1bcHJlZi5uYW1lXSkuZGF0YSgndmFsdWUnKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRtdy5ub3RpZnkoYHR3aW5rbGVjb25maWc6IOacquefpeaVsOaNruexu+Wei++8jOWxnuaApyAke3ByZWYubmFtZX1gLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnd2FybicsXG5cdFx0XHRcdFx0XHRcdFx0XHR0YWc6ICd0d2lua2xlY29uZmlnJyxcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKFR3aW5rbGUucHJlZnMpIHtcblx0XHRcdFx0XHRcdC8vIFJldGFpbiB0aGUgaGlkZGVuIHByZWZlcmVuY2VzIHRoYXQgbWF5IGhhdmUgY3VzdG9taXNlZCBieSB0aGUgdXNlciBmcm9tIHR3aW5rbGVvcHRpb25zLmpzXG5cdFx0XHRcdFx0XHQvLyB1bmRlZmluZWQgaWYgbm90IHNldFxuXHRcdFx0XHRcdFx0dXNlclZhbHVlID0gVHdpbmtsZS5wcmVmc1twcmVmLm5hbWVdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBvbmx5IHNhdmUgdGhvc2UgcHJlZmVyZW5jZXMgdGhhdCBhcmUgKmRpZmZlcmVudCogZnJvbSB0aGUgZGVmYXVsdFxuXHRcdFx0XHRpZiAodXNlclZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWNvbXBhcmUodXNlclZhbHVlLCBUd2lua2xlLmRlZmF1bHRDb25maWdbcHJlZi5uYW1lXSkpIHtcblx0XHRcdFx0XHRuZXdDb25maWdbcHJlZi5uYW1lXSA9IHVzZXJWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgbm93aWtpID0gJ25vd2lraSc7XG5cdFx0bGV0IHRleHQgPSBgLy8gPCR7bm93aWtpfT5cXG4ke3dpbmRvdy53Z1VMUyhcblx0XHRcdGAvLyB0d2lua2xlb3B0aW9ucy5qc++8mueUqOaIt1R3aW5rbGXlj4LmlbDorr7nva7mlofku7ZcXG4vL1xcbi8vIOazqO+8muS/ruaUueaCqOeahOWPguaVsOiuvue9ruacgOeugOWNleeahOWKnuazleaYr+S9v+eUqFxcbi8vIFR3aW5rbGXlj4LmlbDorr7nva7pnaLmnb/vvIzlnKhbWyR7TW9yZWJpdHMucGFnZU5hbWVOb3JtfV1d44CCXFxuLy9cXG4vLyDov5nkuKrmlofku7bmmK/oh6rliqjnlJ/miJDnmoTvvIzmgqjmiYDlgZrnmoTku7vkvZXkv67mlLnvvIjpmaTkuoZcXG4vLyDku6XkuIDnp43lkIjms5XnmoRKYXZhU2NyaXB055qE5pa55byP5p2l5L+u5pS56L+Z5Lqb5bGe5oCn5YC877yJ5LyaXFxuLy8g5Zyo5LiL5LiA5qyh5oKo54K55Ye74oCc5L+d5a2Y4oCd5pe26KKr6KaG55uW44CCXFxuLy8g5L+u5pS55q2k5paH5Lu25pe277yM6K+36K6w5b6X5L2/55So5ZCI5rOV55qESmF2YVNjcmlwdOOAglxcbmAsXG5cdFx0XHRgLy8gdHdpbmtsZW9wdGlvbnMuanPvvJrkvb/nlKjogIVUd2lua2xl5Y+D5pW46Kit5a6a5qqU5qGIXFxuLy9cXG4vLyDoqLvvvJrkv67mlLnmgqjnmoTlj4PmlbjoqK3lrprmnIDnsKHllq7nmoTovqbms5XmmK/kvb/nlKhcXG4vLyBUd2lua2xl5Y+D5pW46Kit5a6a6Z2i5p2/77yM5ZyoW1ske01vcmViaXRzLnBhZ2VOYW1lTm9ybX1dXeOAglxcbi8vXFxuLy8g6YCZ5YCL5qqU5qGI5piv6Ieq5YuV55Si55Sf55qE77yM5oKo5omA5YGa55qE5Lu75L2V5L+u5pS577yI6Zmk5LqGXFxuLy8g5Lul5LiA56iu5ZCI5rOV55qESmF2YVNjcmlwdOeahOaWueW8j+S+huS/ruaUuemAmeS6m+WxrOaAp+WAvO+8ieacg1xcbi8vIOWcqOS4i+S4gOasoeaCqOm7nuaTiuOAjOWEsuWtmOOAjeaZguiiq+imhuiTi+OAglxcbi8vIOS/ruaUueatpOaqlOahiOaZgu+8jOiri+iomOW+l+S9v+eUqOWQiOazleeahEphdmFTY3JpcHTjgIJcXG5gXG5cdFx0KX1gO1xuXHRcdHRleHQgKz1cblx0XHRcdCdcXG53aW5kb3cuVHdpbmtsZSA9IHdpbmRvdy5Ud2lua2xlIHx8IHt9O1xcbndpbmRvdy5Ud2lua2xlLnByZWZzID0gd2luZG93LlR3aW5rbGUucHJlZnMgfHwge307XFxud2luZG93LlR3aW5rbGUucHJlZnMgPSAnO1xuXHRcdHRleHQgKz0gSlNPTi5zdHJpbmdpZnkobmV3Q29uZmlnLCBudWxsLCAyKTtcblx0XHR0ZXh0ICs9IGA7XFxuXFxuJHt3aW5kb3cud2dVTFMoJy8vIHR3aW5rbGVvcHRpb25zLmpz5Yiw5q2k5Li65q2iXFxuJywgJy8vIHR3aW5rbGVvcHRpb25zLmpz5Yiw5q2k54K65q2iXFxuJyl9Ly8gPC8ke25vd2lraX0+YDtcblx0XHRwYWdlb2JqLnNldFBhZ2VUZXh0KHRleHQpO1xuXHRcdHBhZ2VvYmouc2V0RWRpdFN1bW1hcnkoXG5cdFx0XHR3aW5kb3cud2dVTFMoJ+S/neWtmFR3aW5rbGXlj4LmlbDorr7nva7vvJrmnaXoh6pbWycsICflhLLlrZhUd2lua2xl5YGP5aW96Kit5a6a77ya5L6G6IeqW1snKSArXG5cdFx0XHRcdE1vcmViaXRzLnBhZ2VOYW1lTm9ybSArXG5cdFx0XHRcdHdpbmRvdy53Z1VMUygnXV3nmoToh6rliqjnvJbovpEnLCAnXV3nmoToh6rli5Xnt6jovK8nKVxuXHRcdCk7XG5cdFx0cGFnZW9iai5zZXRDaGFuZ2VUYWdzKFR3aW5rbGUuY2hhbmdlVGFncyk7XG5cdFx0cGFnZW9iai5zZXRDcmVhdGVPcHRpb24oJ3JlY3JlYXRlJyk7XG5cdFx0cGFnZW9iai5zYXZlKFR3aW5rbGUuY29uZmlnLnNhdmVTdWNjZXNzKTtcblx0fTtcblx0VHdpbmtsZS5jb25maWcuc2F2ZVN1Y2Nlc3MgPSAocGFnZW9iaikgPT4ge1xuXHRcdHBhZ2VvYmouZ2V0U3RhdHVzRWxlbWVudCgpLmluZm8oJ+aIkOWKnycpO1xuXHRcdGNvbnN0IG5vdGljZWJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdG5vdGljZWJveC5jbGFzc05hbWUgPSAnbXctbWVzc2FnZS1ib3ggbXctbWVzc2FnZS1ib3gtc3VjY2Vzcyc7XG5cdFx0bm90aWNlYm94LnN0eWxlLmZvbnRTaXplID0gJzEwMCUnO1xuXHRcdG5vdGljZWJveC5zdHlsZS5tYXJnaW5Ub3AgPSAnMmVtJztcblx0XHRub3RpY2Vib3guaW5uZXJIVE1MID0gYDxwPjxiPiR7d2luZG93LndnVUxTKFxuXHRcdFx0J+aCqOeahFR3aW5rbGXlj4LmlbDorr7nva7lt7Looqvkv53lrZjjgIInLFxuXHRcdFx0J+aCqOeahFR3aW5rbGXlgY/lpb3oqK3lrprlt7LooqvlhLLlrZjjgIInXG5cdFx0KX08L2I+PC9wPjxwPiR7d2luZG93LndnVUxTKCfopoHnnIvliLDov5nkupvmm7TmlLnvvIzmgqjlj6/og73pnIDopoEnLCAn6KaB55yL5Yiw6YCZ5Lqb5pu05pS577yM5oKo5Y+v6IO96ZyA6KaBJyl9PGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoXG5cdFx0XHQnTElCOkJZUEFTUydcblx0XHQpfVwiIHRpdGxlPVwiTElCOkJZUEFTU1wiPjxiPiR7d2luZG93LndnVUxTKCfnu5Xov4fmtY/op4jlmajnvJPlrZgnLCAn57me6YGO54CP6Ka95Zmo5b+r5Y+WJyl9PC9iPjwvYT7jgII8L3A+YDtcblx0XHRNb3JlYml0cy5zdGF0dXMucm9vdC5hcHBlbmRDaGlsZChub3RpY2Vib3gpO1xuXHRcdGNvbnN0IG5vdGljZWNsZWFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKTtcblx0XHRub3RpY2VjbGVhci5zdHlsZS5jbGVhciA9ICdib3RoJztcblx0XHRNb3JlYml0cy5zdGF0dXMucm9vdC5hcHBlbmRDaGlsZChub3RpY2VjbGVhcik7XG5cdH07XG5cdFR3aW5rbGUuYWRkSW5pdENhbGxiYWNrKFR3aW5rbGUuY29uZmlnLmluaXQpO1xufSkoalF1ZXJ5KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsd0ZBQUFBLFNBQUE7QUFBQTtBQUNBLFFBQUksUUFBUSxTQUFVLElBQUk7QUFDeEIsYUFBTyxNQUFNLEdBQUcsU0FBUyxRQUFRO0FBQUEsSUFDbkM7QUFHQSxJQUFBQSxRQUFPO0FBQUEsSUFFTCxNQUFNLE9BQU8sY0FBYyxZQUFZLFVBQVUsS0FDakQsTUFBTSxPQUFPLFVBQVUsWUFBWSxNQUFNO0FBQUEsSUFFekMsTUFBTSxPQUFPLFFBQVEsWUFBWSxJQUFJLEtBQ3JDLE1BQU0sT0FBTyxVQUFVLFlBQVksTUFBTSxLQUN6QyxNQUFNLE9BQU8sV0FBUSxZQUFZLE9BQUk7QUFBQSxJQUVwQywyQkFBWTtBQUFFLGFBQU87QUFBQSxJQUFNLEVBQUcsS0FBSyxTQUFTLGFBQWEsRUFBRTtBQUFBO0FBQUE7OztBQ2Y5RDtBQUFBLHVGQUFBQyxTQUFBO0FBQUE7QUFDQSxJQUFBQSxRQUFPLFVBQVUsU0FBVSxNQUFNO0FBQy9CLFVBQUk7QUFDRixlQUFPLENBQUMsQ0FBQyxLQUFLO0FBQUEsTUFDaEIsU0FBUyxPQUFPO0FBQ2QsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUE7QUFBQTs7O0FDUEE7QUFBQSw2RkFBQUMsU0FBQTtBQUFBO0FBQ0EsUUFBSSxRQUFRO0FBR1osSUFBQUEsUUFBTyxVQUFVLENBQUMsTUFBTSxXQUFZO0FBRWxDLGFBQU8sT0FBTyxlQUFlLENBQUMsR0FBRyxHQUFHLEVBQUUsS0FBSyxXQUFZO0FBQUUsZUFBTztBQUFBLE1BQUcsRUFB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TCxLQUFLLElBQUk7QUFDcEMsVUFBTTIzQyxZQUFZdndELFNBQVNZLGNBQWMsS0FBSztBQUM5QzJ2RCxjQUFVenZELFlBQVk7QUFDdEJ5dkQsY0FBVWpxRCxNQUFNc2lDLFdBQVc7QUFDM0IybkIsY0FBVWpxRCxNQUFNd2tELFlBQVk7QUFDNUJ5RixjQUFVaDBCLFlBQUEsU0FBQXA4QixPQUFxQnRJLE9BQU9nSCxNQUNyQyxzQkFDQSxvQkFDRCxHQUFDLGFBQUEsRUFBQXNCLE9BQWN0SSxPQUFPZ0gsTUFBTSxpQkFBaUIsZUFBZSxHQUFDLFdBQUEsRUFBQXNCLE9BQVk5QyxHQUFHMkUsS0FBS00sT0FDaEYsWUFDRCxHQUFDLDBCQUFBLEVBQUFuQyxPQUEyQnRJLE9BQU9nSCxNQUFNLFdBQVcsU0FBUyxHQUFDLGVBQUE7QUFDOUQ5RyxhQUFTc1UsT0FBT3RNLEtBQUtpQixZQUFZdXZELFNBQVM7QUFDMUMsVUFBTUMsY0FBY3h3RCxTQUFTWSxjQUFjLElBQUk7QUFDL0M0dkQsZ0JBQVlscUQsTUFBTW1xRCxRQUFRO0FBQzFCMTRELGFBQVNzVSxPQUFPdE0sS0FBS2lCLFlBQVl3dkQsV0FBVztFQUM3QztBQUNBMTRELFVBQVFTLGdCQUFnQlQsUUFBUXdGLE9BQU9nUCxJQUFJO0FBQzVDLEdBQUd0SCxNQUFNOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAibW9kdWxlIiwgImdsb2JhbFRoaXMiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAiU3ltYm9sIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJkb2N1bWVudCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2xvYmFsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdsb2JhbCIsICJUeXBlRXJyb3IiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYWwiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidHdpbmtsZSIsICIkIiwgIl93aW5kb3ciLCAiJGJvZHkiLCAiVHdpbmtsZTIiLCAid2luZG93IiwgIlR3aW5rbGUiLCAiTW9yZWJpdHMiLCAidXNlcklzSW5Hcm91cCIsICJjb25zb2xlIiwgIndhcm4iLCAiY2hhbmdlVGFncyIsICJzdW1tYXJ5QWQiLCAiaGF0bm90ZVJlZ2V4IiwgImluaXRDYWxsYmFja3MiLCAiYWRkSW5pdENhbGxiYWNrIiwgImZ1bmMiLCAibmFtZSIsICJwdXNoIiwgImRlZmF1bHRDb25maWciLCAidXNlclRhbGtQYWdlTW9kZSIsICJkaWFsb2dMYXJnZUZvbnQiLCAiZGlzYWJsZWRNb2R1bGVzIiwgInVzZXJJc1N5c29wIiwgImRpc2FibGVkU3lzb3BNb2R1bGVzIiwgInNwaVdhdGNoUmVwb3J0IiwgImRlZmF1bHRUb0Jsb2NrNjQiLCAiZGVmYXVsdFRvUGFydGlhbEJsb2NrcyIsICJibGFua1RhbGtwYWdlT25JbmRlZkJsb2NrIiwgIndhdGNoQmxvY2tOb3RpY2VzIiwgImN1c3RvbUJsb2NrUmVhc29uTGlzdCIsICJvcGVuVGFsa1BhZ2UiLCAib3BlblRhbGtQYWdlT25BdXRvUmV2ZXJ0IiwgInJvbGxiYWNrSW5QbGFjZSIsICJtYXJrUmV2ZXJ0ZWRQYWdlc0FzTWlub3IiLCAid2F0Y2hSZXZlcnRlZFBhZ2VzIiwgIndhdGNoUmV2ZXJ0ZWRFeHBpcnkiLCAib2ZmZXJSZWFzb25Pbk5vcm1hbFJldmVydCIsICJjb25maXJtT25GbHVmZiIsICJzaG93Um9sbGJhY2tMaW5rcyIsICJjdXN0b21SZXZlcnRTdW1tYXJ5IiwgIm5vdGlmeVVzZXJPbkRlbGkiLCAiZGVsaVdhdGNoUGFnZSIsICJkZWxpV2F0Y2hVc2VyIiwgIndhdGNoUmVxdWVzdGVkUGFnZXMiLCAid2F0Y2hQUFRhZ2dlZFBhZ2VzIiwgIndhdGNoUHJvdGVjdGVkUGFnZXMiLCAic3BlZWR5U2VsZWN0aW9uU3R5bGUiLCAid2F0Y2hTcGVlZHlQYWdlcyIsICJ3YXRjaFNwZWVkeUV4cGlyeSIsICJtYXJrU3BlZWR5UGFnZXNBc1BhdHJvbGxlZCIsICJ3YXRjaFNwZWVkeVVzZXIiLCAibm90aWZ5VXNlck9uU3BlZWR5RGVsZXRpb25Ob21pbmF0aW9uIiwgIndhcm5Vc2VyT25TcGVlZHlEZWxldGUiLCAicHJvbXB0Rm9yU3BlZWR5RGVsZXRpb25TdW1tYXJ5IiwgIm9wZW5Vc2VyVGFsa1BhZ2VPblNwZWVkeURlbGV0ZSIsICJkZWxldGVUYWxrUGFnZU9uRGVsZXRlIiwgImRlbGV0ZVJlZGlyZWN0c09uRGVsZXRlIiwgImRlbGV0ZVN5c29wRGVmYXVsdFRvRGVsZXRlIiwgInNwZWVkeVdpbmRvd0hlaWdodCIsICJzcGVlZHlXaW5kb3dXaWR0aCIsICJsb2dTcGVlZHlOb21pbmF0aW9ucyIsICJzcGVlZHlMb2dQYWdlTmFtZSIsICJub0xvZ09uU3BlZWR5Tm9taW5hdGlvbiIsICJlbmxhcmdlRzdJbnB1dCIsICJ1bmxpbmtOYW1lc3BhY2VzIiwgImRlZmF1bHRXYXJuaW5nR3JvdXAiLCAiY29tYmluZWRTaW5nbGV0TWVudXMiLCAid2F0Y2hXYXJuaW5ncyIsICJvbGRTZWxlY3QiLCAiY3VzdG9tV2FybmluZ0xpc3QiLCAiYXV0b01lbnVBZnRlclJvbGxiYWNrIiwgImxvZ1hmZE5vbWluYXRpb25zIiwgInhmZExvZ1BhZ2VOYW1lIiwgIm5vTG9nT25YZmROb21pbmF0aW9uIiwgInhmZFdhdGNoRGlzY3Vzc2lvbiIsICJ4ZmRXYXRjaFBhZ2UiLCAieGZkV2F0Y2hVc2VyIiwgIm1hcmtYZmRQYWdlc0FzUGF0cm9sbGVkIiwgIkZ3ZENzZFRvWGZkIiwgImFmZERlZmF1bHRDYXRlZ29yeSIsICJhZmRGYW1lRGVmYXVsdFJlYXNvbiIsICJhZmRTdWJzdHViRGVmYXVsdFJlYXNvbiIsICJYZmRDbG9zZSIsICJjb3B5dmlvV2F0Y2hQYWdlIiwgImNvcHl2aW9XYXRjaFVzZXIiLCAibWFya0NvcHl2aW9QYWdlc0FzUGF0cm9sbGVkIiwgImF1dG9sZXZlbFN0YWxlRGF5cyIsICJyZXZlcnRNYXhSZXZpc2lvbnMiLCAiYmF0Y2hNYXgiLCAiYmF0Y2hDaHVua3MiLCAiY29uZmlnUGFnZSIsICJwcm9qZWN0TmFtZXNwYWNlTmFtZSIsICJtdyIsICJjb25maWciLCAiZ2V0IiwgInNhbmRib3hQYWdlIiwgImRlbGV0aW9uU3VtbWFyeUFkIiwgInByb3RlY3Rpb25TdW1tYXJ5QWQiLCAiYmxvY2tTdW1tYXJ5QWQiLCAiZ3JvdXBCeURlZmF1bHQiLCAid2F0Y2hUYWdnZWRQYWdlcyIsICJ3YXRjaE1lcmdlRGlzY3Vzc2lvbnMiLCAibWFya1RhZ2dlZFBhZ2VzQXNNaW5vciIsICJtYXJrVGFnZ2VkUGFnZXNBc1BhdHJvbGxlZCIsICJ0YWdBcnRpY2xlU29ydE9yZGVyIiwgImN1c3RvbVRhZ0xpc3QiLCAiY3VzdG9tRmlsZVRhZ0xpc3QiLCAiY3VzdG9tUmVkaXJlY3RUYWdMaXN0IiwgIndhdGNoU3R1YmJlZFBhZ2VzIiwgIm1hcmtTdHViYmVkUGFnZXNBc01pbm9yIiwgIm1hcmtTdHViYmVkUGFnZXNBc1BhdHJvbGxlZCIsICJzdHViQXJ0aWNsZVNvcnRPcmRlciIsICJjdXN0b21TdHViTGlzdCIsICJtYXJrVGFsa2JhY2tBc01pbm9yIiwgImluc2VydFRhbGtiYWNrU2lnbmF0dXJlIiwgInRhbGtiYWNrSGVhZGluZyIsICJ3Z1VMUyIsICJtYWlsSGVhZGluZyIsICJwb3J0bGV0QXJlYSIsICJwb3J0bGV0SWQiLCAicG9ydGxldE5hbWUiLCAicG9ydGxldFR5cGUiLCAicG9ydGxldE5leHQiLCAiZmluZCIsICJsZW5ndGgiLCAiZ2V0UHJlZiIsICJwcmVmcyIsICJUd2lua2xlQ29uZmlnIiwgImFkZFBvcnRsZXQiLCAibmF2aWdhdGlvbiIsICJpZCIsICJ0ZXh0IiwgInR5cGUiLCAibmV4dG5vZGVpZCIsICJyb290IiwgImRvY3VtZW50IiwgInF1ZXJ5U2VsZWN0b3IiLCAidGVzdCIsICJjb25jYXQiLCAiaXRlbSIsICJwYXJlbnROb2RlIiwgIm5leHRub2RlIiwgInNraW4iLCAib3V0ZXJOYXZDbGFzcyIsICJpbm5lckRpdkNsYXNzIiwgIm91dGVyTmF2IiwgImhlYWRpbmciLCAiY3JlYXRlRWxlbWVudCIsICJzZXRBdHRyaWJ1dGUiLCAiY2xhc3NOYW1lIiwgImluc2VydEJlZm9yZSIsICJhcHBlbmRDaGlsZCIsICJ1bCIsICJpbmNsdWRlcyIsICJjaGtib3giLCAic3BhbiIsICJjcmVhdGVUZXh0Tm9kZSIsICJhIiwgImhyZWYiLCAib24iLCAiZSIsICJwcmV2ZW50RGVmYXVsdCIsICJpbm5lckRpdiIsICJhZGRQb3J0bGV0TGluayIsICJ0YXNrIiwgInRvb2x0aXAiLCAibGluayIsICJ1dGlsIiwgImNzcyIsICJldiIsICJjb2xsYXBzaWJsZVRhYnMiLCAiaGFuZGxlUmVzaXplIiwgInNjcmlwdHVybCIsICJnZXRVcmwiLCAiYWN0aW9uIiwgImN0eXBlIiwgImhhcHB5IiwgImxvYWRlciIsICJnZXRTY3JpcHQiLCAiZmFpbCIsICJub3RpZnkiLCAidGFnIiwgImFsd2F5cyIsICJsb2FkIiwgImFjdGl2ZVNwZWNpYWxQYWdlTGlzdCIsICJ0b3AiLCAic2VsZiIsICJ1c2VyQWdlbnQiLCAid2lraSIsICJhcGkiLCAic2V0QXBpVXNlckFnZW50IiwgIl9pdGVyYXRvciIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcCIsICJzIiwgIm4iLCAiZG9uZSIsICJtb2R1bGUiLCAidmFsdWUiLCAiZXJyIiwgImYiLCAiYWRkQ1NTIiwgImlzVmVjdG9yIiwgInNvcnRCeU5hbWVzcGFjZSIsICJmaXJzdCIsICJzZWNvbmQiLCAibnMiLCAidGl0bGUiLCAiZ2VuZXJhdGVCYXRjaFBhZ2VMaW5rcyIsICJjaGVja2JveCIsICIkY2hlY2tib3giLCAiaHRtbE5vZGUiLCAidmFsIiwgIm5leHQiLCAicHJlcGVuZCIsICJqUXVlcnkiLCAidHdpbmtsZWFydiIsICJhcnYiLCAidXNlcm5hbWUiLCAiaXNJUCIsICJpc0lQQWRkcmVzcyIsICJjYWxsYmFjayIsICJ1aWQiLCAiV2luZG93IiwgInNpbXBsZVdpbmRvdyIsICJzZXRUaXRsZSIsICJzZXRTY3JpcHROYW1lIiwgImFkZEZvb3RlckxpbmsiLCAiZm9ybSIsICJxdWlja0Zvcm0iLCAiZXZhbHVhdGUiLCAiY2F0ZWdvcmllcyIsICJhcHBlbmQiLCAibGFiZWwiLCAiZXZlbnQiLCAiY2hhbmdlQ2F0ZWdvcnkiLCAiZGlzYWJsZWQiLCAic3R5bGUiLCAicmVzdWx0IiwgInJlbmRlciIsICJzZXRDb250ZW50IiwgImRpc3BsYXkiLCAicXVlcnkiLCAibGlzdCIsICJia3Byb3AiLCAiZm9ybWF0IiwgImJraXAiLCAiYmt1c2VycyIsICJhcGlvYmoiLCAiYmxvY2tsaXN0IiwgImdldFJlc3BvbnNlIiwgImJsb2NrcyIsICJibG9jayIsICJtZXNzYWdlIiwgInBhcnRpYWwiLCAicmFuZ2VzdGFydCIsICJyYW5nZWVuZCIsICJwb3N0IiwgImV2dCIsICJjcmVhdGVFdmVudCIsICJpbml0RXZlbnQiLCAiY2F0ZWdvcnkiLCAiZGlzcGF0Y2hFdmVudCIsICJsdGFfbGlzdCIsICJzb2NrbWFzdGVyX2NoYW5nZWQiLCAic2V0X3NvY2ttYXN0ZXIiLCAidGFyZ2V0IiwgInNvY2ttYXN0ZXIiLCAidmFsdWVfIiwgInJvb3RfIiwgIm9sZF9hcmVhIiwgImdldEVsZW1lbnRzIiwgIndvcmtfYXJlYSIsICJwcmV2aWV3bGluayIsICJjdXJzb3IiLCAidGV4dENvbnRlbnQiLCAicHJldmlldyIsICJlbGVtZW50IiwgInN1YmxhYmVsIiwgIm1pbiIsICJtYXgiLCAicmVwbGFjZUNoaWxkIiwgImFkZENsYXNzIiwgInNwaW5vdGljZXByZXZpZXdlciIsICJsYXN0IiwgImdldFBhcmFtVmFsdWUiLCAiYmFkaWQiLCAiZ29vZGlkIiwgInByZXZpZXdlciIsICJyZWFzb24iLCAiZ2V0UmVwb3J0V2lraXRleHQiLCAiaW5wdXQiLCAiZ2V0SW5wdXREYXRhIiwgImJlZ2luUmVuZGVyIiwgImNvbW1lbnQiLCAiY2hlY2tUaXRsZSIsICJyZXZpZCIsICJwYWdlXyIsICJUaXRsZSIsICJuYW1lc3BhY2UiLCAicGFnZSIsICJwYWdlcyIsICJtYXAiLCAibyIsICJfaXRlcmF0b3IyIiwgIl9zdGVwMiIsICJnZXRQcmVmaXhlZFRleHQiLCAicmVwbGFjZSIsICJ0cmltIiwgInN0cmluZyIsICJhcHBlbmRQdW5jdHVhdGlvbiIsICJ0eXBlcyIsICJhcnZ0eXBlIiwgInRvTG93ZXJDYXNlRmlyc3RDaGFyIiwgImhhc1NoYXJlZCIsICJzcGxpY2UiLCAiaW5kZXhPZiIsICJjb25maXJtIiwgImpvaW4iLCAic2xpY2UiLCAiaGlkZW5hbWUiLCAidG9VcHBlckNhc2VGaXJzdENoYXIiLCAic29ja3B1cHBldHMiLCAiYXJyYXkiLCAidW5pcSIsICJzb2NrIiwgImluZGV4IiwgImNoZWNrdXNlciIsICJ2IiwgIl9pbnB1dCRnb29kaWQiLCAic3VtbWFyeSIsICJzZXRCdXR0b25zRW5hYmxlZCIsICJzdGF0dXMiLCAiaW5pdCIsICJhY3Rpb25Db21wbGV0ZWQiLCAicmVkaXJlY3QiLCAibm90aWNlIiwgImV3aXBQYWdlIiwgInNldEZvbGxvd1JlZGlyZWN0IiwgImdldFBhZ2VUZXh0IiwgIiRld2lwTGluayIsICJSZWdFeHAiLCAiZXNjYXBlUmVnRXhwIiwgImdldFN0YXR1c0VsZW1lbnQiLCAiZXJyb3IiLCAicHJpbnRVc2VyVGV4dCIsICJzZXRQYWdlU2VjdGlvbiIsICJzZXRFZGl0U3VtbWFyeSIsICJzZXRDaGFuZ2VUYWdzIiwgInNldEFwcGVuZFRleHQiLCAidWFhUGFnZSIsICIkdWFhTGluayIsICJyZXBvcnRwYWdlIiwgInNwaVBhZ2UiLCAic2V0V2F0Y2hsaXN0IiwgImFpdlBhZ2UiLCAiJGFpdkxpbmsiLCAidHdpbmtsZXdhcm4iLCAicmVsZXZhbnRVc2VyTmFtZSIsICIkdmFuZGFsVGFsa0xpbmsiLCAibWFrZVZhbmRhbFRhbGtMaW5rIiwgInBhZ2VOYW1lTm9ybSIsICJhZlRhbGtMaW5rIiwgInBhZ2VfcHJlZml4ZWR0aXRsZSIsICJwYWdlbmFtZSIsICJ3cmFwSW5uZXIiLCAiYXR0ciIsICJleHRyYVBhcmFtIiwgInJhd3VybGVuY29kZSIsICJkaWFsb2ciLCAibWFpbl9zZWxlY3QiLCAibWFpbl9ncm91cCIsICJjaGFuZ2VfY2F0ZWdvcnkiLCAiZGVmYXVsdEdyb3VwIiwgIk51bWJlciIsICJwYXJzZUludCIsICJzZWxlY3RlZCIsICJjaGFuZ2Vfc3ViY2F0ZWdvcnkiLCAic2l6ZSIsICJwbGFjZWhvbGRlciIsICJtb3JlIiwgImNhbGxiYWNrcyIsICJ2YW5yZXZpZCIsICJ0aXRsZXMiLCAicHJvcCIsICJydnN0YXJ0aWQiLCAicnZsaW1pdCIsICJydmRpciIsICJydnByb3AiLCAicmV2ZXJ0VXNlciIsICJnZXRBdHRyaWJ1dGUiLCAiY2hlY2tTdGFsZSIsICJ2YW50aW1lc3RhbXBfIiwgInJldkRhdGUiLCAiZGF0ZSIsICJpc1ZhbGlkIiwgImFkZCIsICJpc0JlZm9yZSIsICJEYXRlIiwgInZhbnRpbWVzdGFtcCIsICJyZXZpZHMiLCAibWVzc2FnZXMiLCAibGV2ZWxzIiwgImxldmVsMSIsICJsZXZlbDIiLCAic2luZ2xlbm90aWNlIiwgInNpbmdsZXdhcm4iLCAic3VwcHJlc3NBcnRpY2xlSW5TdW1tYXJ5IiwgInByZXZfYXJ0aWNsZSIsICJwcmV2X3JlYXNvbiIsICJ0YWxrcGFnZU9iaiIsICJzdWJfZ3JvdXAiLCAib2xkX3N1YnZhbHVlIiwgIm9sZF9zdWJ2YWx1ZV9yZSIsICJoYXNDaGlsZE5vZGVzIiwgInJlbW92ZUNoaWxkIiwgImZpcnN0Q2hpbGQiLCAiY3JlYXRlRW50cmllcyIsICJjb250ZW50cyIsICJjb250YWluZXIiLCAid3JhcEluT3B0Z3JvdXAiLCAibGV2ZWwiLCAiY2xpZW50IiwgInByb2ZpbGUiLCAicGxhdGZvcm0iLCAid3JhcHBlck9wdGdyb3VwIiwgIl9pMiIsICJfT2JqZWN0JGVudHJpZXMiLCAiT2JqZWN0IiwgImVudHJpZXMiLCAiaXRlbUtleSIsICJpdGVtUHJvcGVydGllcyIsICJrZXkiLCAidGVtcGxhdGUiLCAiZWxlbSIsICJkYXRhIiwgImVsZW1SZW5kZXJlZCIsICJ1blNvcnRlZFNpbmdsZXRzIiwgInNvcnRlZFNpbmdsZXRNZXNzYWdlcyIsICJfaXRlcmF0b3IzIiwgImtleXMiLCAic29ydCIsICJfc3RlcDMiLCAiX2kzIiwgIl9hcnIiLCAibHZsIiwgIl9pdGVyYXRvcjQiLCAiX3N0ZXA0IiwgImxldmVsR3JvdXAiLCAiX2l0ZXJhdG9yNSIsICJfc3RlcDUiLCAib3B0Z3JvdXAiLCAiYXV0b2xldmVsUHJvYyIsICJ3aWtpdGV4dCIsICJsYXRlc3QiLCAiZGF0ZVByb2Nlc3NpbmciLCAicGFyYW1zIiwgImFydGljbGUiLCAiYXV0b2xldmVsUGFyc2VXaWtpdGV4dCIsICJfaXRlcmF0b3I2IiwgIl9zdGVwNiIsICJwb3N0Q2F0ZWdvcnlDbGVhbnVwIiwgInVzZXJ0YWxrX3BhZ2UiLCAicGFnZW9iaiIsICIkbm9UYWxrUGFnZU5vZGUiLCAiY2xvc2VQcmV2aWV3IiwgInJlbW92ZSIsICJzZXRFbGVtZW50VG9vbHRpcFZpc2liaWxpdHkiLCAicmVzZXRFbGVtZW50TGFiZWwiLCAic2VsZWN0MiIsICJ3aWR0aCIsICJtYXRjaGVyIiwgIm1hdGNoZXJzIiwgIm9wdGdyb3VwRnVsbCIsICJ0ZW1wbGF0ZVJlc3VsdCIsICJoaWdobGlnaHRTZWFyY2hNYXRjaGVzIiwgImxhbmd1YWdlIiwgInNlYXJjaGluZyIsICJxdWVyeUludGVyY2VwdG9yIiwgImNoYW5nZSIsICJhdXRvU3RhcnQiLCAidHJpZ2dlciIsICJub3RMaW5rZWRBcnRpY2xlIiwgIm5vdEFydGljbGUiLCAib3ZlcnJpZGVFbGVtZW50TGFiZWwiLCAiZ2V0V2FybmluZ1dpa2l0ZXh0IiwgInRlbXBsYXRlTmFtZSIsICJpc0N1c3RvbSIsICJub1NpZ24iLCAic2hvd1ByZXZpZXciLCAidGVtcGxhdGVuYW1lIiwgImxpbmtlZGFydGljbGUiLCAidGVtcGxhdGV0ZXh0IiwgIm1lc3NhZ2VEYXRhIiwgImhpc3RvcnlfcmUiLCAiaGlzdG9yeSIsICJjdXJyZW50IiwgImV4ZWMiLCAiY3VycmVudF9kYXRlIiwgImlzQWZ0ZXIiLCAic3RhdGVsZW0iLCAiJGF1dG9sZXZlbE1lc3NhZ2UiLCAiaXNOYU4iLCAiYXV0b1RpbWVvdXQiLCAiZ2V0VGltZSIsICIkbGluayIsICJjbG9zZSIsICJzdGF0dXNOb2RlIiwgImluc2VydEFmdGVyIiwgIm1haW4iLCAiZ2V0Q2FsbGJhY2tQYXJhbWV0ZXJzIiwgIndhcm5pbmdIaXN0b3J5IiwgIm5vdyIsICJnZXRMb2FkVGltZSIsICJ0ZW1wbGF0ZUFuZExldmVsIiwgImN1c3RvbVByb2Nlc3MiLCAic3BsaXQiLCAicHJlZml4IiwgInN1YiIsICJ3YXJuaW5nVGV4dCIsICJzZWN0aW9uRXhpc3RzIiwgInNlY3Rpb25OdW1iZXIiLCAic2VjdGlvbnMiLCAibWF0Y2giLCAiZGF0ZUhlYWRlclJlZ2V4IiwgIm1vbnRoSGVhZGVyUmVnZXgiLCAicmV2ZXJzZSIsICJzb21lIiwgInNlYyIsICJpZHgiLCAic2V0TmV3U2VjdGlvblRpdGxlIiwgImluZm8iLCAibW9udGhIZWFkZXIiLCAic2V0TmV3U2VjdGlvblRleHQiLCAibmV3U2VjdGlvbiIsICJ1c2VyVGFsa1BhZ2UiLCAiZ2V0RnJhZ21lbnQiLCAiYWxlcnQiLCAiJHNlbGVjdGVkRWwiLCAieXNhcmNoaXZlc19wYWdlIiwgInNldENhbGxiYWNrUGFyYW1ldGVycyIsICJpbXBvcnRfZXh0X2dhZGdldCIsICJyZXF1aXJlIiwgInR3aW5rbGVibG9jayIsICJpbml0TXdBcGkiLCAiYmxvY2tlZFVzZXJOYW1lIiwgIm1lbnVGb3JtYXR0ZWROYW1lc3BhY2VzIiwgImJsb2NrQWN0aW9uVGV4dCIsICJyZWJsb2NrIiwgInVuYmxvY2siLCAiaXAiLCAiaXNSYW5nZSIsICJ2YWxpZENJRFIiLCAiY3VycmVudEJsb2NrSW5mbyIsICJmaWVsZF9ibG9ja19vcHRpb25zIiwgImZpZWxkX3RlbXBsYXRlX29wdGlvbnMiLCAiYWN0aW9uZmllbGQiLCAiY2hhbmdlX2FjdGlvbiIsICJoaWRkZW4iLCAiY2hlY2tlZCIsICJzaXh0eUZvdXIiLCAiZ2V0NjQiLCAiYmxvY2s2NGZpZWxkIiwgImNoYW5nZV9ibG9jazY0IiwgImZldGNoVXNlckluZm8iLCAiaXNSZWdpc3RlcmVkIiwgIiRmb3JtIiwgInNldEVsZW1lbnRWaXNpYmlsaXR5IiwgInBhcmVudCIsICJ0cmFuc2Zvcm1CbG9ja1ByZXNldHMiLCAiYmxvY2s2NCIsICJhY3Rpb250eXBlIiwgImZldGNoZWREYXRhIiwgInByb2Nlc3NVc2VySW5mbyIsICJmbiIsICJibG9ja2luZm8iLCAidXNlcmluZm8iLCAidXNlcnMiLCAidXNlciIsICJ1c2VyaWQiLCAidXNlcklzQm90IiwgImdyb3VwbWVtYmVyc2hpcHMiLCAiZ3JvdXAiLCAiZGlzYWJsZXRhbGsiLCAiYWxsb3d1c2VydGFsayIsICJoYXJkYmxvY2siLCAiYW5vbm9ubHkiLCAiaGFzQmxvY2tMb2ciLCAibG9nZXZlbnRzIiwgImJsb2NrTG9nIiwgImJsb2NrTG9nSWQiLCAibG9naWQiLCAibGV0eXBlIiwgImxlbGltaXQiLCAibGV0aXRsZSIsICJ1c3VzZXJzIiwgInVzcHJvcCIsICJ0aGVuIiwgInNhdmVGaWVsZHNldCIsICJmaWVsZHNldCIsICJfaXRlcmF0b3I3IiwgInNlcmlhbGl6ZUFycmF5IiwgIl9zdGVwNyIsICJlbCIsICIkYmxvY2s2NCIsICJwcmlvck5hbWUiLCAiaXMiLCAib3JpZ2luYWxJc1JhbmdlIiwgInJlZ2VuZXJhdGVGb3JtIiwgInRpdGxlQmFyIiwgIm5leHRTaWJsaW5nIiwgIm5vZGVWYWx1ZSIsICJmaWVsZF9wcmVzZXQiLCAiZmllbGRfdGFnX29wdGlvbnMiLCAiZmllbGRfdW5ibG9ja19vcHRpb25zIiwgIiRibG9jayIsICJibG9ja0JveCIsICIkdGVtcGxhdGUiLCAidGVtcGxhdGVCb3giLCAiJHRhZyIsICJ0YWdCb3giLCAiJHByb3RlY3QiLCAiJHBhcnRpYWwiLCAicGFydGlhbEJveCIsICIkdW5ibG9jayIsICJ1bmJsb2NrQm94IiwgImJsb2NrR3JvdXAiLCAiYmxvY2tHcm91cHNQYXJ0aWFsIiwgImJsb2NrR3JvdXBzIiwgInByaW9yIiwgImJsb2NrUHJlc2V0c0luZm8iLCAiYmciLCAiaXNJbmZpbml0eSIsICJleHBpcnkiLCAiZmlsdGVyIiwgImNoYW5nZV9wcmVzZXQiLCAiZmlsdGVyZWRfYmxvY2tfZ3JvdXBzIiwgImNoYW5nZV9leHBpcnkiLCAidGVtcGxhdGVfZXhwaXJ5IiwgIm11bHRpcGxlIiwgIl9pNCIsICJfT2JqZWN0JGVudHJpZXMyIiwgIm51bWJlciIsICJibG9ja29wdGlvbnMiLCAibm9jcmVhdGUiLCAibm9lbWFpbCIsICJhdXRvYmxvY2siLCAid2F0Y2h1c2VyIiwgInRvZ2dsZV9zZWVfYWxzb3MiLCAiY2hhbmdlX3RlbXBsYXRlIiwgImJsb2NrX3JlYXNvbiIsICJibGFua19kdXJhdGlvbiIsICJub3RhbGsiLCAibm9lbWFpbF90ZW1wbGF0ZSIsICJub2NyZWF0ZV90ZW1wbGF0ZSIsICIkcHJldmlld2xpbmsiLCAib2ZmIiwgInN1Ymdyb3VwIiwgIm9sZGZpZWxkIiwgImhpZGUiLCAic2hvdyIsICJlcnJvckxvYWRpbmciLCAibWF4aW11bVNlbGVjdGlvbkxlbmd0aCIsICJtaW5pbXVtSW5wdXRMZW5ndGgiLCAiYWpheCIsICJ1cmwiLCAid2lraVNjcmlwdCIsICJkYXRhVHlwZSIsICJkZWxheSIsICJuZXdGcm9tVGV4dCIsICJ0ZXJtIiwgImFwZnJvbSIsICJhcG5hbWVzcGFjZSIsICJhcGxpbWl0IiwgInByb2Nlc3NSZXN1bHRzIiwgInJlc3VsdHMiLCAiYWxscGFnZXMiLCAidG9UZXh0IiwgInRlbXBsYXRlU2VsZWN0aW9uIiwgImNob2ljZSIsICJyZWwiLCAid29yZEJlZ2lubmluZyIsICJzYW1lVXNlciIsICJzdGF0dXNTdHIiLCAiJHJhbmdlYmxvY2tsb2dsaW5rIiwgImh0bWwiLCAiY2FsZW5kYXIiLCAiaW5mb1N0ciIsICJ1cGRhdGVfZm9ybSIsICJibG9ja2xvZ2luZm8iLCAiJGJsb2NrbG9nbGluayIsICJsYXN0QmxvY2tBY3Rpb24iLCAiYmxvY2tBY3Rpb24iLCAidGltZXN0YW1wIiwgImZvcm1hdFRpbWUiLCAiZHVyYXRpb24iLCAiZm9yUmVnaXN0ZXJlZE9ubHkiLCAicGFnZVBhcmFtIiwgInJlYXNvblBhcmFtIiwgIm5vbnN0YW5kYXJkIiwgImZvckFub25Pbmx5IiwgInNpZyIsICJjaGVja3VzZXJibG9jayIsICJiaW9ibG9jayIsICJ1Y2Jsb2NrIiwgIm5wYmxvY2siLCAiX2l0ZXJhdG9yOCIsICJfc3RlcDgiLCAibmV3S2V5IiwgImN1c3RvbSIsICJfaTUiLCAiX09iamVjdCRlbnRyaWVzMyIsICJwcmVzZXQiLCAic2V0dGluZ3MiLCAiaW5kZWZpbml0ZSIsICJtZXRhIiwgInNob3dfdGVtcGxhdGUiLCAidGVtcGxhdGVzIiwgImJsb2NrUHJlc2V0IiwgImJsb2NrU2V0dGluZ3MiLCAicmVnaXN0cmF0aW9uUmVzdHJpY3QiLCAic2VlQWxzb3MiLCAic2VlQWxzb01lc3NhZ2UiLCAidXNlSW5pdGlhbE9wdGlvbnMiLCAicGFyc2UiLCAidG9HTVRTdHJpbmciLCAiZXhwaXJ5X3ByZXNldCIsICJlYWNoIiwgIl9pIiwgImNoZWNrIiwgInByZXBlbmRSZWFzb24iLCAicGFnZXJlc3RyaWN0aW9ucyIsICIkcGFnZVNlbGVjdCIsICIkbmFtZXNwYWNlU2VsZWN0IiwgInJlc3RyaWN0aW9ucyIsICJwciIsICJfaXRlcmF0b3I5IiwgIl9zdGVwOSIsICJlc2NhcGVTZWxlY3RvciIsICJuZXdPcHRpb24iLCAiT3B0aW9uIiwgIkFycmF5IiwgImlzQXJyYXkiLCAibmFtZXNwYWNlcyIsICJwcmV2X3RlbXBsYXRlX2V4cGlyeSIsICJhcmVhIiwgIm5hbWVzcGFjZXJlc3RyaWN0aW9ucyIsICJ0ZW1wbGF0ZVRleHQiLCAiZ2V0QmxvY2tOb3RpY2VXaWtpdGV4dCIsICJfdGVtcGxhdGVvcHRpb25zIiwgInRvQmxvY2siLCAidG9XYXJuIiwgInRvUGFydGlhbCIsICJ0b1RhZyIsICJ0b1Byb3RlY3QiLCAidG9VbmJsb2NrIiwgInRlbXBsYXRlb3B0aW9ucyIsICJ1bmJsb2Nrb3B0aW9ucyIsICJ0b0Nsb3NldmlwIiwgImNsb3NldmlwIiwgImNoZWNrSW5jb21wYXRpYmxlIiwgImNvbmZsaWN0cyIsICJleHRyYSIsICJjb3VudCIsICJyZWR1Y2UiLCAic3VtIiwgInNwcFVzZXJuYW1lIiwgInN0YXR1c0VsZW1lbnQiLCAibG9nRXhwaXJ5IiwgImV4cGlyeURhdGUiLCAiZ3JvdXBzQ2FuQmVSZW1vdmVkIiwgImdyb3Vwc1RvQmVSZW1vdmVkIiwgImdyb3VwcyIsICJ0YWdzIiwgInRva2VuIiwgInRva2VucyIsICJtYkFwaSIsICJpc3N1ZV90ZW1wbGF0ZSIsICJ2aXBQYWdlIiwgImNsb3NlUmVxdWVzdCIsICJyaWdodFN0YXR1c0VsZW1lbnQiLCAicmV2b2tlT3B0aW9ucyIsICJ1c2VycmlnaHRzdG9rZW4iLCAibXJBcGkiLCAidXNlclBhZ2UiLCAidGFndXNlcnBhZ2UiLCAidW5ibG9ja1N0YXR1c0VsZW1lbnQiLCAidW5ibG9ja01iQXBpIiwgIl9pdGVyYXRvcjEwIiwgIl9zdGVwMTAiLCAidGFndGV4dCIsICJzcHBUeXBlIiwgInNwcEV2aWRlbmNlIiwgInNwbUNoZWNrZWQiLCAic3BtRXZpZGVuY2UiLCAic2V0UGFnZVRleHQiLCAic2F2ZSIsICJwcm90ZWN0dXNlcnBhZ2UiLCAiZXhpc3RzIiwgInNldEVkaXRQcm90ZWN0aW9uIiwgInNldE1vdmVQcm90ZWN0aW9uIiwgInNldENyZWF0ZVByb3RlY3Rpb24iLCAicHJvdGVjdCIsICJmb3JtRGF0YSIsICJ1c2VydGFsa19zdW1tYXJ5IiwgInVzZXJOYW1lIiwgImV4cGlyeVRleHQiLCAicmVxdWVzdExpc3QiLCAiZm91bmQiLCAidmlwUmUiLCAicGFnZU5hbWVSZWdleCIsICJpIiwgInRyaW1FbmQiLCAibmV3VGV4dCIsICJtYWtlU2VudGVuY2UiLCAicG9wIiwgInAiLCAibmFtZXNwYWNlTmFtZXMiLCAiZGF0ZUhlYWRlclJlZ2V4TGFzdCIsICJkYXRlSGVhZGVyUmVnZXhSZXN1bHQiLCAibGFzdEhlYWRlckluZGV4IiwgImxhc3RJbmRleE9mIiwgImZyaWVuZGx5dGFsa2JhY2siLCAidGFsa2JhY2siLCAiY2hhbmdlVGFyZ2V0IiwgInRidGFyZ2V0IiwgImVscXVlcnkiLCAiZWxsaW1pdCIsICJ5c2FyY2hpdmVzX2FwaSIsICJvcHRvdXRTdGF0dXMiLCAib3B0b3V0IiwgIiRlbCIsICJnZXRYTUwiLCAicHJldl9wYWdlIiwgInByZXZfc2VjdGlvbiIsICJwcmV2X21lc3NhZ2UiLCAidmFsdWVzIiwgInNlY3Rpb24iLCAicmVxdWlyZWQiLCAibm90aWNlYm9hcmQiLCAiX2k2IiwgIl9PYmplY3QkZW50cmllczQiLCAibm90aWNlYm9hcmRzIiwgIm5ibmFtZSIsICJkZWZhdWx0U2VsZWN0ZWQiLCAiYWZmcCIsICJjb250ZW50IiwgImVkaXRTdW1tYXJ5IiwgInNibCIsICJzaGwiLCAiZ2V0Q2hlY2tlZCIsICJuYW1lc3BhY2VSZWdleCIsICJmdWxsVXNlclRhbGtQYWdlTmFtZSIsICJ1c2VyX3RhbGsiLCAiZ2V0Tm90aWNlV2lraXRleHQiLCAidGFsa3BhZ2UiLCAic2V0Q3JlYXRlT3B0aW9uIiwgInNldE1pbm9yRWRpdCIsICJub3RpY2V0ZXh0IiwgInNhZmVSZXBsYWNlIiwgInR3aW5rbGVzcGVlZHkiLCAic3BlZWR5IiwgImluaXREaWFsb2ciLCAiZXZhbHVhdGVTeXNvcCIsICJldmFsdWF0ZVVzZXIiLCAiaGFzQ1NEIiwgIm1vZGUiLCAic3lzb3BTaW5nbGVTdWJtaXQiLCAic3lzb3BSYWRpb0NsaWNrIiwgInN5c29wTXVsdGlwbGVTdWJtaXQiLCAic3lzb3BNdWx0aXBsZVJhZGlvQ2xpY2siLCAidXNlck11bHRpcGxlU3VibWl0IiwgInVzZXJNdWx0aXBsZVJhZGlvQ2xpY2siLCAidXNlclNpbmdsZVN1Ym1pdCIsICJ1c2VyU2luZ2xlUmFkaW9DbGljayIsICJpc1N5c29wIiwgImhhc1N1Ym1pdEJ1dHRvbiIsICJpc011bHRpcGxlIiwgImNhbGxiYWNrZnVuYyIsICJjRm9ybSIsICJjQ2hlY2tlZCIsICJyZWRpcmVjdHMiLCAiZGVsbXVsdGlwbGUiLCAib3BlbnVzZXJ0YWxrIiwgInNhbHRpbmciLCAibW9kZUNoYW5nZWQiLCAic3RvcFByb3BhZ2F0aW9uIiwgImRlbGV0ZU9wdGlvbnMiLCAidGFnT3B0aW9ucyIsICJwcmlvckRlbGV0aW9uQ291bnQiLCAiZ2V0TW9kZSIsICJ0YWdfb25seSIsICJpc1N5c29wTW9kZSIsICJldmFsdWF0ZVR5cGUiLCAicmFkaW9PckNoZWNrYm94IiwgImdlbmVyYXRlQ3NkTGlzdCIsICJjdXN0b21SYXRpb25hbGUiLCAiYXJ0aWNsZUxpc3QiLCAidXNlckxpc3QiLCAidXNlcnRhbGtMaXN0IiwgImZpbGVMaXN0IiwgImNhdGVnb3J5TGlzdCIsICJkcmFmdExpc3QiLCAidGFsa0xpc3QiLCAiZ2VuZXJhbENyaXRlcmlhIiwgImdlbmVyYWxMaXN0IiwgInJlZGlyZWN0TGlzdCIsICJjdXN0b21PcHRpb24iLCAiY2xpY2siLCAiZGVjb2RlVVJJQ29tcG9uZW50IiwgImxhYmVscyIsICJlbXB0eSIsICJsZWFjdGlvbiIsICJsZXByb3AiLCAicmVzcG9uc2UiLCAiZGVsQ291bnQiLCAiY29udGludWUiLCAib3BlblN1Ymdyb3VwSGFuZGxlciIsICJjaGlsZHJlbiIsICJmb2N1cyIsICJzdWJtaXRTdWJncm91cEhhbmRsZXIiLCAicHJvdG90eXBlIiwgImNhbGwiLCAiY3JpdEVsZW1lbnQiLCAiY3JpdGVyaW9uIiwgImhpZGVXaGVuTXVsdGlwbGUiLCAiaGlkZVN1Ymdyb3VwV2hlbk11bHRpcGxlIiwgImhpZGVXaGVuU2luZ2xlIiwgImhpZGVTdWJncm91cFdoZW5TaW5nbGUiLCAiaGlkZVdoZW5TeXNvcCIsICJoaWRlU3ViZ3JvdXBXaGVuU3lzb3AiLCAiaGlkZVdoZW5Vc2VyIiwgImhpZGVTdWJncm91cFdoZW5Vc2VyIiwgImhpZGVXaGVuUmVkaXJlY3QiLCAic2hvd0luTmFtZXNwYWNlcyIsICJoaWRlSW5OYW1lc3BhY2VzIiwgIm9yaWdpbmFsRXZlbnQiLCAibm9ybWFsaXplZENyaXRlcmlvbiIsICJub3JtYWxpemVIYXNoIiwgImcxIiwgImcyIiwgImczIiwgImc0IiwgImc1IiwgImc2IiwgImc3IiwgImc4IiwgImc5IiwgImExIiwgImEyIiwgImEzIiwgInIxIiwgInIyIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgIm8xIiwgIm8yIiwgIm8zIiwgImdldFRlbXBsYXRlQ29kZUFuZFBhcmFtcyIsICJjb2RlIiwgInBhcmFtZXRlcnMiLCAibm9ybWFsaXplZHMiLCAidXRwYXJhbXMiLCAiX2l0ZXJhdG9yMTEiLCAiX3N0ZXAxMSIsICJub3JtIiwgInRvVXBwZXJDYXNlIiwgInRlbXBsYXRlUGFyYW1zIiwgImlfIiwgImdldFVzZXJUYWxrUGFyYW1ldGVycyIsICJwYXJzZVdpa2l0ZXh0IiwgInBzdCIsICJjb250ZW50bW9kZWwiLCAic3RhdHVzSW5kaWNhdG9yIiwgImFwaU9iaiIsICJjaGlsZE5vZGVzIiwgInN5c29wIiwgInByb21wdCIsICJkZWxldGVQYWdlIiwgImRlbGV0ZVJlYXNvbiIsICJwcm9tcHRGb3JTdW1tYXJ5IiwgInRoaXNwYWdlIiwgImRlbGV0ZU1haW4iLCAid2F0Y2giLCAiZGVsZXRlVGFsayIsICJvcGVuVXNlclRhbGsiLCAibG9va3VwQ3JlYXRpb24iLCAib3BlblVzZXJUYWxrUGFnZSIsICJkZWxldGVUYWxrUGFnZSIsICJub3JtYWxpemVkIiwgImNsYXNzTGlzdCIsICJjb250YWlucyIsICJzZXRUaW1lb3V0IiwgImRlbGV0ZVJlZGlyZWN0cyIsICJyZGxpbWl0IiwgImRlbGV0ZVJlZGlyZWN0c01haW4iLCAiJGJpZ3RleHQiLCAic2V0IiwgInVubGluayIsICJnZXRDcmVhdG9yIiwgInZhbmFydGljbGUiLCAib3BlbiIsICJ4bWxEb2MiLCAiJHNuYXBzaG90IiwgInRvdGFsIiwgIm9uc3VjY2VzcyIsICJhcGlvYmpJbm5lciIsICJ1cGRhdGUiLCAicmVtb3ZlQ2hlY2twb2ludCIsICJhZGRDaGVja3BvaW50IiwgIl9rZXkiLCAidGV4dE5vU2QiLCAiY29weXZpbyIsICJ4ZmQiLCAiYnVpbGREYXRhIiwgInBhdHJvbCIsICJyZXF1ZXN0c2FsdCIsICJlZGl0c3VtbWFyeSIsICJfaXRlcmF0b3IxMiIsICJfc3RlcDEyIiwgIk1hdGgiLCAiYmxhbmsiLCAiaW5zZXJ0QWZ0ZXJUZW1wbGF0ZXMiLCAiZ2V0VGV4dCIsICJ0YWdDb21wbGV0ZSIsICJ1c2VydGFsayIsICJwYWdlT2JqIiwgImluaXRpYWxDb250cmliIiwgInRhbGtQYWdlTmFtZSIsICJ1c2VydGFsa3BhZ2UiLCAibm90aWZ5dGV4dCIsICJsb2dub21pbmF0aW9uIiwgImFkZFRvTG9nIiwgInVzbCIsICJ1c2Vyc3BhY2VMb2dnZXIiLCAiaW5pdGlhbFRleHQiLCAiYXBwZW5kVGV4dCIsICJmcm9tREkiLCAiX2l0ZXJhdG9yMTMiLCAiX3N0ZXAxMyIsICJsb2ciLCAiZ2V0UGFyYW1ldGVycyIsICJfaXRlcmF0b3IxNCIsICJfc3RlcDE0IiwgImN1cnJlbnRQYXJhbXMiLCAicmVkaW1hZ2UiLCAiZGJyYXRpb25hbGUiLCAib3RoZXJwYWdlIiwgImZpbGVuYW1lIiwgInJlZGlydHlwZSIsICJyZXNvbHZlQ3NkVmFsdWVzIiwgIl9lJHRhcmdldCRmb3JtIiwgIl9lJHRhcmdldCRmb3JtMiIsICJ3YXRjaFBhZ2UiLCAiX2l0ZXJhdG9yMTUiLCAiX3N0ZXAxNSIsICJfZSR0YXJnZXQkZm9ybTMiLCAiX2l0ZXJhdG9yMTYiLCAiX3N0ZXAxNiIsICJfaTciLCAiX25vcm1hbGl6ZWRzIiwgIm5vdGlmeXVzZXIiLCAiX2l0ZXJhdG9yMTciLCAiX3N0ZXAxNyIsICJjc2Rsb2ciLCAiX2l0ZXJhdG9yMTgiLCAiX3N0ZXAxOCIsICJ0d2lua2xlY29weXZpbyIsICJpc1BhZ2VSZWRpcmVjdCIsICJ0cnlUYWdnaW5nIiwgInRhZ2dpbmdBcnRpY2xlIiwgImxvZ3BhZ2UiLCAiY29weXZpb0xpc3QiLCAicmV2aXNpb25JZCIsICJzb3VyY2UiLCAib2xkY3NkIiwgInNwZWVkeVRhZyIsICJnNF9wYWdlbmFtZSIsICJvdXRwdXQiLCAiZ2V0VVRDTW9udGgiLCAiZ2V0VVRDRGF0ZSIsICJ0d2lua2xleGZkIiwgImN1cnJlbnRSYXRpb25hbGUiLCAicHJpbnRSYXRpb25hbGUiLCAib2xkcmVhc29udGV4dGJveCIsICJvbGRyZWFzb24iLCAiYXBwZW5kUmVhc29uQm94IiwgInhmZF9jYXQiLCAiYWZkX2NhdGVnb3J5IiwgImNoYW5nZV9hZmRfY2F0ZWdvcnkiLCAiYWZkX2NhdCIsICJsb2NhbFN0b3JhZ2UiLCAiVHdpbmtsZV9hZmRDYXRlZ29yeSIsICJ4ZmRjYXQiLCAibWVyZ2VpbnRvIiwgInBhcmVudEVsZW1lbnQiLCAicmVtb3ZlQXR0cmlidXRlIiwgImZ3ZGNzZHJlYXNvbiIsICJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwgImlubmVySFRNTCIsICJ4ZmRyZWFzb24iLCAiYWZkIiwgInRhZ2dpbmdfcGFnZSIsICJkaXNjdXNzaW9uX3BhZ2UiLCAidG9kYXlzTGlzdCIsICJjcmVhdG9yIiwgImZvcm1hdFJlYXNvblRleHQiLCAibm9pbmNsdWRlIiwgInRleHROb05vdE1hbmRhcmluIiwgInRleHROb0FmYyIsICJ0byIsICJjb21tZW50VGV4dCIsICJzYWZlc3Vic3QiLCAiZmFtZSIsICJzdWJzdHViIiwgImJhdGNoIiwgInRhcmdldF9wYWdlIiwgImZmZCIsICJ0YWdnaW5nSW1hZ2UiLCAieGZkQ2F0TmFtZSIsICJ3aWtpVXJsZW5jb2RlIiwgImZvcm1hdFJlYXNvbkZvckxvZyIsICJvbkVycm9yIiwgInNldExvb2t1cE5vblJlZGlyZWN0Q3JlYXRvciIsICJ0d2lua2xlaW1hZ2UiLCAiaW1hZ2UiLCAiZmllbGQiLCAiX2l0ZXJhdG9yMTkiLCAiX3N0ZXAxOSIsICJ0eXBlXyIsICJjc2Rjcml0IiwgIkVycm9yIiwgInRvTG93ZXJDYXNlIiwgImYxX3NvdXJjZSIsICJmNF90eXBlIiwgInVzZXJOb3RpZmljYXRpb24iLCAibm90ZURhdGEiLCAiaW1hZ2VMaXN0IiwgImltcG9ydF9leHRfZ2FkZ2V0MiIsICJ0d2lua2xlcHJvdGVjdCIsICJjaGFuZ2VBY3Rpb24iLCAiZmV0Y2hQcm90ZWN0aW9uTGV2ZWwiLCAiaXNUZW1wbGF0ZSIsICJjdXJyZW50UHJvdGVjdGlvbkxldmVscyIsICJwcmV2aW91c1Byb3RlY3Rpb25MZXZlbHMiLCAiX2FzeW5jVG9HZW5lcmF0b3IiLCAiaW5kZXhwYWdlaWRzIiwgImlucHJvcCIsICJwcm90ZWN0RGF0YSIsICJwYWdlaWQiLCAicGFnZWlkcyIsICJwcmV2aW91cyIsICJ3YXRjaGVkIiwgIndhdGNobGlzdGV4cGlyeSIsICJfaXRlcmF0b3IyMCIsICJwcm90ZWN0aW9uIiwgIl9zdGVwMjAiLCAiY2FzY2FkZSIsICJwcmV2aW91c1Byb3RlY3Rpb25Mb2ciLCAiX2l0ZXJhdG9yMjEiLCAiZGV0YWlscyIsICJfc3RlcDIxIiwgImhhc1Byb3RlY3RMb2ciLCAic2hvd0xvZ0FuZEN1cnJlbnRQcm90ZWN0SW5mbyIsICJjdXJyZW50bHlQcm90ZWN0ZWQiLCAiaGFzU3RhYmxlTG9nIiwgIiRsaW5rTWFya3VwIiwgImZvcm1hdFByb3RlY3Rpb25EZXNjcmlwdGlvbiIsICJwcm90ZWN0aW9uTm9kZSIsICJzdGF0dXNMZXZlbCIsICJmaWVsZDEiLCAiZmllbGQyIiwgImNoYW5nZVByZXNldCIsICJwcm90ZWN0aW9uVHlwZXNBZG1pbiIsICJwcm90ZWN0aW9uVHlwZXNDcmVhdGUiLCAiZm9ybWV2ZW50cyIsICJlZGl0bW9kaWZ5IiwgImVkaXRsZXZlbCIsICJwcm90ZWN0aW9uTGV2ZWxzIiwgImRvQ3VzdG9tRXhwaXJ5IiwgImNsb3Nlc3QiLCAic2VsZWN0ZWRJbmRleCIsICJwcm90ZWN0aW9uTGVuZ3RocyIsICJtb3ZlbW9kaWZ5IiwgIm1vdmVsZXZlbCIsICJjcmVhdGVsZXZlbCIsICJwcm90ZWN0aW9uVGFncyIsICJ0YWd0eXBlIiwgInByb3RlY3Rpb25UeXBlcyIsICJtYXJnaW5SaWdodCIsICJlZGl0ZXhwaXJ5IiwgImNvbG9yIiwgIm1vdmVleHBpcnkiLCAiY3JlYXRlZXhwaXJ5IiwgInNtYWxsIiwgInNob3dleHBpcnkiLCAib3B0aW9uIiwgInByb3RlY3Rpb25UeXBlc0NyZWF0ZU9ubHkiLCAicHJvdGVjdGlvblByZXNldHNJbmZvIiwgImVkaXQiLCAibW92ZSIsICJ1bnByb3RlY3QiLCAiY3JlYXRlIiwgImFjdGlvbnR5cGVzIiwgIl9pdGVyYXRvcjIyIiwgIl9zdGVwMjIiLCAiYWN0aW9uX3R5cGVfdmFsdWUiLCAicmVhc29uRmllbGQiLCAicHJvdGVjdFJlYXNvbiIsICJfaXRlbSR0ZW1wbGF0ZSIsICJ0YWdwYXJhbXMiLCAiY2xvc2VwYXJhbXMiLCAic3RhdHVzSW5pdGVkIiwgImFsbERvbmUiLCAidGFnZ2luZ1BhZ2VJbml0aWFsIiwgInJwcFBhZ2UiLCAicHJvdGVjdEl0IiwgImZvbGxvd1JlZGlyZWN0IiwgInR5cGVuYW1lIiwgInR5cGVyZWFzb24iLCAicnBwcGFyYW1zIiwgInJwcE5hbWUiLCAiZmlsZVJlcXVlc3QiLCAicGFnZU5hbWUiLCAicHJvdGVjdGVkUGFnZSIsICJ0YWdnaW5nUGFnZSIsICJnZXRUYWdnZWRQYWdlIiwgIm9sZHRhZ19yZSIsICJyZV9yZXN1bHQiLCAibmV3VmVyc2lvbiIsICJzdXBwcmVzc1Byb3RlY3RXYXJuaW5nIiwgInJwcFJlIiwgInJwcExpbmsiLCAiZ2V0UGFnZU5hbWUiLCAibmV3dGFnIiwgIlN0cmluZyIsICJyYXciLCAiX3RlbXBsYXRlT2JqZWN0IiwgIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwiLCAid29yZHMiLCAicmVnIiwgIm9yaWdpbmFsVGV4dExlbmd0aCIsICJsaW5rbm9kZSIsICJ3YXRjaFByZWYiLCAib3B0aW9ucyIsICJ3YXRjaF9xdWVyeSIsICJsaW5rbm9kZTIiLCAic2VjdGlvblRleHQiLCAiX2k4IiwgIl9PYmplY3QkZW50cmllczUiLCAiZnJpZW5kbHl0YWciLCAibW9kZUVuIiwgImNhblJlbW92ZSIsICJjaGVja2VkVGFncyIsICIkYWxsQ2hlY2tib3hEaXZzIiwgImxhYmVsX2VsZW1lbnQiLCAiJGFsbEhlYWRlcnMiLCAic2VhcmNoU3RyaW5nIiwgInNlYXJjaFJlZ2V4IiwgIl9pbmRleCIsICJsYWJlbF90ZXh0IiwgInNlYXJjaEhpdCIsICJyYW5nZSIsICJjcmVhdGVSYW5nZSIsICJ0ZXh0bm9kZSIsICJzZWxlY3ROb2RlQ29udGVudHMiLCAic2V0U3RhcnQiLCAic2V0RW5kIiwgInVuZGVybGluZV9zcGFuIiwgInN1cnJvdW5kQ29udGVudHMiLCAiZmxhdE9iamVjdCIsICJfaXRlcmF0b3IyMyIsICJ0YWdMaXN0IiwgIl9zdGVwMjMiLCAiX2l0ZXJhdG9yMjQiLCAiX3N0ZXAyNCIsICJfaXRlcmF0b3IyNSIsICJfc3RlcDI1IiwgImRlc2NyaXB0aW9uIiwgImV4Y2x1ZGVNSSIsICJ1cGRhdGVTb3J0T3JkZXIiLCAiZGl2RWxlbWVudCIsICJfaXRlcmF0b3IyNiIsICJfc3RlcDI2IiwgImJ1aWxkRmlsZW5hbWUiLCAiX2l0ZXJhdG9yMjciLCAiX3N0ZXAyNyIsICJfaXRlcmF0b3IyOCIsICJfc3RlcDI4IiwgInF1ZXJ5U2VsZWN0b3JBbGwiLCAicXVpY2tmaWx0ZXIiLCAiYXV0b2NvbXBsZXRlIiwgImFkZEV2ZW50TGlzdGVuZXIiLCAiYWxyZWFkeVByZXNlbnRUYWdzIiwgInRhZ05hbWUiLCAiYm94VGFnIiwgImZvbnRTaXplIiwgIm51bUFkZGVkIiwgIm51bVJlbW92ZWQiLCAiYWZ0ZXIiLCAic29ydG9yZGVyIiwgIl9pdGVyYXRvcjI5IiwgIl9zdGVwMjkiLCAiZ2VuZXJhdGVMaW5rcyIsICJtYWtlQ2hlY2tib3giLCAib3RoZXJUYWdOYW1lIiwgIm1ha2VDaGVja2JveGVzRm9yQWxyZWFkeVByZXNlbnRUYWdzIiwgInN1YmRpdiIsICJjaGVja2JveGVzIiwgInVuQ2hlY2tlZFRhZ3MiLCAiZ2V0VW5jaGVja2VkIiwgIl9pdGVyYXRvcjMwIiwgIl9zdGVwMzAiLCAiZG9DYXRlZ29yeUNoZWNrYm94ZXMiLCAiX2l0ZXJhdG9yMzEiLCAiX3N0ZXAzMSIsICJfaXRlcmF0b3IzMiIsICJfc3RlcDMyIiwgIl9pdGVyYXRvcjMzIiwgIl9zdGVwMzMiLCAiX1R3aW5rbGUkdGFnJGFydGljbGUiLCAiYWxwaGFiZXRpY2FsTGlzdCIsICJfaXRlcmF0b3IzNCIsICJfc3RlcDM0IiwgIiR3b3JrYXJlYSIsICJyZW5kZXJlZCIsICJfaXRlcmF0b3IzNSIsICJfc3RlcDM1IiwgIl9pdGVyYXRvcjM2IiwgIl9zdGVwMzYiLCAiZmlyc3RQYXJ0IiwgInNlY29uZFBhcnQiLCAidGFnbmFtZSIsICJwYWdlVGV4dCIsICJwb3N0UmVtb3ZhbCIsICJ0YWdzVG9SZW1vdmUiLCAibWFrZVRlbXBsYXRlTGluayIsICJzdW1tYXJ5VGV4dCIsICJhZGRlZFRhZ3MiLCAicmVtb3ZlZFRhZ3MiLCAibWVyZ2VSZWFzb24iLCAiZGlzY3Vzc0FydGljbGUiLCAibm9uRGlzY3Vzc0FydGljbGUiLCAibWVyZ2VUYWdPdGhlciIsICJtZXJnZVRhZyIsICJuZXdQYXJhbXMiLCAidGFnc1RvUmVtYWluIiwgIm1lcmdlVGFyZ2V0IiwgInRhbGtEaXNjdXNzaW9uVGl0bGUiLCAidGFsa0Rpc2N1c3Npb25UaXRsZUxpbmtlZCIsICJtb3ZlUmVhc29uIiwgIm1vdmVUYWxrcGFnZVRleHQiLCAibW92ZVRhcmdldCIsICJtb3ZlVGFsa3BhZ2UiLCAicmVtb3ZlVGFncyIsICJnZXRSZWRpcmVjdHNGb3IiLCAiX2l0ZXJhdG9yMzciLCAiX3N0ZXAzNyIsICJ0YWdfcmUiLCAibGhuYW1lc3BhY2UiLCAibGhzaG93IiwgImxobGltaXQiLCAicmVzcG9uc2VYTUwiLCAiX2lkeCIsICJyZW1vdmVkIiwgInRhZ1JlIiwgInRhZ1RleHQiLCAiZ3JvdXBhYmxlVGFncyIsICJncm91cGFibGVFeGlzdGluZ1RhZ3MiLCAiYWRkVGFnIiwgImN1cnJlbnRUYWciLCAiZXhwZXJ0IiwgImV4cGVydDIiLCAiZXhwZXJ0MyIsICJtaXNzaW5nSW5mb3JtYXRpb24iLCAibm90YWJpbGl0eSIsICJ0YXJnZXQxIiwgInRhcmdldDIiLCAidGFyZ2V0MyIsICJjbGVhbnVwUmVhc29uIiwgImFkZFVuZ3JvdXBlZFRhZ3MiLCAiX2k5IiwgIl90YWdzIiwgInRlbXBsYXRlc0FmdGVyIiwgIl9pdGVyYXRvcjM4IiwgIl9zdGVwMzgiLCAibm90YWJpbGl0eUxpc3QiLCAiX2l0ZXJhdG9yMzkiLCAiX3N0ZXAzOSIsICJtaVRlc3QiLCAiX2l0ZXJhdG9yNDAiLCAiX3N0ZXA0MCIsICJtaVJlZ2V4IiwgImFkZE5ld1RhZ3NUb01JIiwgIl9pdGVyYXRvcjQxIiwgIl9zdGVwNDEiLCAiX2l0ZXJhdG9yNDIiLCAiX3N0ZXA0MiIsICJ0YWdJbmRleCIsICJhbHRMYW5nRnJvbSIsICJyZXFBcnRpY2xlTGFuZyIsICJyZXFBcnRpY2xlVGl0bGUiLCAiX2kxMCIsICJfdGFnczIiLCAib2xkVGFncyIsICJwYWdlVGFncyIsICJvbGRQYWdlVGFncyIsICJfaXRlcmF0b3I0MyIsICJfc3RlcDQzIiwgInBhZ2VUYWciLCAicGFnZVJlIiwgImZpbGUiLCAiX2l0ZXJhdG9yNDQiLCAiX3N0ZXA0NCIsICJub3djb21tb25zTmFtZSIsICJrZWVwbG9jYWxOYW1lIiwgImtlZXBsb2NhbFJlYXNvbiIsICJyZW5hbWVtZWRpYU5ld25hbWUiLCAicmVuYW1lbWVkaWFSZWFzb24iLCAiRG9Ob3RNb3ZlVG9Db21tb25zX3JlYXNvbiIsICJjaGVja1BhcmFtZXRlciIsICJwYXJhbWV0ZXIiLCAiZXhpc3RpbmdUYWdzIiwgInR3aW5rbGVzdHViIiwgInN0dWIiLCAiY3VzdG9tY2hlY2tib3hlcyIsICJfaXRlcmF0b3I0NSIsICJfc3RlcDQ1IiwgIl9pdGVyYXRvcjQ2IiwgIl9zdGVwNDYiLCAiX2kxMSIsICJfT2JqZWN0JGVudHJpZXM2IiwgInRhZ0NhdGVnb3JpZXMiLCAidGl0bGVOYW1lIiwgInRhZ0NhdGVnb3JpZXNIZWFkZXIiLCAiX2kxMiIsICJfT2JqZWN0JGVudHJpZXM3IiwgInN1YnRpdGxlIiwgInN1YmNvbnRlbnQiLCAiX2kxMyIsICJfT2JqZWN0JGVudHJpZXM4IiwgIl9pdGVyYXRvcjQ3IiwgIl9zdGVwNDciLCAiZ2VuZXJhbCIsICJnZW8iLCAib3RoZXJzIiwgImJpbyIsICJzY2llbmNlIiwgInNwb3J0IiwgInRlY2giLCAiYXJ0IiwgInRvdGFsVGFncyIsICJfaTE0IiwgIl90YWdzMyIsICJwYXRyb2xQYWdlIiwgInR3aW5rbGVkaWZmIiwgImRpZmYiLCAib2xkaWQiLCAibWUiLCAibm9kZSIsICJydnVzZXIiLCAibG9jYXRpb24iLCAidHdpbmtsZXVubGluayIsICJwcmVzZXRSZWFzb24iLCAiZmlsZVNwYWNlIiwgImxpbmtUZXh0QmVmb3JlIiwgImxpbmtUZXh0QWZ0ZXIiLCAibGlua1BsYWluQmVmb3JlIiwgImxpbmtUZW1wbGF0ZUJlZm9yZSIsICJsaW5rUGxhaW5BZnRlciIsICJfaTE1IiwgIl9hcnIyIiwgImZvbnRGYW1pbHkiLCAiZm9udFN0eWxlIiwgImJsdGl0bGUiLCAiYmxsaW1pdCIsICJibG5hbWVzcGFjZSIsICJyYXdjb250aW51ZSIsICJpdXRpdGxlIiwgIml1bGltaXQiLCAiaXVuYW1lc3BhY2UiLCAiYmxmaWx0ZXJyZWRpciIsICJiYWNrbGlua3MiLCAicGFkZGluZyIsICJpbWFnZXVzYWdlIiwgInVubGlua2VyIiwgImJhdGNoT3BlcmF0aW9uIiwgInNldE9wdGlvbiIsICJzZXRQYWdlTGlzdCIsICJydW4iLCAic2V0Qm90RWRpdCIsICJkb0JhY2tsaW5rcyIsICJkb0ltYWdldXNhZ2UiLCAidW5saW5rQmFja2xpbmtzIiwgImhhdmVjb250ZW50IiwgIl9pdGVyYXRvcjQ4IiwgIl9zdGVwNDgiLCAiY29udmVydE51bWJlciIsICJzaGlmdENsaWNrU3VwcG9ydCIsICJfaXRlcmF0b3I0OSIsICJfc3RlcDQ5IiwgIl9pdGVyYXRvcjUwIiwgIl9zdGVwNTAiLCAiX2l0ZXJhdG9yNTEiLCAiX3N0ZXA1MSIsICJvbGR0ZXh0IiwgIndhcm5pbmdTdHJpbmciLCAiY29tbWVudE91dEltYWdlIiwgInJlbW92ZUxpbmsiLCAicmVtb3ZlVGVtcGxhdGUiLCAid29ya2VyRmFpbHVyZSIsICJ3b3JrZXJTdWNjZXNzIiwgInR3aW5rbGVmbHVmZiIsICJmbHVmZiIsICJob29rIiwgImFkZExpbmtzIiwgInNraXBUYWxrIiwgImNvbnRyaWJ1dGlvbnMiLCAicmVjZW50Y2hhbmdlcyIsICJ0cnVzdGVkQm90cyIsICJoaWRkZW5OYW1lIiwgImxpbmtCdWlsZGVyIiwgInNwYW5UYWciLCAiYnVpbGRMaW5rIiwgInJvbGxiYWNrTGlua3MiLCAidmFuZGFsIiwgImlubGluZSIsICJyZXYiLCAicmV2Tm9kZSIsICJub3JtTm9kZSIsICJ2YW5kTm9kZSIsICJub3JtTGluayIsICJ2YW5kTGluayIsICJyZXZlcnQiLCAiZGlzYWJsZUxpbmtzIiwgInNlcGFyYXRvciIsICJyZXN0b3JlVGhpc1JldmlzaW9uTGluayIsICJyZXZpc2lvblJlZiIsICJyZXZlcnRUb1JldmlzaW9uTm9kZSIsICJmb250V2VpZ2h0IiwgInJldmVydFRvUmV2aXNpb25MaW5rIiwgInJldmVydFRvUmV2aXNpb24iLCAiJGxpc3QiLCAiZGF0YXNldCIsICJtd1JldmlkIiwgIm5vdCIsICJ0YXJnZXRQYWdlIiwgImhpc3RMaXN0IiwgInRvQXJyYXkiLCAic2hpZnQiLCAiX2l0ZXJhdG9yNTIiLCAiX3N0ZXA1MiIsICJfaXRlcmF0b3I1MyIsICJfc3RlcDUzIiwgIndhcm5Gcm9tVGFsayIsICJ4dGl0bGUiLCAidGFsa0xpbmsiLCAiZXh0cmFQYXJhbXMiLCAib2xkVGl0bGUiLCAicmV2ZXJ0c3VtbWFyeSIsICJfIiwgIm5ld1RpdGxlIiwgIm50aXRsZSIsICJpc0lQdjZBZGRyZXNzIiwgInNhbml0aXplSVB2NiIsICJnZXRFbGVtZW50c0J5TmFtZSIsICJub3RpZnlTdGF0dXMiLCAiYXV0b0hpZGUiLCAidXNlckhpZGRlbiIsICJpbnRlc3RhY3Rpb25zIiwgImN1cnRpbWVzdGFtcCIsICJvbGRyZXYiLCAidG9SZXZpc2lvbiIsICJsYXN0cmV2aWQiLCAidG91Y2hlZCIsICJsb2FkdGltZXN0YW1wIiwgImNzcmZ0b2tlbiIsICJyZXZlcnRUb1JldklEIiwgInJldmVydFRvVXNlciIsICJyZXZlcnRUb1VzZXJIaWRkZW4iLCAib3B0aW9uYWxfc3VtbWFyeSIsICJmb3JtYXRTdW1tYXJ5IiwgInVuZG8iLCAidW5kb2FmdGVyIiwgImJhc2V0aW1lc3RhbXAiLCAic3RhcnR0aW1lc3RhbXAiLCAibWlub3IiLCAiYm90IiwgIndhdGNoT3JFeHBpcnkiLCAid2F0Y2hsaXN0IiwgImNvbXBsZXRlIiwgInJldnMiLCAibGFzdHVzZXIiLCAidXNlck5vcm0iLCAiY29udCIsICJnb29kX3JldmlzaW9uIiwgInVzZXJIYXNBbHJlYWR5Q29uZmlybWVkQWN0aW9uIiwgImdvb2R1c2VyIiwgImdvb2R1c2VySGlkZGVuIiwgImV4dHJhX3N1bW1hcnkiLCAibm90aWZ5VXNlciIsICJ4bWwiLCAiJGVkaXQiLCAid2luZG93UXVlcnkiLCAidmFuYXJ0aWNsZXJldmlkIiwgInZhbmFydGljbGVnb29kcmV2aWQiLCAiYnVpbHRJblN0cmluZyIsICJjdXN0b21TdHJpbmciLCAicmVzdWx0TGVuIiwgInVuZXNjYXBlIiwgImVuY29kZVVSSUNvbXBvbmVudCIsICJjb250cmlic0xpbmsiLCAiY29udHJpYnNMZW4iLCAidHdpbmtsZWJhdGNoZGVsZXRlIiwgImJhdGNoZGVsZXRlIiwgInVubGlua0NhY2hlIiwgInN1YnBhZ2VzTG9hZGVkIiwgInRvZ2dsZVN1YnBhZ2VzIiwgImRlbGV0ZXJlYXNvbmxpc3QiLCAiY2hhbmdlX2NvbW1vbl9yZWFzb24iLCAiZ2VuZXJhdG9yIiwgImdjbXRpdGxlIiwgImdjbWxpbWl0IiwgImdhcGxpbWl0IiwgImdhcG5hbWVzcGFjZSIsICJnYXBwcmVmaXgiLCAicGF0aFNwbGl0IiwgInBhdGhuYW1lIiwgInRpdGxlU3BsaXQiLCAiZ3FwcGFnZSIsICJncXBsaW1pdCIsICJncGxsaW1pdCIsICJzdGF0dXNkaXYiLCAiJHBhZ2VzIiwgIiRwYWdlIiwgImlzUmVkaXIiLCAiJGVkaXRwcm90IiwgImlzUHJvdGVjdGVkIiwgIm1ldGFkYXRhIiwgImZvcm1fIiwgIl9pdGVyYXRvcjU0IiwgIl9zdGVwNTQiLCAiZ2VuZXJhdGVBcnJvd0xpbmtzIiwgIm5leHRFbGVtZW50U2libGluZyIsICJnZW5lcmF0ZU5ld1BhZ2VMaXN0IiwgImVsZW1lbnRzIiwgIk5vZGVMaXN0IiwgIl9pdGVyYXRvcjU1IiwgIl9zdGVwNTUiLCAiSFRNTElucHV0RWxlbWVudCIsICJuZXdQYWdlTGlzdCIsICJkZWxldGVfc3VicGFnZV9yZWRpcmVjdHMiLCAiZGVsZXRlX3JlZGlyZWN0cyIsICJkZWxldGVfc3VicGFnZV90YWxrcyIsICJkZWxldGVfdGFsayIsICJ1bmxpbmtfc3VicGFnZXMiLCAidW5saW5rX3BhZ2UiLCAiX2l0ZXJhdG9yNTYiLCAiX3N0ZXA1NiIsICJzdWJncm91cF8iLCAicmVwbGFjZVdpdGgiLCAiX2l0ZXJhdG9yNTciLCAiX3N0ZXA1NyIsICJfaXRlcmF0b3I1OCIsICJfc3RlcDU4IiwgImxvYWRpbmdUZXh0IiwgInN1YnBhZ2VMaXN0ZXIiLCAicGFnZVRpdGxlIiwgInBhZ2VOYW1lRnVsbCIsICJzdWJwYWdlTGlzdCIsICJwYWdlTmFtZV8iLCAiX2l0ZXJhdG9yNTkiLCAiX3N0ZXA1OSIsICJfaXRlcmF0b3I2MCIsICJfc3RlcDYwIiwgIl9pdGVyYXRvcjYxIiwgIl9zdGVwNjEiLCAiX2l0ZXJhdG9yNjIiLCAiX3N0ZXA2MiIsICJudW1Qcm90ZWN0ZWQiLCAic3VicGFnZXMiLCAiZGVsZXRlX3BhZ2UiLCAiZGVsZXRlX3N1YnBhZ2VzIiwgInVubGlua19maWxlIiwgInBhZ2VEZWxldGVyIiwgImRvRXh0cmFzIiwgInN1YnBhZ2VEZWxldGVyIiwgInRoaW5nV2l0aFBhcmFtZXRlcnMiLCAidW5saW5rQmFja2xpbmtzTWFpbiIsICJ1bmxpbmtJbWFnZUluc3RhbmNlc01haW4iLCAidGFsa1BhZ2UiLCAicmVkaXJlY3REZWxldGVyIiwgIm9sZF90ZXh0IiwgInNldE1heENvbmZsaWN0UmV0cmllcyIsICJ1bmxpbmtJbWFnZUluc3RhbmNlcyIsICJ0d2lua2xlYmF0Y2h1bmRlbGV0ZSIsICJiYXRjaHVuZGVsZXRlIiwgInByb2plY3QiLCAidW5kZWxfdGFsayIsICJwYWdlVW5kZWxldGVyIiwgInNldE1heFJldHJpZXMiLCAidW5kZWxldGVQYWdlIiwgInRhbGtwYWdlbmFtZSIsICJnZXRUYWxrUGFnZSIsICJkcnZwcm9wIiwgImRydmxpbWl0IiwgInVuZGVsZXRlVGFsayIsICJkZWxyZXZzIiwgInR3aW5rbGViYXRjaHByb3RlY3QiLCAiYmF0Y2hwcm90ZWN0IiwgInByb3RMZXZlbCIsICJfaXRlcmF0b3I2MyIsICJfc3RlcDYzIiwgIm1pc3NpbmciLCAiZWRpdFByb3QiLCAiaW1hZ2VpbmZvIiwgInJldmlzaW9ucyIsICJfaXRlcmF0b3I2NCIsICJfc3RlcDY0IiwgImxpbmtzIiwgImN1cnJlbnRQcm90ZWN0Q291bnRlciIsICJjdXJyZW50cHJvdGVjdG9yIiwgInRha2VuQWN0aW9uIiwgImNyZWF0ZW1vZGlmeSIsICJ0d2lua2xlY2xvc2UiLCAic2VsZWN0b3IiLCAiZGVsTm9kZSIsICJkZWxMaW5rIiwgIl9pdGVyYXRvcjY1IiwgIl9zdGVwNjUiLCAiaGVhZGxpbmVocmVmIiwgIm0iLCAicGFnZW5vdGV4aXN0IiwgImhhc0NsYXNzIiwgInRtcE5vZGUiLCAiY2xvbmVOb2RlIiwgImNvZGVzIiwgImlyIiwgInJlcCIsICJuZSIsICJucSIsICJrIiwgImFkbWlub25seSIsICJzayIsICJ0ayIsICJyciIsICJkYW4iLCAiZCIsICJpYyIsICJzZCIsICJsc3NkIiwgInN2ZyIsICJkcmVwIiwgImMiLCAiciIsICJjciIsICJtZXJnZSIsICJtZXJnZWFwcHJvdmVkIiwgIm5jIiwgIm5vb3AiLCAiY2hhbmdlX2NvZGUiLCAiY2hhbmdlX29wZXJhdGlvbiIsICJyZXN1bHREYXRhIiwgIl9pMTYiLCAiX09iamVjdCRlbnRyaWVzOSIsICJfaXRlcmF0b3I2NiIsICJfc3RlcDY2IiwgInNkcmVhc29uIiwgInJlbWFyayIsICJwYXJlbnRTZWN0aW9uIiwgInRhbGtlbmQiLCAiZGVsIiwgImtlZXAiLCAicGFnZXRpdGxlIiwgImdldE5hbWVzcGFjZUlkIiwgInRhbGtwYWdldGl0bGUiLCAiZ2V0TWFpblRleHQiLCAidG9TdHJpbmciLCAidmZka2VwdCIsICJzZXRQcmVwZW5kVGV4dCIsICJuZXd0ZXh0IiwgImtlZXBDb21wbGV0ZSIsICJzYXZlVGFsayIsICJzYmVnaW4iLCAic2VuZCIsICJiYXIiLCAiZGlzYWJsZUxpbmsiLCAidHdpbmtsZWNvbmZpZyIsICJ3YXRjaGxpc3RFbnVtcyIsICJ5ZXMiLCAibm8iLCAiZGVmYXVsdCIsICJjb21tb25TZXRzIiwgImNzZENyaXRlcmlhIiwgImRiIiwgImNzZENyaXRlcmlhRGlzcGxheU9yZGVyIiwgImNzZENyaXRlcmlhTm90aWZpY2F0aW9uIiwgImNzZENyaXRlcmlhTm90aWZpY2F0aW9uRGlzcGxheU9yZGVyIiwgImNzZEFuZERJQ3JpdGVyaWEiLCAiY3NkQW5kRElDcml0ZXJpYURpc3BsYXlPcmRlciIsICJ4ZmRDcml0ZXJpYSIsICJkZWxldGUiLCAiZndkY3NkIiwgInhmZENyaXRlcmlhRGlzcGxheU9yZGVyIiwgIm5hbWVzcGFjZXNOb1NwZWNpYWwiLCAicHJlZmVyZW5jZXMiLCAiZW51bVZhbHVlcyIsICJ0YWIiLCAiaGVscHRpcCIsICJzZXRWYWx1ZXMiLCAiYWRtaW5Pbmx5IiwgImN1c3RvbUxpc3RWYWx1ZVRpdGxlIiwgImN1c3RvbUxpc3RMYWJlbFRpdGxlIiwgInZhbmQiLCAidG9yZXYiLCAibWluZSIsICJyZWNlbnRjaGFuZ2VzbGlua2VkIiwgImJ1dHRvbkNsaWNrIiwgInJhZGlvQ2xpY2siLCAic2V0RGlzcGxheU9yZGVyIiwgImNhdCIsICJhbHBoYSIsICJzYW1lIiwgIm5vbmFkbWlub25seSIsICJhbGwiLCAiY29udGVudGRpdiIsICJ0b2N0YWJsZSIsICJtYXJnaW5MZWZ0IiwgInRvY3RpdGxlIiwgInRvY2gyIiwgInRvY3RvZ2dsZSIsICJ0b2N0b2dnbGVsaW5rIiwgInRvY3VsIiwgIiR0b2N1bCIsICJ0b2dnbGUiLCAiY29udGVudGZvcm0iLCAic2VjdGlvbmtleSIsICJ0b2NsaSIsICJ0b2NhIiwgInJvdyIsICJjZWxsIiwgImJvcmRlckJvdHRvbSIsICJtYXJnaW5Ub3AiLCAicm93Y291bnQiLCAicHJlZmtleSIsICJwcmVmIiwgIm1hcmdpbkJvdHRvbSIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiZ290UHJlZiIsICJ0ZXh0QWxpZ24iLCAicGFkZGluZ1JpZ2h0IiwgIm9wdGlvbkV4aXN0cyIsICJfaTE3IiwgIl9PYmplY3QkZW50cmllczEwIiwgImVudW12YWx1ZSIsICJlbnVtZGlzcGxheSIsICJjaGVja2RpdiIsICJwYWRkaW5nTGVmdCIsICJ3b3JrZXIiLCAiaXRlbWtleSIsICJpdGVtdmFsdWUiLCAiY2hlY2tsYWJlbCIsICJfaXRlcmF0b3I2NyIsICJfc3RlcDY3IiwgIl9pMTgiLCAiX09iamVjdCRlbnRyaWVzMTEiLCAiY3VzdG9tTGlzdEJ1dHRvbiIsICJsaXN0RGlhbG9nIiwgInJlc2V0bGluayIsICJyZXNldFByZWZMaW5rIiwgImNzc0Zsb2F0IiwgIm1hcmdpbiIsICJmb290ZXJib3giLCAic3VibWl0QnV0dG9uIiwgImZvb3RlcnNwYW4iLCAiZm9vdGVyYSIsICJyZXNldEFsbFByZWZzIiwgImhhc2giLCAibG9jIiwgImJveCIsICJzY3JpcHRQYWdlTmFtZSIsICJhZGRSb3ciLCAiZGxndGFibGUiLCAiY29udGVudHRyIiwgImNvbnRlbnR0ZCIsICJyZW1vdmVCdXR0b24iLCAiX2N1cnByZWYkY3VzdG9tTGlzdFZhIiwgIl9jdXJwcmVmJGN1c3RvbUxpc3RMYSIsICIkcHJlZmJ1dHRvbiIsICJjdXJ2YWx1ZSIsICJjdXJwcmVmIiwgImRpYWxvZ2NvbnRlbnQiLCAiZGxndGJvZHkiLCAiZGxndHIiLCAiZGxndGgiLCAiZ290Um93IiwgIl9pdGVyYXRvcjY4IiwgIl9zdGVwNjgiLCAiZGxndGZvb3QiLCAiZGxndGQiLCAiYWRkQnV0dG9uIiwgIm1pbldpZHRoIiwgImJ1dHRvbiIsICJyZXNldCIsICJ0Ym9keSIsICIkYnV0dG9uIiwgIm9sZHZhbHVlIiwgInJlc2V0UHJlZiIsICIkdGJvZHkiLCAiX2l0ZXJhdG9yNjkiLCAiX3N0ZXA2OSIsICJpbnB1dGtleSIsICJ3YW50ZWRwcmVmIiwgImZvdW5kaXQiLCAiX2kxOSIsICJfT2JqZWN0JGVudHJpZXMxMiIsICJ1c2VyanMiLCAid3JpdGVQcmVmcyIsICJuZXdDb25maWciLCAib3B0aW9uc1ZlcnNpb24iLCAiY29tcGFyZSIsICJiIiwgInVzZXJWYWx1ZSIsICJfaXRlcmF0b3I3MCIsICJfc3RlcDcwIiwgIl9pMjAiLCAiX09iamVjdCRlbnRyaWVzMTMiLCAibm93aWtpIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgInNhdmVTdWNjZXNzIiwgIm5vdGljZWJveCIsICJub3RpY2VjbGVhciIsICJjbGVhciJdCn0K